Вобщем то только начинаю общаться с паскалем и никак не могу найти решение подобной простой задачи... Опишу на примере:
Пользователь вводит что либо, записываем в А (какого типа должо быть А?)
Далее если пользователь ввел цело число - B := A (B - integer)...
Как это сделать?
Ну пользователь может ввести любой тип, например:
Код
var
a:integer;
b:char;
c:string;
begin
readln(a); {ввод целого числа}
readln(b); {ввод символа}
readln(c); {ввод строки}
end.
Цитата
B := A (B - integer)...
A тоже должно быть целым.
Задача какраз в том чтобы проверить что вводит пользователь
напирмер - если ввел integer - все ок, а в противном случае - попросить повторить ввод
Вводишь как строку, анализируешь её на предмет недопустиых символов,
далее идет проверка:
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'ом в число
Первый старт дан, если будут вопросы, задавай
что то я плохо понял
например пользователь вводит 123a, то это чтож? лонгинт?
не совсем понятно - можешь на примере?
если пользователь вводит целое число на интервале 1-20 - продолжить программу - в противном случае - повторить...
Добавлено: (13.09.04 6:06)
так же не понял как из строики потом число сделать
вобщем плиз пример мой кто нить накодьте...
Цитата(BRS @ 13.09.04 7:05)
что то я плохо понял
например пользователь вводит 123a, то это чтож? лонгинт?
несовсем понятно - можешь на примере?
если пользователь вводит целое число на интервале 1-20 - продолжить программу - в противном случае - повторить...
Нет это ошибка
Тебе же проще надо! НЕ проверятьк ккакому типу относится введенное число, а вот ТАК:
Код
var a:integer;
begin
repeat
read(a);
until (a<20) and (a>0);
end.
Я правильно понял?
Бродяжник
13.09.2004 10:01
Если задача стоит так - ввести с клавиатуры целое число от 1 до 20, и не дать ввести ничего другого, то:
Для ввода использовать строковую переменную.
Затем после ввода перебрать в цикле все символы введенной строки. Если среди них встретилось что-то, кроме цифр 0-9, значит, повторить ввод. Если ничего левого нет, тогда преобразуем строку в целое число с помощью процедуры Val (параметры наизусть не помню). Полученное целое число проверяем на диапазон 1-20. Если не попадает, значит, повторяем ввод. И так до упора.
И зачем такие сложности?
Не проще ли сразу попытаться перевести строку в число и проверять возвращаемый результат по IOResult?
Бродяжник
13.09.2004 11:24
APALвсегда приятно узнать что-нибудь полезное...
спасибо...
2 Оззя
+ чтоб это было целое число
2 Апал
а поподробнее плиз? )))
Оказалось, что все даже проще чем я думал
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 ....
А можно ли как нибудь отключить на клавиатуре клавиши?
Например чтоб в процессе работы программы работали только кнопки 1-9 и enter?
Примерно так
Код
k:=readkey;
if (k>chr(1)) and (k<chr(9)) or (k=#13)) then
че-та делаешь
else
ниче не делаешь
Порядок and и or не проверЯл
а как зделать чтоб процедура работала всю программу?
чтобы походу работы проги нажатие других клавиш не давало результата?
Цитата(Guest @ 13.09.04 15:02)
А можно ли как нибудь отключить на клавиатуре клавиши?
Например чтоб в процессе работы программы работали только кнопки 1-9 и enter?
Глобальный подход к задаче... :D
Ага ) все - пошел регистрироваться ) а то не дело это )
господа!!! хелп!!! как????
зарегился
:D
Цитата(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;
тоесть перед началом работы основных процедур вписываю подобную - и она работает в течении всей программы?
Цитата
чтобы походу работы проги нажатие других клавиш не давало результата?
Ну это сложный резидент писать надо, так что тебе это не надо!
То есть сложный, потому что нажатия CTRL+ALT+DEL только я могу заблокировать
;)
(может еще кто может? ) ;)
а можно всетаки про функцию подробнее?
че то не получаеться
вопервых ругаеться на ГетКей, а во вторых - как ее правильно в прогу сунуть?
Это ко мне вопрос что-ли?
Хех, ты вункцию ГетКей не всунешь в начало, чтобы она все время работала , ето не ризидент :D
Олег_Зет
Код
Function GetKey : Char;
Var Ch : Char;
Begin
Repeat
Ch:=ReadKey;
Until ((Ch>'0') and (Ch<'9')) or (Ch=#13);
GetKey:=Ch;
End;
А как бы это слегка усовершенствовать?
Тут пока один недостаток... Ввожу я abc - не вводиться, но если попробовать 1abc - все вводиться...
Послушай, BRS, эта функция никакого не дает преимущества перед использованием строки:
Код
var
s:string;
begin
readln(s);
....
и дальнейшей ее обработки. Эта функция не резидент, и резидента из нее не сделаешь!
Ты условие смотри четко! Не может быть, что бы тебе дали такое условие (блокировать нажатия клавиш) это настолько сложно, что по памяти я (модератор = ведущий разговора, то есть знающий предметную обоасть разговора) даже не могу написать, обязательно посмотрю в справочник по асму!
я просто думал что подобное ограничение ввода - тоже может быть выходом.
ОК - усе понял - пока в такой вариант событий не полезу )))
Вот то, что "пока" сказал, за это уважаю!
Быть тебе знатоком Паса!:p4:
:p1:
ПАСЫБА ))) :p1: :p2: :p5:
Раскажите мне кто нибудь подробнее про работу со строкой, плз...
А ФАК я для кого писал????
(ООО, прошу прощения, FAQ, то есть ЧаВо)
http://pascal.dax.ru/forum/index.php?showtopic=2361
Понял ) исправлюсъ, куда послали туда и отпавлюсь :D
Тот пример функции, который я привел для примера - действительно не ризидент :D
Это пример того, что можно заменить READKEY на свою функцию для фильтрации.
Еще раз говорю - пример! Далее размышляй, домысливай - используй...
А я смотрю сначала, странный резидент... как задание центра выполнять будет не соображу...
Блин я запутался
Цитата
Для ввода использовать строковую переменную.
Затем после ввода перебрать в цикле все символы введенной строки. Если среди них встретилось что-то, кроме цифр 0-9, значит, повторить ввод. Если ничего левого нет, тогда преобразуем строку в целое число с помощью процедуры Val (параметры наизусть не помню).
может кто нить мне пример проги в которой так строка обрабатываеться кинуть?
Код
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;
Всем агромное спасибо ) теперь знаю немного больше ) Ура! )
О! У мня еще вопрос по функции Val появился
Val(Chr, i, code) - что есть такое code??????
GoodWind
13.09.2004 20:33
А не проще ли
Код
var str:string;
value,code:integer;
begin
repeat
readln(str);
val (str,value,code);
until code=0;
end.
Поясню - val "возвращает" в code типа errorlevel`а и если он не 0 то в строке есть НЕ цифры.
зы: программа скорее всего работать не будет :D , но идея, я думаю, ясна
даже насколько я понял несколько больше - еще если число привосходит допустимые рамки
Цитата
если число привосходит допустимые рамки
Именно! :p5:
А хороший у тебя аватар, далеко пойдешь
Вот тебе еще
(я этот шедевр стащил с школьного компа в прошлом году, а точнее с компа директора школы, гыыыы.... ух, что там еще было ....
(ну доки всякие сов. секкр.) )
Werwolf86
14.09.2004 7:20
Цитата(Guest @ 13.09.04 14:32)
а как зделать чтоб процедура работала всю программу?
чтобы походу работы проги нажатие других клавиш не давало результата?
А смысл? Не проще сделать контроль ввода кейсом? и Все...действие только при нажатиии нужной клавиши))
Werwolf86
14.09.2004 7:50
например контроль ввода 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;
Не забываем заключать код в соответствующие теги!
Код
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
14.09.2004 19:44
Цитата
То есть сложный, потому что нажатия CTRL+ALT+DEL только я могу заблокировать
(может еще кто может? )
Нашёл чем удивить
GoodWind
14.09.2004 21:52
Цитата
ну давай, покажи.
Присоединяюсь - оч хочется научиться !
---
Знание - сила
BlackShadow
15.09.2004 20:46
BRS, не в тему, но кошка действительно рулез :D :D :D
Под DOS или под Windows (тогда 9x или NT)?
Цитата
кошка действительно рулез
Гыыыыы....
:D
ПОД DOS!
GoodWind
16.09.2004 22:01
Под DOS
BlackShadow
17.09.2004 21:09
Не, ну народ, это не серьёзно. Под DOS, как два байта переслать. А точнее 4. А переслать их надо на адрес 00064h, если калькулятор не подвёл. Т. е. меняешь INT19h на свой обработчик, который не вызывает перекрытый и дело с концом...
ты код дай... тогда поговорим ... Учти ТОЛЬКО блокировка CTRL+ALT+DEL!!!
BlackShadow
20.09.2004 20:05
Олег, ты и мёртвого достанешь. Код примерно такой (как всегда без компилятора):
Код
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.
Отлично, Черная тень!
Но я знаю как лучше сделать!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста,
нажмите сюда.