Pascal, помогите дописать программу
Вложений: 2
Здраствуйте, не могу доделать программу (строит код хаффмана). В процедуре return (действия процедуры должны изменять массив b) есть ошибка (фозможно в описаниии формальных параметров), какая именно понять не могу. Также в основном теле программы нужно вставить textcolor(10)-чтобы выделял зеленым цветом числа, полученные в результате сложения, и textcolor(15)-для всех остальных чисел. Уже всю голову сломала, пытаясь вставить в нужном месте, но либо все числа были зеленые, либо все белые. Вот сам код:
Код:
program xaffmen; а получается пока так (рис справа) |
Цитата:
К сожалению, я насчет кода Хаффмана не в курсе, но вот чего не пойму: в качестве формального параметра процедур insert и return фигурирует k, однако я не вижу, чтобы он использовался в теле этих процедур. Нет ли здесь ошибки? P.S. Вообще-то я мог бы попробовать отладить Вашу программу, даже интересно, это не максимальные значения массивов искать, но только если Вы подробно на словах распишете свой алгоритм. Восстанавливать из неотлаженной программы - дело IMHO дохлое. |
насчет параметра k- да, он там не нужен (я проверила)
алгоритм программы (ввод вероятностей) в ходе этого куска программы присваиваются значения a[1,1]:=0,53; a[2,1]:=0,23; a[3,1]:=0,13; a[4,1]:=0,06; a[5,1]:=0,05 (т.е первый столбик готов) (вставка числа) здесь находим сумму(sum) двух последних чисел ( в процедуре insert это будет x ), далее идет insert: здесь в итоге будет a[1,2]:=0,53; a[2,2]:=0,23; a[3,2]:=0,13; a[4,2]:=0,11(это сумма последних двух чисел в первом столбике), условие while делает так, что числа идут в порядке убывания; анологично 3,4,5 столбцы : a[1,3]:=0,53; a[2,3]:=0,24 (0,13+0,11); a[3,3]:=0,23; a[4,1]:=0,53; a[4,2]:=0,47( 0,23+0,24); a[5,1]:=1,00 (распределение кодов- здесс массив из символьных данных) b[1,5]:='0' b[2,5]:='1' (на эту еденичку внимания не обращаем, нас интересует нолик) Суть кода хаффмана(примерная): этому b[1,5] соответствует a[5,1], то есть 1,00 ставится в соответствие символ '0', дальше смотрим 4 столбец матрицы а: так как 1,00 это сумма 0,53 и 0,47 то у обоих уже будет по нолику и дополнительно приписываем '0' к '0' у числа 0,53( т.к оно больше чем 0,47) и '1' к '0' у 0,47 , т.е в итоге числу 0,53 будет соответ. '00' ; числу 0,47 будет соответ.'01'. смотрим 3 столбец матрицы а: 0,53 известно- '00' ; числу 0,24 будет соот. '010' ; числу 0,23 - '011' (т.к 0,24 и 0,23 в сумме дали 0,47, а его соответствие известно, это '01' , тогда для 0,24 приписывается еще '0' (т.к оно > 0,23) и получится '010' ( '01'+'0' ) и для 0,23 приписывается '1' и получится '011' ( '01'+'1') ( '0' и '1' это символы, а не числа) 2 и 1 столбцы матрицы a анологично. Так вот процедура retutn примерно это и делает. И в итоге в первом столбце массива b (в этом варианте программы) будет окончательное представление чисел 0,53; 0,23; 0,13; 0,06; 0,05 в виде кода хаффмана. Т.е b[1,1]:='00' b[2,1]:='011'; b[3,1]:='0100' b[4,1]:='01010' b[5,1]:='01011' (вывод кодов элементов) ну а здесь уже выводятся на экран эти массивы a и b надеюсь объяснила понятно |
часть кода ( raspredelenie kodov) пошагово (на всякий случай):
b[1,5]:='0' b[2,5]:='1' j=4 do i1=1 do b[1,4]:=b[1,5] (='0') s:=b[1,4] ( '0') i1=1 do b[1,4]:=b[2,4] b[1,4]:='00' ( s+'0') b[2,4]:='01' (s+'1') j=3 do i1=1 do b[1,3]:=b[1,4] ('00') i1=2 do b[2,3]:=b[2,4] ('01') s:=b[2,3] ( '01') i1=2 do b[2,3]:=b[3,3] b[2,3]:='010' ( s+'0') b[3,3]:='011' (s+'1') j=2 do i1=1 do b[1,2]:=b[1,3] ('00') i1=2 do b[2,2]:=b[2,3] ('010') i1=3 do b[3,2]:=b[3,3] ('011') s:=b[2,2] (010) i1=2 do b[2,2]:=b[3,2] i1=3 do b[3,2]:=b[4,2] b[3,2]:= '0100' b[4,2]:= '0101' j=1 do i1=1 do b[1,1]:=b[1,2] ('00') i1=2 do b[2,1]:=b[2,2] ('011) i1=3 do b[3,1]:=b[3,2] ('0100') i1=4 do b[4,1]:=b[4,2] ('0101') s:=b[4,1] ('0101') i1=4 do b[4,1]:=b[5,1] b[4,1]:= '01010' b[5,1]:= '01011' |
Цитата:
|
Вложений: 1
Ну так, не знаю, устроит ли, но могу предложить свой вариант программы, представляющий собой существенную переработку Вашей в плане, как мне представляется, упрощения. В частности, как-то особой надобности в процедурах я там не узрел, ну и еще кое-что по мелочи.
Код:
uses CRT; |
Vladimir S, я воспользовалась вашей идеей о введении переменной clr и доделала свой вариант программы (добавила там 3 цикла for (два из них с участием clr) и немного изменила выведение кодов элементов), но без вашего варианта программы я бы ни за что не догадалась. Спасибо вам за помощь.
|
Цитата:
|
Часовой пояс GMT +4, время: 22:26. |
Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.