信息学奥赛强化练习卷四1.阅读程序,写出程序运行结果Programexp2(input,output);Constn=5;Vari,j,k:integer;a:array[1..2*n,1..2*n]ofinteger;BeginK:=1;ForI:=1to2*n-1doIfi<=nthenifodd(i)thenforj:=Idownto1dobegina[I-j+1,j]:=k;k:=k+1;endelseforj:=1toidobegina[i-j+1,j]:=k;k:=k+1;endelseifodd(i)thenforj:=ndowntoI-n+1dobegina[I-j+1,j]:=k;k:=k+1;endelseforj:=I-n+1tondobegina[I-j+1,j]:=k;k:=k+1;end;forI:=1tondobeginforj:=1tondowrite(a[I,j]:3);writelnend;end.答:输出结果为:13410112591219681318207141721241516222325分析:该程序已知10*10(N=5)的二维数组,程序最后输出数组左上角5*5的部分;显然程序中主要完成的处理是向数组左上角元素中填写数值,填写的数值为K,K的初值为1,填写一次增加1,可见该程序要将1、2、3…逐次填入要输出的部分,整个填写过程由一个循环语句FORI:=1TO2*N-1DO来完成;2N-1正好是N*N二维数组(矩阵)的对角线条数,可见填数过程是按对角线方向填写的。从整个程序的大体情况来看,分为两个循环,第一个循环为(I=1TO2N-1),主要完成将K值不断地赋给数组A,第二个循环为最后一段双重循环输出A数组的左上角矩阵。程序在大循环(I=1TO2N-1)范围内又包含了两小块,第一块为I<=N时,奇数行、偶数行分别赋值,第二块为I>N时,奇数行偶数行分别赋值。从程序看,程序先将2N-1条对角线分为1-N(1~5)和N+1~2N-1(6~9)两组;对每一组都分奇偶两种情况,第一组对I为奇数号对角线而言,列坐标J由大到小(从I降到1),行坐标由小变大(从1变到I),可见对角线填数方向为右上到左下,同样可以发现对I为偶数号对角线而言,程序中行坐标由大变小(从I变到1),列坐标由小变大(由1变到I),对角线填数方向为由右下到左上。对第二组对角线而言,所不同的仅是行列坐标的变化范围不同(I为奇数时,列坐标从N变到I,行坐标由I-N+1变到N;I为偶数时列坐标由I-N+1变到N,行坐标由N变到I-N+1)。对N=5,2N-1=9的各条对角线填数的方向如图示:I=123456该程序主要考测同学们的对下标变化规律的理解。2.阅读程序,写执行结果Programuup3(input,output);ConstN=10;VarS,I:integer;FunctionCO(I1:integer):integer;VARJ1,S1:integer;BeginS1:=N;ForJ1:=(N-1)downto(N-I1+1)doS1:=S1*J1div(N-J1+1);CO:=S1End;BeginS:=N+1;ForI:=2toNdoS:=S+CO(I);Writeln(‘S=’,S);End.答:S=1024(11+45+120+210+252+210+120+45+10+1)该题主要考测同学们对函数过程的理解。主程序十分简单表达了一个求和过程(n=10):s=11+co(2)+co(3)+co(4)+…+co(10),最后输出S;函数CO(I)是由函数过程定义的,它的计算方法是:CO(I)=(n(n-1)……(n-I+1))/(2*3*……I)=(10*9*……(10-I+1))/(2*3*….i)co(2)=(10*9)/2=45co(3)=((10*9)/2)*8/3=(45*8)/3=120co(4)=(((10*9)/2)*8/3)*7/4=(120*7)/4=210789co(5)=((((10*9)/2)*8/3)*7/4)*6/5=(210*6)/5=252co(6)=(252*5)/6=210co(7)=(210*4)/7=120co(8)=(120*3)/8=45co(9)=(45*2)/9=10co(10)=(10*1)/10=13.阅读程序写出执行结果Programexp4(input,output);ConstN=3;VARI,J,S,X:integer;P:array[0..n+1]ofinteger;G:array[0..100]ofinteger;BeginForI:=0to100doG[I]:=0;P[0]:=0;P[n+1]:=100;ForI:=1tondoread(P[I]);readln;ForI:=0tondoForJ:=I+1toN+1doG[abs(P[J]-P[I])]:=G[abs(P[J]-P[I])]+1;S:=0;ForI:=0to100doIfG[I]>0thenbeginWrite(I:4);S:=S+1;End;Writeln;writeln(‘S=’,S);Writeln(‘inputdata:’);readln(X);Writeln(G[x])End.输入:102065inputdata:10输出:答:1020344555658090100S=9输入:inputdata:10输出:2从程序的输出部分可以看到输出的内容为数组g[0..100]中大于0的元素的下标及大于0的元素的总个数S,然后根据输入下标x,再输出数组中的元素g[x]的值。程序的主体部分是根据p数的初值(其中p[1]~p[3]为输入数据:p[0]=0,p[1]=10,p[2]=20,p[3]=65,p[4]=100来计算数组元素g[0]~g[100]的值(它们的初始值为0),其计算规律为(循环控制变量I从0变到3):I=0J=1J=2J=3J=4g[10]=1g[20]=1g[65]=1g[100]=1I=1J=2...