Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Цикл Repeat

Автор: garry_m 24.12.2005 0:58

Привет всем!
Вот допустим есть такая программка:

program z_1_7;
uses crt;
var
N,k:integer;
ans:char;
begin

clrscr;
repeat

write('VVEDITE NOMER DNJA V GODU -> '); readln(k);

N:=k mod 7;
case N of
1:writeln ('PONEDELNIK');
2:writeln ('VTORNIK');
3:writeln ('SREDA');
4:writeln ('CHETVERG');
5:writeln ('PJATNICA');
6:writeln ('SUBBOTA');
0:writeln ('VOSKRESENJE');
end;
writeln('do you want to repeat? (Y/N)');
ans:=readkey;
until UpCase(ans)='N';

end.


И нам нужно вставить в нее цикл... Вот что у нас выходит:
program z_1_7;
uses crt;
var
N,k:integer;
ok:boolean;
ans:char;
begin

clrscr;
repeat
repeat
{$I-}
write('VVEDITE NOMER DNJA V GODU -> '); readln(k);
{$I+}
ok:=(ioresult=0) and (k <= 365) and (k > 0);
if not ok then writeln('* * * ERROR! WRONG INPUT! PLEASE TRY AGAIN! * * *');
until ok;

N:=k mod 7;
case N of
1:writeln ('PONEDELNIK');
2:writeln ('VTORNIK');
3:writeln ('SREDA');
4:writeln ('CHETVERG');
5:writeln ('PJATNICA');
6:writeln ('SUBBOTA');
0:writeln ('VOSKRESENJE');
end;
writeln('do you want to repeat? (Y/N)');
ans:=readkey;
until UpCase(ans)='N';

end.


НО! Этот цикл работает, но не является так сказать корректным. Давайте попробуем ввести значение переменной: "gdggdg 12" (вводить естественно без кавычек). И посмотрим что нам выдаст программа... Все начинает глючить! Как раз таки на этом я и прокололся на уроке программирования.

Так вот я обращаюсь к вам за помощью: как можно по-другому решить вопрос с проверкой на правильность ввода? Я все перерыл - не знаю как... Надеюсь на вашу отзывчивость!

Автор: volvo 24.12.2005 1:22

Попробуй "свалить" это:

uses crt;
var
N, k, err: integer;
ok: boolean;
ans: char;
s: string;
begin

clrscr;
repeat
repeat
{$I-}
write('VVEDITE NOMER DNJA V GODU -> '); readln(s);
{$I+}
ok := (ioresult = 0); val(s, k, err);
ok := ok and (err = 0) and ((k > 0) and (k <= 365));
if not ok then writeln('* * * ERROR! WRONG INPUT! PLEASE TRY AGAIN! * * *');
until ok;

N:=k mod 7;
case N of
1:writeln ('PONEDELNIK');
2:writeln ('VTORNIK');
3:writeln ('SREDA');
4:writeln ('CHETVERG');
5:writeln ('PJATNICA');
6:writeln ('SUBBOTA');
0:writeln ('VOSKRESENJE');
end;
writeln('do you want to repeat? (Y/N)');
ans:=readkey;
until UpCase(ans)='N';

end.

Автор: garry_m 24.12.2005 1:36

Ну и это свалить можно...
Попробуй ввести значение переменной скажем "32769"...

Автор: volvo 24.12.2005 1:43

Ну, так я тебе тогда любое свалю... lol.gif Хочешь - определи K как LongInt и введи "2147483649"... Все, ощибка... А почему? Потому как переполнение и все заново начинается... Запомни раз и навсегда: Не бывает программ, которые нельзя "свалить"... И если ты начинаешь написание вот такой программки с ТАКОЙ защиты от дурака, то ...

  repeat
{$I-}
write('VVEDITE NOMER DNJA V GODU -> '); readln(s);
{$I+}
ok := (ioresult = 0); val(s, k, err);
ok := ok and (err = 0) and (length(s) < 4) and ((k > 0) and (k <= 365));
if not ok then writeln('* * * ERROR! WRONG INPUT! PLEASE TRY AGAIN! * * *');
until ok;


Развлекайся...

Автор: garry_m 24.12.2005 1:59

Спасиба!
Теперь программа работает понадежнее!