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

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

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

3 страниц V  1 2 3 >  
Closed Topic Открыть новую тему 
> проверка типа переменной
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 тоже должно быть целым.


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
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'ом в число
Первый старт дан, если будут вопросы, задавай
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
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
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Бродяжник
сообщение 13.09.2004 10:01
Сообщение #7


Бывалый
***

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

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


Если задача стоит так - ввести с клавиатуры целое число от 1 до 20, и не дать ввести ничего другого, то:
Для ввода использовать строковую переменную.
Затем после ввода перебрать в цикле все символы введенной строки. Если среди них встретилось что-то, кроме цифр 0-9, значит, повторить ввод. Если ничего левого нет, тогда преобразуем строку в целое число с помощью процедуры Val (параметры наизусть не помню). Полученное целое число проверяем на диапазон 1-20. Если не попадает, значит, повторяем ввод. И так до упора.

Сообщение отредактировано: Бродяжник - 13.09.2004 16:32
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
APAL
сообщение 13.09.2004 10:20
Сообщение #8


Смотрю...
*****

Группа: Модераторы
Сообщений: 1 055
Пол: Мужской
Реальное имя: Пшеничный Алексей Анатольевич

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


И зачем такие сложности?
Не проще ли сразу попытаться перевести строку в число и проверять возвращаемый результат по IOResult?


--------------------
Если что-то не делает того, что вы запланировали ему делать - это еще не означает, что оно бесполезно.
--------------------
Прежде, чем задать вопрос - Правила :: FAQ :: Поиск
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Бродяжник
сообщение 13.09.2004 11:24
Сообщение #9


Бывалый
***

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

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


APAL
всегда приятно узнать что-нибудь полезное... rolleyes.gif спасибо...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Guest
сообщение 13.09.2004 13:15
Сообщение #10


Гость






2 Оззя
+ чтоб это было целое число

2 Апал
а поподробнее плиз? )))
 К началу страницы 
+ Ответить 
APAL
сообщение 13.09.2004 13:22
Сообщение #11


Смотрю...
*****

Группа: Модераторы
Сообщений: 1 055
Пол: Мужской
Реальное имя: Пшеничный Алексей Анатольевич

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


Оказалось, что все даже проще чем я думал smile.gif
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 ....


--------------------
Если что-то не делает того, что вы запланировали ему делать - это еще не означает, что оно бесполезно.
--------------------
Прежде, чем задать вопрос - Правила :: FAQ :: Поиск
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
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 не проверЯл
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
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


--------------------
Если что-то не делает того, что вы запланировали ему делать - это еще не означает, что оно бесполезно.
--------------------
Прежде, чем задать вопрос - Правила :: FAQ :: Поиск
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Guest
сообщение 13.09.2004 14:35
Сообщение #16


Гость






Ага ) все - пошел регистрироваться ) а то не дело это )

господа!!! хелп!!! как????
 К началу страницы 
+ Ответить 
BRS
сообщение 13.09.2004 14:37
Сообщение #17


Новичок
*

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

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


зарегился rolleyes.gif smile.gif :D
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
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;


--------------------
Если что-то не делает того, что вы запланировали ему делать - это еще не означает, что оно бесполезно.
--------------------
Прежде, чем задать вопрос - Правила :: FAQ :: Поиск
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
BRS
сообщение 13.09.2004 15:26
Сообщение #19


Новичок
*

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

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


тоесть перед началом работы основных процедур вписываю подобную - и она работает в течении всей программы?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Altair
сообщение 13.09.2004 16:42
Сообщение #20


Ищущий истину
******

Группа: Модераторы
Сообщений: 4 824
Пол: Мужской
Реальное имя: Олег

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


Цитата
чтобы походу работы проги нажатие других клавиш не давало результата?

Ну это сложный резидент писать надо, так что тебе это не надо!
То есть сложный, потому что нажатия CTRL+ALT+DEL только я могу заблокировать lol.gif lol.gif lol.gif ;)
(может еще кто может? ) ;)


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 



- Текстовая версия 28.04.2024 7:48
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"