повторно использует "rechnung ()", хотя это не должно - PullRequest
0 голосов
/ 02 февраля 2019
#include <iostream>
#include "funktionen.h"

using namespace std;

int rechnung()
{
    cout  << "Please choose the operator you want to calculate with" << endl;
    int eingabe1;
    int eingabe2;
    int eingabe;
    int dummy;
    char zeichen;
    char again;
    cin >> zeichen;
    cout << endl << "1. Eingabe: ";
    cin >> eingabe1;
    cout << endl << "2. Eingabe: ";
    cin >> eingabe2;
    switch (zeichen)
    {
    case '+':
        eingabe=eingabe1 + eingabe2;
        break;
    case '-':
        eingabe=eingabe1 - eingabe2;
        break;
    case '*':
        eingabe=eingabe1 * eingabe2;
        break;
    case '/':
        eingabe=eingabe1 / eingabe2;
        break;
    }

    cout << endl << "Das Ergebnis ist | " << eingabe << " | " << endl << endl;
    cout << "Wanna calculate again? ";
    cin >> again;
    while(again=='Y')
    {
        rechnung();
    }
    return 0;
}

Итак, это мой код в файле реализации.Моя проблема в том, что основная программа всегда зацикливает всю функцию "rechnung ()", даже если я не набираю "Y" в консоли, как только она ее запрашивает.В начале, когда я набираю что-то другое, чем «Y», консоль закрывается (как и должно), но если я делаю вычисление, набираю «Y», делаю другое вычисление и набираю, например, «k», она также начинается сначало "rechnung ()".Почему это так?Я имею в виду, что сказал ему, что он будет вызывать «rechnung ()» только в том случае, если ввод символов «Y».

1 Ответ

0 голосов
/ 02 февраля 2019

Рассмотрим, возможно, более простой пример:

void foo() {}
void bar() {
    char again;
    // ... do something
    std::cin >> again;
    while(again=='Y') {
        foo();
    }
}

Внутри цикла значение again никогда не изменяется, поэтому существует бесконечный цикл.Однако ваш код идет на шаг дальше, вызывая функцию рекурсивно.Сильно упрощенно у вас есть:

void bar() {
   // .. do something
   while (true) {
       bar();
   }
}

т.е. bar вызывает себя снова и снова и никогда не возвращается.Вы поставили петлю в неправильном месте.Вы могли бы написать это так

void bar() {
    char again = 'Y';
    while (again == 'Y') {
        // .. do something
        std::cout << "repeat?";
        std::cin >> again;
    }
}
...