Страница 1 из 1
Глава 29. Задание " Г "
Добавлено: 07.11.2016 15:14:56
Герман
Плиз, объясните, почему при наборе номера, которого нет в базе, программа не печатает сообщение?
Код: Выделить всё
{ P_29_1 - Policeyskaya baza, versya 0 }
var F : text;
S : string; { vhodyzshiy nomer }
P : string; { nomer v baze }
i : integer;
flag : boolean;
begin
Assign(F, 'Police.txt');
Reset(F);
Writeln('Vvedite interesuyushiy Vas nomer: '); Readln(S);
flag := false;
while not Eof(F) do
begin
Readln(F, P);
if P= S
then
begin
Writeln(' Etot nomer est v baze. ');
break;
flag := true;
end
end;
if flag then Writeln(' Takogo nomera net v baze ');
Close(F);
Readln;
end.
Re: Глава 29. Задние " Г "
Добавлено: 07.11.2016 15:30:31
Лекс Айрин
сначала выставь флаг, а потом покидай цикл
Код: Выделить всё
begin
Writeln(' Etot nomer est v baze. ');
break; !!!!!!!!!
flag := true;
end
Re: Глава 29. Задние " Г "
Добавлено: 07.11.2016 17:00:10
Герман
Код: Выделить всё
{ P_29_1 - Policeyskaya baza, versya 0 }
var F : text;
S : string; { vhodyzshiy nomer }
P : string; { nomer v baze }
i : integer;
flag : boolean;
begin
Assign(F, 'Police.txt');
flag := false;
Reset(F);
Writeln('Vvedite interesuyushiy Vas nomer: '); Readln(S);
while not Eof(F) do
begin
Readln(F, P);
if P= S
then
begin
Writeln(' Etot nomer est v baze. ');
flag := true;
break;
end
end;
if flag then Writeln('Net');
Close(F);
Readln;
end.
Теперь при введении номера из базы программа печатает и положительный ответ, и отрицательный. При введении неправильного номера, прога все также не отвечает.
Да, это странно, что, когда брейк размещаешь перед присвоением flag := true;, но так хотя бы работает положительный ответ.
Вот почему не работает if flag then Writeln(' Net ');- вот этого я понять не могу.
Re: Глава 29. Задние " Г "
Добавлено: 07.11.2016 17:17:04
bormant
... и ещё. Форматирование должно помогать читать код, а не мешать:
Код: Выделить всё
{ P_29_1 - Policeyskaya baza, versya 0 }
var
F: Text;
S, { vhodyzshiy nomer }
P: String; { nomer v baze }
i: Integer;
flag: Boolean;
begin
Assign(F, 'Police.txt'); Reset(F);
Writeln('Vvedite interesuyushiy Vas nomer: '); Readln(S);
flag := false;
while not Eof(F) do begin
Readln(F, P);
if P = S then begin
Writeln(' Etot nomer est v baze. ');
flag := true;
Break;
end;
end;
if not flag then Writeln(' Takogo nomera net v baze ');
Close(F);
Readln;
end.
Добавлено спустя 3 минуты 2 секунды:Либо
Код: Выделить всё
Flag:=False;
...
if нашли then Flag:=True;
...
if not Flag then не_нашли;
либо
Код: Выделить всё
Flag:=True;
...
if нашли then Flag:=False;
...
if Flag then не_нашли;
Добавлено спустя 1 минуту 58 секунд:Второй вариант подходит для естественного прерывания цикла:
Код: Выделить всё
Flag:=True;
while not EoF(f) and Flag do begin
Readln(F, P);
if P = S then begin
Writeln(' Etot nomer est v baze. '); Flag := False;
end;
end;
Close(f);
if Flag then WriteLn('Такого номера нет в базе');
либо вовсе отложить вывод до окончания цикла:
Код: Выделить всё
Flag:=True;
while not EoF(f) and Flag do begin
Readln(F, P); Flag := P = S;
end;
Close(f);
if Flag
then WriteLn('Такого номера нет в базе')
else WriteLn('Такой номер в базе есть');
Re: Глава 29. Задние " Г "
Добавлено: 07.11.2016 17:29:13
Герман
Прими мои извинения за неудобство чтения моей писанины. Мне удобно так ориентироваться в блоках begin- end. Я знаком с html и поэтому так привычней.
Спб за прояснение.
Тут же второй вопрос-
1. Сначала, перед циклом, было объявлено что flag := false;,
2. Затем проверяем на равенство входящего номера с номерами в базе и если мы его находим, то приравниваем flag := true;, а если не получаем равенство, то flag остается равным false.
Так почему не работает if flag then Writeln(' Net ');?
а работает not flag. Ведь если изначально было присвоено флагу значение ложь, то " not flag "= истина.
Ребята, разъясните мне это, плиз.
Re: Глава 29. Задние " Г "
Добавлено: 07.11.2016 17:48:22
Лекс Айрин
Герман писал(а):Так почему не работает if flag then Writeln(' Net ');?
потому что компилятор ( условно, препроцессор) превращает данный код в
Re: Глава 29. Задние " Г "
Добавлено: 07.11.2016 19:46:16
Снег Север
Герман писал(а):Так почему не работает if flag then Writeln(' Net ');?
а работает not flag. Ведь если изначально было присвоено флагу значение ложь, то " not flag "= истина.
Ребята, разъясните мне это, плиз.
Оператор if ... then срабатывает только на значение условие истина. Если нужна реакция и на ложь, то используется конструкция
Re: Глава 29. Задние " Г "
Добавлено: 07.11.2016 21:36:35
bormant
Состояния нашли/не_нашли -- взаимно противоположны.
Если для "нашли" используете True, тогда для "не_нашли" -- False. И наоборот.
Обратите внимание на варианты из середины сообщения
viewtopic.php?f=45&t=11590#p102916 , там где с многоточиями.
Код: Выделить всё
if условие
then оператор_когда_условие_истина
else оператор_когда_условие_ложь;
Re: Глава 29. Задние " Г "
Добавлено: 08.11.2016 09:41:17
Герман
Спб, просветили.