Al
Aleksandr

Pascal. Проблема с логическими выражениями.

Ребят, помогите! В чем проблема?

var x,y,z,a,b,c:integer;
begin
a:= ((not x) and y and z);
b:= ((not x) and (not y) and z);
c:= ((not x) and (not y) and (not z));
for x := 0 to 1 do
for y := 0 to 1 do
for z := 0 to 1 do
if (a or b or c) = 1 then
writeln(x, ' ',y, ' ',z);
end.

В чем проблема? Пишет что параметр цикла for должен описываться в заголовке цикла.
А когда после for прописываю var и удаляю в начале, то он просто не выдает результата.



Вот, но только не ошибок, не результата.

КА
Кирилл Андреев

Описание переменной, используемой для итерации (x, y, z) в заголовке цикла исключает использование переменной вне цикла.
Пример:
begin
for var i := 0 to 10 do
writeln(i);
end.

Ма
Мария

Наталья, проблема в том, что Вы пишете в современном PascalABС. NET (разработанном в последнее десятилетие) код по канонам языка Паскаль, как его представлял себе Н. Вирт (полвека назад). Код этого нового Паскаля более надежен, т. е. он лучше бережет программиста от ошибок. Классика программирования говорит о том, что параметр цикла неверно использовать вне пределов этого цикла. Для закрепления в умах этого канона PascalABC.NET предлагает описывать параметр цикла в заголовке этого цикла и тем самым локализует его. Использование переменных, описанных ранее, ошибкой не считается, но считается недочетом, поэтому компилятор выдает предупреждение. Типа, "сам дурак, но если хочешь так писать - твое право".

В Вашем случае можно писать for var x := False to True do - и все будет хорошо.

ЛП
Людмила Порубова

Не обращай внимания - это не ошибка, а предупреждение. Показывающее, насколько создателям PascalABC.NET накласть и на оригинальный Pascal, и на принципы структурного программирования, и на качество обучения.

PascalABC.NET - это не Pascal, а C#, загримированный под Pascal. Возьми хотя бы Delphi - там подобных бредовых требований не будет.

Другое дело, что у тебя код программы ошибочен - даже второй вариант.
Все переменные должны иметь тип boolean:

var x,y,z,a,b,c:boolean;
begin
for x := false to true do
for y := false to true do
for z := false to true do begin
a:= not x and y and z;
b:= not x and not y and z;
c:= not x and not y and not z;
if a or b or c then writeln(ord(x), ' ',ord(y), ' ',ord(z))
end
end.

Похожие вопросы
Запись выражения в Pascal !!!СРОЧНО !!!
Как записать и вычислить значение логического выражения (Pascal)?
Какой синтаксис записи арифметических выражений в Pascal?
Таблицы истинности логических выражений
Проблема со счетчиками: / Pascal
Проблема с циклом в Pascal
Pascal abc Неверное выражение
Постройте по логическому выражению таблицу истинности логическую схему
Записать по правилам Pascal данное выражение:
Записать выражение на языке Pascal