проверка типа переменной |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
проверка типа переменной |
BRS |
12.09.2004 18:32
Сообщение
#1
|
Гость |
Вобщем то только начинаю общаться с паскалем и никак не могу найти решение подобной простой задачи... Опишу на примере:
Пользователь вводит что либо, записываем в А (какого типа должо быть А?) Далее если пользователь ввел цело число - B := A (B - integer)... Как это сделать? |
Altair |
12.09.2004 18:39
Сообщение
#2
|
Ищущий истину Группа: Модераторы Сообщений: 4 824 Пол: Мужской Реальное имя: Олег Репутация: 45 |
Ну пользователь может ввести любой тип, например:
Код var a:integer; b:char; c:string; begin readln(a); {ввод целого числа} readln(b); {ввод символа} readln(c); {ввод строки} end. Цитата B := A (B - integer)... A тоже должно быть целым. -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
BRS |
12.09.2004 20:13
Сообщение
#3
|
Гость |
Задача какраз в том чтобы проверить что вводит пользователь
напирмер - если ввел integer - все ок, а в противном случае - попросить повторить ввод |
Ozzя |
13.09.2004 6:40
Сообщение
#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 |
13.09.2004 7:05
Сообщение
#5
|
Гость |
что то я плохо понял
например пользователь вводит 123a, то это чтож? лонгинт? не совсем понятно - можешь на примере? если пользователь вводит целое число на интервале 1-20 - продолжить программу - в противном случае - повторить... Добавлено: (13.09.04 6:06) так же не понял как из строики потом число сделать вобщем плиз пример мой кто нить накодьте... |
Ozzя |
13.09.2004 7:47
Сообщение
#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 - 13.09.2004 9:25 |
Бродяжник |
13.09.2004 10:01
Сообщение
#7
|
Бывалый Группа: Пользователи Сообщений: 206 Пол: Мужской Репутация: 3 |
Если задача стоит так - ввести с клавиатуры целое число от 1 до 20, и не дать ввести ничего другого, то:
Для ввода использовать строковую переменную. Затем после ввода перебрать в цикле все символы введенной строки. Если среди них встретилось что-то, кроме цифр 0-9, значит, повторить ввод. Если ничего левого нет, тогда преобразуем строку в целое число с помощью процедуры Val (параметры наизусть не помню). Полученное целое число проверяем на диапазон 1-20. Если не попадает, значит, повторяем ввод. И так до упора. Сообщение отредактировано: Бродяжник - 13.09.2004 16:32 |
APAL |
13.09.2004 10:20
Сообщение
#8
|
Смотрю... Группа: Модераторы Сообщений: 1 055 Пол: Мужской Реальное имя: Пшеничный Алексей Анатольевич Репутация: 6 |
И зачем такие сложности?
Не проще ли сразу попытаться перевести строку в число и проверять возвращаемый результат по IOResult? -------------------- |
Бродяжник |
13.09.2004 11:24
Сообщение
#9
|
Бывалый Группа: Пользователи Сообщений: 206 Пол: Мужской Репутация: 3 |
APAL
всегда приятно узнать что-нибудь полезное... спасибо... |
Guest |
13.09.2004 13:15
Сообщение
#10
|
Гость |
2 Оззя
+ чтоб это было целое число 2 Апал а поподробнее плиз? ))) |
APAL |
13.09.2004 13:22
Сообщение
#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 |
13.09.2004 14:02
Сообщение
#12
|
Гость |
А можно ли как нибудь отключить на клавиатуре клавиши?
Например чтоб в процессе работы программы работали только кнопки 1-9 и enter? |
Ozzя |
13.09.2004 14:17
Сообщение
#13
|
Гуру Группа: Пользователи Сообщений: 1 220 Пол: Мужской Репутация: 16 |
Примерно так
Код k:=readkey; if (k>chr(1)) and (k<chr(9)) or (k=#13)) then че-та делаешь else ниче не делаешь Порядок and и or не проверЯл |
Guest |
13.09.2004 14:32
Сообщение
#14
|
Гость |
а как зделать чтоб процедура работала всю программу?
чтобы походу работы проги нажатие других клавиш не давало результата? |
APAL |
13.09.2004 14:33
Сообщение
#15
|
Смотрю... Группа: Модераторы Сообщений: 1 055 Пол: Мужской Реальное имя: Пшеничный Алексей Анатольевич Репутация: 6 |
Цитата(Guest @ 13.09.04 15:02) А можно ли как нибудь отключить на клавиатуре клавиши? Например чтоб в процессе работы программы работали только кнопки 1-9 и enter? Глобальный подход к задаче... :D -------------------- |
Guest |
13.09.2004 14:35
Сообщение
#16
|
Гость |
Ага ) все - пошел регистрироваться ) а то не дело это )
господа!!! хелп!!! как???? |
BRS |
13.09.2004 14:37
Сообщение
#17
|
Новичок Группа: Пользователи Сообщений: 45 Пол: Мужской Репутация: 0 |
зарегился :D
|
APAL |
13.09.2004 14:46
Сообщение
#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 |
13.09.2004 15:26
Сообщение
#19
|
Новичок Группа: Пользователи Сообщений: 45 Пол: Мужской Репутация: 0 |
тоесть перед началом работы основных процедур вписываю подобную - и она работает в течении всей программы?
|
Altair |
13.09.2004 16:42
Сообщение
#20
|
Ищущий истину Группа: Модераторы Сообщений: 4 824 Пол: Мужской Реальное имя: Олег Репутация: 45 |
Цитата чтобы походу работы проги нажатие других клавиш не давало результата? Ну это сложный резидент писать надо, так что тебе это не надо! То есть сложный, потому что нажатия CTRL+ALT+DEL только я могу заблокировать ;) (может еще кто может? ) ;) -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
Текстовая версия | 28.04.2024 7:48 |