2015-09-25 3 views
0

У меня есть система, в которой пользователь может вводить столько входов, сколько он хочет, и делать некоторые вычисления.Получение ввода от пользователя с помощью Switch C++

Вот код для решения этой задачи:

int main() { 
    char op = 's'; 
    float time=0, fuel_rate=0, start=0, end=0, pace=0; 


    while(op != 'x'){ 
     cout << "Please select: " << endl; 
     cout << "1 ---> A" << endl; 
     cout << "2 ---> B" << endl; 
     cout << "3 ---> Calculate" << endl; 
     cout << "x ---> Exit" << endl; 

     op = std::getchar(); 

     //remove the rest of the line from input stream 
     int temp; 
     while ((temp = std::getchar()) != '\n' && temp != EOF); 

     switch(op){ 
     case '1': 
      cout << "Enter time: "; 
      cin >> time; 
      cout << "Enter fuel rate: "; 
      cin >> fuel_rate; 
      break; 
     case '2': 
      cout << "Enter start: "; 
      cin >> start; 
      cout << "Enter end: "; 
      cin >> end; 
      cout << "Enter pace: "; 
      cin >> pace; 
      cout << "Enter fuel rate: "; 
      cin >> fuel_rate; 
      break; 
     case '3': 
      cout << "Total value"; 
      break; 
     case 'x': 
      return 0; 
     default: 
      continue; 
     } 
    } 
    return 0; 
} 

система работает хорошо для первого входа. Пример журнал консоль выглядит следующим образом:

Please select: 
1 ---> A 
2 ---> B 
3 ---> Calculate 
x ---> Exit 
1 
Enter time: 2 
Enter fuel rate: 3 
Please select: 
1 ---> A 
2 ---> B 
3 ---> Calculate 
x ---> Exit 
2 
Please select: 
1 ---> A 
2 ---> B 
3 ---> Calculate 
x ---> Exit 

Первого пользователь вводит операция 1, система просит время и расход топлива. Когда пользователь вводит операцию 2, система не запрашивает начало, конец или темп.

Любые идеи о том, как это решить?

ответ

0

Я довольно уверен, что причина большинства ваших проблем - std::getchar(). Если изменить код, чтобы использовать:

cin >> op; 
switch (op) { 
//... 

Вместо

op = std::getchar(); 

//remove the rest of the line from input stream 
int temp; 
while ((temp = std::getchar()) != '\n' && temp != EOF); 

switch(op){ 
//... 

Программа работает просто отлично.

0

Вы смешиваете использование std::cin и stdin. Вы должны придерживаться одного из них. Вместо

op = std::getchar(); 

использования

op = cin.get(); 

Вы должны переместить строки:

int temp; 
    while ((temp = std::getchar()) != '\n' && temp != EOF); 

после окончания switch блока, убедившись в том, что вы используете temp = cin.get()

Неиспользованный символы новой строки остаются во входном потоке, так как вы нас ING operator>>() читать данные, такие как:

cin >> fuel_rate; 
0

Adding debugging print code в случае по умолчанию коммутатора ясно, что показывает, что происходит:

// ... 
default: 
    cout << "unexpected: " << int(op) << endl; 
    continue; 
// ... 

неожиданное: 10

десятичной 10 - это новая строка \n, которая по-прежнему находится во входном буфере после форматирования ввода с использованием operator>> по телефону std::cin.

Чтобы исправить это, вы можете ignore оставшихся символов (подумайте о том, что произойдет, когда пользователь не вводит число, когда вы его запросили), из потока до следующего символа новой строки, включая следующий символ новой строки, после форматированного ввода:

cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 

Или используйте отформатированный вход (который делает пропуск самостоятельно):

cin >> op; 

Хотя вы также должны заботиться о конце условий файла, в котором ваш текущий код не удается сделать, как вы см. пример бежать выше.

Смежные вопросы