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

Глава 13 Задание В

СообщениеДобавлено: 06.12.2016 21:27:26
Eskin
На 95 странице нас просят реализовать схему:
дом-->улица A->Улица B ->Шлагбаум F -> школа
I-> Улица C------> Улица D---------------------I
I-> улица E ------> Шлагбаум G-----------------I
Дело в том, что по условиям задания, закрытый шлагмаум соответствует условию TRUE, если же перед булевым выражением вставить оператор "not" то оно целиком меняет смысл, как можно реализовать данный алгоритм?
Код: Выделить всё
if (A or C or E) and (B or D)

каким образом, можно грамотно вставить оператор not, не перевернув данное логическое выражение на противоположенный знак?

Re: Глава 13 Задание В

СообщениеДобавлено: 07.12.2016 15:43:30
enot777
>> Eskin
Вариант решения для 13в
Код: Выделить всё
program p13_w;
var
  a, b, c, d, e, f, g:boolean; //a..e - улицы, true (1) - свободна,  f and g - шлагбаум, true (1) - если закрыт
  s: string;
begin
  writeln('Укажите загруженность дорог a, b, c, d, e, f, g "0" or "1"');
  write('a: ');readln(s);a:= s='1';
  write('b: ');readln(s);b:= s='1';
  write('c: ');readln(s);c:= s='1';
  write('d: ');readln(s);d:= s='1';
  write('e: ');readln(s);e:= s='1';
  write('f: ');readln(s);f:= not(s='1');
  write('g: ');readln(s);g:= not(s='1');
  a:= (a and b and f);
  c:= (c and d);
  e:= (e and g);
  if a and c and e then writeln('Езжай по любой дороге')
  else if a then writeln('Езжай по: a b f')
    else if c then writeln('Езжай по: c d')
      else if e then writeln('Езжай по: e g')
        else writeln('Иди пешком!');
  writeln('Нажми Enter!');
  readln;
end.

1 путь: a b f
2 путь: c d
3 путь: e g
Шлагбаум f и g можно инвертировать при присвоении: f:=not(s='1'); и g:=not(s='1');

Re: Глава 13 Задание В

СообщениеДобавлено: 07.12.2016 20:38:27
Oleg_D
enot777 писал(а):Шлагбаум f и g можно инвертировать при присвоении: f:=not(s='1'); и g:=not(s='1');

Можно и так, конечно. Но цель задачи -- научить применять отрицание внутри выражений. Например:
Код: Выделить всё
  write('f: '); readln(s); f:= s='1';
  write('g: '); readln(s); g:= s='1';
  a:= (a and b and not f);
  c:= (c and d);
  e:= (e and not g);

А ещё могу предложить желающим изменить условие задачи так, чтобы уличной пробке соответствовало TRUE, т.е. инвертировать условие. И записать соответствующие выражения с учётом этого изменения.

Re: Глава 13 Задание В

СообщениеДобавлено: 08.12.2016 00:31:42
Eskin
Благодарю вас за ответы, в некоторых вариантах программы я был близок к решению, но к сожалению применял not по отношению к всему выражению, либо же ставил его как and not (e and G) из за чего компилятор выдавал ошибку, К сожалению я не подумал, что not, можно так же применять внутри скобок как операторы or и and
Олег, с удовольствием попробую решить вашу задачу в свободное время :)