[英]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);
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
設置為零,因此您將不知道獲得什么值。 另外,如果所有數字均為負,則您將報告最大值為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.