我是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
我整个星期都在这里,而且老实说,此时我什么都没有。
答案 0 :(得分:2)
好的,我们来看看你的代码。
#include <iostream>
using namespace std;
为什么要在std::
导入所有标识符? 1}}不推荐使用。{/ p>
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]来汇总你的输入。