Страница 1 из 1

Глава 29. Задание " Г "

СообщениеДобавлено: 07.11.2016 16: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 16:30:31
Лекс Айрин
сначала выставь флаг, а потом покидай цикл

Код: Выделить всё
begin
                             Writeln(' Etot nomer est v baze. ');
                             break; !!!!!!!!!
                             flag := true;
                           end

Re: Глава 29. Задние " Г "

СообщениеДобавлено: 07.11.2016 18: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 18:05:33
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 18: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 18:48:22
Лекс Айрин
Герман писал(а):Так почему не работает if flag then Writeln(' Net ');?

потому что компилятор ( условно, препроцессор) превращает данный код в
Код: Выделить всё
if flag then=true Writeln(' Net ');

Re: Глава 29. Задние " Г "

СообщениеДобавлено: 07.11.2016 20:46:16
Снег Север
Герман писал(а):Так почему не работает if flag then Writeln(' Net ');?
а работает not flag. Ведь если изначально было присвоено флагу значение ложь, то " not flag "= истина.
Ребята, разъясните мне это, плиз.
Оператор if ... then срабатывает только на значение условие истина. Если нужна реакция и на ложь, то используется конструкция
Код: Выделить всё
if ... then ... else ...;

Re: Глава 29. Задние " Г "

СообщениеДобавлено: 07.11.2016 22:36:35
bormant
Состояния нашли/не_нашли -- взаимно противоположны.
Если для "нашли" используете True, тогда для "не_нашли" -- False. И наоборот.

Обратите внимание на варианты из середины сообщения viewtopic.php?f=45&t=11590#p102916 , там где с многоточиями.
Код: Выделить всё
if условие
then оператор_когда_условие_истина
else оператор_когда_условие_ложь;

Re: Глава 29. Задние " Г "

СообщениеДобавлено: 08.11.2016 10:41:17
Герман
Спб, просветили.