Во-первых, первая итерация цикла while не всегда принимает входные данные. 2+ петли работают нормально - PullRequest
4 голосов
/ 05 марта 2010

Ошибка начинается с cin.getline (строка, 25, '\ n'); или строка под ним (strtod). Если я использую cin, это работает, за исключением того, что я не могу выйти. Если я наберу что-нибудь, что не является двойным, запускается бесконечный цикл. Нужна помощь. По сути, первая итерация запускается, не запрашивая ввод, поэтому пользователь неправильно понимает математические вопросы. Вторая итерация работает отлично. И следующий тоже хорошо. Если я возвращаюсь, используя q, меня сбрасывают обратно в режим выбора. После выбора режима ошибка появляется снова для первой итерации. Следующие итерации уже нет.

int main()
{
    char choice, name[25], string[25], op;
    int operator_number, average, difference, first_operand, second_operand, input, answer, total_questions = 0, total_correct = 0;
    double dfirst_operand, dsecond_operand, dinput, danswer, percentage;
    bool rounding = false;

    srand ( time(NULL) );

    cout << "What's your name?\n";
    cin.getline ( name, 25, '\n' );
    cout << '\n' << "Hi, " << name << ".";

    do {
    do {
    cout << "\nWhich math operations do you want to practice?\n  1. Addition\n  2. Subtraction\n  3. Multiplication\n  4. Division\n  5. Mixed\n  6. Difference of squares multiplication.\nChoose a number (q to quit).\n";
    cin >> choice;
    } while( choice < '1' || choice > '6' && choice!= 'q');

    cout << "\n";

    switch(choice) {
    case '1':
            while( string[0]!= 'q') {
                dfirst_operand = rand() % 15 + 1;
                dsecond_operand = rand() % 15 + 1;
                danswer = dfirst_operand + dsecond_operand;
                cout << dfirst_operand << " + " << dsecond_operand << " equals?\nEnter q to quit.\n";
                cin.getline ( string, 25, '\n' );
                dinput = strtod( string,NULL);
                //cin >> dinput;
                if(string[0]!='q') {
                ++total_questions;
                if(dinput==danswer) {
                    ++total_correct;
                    cout << "Correct. " << total_correct << " correct out of " << total_questions << ".";
                } else {
                    cout << "Wrong. " << dfirst_operand << " + " << dsecond_operand << " equals " << danswer << ".\n" << total_correct << " correct out of " << total_questions << ".";
                };
                percentage = floor(10000 * (float) total_correct / total_questions)/100;
                cout << ' ' << percentage << "%.\n\n";
                }
            }
            break;
            }
    } while(choice!='q');
    return 0;
}

Ответы [ 2 ]

1 голос
/ 06 марта 2010

Проблема в этой строке:

 cin >> choice;

Эта строка анализирует входной буфер для ввода символов, который можно преобразовать в целое число. Так что если вы введете:

2<newline>

Строка "2" преобразуется, а <newline> остается во входном буфере; поэтому последующее выполнение cin.getline () выполняется немедленно.

Именно поэтому предложение JonH не работает, вам необходимо очистить буфер ввода после ввода cin << choice. Альтернативой является использование cin.getline () для всех входных данных (или лучше; use :: getline (), который работает с std :: string, а не C-строками), а затем анализирует этот ввод с использованием объекта std :: istringstream, когда Вам нужно отформатированное входное сканирование.

Однако, если вы должны использовать cin.ignore () для решения этой проблемы, вы должны сделать это следующим образом:

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

где std :: numeric_limits определяется в заголовке. Ваше решение доверяет пользователю не вводить более 25 символов. Это не очень безопасное предположение.

0 голосов
/ 05 марта 2010

Попробуйте бросить cin.ignore() сразу после или до cin.getline().

...