Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Помощь студентам


Ответ
 
Опции темы Опции просмотра
Старый 17.11.2016, 11:52   #1 (permalink)
Smile188
Member
 
Регистрация: 13.10.2016
Сообщений: 15
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию Как сделать проверку?

Алгоритм Хаффмана . При при кодировании, если ввожу такую строку "kkkkkkk", то по идее должно выдавать ошибку о том, что дерево не может быть создано. Подскажите, пожалуйста, как сделать проверку на такой случай, когда мы вводим только одну букву несколько раз?



Код:
Procedure shifr();
 var i, n:integer;
 begin
  writeln('Введите текст: ');
  readln(s);
  for i := 0 to 255 do  //Инициализация  массива(счетчика)
    mass[i] := 0;
  for i := 1 to length(s) do //подсчет числа символов
    inc(mass[ord(s[i])]);//выдает код i-того символа
  n := 0;
  for i := 0 to 255 do
    if mass[i] <> 0 then begin//Формируем листья дерева
      inc(n);
      new(TMass[n]);
      TMass[n]^.N := Mass[i];
      TMass[n]^.symbol := chr(i);
      TMass[n]^.Left := nil;
      TMass[n]^.Right := nil;
    end;      
  Sort(TMass, N);
  
  //Формируем само дерево
  while n > 1 do 
  begin
    new(p);
    p^.n := TMass[n]^.N + TMass[n - 1]^.N;
    p^.left := TMass[n - 1];
    p^.right := TMass[n];
    TMass[n - 1] := p;
    Dec(n); //Уменьшает значение n на 1
    Sort(TMass, N);
  end;
  
  //Подсчитываем число бит для закодированного текста
  n:=0;
  for i:=0 to 255 do
    if mass[i]<>0 then
      n:=n+mass[i]*length(GetCode(p, chr(i), ''));
  Writeln('Число бит закодированного текста: ',n);    
  
  g := '';  //Кодируем строку
  for i := 1 to length(s) do
  begin
  g:=g+GetCode(p, s[i], '');  
  end; 
Writeln('Закодированный текст: ', g);
end;
Код:
function GetCode(T: PTree; C: char; path: string): string;// Возвращает код Хоффманa
begin
  if (T^.Left=nil) and (T^.Right=nil) and (T^.symbol=C) then
    result:=path
  else
    begin
      result:='';
      if T^.left <> nil then 
        result := GetCode(t^.left, C, path + '0');
      if (result='') and (T^.right <> nil) then
        result := GetCode(t^.right, C, path + '1');
    end;
end;
В этой строке выдается ошибка
Код:
if (T^.Left=nil) and (T^.Right=nil) and (T^.symbol=C) then
Smile188 вне форума   Ответить с цитированием

Старый 17.11.2016, 11:52
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Проблему решать намного легче, если все о ней узнать

Невозможно сделать проверку жёсткого диска утилитами : Advanced System Care
на проверку
на проверку
Log на проверку
Как сделать полную проверку логического диска на вирусы

Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 23:53.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.