Пользовательский ввод постоянно запрашивается в цикле c ++

0

Я делаю программу, которая принимает несколько имен учеников и вычисляет окончательный класс, основанный на оценках, введенных в. Проблема, с которой я сталкиваюсь, заключается в том, что когда она переходит ко второму ученику, она не позволяет мне вводить оценки, а я Не знаю, почему. Какие-либо предложения?

#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
  • 2
    Хорошая отправная точка для использования приличного отладчика для пошагового выполнения кода.
  • 1
    Да, используйте отладчик. Подсказка: while (cin >> оценка)
Показать ещё 2 комментария
Теги:
for-loop
while-loop
cout
cin

1 ответ

1
Лучший ответ

Ваша проблема в этой строке:

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

...будет работать".

Ещё вопросы

Сообщество Overcoder
Наверх
Меню