基本平均程序中出现意外的数组行为

时间:2015-09-06 01:02:05

标签: c++ arrays codeblocks average

似乎我总是来这里问愚蠢的问题,但在这里。截至目前,我正处于我的第一个compsci课程中,我们正在学习c ++。我以前对c有一个非常基本的介绍,所以我以为我已经超越了我目前的任务。现在我只是为了表演这样做,我觉得如果我没有练习我以前的概念,他们最终会褪色。无论如何,关于问题!我应该编写一些代码,允许用户输入他们的首字母和一系列考试。现在这应该完成三件事:平均考试,打印输入的考试,并打印出他们的首字母。嗯,什么是简单的任务,真的变成了一个巨大的混乱。

#include <iostream>
#include <string>
#include <iomanip>

using namespace std;

int main()
{
  string uInitials;
  float avgExam = 0, tExam = 0;
  int aExams[10] = {'0'};
  int i, nExam = 0, cExam;


  cout << "Enter your three initials!";
  cin >> uInitials;


  do
      {

        cout << "Enter your exam(s) to be averaged. Enter 0 when          complete!\n";
        cin >> cExam;
        aExams[nExam] = cExam;  //I used this before nExam was incremented, in order to get nExam while it was '0' That way the first exam score would be properly saved in the first space
        nExam++;
        tExam += cExam;     //This is just to add all the exams up to later calculate the average
    }
  while(cExam != 0);

avgExam = tExam/(nExam - 1); //subtracted '1' from nExams to remove the  sentinel value from calculations.

cout << "The average for initials: " << uInitials << " is: " << avgExam <<   endl;
cout << "This average was obtained using the following scores that were entered: \n";

for(i = 0; i < (nExam+1); i++)
{
    cout << aExams[i] << endl; //Used a for loop to prevent redundancy
}

return 0;
}

以前是我的代码,问题是当我打印输入的考试列表时,我会在输出错误的地方添加两个&#39; 0。另外我觉得我做了整个do {} while()循环一个巨大的笨重的混乱,所以我也想改进它。如果有人能帮助这个可怜的,无知的,初学者,我会非常感激。谢谢你的时间!

2 个答案:

答案 0 :(得分:1)

在代码末尾打印出两个0的问题是你编写for循环的结果。

而不是:

for(i = 0; i < (nExam+1); i++)
{
    cout << aExams[i] << endl; //Used a for loop to prevent redundancy
}

使用:

for (i = 1; i < (nExam); i++)
{
    cout << aExams[i - 1] << endl; //Used a for loop to prevent redundancy
}

答案 1 :(得分:1)

我可以给出一些建议,例如在第5行,没有必要 将0放在&#39;之间&#39;甚至不需要使用assign =运算符。 您可以像这样初始化数组: int aExams [10] {0}; 这会将所有元素初始化为0,但不能用于其他值。 例如,如果你写的话,你不会拥有值为1的所有元素 int aExams [10] {1}; 如果你初始化数组中所有元素的意图是0以外的值,你可以使用fill_n();功能

fill_n(aExams,10,1); 第一个参数是数组的名称,第二个参数是您希望使用第三个参数初始化的元素,第三个参数是您希望所有元素都具有的值。

不要像第6行那样使用cExam和i变量保留未初始化的变量。像cExam = 0一样初始化它; (copy-assign initialization)或cExam(0); (直接初始化)。后者调用int内置类型的构造函数。

我在你的do-while循环中看到的一个负面因素是你没有确保用户将在10次考试中输入,如果用户试图在一个只能容纳10次的数组中输入15个考试,就会发生不好的事情。

只需将while更改为更像这样的内容:   while(cExam!= 0&amp;&amp;(nExam&lt; 10));

您还可以在循环外写入do-while循环的前两行。 只需要告诉用户停止循环他/她需要输入0只需要一次。在每次迭代时都没有必要告诉他们这一点,如果你将这两行排除在外,你将获得良好的性能优势。循环。

看看我如何编写代码并询问您是否有任何问题。

http://pastebin.com/3BFzrk5C