1997年度初级程序员级下午试题

    从下列的 3 道试题(试题一至试题三)中任选1道解答。如果解答的试题数超过 1 道,

则题号小的解答有效。

试题一

阅读下列 BASIC 程序,将应填入__(n)__处的字句,写在答卷的对应栏内。
[程序1.1]

A = 1

B = -1

IF A > B AND B = ABS(B) THEN GOTO P

A = 2

IF A = B OR NOT(A+B)<(A-B)THEN GOTO P

A = 3

IF(A = 2 OR B-1 = -A)OR(A = B+4 AND NOT (A <> 3) THEN GOTO P

A = 4

P:PRINT A+ABS(B)

END

程序执行后,输出结果为__(1)__。

[程序1.2]

DECLARE FUNCTION P$(X,Y)

COMMON SHARED A,B,C$

INPUT “A=”,A

INPUT “B=”,B

C$=“TEST-RESULT”

PRINT P$(A,B)

END

 

FUNCTION P$(X,Y)

IF X >= Y THEN

Z$ = MID$(C$,6,6)+“1=”+STR$((SQR(X)+ABS(Y))/2)

ELSE

Z$ = MID$(C$,6,6)+“2=”+STR$(INT(X+Y)*100)

END IF

P$ = Z$

END FUNCTION
若对变量A、B分别输入 16 和 -3,则输出结果为__(2)__。
若对变量A、B分别输入 23.3 和 39.5,则输出结果为__(3)__。

[程序1.3]

C$=“0123456789ABCDEF”

I=16

DIM X$(I)

L: INPUT“S=”,S

INPUT“D=”,D

IF (S < 2 OR S > 16 OR D < 0 OR D > 32767 THEN

PRINT “ERROR”

GOTO L

END IF

DO WHILE D <> 0

A = D

D = INT(A/S)

B = A-D*S

X$(I) = MID$(C$,B+1,1)

I = I-1

LOOP

FOR J = I+1 TO 16

PRINT X$(J);

NEXT J

END
若对变量 S、D 分别输入 16 和 175,则输出结果为__(4)__。

[程序1.4]

OPTION BASE 1

DIM B(6)

K = 1

WHILE K <= 6

READ B(K)

K = K+1

WEND

FOR K1 = 1 TO 5

L = B(K1+1)

FOR K2 = K1 TO 1 STEP –1

IF L > B(K2) THEN

GOTO S

END IF

B(K2+1) = B(K2)

NEXT K2

S:    B(K2+1) = L

NEXT K1

I = 1

DO UNTIL I > 6

PRINT B(I);” ”;

I = I+1

LOOP

DATA 9,-1,4,18,-5,7

END
程序执行后,输出结果为__(5)__。

试题二

阅读以下与 C 语言有关的叙述,将应填入__(n)__处的字句,写在答卷的对应栏内。

1、已知 int x = 1,y = 2,z = 3;

则 z + = x > y ? ++ x : ++ y的值是__(1)__。

2、 已知int a[ ] ={10,9,8,7,6},*p = a;

则*(p+1)*(p+2)[2]的值是__(2)__。

3、 已知char ch ;

则判别 ch 是英文字符的逻辑表达式是__(3)__。

4、 已知int p( ),( *q )( );

则 p 是__(4)__,而 q 是__(5)__.

试题三
略(FoxBASE)

    从下列的 3 道试题(试题四至试题六)中任选1道解答。如果解答的试题数超过 1 道,

则题号小的解答有效。

试题

阅读以下程序说明和 BASIC 程序,将应填入__(n)__处的字句。写在答卷的对应栏内。
[程序说明]

本程序按得分从大至小打印出十佳运动员的编号、得分和名次。运动员编号、得分由 DATA 语句提供,分别存入在数组 N 和数组 M 中。每个运动员得分最高为 120 分。得分从大到小排序方法采用冒泡法,为提高排序速度,算法中增加了下列措施:若在某一次冒泡过程中发现没有发生过数据交换,则表示数据已排序完毕,此时可提前结束排序。

具有相同得分的运动员,其名次相同。例如前 4 位运动员排序后的名次情况如下:

编号 得分 名次
4 119 1
7 119 1
2 116 3
5 110 4


[程序]

DIM N(10),M(10),L(10)

FOR I = I TO 10

READ N(I),M(I)

NEXT I’

I = 10

S1: FLAG = 0

FOR__(1)__

IF M(J) < M(J-1) THEN __(2)__

SWAP N(J), N(J-1)

SWAP M(J),M(J-1)

FLAG = 1

S2: NEXT J

I = I-1

IF__(3)__ THEN GOTO S1

PRINT“编号”,“得分”,“名次”

L(1) = 1

FOR I = 2 TO 10

PRINT N(I-1),M(I-1),L(I-1)

IF M(I-1) = M(I) THEN __(4)__ ELSE __(5)__

NEXT I

PRINT N(10),M(10),L(10)

DATA 1,102,2,118,3,99,4,107,5,117

DATA 6,115,7,111,8,117,9,102,10,104

END

试题五

阅读以下程序说明和 C 语言,将应填入__(n)__处的字名,写在答卷的对应栏内。
[程序说明]

本程序利用 Machin 公式求 π 的值。Machin 公式的可表示如下:

π = 16 arctan(1/5 ) - 4 arctan(1/239 )

其中 arctan 用如下形式的级数计算:

arctan(x) = x - x3/3 + x5/5 + x7/7 + …

直到级数的某项绝对值不大于 10-15 为止;π和 x 均为双精度实数。
[程序]

main()

{

double a,b;

____(1)____;

a = ____(2)____;

b = ____(3)____;

printf(“PI=%20.15f\n”,a-b);

}

double arctan(double x)

{

int I;

double r, e, f, sqr;

sqr = x*x;

r = 0;

e = x;

I = 1;

white (e/I > le-15)

{

f = e/I;

r = (i%4 == 1) ? ___(4)____;

e = e*sqr;

I += 2;

}

return____(5)____;

}


试题六
略(FoxBASE)

    从下列的 3 道试题(试题七至试题九)中任选1道解答。如果解答的试题数超过 1 道,

则题号小的解答有效。

试题

阅读以下程序说明和 BASIC 程序,将应填入__(n)__处的字句,写在答卷的对应栏内。
[程序说明]

本程序中自定义函数TSIN(x)是按泰勒展开式计算 SIN x 的近似值。SIN x 的展开式为:

 

x x3 x5 x7  x2n-1
SINx = + + + + …… = Σ(-1)n-1 ————
1! 3! 5! 7! n=1  (2n-1)!

计算精度为 10-6 。变量 T 用于存放展开式的一项,利用递推关系可求得展开式的下一项。当某项的绝对值小于计算精度时,停止累加,累加和即为该精度下的 SIN x 的近似值。

利用该自定义函数计算如下公式并输出结果

 

K = SIN 2(R) + SIN 2(S) 当 R2 ≤ S2
SIN(R+S)/2 当 R2 < S2

其中R、S的值由键盘输入
[程序]

REM MAIN

DECLARE FUNCTION TSIN (X)

INPUT “R =”,R

INPUT”S =”, S

IF R*R <= S*S THEN

____(1)____

ELSE

K = TSIN(R*S)/2

END IF

PRINT K

END

 

FUNCTION TSIN (X)

P = .000001

G = 0

T = X

N = 1

DO UNTIL____(2)____

G = ____(3)____

N = N+1

T = ____(4)____

LOOP

____(5)____

END FUNCTION

试题八

阅读以下程序说明和 C 程序,将应填入__(n)__处的字句,写在答卷的对应栏内。
[程序说明]

本程序用于寻找并输出 11~999 之间的数 m,它满足 m,m2 和 m3 均为回文数。所谓回文数是指其各位数字左右对称的整数,例如 121,676,94249 等。满足上述条件的数如 m = 11 ,m2 = 121,m3 = 1331 皆为回文数。确定回文数的重要一步是确定一个整数的逆序数,即将该整数的各个数字从左至右逆序排列形成的整数,如 103 的逆序数为 301 。
[程序]

main ( )

{ long m;

for (m = 11; m < 1000; m++)

{ if (symm(m) && ___(1)___ )

printf ("m = %41d, m*m = %61d, m*m*m = %81d/n",

m, m*m, m*m*m);

}

}

int symm(long n)

{ long i, m;

____(2)_____; ____(3)____;

while (i)

{ m = m*10 + i % 10;

____(4)____;

}

return (____(5)____);

}

 

试题九 略(FoxBASE)

 

    从下列的 3 道试题(试题十至试题十二)中任选 1 道解答。如果解答的试题数超过 1 道,

则题号小的解答有效。

试题

阅读以下程序说明和 BASIC 程序,将应填入__(n)__处的字句,写在答卷的对应栏内。
[程序说明]

为减少存贮空间或数据通信中的信息量,经常需要对原始数据进行压缩。下面给出一种压缩规则:

(1)当原始数据中连续出现 N(N>1) 个相同的数 x 时,则在压缩数据中相继存放数 N 和数 x。

(2)当原始数据中连续出现 M(M>0) 个相邻不相同的数(即每个数与其相邻的数均不相同)时,则压缩数据中先存入数 -M,再存放这 M 个相邻不相同的数。

(4) 在压缩的数据中,数的存放次序与原始数据中数的出现次序相一致,并在压缩数据的最后加上数 0 作为压缩数据的结束标志。例如:

原始数据中有以下数:35,22,22,22,10,5,-2,19,19,19,19

被压缩后的数据为:-1,35,3,22,-3,10,5,-2,4,19,0

本程序对输入的已压缩的数据进复原。程序中数组 PACKED 存放已压缩的数据,其长度 N1 由用户输入。数组 UNPACK 存入复原后的原始数据,假设其长度 200 已足
[程序]

INPUT “N1=”,N1

DIM PACKED (N1),UNPACK(200)

FOR I = I TO N1

INPUT PACKED (I)

NEXT I

I = 1

J = 0

DO WHILE PACKED (I)<>0

L = PACKED(I)

IF L > 0 THEN

FOR K = 1 TO L

UNPACK(J+K) = __(1)__

NEXT K

J = J+L

I = I+2

ELSE

FOR K = ____(2)____

UNPACK(J+K) = ____(3)____

NEXT K

J = ____(4)____

I = ____(5)____

END IF

LOOP

FOR I = 1 TO J

PRINT UNPACK(I)

NEXT 1

END

试题十一

阅读以下程序说明和 C 程序,将应填入____(n)____处的字句,写在答卷的对应栏内。
[程序说明]

本程序中定义的函数 sdel(s) 实现的功能是将已知字符串 s 中的前导空白符和尾随空白符删去并将字符串中间部分的连续多个空白符删减为一个空白符。
[程序]

char *sdel(char *s)

{

char p=s,q=s;

for( ;____(1)____;s++);  /*删去前导空白符*/

for( ; s; )  /遍历 s 字符串其它字符*/

{

q++ = s;

if(*s != ’ ‘)  ___(2)___;

else

while(____(3)____)

s++;

}

if (q >p &&*(q-1) ==‘  ’) /*设定字符串结束符*/

____(4)____;

else *q = ‘\0’;

return____(5)____;

}

main()

{

char str[] = “    We   are   Chinese   ”

printf(“%s\n”,sdel(str));

}


试题十二
略(FoxBASE)

回目录           老顽童校对整理 2002年7月