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

Книга адресована школьникам средних и старших классов, желающим испытать себя в «олимпийских схватках». Может быть полезна студентам-первокурсникам и преподавателям информатики.

Модераторы: Oleg_D, Модераторы

Ответить
Герман
новенький
Сообщения: 26
Зарегистрирован: 27.10.2016 10:11:41

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

Сообщение Герман »

Плиз, объясните, почему при наборе номера, которого нет в базе, программа не печатает сообщение?

Код: Выделить всё

 { 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.
Последний раз редактировалось Герман 09.11.2016 17:20:23, всего редактировалось 1 раз.
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

сначала выставь флаг, а потом покидай цикл

Код: Выделить всё

begin
                             Writeln(' Etot nomer est v baze. ');
                             break; !!!!!!!!!
                             flag := true;
                           end
Герман
новенький
Сообщения: 26
Зарегистрирован: 27.10.2016 10:11:41

Сообщение Герман »

Код: Выделить всё

 { 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 ');- вот этого я понять не могу.
Аватара пользователя
bormant
постоялец
Сообщения: 408
Зарегистрирован: 21.03.2012 11:26:01

Сообщение 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('Такой номер в базе есть');
Герман
новенький
Сообщения: 26
Зарегистрирован: 27.10.2016 10:11:41

Сообщение Герман »

Прими мои извинения за неудобство чтения моей писанины. Мне удобно так ориентироваться в блоках begin- end. Я знаком с html и поэтому так привычней.
Спб за прояснение.

Тут же второй вопрос-
1. Сначала, перед циклом, было объявлено что flag := false;,
2. Затем проверяем на равенство входящего номера с номерами в базе и если мы его находим, то приравниваем flag := true;, а если не получаем равенство, то flag остается равным false.

Так почему не работает if flag then Writeln(' Net ');?
а работает not flag. Ведь если изначально было присвоено флагу значение ложь, то " not flag "= истина.
Ребята, разъясните мне это, плиз.
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

Герман писал(а):Так почему не работает if flag then Writeln(' Net ');?

потому что компилятор ( условно, препроцессор) превращает данный код в

Код: Выделить всё

if flag then=true Writeln(' Net ');
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3067
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

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

Код: Выделить всё

if ... then ... else ...;
Аватара пользователя
bormant
постоялец
Сообщения: 408
Зарегистрирован: 21.03.2012 11:26:01

Сообщение bormant »

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

Обратите внимание на варианты из середины сообщения viewtopic.php?f=45&t=11590#p102916 , там где с многоточиями.

Код: Выделить всё

if условие 
then оператор_когда_условие_истина
else оператор_когда_условие_ложь;
Герман
новенький
Сообщения: 26
Зарегистрирован: 27.10.2016 10:11:41

Сообщение Герман »

Спб, просветили.
Ответить