Я только начал с C ++ и хотел запрограммировать калькулятор, но моя логика где-то не так - PullRequest
0 голосов
/ 12 февраля 2019

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

Это мой код:

#include <iostream>

using namespace std;

/*Variables*/
double d_Zahl1 = 0.0;
double d_Zahl2 = 0.0;
double d_Ergebnis = 0.0;
char c_Operator = ' ';

/*Functions*/
double add(double d_Zahl1, double d_Zahl2)
{
    d_Ergebnis = d_Zahl1 + d_Zahl2;
    return d_Ergebnis;
    /*Output of result*/
    cout << "\n\n\n" << d_Zahl1 << c_Operator << d_Zahl2 << '=' << d_Ergebnis;
};

double substract(double d_Zahl1, double d_Zahl2)
{
    d_Ergebnis = d_Zahl1 - d_Zahl2;
    return d_Ergebnis;
    /*Output of result*/
    cout << "\n\n\n" << d_Zahl1 << c_Operator << d_Zahl2 << '=' << d_Ergebnis;
};

double divide(double d_Zahl1, double d_Zahl2)
{
    d_Ergebnis = d_Zahl1 / d_Zahl2;
    return d_Ergebnis;
    /*Output of result*/
    cout << "\n\n\n" << d_Zahl1 << c_Operator << d_Zahl2 << '=' << d_Ergebnis;
};

double multiply(double d_Zahl1, double d_Zahl2)
{
    d_Ergebnis = d_Zahl1 / d_Zahl2;
    return d_Ergebnis;
    /*Output of result*/
    cout << "\n\n\n" << d_Zahl1 << c_Operator << d_Zahl2 << '=' << d_Ergebnis;
};


/*Main function*/
int main()
{
    /*Output of head*/
    cout << "\t----------Calculator----------\n\n";



    /*Input of 1. number*/
    /*checking if the input is a number*/
    while (cout << "\n\nPlease enter your first number: " && !(cin >> d_Zahl1))
    {
        cout << "\nThat's not a valid input. Try again. " << endl;
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
    }

    /*Einlesen des Operanden*/
    cout << "\nPlease enter your operator (+,-,*,/): ";

    do {                                //Fehler durch do-while Schleife abfangen

        cin >> c_Operator;

        switch (c_Operator) {

        case '+':
            /*Eingabeaufforderung für zweite Zahl*/
            cout << "\nPlease enter your second number: ";

            /*Einlesen der 2. Zahl*/
            cin >> d_Zahl2;

            add(d_Zahl1, d_Zahl2);
            break;
        case '-':
            /*Eingabeaufforderung für zweite Zahl*/
            cout << "Please enter your second number: ";

            /*Einlesen der 2. Zahl*/
            cin >> d_Zahl2;

            substract(d_Zahl1, d_Zahl2);
            break;
        case '*':
            /*Eingabeaufforderung für zweite Zahl*/
            cout << "Please enter your second number: ";

            /*Einlesen der 2. Zahl*/
            cin >> d_Zahl2;

            multiply(d_Zahl1, d_Zahl2);
            break;
        case '/':
            /*Eingabeaufforderung für zweite Zahl*/
            cout << "Please enter your second number: ";

            /*Einlesen der 2. Zahl*/
            cin >> d_Zahl2;

            divide(d_Zahl1, d_Zahl2);
            break;
        default:
            cout << "-----Wrong input!-----\n\n\n\n\n\n\n\n\nPlease enter your operator (+,-,*,/): ";
        }
    } while (c_Operator != '+' || c_Operator != '-' || c_Operator != '*' || c_Operator != '/'); /*Solange keines der Rechenzeichen --> repeat*/



    system("pause");
    return 0;
}

Я хотел, чтобы это выглядело так:

Введите 1. Число: 5

Введите Оператор: +

Введите 2. Число: 5

5 + 5 = 10

но сейчас это просто:

Введите 1. Число: 5

Введите Оператор: +

Введите 2. Число: 5

Ответы [ 2 ]

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

@ PanthersFan92 уже упоминал о вашей ошибке, но я хотел бы дать несколько советов о том, что можно сделать лучше, здесь, в вашем коде.Также есть некоторые недостатки.

прежде всего using namespace std; - не очень хорошая практика.Вы можете прочитать здесь почему.

Функция не нуждается в точке с запятой в конце.Кроме того, ваша функция просто производит вывод и, следовательно, нет необходимости возвращать число.Поскольку вы сделали d_Zahl1 и d_Zahl2 глобальными, нет необходимости передавать их как аргументы.

, поэтому

double add(double d_Zahl1, double d_Zahl2){...};

становится

void add(){...}

Вы пишете:

cout << "\n\n\n" << d_Zahl1 << c_Operator << d_Zahl2 << '=' << d_Ergebnis;

4 раза.Вы можете поместить это в функцию:

void print_result(double d_Ergebnis) {
    std::cout << "\n\n\n" << d_Zahl1 << ' ' << c_Operator << ' ' << d_Zahl2 << " = " << d_Ergebnis << '\n';
}

(Вы также пропустили '\n' в конце).

do {...} while (c_Operator != '+' || c_Operator != '-' || c_Operator != '*' || c_Operator != '/');

довольно уродливо.вместо этого используйте:

bool done = false
while (!done){
    done = true
    switch (){
        ...
        default: done = false
    }
}

system("pause"), вероятно, является самым злым здесь.избегать любой ценой.Вы можете прочитать здесь почему.Просто имейте в виду, что это добавляет массу накладных расходов при загрузке всех оконных (!) Инструкций.Вместо этого используйте что-то вроде:

void system_pause() {
        std::cout << "press enter to continue . . . ";
        if (!std::cin.good()) {
            std::cin.clear();
        }
        else {
            std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
        }
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    }

и затем звоните system_pause(), когда вам это нужно.Еще несколько вещей:

  • Ваша multiply функция делит вместо умножения.

  • Вы повторяете себя с помощью "Input second number" и т. Д. - Вы также можете использовать это в функциях.

  • Вам необходимо #include <limits> при использовании.

  • Старайтесь избегать std::endl - всегда используйте '\n'.

полный код:

#include <iostream>
#include <limits>

double d_Zahl1 = 0.0;
double d_Zahl2 = 0.0;
double d_Ergebnis = 0.0;
char c_Operator = ' ';

void system_pause() {
    std::cout << "Press enter to continue . . . ";
    std::cin.clear();
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}


void print_result(double d_Ergebnis) {
    std::cout << "\n\n\n" << d_Zahl1 << ' ' << c_Operator << ' ' << d_Zahl2 << " = " << d_Ergebnis << '\n';
}



void add(){
    d_Ergebnis = d_Zahl1 + d_Zahl2;
    print_result(d_Ergebnis);
}

void substract(){
    d_Ergebnis = d_Zahl1 - d_Zahl2;
    print_result(d_Ergebnis);
}

void divide(){
    d_Ergebnis = d_Zahl1 / d_Zahl2;
    print_result(d_Ergebnis);
}

void multiply(){
    d_Ergebnis = d_Zahl1 * d_Zahl2;
    print_result(d_Ergebnis);
}



void input_first_number() {
    while (std::cout << "Please enter your first number: " && !(std::cin >> d_Zahl1)) {
        std::cout << "That's not a valid input. Try again.\n";
        system_pause();
        std::cout << '\n';
    }
}
void input_second_number() {
    while (std::cout << "Please enter your second number: " && !(std::cin >> d_Zahl2)) {
        std::cout << "That's not a valid input. Try again.\n";
        system_pause();
        std::cout << '\n';
    }
}


int main(){
    std::cout << "\t----------Calculator----------\n\n";

    input_first_number();

    std::cout << "Please enter your operator (+,-,*,/): ";

    bool done = false;
    while (!done){

        std::cin >> c_Operator;

        done = true;
        switch (c_Operator) {
        case '+':
            input_second_number();
            add();
            break;
        case '-':
            input_second_number();
            substract();
            break;
        case '*':
            input_second_number();
            multiply();
            break;
        case '/':
            input_second_number();
            divide();
            break;
        default:
            std::cout << "-----Wrong input!-----\n\nPlease enter your operator (+,-,*,/): ";
            done = false; //repeat if wrong input
        }
    }

    system_pause();
    return 0;
}

пример выполнения:

        ----------Calculator----------

Please enter your first number: 2938
Please enter your operator (+,-,*,/): /
Please enter your second number: 193



2938 / 193 = 15.2228
Press enter to continue . . .

с неправильным вводом:

        ----------Calculator----------

Please enter your first number: a
That's not a valid input. Try again.
Press enter to continue . . .

Please enter your first number: 123
Please enter your operator (+,-,*,/): a
-----Wrong input!-----

Please enter your operator (+,-,*,/): *
Please enter your second number: 678



123 * 678 = 83394
Press enter to continue . . .
0 голосов
/ 12 февраля 2019
d_Ergebnis = d_Zahl1 + d_Zahl2;
return d_Ergebnis;
/*Output of result*/

Это ваша проблема.Все под «возврат» не выполняется.операторы 'return' завершают функцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...