/ *测试平均问题修订版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;
}
答案 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