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

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

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

 
 Ответить  Открыть новую тему 
> Цикл Repeat, Помогите вставить цикл...
garry_m
сообщение 23.12.2005 20:58
Сообщение #1


Новичок
*

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

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


Привет всем!
Вот допустим есть такая программка:
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" (вводить естественно без кавычек). И посмотрим что нам выдаст программа... Все начинает глючить! Как раз таки на этом я и прокололся на уроке программирования.

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

Сообщение отредактировано: garry_m - 23.12.2005 21:02
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 23.12.2005 21:22
Сообщение #2


Гость






Попробуй "свалить" это:
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
сообщение 23.12.2005 21:36
Сообщение #3


Новичок
*

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

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


Ну и это свалить можно...
Попробуй ввести значение переменной скажем "32769"...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 23.12.2005 21:43
Сообщение #4


Гость






Ну, так я тебе тогда любое свалю... 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
сообщение 23.12.2005 21:59
Сообщение #5


Новичок
*

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

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


Спасиба!
Теперь программа работает понадежнее!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 



- Текстовая версия 18.06.2025 8:44
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"