动态矢量大小分配

时间:2015-01-02 18:59:39

标签: c++ vector

我是C ++初学者。目前学习载体。我正在编写一个程序来计算给定等级的平均值。我写的程序只接受5个等级。如何修改程序,以便为任意数量的等级自动分配向量空间?也就是说,在“输入”等级:'提示,我应该可以输入任意数量的等级,并且必须计算这些等级的平均值。

#include <iostream>
#include <vector>

using namespace std;

int main() {
    vector<int> grades;
    int grade;
    cout << "Enter grades: ";
    for(int i = 1; i <= 5; ++i) {
        cin >> grade;
        grades.push_back(grade);
    } double total = 0;
    for(int i = 0; i < grades.size(); ++i) {
        total += grades[i];
    } double avg;
      cout << "Average = " << total / grades.size() << endl;
    return 0;
}

3 个答案:

答案 0 :(得分:3)

看起来您希望行尾(用户点击“输入”)表示成绩结束。

此代码会将整行记录到own stream object中,与cin不同 - 最终会到达终点

std::string grades_full_line;
std::getline(std::cin, grades_full_line);           
std::stringstream grade_stream(grades_full_line);  

您现在可以更改循环以将流本身用作条件。当你到达终点时它将评估为false

for( grade_stream >> grade; grade_stream; grade_stream >> grade )
{      
  grades.push_back(grade);
}

答案 1 :(得分:1)

矢量非常酷,因为它们可以根据需要增长(如果你正在使用push_back方法)。基本上,你已经在那里了!您的代码将处理尽可能多的成绩(在合理范围内)。

您需要更改的是更改for循环以循环动态选择的次数:

更改:

for(int i = 1; i <= 5; ++i) {
    cin >> grade;
    grades.push_back(grade);
}

cout << "How many grades" << endl;
cin >> numOfGrades;
for(int i = 0; i < numOfGrades; ++i) {
    cin >> grade;
    grades.push_back(grade);
}

这将循环正确的次数并获得你想要的东西。

答案 2 :(得分:0)

你需要找出一个循环终止条件 - 用户可以通过某种方式让你知道他已经完成了分数。一旦将其合并到push_back循环的边界中,您的代码就会起作用。假设您认为等级-1意味着用户已完成输入成绩。然后,您需要进行以下修改:

while(cin >> grade and grade != -1)//EDITED
{
  grades.push_back(grade);
}

编辑:正如cdhowie所提到的,你应该清理收到的输入。