我正在尝试编写一个程序,该程序接收用户输入的文本文件并返回最大数字,最小数字,数字平均值和数字的标准偏差。我们输入的文本文件是这样格式化的(第一个数字是“N”,或者是数字的总数,第二行是所有数字的列表):
5
4.34 23.4 18.92 -78.3 17.9
到目前为止,这是我的代码
int main(int argc, char*argv[])
{
double average, num = 0, min = 0, max = 0, sum = 0, N, std_dev, sum_sqs;
FILE * pFile;
pFile = fopen("argv[1]", "r");
fscanf(pFile, "%lf", &N);
while(!feof(pFile))
{
fscanf(pFile, "%d", &num);
if (num < min)
min = num;
if (num > max)
max = num;
sum += num;
sum_sqs += (num*num);
}
average = sum/N;
std_dev = sqrt((sum_sqs/N)-(average*average));
printf("Smallest: %.2lf\n", min);
printf("Largest: %.2lf\n", max);
printf("Average: %.2lf\n)", average);
printf("Standard deviation: %.3lf\n", std_dev);
return(0);
}
目前,编译器不允许我通过关于对sqrt的未定义引用的错误,我无法弄清楚出了什么问题。提前感谢所有花时间回应的人!我真的很感激任何帮助,我仍然掌握着C.如果我的代码没有做我打算做的事,请不要犹豫,纠正我!
将凌乱的部分更新到下面。哈哈,还不确定我正在做什么 pFile = fopen(argv [1],“r”); fscanf(pFile,“%lf”,&amp; N);
if (fscanf(pFile, "%lf", &N) == 1)
{
for (int i = 0; i < N; i++)
{
if (fscanf(pFile, "%lf", &num) == 1)
if (num < min)
min = num;
if (num > max)
max = num;
sum += num;
sum_sqs += (num*num);
}
average = sum/N;
std_dev = sqrt((sum_sqs/N)-(average*average));
答案 0 :(得分:5)
这几行中存在大量问题:
pFile = fopen("argv[1]", "r");
fscanf(pFile, "%lf", &N);
while(!feof(pFile))
{
fscanf(pFile, "%d", &num);
argv[1]
指定的文件,而不是名为argv[1]
的文件。删除引号。fopen()
是否成功,因此您可能已在第一个fscanf()
中崩溃。fscanf()
是否成功。在double
中读取应该是整数值的内容也很奇怪,但使用的符号将起作用。feof()
,尤其是...... fscanf()
是否成功,它将无法正常工作(但可能无法报告问题),因为...... %d
)读入double
。所以,你应该写:
if (argc <= 1)
…report error and exit…(or use pFile = stdin)…
FILE *pFile = fopen(argv[1], "r");
if (pFile == 0)
…report error and exit…
if (fscanf(pFile, "%lf", &N) == 1)
{
for (int i = 0; i < N; i++)
{
if (fscanf(pFile, "%lF", &num) != 1)
…report error, close file, and exit…
…as before…more or less…subject to fixing any as yet undiagnosed errors…
}
}
fclose(pFile);
顺便提一下,在开始添加sum_sqs
之前忘了将if (i == 0 || num < min) min = num;
设置为零,所以你不会知道你得到了什么价值。此外,如果所有数字都是负数,您将报告最大值为0;如果所有数字都是正数,你会报告最小值是0.修复这个有点繁琐,但你可以使用sqrt()
等。
您的链接问题(对-lm
的未定义引用)表示您正在需要链接数学库的系统上运行;在链接命令行的末尾通常是#include <stdio.h>
#include <math.h>
int main(int argc, char*argv[])
{
double average, num = 0, min = 0, max = 0, sum = 0, N, std_dev, sum_sqs = 0.0;
if (argc <= 1)
{
fprintf(stderr, "Usage: %s file\n", argv[0]);
return 1;
}
FILE *pFile = fopen(argv[1], "r");
if (pFile == 0)
{
fprintf(stderr, "%s: failed to open file %s\n", argv[0], argv[1]);
return 1;
}
if (fscanf(pFile, "%lf", &N) == 1)
{
for (int i = 0; i < N; i++)
{
if (fscanf(pFile, "%lF", &num) != 1)
{
fprintf(stderr, "%s: failed to read number\n", argv[0]);
return 1;
}
if (num < min || i == 0)
min = num;
if (num > max || i == 0)
max = num;
sum += num;
sum_sqs += (num*num);
}
}
fclose(pFile);
average = sum/N;
std_dev = sqrt((sum_sqs/N)-(average*average));
printf("Smallest: %7.2lf\n", min);
printf("Largest: %7.2lf\n", max);
printf("Average: %7.2lf\n", average);
printf("Standard deviation: %7.3lf\n", std_dev);
return(0);
}
。
data
给定数据文件5
4.34 23.4 18.92 -78.3 17.9
:
Smallest: -78.30
Largest: 23.40
Average: -2.75
Standard deviation: 38.309
运行程序的结果是:
# Count = 5
# Sum(x1) = -1.374000e+01
# Sum(x2) = 7.375662e+03
# Mean = -2.748000e+00
# Std Dev = 4.283078e+01
# Variance = 1.834476e+03
# Min = -7.830000e+01
# Max = 2.340000e+01
这些价值观大多看似合理;我对标准差的计算达到了42.83(完全使用不同的工具)。差异在于样本标准差与人口标准差之间(因子√1.25) - 所以你的计算结果是正常的。
{{1}}
所以,代码对我有用。你得到了什么结果?
答案 1 :(得分:0)
如果您需要sqrt
功能,则需要添加
#include <math.h>
到C文件的顶部。
float
阅读scanf
,则应使用%f
格式说明符,而不是%d
(将读取整数)。fopen
来电中,删除argv[1]
周围的引号,否则它会查找具有该名称的文件。