请各位高人帮我看看这个Pascal程序里哪里出错了?运行后输出的是空白。。。

题目是:(2006 Noip 普及组复赛试题第一题)
明明的随机数
(random.pas/c/cpp)
【问题描述】
明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。
【输入文件】
输入文件random.in 有2行,第1行为1个正整数,表示所生成的随机数的个数:
N
第2行有N个用空格隔开的正整数,为所产生的随机数。
【输出文件】
输出文件random.out 也是2行,第1行为1个正整数M,表示不相同的随机数的个数。第2行为M个用空格隔开的正整数,为从小到大排好序的不相同的随机数。
【输入样例】
10
20 40 32 67 40 20 89 300 400 15
【输出样例】
8
15 20 32 40 67 89 300 400

我的程序是:

program random;
var m,n:longint;
i,j,k:longint;
a:array[1..1000] of longint;
begin
assign(input,'random.in');reset(input);
assign(output,'random.out');rewrite(output);
readln(n);
for i:=1 to n do readln(a[i]);
for i:=1 to n-1 do
for j:= i+1 to n do
if a[i]>a[j] then
begin
k:=a[i];
a[i]:=a[j];
a[j]:=k;
end;
k:=0;
for i:=1 to n-1 do
if a[i]=a[i+1] then
begin
a[i]:=0;
k:=k+1;
m:=n-k;
end;
writeln(m);
for i:=1 to n do
if a[i]<>0 then write(a[i],' ');
close(input);
close(output);
end.

你这里有两问题,首先题目中“第2行有N个用空格隔开的正整数,为所产生的随机数。”你不应该用readln读入,这样你只能读入第一个数然后就换行读入了,因为后面文件没有内容,pascal将自动补零,就是说你读进来的永远是第一个数字和n-1个零。
第二个是你的输出,“第2行为M个用空格隔开的正整数,为从小到大排好序的不相同的随机数。”你的输出应该是m个数,每两个数之间有一个空格同时以回车结尾,而你的输出是m个数每个数后有一个空格,就是说行末会多出一个空格,这样你的输出看起来和标准输出一样实际上是一分都得不到的。另外,一般题目不说,输出文件也应该以回车结尾,noip08浙江省分数太高后来就是用这个卡分数来着。
像真正复赛比赛的时候算法固然重要,输入输出格式几乎是同等重要的,向你这样不注意的话,一道会的题目100分没了,不是要悔的肠子都青了,多少前辈鲜血换来的教训啊.....
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-11-08
刚开始读进错了,将readln(a[i])改为read(a[i])就行,
其实你可以用repeat,边读边比较和去除重复的.
第2个回答  2011-11-08
读入应用read 输出最后 最好加个writeln

请各位高人帮我看看这个Pascal程序里哪里出错了?运行后输出的是空白...
第二个是你的输出,“第2行为M个用空格隔开的正整数,为从小到大排好序的不相同的随机数。”你的输出应该是m个数,每两个数之间有一个空格同时以回车结尾,而你的输出是m个数每个数后有一个空格,就是说行末会多出一个空格,这样你的输出看起来和标准输出一样实际上是一分都得不到的。另外,...

关于PASCAL语言的,下面这个程序我不知道错哪里了,输入数之后,运行...
楼主,你好:首先程序退不回去,是死循环,是因为你打的是readln,而readln是输入一个数回车一次,这是第一个错误,应把输入时的readln删掉ln变成read。这时候你再输出会发现他输出了不止100遍,这是因为第四行多加了一个begin所以说输出的时候也归属于第三行的循环语句,而i和j每加一个数它就输出一...

这个pascal程序错在哪里,怎么办
程序本身没有错误,但是可能与你的本意不同。你的本意可能是,如果结果是整数(数学意义上的,不是程序意义上的),输出结果也是整数;如果结果有小数,则输出带两位小数的数值。如果是这样,应该用下面的判断(这个判断也可能失灵,因为你输入的是实形数)if abs(c-x)< 1e-6 then writeln('斜边=...

求助:这个pascal程序哪里出错了
好像single是VB中的一个类型吧,在pascal中没有这个吧。其他的语法错误应该没了,“f:=0;”这里的分号应该是楼主自己打错了吧。最后只想问一下楼主这个程序是什么意思?上面定义判断素数的函数,然后下面的for循环中先判断i是否mod 6=1 ,也就是判断它是否是7的倍数,然后在判断素数又有何意义呢?

pascal程序错误?
其实不然,从屏幕中输入一个数,系统只会等你按回车键后才会真正让程序读入这个数字,否则是不以考虑的,等你按了回车时,系统又输出了一个回车符,因为write开头就是输出东西,就又多了一个空行。read(a[i].bz);writeln; 也是一样 你从屏幕读入一个字符,只有按回车,系统才会识别,所以这种读入...

我的pascal程序错在哪里
c1);if a1=1 then writeln(min(b1,c1))else begin\/\/不妨令此begin为2号 s[b1]:=c1;x[getblock(b1)]:=getmin((getblock(b1)-1)*b+1,getblock(b1)*b);end;\/\/此处系统会默认为是begin2号 的end end.此处为整个程序的end.可是begin1号没有找到end,所以就出错了 希望能够帮上忙 ...

我是pascal 初学者。 不知道一下的代码哪里有错,运行程序以后,什么都没...
揣测了LZ的意向,修改为如下程序:program jeu_de_la_vie;USES Crt;var TAB : array[1..40,1..80] of boolean;A : integer;B : integer;begin ClrScr;Randomize;for A:= 1 to 40 do for B:= 1 to 80 do TAB[A][B]:= odd(random(10));readln;for A:= 1 to 80 do for B:...

帮忙看看我这pascal的程序的计算错在哪里了,应该怎样改?
program PI(input,output);var n,i:longint; s:real;begin readln(n);s:=1;for i:=1 to n do if i mod 2 =1 then s:=s-1\/i else s:=s+1\/i;writeln(s:0:4);end.

这个PASCAL程序哪里错了?(入门)
1.你的程序和楼上的程序错在了没有考虑到某两条边相加等于第三边的情况 2.程序不够简洁 程序如下 program exdd;var a,b,c:real;begin readln(a,b,c);if ((a+b)>c) and ((a+c)>b) and ((c+b)>a) then writeln (a+b+c) else writeln('NO');readln;end.你看,知识改了一...

这个PASCAL程序错在哪里?(入门)
c:=1 是赋值语句 不能{if (c:=2) then}(不能做为判断条件)你这句话的意思就是 {如果c赋值为2 那么} 是不通的 应该改为 {if (c=2) then } ={如果c等于2 那么}

相似回答