数组打印出错误的数字

时间:2018-03-02 02:53:30

标签: c++ arrays

我是C ++的新手,我必须制作一个程序,让用户输入指定数量的考试成绩并计算平均,最高和最低分数。 (它不必检查值是否介于1和100之间。)出于某种原因,当打印出平均得分和得分总和时,它只打印出从不相同的随机指数数字。我还没有打印出最低和最高分,因为我不确定我是否能做到平均水平。再一次,我是C ++的新手,所以我确定我搞砸了。这是代码:

xyz

示例输出1:

#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; 
}

示例输出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.29874e-310 Average = 2.76625e-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 = 8.94176e-310 Average = 2.98059e-310

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

5 个答案:

答案 0 :(得分:2)

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

#include <iostream>
using namespace std;

为什么要在std::导入所有标识符?

using namespace std;

糟糕:你应该避免使用全局变量,除非它们是绝对必要的。 99.9%的时间他们不是。这些很容易成为int loopLimit = 0; //number of scores or how many times it will loop double *testScores = {0}; //array scores are stored in 中的局部变量。

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

答案 1 :(得分:1)

有几件事,第一行

from django import forms
from .models import Aluno


class NovoAluno(forms.Form):
    model = Aluno
    nome = forms.CharField(min_length=15, max_length=100)
    direccion = forms.CharField(min_length=10, max_length=250)
    ciudad = forms.CharField(min_length=3, max_length=50)
    provincia = forms.CharField(min_length=4, max_length=50)
    comunidad = forms.CharField(min_length=4, max_length=50)
    cp = forms.IntegerField()
    faixas = (
              ('Blanco', 'Blanco'),
              ('Gris', 'Gris'),
              ('Amarilla', 'Amarilla'),
              ('Naranja', 'Naranja'),
              ('Verde', 'Verde'),
              ('Azul', 'Azul'),
              ('Roxa', 'Roxa'),
              ('Marrón', 'Marrón'),
              ('Preta', 'Preta'),
              )
    graduacion = forms.ChoiceField(choices=faixas)
    inicio = forms.DateInput()
    nacimento = forms.DateInput()
    lic = (('Basica', 'Basica'),
           ('Completa', 'Completa'),
           )
    licencia = forms.ChoiceField(choices=lic)
    documento = forms.CharField(min_length=4, max_length=9)
    email = forms.EmailField(min_length=10)
    profesor = forms.CharField(min_length=5, max_length=100)
    centro = forms.CharField(min_length=5, max_length=50)

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

接着, 这条线

     cin >> *testScores;

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

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

答案 2 :(得分:1)

我不知道你为什么要编写这样一个混乱的代码来计算平均值。但这是我的方法。 由于您输入的loopLimit值为3。因此,根据您的代码,sum将包含sum[3]的值。这是垃圾值。由于索引从0开始,而不是1。因此,您的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; 

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

答案 3 :(得分: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.

答案 4 :(得分: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是正确的......指针&#34; testScores&#34;不会通过你的for循环递增,所以数组占用垃圾也会在循环中输入sum + = testScores [i]来汇总你的输入。

相关问题