我是C ++的新手,我必须制作一个程序,让用户输入指定数量的测试分数并计算平均,最高和最低分数。 (它不必检查值是否介于1和100之间。)出于某种原因,当打印出平均得分和得分总和时,它只打印出从不相同的随机指数数字。我还没有打印出最低和最高分,因为我不确定我是否做到了平均水平。同样,我是C ++的新手,所以我确定我搞砸了。这是代码:
#include <iostream>
using namespace std;
int loopLimit = 0; //number of scores or how many times it will loop
double *testScores = {0}; //array scores are stored in
int main () {
cout << "How many test scores are you entering?" << endl;
cin >> loopLimit;
testScores = new double[loopLimit]; //changes array to needed size
for (int i = 0; i < loopLimit; i++) {
cout << "Enter test score #" << (i + 1) << endl;
cin >> *testScores;
}
double sum = 0.0;
double average = 0.0;
//double max = 0.0; //making these functions later
//double min = 0.0;
sum += testScores[loopLimit];
average = sum / loopLimit;
//Sum is here for testing purposes at the moment
cout << "Sum = " << sum << " Average = " << average << endl;
return 0;
}
示例输出1:
How many test scores are you entering?
3
Enter test score #1
100
Enter test score #2
100
Enter test score #3
100
Sum = 8.29874e-310 Average = 2.76625e-310
示例输出2:
How many test scores are you entering?
3
Enter test score #1
100
Enter test score #2
100
Enter test score #3
100
Sum = 8.94176e-310 Average = 2.98059e-310
预期产量:
How many test scores are you entering?
3
Enter test score #1
100
Enter test score #2
100
Enter test score #3
100
Sum = 300.0 Average = 100.0
我整个星期一直都在这里,而且老实说,此时我什么都没有。
好的,我们来看看你的代码吧。
#include <iostream>
using namespace std;
为什么要在std::
中导入所有标识符?不建议使用using namespace std;
。
int loopLimit = 0; //number of scores or how many times it will loop
double *testScores = {0}; //array scores are stored in
坏:你应该避免使用全局变量,除非它们是绝对必要的。 99.9%的时间他们不是。这些很容易成为main
中的局部变量。
testScores
不是一个数组,它是一个指针。使用{0}
初始化它只是编写testScores = nullptr;
的奇怪方式。
int main () {
cout << "How many test scores are you entering?" << endl;
cin >> loopLimit;
testScores = new double[loopLimit]; //changes array to needed size
你在这里使用手动内存管理。从技术上讲不是错误,但使用std::vector
会更容易,更不容易出错。
for (int i = 0; i < loopLimit; i++) {
cout << "Enter test score #" << (i + 1) << endl;
cin >> *testScores;
该行存储*testScores
中的每个输入,即testScores
指向的位置,它对应于上面new
分配的数组的第一个索引。这意味着只初始化testScores[0]
(最后包含用户输入的最后一个数字),每个其他索引都是未初始化的。
你应该使用cin >> testScores[i]
代替。
}
double sum = 0.0;
double average = 0.0;
//double max = 0.0; //making these functions later
//double min = 0.0;
sum += testScores[loopLimit];
这是无效的内存访问。由于testScores
指向大小为loopLimit
的动态数组,因此有效数组索引从0
到loopLimit-1
。因此,testScores[loopLimit]
访问超过数组边界的内存。
此外,它只是你在这里添加的一个元素。即使这是一个有效的数组索引,这仍然没有意义。你应该在这里遍历所有的数组元素(比如你上面的for
循环),或者只是在你的另一个循环中进行这部分计算。实际上,如果您感兴趣的是它们的总和(您可以在读取输入时直接计算),则无需将所有数字存储在内存中。
average = sum / loopLimit;
average
是从sum
计算出来的,它具有垃圾值,所以它也是垃圾。
//Sum is here for testing purposes at the moment
cout << "Sum = " << sum << " Average = " << average << endl;
......这就是你得到垃圾输出的原因。
return 0;
在这里你泄漏了new
分配的内存。在这种情况下,这不是一个真正的问题因为你的程序即将退出,但一般来说你想在这里使用delete[] testScores;
(除非你使用std::vector
,它负责清理你)。
}
有几件事,第一线
cin >> *testScores;
不是将测试分数存储在数组中(我认为这是你想要做的)而是在每次迭代时将新的测试分数存储在第一个元素中,即testScores [0],重写旧值。
接下来,该行
sum += testScores[loopLimit];
看起来在阵列外面。这意味着你正在查看内存中可能存在垃圾的随机位置。这就解释了为什么你会看到输出的随机数。
尝试解决这两个问题。如果您不需要保存测试分数,则可以保留它们的运行总和,这将消除将所有内容存储在数组中的需要。
我不知道你为什么要编写这样一个混乱的代码来计算平均值。但这是我的方法。由于你输入loopLimit
值为3
.So根据你的代码,sum
将包含sum[3]
的值。这是一个垃圾值。因为索引开始于0
而不是1
.So你的sum
将有一个垃圾值,这就是为什么你得到这样不正确的价值。我修改了你的代码,它对我来说很好。
int loopLimit;
cout << "How many test scores are you entering?" << endl;
cin >> loopLimit;
double scores[loopLimit];
double sum=0.0;
for (int i = 0; i < loopLimit; i++)
{
cout << "Enter test score #" << (i + 1) << endl;
cin >> scores[i];
sum+=scores[i];
}
double avg=sum/loopLimit;
cout << "Sum = " << sum << " Average = " << avg << endl;
return 0;
尝试在编程的早期阶段避免使用指针,因为它可能会弄乱你的大脑并且可能会产生问题。试着采用一种简单的方法。
可能的问题是你正在这样做
double* testScores = {0};
这将把它初始化为nullptr,可能让你读写垃圾数据。您应该使用的可能是动态调整大小的数组,例如
std::vector<double> testScores;
并在列表中添加分数
double inScore = 0;
std::cin >> inScore;
testScores.push_back(inScore); // This adds to the list of scores.
#include <iostream>
using namespace std;
int loopLimit = 0; //number of scores or how many times it will loop
double *testScores = {0}; //array scores are stored in
int main () {
double sum = 0.0;
double average = 0.0;
cout << "How many test scores are you entering?" << endl;
cin >> loopLimit;
testScores = new double[loopLimit]; //changes array to needed size
for (int i = 0; i < loopLimit; i++) {
cout << "Enter test score #" << (i + 1) << endl;
cin >> testScores[i];
sum += testScores[i];
}
average = sum / loopLimit;
cout << "Sum = " << sum << " Average = " << average << endl;
delete [] testScores;
return 0;
}
* melpomene是正确的......指针“testScores”不会通过你的for循环递增,所以数组占用垃圾也会在循环中输入sum + = testScores [i]来汇总你的输入。