Всем привет. И так, не давно я начал изучать С++. Решая те или иные задачки, столкнулся с проблемой ввода. То-есть постоянно писать код на верность диапазона вводимых чисел, отрицательность, и проверка на правильность типа ( что бы было именно число ). Я всего дня 4 как начал изучать, и уже запарился писать одно и тоже

Многие возможно подумают - зачем париться, вводи верные данные и все. Но вот хочется мне чтоб все правильно было

Вот наваял, жду комментариев, критики, советов, возможно где есть ошибка, или где упростить. Возможно понадобится тоже кому-нибудь начинающему.
Код:
double mod( double number )
{
if ( number < 0 )
number *= -1;
return number;
}
double range( double min = 1.7e-308, double max = 1.7e+308, int subZero = 0 )
{
double number;
cin >> number;
if ( min <= 0 )
subZero = 2;
else if ( min >= 1 && subZero != 1 )
subZero = 0;
else
subZero = 1;
int subZeroSwitch = subZero;
if ( cin.fail() || number < min || number > max )
{
do
{
if ( cin.fail() )
{
cin.clear();
cin.sync();
cout << "Вводимые данные должны быть числом. Введите число от " << min << " до " << max << ": ";
cin >> number;
if ( cin.fail() )
continue;
}
if ( number <= 0 && subZero == 0 )
{
while ( number <= 0 )
{
cout << "Данное значение не может быть меньше единицы. Введите новое число: ";
cin >> number;
if ( cin.fail() )
break;
else if ( number > 0 )
subZero = 3;
}
if ( cin.fail() )
continue;
}
else if ( number <= 0 && subZero == 1 )
{
number = mod( number );
cout << "Данное значение не может быть ниже единицы. Взято абсолютное значение числа: " << number << endl;
subZero = 3;
}
if ( number < min || number > max )
{
cout << "Число должно быть в диапозоне от " << min << " до " << max << ". Введите новое число: ";
cin >> number;
if ( cin.fail() )
continue;
else if ( number <= 0 && subZeroSwitch != 2 )
subZero = subZeroSwitch;
else
subZero = 3;
}
} while ( cin.fail() || number < min || number > max || subZero != 3 );
}
return number;
}
template< typename absNumber >
absNumber mod( absNumber number )
{
if ( number < 0 )
number *= -1;
return number;
}
template< typename value >
value range( value min, value max, int subZero )
{
double number;
cin >> number;
if ( min <= 0 )
subZero = 2;
else if ( min >= 1 && subZero != 1 )
subZero = 0;
else
subZero = 1;
int subZeroSwitch = subZero;
if ( cin.fail() || number < min || number > max )
{
do
{
if ( cin.fail() )
{
cin.clear();
cin.sync();
cout << "Вводимые данные должны быть числом. Введите число от " << min << " до " << max << ": ";
cin >> number;
if ( cin.fail() )
continue;
}
if ( number <= 0 && subZero == 0 )
{
while ( number <= 0 )
{
cout << "Данное значение не может быть меньше единицы. Введите новое число: ";
cin >> number;
if ( cin.fail() )
break;
else if ( number > 0 )
subZero = 3;
}
if ( cin.fail() )
continue;
}
else if ( number <= 0 && subZero == 1 )
{
number = mod( number );
cout << "Данное значение не может быть ниже единицы. Взято абсолютное значение числа: " << number << endl;
subZero = 3;
}
if ( number < min || number > max )
{
cout << "Число должно быть в диапозоне от " << min << " до " << max << ". Введите новое число: ";
cin >> number;
if ( cin.fail() )
continue;
else if ( number <= 0 && subZeroSwitch != 2 )
subZero = subZeroSwitch;
else
subZero = 3;
}
} while ( cin.fail() || number < min || number > max || subZero != 3 );
}
return number;
}
Пример использования:
Код:
int chislo; // может быть и double если число дробное нужно
cout << "Введите число: ";
chislo = range(); //в range в качестве параметров ( минимальное допустимое значение, максимальное допустимое значение, параметр режима для отрицательного числа* )
*Для минимального значения <= 0 автоматически убирается ограничение на отрицательное число, при минимальном значении больше 0 автоматически ставится невозможность ввода отрицательного числа или числа равного 0. В качестве параметра можно указать только 1, и только при минимальном значении больше 0. Это позволит брать абсолютную величину числа ( т.е. по модулю ) если оно отрицательно, с соответствующим сообщением.