华舍实验学校信息学竞赛练习二1.docx
《华舍实验学校信息学竞赛练习二1.docx》由会员分享,可在线阅读,更多相关《华舍实验学校信息学竞赛练习二1.docx(62页珍藏版)》请在冰豆网上搜索。
华舍实验学校信息学竞赛练习二1
4.2填空题
4.29下面的程序从键盘接收任意6个数放入数组a中,设这6个数为:
8 1 4 2 5 6,则可输出一个具有如下内容的方阵。
8 1 4 2 5 6
6 8 1 4 2 5
5 6 8 1 4 2
2 5 6 8 1 4
4 2 5 6 8 1
1 4 2 5 6 8
请填空完成该程序。
PROGRAMp429(Input,Output);
VARa:
ARRAY[1..6]OFInteger;
i,j,k:
Integer;
BEGIN
FORi:
=1TO6DO
Read();
Readln;
FORi:
=1TO6DO
BEGIN
IFi=1THENk:
=1
ELSEk:
=();
FORj:
=1TO()DO
BEGIN
Write(a[k]:
2);
IFk=6THENk:
=1
ELSEk:
=()
END;
Writeln
END
END.
4.30下面的程序最多可输入100位学生的姓名,姓名全由大写英文字母组成,输入‘?
’后则停止输入,然后按字典顺序输出这些姓名。
请填空完成该程序。
PROGRAMp430(Input,Output);
CONSTmax=100;length=20;
TYPEstring=PACKEDARRAY[1..length]OFChar;
VARname:
ARRAY[1..max]OFstring;
t:
string;
i,j,count:
Integer;
BEGIN
i:
=1;
Readln(name[i]);
WHILEname[i]<>’?
’DO
BEGIN
();
Readln(name[i])
END;
count:
=();
FORi:
=1TO()DO
BEGIN
FORj:
=i+1TOcountDO
IFname[i]()name[j]THEN
BEGIN
t:
=name[i];
name[i]:
=name[j];
name[j]:
=t
END;
Writeln()
END
END.
4.31在下列程序中,当输入一个给定的数n后,能输出所有不超过n的、其平方由左右对称的数字组成的数。
例如:
n=23,则输出:
1,2,3,11,22。
它们的平方依次是:
1,4,9,121,484,都是左右对称的数字组成的数。
请填空完成该程序。
PROGRAM p431(Input,Output);
CONSTmax=1000;
VARm,n,i,j,s:
Integer;
d:
ARRAY[0..max]OFInteger;
BEGIN
Readln(n);
FORm:
=1TOnDO
BEGIN
{计算m的平方且存放于s}
()
{把组成数s的每位数字存放入数组d中}
j:
=0;
WHILEs>0DO
BEGIN
j:
=j+1;
d[j]:
=sMOD10;
()
END;
{判断组成数s的数字是否左右对称}
i:
=1;
WHILE(d[i]=d[j])AND(iBEGIN
i:
=i+1;j:
=j-1
END;
{若对称则输出}
IFi>=jTHENWriteln()
END
END.
4.32*下面程序实现将数组a赋予如下的值,请填空完成该程序。
1 1 1 1 1
4 1 1 1 1
3 4 1 1 1
2 3 4 1 1
1 2 3 4 1
PROGRAM P432;
VARa:
ARRAY[1..5,1..5]OFInteger;
i,j,k:
Integer;
BEGIN
FORi:
=1TO5DO
FORj:
=1TO5DO
IF(i-j=4)OR()THENa[i,j]:
=1
ELSEBEGIN
k:
=();
CASEkOF
1:
a[i,j]:
=4;
2:
a[i,j]:
=();
3:
a[i,j]:
=2
END;
END
END.
4.33下面程序将n个学生的英文成绩从键盘输入,按0~59分、60~69分、70~79分、80~89分和90~100分分组统计人数。
PROGRAMp433(Input,Output);
CONSTn=20;
VARi,k:
Integer;
s:
ARRAY[1..5]OFInteger;
a:
ARRAY[1..n]OFInteger;
BEGIN
FORi:
=1TO()DO
s[i]:
=0;
FORi:
=1TO()DO
BEGIN
();
IFa[i]>=90THENk:
=1
ELSEIFa[i]>=80THENk:
=2
ELSEIFa[i]>=70THENk:
=3
ELSEIFa[i]>=60THENk:
=4
ELSEk:
=5;
s[k]:
=()
END;
Readln;
FORi:
=1TO5DO
Write(s[i]:
3);
Writeln
END.
4.34类型arr为:
TYPE arr=ARRAY[1..16]OFInteger;,已知数组a中有15个整数已按从小到大的顺序排列,过程insertone把任意整数b填入a中并使a中数据仍然有序。
PROCEDUREp434(VARa:
arr;b:
Integer);
VARk:
Integer;
BEGIN
k:
=();
WHILE(k>1)AND()DO
BEGIN
a[k]:
=a[k-1];
k:
=k-1
END;
a[k]:
=()
END;
4.35*下面程序从键盘一个m*n(m,n<=10)的矩阵存入数组a,从矩阵左上角开始,以从右上到左下的斜线方向为顺序输出所有元素的值。
例如有4*5的矩阵为
12345
678910
1112131415
1617181920
则输出顺序是
1,2,6,3,7,11,4,8,12,16,5,9,13,17,10,14,18,15,19,20
PROGRAMp435(Input,Output);
VARi,j,k,m,n:
Integer;
a:
ARRAY[1..10,1..10]OFInteger;
BEGIN
Readln(m,n);
FORi:
=1TOmDO
BEGIN
FORj:
=1TOnDO
Read(a[i,j]);
Readln
END;
FORk:
=1TOm+n-1DO
BEGIN
IFk<=nTHEN
BEGIN
i:
=();
j:
=();
END;
ELSEBEGIN
I:
=k-4;
J:
=5;
End;
WHILE(i<=m)AND(j>=1)DO
BEGIN
Write(a[i,j],’,’);
i:
=();
j:
=j-1;
END;
End;
Writeln;
END.
4.36以下程序实现从终端按行读入一个4*4的二维数组,分别求出其主、次对角线上元素之和,其中变量sumz用以累加主对角线元素的和,sumc用以累加次对角线元素之和。
请在( )处填入正确内容。
PROGRAMp436(Input,Output);
VAR
a:
ARRAY[1..4,1..4]OFInteger;
n,m,sumz,sumc:
Integer;
BEGIN
FORn:
=1TO4DO
FORm:
=1TO4DO
Readln();
sumz:
=0;sumc:
=0;
FORn:
=1TO4DO
BEGIN
sumz:
=sumz+();
m:
=();
sumc:
=sumc+a[n,m]
END;
Writeln(sumz:
3,sumc:
3)
END.
4.37以下程序实现:
对输入的一个5╳5方阵,判别它是否为幻方。
幻方具有如下性质:
它的每行、每列和两个对角线上的元素之和都相等。
请在( )处填入正确内容。
PROGRAMp437(Input,Output);
VAR
a:
ARRAY[1..5,1..5]OFInteger;
z,f,colum,line,i,j:
Integer;
yes:
Boolean;
BEGIN
FORi:
=1TO5DO
BEGIN
FORj:
=1TO5DORead(a[i,j]);
Readln;
END;
z:
=0;f:
=0;yes:
=True;
FORi:
=1TO5DO
BEGIN
colum:
=0;line:
=0;
FORj:
=1TO5DO
BEGIN
line:
=line+a[i,j];
colum:
=colum+();
IFi=jTHENz:
=z+a[i,j];
IFi+j=6THENf:
=f+a[i,j];
END;
IFline<>columTHEN();
END;
IFNOTyesOR(z<>f)OR(f<>line)THEN
Writeln(‘ItisNOTmagicsquare!
’)
ELSE
Writeln(‘Itismagicsquare!
’)
END.
4.38*程序中调用过程merge把按升序存放在a,b数组中的两个数列归并到c数组中,归并后的数列仍按升序存放。
请在( )处填入正确内容。
PROGRAMp438(Input,Output);
CONST
MA=5;MB=3;MC=MA+MB;
TYPEarra=ARRAY[1..MA]OFInteger;
arrb=ARRAY[1..MB]OFInteger;
arrc=ARRAY[1..MC]OFInteger;
VAR
a:
arra;b:
arrb;c:
arrc;i:
Integer;
PROCEDUREmerge(a:
arra;b:
arrb;VARc:
arrc);
VAR
i,IA,IB,IC:
Integer;
BEGIN
IA:
=1;IB:
=1;IC:
=1;
WHILE(IA<=MA)AND(IB<=MB)DO
BEGIN
IFa[IA]<=b[IB]THEN
BEGIN
c[IC]:
=();
()
END
ELSE
BEGIN
c[IC]:
=();
()
END;
IC:
=IC+1
END;
IF(IA<=MA)THEN
FORi:
=IATOMADO
BEGIN
c[IC]:
=();
IC:
=IC+1
END;
IF(IB<=MB)THEN
FORi:
=IBTOMBDO
BEGIN
c[IC]:
=();
IC:
=IC+1
END;
END;
BEGIN
FORi:
=1TOMADO
a[i]:
=i+i;
FORi:
=1TOMBDO
b[i]:
=i*i;
MERGE(a,b,c);
FORi:
=1TOMADO
Write(a[i]:
3);
Writeln;
FORi:
=1TOMBDO
Write(b[i]:
3);
Writeln;
FORi:
=1TOMCDO
Write(c[i]:
3);
Writeln
END.
4.3阅读程序
4.39*设有如下程序:
PROGRAMP439(Input,Output);
VARr1:
RECORD
a:
Integer;
r2:
RECORD
a1:
0..1000;
b:
ARRAY[1..5,1..5]OFInteger;
END;
END;
i,j:
Integer;
BEGIN
WITHr1,r2DO
BEGIN
a:
=0;a1:
=0;
FORi:
=1TO5DO
FORj:
=1TO5DO
b[i,j]:
=i+j-1;
FORi:
=1TO5DO
BEGIN
a:
=a+b[i,i];
FORj:
=1TO5DO
IFi+j=6THEN
a1:
=a1+b[i,j];
END;
Writeln(a:
2,’’,a1:
2);
END;
END.
给出该程序的运行结果。
4.40设有矩阵A:
2 1 2
A= 2 3 1
2 2 1
(1)执行语句
FOR i:
=1TO3DO
FORj:
=1TO3DO
c[i,j]:
=a[a[i,j],a[i,j]]
后,C的结果是什么?
(2)执行语句
FOR i:
=1TO3DO
FORj:
=1TO3DO
a[i,j]:
=a[a[i,j],a[i,j]]
后,a的结果是什么?
4.41有如下程序:
PROGRAMp441(Input,Output);
VARi,j,y:
Integer;
A:
ARRAY[1..8]OFInteger;
BEGIN
i:
=1;y:
=18;
WHILEy>0DO
BEGIN
a[i]:
=yMOD2;
y:
=yDIV2;
i:
=i+1
END;
FORj:
=i-1DOWNTO1DO
Write(a[j]);
Writeln
END.
给出该程序的运行结果。
4.42有以下程序:
PROGRAMp442(Input,Output);
CONST
N=6;
TYPE
colarr=ARRAY[1..N]OFInteger;
VAR
a:
colarr;i,j,p,t:
Integer;
BEGIN
FORi:
=1TOnDORead(a[i]);
Readln;
FORj:
=1TOn-1DO
BEGIN
p:
=j;
FORi:
=jTOnDO
IFa[i]=i;
t:
=a[p];a[p]:
=a[j];a[j]:
=t;
END;
FORi:
=1TOnDO
BEGIN
Write(a[i]:
2);
IF(iMOD3)=0THENWriteln
END
END.
若输入指定数据:
7 2 5 1 9 4<回车>,给出程序的运行结果。
4.43有以下程序:
PROGRAMp443(Input,Output);
VAR
i,j,n,temp:
Integer;
a:
ARRAY[1..100]OFInteger;
flag:
Boolean;
BEGIN
Read(n);
FORi:
=1TOnDORead(a[i]);
Readln;
flag:
=True;i:
=1;
WHILE(i<=n-1)ANDflagDO
BEGIN
flag:
=False;
FORj:
=1TOn-1DO
IFa[j]>a[j+1]THEN
BEGIN
temp:
=a[j];
a[j]:
=a[j+1];
a[j+1]:
=temp;
flag:
=True
END;
i:
=i+1
END;
FORi:
=1TOnDO
Write(a[i]:
2);
Writeln
END.
若输入指定数据:
6 1 7 2 3 6 7<回车>,给出程序的运行结果。
5.2填空题
5.48、过程sum按参数mode指出的方式,计算二维数组a中的各行或各列元素之和,并把它存入一维数组b中,
mode=’r’时将数组中第i行元素之和存入b[i]
mode=’c’时,将数组中第i列元素之和存入b[i]
i=(1,2,3,…N)
有关常数和类型定义如下:
CONSTN=32;
TYPEAT=ARRAY[1..N,1..N]OFInteger;
BT=ARRAY[1..N]OFInteger;
请在()内填上适当内容。
proceduresum(vara:
AT;varb:
BT;mode:
char);
VARi,j:
Integer;
BEGIN
FORi:
=1TONDO();
FORi:
=()DO
FORj:
=()DO
CASEmodeOF
‘r’:
();
‘c’:
();
END
END;
5.49、*已知有函数定义:
FUNCTIONfn(a,b,c:
Real):
Real;
BEGIN
fn:
=sin(a)/(sin(a-b)*sin(a-c))
END;
请填写完整的调用此函数的语句计算下列m值:
m=
+
+
调用语句:
m:
=()
5.50、*已知函数说明如下:
functionfun(n:
integer):
integer;
begin
ifn=0thenfun:
=0
elseifn>0thenfun:
=fun(n-2)
elsefun:
=fun(n+3)
end;
则函数调用fun(5)的值为(),它共执行了()次函数体,fun(fun(-2))的值为(),它共执行了()次函数体。
5.51PASCAL中值形参与变量形参的主要区别是:
()的改变不影响实参的值,而()的改变影响影响实参的值。
5.52、设有过程说明:
proceduresilly(x:
integer;vary:
integer);
var
z:
integer;
begin
x:
=10;y:
=12;z:
=14
end;
执行以下语句后输出结果为( );
x:
=1;y:
=2;z:
=3;
silly(y,x);
writeln(x:
2,y:
2,z:
2);
5.54、设有一函数子程序定义如下:
functionfun(x,y,z:
integer):
integer;
begin
fun:
=z-ydivx;
end;
执行语句m:
=fun(fun(2,4,6),6,8)后变量m的值是()
5.55、设有以下函数说明:
functiondigit(num,pos:
integer):
integer;
vari:
integer;
begin
num:
=abs(num);
fori:
=1topos-1do
num:
=numdiv10;
digit:
=nummod10
end;
则执行函数调用语句digit(31965,2)后的函数值为()
执行函数调用语句digit(4650,6)后的函数值为()
5.56*过程binary按主程序传递过来的参数,实现折半查找,其中x为待查找数,a为一个有序的一维数组,n为数组元素个数,found为是否查找到的标志。
请在( )内填入适当的内容。
PROCEDUREbinary(x:
Integer;a:
arr1;n:
Integer);
VAR
low,high,mid:
Integer;
found:
Boolean;
BEGIN
low:
=1;high:
=();found:
=False;
WHILE()AND(NOTfound)DO
BEGIN
mid:
=();
IF(x>a[mid])THEN
()
ELSEIF(x()
ELSE
()
END;
IF()THENWriteln(‘found:
’,a[mid]:
3)
ELSEWriteln(‘notfound’)
END;
5.57*填空完成下列函数comp,其功能是:
计算方阵a中各奇数行元素的最大值减去a中各偶数行元素的最小值的差(其中类型arr为:
arr=ARRAY[1..10,1..10]OFInteger;)。
FUNCTIONcomp(a:
arr):
Integer;
VARi,j,max,min:
Integer;
BEGIN
max:
=a[1,1];min:
=a[2,1];
FORi:
=1TO10DO
FORj:
=1TO10DO
BEGIN
if()thenifa[i,j]>maxthenmax:
=a[i,j];
if()thenifa[i,j]=a[i,j];
END;
()
END;
5.58填空完成下列程序,它可以把从键盘输入的一个十进制正整数(小于32767)转换为十六制数输出。
例如:
若输入230 则输出E6 (注意:
不能是00E6)若输入15029 则输出3AB5
PROGRAMp558(Input,Output);
VARa,k:
Integer;
s:
ARRAY[1..4]OFChar;
FUNCTIONntoc(a:
Integer):
Char;
BEGIN
IFa>9THEN
ntoc:
=Chr(a-10+Ord(‘A))
ELSE
ntoc:
=Chr()
END;
BEGIN
k:
=1;Readln(a);
WHILE(k<=4)AND()DO
BEGIN
s[k]:
=ntoc();
a:
=aDIV16;
k:
=k+1
END;
FORa:
=()DO
Write(s[a]);
Writeln
END.
5.59下列程序是验证10000以内能被11整除的正整数颠倒后也必能被11整除。
其中函数ReverseDigits是把整数值颠倒过来作为它的函数值。
请将程序填写完全。
例如:
143能被11整除,则其颠倒后的341也能被11整除。
PROGRAM p559(Output);
VARi,j,ri:
Integer;right:
Boolean;
FUNCTIONReverseDigits(n:
Integer):
Integer;
VARrn:
Integer;
BEGIN
rn:
=();
WHILEn<>0DO
BEGIN
rn:
=rn*10+nMOD10;
n:
=nDIV10
END;
ReverseDigits:
=()
END;
BEGIN
right:
=True;
FORj:
=1TO999DO
BEGIN
i:
=11*j;
___________________;
IFriMOD11<>0THEN
BEGIN
Writeln(i,ri,