1

所以我基本上整天都在写这个程序,经历了许多迭代和问题,最后在完成它后我回去运行它,发现我一开始工作的最简单的部分现在不再起作用了。

#include <iostream>
#include <vector>
#include <iomanip>

using namespace std;


void Determine_Output (double);

int main()
{
    vector<double> thisVector(10);
    double input=-2;
    int i=1;
    double average = 0.00;
    double highest;
    double lowest;

    cout<<setprecision(3);


    for (unsigned z=0; z<10; z++)
    {
        cout<<"Please enter result \"" <<i<< "\": ";
        cin>> input;

        if ((input <= 100)&&(input >= 0))
            {
                thisVector.push_back(input);
                Determine_Output(thisVector[i]);  //Offending procedure call
                i++;
            }
        else if (input == -1)
            break;
        else
        {
            cout<<"Invalid input, must be between 0 and 100\n";
            z--;
        }

    }



void Determine_Output (double output) {     //Offending procedure
    if (output > 90)
        cout<<"A will be assigned to this result\n";
    else if (output > 70)
        cout<<"B will be assigned to this result\n";
    else if (output > 60)
        cout<<"C will be assigned to this result\n";
    else if (output > 50)
        cout<<"P will be assigned to this result\n";
    else
        cout<<"U will be assigned to this result\n";
}

当我第一次编写程序时,它可以正常工作(即 99 返回 A,77 返回 B,66 返回 C,依此类推)

现在我已经完成了其余的代码(由于空间原因省略了),这部分总是返回 U(输入 50 或更低),无论实际输入是什么。我实际上已经在这一部分工作了两个半小时,这让我很难过。

4

3 回答 3

7

您确定要初始化i = 1吗?而不是使用索引,你为什么不只是使用thisVector.back()?或者更好的是,只需传递inputDetermine_Output(). 您可以完全消除变量i,至少在您向我们展示的代码中。

此外,您不需要为 声明大小thisVector,因为push_back()会根据需要增加向量。

于 2013-11-11T01:30:43.387 回答
2
vector<double> thisVector(10);

创建一个包含 10 个双精度的向量,全部初始化为 0。所以thisVector[0], thisVector[1], ...thisVector[9]都是 0.0。

你的测试是:

thisVector.push_back(input);
Determine_Output(thisVector[i]);

其中i从 开始1,并且每次递增。第一次通过循环,thisVector.push_back(input);添加input到向量的末尾,使其成为第十一个元素thisVector[10]。但是DetermineOutput用 element 调用thisVector[1],它的值仍然为 0。

下一次循环时,添加thisVector[11]i现在2检查thisVector[2],当然也是 0.0。等等。只有在最后一次迭代中,您才检查thisVector[10]非零(因为它是您读取的第一个元素)。

所以,简化:

  1. 不要将向量初始化为 10 个元素。当你开始时,你希望它是空的。

  2. 摆脱i. 这是完全没有必要的。用于thisVector.back()引用您刚刚push_back编辑的元素。(或input直接使用。)

  3. 摆脱z. 这也是不必要的。您需要运行循环,直到thisVector有 10 个元素。

于 2013-11-11T02:06:22.977 回答
0

else if您可以通过颠倒比较的顺序 来消除结构:

void Determine_Output(double output)
{
  char letter = 'U';
  if (output > 50)
    letter = 'P';
  if (output > 60)
    letter = 'C';
  if (output > 70)
    letter = 'B';
  if (output > 90)
    letter = 'A';
  cout << letter << " will be assigned to this result.\n";
}

上面的结构可能不那么令人困惑,尽管它确实多次覆盖了字母。

于 2013-11-11T01:41:26.530 回答