Помощь - Поиск - Пользователи - Календарь
Полная версия: Цикл с параметром
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Artem7
Здрасте написал прогу но почему то не работает (должна когда я ввожу не правильный пароль выдавать что он не правильный а когда правильный что правильный)

Program proverkaparolya;
Var s,pr,i:integer;
Begin
pr:=1234;
writeln('Введите пароль, у Вас 3 попытки');
for i:=1 to 3 do
readln(s);
if s=pr then
writeln('Пароль верный')
else if i<3 then writeln('Пароль неверный, осталось попыток ',3-i);
readln;
End.
IUnknown
Проверять правильность пароля внутри цикла не пробовал? smile.gif Как-то так:

for i := 1 to 3 do
begin
readln(s);
if s = pr then // ok, можно цикл заканчивать
else // неправильно, пробуем дальше
end;
Artem7
Цитата(IUnknown @ 21.02.2012 20:03) *

Проверять правильность пароля внутри цикла не пробовал? smile.gif Как-то так:

for i := 1 to 3 do
begin
readln(s);
if s = pr then // ok, можно цикл заканчивать
else // неправильно, пробуем дальше
end;


Вооо спасибо терь работает)))))))

А как реализовать если пароль правильный чтоб цикл заканчивался а то даже если он правильный то не заканчивается....
Lapp
Цитата(Artem7 @ 22.02.2012 11:08) *
А как реализовать если пароль правильный чтоб цикл заканчивался а то даже если он правильный то не заканчивается....

А почему у тебя вообще только три попытки? И к тому же, по истечении этих трех попыток все равно выходим на выполнение программы (по всей видимости). Странно как-то это )).
Я бы сделал как-то так..

writeln('введите пароль (для выхода введите пустую строку)');
repeat
readln(s);
if s = '' then exit // по пустому паролю прекращаем процесс и выходим из проги
until s = pr;
Artem7
Цитата(Lapp @ 22.02.2012 11:37) *

А почему у тебя вообще только три попытки? И к тому же, по истечении этих трех попыток все равно выходим на выполнение программы (по всей видимости). Странно как-то это )).
Я бы сделал как-то так..

writeln('введите пароль (для выхода введите пустую строку)');
repeat
readln(s);
if s = '' then exit // по пустому паролю прекращаем процесс и выходим из проги
until s = pr;


Да не так не пойдёт мне надо именно через цикл по параметру а то что 3 попытки да это просто так нужно для цикла по параметру вот только как сделать чтоб выход был после ввода правильного.

Код
сделал так вместо надписи 'пароль правильный' прога заканчивается (p.s спасибо это я взял из вашего кода чтобы прога заканчивалась)
Lapp
Цитата(Artem7 @ 22.02.2012 12:41) *

Да не так не пойдёт мне надо именно через цикл по параметру а то что 3 попытки да это просто так нужно для цикла по параметру вот только как сделать чтоб выход был после ввода правильного.

По-любому тут цикл for не катит, потому что после него переменная цикла не определена. Можно, конечно, засунуть весь функционал программы в блок или в процедуру, а также использовать goto, но все это будет через задницу (особвенно последнее). Так что лучше все же repeat.
Введи счетчик вот так:

n:= 3;
writeln('введите пароль (не более ',n,' раз)');
i:= 0;
repeat
inc(i);
if i>n then exit; // после n попыток выходим
readln(s);
until s = pr;
.... // дальше делаем, что надо
Artem7
Цитата(Lapp @ 22.02.2012 11:54) *

По-любому тут цикл for не катит, потому что после него переменная цикла не определена. Можно, конечно, засунуть весь функционал программы в блок или в процедуру, а также использовать goto, но все это будет через задницу (особвенно последнее). Так что лучше все же repeat.
Введи счетчик вот так:

n:= 3;
writeln('введите пароль (не более ',n,' раз)');
i:= 0;
repeat
inc(i);
if i>n then exit; // после n попыток выходим
readln(s);
until s = pr;
.... // дальше делаем, что надо


Я бы не стал заморачиваться с циклом по параметру если бы не задача, просто мне дали задание через этот цикл реализовать прогу про пароль)
IUnknown
Artem7, если без цикла с параметром (т.е., без For) все-таки не обойтись (ну, мало ли, задание такое, мало ли что) - то:

const Last = 3;
var
i : integer;
s, pass : string;
begin
pass := '1234';
for i := 1 to Last do
begin
readln(s);
if (s = pass) then break
else
if i <> Last then
writeln('Пробуем еще раз. Попыток осталось: ', Last - i)
else Halt(1);
end;
writeln('Пароль верный');
end.
Насчет Exit для выхода из программ - это неправильно. Потому что Exit завершает не выполнение программы, а выполнение текущего блока. Будет это подпрограмма - завершится подпрограмма. Перенесешь ты свою проверку в функцию или процедуру и будешь потом думать, а чего это программа не завершается (это из той же серии, как при неинициализированных переменных "программой все работало - сделал процедурой - выдает неправильные результаты"). Не давай даже повода для ошибки.
Artem7
Цитата(IUnknown @ 22.02.2012 12:21) *

Artem7, если без цикла с параметром (т.е., без For) все-таки не обойтись (ну, мало ли, задание такое, мало ли что) - то:

const Last = 3;
var
i : integer;
s, pass : string;
begin
pass := '1234';
for i := 1 to Last do
begin
readln(s);
if (s = pass) then break
else
if i <> Last then
writeln('Пробуем еще раз. Попыток осталось: ', Last - i)
else Halt(1);
end;
writeln('Пароль верный');
end.
Насчет Exit для выхода из программ - это неправильно. Потому что Exit завершает не выполнение программы, а выполнение текущего блока. Будет это подпрограмма - завершится подпрограмма. Перенесешь ты свою проверку в функцию или процедуру и будешь потом думать, а чего это программа не завершается (это из той же серии, как при неинициализированных переменных "программой все работало - сделал процедурой - выдает неправильные результаты"). Не давай даже повода для ошибки.

Спасибо)))
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.