Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Операционные системы > Софт
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.03.2011, 14:36   #1
Тошка
Пользователь
 
Регистрация: 10.03.2011
Сообщений: 11
По умолчанию Небольшой шаблон и прототип.

Всем привет. И так, не давно я начал изучать С++. Решая те или иные задачки, столкнулся с проблемой ввода. То-есть постоянно писать код на верность диапазона вводимых чисел, отрицательность, и проверка на правильность типа ( что бы было именно число ). Я всего дня 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. Это позволит брать абсолютную величину числа ( т.е. по модулю ) если оно отрицательно, с соответствующим сообщением.

Последний раз редактировалось Тошка; 17.03.2011 в 14:58.
Тошка вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
статья - Передача звука по сети. Прототип VoIP телефона Pblog Обсуждение статей 4 30.01.2012 08:37
Прототип функции Crudelis Общие вопросы C/C++ 3 05.04.2010 15:26
Можно ли создать прототип функции класса7 TwiX Общие вопросы C/C++ 2 07.11.2009 00:59
Прототип функции Syltan Общие вопросы C/C++ 5 27.08.2009 23:43
Прототип Принц Общие вопросы C/C++ 2 06.06.2008 18:36