Помощь - Поиск - Пользователи - Календарь
Полная версия: проверка типа переменной
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Страницы: 1, 2
BRS
Вобщем то только начинаю общаться с паскалем и никак не могу найти решение подобной простой задачи... Опишу на примере:

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

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

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


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

A тоже должно быть целым.
BRS
Задача какраз в том чтобы проверить что вводит пользователь

напирмер - если ввел integer - все ок, а в противном случае - попросить повторить ввод
Ozzя
Вводишь как строку, анализируешь её на предмет недопустиых символов,
далее идет проверка:
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
что то я плохо понял

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

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

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

Добавлено: (13.09.04 6:06)
так же не понял как из строики потом число сделать
вобщем плиз пример мой кто нить накодьте...
Ozzя
Цитата(BRS @ 13.09.04 7:05)
что то я плохо понял

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

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

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

Нет это ошибка

Тебе же проще надо! НЕ проверятьк ккакому типу относится введенное число, а вот ТАК:

Код
var a:integer;
begin

 repeat
   read(a);
 until (a<20) and (a>0);
end.
Я правильно понял?
Бродяжник
Если задача стоит так - ввести с клавиатуры целое число от 1 до 20, и не дать ввести ничего другого, то:
Для ввода использовать строковую переменную.
Затем после ввода перебрать в цикле все символы введенной строки. Если среди них встретилось что-то, кроме цифр 0-9, значит, повторить ввод. Если ничего левого нет, тогда преобразуем строку в целое число с помощью процедуры Val (параметры наизусть не помню). Полученное целое число проверяем на диапазон 1-20. Если не попадает, значит, повторяем ввод. И так до упора.
APAL
И зачем такие сложности?
Не проще ли сразу попытаться перевести строку в число и проверять возвращаемый результат по IOResult?
Бродяжник
APAL
всегда приятно узнать что-нибудь полезное... rolleyes.gif спасибо...
Guest
2 Оззя
+ чтоб это было целое число

2 Апал
а поподробнее плиз? )))
APAL
Оказалось, что все даже проще чем я думал 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 ....
Guest
А можно ли как нибудь отключить на клавиатуре клавиши?
Например чтоб в процессе работы программы работали только кнопки 1-9 и enter?
Ozzя
Примерно так
Код

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

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

Глобальный подход к задаче... :D
Guest
Ага ) все - пошел регистрироваться ) а то не дело это )

господа!!! хелп!!! как????
BRS
зарегился rolleyes.gif smile.gif :D
APAL
Цитата(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
тоесть перед началом работы основных процедур вписываю подобную - и она работает в течении всей программы?
Altair
Цитата
чтобы походу работы проги нажатие других клавиш не давало результата?

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


Это ко мне вопрос что-ли?
Хех, ты вункцию ГетКей не всунешь в начало, чтобы она все время работала smile.gif , ето не ризидент :D
Олег_Зет
BRS
Код
Function GetKey : Char;
 Var Ch : Char;
 Begin
   Repeat
     Ch:=ReadKey;
   Until ((Ch>'0') and (Ch<'9')) or (Ch=#13);
   GetKey:=Ch;
 End;


А как бы это слегка усовершенствовать?
Тут пока один недостаток... Ввожу я abc - не вводиться, но если попробовать 1abc - все вводиться...
Altair
Послушай, BRS, эта функция никакого не дает преимущества перед использованием строки:
Код

var
s:string;
begin
readln(s);
....

и дальнейшей ее обработки. Эта функция не резидент, и резидента из нее не сделаешь!
Ты условие смотри четко! Не может быть, что бы тебе дали такое условие (блокировать нажатия клавиш) это настолько сложно, что по памяти я (модератор = ведущий разговора, то есть знающий предметную обоасть разговора) даже не могу написать, обязательно посмотрю в справочник по асму!
BRS
я просто думал что подобное ограничение ввода - тоже может быть выходом.
ОК - усе понял - пока в такой вариант событий не полезу )))

Вот то, что "пока" сказал, за это уважаю!
Быть тебе знатоком Паса!
:p4:
:p1:

ПАСЫБА ))) :p1: :p2: :p5:
BRS
Раскажите мне кто нибудь подробнее про работу со строкой, плз...
Altair
А ФАК я для кого писал????
(ООО, прошу прощения, FAQ, то есть ЧаВо) lol.gif
http://pascal.dax.ru/forum/index.php?showtopic=2361
BRS
Понял ) исправлюсъ, куда послали туда и отпавлюсь :D
APAL
Тот пример функции, который я привел для примера - действительно не ризидент :D
Это пример того, что можно заменить READKEY на свою функцию для фильтрации.
Еще раз говорю - пример! Далее размышляй, домысливай - используй...
rolleyes.gif

А я смотрю сначала, странный резидент... как задание центра выполнять будет не соображу... lol.gif
BRS
Блин я запутался

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


может кто нить мне пример проги в которой так строка обрабатываеться кинуть?
APAL
Код
Function CheckNum(St : String) : Boolean;
Var i : Byte;
Begin
CheckNum:=True;
For i:=1 to Length(St) do
 If (St[i]<'0') or (St[i]>'9') then
 Begin
    CheckNum:=False;
    Exit;
 End;
End;
BRS
Всем агромное спасибо ) теперь знаю немного больше ) Ура! )
APAL
спасиба - не булькает :D
BRS
О! У мня еще вопрос по функции Val появился
Val(Chr, i, code) - что есть такое code??????
GoodWind
А не проще ли
Код
var str:string;
     value,code:integer;
begin
repeat
readln(str);
val (str,value,code);
until code=0;
end.

Поясню - val "возвращает" в code типа errorlevel`а и если он не 0 то в строке есть НЕ цифры.

зы: программа скорее всего работать не будет :D , но идея, я думаю, ясна
BRS
даже насколько я понял несколько больше - еще если число привосходит допустимые рамки
Altair
Цитата
если число привосходит допустимые рамки

Именно! :p5:

А хороший у тебя аватар, далеко пойдешь smile.gif
Вот тебе еще

(я этот шедевр стащил с школьного компа в прошлом году, а точнее с компа директора школы, гыыыы.... ух, что там еще было .... lol.gif (ну доки всякие сов. секкр.) )
Werwolf86
Цитата(Guest @ 13.09.04 14:32)
а как зделать чтоб процедура работала всю программу?
чтобы походу работы проги нажатие других клавиш не давало результата?

А смысл? Не проще сделать контроль ввода кейсом? и Все...действие только при нажатиии нужной клавиши))
Werwolf86
например контроль ввода real:

Код
procedure Inputreal(n_pos:byte;lo,hi:real; var res:real);
var S:string;
     ErrCode:Integer;
     Ch:char;
     flag:boolean;
begin
  repeat
     flag:=false;
     s:='';
     repeat
         ch:=readkey;
         Case ch of
             Bs: if length(S)>0 then Delete(S,length(S),1);
             Enter: if length(S)>0 then flag:=true;
             '0'..'9','.':if length(S)<n_pos then S:=S+ch;
         end;
         gotoxy(1,1);
         clreol;
         write(S);
      until flag;
      val (s,res,errcode);
   until (errcode=0) and (res<=hi) and (res>=lo)
end;

Не забываем заключать код в соответствующие теги!
GoodWind
Код
function getinteger(min,max:integer):integer;
var value,code:integer;
    str:string;
begin
 repeat
  readln(str);
  val(str,value,code);
 until (code=0) and ((value>=min) and (value <=max));
 getinteger:=value;
end;


вот так и рамки мона задать
BlackShadow
Цитата
То есть сложный, потому что нажатия CTRL+ALT+DEL только я могу заблокировать 
(может еще кто может? )

Нашёл чем удивить smile.gif
Altair
ну давай, покажи.
GoodWind
Цитата
ну давай, покажи.

Присоединяюсь - оч хочется научиться !
---
Знание - сила smile.gif
BRS
гы ) рульная кошка )
BlackShadow
BRS, не в тему, но кошка действительно рулез :D :D :D

Под DOS или под Windows (тогда 9x или NT)?
Altair
Цитата
кошка действительно рулез

Гыыыыы....
:D
ПОД DOS!
GoodWind
Под DOS
BlackShadow
Не, ну народ, это не серьёзно. Под DOS, как два байта переслать. А точнее 4. А переслать их надо на адрес 00064h, если калькулятор не подвёл. Т. е. меняешь INT19h на свой обработчик, который не вызывает перекрытый и дело с концом...
Altair
ты код дай... тогда поговорим ... Учти ТОЛЬКО блокировка CTRL+ALT+DEL!!!
BlackShadow
Олег, ты и мёртвого достанешь. Код примерно такой (как всегда без компилятора):

Код

Program Zavison;

Uses DOS;

Procedure NewInt19h;Interrupt;
Begin
End;

Begin
 SetIntVec($19,@NewInt19h);
 While True Do
End.


Теперь твоя душенька довольна?

Если хочешь, вот тебе более эффектный вариант:
Код

Program RealZavison;
Begin
 Asm
   CLI
   HLT
 End
End.
Altair
Отлично, Черная тень!
Но я знаю как лучше сделать! lol.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.