Другие языки программирования и технологии

Паскаль. Помогите лабу доделать и описание.

program lab_4;
var
x1,x2,x3,x4:integer;
f:array[1..10] of boolean;
i:integer;

function p1(q1,q2:boolean):boolean;{p1-Штрих Шеффера}
begin
p1:=not (q1 and q2);{p1-это q1|q2}
end;
function p2(q1,q2:boolean):boolean;{p2-Плюсик в круге}
begin
p2:=q1 and not q2 or q2 and not q1;{}
end;
function p3(q1,q2:boolean):boolean;{p3-Эквивалентность}
begin
p3:=not q1 and not q2 or q2 and q1;{}
end;

{ Производим колькуляцию, создаем матрицу.}
procedure CalculateBools;
begin
f[1]:=x1=1;
f[2]:=x2=1;
f[3]:=x3=1;
f[4]:=x4=1;
f[5]:=p1(f[3],f[1]);
f[6]:=p2(f[5],f[2]);
f[7]:=p1(f[4],f[2]);
f[8]:=p3(f[3],f[7]);
f[9]:=p2(f[6],f[8]);
f[10]:=p2(f[9],f[2]);

end;

{-Основная программа-}
begin

for x1:=0 to 1 do
for x2:=0 to 1 do
for x3:=0 to 1 do
for x4:=0 to 1 do
begin
CalculateBools;
if f[10] then i:=1 else i:=0;
writeln(x1,' ',x2,' ',x3,' ',x4,' ',i);
end;
readln;
end.
program lab_4;
var
f:array[1..10] of boolean;
x1,x2,x3,x4:integer;

function p1(q1,q2:boolean):boolean;{p1-Штрих Шеффера}
begin
p1:=not (q1 and q2){p1-это q1|q2}
end;

function p2(q1,q2:boolean):boolean;{p2-Плюсик в круге}
begin
p2:=q1 xor q2{так записывается плюсик в круге. Или так p2:=q1 <> q2}
end;

function p3(q1,q2:boolean):boolean;{p3-Эквивалентность}
begin
p3:=q1 = q2{а так эквивалентность}
end;

{Производим колькуляцию, создаем матрицу.
Но матрицы не видно, видно вектор - одномерный массив.
Во-первых использование глобальных переменных в процедуре - это нарушение принципов структурного программирования.
Во-вторых, что это за функция? Если булева функция 2-х переменных, то она имеет 4 значения,
если 4-х переменных, то должна иметь 16 значений. Здесь функция f на наборах 0000, 1011, 1100, 1101, 1110 и 1111 не определена.
И при этом полностью пересчитывается вся таблица истинности для различных наборов O_o}
procedure CalculateBools;
begin
f[1]:=x1=1;
f[2]:=x2=1;
f[3]:=x3=1;
f[4]:=x4=1;
f[5]:=p1(f[3],f[1]);
f[6]:=p2(f[5],f[2]);
f[7]:=p1(f[4],f[2]);
f[8]:=p3(f[3],f[7]);
f[9]:=p2(f[6],f[8]);
f[10]:=p2(f[9],f[2])
end;

{-Основная программа-}
var n:integer;
begin
for x1:=0 to 1 do
for x2:=0 to 1 do
for x3:=0 to 1 do
for x4:=0 to 1 do
begin
CalculateBools;
{if f[10] then i:=1 else i:=0; Что это? Почему используется значение функции только на наборе 1010?
Если в f[10] получается значение функции на текущем наборе переменных, то зачем массив? }
n := ((x1 shl 1 or x2) shl 1 or x3) shl 1 or x4; {функция неизвестна, поэтому порядок переменных тоже неизвестен}
if n in [1..10] then
writeln(x1:2,x2:2,x3:2,x4:2,ord(f[n]):2)
end;
readln
end.

P.S. Привели бы полностью задание, иначе гадание на кофейной гуще не способно вам помочь.
КН
Канат Нугманов
51 590
Лучший ответ