a) F=A∧ ¬B∧C
b) F=¬A∨B∨C
c) F=X∨(¬Y∧(X∧Y))=X∨¬Y∧X∧Y=X∨¬Y∧Y=X
d) F=(X^X)v(X^¬Z)v(Z^X)v(Z^¬Z)^¬X=X^(X^¬Z)v(Z^X)^¬X=X^¬X^(X^¬Z)v(Z^X)=(X^¬Z)v(Z^X)
Type
tR = real;
tF = file of tR;
procedure SwapFile(fn1, fn2: string);
var
r: tR;
fin, fout: tF;
begin
Assign(fin, fn1); Reset(fin);
Assign(fout, fn2); Rewrite(fout);
while (not Eof(fin)) do begin Read(fin, r); Write(fout, r) end;
Close(fin); Close(fout)
end;
var
f1, f2, f3, f4, f5, fh: string;
begin
f1 := 'f1.bin'; f2 := 'f2.bin'; f3 := 'f3.bin';
f4 := 'f4.bin'; f5 := 'f5.bin'; fh := 'tmp.bin';
{ f2 <-> f4 }
SwapFile(f2, fh); SwapFile(f4, f2); SwapFile(fh, f4);
{ f5->h, f3->f5, f1->f3, h->f1 }
SwapFile(f5, fh); SwapFile(f3, f5); SwapFile(f1, f3); SwapFile(fh, f1)
end.
******************* Для тестирования ******************
Можно создать тестовые файлы с помощью следующей программы:
type
tR = real;
tF = file of tR;
procedure WF(fn: string; m, n: integer);
var
fout: tF;
i: integer;
begin
Assign(fout, fn); Rewrite(fout);
for i := m to n do Write(fout, i / 2);
Close(fout)
end;
var
f1, f2, f3, f4, f5: string;
begin
f1 := 'f1.bin'; f2 := 'f2.bin'; f3 := 'f3.bin';
f4 := 'f4.bin'; f5 := 'f5.bin';
WF(f1, 3, 7); WF(f2, 11, 19); WF(f3, -6, 9); WF(f4, 0, 11); WF(f5, 14, 22);
end.
Далее можно просмотреть содержимое созданных файлов с помощью следующей программы:
type
tR = real;
tF = file of tR;
procedure WF(fn: string);
var
fin: tF;
r: tR;
begin
Writeln(fn);
Assign(fin, fn); Reset(fin);
while (not Eof(fin)) do
begin Read(fin, r); Write(r:0:1, ' ') end;
Writeln;
Close(fin)
end;
var
f1, f2, f3, f4, f5: string;
begin
f1 := 'f1.bin'; f2 := 'f2.bin'; f3 := 'f3.bin';
f4 := 'f4.bin'; f5 := 'f5.bin';
WF(f1); WF(f2); WF(f3); WF(f4); WF(f5)
end.
Затем выполнить основную программу по перезаписи и снова запустить программу для просмотра обновленнных файлов.
Строить коды для алфавита из двух символов немного странно - и так понятно, что получатся 0 и 1, и все эти кодирования бессмысленны.
Код Шеннона - Фано: делим знаки на две части, чтобы суммарные вероятности появления символов частей были максимально близки (тут в каждой части всего один символ - иначе никак). Одной приписываем 0, другой 1. На этом всё кончилось.
Код Хаффмана: выбираем два символа с наименьшими вероятностями, у одного постфикс 0, у другого 1. Объединяем в одну вершину, и она осталась одна. Конец.
В среднем 1 символ - 1 бит.
Энтропия -∑ p ㏒₂ p = -0.33 log 0.33 - 0.67 log 0.67 = 0.915 бит на символ.
Учитывая, что энтропия всегда не превосходит среднюю длину кода, тут сошлось.