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

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

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

Глава 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.
Последний раз редактировалось Герман 09.11.2016 18:20:23, всего редактировалось 1 раз.
Герман
новенький
 
Сообщения: 26
Зарегистрирован: 27.10.2016 11:11:41

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

Сообщение Лекс Айрин » 07.11.2016 16:30:31

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

Код: Выделить всё
begin
                             Writeln(' Etot nomer est v baze. ');
                             break; !!!!!!!!!
                             flag := true;
                           end
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

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

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

Сообщение bormant » 07.11.2016 18:05:33

... и ещё. Форматирование должно помогать читать код, а не мешать:
Код: Выделить всё
{ 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('Такой номер в базе есть');
Аватара пользователя
bormant
постоялец
 
Сообщения: 407
Зарегистрирован: 21.03.2012 11:26:01

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 "= истина.
Ребята, разъясните мне это, плиз.
Герман
новенький
 
Сообщения: 26
Зарегистрирован: 27.10.2016 11:11:41

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

Сообщение Лекс Айрин » 07.11.2016 18:48:22

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

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

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

Сообщение Снег Север » 07.11.2016 20:46:16

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

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

Сообщение bormant » 07.11.2016 22:36:35

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

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

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

Сообщение Герман » 08.11.2016 10:41:17

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


Вернуться в Книга "Песни о Паскале"

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

Рейтинг@Mail.ru