Реализация Алгоритма Хаффмана - Turbo Pascal

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Прошу помочь, есть программа на ABC паскале, но необходимо чтобы было написано в Turbo паскале. Нужно ее исправить. Если возможно, сделать

проще и понятнее.

Ниже прикреплена программа. И так же фотография как это все должно выводится на экране.

Решение задачи: «Реализация Алгоритма Хаффмана»

textual
Листинг программы
const 
{   n=28;   {количество максимальное символов}
    {Вводим константы и указатель на массивы}
    max = 122;
    search=['A'..'Z', ' ', '.'];
    prep = ['.','!','?',','];
Type    {Вводим указатели на массивы для передачи их в процедуры}
    Matr = array[1..max] of real;
 
 
var
 
    Chuf :array[1..max,1..max] of 0..1;
    Shuf: array[1..max] of 0..1;
    Lhuf:array[1..100]of integer;
    jn:array[1..max] of integer;
    P: Matr;
    Count: array[1..max] of integer;    {массив содержащий количества символов}
    Symbol: array[1..max] of char;
    proverka, qn, ent, Lcp, Hp, Mk, Hcode, Pcode, buf1: real; {переменные для частоты, проверки вероятности и тд и тп}
    Col: Integer;   {переменные для общего количества символов и пар символов}
    Fin, Fout, Fcoder: Text;                {переменные для файлов, входного и выходного}
    fname, foutname, fcode: string; {переменные для файлов, входного и выходного}
    k, i, l, s, j, lasttree, lastusel, col1, Ls, Lh, buf3: integer; 
 
    Q, ch,  buf2, ch3: Char; 
    ch1: string;
{//////////////////////////////////////////////////////////////////////////////////}
 
{Объявляем процедуру вычисления энтропии для текстового файла на английском языке. 
В процедуре подсчитываем частоты появления символов}
Procedure entropy(var P:array of real);
var 
    i: Integer;
begin
    writeln(#13, #10, '---------------------------------------------------------------');   
    write(Fout,  #13, #10, '---------------------------------------------------------------');
    writeln(#13, #10, 'ДЛЯ ОДИНОЧНЫХ СИМВОЛОВ в файле ', fname);    
    write(Fout,  #13, #10, 'ДЛЯ ОДИНОЧНЫХ СИМВОЛОВ в файле ', fname);   
    Writeln(#13, #10, 'Всего учитываемых символов в тексте (для одиночных символов): ', Col);
    write (Fout,  #13, #10, #10,'Всего учитываемых символов в тексте (для одиночных символов): ', Col);
    proverka:=0; ent:=0;
 
{считаем частоту появления букв по ASCII с 65 по 90 - т.к. они у нас все заглавные}
l:=0;
for i:=32 to 90 do 
    {прописные и заглавные буквы не отличаются}
    if (Count[i]>0) then 
        begin
            l:=l+1;
            Count[l]:=Count[i];
            P[l]:=Count[l]/Col; {частота появления букв}
            ent:=  ent - P[l]*ln(P[l])/ln(2);{записываем энтропию}
            proverka:= proverka + P[l];
            Symbol[l] := Chr (i);
                Writeln(#13, #10, 'символ: ', Symbol[l], ' Количество символов: ', Count[l], '  частота появления: ', P[l]:7:4); 
                Writeln(Fout, #13, #10, 'символ: ', Symbol[l], ' Количество символов: ', Count[l], '  частота появления: ', P[l]:7:4);
            end; 
 
{сортируем частоту по убыванию}
for i:=1 to l-1 do 
    for j:=i+1 to l do
    {if Count[i]>0 then }
        if P[i]<P[j] then 
            begin
                buf1:=P[i]; buf2:=Symbol[i]; buf3:=Count[i];
                P[i]:=P[j]; Symbol[i]:=Symbol[j]; Count[i]:=Count[j];
                P[j]:=buf1; Symbol[j]:=buf2; Count[j]:=buf3;
            end;
    Writeln(#13, #10, '//////////////////////////////////////////////////////////////////////////////////'); 
    Writeln(Fout, #13, #10, '//////////////////////////////////////////////////////////////////////////////////');
{заполним массивы для построения дерева Хаффмана}
for i:=1 to l do
begin
    Writeln(#13, #10, 'символ: ', Symbol[i], ' Количество символов: ', Count[i], '  частота появления ',i,': ', P[i]:7:4); 
    Writeln(Fout, #13, #10, 'символ: ', Symbol[i], ' Количество символов: ', Count[i], '  частота появления ',i,': ', P[i]:7:4);
end;
    Writeln(#13, #10, 'Сумма вероятностей появления символов в файле ', fname, '  = ',proverka:7:4);
    write (Fout,  #13, #10, 'Сумма вероятностей появления символов в файле ', fname, '  = ', proverka:7:4);
{   lasttree := l;  {индекс - номер последнего элемента в массиве F- лес }
{   lastusel := l;  {индекс - номер последнего элемента в массиве Т }
end;
 
 
 
 
 
function Up(l:integer; qn:real; var P:array of real):integer;
 
begin
j:=1;
for i:=l-1 downto 2 do
begin
if (P[i-1] < qn) then 
    P[i]:=P[i-1]
else 
    begin
    j:=i;
    Break;
    end;
end;
    P[j]:=qn;
    Up:=j;
 
        Writeln(#13, #10, 'Up qn   ', qn:7:4,'    ', j:4, '  P[',j,']', P[j]:7:4);
        write (Fout,  #13, #10, 'Up qn   ', qn:7:4,'    ', j:4, '  P[',j,']', P[j]:7:4);    
    for i:=1 to l do 
begin
        Writeln(#13, #10, 'UP P[',i,'] ', P[i]:7:4, i:4);
        write (Fout,  #13, #10, 'UP  P[',i,'] ', P[i]:7:4, i:4);    
end;
 
end;
 
procedure Down(var l, j: integer);
begin
for i:=1 to l do 
Shuf[i]:=Chuf[j,i];
Lh:=Lhuf[j];
 
for i:=j to l-2 do
begin
    for k:=1 to l do
        Chuf[i,k]:=Chuf[i+1,k];
Lhuf[i]:=Lhuf[i+1];
end;
 
for i:=1 to l do
begin
    Chuf[l-1,i]:=Shuf[i];
    Chuf[l,i]:=Shuf[i];
end;
Chuf[l-1,Lh+1]:=0;
Chuf[l, Lh+1]:=1;
Lhuf[l-1]:=Lh+1;
Lhuf[l]:=Lh+1;
        Writeln(#13, #10, 'Down Lh   ', Lh:4);
        write (Fout,  #13, #10, 'Down Lh   ', Lh:4);
    for i:=1 to l do 
begin
        Writeln(#13, #10, 'Down Lhuf[',i,'] ', Lhuf[l]:4);
        write (Fout,  #13, #10, 'Down Lhuf[',i,'] ', Lhuf[l]:4);    
end;
        Writeln(#13, #10, 'Down j   ', j:4,'  l', l:4);
        write (Fout,  #13, #10, 'Down j   ', j:4,'  l', l:4);   
        
end;
 
procedure Huffman(l:integer; var P:array of real);
 
begin
    for i:=1 to l do 
begin
        Writeln(#13, #10, 'Huffman 1 P[',i,'] ', P[i]:7:4, i:4);
        write (Fout,  #13, #10, 'Huffman 1 P[',i,'] ', P[i]:7:4, i:4);  
end;
if l=2 then
    begin
        Chuf[1,1]:=0; Lhuf[1]:=1;
        Chuf[2,1]:=1; Lhuf[2]:=1;
    end
else
    begin
        qn:=P[l-1]+P[l];
        Writeln(#13, #10, 'Huffman qn   ', qn:7:4, l-1:4, '  ', P[l-1]:7:4, l:4, '   ',P[l]:7:4);
        write (Fout,  #13, #10, 'Huffman qn   ', qn:7:4, l-1:4, '  ', P[l-1]:7:4, l:4, '   ',P[l]:7:4); 
        jn[l]:=Up(l,qn,P);
    for i:=1 to l do 
begin
        Writeln(#13, #10, 'Huffman 2 P[',i,'] ', P[i]:7:4, i:4);
        write (Fout,  #13, #10, 'Huffman 2 P[',i,'] ', P[i]:7:4, i:4);  
end;
    
        Writeln(#13, #10, 'Huffman jn[',l,']   ', jn[l]:4, l:4, qn:7:4);
        write (Fout,  #13, #10, 'Huffman jn[',l,']   ', jn[l]:4, l:4, qn:7:4);  
    Huffman (l-1,P);
    Down(l,jn[l]);
            Writeln(#13, #10, 'Huffman jn[',l,']   ', jn[l]:4, l:4, qn:7:4);
        write (Fout,  #13, #10, 'Huffman jn[',l,']   ', jn[l]:4, l:4, qn:7:4);
    end;
    
 
    
        
    for i:=1 to l do 
        begin
        Writeln(#13, #10, 'Huffman Lhuf[',i,'] ', Lhuf[i]:4);
        write (Fout,  #13, #10, 'Huffman Lhuf[',i,'] ', Lhuf[i]:4); 
        end;
 
end;
 
 
{//////////////////////////////////////////////////////////////////////////////////}
 
var 
    ver: real;
begin 
Q := 'y';
while Q <> 'n' do   {объявляем цикл для пакетного ввода файла}
begin
    for i:=1 to max do
    for j:=1 to max do
    Chuf[i,j]:=0;
    Count[i]:=0; 
    Shuf[i]:=0;
    Lhuf[i]:=0;
    P[i]:=0;    
 
    Col:=0;     {общее количество символов}
    {вводим имя файла}
    Writeln('Введите ПОЛНОЕ (с расширением) имя файла для чтения: ');
    readln(fname);
    foutname:= 'out' + fname;
    Assign (Fout, foutname);
    rewrite (Fout);
    write (Fout,  #13, #10, 'Оптимальный код Хаффмана');
    Writeln('Оптимальный код Хаффмана');    
    Assign(Fin, fname);
    Reset(Fin); 
{читаем посимвольно файл и заполняем массив с заданными условиями, для подсчета частоты символов}
while not Eof(Fin) do begin 
    Read(Fin, ch); 
    ch := upcase (ch);  {все символы делаем заглавными}
        if ch in prep then ch:='.'; {все знаки препинания делаем равными '.'}
        if ch in search then  
            begin
                Inc(Count[Ord(ch)]); 
                Inc(Col);
            end;
end; 
    Close(Fin);
{вызываем процедуру для вычесления энтропии текстового файла одиночных символов}
    entropy(P);
    Writeln(#13, #10, 'Энтропия для текстового файла ', fname, ' на английском языке, ');
    Writeln('с использование частоты од.символов = ',ent:7:4);
    write (Fout,  #13, #10, 'Энтропия для текстового файла ', fname, ' на английском языке, ');
    write (Fout,  #13, #10, 'с использование частоты од.символов  = ',ent:7:4);
 
Huffman(l,P); 
writeln;
writeln (Fout);
for i:=1 to l do
begin
 
writeln;
writeln (Fout);
        Write (' OUT Chuf[',i,j,'] Lhuf[',i,']  ', Lhuf[i]:4, '         ', Symbol[i]);
        write (Fout, ' OUT Chuf[',i,j,'] Lhuf[',i,']  ', Lhuf[i]:4, '         ', Symbol[i]);
for j:=1 to Lhuf[i] do
        begin
 
        Write (Chuf[i,j]:4);
        write (Fout, Chuf[i,j]:4);
end;
writeln;
writeln (Fout);
end;
 
    Close(Fout);    
    Write('Еще файл? (y/n) ');
    Readln(Q);
end;
 
end.

Объяснение кода листинга программы

Этот код на Turbo Pascal реализует алгоритм Хаффмана для кодирования и декодирования текстовых файлов с использованием частотного анализа символов. Он создает дерево Хаффмана, которое представляет собой структуру, используемую для кодирования символов с использованием других символов. Код также вычисляет энтропию файла, которая является мерой неопределенности информации в файле.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.077 из 5
Похожие ответы