我正在制作一个可以读取20个SAT成绩的程序。将读取分数并将其存储到2D阵列中。我写了两种方法,我认为这是我的问题的根源。我肯定知道的是计算STD功能。我收到了错误消息:
1 [main] satscores_proj1 1920 cygwin_exception :: open_stackdumpfile:将堆栈跟踪转储到satscores_proj1.exe.stackdump
我正在使用带有cygwin编译器软件包的netbeans,但是当我尝试使用DevC ++运行它时,会弹出这条消息:
C:\ Dev-Cpp \ HW Assignments \ satScores.cpp在函数void compute_std(int (*)[2], int, int, double&, double&)' call of overloaded
中,pow(int,int)'不明确
#include <cstdlib>
#include <iostream>
#include <iomanip>
#include <string>
#include <fstream>
#include <cmath>
#include <cctype>
using namespace std;
int main()
{
int sat[10][2], mathAvg, verbAvg;
double mathStd, verbStd;
void describe_program();
void read_scores(int sat[10][2]);
void compute_means(int sat[10][2], int& mathAvg, int& verbAvg);
void compute_std(int sat[10][2],int mathAvg, int verbAvg, double& mathStd, double& verbStd) ;
void show_results(int sat[10][2], int mathAvg, int verbAvg, double mathStd, double verbstd);
bool again();
describe_program();
read_scores(sat);
compute_means(sat, mathAvg, verbAvg);
compute_std(sat, mathAvg, verbAvg, mathStd, verbStd);
//show_results(sat, mathAvg, verbAvg, mathStd, verbStd);
//again();
return 0;
}
/*
*
*/
void compute_means(int sat[10][2], int& mathAvg, int& verbAvg)
{
int mathScoreSum =0;
int mathCount = 0;
int verbScoreSum = 0;
int verbCount = 0;
for(int i = 0; i<10; i++)
{
for(int j = 0; i<2; j++)
{
if(j==0){
mathScoreSum += sat[i][j];
mathCount++;
}
else{
verbScoreSum += sat[i][j];
verbCount++;
}
}
}
mathAvg = mathScoreSum / mathCount;
verbAvg = verbScoreSum / verbCount;
}
void compute_std(int sat[10][2],int mathAvg, int verbAvg, double& mathStd, double& verbStd)
{
double mathVariance = 0;
double verbVariance = 0;
for(int i = 0; i<10; i++)
{
for(int j = 0; i<2; j++)
{
if(j==0){
mathVariance += pow((sat[i][j] - mathAvg), 2);
}
else{
verbVariance += pow((sat[i][j] - mathAvg), 2);
}
mathStd = sqrt(mathVariance/9);
verbStd = sqrt(verbVariance/9);
}
}
}
是否有人熟悉这两个错误?
答案 0 :(得分:2)
您的细分错误是由for(int j=0;i<2;j++)
引起的i
。很明显,如果你使用调试器。使用调试器:)
编译错误是由函数pow
的多个声明引起的。我尝试执行::pow(
等等。您也可以执行(double)variable
之类的显式转换,以消除过载问题。
另外,对于从不执行相同代码两次的代码,您不应该使用循环:
for(int j = 0; j<2; j++)
{
if(j==0){
mathScoreSum += sat[i][j]; //<--first, j is 0
mathCount++;
}
else{
verbScoreSum += sat[i][j]; //<--second, j is 1
verbCount++;
}
}
应该是:
mathScoreSum += sat[i][0]; //<--first iteration of loop
mathCount++; //<--first iteration of loop
verbScoreSum += sat[i][1]; //<--second iteration of loop
verbCount++; //<--second iteration of loop
(或者,您可以设置ScoreSum[2]
和Count[2]
而不是当前的4个目标变量,并分配给循环中的那些变量。)
以下是删除不必要的j循环的完整示例:
void compute_std(int sat[10][2],int mathAvg, int verbAvg, double& mathStd, double& verbStd)
{
double mathVariance = 0;
double verbVariance = 0;
for(int i = 0; i<10; i++)
{
mathVariance += pow((sat[i][0] - mathAvg), 2);
verbVariance += pow((sat[i][1] - verbAvg), 2);
}
mathStd = sqrt(mathVariance/9);
verbStd = sqrt(verbVariance/9);
}
答案 1 :(得分:0)
在using namespace std
尝试区分std::pow
函数和pow
函数时,您#include <cmath>
会产生潜在冲突。