如何计算文件中出现数字的次数?

时间:2018-12-24 19:41:18

标签: 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

3 个答案:

答案 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