IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Алгоритм Хаффмана
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 16
Пол: Женский

Репутация: -  0  +


Здравствуйте, я сейчас пишу программу по алгоритму Хаффмана и столкнулась с проблемой: при кодировании, если ввожу такую строку "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;
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Знаток
****

Группа: Пользователи
Сообщений: 481
Пол: Мужской
Реальное имя: Федосеев Павел

Репутация: -  9  +


А почему нельзя создавать дерево?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 16
Пол: Женский

Репутация: -  0  +


Цитата(Федосеев Павел @ 6.11.2016 11:49) *

А почему нельзя создавать дерево?

А как оно может быть создать из одного символа? Ему же двигаться негде. Просто без проверки я вводила "kkkkk", и выводило такую ошибку: Ошибка времени выполнения: Ссылка на объект не указывает на экземпляр объекта.
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
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Знаток
****

Группа: Пользователи
Сообщений: 481
Пол: Мужской
Реальное имя: Федосеев Павел

Репутация: -  9  +


Но архиваторы же сжимают такие строки?
Значит этот символ с избытком кодируется одним битом.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Большевик–концептуал
***

Группа: Пользователи
Сообщений: 194
Пол: Мужской
Реальное имя: Иван Левашев
Jabber: bu_gen@octagram.name
Skype: i.levashew
QQ: 3152538431
WeChat
Ада: Сторонник
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик
Turbo Pascal: Установлен

Репутация: -  1  +


По логике алгоритма, если на входе лист (Left и Right не присвоены), а символ в листе отличается от символа в аргументе, надо выходить с пустым результатом, а вместо этого исполнение заходит в else


--------------------
If you want to get to the top, you have to start at the bottom
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Новичок
*

Группа: Пользователи
Сообщений: 16
Пол: Женский

Репутация: -  0  +


Цитата(OCTAGRAM @ 7.11.2016 6:21) *

По логике алгоритма, если на входе лист (Left и Right не присвоены), а символ в листе отличается от символа в аргументе, надо выходить с пустым результатом, а вместо этого исполнение заходит в else

Спасибо за ответ, но я уже справилась со своей проблемой! smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 24.04.2024 9:05
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name