- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
编辑:显然变量dmax
不会随着每个循环而更新。
我有 2 个文件被扫描并输入到 2 个单独的数组中,但是当我运行代码来查找 2 个数组的相同元素之间的每日最大差异时,输出达到 107374208.000000。下面是我的代码。
void diff()
{
float ftemp[size], mtemp[size], diff[size], count = 1.0;
feb = fopen("feb.txt", "r");
mar = fopen("mar.txt", "r");
for(i = 1; i < size; i++)
{
fscanf(feb, "%f", &ftemp[i]);
fscanf(mar, "%f", &mtemp[i]);
dmax = (i * 3) - 3;
if((mtemp[dmax] - ftemp[dmax]) > count && (mtemp[dmax] - ftemp[dmax]) > 0)
{
count = mtemp[dmax] - ftemp[dmax];
}
}
printf("The highest temperature difference between March and February is %f.\n", count);
}
这是二月份的每日气温
maximum minimum average
31.6 22.4 25.9
30.2 22.7 25.5
31.2 22.9 26.1
31.3 23.4 26.4
30.7 23.2 26.2
31.3 23.1 26.4
31.6 23.9 26.4
31.6 24.0 26.9
32.7 24.7 27.5
33.8 24.8 27.7
32.4 25.0 27.6
32.1 24.9 27.6
32.7 25.4 27.9
31.9 25.5 27.6
31.9 25.4 27.8
32.1 25.3 27.8
31.7 25.6 27.8
32.6 25.2 27.7
32.2 24.9 27.5
32.2 24.9 27.7
31.7 25.8 27.7
32.3 25.5 27.9
32.1 24.4 27.3
31.5 24.6 27.2
31.8 24.0 27.0
32.0 24.4 27.4
32.4 24.9 27.8
32.1 25.0 27.6
这是三月份的每日气温
maximum minimum average
32.7 25.1 27.7
33.8 24.8 28.0
32.9 24.7 27.6
32.9 25.0 27.8
32.9 25.0 27.8
33.0 23.8 27.5
32.6 24.2 27.6
32.8 24.8 27.9
32.0 24.2 27.6
32.3 24.9 27.8
33.6 25.0 28.1
33.4 25.6 28.3
33.8 24.7 28.3
34.1 25.2 28.6
32.7 25.9 28.6
28.2 23.6 25.9
30.7 24.3 26.4
32.7 24.9 27.5
32.5 25.4 27.5
33.6 25.9 27.6
33.1 25.3 27.7
31.0 25.0 27.5
32.8 24.2 27.9
33.0 24.7 28.1
33.2 25.2 28.4
34.0 25.7 28.8
34.4 25.8 29.1
32.7 26.2 28.6
33.3 26.5 28.5
32.3 25.8 28.5
33.0 26.6 28.8
最佳答案
代码无法编译,因为有一堆未声明的变量,例如 dmax
和 ftemp
。
修复后...
fopen
未选中。fscanf
未检查。fscanf
是一个错误生成器。让我们看看您的循环。
for(i = 1; i < size; i++)
{
fscanf(feb, "%f", &ftemp[i]);
fscanf(mar, "%f", &mtemp[i]);
dmax = (i * 3) - 3;
if((mtemp[dmax] - ftemp[dmax]) > count && (mtemp[dmax] - ftemp[dmax]) > 0)
{
count = mtemp[dmax] - ftemp[dmax];
}
}
第一次迭代后,dmax
将始终大于 i
(i = 0, dmax = 0; i = 1, dmax = 3; i = 2, dmax = 6)。但循环只填充到i
。因此,当您尝试使用 mtemp[dmax]
和 ftemp[dmax]
时,它们永远不会被填充。你会得到垃圾。
我怀疑您假设 fscanf(feb, "%f", &ftemp[i])
正在扫描一整行数字。就像您所要求的那样,它只是扫描其中一份。要完成整行,您必须提出要求。
for( int i = 0; i < size; i += 3 ) {
fscanf(feb, "%f %f %f", &ftemp[i], &ftemp[i+1], &ftemp[i+2]);
fscanf(mar, "%f %f %f", &mtemp[i], &mtemp[i+1], &mtemp[i+2]);
...
}
请注意,循环从 0 开始,因为数组从 0 开始。并且它前进 3,因为我们一次读取 3 个。
<小时/>这仍然不起作用。文件的第一行都是字符串,而不是 float 。 fscanf
不会向前跳去查找匹配项,如果不匹配,则会停止。如果您继续尝试相同的匹配,它将不断尝试从同一位置一遍又一遍地读取。您的代码所做的就是尝试将每个文件的第一个字节作为 float 读取,失败,然后再次执行 size
次。 ftemp[i]
和 mtemp[i]
仍未初始化,因此您会得到垃圾。
这就是为什么应该避免 scanf
和 fscanf
的原因。相反,读取整行并使用 sscanf
处理它们。
数组也是不必要的,您不需要对以前的值执行任何操作,您只需要当前的最小值和最大值。
<小时/>考虑到所有这些以及其他一些因素,我将其重写如下:
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <math.h>
#include <stdlib.h>
/* A little function to open files while checking it was
successful and giving a good error message if not */
FILE *open_file( const char *file, const char *mode ) {
FILE *fp = fopen(file, mode);
if( fp == NULL ) {
fprintf(
stderr,
"Could not open '%s' for '%s': %s\n",
file, mode, strerror(errno)
);
exit(1);
}
return fp;
}
/* Instead of using hard coded file names, they're passed in. */
/* Instead of hard coding the use of the diff, it's returned. */
/* I switched to doubles because that's what fabs() returns and
the extra accuracy can't hurt. */
double largest_max_temp_diff(const char *file1, const char* file2) {
FILE *feb = open_file(file1, "r");
FILE *mar = open_file(file2, "r");
char line1[1024];
char line2[1024];
/* Skip the header lines */
fgets(line1, 1024, feb);
fgets(line2, 1024, mar);
double max_diff = 0;
/* Loop infinitely, loop exit is handled using `break` */
while(1) {
/* Read in a line from each file.
Stop when we reach the end of either file. */
if( fgets(line1, 1024, feb) == NULL ) {
break;
}
if( fgets(line2, 1024, mar) == NULL ) {
break;
}
/* Read in just the first column, ignore the rest. */
/* Make sure the parsing was successful. */
double max1, max2;
if( sscanf(line1, "%lf %*lf %*lf", &max1) < 1 ) {
fprintf( stderr, "Could not understand '%s'", line1);
continue;
}
if( sscanf(line2, "%lf %*lf %*lf", &max2) < 1 ) {
fprintf( stderr, "Could not understand '%s'", line2);
continue;
}
/* Compare the diffs as absolute values */
double diff = max2 - max1;
if(fabs(diff) > fabs(max_diff)) {
max_diff = diff;
}
}
/* Return the max diff so it can be used as the caller likes */
return max_diff;
}
int main() {
/* Get the diff */
double diff = largest_max_temp_diff("feb.txt", "mar.txt");
/* Use it */
printf("The highest temperature difference between March and February is %f.\n", diff);
}
这个新代码现在会跳过标题行。它读取一行并单独解析它,以保证它不会被卡住。它使用 sscanf 一次解析一行,仅存储最大值。它检查解析是否成功。
它使用绝对值来检查最大差异,因为 -4 的差异大于 3。
最后,它返回该值,以便调用者可以用它做它想做的事情。在同一函数中计算和打印(或任何格式)是一个危险信号;它使函数变得不灵活,并且您最终会编写大量重复代码。
这不是最好的代码,仍然有很多重复,但它更好,并且可以 self 检查。处理文件时,您始终必须检查您的假设。
关于c - 试图找到两个数组之间的最大差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41781293/
我正在尝试创建一个包含 int[][] 项的数组 即 int version0Indexes[][4] = { {1,2,3,4}, {5,6,7,8} }; int version1Indexes[
我有一个整数数组: private int array[]; 如果我还有一个名为 add 的方法,那么以下有什么区别: public void add(int value) { array[va
当您尝试在 JavaScript 中将一个数组添加到另一个数组时,它会将其转换为一个字符串。通常,当以另一种语言执行此操作时,列表会合并。 JavaScript [1, 2] + [3, 4] = "
根据我正在阅读的教程,如果您想创建一个包含 5 列和 3 行的表格来表示这样的数据... 45 4 34 99 56 3 23 99 43 2 1 1 0 43 67 ...它说你可以使用下
我通常使用 python 编写脚本/程序,但最近开始使用 JavaScript 进行编程,并且在使用数组时遇到了一些问题。 在 python 中,当我创建一个数组并使用 for x in y 时,我得
我有一个这样的数组: temp = [ 'data1', ['data1_a','data1_b'], ['data2_a','data2_b','data2_c'] ]; // 我想使用 toStr
rent_property (table name) id fullName propertyName 1 A House Name1 2 B
这个问题在这里已经有了答案: 关闭13年前。 Possible Duplicate: In C arrays why is this true? a[5] == 5[a] array[index] 和
使用 Excel 2013。经过多年的寻找和适应,我的第一篇文章。 我正在尝试将当前 App 用户(即“John Smith”)与他的电子邮件地址“jsmith@work.com”进行匹配。 使用两个
当仅在一个边距上操作时,apply 似乎不会重新组装 3D 数组。考虑: arr 1),但对我来说仍然很奇怪,如果一个函数返回一个具有尺寸的对象,那么它们基本上会被忽略。 最佳答案 这是一个不太理
我有一个包含 GPS 坐标的 MySQL 数据库。这是我检索坐标的部分 PHP 代码; $sql = "SELECT lat, lon FROM gps_data"; $stmt=$db->query
我需要找到一种方法来执行这个操作,我有一个形状数组 [批量大小, 150, 1] 代表 batch_size 整数序列,每个序列有 150 个元素长,但在每个序列中都有很多添加的零,以使所有序列具有相
我必须通过 url 中的 json 获取文本。 层次结构如下: 对象>数组>对象>数组>对象。 我想用这段代码获取文本。但是我收到错误 :org.json.JSONException: No valu
enter code here- (void)viewDidLoad { NSMutableArray *imageViewArray= [[NSMutableArray alloc] init];
知道如何对二维字符串数组执行修剪操作,例如使用 Java 流 API 进行 3x3 并将其收集回相同维度的 3x3 数组? 重点是避免使用显式的 for 循环。 当前的解决方案只是简单地执行一个 fo
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我有来自 ASP.NET Web 服务的以下 XML 输出: 1710 1711 1712 1713
如果我有一个对象todo作为您状态的一部分,并且该对象包含数组列表,则列表内部有对象,在这些对象内部还有另一个数组listItems。如何更新数组 listItems 中 id 为“poi098”的对
我想将最大长度为 8 的 bool 数组打包成一个字节,通过网络发送它,然后将其解压回 bool 数组。已经在这里尝试了一些解决方案,但没有用。我正在使用单声道。 我制作了 BitArray,然后尝试
我们的数据库中有这个字段指示一周中的每一天的真/假标志,如下所示:'1111110' 我需要将此值转换为 boolean 数组。 为此,我编写了以下代码: char[] freqs = weekday
我是一名优秀的程序员,十分优秀!