C ++ совет по обработке исключений - PullRequest
1 голос
/ 07 марта 2019

Поскольку я очень плохо знаком с исключениями, у меня возникли некоторые проблемы с приведенным ниже кодом исключения из памяти. По сути, мне нужно рассчитать и показать сумму из 10 положительных входных данных. Во время ввода моя программа должна использовать механизм исключений для отображения сообщения, что она не допускает отрицательные числа / не-цифры (NaN) , если это так, и затем выйти из программы. Мне сказали использовать std :: cin.fail () , чтобы определить, соответствует ли введенное значение типу переменной (но я не уверен, как это реализовать). Буду признателен за вашу помощь спасибо!

#include <iostream>

int main() {
    int number;
    int a=-2;
try {

    for(int i=0; i<10;i++) {
    std::cin>>number;

    }
}
catch (...) {

    number==-number?
      std::cout << "Its negative"<<std::endl; 

    number==a? 
      std::cout << "Its NaN"<<std::endl; 
    }
}

1 Ответ

0 голосов
/ 07 марта 2019

Вы говорите "10 положительных входов", но у вас есть int number;.Если ваш number будет целым числом, то он не может принимать дроби, например 33.44, и также не может быть NaN (так что вам не нужно проверять это).Если вы хотите разрешить дроби, вместо этого выполните double number.Кроме того, проверка может выглядеть следующим образом:

for (int i = 0; i < 10; i++) {
        std::cin >> number;
        if (std::cin.fail()) {
            std::cin.clear();
            std::string input;
            std::cin >> input;
            std::cout << "input failed! Invalid input: " << input << std::endl;
            return -1;
        }

После каждого введенного числа выполняется проверка std::cin.fail().Если это не удалось, вы можете просто вернуться.В этом примере я также распечатал неверный ввод.Для этого вам нужно вызвать std::cin.clear();, чтобы сбросить этот флаг ошибки, и затем вы можете поместить этот неверный ввод в std::string (который должен работать, в отличие от number).Для этого вам нужно включить <string>.Если вам не нужно ничего печатать, вы можете просто return и забыть об очистке, строке и выводе.Кроме того, в этом примере, поскольку беспорядок, созданный неверным вводом, аккуратно вычищен, вы можете снова взять больше (допустимых) входных данных, если не взамен return.

Далее, проверка на отрицательные числа:

if (number < 0) {
    std::cout << "Error: Negative number!" << std::endl;
    return -1;
}

Наконец, проверка NaN (для double):

if (isnan(number)) {
    std::cout << "Error: number is NaN!" << std::endl;
    return -1;
}

Вам необходимо включить <math.h> для isnan.

Если сложить все вместе, это может выглядеть так:

#include <iostream>
#include <string> // std::istream >> std::string
#include <math.h> // isnan

int main() {
    double number;

    for (int i = 0; i < 10; i++) {
        std::cin >> number;
        if (std::cin.fail()) {
            std::cin.clear();
            std::string input;
            std::cin >> input;
            std::cout << "input failed! Invalid input: " << input << std::endl;
            return -1;
        }
        if (number < 0) {
            std::cout << "Error: Negative number!" << std::endl;
            return -1;
        }
        if (isnan(number)) {
            std::cout << "Error: number is NaN!" << std::endl;
            return -1;
        }
    }
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...