проверка ввода в то время как цикл бесконечен - PullRequest
0 голосов
/ 21 января 2019
#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{

double addition;
double subtraction;
double top, bottom;
double multiplication, multiplication2;
char variable;
double total = 0.0;



    cout << "Type in:\n'A' For Addition\n"
        << "'S' For subtraction\n" << "'D' For division\n"
        << "'M' For multiplication\n";
    cin >> variable;

    switch (variable)
    {
    case 'A':
    {
        cout << "Enter 0 for input\n";
        cin >> addition;
        while(addition != 'Q' || addition != 'q')
        {

            cout << "Enter numbers for adding\nThen type in"
                << "Q or q to quit\n";
            cin >> addition;
            total += addition;

        }
        cout << "Your total is " << total << endl;

    }

Цикл начинается бесконечно, начиная с первого оператора cout в цикле while. Я буду вводить числа, а затем, как только я наберу q или Q и нажму клавишу ввода, он сразу же будет бесконечно зацикливаться. Спасибо!

Ответы [ 2 ]

0 голосов
/ 21 января 2019

В вашей программе есть две основные проблемы.

Во-первых, условие addition != 'Q' || addition != 'q' всегда равно true, поскольку для любого значения addition либо addition != 'Q', либо addition != 'q' равно true (т. Е. addition никогда не может быть одновременно Q и q одновременно). Вы, наверное, имели в виду addition != 'Q' && addition != 'q'

Во-вторых, когда вы делаете cin >> addition с переменной типа double, вы либо получите действительное число, либо - если кто-то введет - например, «Q», «ничего», и будет установлен флаг ошибки. «Ничто» означает, что значение addition остается неизменным.

Чтобы выполнить «или число, или« Q »», вам нужно прочитать строку и сравнить ее с "Q" (или "q"), а в противном случае попытаться преобразовать строку в двойное число.

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

int main() {

    double sum = 0;
    double toAdd;
    std::string input;
    bool end = false;

    while (!end) {
        cout << "enter a value to add (type Q or q to quit)" << endl;
        cin >> input;
        if (input == "Q" || input == "q") {
            end = true;
        }
        else {
            try {
                toAdd = stod(input);
                sum += toAdd;
            } catch (out_of_range &e) {
                cout << "input " << input << " is out of range." << endl;
            } catch (invalid_argument &i) {
                cout << "input " << input << " is not a valid number." << endl;
            }
        }
    }
    cout << "sum: " << sum << endl;

}
0 голосов
/ 21 января 2019

Ваше условие для цикла while использует логическое ИЛИ.

Допустим, вы пытаетесь выйти из цикла и ввести вход «Q».Первая часть условия будет FALSE, но вторая часть условия будет TRUE.Поскольку это логическое ИЛИ, тогда все условие будет ИСТИНА, и цикл будет выполнен.Обратное также верно, если вы введете 'q'.

Так что независимо от того, что вы вводите, ваш цикл будет выполняться.

...