gpt4 book ai didi

c++ - 从文件中读取的数字查找平均值和标准偏差

转载 作者:行者123 更新时间:2023-11-30 02:50:51 39 4
gpt4 key购买 nike

总而言之,我有一个作业要求编写一个程序,从文件中读取一堆数字并输出字母等级、平均值和标准偏差。我已经处理了字母等级和平均值,但我在标准偏差方面遇到了麻烦。问题是我的程序读入所有值并在读入后计算平均值。由于标准偏差的公式需要使用特定数据点和平均值,所以,我只是不确定如何去做。我的一个想法是尝试让程序打开文件两次,以便在第二次运行时(此时它计算出平均值)它可以计算标准偏差。然而,编译器根本不喜欢这样。有什么建议吗?

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;

int main(){
ifstream file("grades.txt");
double number,sum=0,noNumbers=0,average=0;
int noAs=0, noBs=0, noCs=0, noDs=0, noFs=0, noAms=0, noBms=0, noCms=0, noDms=0, noAps=0, noBps=0, noCps=0, noDps=0, quant=0, quanttot=0;

while(file >> number){
if(number >= 97 && number <=100 ){
noAps++;
}
if(number >= 93 && number < 97){
noAs++;
}
if(number >= 90 && number < 93){
noAms++;
}
if(number >= 87 && number <90 ){
noBps++;
}
if(number >= 83 && number < 87){
noBs++;
}
if(number >= 80 && number < 83){
noBms++;
}
if(number >= 77 && number < 80 ){
noCps++;
}
if(number >= 73 && number < 77){
noCs++;
}
if(number >= 70 && number < 73){
noCms++;
}
if(number >= 67 && number < 70 ){
noDps++;
}
if(number >= 63 && number < 67){
noDs++;
}
if(number >= 60 && number < 63){
noDms++;
}
if(number < 60){
noFs++;
}
noNumbers++;
sum = sum += number;
}
average = sum / noNumbers;
while(file >> number){
quant = (number - average)*(number-average);
quanttot = quanttot + quant;
}
double sigma;
sigma = sqrt(quanttot/noNumbers);
cout << "Average is: " << average << endl;
cout << "Standard deviation is: " << sigma << endl;
ofstream newfile("grades2.txt");
newfile << "A+'s: " << noAps << endl
<< "A's: " << noAs << endl
<<"A-'s: " << noAms << endl
<<"B+'s: " << noBps << endl
<< "B's: " << noBs << endl
<< "B-'s: " << noBms << endl
<<"C+'s: " << noCps << endl
<<"C's: " << noCs << endl
<<"C-'s: " << noCms << endl
<<"D+'s: " << noDps << endl
<<"D's: " << noDs << endl
<< "D-'s: " << noDms << endl
<< "F's: " << noFs << endl;
newfile.close();
cout << "Press any key to continue...THEN PRESS ENTER!\n:";
int f;
cin >> f;
return 0;


啊,将数字保存到数组中以供以后操作确实是个好主意。所以我将代码更改为:

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;

int main(){
ifstream file("grades.txt");
double sum=0,noNumbers=0,average=0;
int noAs=0, noBs=0, noCs=0, noDs=0, noFs=0, noAms=0, noBms=0, noCms=0, noDms=0, noAps=0, noBps=0, noCps=0, noDps=0, quant=0, quanttot=0;
int i = 1;
double number[500];
while(file >> number[i]){
while(number[i]<=100){

if(number[i] >= 97 && number[i] <=100){
noAps++;
}
if(number[i] >= 93 && number[i] < 97){
noAs++;
}
if(number[i] >= 90 && number[i] < 93){
noAms++;
}
if(number[i] >= 87 && number[i] < 90){
noBps++;
}
if(number[i] >= 83 && number[i] < 87){
noBs++;
}
if(number[i] >= 80 && number[i] < 83){
noBms++;
}
if(number[i] >= 77 && number[i] < 80){
noCps++;
}
if(number[i] >= 73 && number[i] < 77){
noCs++;
}
if(number[i] >= 70 && number[i] < 73){
noCms++;
}
if(number[i] >= 67 && number[i] < 70){
noDps++;
}
if(number[i] >= 63 && number[i] < 67){
noDs++;
}
if(number[i] >= 60 && number[i] < 63){
noDms++;
}
if(number[i] < 60){
noFs++;
}
noNumbers++;
i++;
}
}
for(int i=0; i = noNumbers; i++){
sum = sum + number[i];
}
average = sum/noNumbers;

for(int i=0; i=noNumbers;i++){
quant = (number[i] - average)*(number[i] - average);
quanttot = quanttot + quant;
}

double sigma;
sigma = sqrt(quanttot/noNumbers);
cout << "Average is: " << average << endl;
cout << "Standard deviation is: " << sigma << endl;
ofstream newfile("grades2.txt");
newfile << "A+'s: " << noAps << endl
<< "A's: " << noAs << endl
<<"A-'s: " << noAms << endl
<<"B+'s: " << noBps << endl
<< "B's: " << noBs << endl
<< "B-'s: " << noBms << endl
<<"C+'s: " << noCps << endl
<<"C's: " << noCs << endl
<<"C-'s: " << noCms << endl
<<"D+'s: " << noDps << endl
<<"D's: " << noDs << endl
<< "D-'s: " << noDms << endl
<< "F's: " << noFs << endl
<< "Average: " << average << endl
<< "Standard Deviation: " << sigma << endl;
newfile.close();
cout << "Press any key to continue...THEN PRESS ENTER!\n:";
int f;
cin >> f;
return 0;

但是,现在我遇到了一个疯狂的错误,它强制中断并将我带到编译器中的一些笨拙的代码。有没有人看到任何可能导致这种情况的错误?具体来说,它给我的错误是在一个弹出窗口中显示:“ConsoleApplication79.exe 中 0x5A221D7F (msvcp110d.dll) 处未处理的异常:0xC0000005:访问冲突读取位置 0x4050C000。”此外,文本文件中的数字介于 300 到 450 个之间,因此数组不应用完插槽。

最佳答案

如果您使用的是 C++,请考虑将您的数字放入 vector 中.

一旦有了 vector ,就很容易编写迭代 vector 中元素的函数。您的函数可以计算各种统计数据:均值(平均值)、标准差、中位数等。或者您可以使用像 Boost 这样的库。为你做。

确实没有必要将文件读两遍,除非您要处理数百万个数字,或者您的机器在某种程度上受限于内存,而这里似乎不是这种情况。将您正在使用的数字存储到标准 C++ 容器( vector )中,并学习如何使用该容器的内容来获得您想要的答案。

关于c++ - 从文件中读取的数字查找平均值和标准偏差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20084299/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com