gpt4 book ai didi

c++ - 数组打印出错误的数字

转载 作者:搜寻专家 更新时间:2023-10-31 00:53:20 31 4
gpt4 key购买 nike

我是 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 的动态数组,有效数组索引从 0loopLimit-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,负责为您清理)。

}

关于c++ - 数组打印出错误的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49062088/

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