Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.05.2012, 21:26   #1
tanyana
Новичок
Джуниор
 
Регистрация: 23.05.2012
Сообщений: 1
По умолчанию метод хафмана на паскале

Код:
uses crt;
var st:string;
ch,i1,i2:char;
m:array[#0..#255] of integer;
chast:array[#0..#255] of real;
orig:array[#0..#255] of string[20];
code:array[#0..#255] of string[20];
i,j,c:integer;
kol, m1,m2: real;

begin
     clrscr;

     writeln('vvedite stroky');
     readln(st);

     writeln('kol-vo simvol');
     writeln(length(st));
     writeln;
     c:=0;

            for i:=1 to length(st) do
            inc (m[st[i]]);

            for ch:=#0 to #255 do
            if (m[ch]<>0) then
            begin
            writeln(ch,' ',m[ch],' ',m[ch]/length(st):2:2);
            chast[ch]:=m[ch]/length(st);
            orig[ch]:=ch;
            c:=c+1;
            end;

      for ch:=#0 to #255 do
      begin
      if (m[ch]<>0) then
      kol:=kol+(m[ch]/length(st)*ln(m[ch]/length(st))/ln(2));
      end;
      kol:=kol*(-length(st));
      writeln('Kol-vo informacii: ',kol:10:2,' bit');

   While c>1 do
   begin

      m1:=1;
      for ch:=#0 to #255 do
      begin
      if (chast[ch]>0) and (chast[ch]<m1) then
        begin
        m1:=chast[ch];
        i1:=ch;
        end;
      end;

      m2:=m1;
      i2:=i1;
      chast[i1]:=1;

      m1:=1;
      for ch:=#0 to #255 do
      begin
      if (chast[ch]<>0) and (chast[ch]<m1) then
      begin
      m1:=chast[ch];
      i1:=ch;
      end;
      end;

      for i:=1 to length(orig[i1]) do
      code[orig[i1][i]]:='0'+code[i1];

      for i:=1 to length(orig[i2]) do
      code[orig[i2][i]]:='1'+code[i2];

      chast[i1]:=m1+m2;
      orig[i1]:=orig[i1]+orig[i2];
      c:=c-1;
   end;
            for ch:=#0 to #255 do
            if (m[ch]<>0) then
            writeln(ch,' ',code[ch]);

readkey;
end.

вот такой код, не правильно присваивает коды(нули и единицы) к символам. в чем дело? где ошибка? помогите пожалуйста



___________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 24.05.2012 в 09:16.
tanyana вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Алгоритм Хафмана михончик Помощь студентам 4 10.04.2012 22:57
метод перебора на паскале. torlof Помощь студентам 3 21.05.2011 22:43
Кодировка Хафмана hottabych23 Общие вопросы Delphi 1 01.05.2010 14:13
метод Зейделя на Паскале(график) Neznau Паскаль, Turbo Pascal, PascalABC.NET 0 27.05.2009 20:02