综合练习一

一、选择题

1.要用一个数组存放某班30人3门课的考试成绩(考试成绩保留1位小数),下面哪个说明中的数组可以存放这些数据?
A)var s:array[1..3,1..30] of integer; 
B)var s:array['a'..'c',1..30] of real;
C)var s:array[1..30,boolean] of real; 
D)var s:array[1..30,'A'..'C'] of integer; 
2.设有说明 VAR x:ARRAY[1..3,'x'..'z']0F Real; 则x[3,'x']是 
A)一个存放实型数据的数组元素 
B)一个具有3个字符型元素的数组 
C)一个具有3*3个实型元素的数组 
D)一个具有6个实型元素的数组

3.设有如下说明:
var a:array[1..4,1..4] of integer;
i,j:integer;
且以第1个下标代表行、第2个下标代表列给a赋值为:
3 2 1 4
4 3 3 1
3 2 4 3 
2 1 3 2
则执行程序段
FOR i:=1 TO 4 DO 
FOR j:=1 TO 4 DO 
a[i,j]:=a[a[i,j],a[j,i]];
writeln(a[2,3]) 
后输出的是:
A)1 B)2 C)3 D)4
 
4.已知有如下说明: 
VAR a:ARRAY[1..4,2..5]0F Integer; 
b:ARRAY[2..5,1..4]0F Integer; 
i,j:integer;
且a已赋值,若将a的所有元素传送给b,下面的程序段在运行时无错误的是 
A)for i:=1 to 4 do B)for i:=1 to 4 do
for j:=1 to 4 do for j:=2 to 5 do
b[j,i]:=a[i,j] b[i,j]:=a[i,j]
C)for i:=2 to 5 do D)for i:=1 to 4 do
b[i,i-1]:=a[i-1,i] b[i,i+1]:=a[i,i+1]

 

二、看程序写结果

1.

PROGRAM CHU7_3;
 VAR P,Q,S,T:INTEGER;
 BEGIN
  READLN(P);
  FOR Q:=P+1 TO 2*P DO
   BEGIN
    T:=0;
  S:=(P*Q)MOD(Q-P);
  IF S=0 THEN
      BEGIN
       T:=P+Q+(P*Q)DIV(Q-P);
       WRITE(T:4);
      END;
   END;
  READLN
END.
输入:12
输出:

 

2.

PROGRAM CHU7_2;
 VAR I,J,F:INTEGER;
     A:ARRAY[1..8]OF INTEGER;
 BEGIN
  FOR I:=1 TO 8 DO
   BEGIN
    F:=I MOD 2;
    IF F=0 THEN A[I]:=0
        ELSE A[I]:=1;
    FOR J:=1 TO I DO
     IF F=0 THEN A[I]:=A[I]+J
         ELSE A[I]:=A[I]*J
   END;
  FOR I:=1 TO 8 DO
   WRITE(A[I]:5);
END. 输出:

 

 
 

3.

var a:array[1..6] of integer;
 i,j,p,t:integer;
begin
 for i:=1 to n do read(a[i]);
 for j:=1 to n-1 do
begin
p:=j;
for i:=j to n do
if a[i]< a[p] then p:=i;
t:=a[p];a[p]:=a[j];a[j]:=t;
end;
 for i:=1 to n do
begin
write(a[i]:2);
if i mod 3=0 then writeln;
end
end.
输入:7 2 5 1 9 4   
输出:

4.

var i,j,n:integer;

begin

 readln(n);

 for i:=1 to 2*n do

  if i<=n then

   begin

    write('':20-i);

    for j:=1 to 2*i-1 do write('*');

    for j:=1 to 2*(n-i) do write(' ');

    for j:=1 to 2*i-1 do write('*');

    writeln

   end

  else

   begin

    write('':20-2*n+i);

    for j:=1 to 2*(2*n-i)-1 do write('*');

    for j:=1 to 2*(i-n) do write(' ');

    for j:=1 to 2*(2*n-i)-1 do write('*');

    writeln

   end

end.

 

输入:5

输出:

三、填空题:请将每空的正确答案写在横线上

输入n个0到100之间的整数,由小到大排序输出,每行输出8个
 程序清单:
 PROGRAM CHU7_5;
  VAR I,J,K,N,X:INTEGER;
    B:ARRAY[0..100]OF INTEGER;

 BEGIN
  READLN(N);
  FOR I:=0 TO 100 DO B[I]:=0;
 FOR I:=1 TO N DO
  BEGIN
   READLN(X);
   B[X]:= ① 
  END;
   ② 
FOR I:=0 TO 100 DO
  WHILE ③ DO
   BEGIN
    WRITE( ④ );
    K:=K+1;
    B[I]:=B[I]-1;
    IF ⑤ THEN WRITELN
   END;
 READLN
END.

四、编写程序
1.周末三位同学各带着7个鱼筐去打鱼,收工时有7个鱼筐装满了鱼,7个鱼筐装了一半,还有7个鱼筐是空的,问怎样分配这些鱼筐使得每位同学得到的鱼和鱼筐都是一样多。

2.设矩阵a为5×5的方阵,编制一个程序,实现下述功能 (1) 使a的全部元素为O; (2) 使a的上三角元素为0: (3) 使a的第二列元素等于0;(4) 使a的元素除主对角线元素之外,其他元素都为0

3.输入一个各个位上数字不全相同的四位数。把组成这个四位数的数字从大到小排列,形成由这四个数字构成的最大的四位数,再把组成这个四位数的数字从小到大排列,形成由这四个数字构成的最小的四位数,求出两数之差,得到一个新的四位数。如此循环总能得到最后的结果6174。请编程实现循环过程。
例输入:n=5346时
输出:6543-3456=3078 8730-378=8352 8532-2358=6174

4.设有n个人因坐成一圈,并且按照顺时针方向从1到n编号,由第s个人开始进行从1到m的报数,报数到第m个人时,此人出圈,再从下一个人重新开始从1到m报数,如此进行下去,直到所有的人都出圈为止。现在要求编程按照出圈的顺序,每10个人一组,输出这n个人的顺序表。

5.对给定的整数n(0<n<80),编程计算并输出i!(i的阶乘,i=1,2,…,n)的全部有效数字。 因i!的数字可能很大,故采用一维数组表示法存储计算结果。例如 14!=87178291200在数组a中可存储成
0 0 2 1 9 2 8 7 1 7 8 0 0…。在计算n!时采用了以加法代替乘法运算的办法。例如,由5!=120计算6!时, 把原来的120再累加5次120,得至6!=720。

6、输入年、月、日,求这一天是星期几。
算法提要:求出这一天离公元1年的元旦有多少天,然后对7求余{公元1年的元旦为星期一}

7、键入自然数N,打印出一个上下左右全方位对称的字符图形,其形如田字,边长2*N+1个字符,笔划均按字母顺序递增或递减对称排列。 
例如:N=3时,图形为: 


A B C D C B A 
B C B 
C B C 
D C B A B C D 
V B C 
B C B 
A B C D C B A 

8、键入两个自然数N和K,将N写成K个大于1的自然数相乘,要求这K个数按从小到大排列,而且除了第K个数之外,前面(K-1)个数是N分解出来的最小自然数。 
例如:N=24,K=2时,输出为24=2*12,而不是24=4*6 
N=3,K=2时,输出则为“No answer!”