用C代码从文本文件中查找最大和最小的数字

时间:2013-10-31 01:47:15

标签: c

我正在尝试编写一个程序,该程序接收用户输入的文本文件并返回最大数字,最小数字,数字平均值和数字的标准偏差。我们输入的文本文件是这样格式化的(第一个数字是“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));

2 个答案:

答案 0 :(得分:5)

分析

这几行中存在大量问题:

pFile = fopen("argv[1]", "r");
fscanf(pFile, "%lf", &N);

while(!feof(pFile))
{
        fscanf(pFile, "%d", &num);
  1. 您可能想要打开argv[1]指定的文件,而不是名为argv[1]的文件。删除引号。
  2. 你没有检查你是否通过了争论。
  3. 您没有检查fopen()是否成功,因此您可能已在第一个fscanf()中崩溃。
  4. 您不检查fscanf()是否成功。在double中读取应该是整数值的内容也很奇怪,但使用的符号将起作用。
  5. 您不应该使用feof(),尤其是......
  6. 您没有检查第二个fscanf()是否成功,它将无法正常工作(但可能无法报告问题),因为......
  7. 您正在尝试将整数(%d)读入double
  8. 所以,你应该写:

    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]周围的引号,否则它会查找具有该名称的文件。