c - 如何正确地制定计数算法来从文件中计数?

标签 c file count

这是一个从输入文件中查找最大偶数及其出现次数并将其输出到输出文件的程序。我的输出有问题,似乎有一个额外的迭代把事情弄乱了。

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/

相关文章:

c - X 宏破坏 doxygen 调用图

c - 使用三元运算符将 C 语言转换为 MIPS

python - 在 Python 中将二进制数据写入文件

使用 Case 的 SQL 数据范围

mysql - 在 mySQL 的新字段中获取 ROLL UP 或 Count() 总和

c - 如何在命名管道 (mkfifo) 上执行非阻塞 fopen?

c - 如何按频率找到元素的完整排序?

c - time.h 和文件中的算法 C 代码

c#保持文件打开但覆盖内容

mysql - 将两个 SQL 查询合二为一