簡體   English   中英

用C語言編寫代碼以從文本文件中查找最大和最小數字

[英]Code in C to find largest and smallest numbers from text file

我正在嘗試編寫一個程序,該程序采用用戶輸入的文本文件並返回最大數,最小數,數字的平均值和數字的標准差。 我們輸入的文本文件是這樣格式化的(第一個數字為“ N”或數字總數,第二行為所有數字的列表):

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”,&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));

分析

以下幾行中存在很多問題:

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

因此,您應該寫出:

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設置為零,因此您將不知道獲得什么值。 另外,如果所有數字均為負,則您將報告最大值為0;否則為0。 如果所有數字都是正數,則將報告最小值為0。固定該操作有點麻煩,但可以使用if (i == 0 || num < min) min = num; 等等


鏈接問題

您的鏈接問題(對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

這些價值似乎很合理。 我的標准差計算結果為42.83(完全使用其他工具)。 差異是樣本標准偏差和總體標准偏差(√1.25的因數)之間的差異,因此您計算得出的值就可以了。

# 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

因此,代碼對我有用。 你得到什么結果?

如果要使用sqrt函數,則需要添加

#include <math.h>

到C文件的頂部。

  • 如果要使用scanf讀取float ,則應使用%f格式說明符,而不是%d (它將讀取整數)。
  • 在您的fopen調用中,刪除argv[1]周圍的引號,否則它將查找具有該名稱的文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM