проверка типа переменной |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
проверка типа переменной |
BRS |
Сообщение
#1
|
Гость |
Вобщем то только начинаю общаться с паскалем и никак не могу найти решение подобной простой задачи... Опишу на примере:
Пользователь вводит что либо, записываем в А (какого типа должо быть А?) Далее если пользователь ввел цело число - B := A (B - integer)... Как это сделать? |
Altair |
Сообщение
#2
|
Ищущий истину Группа: Пользователи Сообщений: 4 825 Пол: Мужской Реальное имя: Олег Репутация: 45 |
Ну пользователь может ввести любой тип, например:
Код var a:integer; b:char; c:string; begin readln(a); {ввод целого числа} readln(b); {ввод символа} readln(c); {ввод строки} end. Цитата B := A (B - integer)... A тоже должно быть целым. -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
BRS |
Сообщение
#3
|
Гость |
Задача какраз в том чтобы проверить что вводит пользователь
напирмер - если ввел integer - все ок, а в противном случае - попросить повторить ввод |
Ozzя |
Сообщение
#4
|
Гуру Группа: Пользователи Сообщений: 1 220 Пол: Мужской Репутация: 16 |
Вводишь как строку, анализируешь её на предмет недопустиых символов,
далее идет проверка: 1 символ - byte или char; 2 символа - integer или word; 4 символа - longint Отделить integer от word'а можно так попробовать -32768<integer<32767 0<word<65535 длиннее + есть точка - real real 6 байт single 4 байт double 8 байт extended 10 байт comp 8 байт Single от longint отличается точкой и т.д. ну и затем преобразуешь val'ом в число Первый старт дан, если будут вопросы, задавай |
BRS |
Сообщение
#5
|
Гость |
что то я плохо понял
например пользователь вводит 123a, то это чтож? лонгинт? не совсем понятно - можешь на примере? если пользователь вводит целое число на интервале 1-20 - продолжить программу - в противном случае - повторить... Добавлено: (13.09.04 6:06) так же не понял как из строики потом число сделать вобщем плиз пример мой кто нить накодьте... |
Ozzя |
Сообщение
#6
|
Гуру Группа: Пользователи Сообщений: 1 220 Пол: Мужской Репутация: 16 |
Цитата(BRS @ 13.09.04 7:05) что то я плохо понял например пользователь вводит 123a, то это чтож? лонгинт? несовсем понятно - можешь на примере? если пользователь вводит целое число на интервале 1-20 - продолжить программу - в противном случае - повторить... Нет это ошибка Тебе же проще надо! НЕ проверятьк ккакому типу относится введенное число, а вот ТАК: Код var a:integer; Я правильно понял?begin repeat read(a); until (a<20) and (a>0); end. Сообщение отредактировано: APAL - |
Бродяжник |
Сообщение
#7
|
Бывалый Группа: Пользователи Сообщений: 206 Пол: Мужской Репутация: 3 |
Если задача стоит так - ввести с клавиатуры целое число от 1 до 20, и не дать ввести ничего другого, то:
Для ввода использовать строковую переменную. Затем после ввода перебрать в цикле все символы введенной строки. Если среди них встретилось что-то, кроме цифр 0-9, значит, повторить ввод. Если ничего левого нет, тогда преобразуем строку в целое число с помощью процедуры Val (параметры наизусть не помню). Полученное целое число проверяем на диапазон 1-20. Если не попадает, значит, повторяем ввод. И так до упора. Сообщение отредактировано: Бродяжник - |
APAL |
Сообщение
#8
|
Смотрю... Группа: Пользователи Сообщений: 1 055 Пол: Мужской Реальное имя: Пшеничный Алексей Анатольевич Репутация: 6 |
И зачем такие сложности?
Не проще ли сразу попытаться перевести строку в число и проверять возвращаемый результат по IOResult? -------------------- |
Бродяжник |
Сообщение
#9
|
Бывалый Группа: Пользователи Сообщений: 206 Пол: Мужской Репутация: 3 |
APAL
всегда приятно узнать что-нибудь полезное... спасибо... |
Guest |
Сообщение
#10
|
Гость |
2 Оззя
+ чтоб это было целое число 2 Апал а поподробнее плиз? ))) |
APAL |
Сообщение
#11
|
Смотрю... Группа: Пользователи Сообщений: 1 055 Пол: Мужской Реальное имя: Пшеничный Алексей Анатольевич Репутация: 6 |
Оказалось, что все даже проще чем я думал
IOResult не надо использовать. В процедуре VAL встроена своя поверка на ошибку преобразования: Код Var St : String; ii : Integer; Code : Integer; Begin Write('input: '); Readln(st); Val(st, ii, Code); If Code<>0 Then WriteLn('Error : ', Code) Else WriteLn('Chislo = ', ii); End. А дальше только оформить повтор ввода если ошибка и проверку на диапазон. If (ii>1) and (ii<20) then .... -------------------- |
Guest |
Сообщение
#12
|
Гость |
А можно ли как нибудь отключить на клавиатуре клавиши?
Например чтоб в процессе работы программы работали только кнопки 1-9 и enter? |
Ozzя |
Сообщение
#13
|
Гуру Группа: Пользователи Сообщений: 1 220 Пол: Мужской Репутация: 16 |
Примерно так
Код k:=readkey; if (k>chr(1)) and (k<chr(9)) or (k=#13)) then че-та делаешь else ниче не делаешь Порядок and и or не проверЯл |
Guest |
Сообщение
#14
|
Гость |
а как зделать чтоб процедура работала всю программу?
чтобы походу работы проги нажатие других клавиш не давало результата? |
APAL |
Сообщение
#15
|
Смотрю... Группа: Пользователи Сообщений: 1 055 Пол: Мужской Реальное имя: Пшеничный Алексей Анатольевич Репутация: 6 |
Цитата(Guest @ 13.09.04 15:02) А можно ли как нибудь отключить на клавиатуре клавиши? Например чтоб в процессе работы программы работали только кнопки 1-9 и enter? Глобальный подход к задаче... :D -------------------- |
Guest |
Сообщение
#16
|
Гость |
Ага ) все - пошел регистрироваться ) а то не дело это )
господа!!! хелп!!! как???? |
BRS |
Сообщение
#17
|
Новичок Группа: Пользователи Сообщений: 45 Пол: Мужской Репутация: 0 |
зарегился :D
|
APAL |
Сообщение
#18
|
Смотрю... Группа: Пользователи Сообщений: 1 055 Пол: Мужской Реальное имя: Пшеничный Алексей Анатольевич Репутация: 6 |
Цитата(Guest @ 13.09.04 15:32) а как зделать чтоб процедура работала всю программу? чтобы походу работы проги нажатие других клавиш не давало результата? Единственный способ вижу - сделать резидента (на подобии клавиатурного шпиона), который будет фильтровать нажатия путем удаления из буффера клавиатуры тех кодов, которые не нужны. Но проще сделать в самой программе обработку. Например функцию, Код Function GetKey : Char; Var Ch : Char; Begin Repeat Ch:=ReadKey; Until ((Ch>'0') and (Ch<'9')) or (Ch=#13); GetKey:=Ch; End; -------------------- |
BRS |
Сообщение
#19
|
Новичок Группа: Пользователи Сообщений: 45 Пол: Мужской Репутация: 0 |
тоесть перед началом работы основных процедур вписываю подобную - и она работает в течении всей программы?
|
Altair |
Сообщение
#20
|
Ищущий истину Группа: Пользователи Сообщений: 4 825 Пол: Мужской Реальное имя: Олег Репутация: 45 |
Цитата чтобы походу работы проги нажатие других клавиш не давало результата? Ну это сложный резидент писать надо, так что тебе это не надо! То есть сложный, потому что нажатия CTRL+ALT+DEL только я могу заблокировать ;) (может еще кто может? ) ;) -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
Текстовая версия | 1.06.2024 11:22 |