数组打印出错误的数字

问题描述 投票:2回答:5

我是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

我整个星期一直都在这里,而且老实说,此时我什么都没有。

c++ arrays
5个回答
2
投票

好的,我们来看看你的代码吧。

#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,它负责清理你)。

}

1
投票

有几件事,第一线

     cin >> *testScores;

不是将测试分数存储在数组中(我认为这是你想要做的)而是在每次迭代时将新的测试分数存储在第一个元素中,即testScores [0],重写旧值。

接下来,该行

sum += testScores[loopLimit]; 

看起来在阵列外面。这意味着你正在查看内存中可能存在垃圾的随机位置。这就解释了为什么你会看到输出的随机数。

尝试解决这两个问题。如果您不需要保存测试分数,则可以保留它们的运行总和,这将消除将所有内容存储在数组中的需要。


1
投票

我不知道你为什么要编写这样一个混乱的代码来计算平均值。但这是我的方法。由于你输入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; 

尝试在编程的早期阶段避免使用指针,因为它可能会弄乱你的大脑并且可能会产生问题。试着采用一种简单的方法。


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.

0
投票
 #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]来汇总你的输入。

© www.soinside.com 2019 - 2024. All rights reserved.