网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
12月07日漏签0天
pascal吧 关注:14,947贴子:132,317
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 21回复贴,共1页
<<返回pascal吧
>0< 加载中...

求助

  • 只看楼主
  • 收藏

  • 回复
  • 红色之子
  • 合并果子
    2
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
这个二叉树的程序
在运的时候无论怎么改都是106号错误
const m=200;
type
node=record
data: char;
prt,lch,rch:integer;
end;
treetype=array[1..m] of node;
var tree:treetype;
n,i,j,p:integer;
procedure preorder(i:integer);
begin
if i<>0 then
begin
write(tree[i].data);
preorder(tree[i].lch);
preorder(tree[i].rch);
end;
end;
procedure inorder(i:integer);
begin
if i<>0 then
begin
inorder(tree[i].lch);
write(tree[i].data);
inorder(tree[i].rch);
end;
end;
begin
assign(input,'work1.in'); reset(input) ;
assign(output,'work1.out'); rewrite(output);
fillchar(tree,sizeof(tree),0);
read(n);
for i:= 1 to n do
begin
read(tree[i].data);
read(j); {就是这里}
if j<>0 then
begin
tree[i].lch:= j;
tree[j].prt:=i;
p:=j;
repeat
read(j);
if j<>0 then begin
tree[p].rch:=j;
tree[j].prt:=p;
p:=j;
end;
until j=0;
end;
writeln;
end;
preorder(1);
writeln;
inorder(1);
close(input);
close(output);
end.


  • 红色之子
  • 合并果子
    2
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
为了拿经验这是多么标准的十五字


2025-12-07 01:02:22
广告
不感兴趣
开通SVIP免广告
  • 应无雨
  • begin
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
虽然我看不懂,不过我拷贝过去编译,居然顺利一把过,毫无问题。


  • YZZZZ-Z
  • read
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
原题:
1.按照先根次序和后根次序遍历普遍有序树(work1.pas)
输入一棵普通有序树,输出该树的先根次序和后根次序。
输入(work1.in):第一行顶点数n(1≤n≤200),以下含n行,其中第i行(1≤i≤n)的元素依次为结点i的数据值ai,以后各元素为结点i的儿子序列,以0结束。若ai后仅含一个0,则说明结点i为叶子结点。
输出(work1.out):共2行,第一行输出这棵有序树的先根遍历,第二行输出这棵有序树的后根遍历。
右图对应的输入信息为
18
r2 3 4 0
a5 6 0
b7 0
c8 9 10 0
w0
x11 12 0
f0
s13 14 0
t0
u0
d15 0
e0
i16 17 18 0
j0
h0
m0
o0
h0


  • Axiom
  • for
    13
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
type
treetype=record
data:char;
parent,left,right:longint;
end;
var
tree:array [0..200] of treetype;
i,n:longint;
procedure change;
var i,j:longint; s:char;
begin
for i:=1 to n do
begin
read(s); read(j);
tree[i].data:=s;
if j<>0
then begin
tree[i].left:=j; tree[j].parent:=i;
repeat
read(j);
if j<>0
then begin
tree[j-1].right:=j;
tree[j].parent:=j-1;
end;
until j=0;
end;
readln;
end;
end;
procedure preorder(i:longint);
begin
if i<>0
then begin
write(tree[i].data);
preorder(tree[i].left);
preorder(tree[i].right);
end;
end;
procedure inorder(i:longint);
begin
if i<>0
then begin
inorder(tree[i].left);
write(tree[i].data);
inorder(tree[i].right);
end;
end;
begin
assign(input,'work1.in'); reset(input);
assign(output,'work.out'); rewrite(output);
readln(n);
change;
preorder(1); writeln;
inorder(1);
close(input); close(output);
end.


  • ldtxhlg
  • A+B
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
很强…话说fpc确实偶有莫名其妙的错误……


  • tjpyy
  • 方格取数
    4
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
问题已解决!
问题已解决!
问题已解决!
重要的事情说三遍
我知道你们想说什么。有图有真相。最后一行


  • tjpyy
  • 方格取数
    4
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
这段程序有两个问题。
如果从const算第1行的话,
===
1)第34行的read应改为readln
===
2)第53行writeln应改为readln
===
34行的问题是关键。这导致了106错误。并不是编译器版本问题。read是直接找从光标开始符合类型的数据,而readln是先把光标调到下一行,然后从光标开始找符合类型的数据。如果用read,在34行读完n之后,下一个要读的数据是字符(37行),楼主的read导致n后面那个回车符被读进来了。这并不影响n的值,但是会影响后面的读入,因为这导致了数据错位。(说到这里懂的人就懒得往下看了,因为重点已经说完)
===
37行把回车符读进来也没问题,因为char确实可以储存回车符。之后那个38行也没问题,因为你输入的是数字,可以看成字符。直到这一行结束,就有问题了。也就是楼主说的38行{就是这里}那个地方。前面的数据错位导致了这里数据类型错误。于是106
===
其实,5楼的答案已经是正解。楼主细心一点的话就能发现,5楼读n的时候就是用readln。这一个差别很大。
===
53行是楼主多此一举了,只是重起一行,readln即可,用writeln的话会导致,每输入一行,就多打一行空,而且用writeln同样会导致数据错位。
===
也就是说,只有两个地方都改掉,才能避免106
===
除此之外,楼主递归代码没有任何问题。经检验算法正确。
楼主你是不是抄书的时候没抄仔细,或者不认识readln这几个字母呢


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 21回复贴,共1页
<<返回pascal吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示