Почему мой cacluator повторяет тот же вывод, когда я использую десятичное значение? - PullRequest
0 голосов
/ 02 марта 2020

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

#include <iostream>
#include <cmath>
using namespace std;

int num1, num2;

int request(){
    cout << "Type in a number: " << flush;
    cin >> num1;
    cout << "Type in a number: " << flush;
    cin >> num2;
}

int getMin(){
    cout << "Get the minimum of 2 numbers" << endl;
    request();
    if(num1 < num2)
        cout << "The minimumm of " << num1 << " and "
                << num2 << " is " << num1 << endl;
    else
        cout << "The minimumm of " << num1 << " and "
                << num2 << " is " << num2 << endl;
}

int getMax(){
    cout << "Get the maximum of 2 numbers" << endl;
    request();
    if(num1 > num2)
        cout << "The maximum of " << num1 << " and "
                << num2 << " is " << num1 << endl;
    else
        cout << "The maximum of " << num1 << " and "
                << num2 << " is " << num2 << endl;
}

int power(){
    cout << "Get the exponent of 2 numbers" << endl;
    request();
    cout << num1 << " to the power of " << num2 << " is "
         << pow(num1,num2) << endl;
}



int main(){


    getMin();
    cout << endl;
    getMax();
    cout << endl;
    power();
    cout << endl;

}

output
Get the minimum of 2 numbers
Type in a number: 5.5
Type in a number: The minimumm of 5 and 0 is 0

Get the maximum of 2 numbers
Type in a number: Type in a number: The maximum of 5 and 0 is 5

Get the exponent of 2 numbers
Type in a number: Type in a number: 5 to the power of 0 is 1

1 Ответ

0 голосов
/ 02 марта 2020

почему остальные мои функции повторяют один и тот же код и заканчиваются sh?

Это потому, что когда извлечение int завершается неудачно, символ, делающий извлечение неудачным остается в потоке (и будет встречаться каждый раз при попытке нового извлечения), и поток переводится в состояние сбоя, что делает любые дальнейшие попытки извлечения данных из потока неуспешными - поэтому любые значения, которые вы ранее установили для num1 и num2 будут использоваться снова и снова. Если значение не было присвоено, вы читаете неинициализированную память, и ваша программа имеет неопределенное поведение.

Для восстановления после неудачного извлечения вы можете clear() флаги состояния потока и ignore() символы в потоке до конца line.

Кроме того, ваша функция request() и остальные функции в любом случае имеют неопределенное поведение. Они объявили, что они возвращают int, но ничего не возвращают, поэтому вместо этого сделайте их void.

Однако вы можете изменить request(), чтобы получить bool. Верните true, если запрос был успешно выполнен, и false в противном случае:

#include <limits> // std::numeric_limits

bool request() {
    cout << "Type in a number: ";
    if(cin >> num1) {
        cout << "Type in a number: ";
        if(cin >> num2) return true;     // both numbers extracted successfully
    }

    // something failed
    if(not cin.eof()) { // skip clearing the state if eof() is the reason for the failure
        cin.clear();    // clear the fail state

        // ignore rest of line to remove the erroneous input from the stream
        cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    }
    return false;
}

Теперь вы можете использовать его и убедиться, что пользователь действительно успешно ввел два значения. Пример:

void getMin() {   // made it void since it doesn't return anything
    cout << "Get the minimum of 2 numbers" << endl;
    if(request()) {               // check that extraction succeeded
        if(num1 < num2)
            cout << "The minimumm of " << num1 << " and "
                 << num2 << " is " << num1 << endl;
        else
            cout << "The minimumm of " << num1 << " and "
                 << num2 << " is " << num2 << endl;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...