我尝试创建用户输入文件名的代码,然后程序会找到文件中数字的最小值,最大值和平均值。
这是用户输入程序的文件样本(#是注释,将被忽略):
#Data from field experiment 312A
#2015-01-12
35.6
3.75
#2015-01-13
9
#2015-01-14
43.43
7.0001
这就是我现在对我的代码所拥有的,我尝试结合不同的方法,但是担心我在这一点上太迷失了。
#include <stdio.h>
#include <math.h>
int main()
{
char ch, file_name[25];
FILE *fp;
double average, num = 0, min = 0, max = 0, sum = 0, N;
int i;
printf("Please enter the name of the file to load:\n");
scanf(file_name);
fp = fopen(file_name, "r");
if (fscanf(fp, "%lf", &N) == 1)
{
for (i = 0; i < N; i++)
if (num < min || i == 0)
min = num;
if (num > max || i == 0)
max = num;
sum += num;
}
fclose(fp);
average = sum/N;
printf("Smallest: %7.2lf\n", min);
printf("Largest: %7.2lf\n", max);
printf("Average: %7.2lf\n", average);
return(0);
}
任何帮助都将不胜感激。
答案 0 :(得分:3)
在您的代码中,
scanf(file_name);
scanf()
的错误使用,您错过了格式说明符。您必须将其更改为
scanf("%24s", file_name); //%s is the format specifier for a string input
查看man page了解详情。
除此之外,您的程序中存在逻辑错误。您只能阅读一次该文件,这不是您想要的。此外,for()
循环没有任何意义。
我的建议是:
foepn()
是否成功。否则,请不要进行。fgets()
阅读整行。strtod()
将输入字符串转换为float
。< min
和> max
,进行相应更改,然后对结果求和。fgets()
返回NULL(文件的结束)sum / (number of successful conversions)
sum
,max
和min
。尽管如此,main()
的推荐签名是int main(void)
。
编辑:
伪代码(为了更好地理解而要求)
#include <stdio.h>
#include <math.h>
#include <float.h>
int main(void)
{
char file_name[25] = {0};
FILE *fp = NULL;;
double average = 0, min = DBL_MAX, max = 0, sum = 0;
int N = 0;
char buf[128] = {0}; // buffer tyo be used with fgets()
ask for the filename (using `scanf("%24s", file_name);`)
open the file (using `fp = fopen(file_name, "r");`)
if file cannot be opened successfully (`if (!fp)`)
exit
while (reading a complete line from file using `fgets(buf, 128, fp)` != EOF) //EOF ==> end of file
{
if (buf[0] == `#`) //comment, no propcessing reqd, continue
continue;
val = strtod(buf, NULL); //you should use proper error checking, as metioned in the man page
if (val) // valid float value found
{
if ( val < min )
min = val;
else if ( val > max )
max = val;
sum += val; //add the value
N++; //increase the counter
}
}
close the file (using `fclose(fp);`)
calculate `average = sum/N;`
printf("Smallest: %7.2f\n", min);
printf("Largest: %7.2f\n", max);
printf("Average: %7.2f\n", average);
return(0);
}
答案 1 :(得分:0)
您应该使用非常大的数字初始化min
。
您的if
需要{}
,否则代码执行的次数与您想象的不同。
在计算sum/N
之前,您应该检查N>0
。
fscanf
和for
的组合无效。