这是一个程序,用于从输入文件中找到最大的偶数及其出现的时间,并将其输出到输出文件。我的输出出现问题,似乎有多余的迭代使事情搞砸了。
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
答案 0 :(得分:1)
附上条件
if( ( ...&&...) ||(....) )
答案 1 :(得分:1)
每当您得到一个更大的数字时,您都需要重置您的计数。
我没有对此进行测试,但是它应该可以工作:
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;
}
更新:
我不明白为什么要显式地跳过迭代,而不是只选择重要的迭代?有某种优势吗?
是的,这是更好的样式。它允许简单的单级缩进if
语句,这些语句可以具有自己的注释。
它避免了杂乱的if
或三级{{1}}阶梯。
IMO,这是一个普遍的误解(尤其是在开始的C程序员中),一个复杂的if/else
比几个简单的{[1}}的执行速度更快(或以某种方式“更好”)。
可以将第一个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;
”来避免if/else
梯形逻辑的“技巧”:
do { ... } while (0);
答案 2 :(得分:0)
答案是因为当b = 6时,计数从0增加到1。2次迭代后,b = 8,现在计数= 2,其后2次迭代,b = 8,计数= 3。
我还建议您将if语句嵌套在括号中以提高可读性。评论也会有所帮助:)我是一名统计专家,而且我不知道您根据变量名在做什么。
如果b>参数,则需要在if块内重置计数器。
赞:
if(num%2 == 0 && num> =偶数){
npm i glob camelcase
}
谢谢。
JK