C : Цикл while в моем клакуляторе блокирует корпус переключателя

#c

Вопрос:

Я новичок в C , и английский не мой родной язык, так что извините за любую путаницу с моей стороны. В калькуляторе, который я пытаюсь создать, я сделал так, чтобы он мог обрабатывать «недопустимый» ввод и возвращаться в мое меню, однако теперь «правильный» ввод в моем случае переключателя больше не работает. Может кто-нибудь сказать мне, почему это так?

Код ниже

 #include <iostream.h>
#include <conio.h>
#include <cmath>
#include <limits>


int main ()
{
    cout << "Calculator [v.1.0]" << endl;
    cout << "(c) 2021 <Chayenne van der Erf>" << endl << endl;

Menu:
     cout << "Kies een bewerking en druk op Enter:" << endl;
     cout << "1. Optellen              2. Aftrekken" << endl;
     cout << "3. Vermenigvuldigen      4. Delen" <<endl;
     cout << "5. Kwadraat              6. Worteltrekken" <<endl;
     cout << "7. Reciproke             8. Logarithme" <<endl;
     cout << "0. Exit" << endl << endl;

    int Bewerking;
    cout << "Bewerking: ";
    cin >> Bewerking;
    while (!(cin >> Bewerking)) {
            cin.clear();
            cin.ignore(numeric_limits<streamsize>::max(), 'n');
            cout << endl << "Ongeldige input. Alleen getallen toegestaan." << endl << endl;

    cout << "___" << endl; goto Menu;}

    cout << endl;

    switch (Bewerking) {
    case 1:
     cout << "Optellen";
        break;
    case 2:
     cout << "Aftrekken";
        break;
    case 3:
     cout << "Vermenigvuldigen";
        break;
    case 4:
     cout << "Delen";
        break;
    case 5:
     cout << "Kwadraat";
        break;
    case 6:
     cout << "Worteltrekken";
        break;
    case 7:
     cout << "Reciproke";
        break;
    case 8:
     cout<< "Logarithme";
        break;
    case 0:
    exit (0);

    default: cout << "Invalid Input" << endl;}

    cout << endl;

    if (Bewerking == 1) {
     double A, B;
     double antwoord;

    cout << "Enter een waarde: ";
    cin >> A;
      if (!cin.fail()) {

    cout << "Enter een waarde: ";
    cin >> B;
    if (!cin.fail()) {

    antwoord = A   B;
    cout << endl;
        cout << "= " << antwoord << endl << endl; } } }

    else if (Bewerking == 2) {
     double A, B;
     double antwoord;

    cout << "Enter een waarde: ";
    cin >> A;
    if (!cin.fail()) {

    cout << "Enter een waarde: ";
    cin >> B;
    if (!cin.fail()) {

    antwoord = A - B;
    cout << endl;
        cout << "= " << antwoord << endl << endl;

     cout << "___" << endl; goto Menu; } } }


     else if (Bewerking == 3) {
     double A, B;
     double antwoord;

    cout << "Enter een waarde: ";
    cin >> A;
     if (!cin.fail()) {

    cout << "Enter een waarde: ";
    cin >> B;
     if (!cin.fail()) {

    antwoord = A * B;
    cout << endl;
        cout << "= " << antwoord << endl << endl;

     cout << "___" << endl; goto Menu; } } }

        else if (Bewerking == 4) {
     double A, B;
     double antwoord;

    cout << "Enter een waarde: ";
    cin >> A;
     if (!cin.fail()) {

    cout << "Enter een waarde: ";
    cin >> B;
     if (!cin.fail()) { cout << endl;

     while (B == 0)

     {cout << "Delen door 0 is niet mogelijk." << endl;
     cout << endl;
     cout << "Enter een andere waarde: ";
     cin >> B; }

     {antwoord = A / B;}
     cout << endl;
     cout << "= " << antwoord << endl << endl;

     cout << "___" << endl; goto Menu; } } }


    else if (Bewerking == 5) {
     double X;
     double antwoord;
     cout << "Enter waarde: ";
     cin >> X;
        if (!cin.fail()) {
     antwoord = X * X;
        cout << endl;
        cout << "= " << antwoord << endl << endl;

     cout << "___" << endl; goto Menu; } }

    else if (Bewerking == 6) {
     double X;
     double antwoord;
     cout << "Enter waarde: ";
     cin >> X;
        if (!cin.fail()) {
     antwoord = pow (X,0.5);
        cout << endl;
        cout << "= " << antwoord << endl << endl;

     cout << "___" << endl; goto Menu; } }

        else if (Bewerking == 7) {
     double X;
     double antwoord;
     cout << "Enter waarde: ";
     cin >> X;
        if (!cin.fail()) {
     antwoord = 1 / X;
        cout << endl;
        cout << "= " << antwoord << endl << endl;

     cout << "___" << endl; goto Menu; } }

        else if (Bewerking == 8) {
     double X;
     double antwoord;
     cout << "Enter waarde: ";
     cin >> X;
        if (!cin.fail()) {
     antwoord = log (X);
        cout << endl;
        cout << "= " << antwoord << endl << endl;

     cout << "___" << endl; goto Menu; } }

    getch();
    return 0;
}
 

Комментарии:

1. Плохой отступ 🙁

2. Зачем использовать goto ? может быть, вы стали жертвой кода спагетти.

3. Ваш код менее читаем и имеет плохие отступы.

4. cin >> Bewerking; while (!(cin >> Bewerking)) Так почему же вы читаете одно и то же два раза подряд? Вы ожидаете, что ваш пользователь введет его дважды подряд?

5. @MikeCAT Я абсолютный любитель, я узнал все это неделю назад :/

Ответ №1:

Делая while (!(cin >> Bewerking)) { это, вы продолжаете присваивать значения до Bewerking тех пор, пока оно не станет пустым — но вы все равно присваиваете это значение Bewerking — эффективно переопределяя «хорошее» значение.

Хотя с кодом есть много других проблем — для решения конкретной проблемы в вопросе — вам нужно сохранить последнее значение Bewerking — и использовать его вместо переопределенной переменной.