IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Как научить отличать цифру от буквы, Нужно чтобы прога ругалась
сообщение
Сообщение #1


Гость






Привет!

У меня вот проблема такая. Мне нужно научить программку отличать цифру от буквы. К примеру при попытке присвоить числовой переменной символьное значение программа вылетает потому как переменная не того типа.
Вот мне и нужно как нибудь реализовать эту возможность. Чтоб если пользователь там где надо ввести цифру, случайно или намеренно ввел букву программа не вываливалась а вежливо просила не шалить.

Помогите а очень надо
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Один из вариантов - вот так:
var
a:integer;
begin
repeat
{$I-}ReadLn(a);{$I+}
until IOResult=0
end.


Либо можешь написать свою функцию вместо ReadLn (или Read) со всеми необходимыми возможностями. Например, на основе ReadKey и KeyPressed.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






Да нет так не пашет
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(Борец с Паскалем @ 16.11.2007 4:51) *

Да нет так не пашет

И что она, по-твоему, не пашет?
Слушай, если ты о чем-то говоришь, говори КОНКРЕТНО.
И если она (моя программа) что-то не делает, что он должна (по-твоему) делать - напиши, ЧТО ИМЕННО.

Крылова читал - про мартышку и очки? Перечитай..
Пора уже банить за голословные обвинения.. Стараешься, отвечаешь, пишешь - а в ответ два слова: "не пашет"! Из которых следует только то, что ты даже не понял, как с этим обращаться..


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


Цитата
И что она, по-твоему, не пашет?
Слушай, если ты о чем-то говоришь, говори КОНКРЕТНО.
И если она (моя программа) что-то не делает, что он должна (по-твоему) делать - напиши, ЧТО ИМЕННО.

Крылова читал - про мартышку и очки? Перечитай..
Пора уже банить за голословные обвинения.. Стараешься, отвечаешь, пишешь - а в ответ два слова: "не пашет"! Из которых следует только то, что ты даже не понял, как с этим обращаться..

эх... Как я тебя понимаю,хоть еще и новичок
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(Client @ 16.11.2007 6:45) *

эх... Как я тебя понимаю,хоть еще и новичок
Спасибо smile.gif

Есть еще один способ - может быть, самый оптимальный в твоем случае.
Производи ввод в строковую переменную, а потом воспользуйся процедурой Val для преобразования в число. В Val есть диагностика ошибок, но там, если мне не изменяет память, есть свои проблемы..


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гость






Как что значит не пашет!

Все очень просто берем код вставляем его в чистый проект запускаем. Видим черный экран - потому как сразу нужно ввести значение для переменной (тут претензий нет).Вводим вместо циферки буковку и вылетаем - ибо как гласит компилятор не гоже буквы пихать в числовые переменные и иже с ним.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






Гость
Вот и приведи тот код, который у тебя получился (ПОЛНОСТЬЮ!, кто там тебя знает, что именно ты называешь пустым проектом), то, что ты вводишь (тоже полностью), и дай примеры БЕЗошибочного ввода.

Цитата(Lapp)
В Val есть диагностика ошибок, но там, если мне не изменяет память, есть свои проблемы..
Есть... Там проблемы с переполнением. Не отслеживается:
var
i, code: integer;
s: string;
begin
s := '40000';
val(s, i, code);
writeln('i = ', i, ' code = ', code); { <-- Чему равен код ошибки? А само число? }
end.


 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


а можно сделать (но не очень советую) как я недавно, даже не зная про val и {$I-}
я делал через readkey и проверял на цифры, буквы,backspace и точку. Если интересно, то могу поискать

Сообщение отредактировано: Client -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Гость






Lapp вариант с IOresult просто шикарен!

Код

var
  a:integer;
begin
  repeat
    {$I-}ReadLn(a);{$I+}
  until IOResult=0
end.


А как сдесь привинтить человеческий голос. Чтоб если ошибка то выходило сообщение что нужно ввести правильно
Я вчера весь день бился но так и не смог IF привинтить. Подсобите люди добрые
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


if IOresult<>0 then Writeln(' Введите Число');
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(Гость @ 17.11.2007 5:58) *

вариант с IOresult просто шикарен!
Рад, что ты все-таки разобрался.

Вот вариант с выводом всяких слов:
var
a,ior:integer;
begin
Write('Веедите целое число: ');
repeat
{$I-}ReadLn(a);{$I+}
ior:=IOResult;
if ior<>0 then Write('Ошибка в записи числа. Попробуйте еще раз: ')
until ior=0;
WriteLn('Спасибо!')
end.

Обрати внимание на переприсвоение номера ошибки. Два раза вызывать IOResult на одну операцию нельзя, значение сбрасывается при вызове (это функция, а не переменная).


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


А ведь можно и так, и не нужна проверка никакая...
Код
var
  a:integer;
begin
  repeat
    writeln(' Введите число без ошибок');
    {$I-}ReadLn(a);{$I+}
  until IOResult=0
end.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Клавиатурный тиран
**

Группа: Пользователи
Сообщений: 79
Пол: Мужской
Реальное имя: Дмитрий

Репутация: -  -2  +


Client
Обычно программы делаются на "дурака", т.е. учитываются все случаи. Данный вид недопустим, т.к. существуют случаи, когда программа будет вылетать. Пусть прользуется твоей программой иностранец, что тогда?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


а можешь показать как бы ты сам сделал (даже для японцев)?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 24.11.2020 0:32
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name