Помощь - Поиск - Пользователи - Календарь
Полная версия: Цикл Repeat
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
garry_m
Привет всем!
Вот допустим есть такая программка:
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
Попробуй "свалить" это:
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
Ну и это свалить можно...
Попробуй ввести значение переменной скажем "32769"...
volvo
Ну, так я тебе тогда любое свалю... 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
Спасиба!
Теперь программа работает понадежнее!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.