pascal程序错误?

来源:百度知道 编辑:UC知道 时间:2024/05/22 17:39:57
请问各位大虾 下面的程序错在哪里?
program book(input,output);
type xinx=record
bz:char;
v,w:integer;
end;
var a:array[1..30]of xinx;
m,k,i,l,o,qian,sum,n,p:integer;
t:xinx;
begin
read(k,m); writeln;
for i:=1 to m do
begin
read(a[i].bz);writeln;
read(a[i].v,a[i].w);
end;
n:=1; l:=2;
repeat
repeat
if a[n].w<a[l].w then
begin
t:=a[n]; a[n]:=a[l]; a[l]:=t;
end;
l:=l+1;
until l>m;
n:=i+1; l:=i+1;
until i=m;
qian:=0; sum:=0; p:=1;
repeat
if a[p].bz='y' then
begin
qian:=qian+a[p].v;
sum:=sum+a[p].w;
end;
p:=p+1;
until (qian>=100)or(p>m);
write(sum);
end.

PS:错误106

上面的嘈杂声你先别听;
现在我告诉关于这道题目出现错误的真正原因。
我知道你要的输入方式
第一行输入一个数m,第2到m*2+1行分别输出每一个指针的字符类型和两个整型类型,而且每一个指针输入时的第一行是一个字符,第二行是两个整型类型。
现在分析你的输入方式
read(m);writeln;
你肯定认为输入这个数m,程序就会自动换行吧。
其实不然,从屏幕中输入一个数,系统只会等你按回车键后才会真正让程序读入这个数字,否则是不以考虑的,等你按了回车时,系统又输出了一个回车符,因为write开头就是输出东西,就又多了一个空行。
read(a[i].bz);writeln; 也是一样
你从屏幕读入一个字符,只有按回车,系统才会识别,所以这种读入方式是错的。
既然屏幕中输入是错,那文本读入呢?文本读入的其实跟手动差不多
就是
assign(input,'xx.in');assign(output,'xx.out');
…………的那种。
如果你从文本读入,系统是会自动辨别的。
你的xx.in文本中的内容一定是
m
a[1].bz
a[1].v a[1].w
a[2].bz
a[2].v a[2].w
………………
a[m].bz
a[m].v a[m].w

程序读取文本时先读入数字m,那么程序接下去的操作是writeln;
就是在输出文件xx.out中输出一个空行。然后再read(a[i].bz);
这时xx.in的输入文件并没有换行,光标还是m的后面,这时错误就产生了,程序读入了m后面的回车符(文本和屏幕中是不显示的,在word office中可以看到),而不是读入真正的a[i].bz。好了,这时回车符读进,xx.in的输入文件换行,你的下一步操作是read(a[i].v,a[i].w);
这时你要读入整形,原来的a[i].bz还没有正式读入,程序就把字符型当作整型输入,这是就出现了106错误,就是类型错误error 106。

至于修