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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.01.2012, 18:52   #1
stas45rus
Пользователь
 
Регистрация: 26.08.2011
Сообщений: 46
По умолчанию Найти ошибку.

Всем добрый вечер. Помогите пжл. наконец-то кто-нибудь найти ошибку в программе. Пять дней мучаюсь. Программа, при прямом обходе, выдаёт неправильный порядок чисел. Вот код:
Код:
Program Haffman;
Uses Crt;
Type
  Knot=^Pknot;
  Pknot=Record
         Counter:Longint;
         Symbol,Bit:Byte;
         Next,Right,Left:Knot;
        End;
Var
  P:Knot;
  f:File;
  r:Text;
  Ch:Char;
  St:String;
  i,Buf:Byte;
  s:Longint;

Procedure InsertList(Var P:Knot; s:Longint; i:Byte);
Begin
  If P=Nil Then
   begin
     New(P);
     P^.Counter:=s;
     P^.Symbol:=i;
     P^.Bit:=0;
     P^.Next:=Nil;
     P^.Right:=Nil;
     P^.Left:=Nil;
   end
  Else InsertList(P^.Next,s,i);
End;

Function Sortinglist(P:Knot):Knot;
Var
  X,N:Knot;
  s:Longint;
  i,m:Byte;
Begin
  X:=P;
  While X<>Nil Do
   Begin
     N:=X^.Next;
     While N<>Nil Do
      Begin
        If N^.Counter<X^.Counter Then
         Begin
           s:=N^.Counter;
           i:=N^.Symbol;
           m:=N^.Bit;
           N^.Counter:=X^.Counter;
           N^.Symbol:=X^.Symbol;
           N^.Bit:=X^.Bit;
           X^.Counter:=s;
           X^.Symbol:=i;
           X^.Bit:=m;
         End;
        N:=N^.Next;
      End;
     X:=X^.Next;
   End;
  Sortinglist:=X;
End;

Function AdditionList(P:Knot):Knot;
Var
  s:Longint;
  i:Byte;
  X,N:Knot;
Begin
  i:=0;
  While (P<>Nil) and (P^.Next<>Nil) Do
   begin
     s:=P^.Counter+P^.Next^.Counter;
     InsertList(P,s,i);
     X:=P;
     While X<>Nil Do
      begin
        N:=X;
        X:=X^.Next;
      end;
     New(N^.Right);
     N^.Right^.Counter:=P^.Next^.Counter;
     N^.Right^.Symbol:=P^.Next^.Symbol;
     N^.Right^.Bit:=1;
     N^.Right^.Next:=Nil;
     N^.Right^.Right:=P^.Next^.Right;
     N^.Right^.Left:=P^.Next^.Left;
     New(N^.Left);
     N^.Left^.Counter:=P^.Counter;
     N^.Left^.Symbol:=P^.Symbol;
     N^.Left^.Bit:=0;
     N^.Left^.Next:=Nil;
     N^.Left^.Right:=P^.Right;
     N^.Left^.Left:=P^.Left;
     SortingList(P);
     X:=P;
     N:=P^.Next;
     P:=P^.Next^.Next;
     Dispose(X);
     Dispose(N);
   end;
  AdditionList:=P;
End;

Procedure BypassList(P:Knot);
Begin
  If P<>Nil Then
   begin
     Writeln(r,P^.Counter:4,P^.Symbol:4,P^.Bit:4);
     BypassList(P^.Left);
     BypassList(P^.Right);
   end;
End;

Procedure Compression;
Begin
  P:=Nil;
  For i:=0 To 255 Do
   begin
     s:=0;
     While not(eof(f)) Do
      begin
        BlockRead(f,Buf,1);
        If i=Buf Then Inc(s);
      end;
     If eof(f) Then Seek(f,0);
     If s<>0 Then InsertList(P,s,i);
   end;
  SortingList(P);
  AdditionList(P);
  BypassList(P);
End;

Begin
 Clrscr;
 Writeln('Для архивации файла нажмите ''a''.');
 Writeln('Для распвковки файла нажмите ''r''.');
 Writeln('Для отмены нажмите любую клавишу.');
 Ch:=Readkey;
 Case Ch Of
   #97:Begin
         Writeln('Введите полный путь и имя файла:');
         Readln(st);
         Assign(f,st);
         Reset(f,1);
         If FileSize(f)=0 Then Writeln('Файл пуст!!!')
          Else
           Begin
             Assign(r,'D:\Kopiya.TXT');
             Rewrite(r);

             Compression;

             Close(r);
           End;
         Close(f);
       End;
  Else Halt;
 End; 
 Readln;
End.
stas45rus вне форума Ответить с цитированием
Старый 17.01.2012, 19:01   #2
stas45rus
Пользователь
 
Регистрация: 26.08.2011
Сообщений: 46
По умолчанию

неужели никто не может помочь???
stas45rus вне форума Ответить с цитированием
Старый 17.01.2012, 19:16   #3
Mandrivnyk
Software Developer
Участник клуба
 
Аватар для Mandrivnyk
 
Регистрация: 01.03.2011
Сообщений: 1,098
По умолчанию

Цитата:
Код:
Procedure BypassList(P:Knot);
Begin
  If P<>Nil Then
   begin
     Writeln(r,P^.Counter:4,P^.Symbol:4,P^.Bit:4);
     BypassList(P^.Left);
     BypassList(P^.Right);
   end;
End;
Если не ошибаюсь, надо так:
Код:
     Writeln(r,P^.Counter:4,P^.Symbol:4,P^.Bit:4);
     BypassList(P^.Right);
     BypassList(P^.Left);
А то, что у тебя -- обратный обход...
Болтовня ничего не стоит. Покажите мне код. (c) Linus Torvalds
Помог ответ? -- Поставьте отзыв.
Выражения особой благодарности в рублевом эквиваленте отправлять сюда --> R269634919062
Mandrivnyk вне форума Ответить с цитированием
Старый 17.01.2012, 20:07   #4
stas45rus
Пользователь
 
Регистрация: 26.08.2011
Сообщений: 46
По умолчанию

А вот по - моему ты ошибаешься, а не я. То что я написал, это прямой обход. А при обратном Writeln ставится в конце. И ошибка тут не в этом, а именно, как я думаю, в формировании дерева.
stas45rus вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
найти ошибку horpenst Microsoft Office Excel 4 10.04.2011 15:39
найти ошибку Яська Помощь студентам 1 04.04.2010 17:23
Найти ошибку Uvaroff Помощь студентам 3 13.01.2010 01:45
найти ошибку rUs_LAN Общие вопросы C/C++ 8 14.05.2009 12:02