如何从数据中打印出最小值?

时间:2019-06-21 06:13:36

标签: c

/ *测试平均问题修订版1:编写一个读取相同内容的程序 文件,如上所述,但也计算最小和最大测试分数 以及这两个都是哪个测试编号。 (例如,如果考试成绩 在文件中分别为70、85、99、67和83,那么最低测试得分为4号测试得分为67,最高测试得分为3号测试得分。)将程序打印出来 屏幕上的信息。 * /

#include <stdio.h>

int main(int argc, char const *argv[])
{   

    int num, start;

    int num_test, score, max=0, min=0, maxi, mini;

    FILE*ifp, *ofp;

    ifp = fopen("test.in.txt", "r");

    ofp = fopen("test.max.txt", "w");

    fscanf(ifp,"%d", &num);

    for ( start = 1; start <= num; start++)
    {
        fscanf(ifp,"%d %d", &num_test, &score);

        fprintf(ofp,"Test: %d    score: %d  \n", num_test, score);


        if (score > max)

        {
            max = score;  

            maxi = num_test;

        }


        if (score < min)

        {
            min = score;

            mini = num_test;
        }

    }
        fprintf(ofp,"\n\nMax = Test:%d Score: %d\n",maxi, max);

        fprintf(ofp,"\nMin = Test:%d Score: %d\n",mini, min);

    fclose(ifp);

    fclose(ofp);

    return 0;

}

2 个答案:

答案 0 :(得分:1)

这是初始化问题。您需要根据算法将max初始化为尽可能低的值(碰巧是这样做的),而将min初始化为尽可能大的值(失败)。

min id初始化为该数据类型可能的最高值的安全选择。

对于int,该值可以是2 ^ 32-1(如果int用32位表示)。

如果您不想处理大量数字,则应分析问题,以了解可能的最大值。这更危险,因为问题的数量可能会改变,然后算法可能会失败。


另一种方法是分两步查找值-可能会花费更长的时间,但仍然很安全。

第1步:找到最大值。

步骤2:初始化min = max,然后找到最小值。

答案 1 :(得分:0)

算法必须使用与min, max相对相反的极端值int初始化int,该值位于limits.h范围的中间。

// max=0, min=0 max=INT_MIN, min=INT_MAX 中的有用限制。 @Pascal Cuoq

if

注意:代码正确执行else if而不是if (score < min) // else if (score < min) ,因为当所有测试值相同时,后者将失败。

fscanf()

严格的代码将检查// fscanf(ifp,"%d %d", &num_test, &score); if (fscanf(ifp,"%d %d", &num_test, &score) != 2) { fprintf(stderr, "Unexpected input\n"); return EXIT_FAILURE; } 的返回值,以确保成功读取。 (2个地方)

fopen()

还要检查ifp = fopen("test.in.txt", "r"); if (ifp == NULL) { fprintf(stderr, "Unable to open read file\n"); return EXIT_FAILURE; } 是否成功(2位)

msg = 0
msg |= 1 << n