一个初学者的问题,谁能帮一下我呢(50分)

  • 主题发起人 主题发起人 daisyang
  • 开始时间 开始时间
D

daisyang

Unregistered / Unconfirmed
GUEST, unregistred user!
我是个初学者,编了一个HUFFMAN数,并且输出HUFFMAN编码,可是不知道什么地方
有问题,程序不能运行出来谁能帮我看看呢,在控制台写的
program dd2;
{$APPTYPE CONSOLE}
uses
SysUtils;
const n=5;
const m=9;
type
y=class
constructor inithuffman;
procedure display;
destructordo
ne;
end;

node=record
p,l,r,w:integer;
z:char;
end;
var
s:array [1..m] of node;
mark:array[1..m] of integer;
yh:y;
constructor y.inithuffman;
var
i,j,k,low1,low2,q,b,count:integer;
begin
count:=1;
for i:=1 to mdo
mark:=2;

for i:=1 to mdo
begin
s.p:=0;
s.l:=0;
s.r:=0;
s.z:='t';
end;
for i:=1 to ndo
begin
writeln('input weight');
read(s.w);
end;
s[1].z:='a';
s[2].z:='b';
s[3].z:='c';
s[4].z:='d';
s[5].z:='e';

for i:=n+1 to mdo
s.w:=1000;
low1:=s[1].w;
b:=1;
for i:=1 to ndo
begin
if s.w<low1 then
begin
low1:=s.w;
b:=i;
end;
end;

s.p:=n+1;
s[n+1].l:=b;
if b<>1 then
begin
low2:=s[1].w;
q:=1;
end
else
begin
low2:=s[2].w ;
q:=2;
end;

for i:=1 to n do
begin
if (s.w<low2) and (s.p=0) then
begin
low2:=s.w;
q:=i;
end
end;
s[q].p:=n+1;
s[n+1].w:=s[q].w+s.w;
s[n+1].r:=q;

repeat
i:=1;
while ( s.p<>0)do
i:=i+1;
low1:=s.w;
q:=i;
for j:=i+1 to mdo
//
begin
if (s[j].w<low1) and(s[j].p=0) then
begin
low1:=s[j].w;
q:=j;
end;
end;
//小循环 1
i:=i-1;
repeat
i:=i+1;
until( (s.p=0) and (i<>q));
low2:=s.w;
b:=i;
for k:=1 to mdo
begin
if (k<>q) and(s[k].w<low2)and (s[k].p=0) then
begin
low2:=s[k].w;
b:=k;
end;
end;
// 小循环2
count:=count+1;
s[n+count].w:=s[q].w+s.w;
s[n+count].l:=q;
s[n+count].r:=b;
s[q].p:=n+count;
s.p:=n+count;
writeln(s[n+count].w);
until count=4;
end;
destructor y.done;
begin
end;
procedure y.display;
var
x,i,c,f,k:integer;
number:char;
begin

i:=1;
x:=1;
writeln('intput data you are looking for');
number:='a';
while s.z<> numberdo
i:=i+1;
c:=i;
f:=s[c].p;
while (f<>0)do
begin
if s[f].l=c then
mark[x]:=1 //lefttree=1
else

mark[x]:=0;
x:=x+1;
c:=f;
f:=s[f].p;

end;
i:=m;
while mark=2do
i:=i-1;
for k:=ido
wnto 1do
write(mark[k]);
end;



{ TODO -oUser -cConsole Main : Insert code here }

begin

yh.inithuffman;
yh.display ;
yh.done;
end.
 
怎么没有一个人回我呢?大侠门呢??~!!你们谁帮帮我呀..我初学者实在不知道我哪错了.....哪位好心人帮我一下啊...
 
这还叫初学者,那我这种就叫垃圾了!!!
 
没接触过,帮顶下:)
 
不要太谦虚了啊
 
哈哈~~~ 我是垃圾,没有办法帮助初学者!!只能帮你顶顶了!
 
你们不要看着表面上很复杂,其实程序思想很简单的呀~..我才学不久..不懂哪错了..郁闷啊,,老师已经催作业了 
 
s[1].z:='a';
s[2].z:='b';
s[3].z:='c';
s[4].z:='d';
s[5].z:='e';
//我认为这里还没有完成哈夫曼树的构造,造成后面无法生成哈夫曼编码
 
为什么呢?我把 s[1].z:='a';
s[2].z:='b';
s[3].z:='c';
s[4].z:='d';
s[5].z:='e';  赋初值
然后数组里其他的赋为无关的字符?这样不行么?
 再问个问题,DELPHI里用READ是不是不能READ 字符啊,为什么我
for i;=1 to ndo
begin
writeln('input weight');
read(x);
write('intput data');
read(data);--------此处DATA是CHAR
end;
他就根本不能read(data)
 
你没有把输入的变量保存;请参考下面的代码

program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils;
type
huff = record
weight: real;
parent, lchild, rchild: integer;
end;

var
s1, s2 : integer;
b : array of real;
s, q : string;
i, j, k, l, m, n, ci: integer;
a : array of huff;
p : array of huff;
np : array of string;
procedure select(shuzu: array of huff;
k: integer);
//有问题
var
x, z : integer;
min : real;
begin
min := 1000000;
for x := 0 to k - 1do
begin
if b[x] < min then
begin
min := b[x];
s1 := x;
end;
end;
b[s1] := 1000000;
min := 1000000;
for z := 0 to k - 1do
begin
if b[z] < min then
begin
min := b[z];
s2 := z;
end;
end;
b[s2] := 1000000;
end;

begin

q := '';
m := 1;
//数字个数
write('输入要编码的数(输入格式:数字+空格+数字..)' + #10#13);
readln(s);
if s <> '' then
begin
for i := 1 to length(s)do
begin
if s = ' ' then
m := m + 1;
end;
setlength(a, m);
for j := 0 to (m - 1)do
begin
if pos(' ', s) <> 0 then
begin
n := pos(' ', s);
for k := 1 to (n - 1)do
begin
q := q + s[k];
end;
a[j].weight := strtofloat(q);
q := '';
delete(s, 1, n);
end
else
begin
for k := 1 to length(s)do
begin
q := q + s[k];
end;
a[j].weight := strtofloat(q);
q := '';
end;
end;
end;
l := 2 * m - 1;
setlength(p, l);
for i := 0 to m - 1do
begin
p.weight := a.weight;
p.parent := 0;
p.lchild := 0;
p.rchild := 0;
end;
for j := m to l - 1do
begin
p[j].weight := 0;
p[j].parent := 0;
p[j].lchild := 0;
p[j].rchild := 0;
end;
setlength(b, l);
for i := 0 to l - 1do
b := p.weight;
for i := m to l - 1do
begin
select(p, i);
p[s1].parent := i;
p[s2].parent := i;
p.lchild := s1;
p.rchild := s2;
p.weight := p[s1].weight + p[s2].weight;
b := p.weight;
end;

writeln('结构状态图....');
for i := 0 to (l - 1)do
writeln('NO:' + inttostr(i) + ' ' + 'W:' +
floattostr(p.weight) + ' ' + 'P:' + inttostr(p.parent) + ' ' +
'L:' + inttostr(p.lchild) + ' ' + 'R:' + inttostr(p.rchild));
writeln('赫夫曼编码....');
setlength(np, m);
for i := 0 to m - 1do
begin
ci := i;
while p[ci].parent <> 0do
begin
if p[p[ci].parent].lchild = ci then
np := '0' + np;
if p[p[ci].parent].rchild = ci then
np := '1' + np;
ci := p[ci].parent;
end;
end;

for i := 0 to m - 1do
writeln('NO:' + inttostr(i) + ' ' + 'Cod:' + np);
Writeln('按Enter键退出');
Readln;
end.
 
呵呵..你太牛拉~~!!强人啊..这是你专门写出来让我看的么??
  不过我还知道你说我的输入没有存进去,可是好象没有这样吧..我还是不太知道我哪错了..
 
还有, 你的SELECT函数,形参SHUZU在里面没有用到呀..可以不要吧
 
power255还在么?
 
接受答案了.
 

Similar threads

I
回复
0
查看
657
import
I
I
回复
0
查看
639
import
I
后退
顶部