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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.07.2008, 09:22   #11
engeneer
Пользователь
 
Регистрация: 17.07.2008
Сообщений: 27
По умолчанию

Цитата:
Сообщение от puporev Посмотреть сообщение
Если так, то это же совсем просто. Школьников все время тренируют на проверку правильности ввода. В таком случае определяется что можно вводить, а что нельзя и потом или в цикле repeat . . until, или через goto проверяется правильность ввода, при неправильном выдается сообщение и ввод повторяется, пока не будет введено допустимое значение.
елки-палки... при чем здесь нафиг извините школьники и repeat until?! Если некий дурень попытается вместо вещественной r ввести, например, текстовое значение, мне нужно чтобы прога не закрывалась, а выводила сообщение об ошибке. Этого я добился с помощью ключа {$I-}, {$I+}. А вот если вводится слишком большое значение (не помещающееся в переменную вещественного типа), то ключ {$I-}, {$I+} перестает работать и прога вылетает с сообщением об ошибке переполнения плавающей точки. А мне нужно, чтоб не вылетала. Так понятнее?
engeneer вне форума Ответить с цитированием
Старый 23.07.2008, 09:27   #12
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

repeat
write('r=');
readln(r);
if r>? then
begin
writeln('Слишком большое значение, повторите ввод!');
readln;
end;
until r<?;
puporev вне форума Ответить с цитированием
Старый 23.07.2008, 09:36   #13
engeneer
Пользователь
 
Регистрация: 17.07.2008
Сообщений: 27
По умолчанию

Цитата:
Сообщение от puporev Посмотреть сообщение
repeat
write('r=');
readln(r);
if r>? then
begin
writeln('Слишком большое значение, повторите ввод!');
readln;
end;
until r<?;
Отлично!

Код:
var
 r:real;
begin
 readln(r);
 if r>1E39 then
 writeln('слишком большое значение');
end.
При вводе того же 1Е40 прога не доходит до строчки if r>1E39 then и выплевывается сообщение Error 205: Floating Point Overflow. То есть если запускать скомпилированный exeшник, то дурень, вводивший 1Е40 даже не поймет, - почему прога захлопнулось, а я хочу добиться, чтобы этот дурень получил сообщение об ошибке ввода, например "слишком большое значение"...
engeneer вне форума Ответить с цитированием
Старый 23.07.2008, 10:03   #14
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Что общего между Real и 1Е39? Используйте тип Extended.
Вот так все работает.
Код:
uses crt;
var
 r:extended;
begin
clrscr;
 repeat
 write('r=');
 readln(r);   
 if r>1E39 then  
 writeln('слишком большое значение, повторите ввод!');
 until r<=1E39;
writeln('r=',r);
readln
end.
puporev вне форума Ответить с цитированием
Старый 23.07.2008, 11:09   #15
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Что общего между Real и 1Е39? Используйте тип Extended.
Побойся Борланда - откуда Extended в паскале?
Цитата:
engeneer
Я тебе расскажу как такие чтуки проверяются: Получается строка, да да самая обычная строка, введенная в консоли, и анализируется - может ли она быть преобразована в число допустимого формата, если нет то это ошибка, и поверь мне это наилучшая "защита от дурука"
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.07.2008, 11:27   #16
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Не знаю что у Вас за Паскаль, у меня все нормально, посмотрите вложение.
Кстати, тот код, который я выложил, я сначала проверил в деле.
Вложения
Тип файла: doc Pascal.doc (96.0 Кб, 13 просмотров)
puporev вне форума Ответить с цитированием
Старый 23.07.2008, 12:09   #17
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Кстати, тот код, который я выложил, я сначала проверил в деле.
Я не против. Наверное у меня старый дистриб паскаля, но Экстендеды он не хавает.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.07.2008, 16:44   #18
engeneer
Пользователь
 
Регистрация: 17.07.2008
Сообщений: 27
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Побойся Борланда - откуда Extended в паскале?

Я тебе расскажу как такие чтуки проверяются: Получается строка, да да самая обычная строка, введенная в консоли, и анализируется - может ли она быть преобразована в число допустимого формата, если нет то это ошибка, и поверь мне это наилучшая "защита от дурука"
строки использовать не могу, об этом писал выше... про процедцры val и str я знаю...
engeneer вне форума Ответить с цитированием
Старый 23.07.2008, 16:47   #19
engeneer
Пользователь
 
Регистрация: 17.07.2008
Сообщений: 27
По умолчанию

Цитата:
Сообщение от puporev Посмотреть сообщение
Что общего между Real и 1Е39? Используйте тип Extended.
Вот так все работает.
Код:
uses crt;
var
 r:extended;
begin
clrscr;
 repeat
 write('r=');
 readln(r);   
 if r>1E39 then  
 writeln('слишком большое значение, повторите ввод!');
 until r<=1E39;
writeln('r=',r);
readln
end.
в том-то и дело, что общего между 10Е40 и типом real ничего нет, но "дурак" ведь этого не знает...
кроме того, представим, что используется тип extended... а если дурак в переменную extended введет 10Е5000? опять вылет хз по каким причинам!
engeneer вне форума Ответить с цитированием
Старый 23.07.2008, 17:26   #20
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от engeneer
а если дурак в переменную extended введет 10Е5000?
engeneer, Вы зря не хотите послушать то, что Вам говорят умные и, главное, опытные люди!
Поймите, защитить от ввода неверного значения на этапе readln(r); (если r : real / double / extended/ integer ...) НЕЛЬЗЯ!!!
Потому как дурак туда легко может написать вместо числа просто "Ку-ку" - и вы опять получите ошибку. Причём ошибку выдаст именно Паскаль! Единственный, гарантированный, удобный, мощный способ проверки - это вводить строку и потом её анализировать/конвертировать/проверять и т.д. и т.п.
Более того, можно будет сказать:- Уважаемый пользователь, введённая Вами строка: Ку-Ку не является допустимым числовым значением! Введите число от ... до ....)
Всё сказанное прошу расценивать как моё личное мнение (IMHO). Удачи!
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Кодировка при вводе данных через php-myadmin и sql запросы serg-php PHP 4 27.09.2009 17:03
Написать програму проверки знания даты второй мировой войны. TurboPaskal Паскаль, Turbo Pascal, PascalABC.NET 22 24.04.2008 19:10
Система проверки на человека Andrey1433 PHP 2 11.03.2008 14:13
преобразование массивов при вводе данных greenkat Microsoft Office Excel 4 28.02.2008 19:21
Проблемка при вводе чисел at10 Microsoft Office Excel 4 02.12.2007 22:22