Я делаю программу, которая принимает несколько имен учеников и вычисляет окончательный класс, основанный на оценках, введенных в. Проблема, с которой я сталкиваюсь, заключается в том, что когда она переходит ко второму ученику, она не позволяет мне вводить оценки, а я Не знаю, почему. Какие-либо предложения?
#include <algorithm>
#include <iomanip>
#include <ios>
#include <iostream>
#include <string>
#include <vector>
using std::cin; using std::setprecision;
using std::cout; using std::string;
using std::endl; using std::streamsize;
using std::sort; using std::vector;
int main() {
vector<string> names;
vector<double> finals;
typedef vector<double>::size_type vec_sz;
vec_sz sizeStud;
string name;
double sum, grade;
int counter;
cout<<"Please enter the student names \"end-of-input\" to end:\t";
while(cin>>name&&name!="end-of-input") {
names.push_back(name);
}
sizeStud = names.size();
if(sizeStud == 0) {
cout<<"No students entered! Please try again."<<endl;
return 1;
}
for(int i = 0; i < sizeStud; i++) {
sum=0;
counter=0;
cout<<"Please enter the grades for "<<names[i]
<<" \"end-of-input\" to end:\t";
while(cin>>grade) {
counter++;
sum+=grade;
}
if(counter==0) {
cout<<"No grades entered! Please try again."<<endl;
}
else {
cout<<endl;
finals.push_back(sum/counter);
}
}
for(int i =0 ; i < sizeStud; i++) {
streamsize prec = cout.precision();
cout<<names[i]<<" final:\t\t"<<setprecision(4)
<<finals[i]<<setprecision(prec)<<endl;
}
return 0;
}
Пример ввода:
fred sally joe end-of-input
10 20 end-of-input
30 end-of-input
Пример вывода (от ideone.com здесь):
Please enter the student names "end-of-input" to end: Please enter the grades for fred "end-of-input" to end:
Please enter the grades for sally "end-of-input" to end: No grades entered! Please try again.
Please enter the grades for joe "end-of-input" to end: No grades entered! Please try again.
fred final: 15
sally final: 1.719e-312
joe final: 1.316e-312
Ваша проблема в этой строке:
while(cin>>grade)
Поскольку grade
является double
, если ваш вход "конец-вход" петля в то время как выйдет, но cin
поток будет установлен в состояние ошибки и дальнейший ввод не будет предпринята попытка (следующий for
итерации цикла будет достигнут в while(cin>>grade)
и проваливаются сразу). Вы можете использовать cin.clear()
чтобы очистить состояние ошибки, и cin.ignore
(std::numeric_limits<std::streamsize>::max(), '\n')
чтобы потреблять остальную часть строки. Затем введите...
fred sally joe end-of-input
10 20 30 any-non-numeric-content
10 20 sally scores
30 end-of-input
...будет работать".