这是一个从输入文件中查找最大偶数及其出现次数并将其输出到输出文件的程序。我的输出有问题,似乎有一个额外的迭代把事情弄乱了。
int main(int argc, char const *argv[])
{
int n, num, i, even, count;
FILE * fptr;
FILE * fptro;
fptr =fopen("maximpar.in", "r");
fptro=fopen("maximpar.out", "w");
/*scanning the first line from the file to get n for for()*/
fscanf(fptr, "%d", &n);
count = 0;
even = INT_MIN;
for(i = 0; i < n; i++)
{
fscanf(fptr, "%d", &num);
if( (num % 2 == 0 && num > even) || (even == num) )
/*checking for largest even number,
not sure about the ..||(even == num) part of the condition*/
{
even = num;
count++;
}
}
fprintf(fptro, "%d %d", even, count);
fclose(fptr);
fclose(fptro);
return 0;
}
输入文件
6
9 6 9 8 9 8
输出文件
8 3
为什么输出文件不是这样的?我不明白
8 2
最佳答案
每当您获得更大的新数字时,您都需要重置计数。
我没有对此进行测试,但它应该可以工作:
cate = 0;
par = INT_MIN;
for (i = 0; i < n; i++) {
fscanf(fptr, "%d", &b);
// skip odd numbers
if ((b % 2) != 0)
continue;
// get new larger number
if (b > par) {
par = b;
cate = 1;
continue;
}
// increment count on existing largest number
if (b == par)
++cate;
}
<小时/>
更新:
I dont understand why skip iterations explicitly instead of only picking out the iterations that matter? Is there some sort of advantage?
是的,这是更好的风格。它允许简单的单级缩进 if
语句,这些语句可以有自己的注释。
它避免了困惑的复合 if
或三级 if/else
阶梯。
IMO,这是一个常见的误解(特别是在初级 C 程序员中),认为复杂的 if
会比几个简单的 if 执行得更快[或者在某种程度上“更好”]。
第一个 if
可以被认为是“跳过本次迭代”测试。这里,只有一个。但是,对于更复杂的代码,可能有多个。
多个条件转义可以在单个 if
中使用 if (c1 || c2 || c2 || ... || c10) 进行处理continue;
但这很快就会变得困惑。
在这里,为了正确缩进 if/else
梯形逻辑,我们需要:
if (cond1)
do_stuff1;
else
if (cond2)
do_stuff2;
else
if (cond3)
do_stuff3;
如果我们没有处于循环中,这里有一个“技巧”,可以通过使用 do { ... } while (0); 来避免
:if/else
梯形逻辑。
do {
if (cond1) {
do_stuff1;
break;
}
if (cond2) {
do_stuff2;
break;
}
if (cond3) {
do_stuff3;
break;
}
} while (0);
关于c - 如何正确地制定计数算法来从文件中计数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53917175/