Реализация Алгоритма Хаффмана - 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 реализует алгоритм Хаффмана для кодирования и декодирования текстовых файлов с использованием частотного анализа символов. Он создает дерево Хаффмана, которое представляет собой структуру, используемую для кодирования символов с использованием других символов. Код также вычисляет энтропию файла, которая является мерой неопределенности информации в файле.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д