宁波市第25届小学生计算机程序设计竞赛试题和答案 下载本文

end; begin

f[1]:=1;f[2]:=1;

for i:=3 to 46 do f[i]:=f[i-1]+f[i-2]; readln(n,x,y);

for i:=1 to n do a[i]:=3*i-1; i:=1;

while f[i]-1

for j:=n+1 to f[i]-1 do a[j]:=maxlongint; count:=0;j:=find(i,1,x); writeln(j,' ',count);

count:=0;j:=find(i,1,y); writeln(j,' ',count); end. 【输入】: 【输出】: 8 14 7 _________ _________ 四.程序填空(第1题每空2分,第2题每空3分,共28分)

1、人数统计

有二幢高楼,已知:

(1)第一幢高楼的各层上男性人数与第二幢高楼的同一层上的男性人数的差; (2)第一幢高楼的各层上女性人数与第二幢高楼的同一层上的女性人数的差; 求第一幢高楼的各层上总人数与第二幢高楼的同一层上的总人数的差; 输入:第1行二个整数n1和n2。

第2行至第n1+1行,每行二个整数a1和b1。表示第b1层男性人数的差额

为a1。

第n1+2行至第n1+n2+1行,每行二个整数a2和b2。表示第b2层女性人

数的差额为a2。

输出:每行二个整数a和b,表示第b层总人数的差额为a。 请注意:

(1)输入时,如果某一层上二幢楼均没有男性(或女性),则不输入该层的差额情况

(2)输出时,如果某一层上二幢楼均没有人,则不输出该层的差额情况 (3)输入和输出时,均按照层数递增的次序。 请将程序补充完整。 【样例输入】 3 2 1 1 5 2 6 7 -5 2 3 4 【样例输出】 1 1 0 2 3 4 6 7 【样例说明】 输入:男性第1层差1,第2层差5,第7层差6 女性第2层差-5,第4层差3 输出:总人数第1层差1,第2层差, 第4层差3,第7层差6

Program xx2010_5;

var a1,a2,b1,b2,a,b:array[1..100]of longint; n1,n2,n,i,j:longint;

begin

readln(n1,n2);

for i:=1 to n1 do read(a1[i],b1[i]); for i:=1 to n2 do read(a2[i],b2[i]); i:=1;j:=1; ① ; while ② do begin

if b1[i]=b2[j] then begin

a[n]:= ③ ;b[n]:= ④ ; i:=i+1;j:=j+1;n:=n+1;

end else if b1[i]

a[n]:=a2[j];b[n]:=b2[j]; j:=j+1; n:=n+1; end; end;

while i<=n1 do begin

a[n]:=a1[i];b[n]:=b1[i]; i:=i+1;n:=n+1; end;

while j<=n2 do begin

a[n]:=a2[j];b[n]:=b2[j]; j:=j+1;n:=n+1; end;

⑤ ;

for i:=1 to n do

writeln(a[i],' ',b[i]); end.

2、表达式求值

堆栈是一种后进先出的数据结构,实际编程时,常常以数组来模拟堆栈。

以下程序计算包含“+”、“-”、“*”、“(”、“)”和正整数的一个表达式的值。以数组num和数组code作为二个堆栈。其中堆栈num用来存储表达式中的数值以及计算的中间结果,堆栈code用来存储表达式中的运算符号。最终结果存储在num[1]中,程序输出最终求得的一个整数值num[1]。

程序逐字符扫描表达式:

1、如果是运算数,则直接进运算数栈num。

2、如果是运算符:

2.1如果当前运算符级别低于或相同于位于运算符栈顶的前一个运算符的级别,则: 2.1.1 在运算数栈中出栈两次,得到a,b; 2.1.2运算符栈出栈,得运算符p;

2.1.3 将a和b在运算p下的计算结果入运算数栈;

2.1.4当前运算符继续与位于运算符栈顶的前一个运算符比较;

2.2如果当前运算符级别高于位于运算符栈顶的前一个运算符级别,则当前运算符进栈:

3、左括号最高级。右括号最低级

3.1因此,遇左括号时,左括号入栈;但左括号在栈内时,级别低于任何其它符号! 3.2遇右括号时,一直作运算,直至遇上左括号,则简单地作左括号出栈即可,且此时右括号不进栈;

为方便起见,程序会在输入的表达式前后加上一对括号。另外,输入数据保证是正确的。请将程序补充完整。

Program xx2010_6; 【样例输入】 var s:ansistring; 12+2*34+(45-5)*(6+7) n,i,tc,tn:longint; x,y:extended; 【样例输出】 num:array[1..1001]of extended; 600 code:array[1..1001]of char;

function cal(x,y:extended;c:char):extended;//计算x和y在运算c下的值 begin

if c='-' then cal:=x-y

else if c='+' then cal:=x+y else cal:=x*y; end;

function prio(x,y:char):boolean;//前一个运算符x比后一个运算符y级别高吗? begin

if x='(' then prio:=false

else if x='*' then prio:=true

else if (x='+')and((y='+')or(y='-'))then prio:=true else if (x='-')and((y='+')or(y='-'))then prio:=true else prio:=false; end;

begin

readln(s); ⑥ ; n:=length(s);

x:=0;tc:=0;tn:=0;

for i:=1 to n do begin //逐字符扫描输入的表达式

if (s[i]>='0')and(s[i]<='9') then //第i个字符是数字

x:=x*10+ord(s[i])-ord('0') //得到连续数字表示的整数值,存储在变量x中

else begin

if x<>0 then begin //前面已经得到正整数值,当前数字x进入数字栈 tn:=tn+1;num[tn]:=x; x:=0;end;

if s[i]='(' then begin //第i个字符为左括号,入符号栈 tc:=tc+1;code[tc]:=s[i];end

else if s[i]=')' then begin //第i个字符为右括号

while ⑦ do begin tn:=tn-1;

num[tn]:= ⑧ ; tc:=tc-1; end;

⑨ ; end else begin //第i个字符为+,-,*

while prio(code[tc],s[i]) do begin tn:=tn-1;

num[tn]:= ⑧ ; tc:=tc-1; end;

tc:=tc+1;

⑩ ; end; end; end;

writeln( ⑾ ); end.

宁波市第25届中小学计算机程序设计竞赛

小 学 组 初 赛 答 案

一、单项选择题(每题1.5分,共计30分) 1 A 11 D 2 B 12 C 3 A 13 B 4 A 14 C 5 D 15 A 6 D 7 C 8 B 9 A或C 10 D 二、问题求解(共2题,每题5分,共10分)

1、13*6*12*4=3744 2、第1堆取1枚

三、阅读程序,求程序运行输出结果(共4题,每题8分,共32分)

1、8_______ __ 2、8 4 4 6 3、69________________ 4、5 2 ________________ 1000101___________ 4________________

四、程序填空(前5空,每空2分,后6空每空3分,共28分)

0

① n:=1 _______________

②(i<=n1) and (j<=n2)必须有二个括号,and前后可以没有空格,前后可以再加

一个括号

③ a1[i]+a2[j]或a2[j]+a1[i] ④ b1[i]或b2[j] _________ ⑤ n:=n-1或dec(n)或dec(n,1) _____

⑥ s:='('+s+')' ____ ⑦ code[tc]<>'(' 前后可以有括号 ⑧

cal(num[tn],num[tn+1],code[tc])

⑨tc:=tc-1或dec(tc)或dec(tc,1) ⑩ code[tc]:=s[i]________ ⑾ num[1]:0:0___________