C++, консольное приложение, защита от неправильного ввода

226
16 марта 2018, 14:15

В этом приложении входным данным должно быть натуральное число, при вводе целого или нуля и нажатия Enter программа начинается сначала и так пока не будет введено корректное значение. Тогда она вычисляет сумму факториалов натуральных чисел от 1 до введённого натурального числа. Но защита с помощью оператора else от неправильного ввода не работает против действительных чисел, дробное число воспринимается программой как 2 натуральных числа и программа после ввода дробного числа выполняется два раза подряд, первый раз для натурального числа идущего до точки и второй раз для натурального числа идущего после точки. Как защититься от ввода дробных чисел или чисел выходящих за диапазон типа переменной?

#include <iostream>
using namespace std;
long double factor (short x)
{
    long double k=1;
    short i;
    for (i=1; i<=x; i++) k=k*i;
    return k;
}
int main()
{
    long double s;
    short i, n;
    char ch;
    while ((ch=cin.get())='\n')
    {
        cout << "Vvedi naturalnoe chislo N<=1754: ";
        cin >> n;
        if (n>0)
        {
            s=0;
            for (i=1; i<=n; i++) s=s+factor(i);
            if (n==1) cout << "S=1!=";
            else if (n==2) cout << "S=1!+2!=";
            else cout << "S=1!+...+" << n << "!=";
            cout.precision(16);
            cout << std::uppercase << s << endl << endl;
        }
    }
    return 0;
}
Answer 1
  1. Считываете строку
  2. Пробуете перевести ее в число
  3. Смотрите на результат

 

string str;
cin >> str;
try {
  unsigned long num = stoul(str);
  if (num == 0)
    throw out_of_range("Number is zero");
  doProcess(num);
catch (exception e) {
  cout << e.what();
}
Answer 2

Сохраняйте это значение в Int или long long, десятичная часть сама обрежется Либо,

double a;
cin>>a;
int b = a;
if (abs(a-b) != 0)
    cout <<"введите натуральное число"<<endl;
Answer 3

Раз вы написали свой, я напишу свой вариант

string s;
getline(cin, s);
transform(s.begin(), s.end(), s.begin(),
          [](char c) { if(!isdigit(c)) c = ' '; return c; });
istringstream is(s);
vector<int> integers;
int n = 0;
while(is >> n)
    integers.emplace_back(n); // в векторе хранятся ваши числа

может быть я не очень хорошо понел что вам нужно...

READ ALSO
Как получить хэндел драйвера в системе и записать в его память

Как получить хэндел драйвера в системе и записать в его память

Я хочу получить информацию о модуле в системеДопустим, есть драйвер в системе Example

165
QT как отловить закрытие создоваемого QFileDialog

QT как отловить закрытие создоваемого QFileDialog

Создаю такое диалоговое окно

204
Запуск QTimer в основном и отдельном потоке

Запуск QTimer в основном и отдельном потоке

В Qt приложении пи запуске таймеров и в основном и в отдельном потоке, программа падаетМожно ли это делать и как сделать корректно?

235
вычисление констант и функций объекта Math

вычисление констант и функций объекта Math

хорошего дня Существует открытый код браузера Mozilla FireFoxКогда мы заходим на какой-либо сайт, то загружается множество jscript

197