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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.01.2012, 13:47   #1
Denis147
 
Регистрация: 15.01.2012
Сообщений: 4
Радость Защита от некорректного ввода.Вопрос

Приветствую всех.Вот моя функция защиты от некорректного ввода.

Код:
double def_double(){
double c, num,kol;
bool err=0, 
	flag_inpE=0,
	flag_zero=0,//флаг нуля
	flag_zap=0,//флаг запятой
	flag_znak=0,//флаг знака "+" или "-"
		flag_symb=0,//флаг введенного символа
	flag_mant=0;//флаг мантиссы
int i = 0;
 char str[100];
 kol=99;
do{
if (i==0)
{/*проверка на число*/if ((c>47)&&(c<58)){
/*0*/		 if(c==48){
	if(flag_zero==0){
		str[i++]=(char)c;
		_putch(c);flag_zero=1;
		flag_symb=1;
		flag_znak=1;
		flag_mant=0;
		continue;
	}
}/*0*/
/*1-9*/	str[i++]=(char)c;
		_putch(c);
		flag_symb=1;
		flag_znak=1;
		flag_mant=0;
}/*1-9*/
/* - */	if (c==45){
	if((flag_znak==0)&&(flag_symb==0)){
		str[i++]=(char)c;
		_putch(c);
		flag_znak=1;
		flag_mant=0;
	}
}/* - */
/* + */	if (c==43){
	if((flag_znak==0)&&(flag_symb==0)){
		str[i++]=(char)c;
		_putch(c);
		flag_znak=1;
		flag_mant=0;}}/* + */
}else 
{
	if (i<kol){
if ((c>47)&&(c<58)){/*проверка на число*/
/*0*/if(c==48){
	if(flag_zero==0){//0
		str[i++]=(char)c;
		_putch(c);
		flag_znak=1;
		flag_mant=0;
		flag_mant=0;
		flag_symb=1;
		continue;
	}
}//0
	else{//1-9
		str[i++]=(char)c;
		_putch(c);
		flag_znak=1;
		flag_symb=1;
		flag_mant=0;
	}
	}//1-9
/*BackSpase*/if ((c==8)&&(i>0)){
				i--;
				printf("\b");
				printf(" ");
				printf("\b");
				}/*BackSpase*/
/* E */	 if ((c==69)&&(i>0)){
	if((flag_mant==0)&&(flag_symb==1)&&(flag_inpE==0)){
		str[i++]=(char)c;
		_putch(c);
		flag_mant=1;
		flag_znak=0;
		flag_zap=1;
		flag_inpE=1;
		}
	}/* E */
/* e */	 if ((c==101)&&(i>0)){
			if((flag_mant==0)&&(flag_symb==1)&&(flag_inpE==0)){
				str[i++]=(char)c;
				_putch(c);
				flag_mant=1;
				flag_znak=0;
				flag_zap=1;
				flag_inpE=1;
			}
	}/* e */
/* - */	 if ((c==45)&&(i>0)){
			if(flag_znak==0){
				str[i++]=(char)c;
				_putch(c);
				flag_znak=1;
				}
	}/* - */
/* + */	 if ((c==43)&&(i>0)){
			if(flag_znak==0){
				str[i++]=(char)c;
				_putch(c);
				flag_znak=1;}
	}/* + */
/* , */	 if ((c==44)&&(i>0)){
	if(flag_zap==0){
		str[i++]=(char)c;
		_putch(c);
		flag_zap=1;
		flag_znak=1;
		flag_zero=0;
		flag_mant=1;}
	}/* , */
}
}//конец else
} while((c=_getch())!=13);
str[i] = '\0';
char* stopscan;
num=strtod(str,&stopscan);

if (num>(1.7E38)){
	puts("\nСлишком большое число, введите заново");
	num=def_double();}
return num;
}
void input(double **A,int m)
{int i,j;
	for(i=0; i<m; i++){
	for(j=0; j<m; j++){
	printf("\nA[%d][%d]=",i,j);
	A[i][j]=def_double();
	             }
				}
}
Не получается только сделать проверку на выход за пределы дипазона.
в результате работы выделенного if, у меня на любой последующий ввод выводится сообщение "Слишком большое...."
Заранее спасибо.

Последний раз редактировалось Denis147; 15.01.2012 в 16:44.
Denis147 вне форума Ответить с цитированием
Старый 15.01.2012, 14:02   #2
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,964
По умолчанию

У Вас у самого от этого кода в глазах не рябит?
Приводить его в порядок, для того что-бы разобраться никто не будет. И оформляйте код по-правилам.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 15.01.2012, 14:11   #3
Denis147
 
Регистрация: 15.01.2012
Сообщений: 4
По умолчанию

я не прошу разбираться в наборе флагов на каждый if внутри цикла. мне интересен только выделенный кусочек.

Последний раз редактировалось Denis147; 15.01.2012 в 14:19.
Denis147 вне форума Ответить с цитированием
Старый 15.01.2012, 14:16   #4
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,964
По умолчанию

Вне контекста всей программы, ваш "кусочек" ни о чём не говорит.
Единственное, что можно сказать
errno==ERANGE и err==0, поэтому и срабатывает оператор if.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 15.01.2012, 14:58   #5
Denis147
 
Регистрация: 15.01.2012
Сообщений: 4
По умолчанию

заменил не просто if (num>(1.7E38)){
puts("\nСлишком большое число, введите заново");
num=def_double();}
пусть данные будут в диапазоне float....теперь все работает


Привел код в более-менее смотрабельный вид.
Не подскажете ли как сделать проверку на факт ввода данных. Т.е. если не вводить данные, а нажать просто "Enter", чтобы программа возвращалась к началу цикла do-while.
В защите на натуральные числа я просто сделал проверку на то, чтобы введенное число не равнялось 0. Но в действительном типе число может равняться 0, поэтому не могу ничего дельного придумать(

Последний раз редактировалось Denis147; 15.01.2012 в 15:46.
Denis147 вне форума Ответить с цитированием
Старый 15.01.2012, 16:19   #6
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию

Цитата:
Не подскажете ли как сделать проверку на факт ввода данных.
Код не читабельный, поэтому как оно там работает и чего делает, не смотрел. Используй тег для форматирования.

Принимай своё число в виде строки, и проверяй длину. Если ничего не ввели, то нулевая. Если что-то ввели, тогда уже получай из строки значение нужного типа.
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
sVasilich вне форума Ответить с цитированием
Старый 15.01.2012, 16:42   #7
Denis147
 
Регистрация: 15.01.2012
Сообщений: 4
По умолчанию

Цитата:
Сообщение от sVasilich Посмотреть сообщение
Код не читабельный, поэтому как оно там работает и чего делает, не смотрел. Используй тег для форматирования.

Принимай своё число в виде строки, и проверяй длину. Если ничего не ввели, то нулевая. Если что-то ввели, тогда уже получай из строки значение нужного типа.
Работает.Большое спасибо
Denis147 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Защита от некорректного ввода в Edit (Delphi) nika17 Помощь студентам 4 04.05.2011 12:19
onKeyPress. Защита от неправильного ввода. Антон Лысенко Помощь студентам 5 23.02.2011 17:20
защита строки после ввода данных Akmal-Sharipov Microsoft Office Excel 5 09.12.2010 08:40
Защита от неправильного ввода Christina_2010 PHP 2 09.06.2010 13:28
Защита от кривого ввода на С++ survavior Помощь студентам 4 13.04.2010 17:56