Как получить пользовательский ввод в цикле do / while? - PullRequest
1 голос
/ 17 октября 2011

Я попытался использовать цикл do / while, о котором я спрашивал, и исправил его в своей единственной функции в int main, чтобы разрешить повторный запуск всей программы, если пользователь хочет, но она перезапускает программу, не ожидая ввода пользователя.

int main()
{
    int spoolnumber = 0;     // Number of spools to be ordered
    float subtotalspool = 0; // Spool sub total
    float shippingcost = 0;  // Shipping cost
    float totalcost = 0;     // Total cost
    char type = 'n';

    do {
        instruct();                     // Print instructions to user
        spoolnumber = spoolnum();       // calculate and store number of spools

        subtotalspool = stotalspool(spoolnumber);       // Calculate subtotal
        shippingcost = shipcost(subtotalspool);         // Calculate subtotal
        totalcost = tcost(subtotalspool, shippingcost); // Calculate final total

        // Print final output
        results(spoolnumber, subtotalspool, shippingcost, totalcost);     
        cout << "\n" << " Would you like to run the program again? [y/n]"; 
    }
    while (type != 'y');

    return 0;
}

Ответы [ 5 ]

8 голосов
/ 17 октября 2011

Вы не прочитали ни одного ввода от пользователя.Вы могли бы просто сделать:

cin >> type;

Но на самом деле вы хотите проверить, что это тоже успешно, например, не eof или другие ошибки, в противном случае все еще возможно зацикливание навсегда, если пользователь нажал Crtl - D , например.

Проверка, успешно ли это:

if (!(cin >> type)) {
   // Reading failed
   cerr << "Failed to read input" << endl;
   return -1;
}

Что вы могли бы сделать частью условия цикла:

while (cin >> type && type != 'y');

Совет от Xeo по поводу вызова cin.ignore() важен, так как вы почти наверняка получите более одного char значения для ввода.

8 голосов
/ 17 октября 2011

Вы не добавили ни одного кода для подтверждения ввода пользователя. В нижней части вашего цикла, пытаясь прочитать символ из cin в type.

Кроме того, может потребоваться сначала очистить вывод cout, прежде чем принимать пользовательский ввод от cin.

6 голосов
/ 17 октября 2011

Ну, вы никогда не спрашиваете о вводеДобавьте следующую строку после строки cout:

cin >> type;
cin.ignore(); // remove trailing newline token from pressing [Enter]

Теперь вам все равно понадобится обычное тестирование, если ввод был действителен вообще и т. Д., Но это должно помочь вам.

2 голосов
/ 17 октября 2011

Это потому, что вы не запрашиваете у пользователя ввод.

Вы добьетесь большего успеха, если попробуете что-то вроде:

cout << "\n" << " Would you like to run the program again? [y/n]"; 
cin >> type;
2 голосов
/ 17 октября 2011

Вам нужно включить cin, чтобы получить решение пользователя:

Например:

cout << "\n" << " Would you like to run the program again? [y/n]"; 
cin >> someVariable;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...