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

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

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

3 страниц V  1 2 3 >  
Closed Topic Открыть новую тему 
> проверка типа переменной
сообщение
Сообщение #1


Гость






Вобщем то только начинаю общаться с паскалем и никак не могу найти решение подобной простой задачи... Опишу на примере:

Пользователь вводит что либо, записываем в А (какого типа должо быть А?)
Далее если пользователь ввел цело число - B := A (B - integer)...

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


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

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

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


Ну пользователь может ввести любой тип, например:
Код

var
a:integer;
b:char;
c:string;
begin
readln(a); {ввод целого числа}
readln(b); {ввод символа}
readln(c); {ввод строки}
end.


Цитата
B := A (B - integer)...

A тоже должно быть целым.


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


Гость






Задача какраз в том чтобы проверить что вводит пользователь

напирмер - если ввел integer - все ок, а в противном случае - попросить повторить ввод
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






что то я плохо понял

например пользователь вводит 123a, то это чтож? лонгинт?

не совсем понятно - можешь на примере?

если пользователь вводит целое число на интервале 1-20 - продолжить программу - в противном случае - повторить...

Добавлено: (13.09.04 6:06)
так же не понял как из строики потом число сделать
вобщем плиз пример мой кто нить накодьте...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Бывалый
***

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

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


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

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


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

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

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


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


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


Бывалый
***

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

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


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


Гость






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

2 Апал
а поподробнее плиз? )))
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Гость






А можно ли как нибудь отключить на клавиатуре клавиши?
Например чтоб в процессе работы программы работали только кнопки 1-9 и enter?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Гуру
*****

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

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


Примерно так
Код

k:=readkey;
if (k>chr(1)) and (k<chr(9)) or (k=#13)) then
 че-та делаешь
else
 ниче не делаешь

Порядок and и or не проверЯл
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Гость






а как зделать чтоб процедура работала всю программу?
чтобы походу работы проги нажатие других клавиш не давало результата?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


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

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

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


Цитата(Guest @ 13.09.04 15:02)
А можно ли как нибудь отключить на клавиатуре клавиши?
Например чтоб в процессе работы программы работали только кнопки 1-9 и enter?

Глобальный подход к задаче... :D


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


Гость






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

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


Новичок
*

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

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


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


Новичок
*

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

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


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


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

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

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


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

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


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

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

 





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