动态向量大小分配
Dynamic Vector Size Allocation
我是 C++ 初学者。目前正在学习向量。我正在编写一个程序来计算给定成绩的平均值。我写的程序只接受5个等级。我如何修改程序,使矢量 space 自动分配给任意数量的年级?也就是说,在 'Enter grades:' 提示符下,我应该能够输入任意数量的成绩,并且必须计算这些成绩的平均值。
#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;
}
您需要找出一个循环终止条件——让用户知道他已完成输入成绩的某种方式。一旦将其合并到 push_back
循环的边界中,您的代码就可以正常工作。假设您决定 -1
的成绩意味着用户已完成输入成绩。那么下面的修改就足够了:
while(cin >> grade and grade != -1)//EDITED
{
grades.push_back(grade);
}
编辑:正如 cdhowie 提到的,您应该清理收到的输入。
向量非常酷,因为它们可以根据需要增长(如果您按原样使用 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);
}
这将循环正确的次数并得到你想要的。
您似乎希望行尾(用户点击 "enter")表示成绩结束。
此代码会将整行拉入其 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);
}
我是 C++ 初学者。目前正在学习向量。我正在编写一个程序来计算给定成绩的平均值。我写的程序只接受5个等级。我如何修改程序,使矢量 space 自动分配给任意数量的年级?也就是说,在 'Enter grades:' 提示符下,我应该能够输入任意数量的成绩,并且必须计算这些成绩的平均值。
#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;
}
您需要找出一个循环终止条件——让用户知道他已完成输入成绩的某种方式。一旦将其合并到 push_back
循环的边界中,您的代码就可以正常工作。假设您决定 -1
的成绩意味着用户已完成输入成绩。那么下面的修改就足够了:
while(cin >> grade and grade != -1)//EDITED
{
grades.push_back(grade);
}
编辑:正如 cdhowie 提到的,您应该清理收到的输入。
向量非常酷,因为它们可以根据需要增长(如果您按原样使用 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);
}
这将循环正确的次数并得到你想要的。
您似乎希望行尾(用户点击 "enter")表示成绩结束。
此代码会将整行拉入其 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);
}