1998年度初级程序员级下午试卷

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

则题号小的解答有效。


试题一 
    阅读以下 BASIC 程序,将应填入__n__处的字句,写在答卷的对应栏内。
[程序1.1]
           S = 0
           N = 0
   LI:     INPUT Y
           IF Y >= 0 THEN GOTO L2
           S = S + Y
           N = N + 1
   L2:     IF N < 50 THEN GOTO L1
           PRINT "S="; S
           END
    程序所完成的功能为__1__ 。
[程序1.2]
           A = 10: B = -3: C = 2
           U = A > B AND C <= A OR A <= B AND C > A
           V = A <= B AND C <= A OR A > B AND C > A
           PRINT "U + V =";  U + V
           AS = "A4 " :  B$ = "ADE" : C$ = "AD"
           P  =  NOT  B$ > C$  OR  AS = C$  AND A$ < B$
           PRINT  "P="; P
           END
    设真为-1,假为 0 。程序执行后,输出结果为__2__ 。
[程序1.3]
           DIM A (5, 5)
           FOR I = 1 TO 5
              FOR J = 1 TO 5
                 READ A(I,J)
              NEXT J
              RESTORE
           NEXT I
           DATA  0, 1, 2, 3, 4
           FOR I- 1 TO 4
              FOR J = I + 1 TO 5
                 A(J,I) = A(I,J)
              NEXT J
           NEXT I
           FOR I = 1 TO 5
              FOR J = 1 TO 5
                 PRINT  A(I,J);
              NEXT J
              PRINT
           NEXT I

           END
[程序1.4]
           DECLARE SUB  FLP (P)
           DECLARE FUNCTION FMP (P)
           COMMON SHARED S, Q
           S = 0
           Q = 200
           FOR I = 1 TO 6
             CALL FLP (I)
           NEXT I
           PRINT  "S=" ; S, "Q="; Q
           DATA  63,15,-1,48,8,99,16,8,41
           END

           SUB FLP (P)
              IF P <= 3 THEN
                  READ X, Y
                  S = S + (FMP (FMP (X)) + FMP (Y))/ 2
             ELSE
                  IF P <> 4 THEN
                      READ Z
                      Q = Q - Z
                  ELSE
                      RESTORE
                  END IF
             END IF
           END SUB
           FUNCTION FMP (X)
             FMP = SQR (X + 1)
           END FUNCTION
           程序执行后,输出结果为__(4)__ 。

试题二
    阅读以下 C 语言程序,将应填入__(n)__处的字句,写在答卷的对应栏内。
[程序2.1]
  void u(int i,char *cp)
  { for ( ; i; i--)
    printf("%c",cp++);
  }
  main()
  { char a[][3] = { "eof", "ABC", "DE" };
    char *p;
    L1: p = a[0]; u(1,p++); u(1,p++); u(1,p); printf("\n");
    L2: p = a[1]; u(3,p++); u(2,p++); u(1,p); printf("\n");
    L1: printf("%s\n, a[1]");
  }
  [程序2.1] 的 L1,L2,L3行分别输出__(1)__、__(2)__和 __(3)__。

[程序2.2]
  double x , u , v;
  double f( ), g( ), t( );
  main()
  { x = 4.0;;
    u = t(x,f );
    v = t(x,g);
    printf("u = %10.6f v = %10.6f\n", u , v);
  }
  double t( double a, double (*f) ( ))
  { return (*f) (a + a);
  }
  double f( double x)
  { return 3.0*x;
  }
  double g( double x)
  { return 3.0+x;
  }

  [程序2.2] 的输出为 u =__(4)__ , v =__(5)__.

试题三 略(FoxBASE)

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

道,则题号小的解答有效。

试题四
    阅读以下程序说明和 BASIC 程序,将应填人__(n)__处的字句,写在答卷的对应栏
 内。
[程序说明]
    本程序将字符串 A$ 中的所有字符子串 B$ 替换为字符串 R$。
[程序]
       INPUT "  A$= ";  A$
       INPUT "  B$= ";  B$
       INPUT "  R$= ";  R$
       D$ = A$
       A$ = ""
       LB = LEN (B$)
       LD = LEN (D$)
       DO WHILE LD >= LB
           K = __(1)__
           PRINT " K= "; K, " LD=" ; LD
           IF K = 0 THEN GOTO L
           C$ = LEFT$( __(2)__) + R$
           D$  =  RIGHT$(D$,LD - __(3)__)
           A$ = AS + C$
           LD =  ; __(4)__. (D$)
       LOOP
  L:   A$ = A$ + __(5)__
       PRINT" NEW STRING A$="; A$
       END

试题五
    阅读以下程序说明和 C 语言,将应填入__(n)__处的字句,写在答卷的对应栏内。
[程序说明]
    本程序利用牛顿切线公式计算数 a (不为 0)的立方根。根据牛顿公式,其第 n+1
次近似根与第 n 次近似根满足:
             xn+1 = (2xn3+a)/(3xn2)
    要求相邻两次近似根的差的绝对值小于等于 0.00001 时停止迭代。初次近似根 x0
值为 1。
[程序]
  #include <math.h>
  #define Epsilon ____(1)____
  main ()
  { double x , y = 1 , a ;
    printf(" 请输入要开方的数,a");
    scanf("if",___(2)___);
    do { ___(3)___;           /*保存前次近似根*/
        y = ___(4)___ + a/(3*x*x); /*计算本次近似根*/
    }  while (___(5)___ Epsilon);
    printf("The cubic root of  %f is %10.5f\n",a,y);
  }

试题六 略(FoxBASE)

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

道,则题号小的解答有效。

试题七
    阅读以下程序说明和 BASIC 程序,将应填人__(n)__处的字句,写在答卷的对应栏
内。
[程序说明]
    本程序利用随机函数产生 200 个 10-500 之间(可包括 10 和 500 )的整数,并输
出其中的质数个数、最大质数和最小质数。
[程序]
     DIM A (199)
     FOR I = 0 TO 199
         A(I) = __(1)__ + 10
     NEXT I
     J=0
     FOR I - 0 TO 199
         FOR X = 2 TO INT(SQR(A(I) + 1))
              IF __(2)__ THEN GOTO L
         NEXT X
         __(3)__
         J = J + l
 L:  NEXT I
     PRINT" 质数个数 ="; J
     IF J > 0 THEN
         MAXP = 10
         MINP- 500
         FOR I = 0 TO J - 1
              IF  __(4)__ THEN MAXP = A (I)
              IF  __(5)__ THEN MINP = A (I)
         NEXT I
         PRINT " 最大质数是 " MAXP
         PRINT " 最小质数是 " MINP
      END IF
      END

试题八
    阅读以下程序说明和 C 语言,将应填入__(n)__处的字句,写在答卷的对应栏内。
[程序说明]
    本程序是一函数 check(s),它检查给定字符串 s 是否满足下列两个条件:
    1.从字符串首字符起,在顺序检查 s 中字符的过程中,遇到右括号 ')' 的个数在
任何使均不超过所遇到的左括号 '(' 的个数。
    2. 字符串 s 中左括号 '(' 的个数与右括号 ')' 的个数相同。
    若字符串 s 同时满足上述条件 1 和 2 ,函数返回非 0 值,否则返回 0 值。
[程序]
  int check(s)
  __(1)__;
  { int lp, rp;
    while ( ___(2)___);
    { if (*s == ')' )  lp++;
      else if ( *s == '( ' )
          { rp++;
            if ( ___(3)___ ) return 0;
          }
      ___(4)___;
    }
    return ___(5)___;
  }

试题九 略(FoxBASE)

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

道,则题号小的解答有效。

试题十
    阅读以下程序说明和 BASIC 程序,将应填人__(n)__处的字句,写在答卷的对应栏
内。
[程序说明]
    本程序每次输入一个用户编码(编码为正整数)及其存款金额,然后累计同一用户的
存款金额并按用户编码由小到大的顺序排列已输入的所有存款。最后输出排序后的所有用户
的存款总额。
[程序]
      DIM CODE%(1000),MONEY(1000)
      N = 0
      PRINT " 输入整数编码(-1为退出):"
      INPUT WCODE%
      DO WHILE WCODE% > 0 AND N < 1000
          PRINT " 输入存款额:"
          INPUT WMONEY
          I = 0
          DO WHILE I < N AND __(1)___
              I = I + 1
          LOOP
          IF __(2)__  THEN
              MONEY (I) = MONEY(I) + WMONEY
          ELSE
              FOR __(3)__
                  CODE% (J) = CODE% (J - 1)
                  MONEY (J) = MONEY (J - 1)
              NEXT J
              CODE%(J) = WCODE%
              MONEY(J) = WMONEY
              N = N + 1
          END IF
          PRINT  " 输入下一个整数编码(-1为退出):"
          INPUT WCODE%
      __(4)__
      FOR I = 0 TO __(5)__
          PRINT CODE%(I), MONEY(I)
      NEXT I
      END

试题十一
    阅读以下程序说明和 C 语言,将应填入__(n)__处的字句,写在答卷的对应栏内。
[程序说明]
    本程序实现二分法快速检索。待检索的不同整数无序存放于文件D ATA 中。程序先

读入所有数据至数组 a 中,然后调用函数 binary(m,a),在数组中检索整数 m 。为了

能用二分法检索,必须先将数组 a 的各元素按升序(或降序)排序。如果 a 中有右元素

 m ,binary 返回该数在数组 a 中的位置;否则返回 -1。本程序采用插入排序法,

依次将数组 a 的各元素插入至其前面已排红序(升序)的各数中的合适位置上。
[程序]
  #include <stdio.h>
  #define MAXN100
  int n;
  int readin (int a[],int k )
  { FILE *fp ;int i,term;
    if ((fp = fopen ( "DATA", "r"))==NULL)
    { printf ( " 不能打开文件 DATA.\n");
      exit (0);
    }
    while ( i < k && fscanf(fp, "%d",&term) != EOF);
      a[i++] = term;
    fclose(fp);
    retutn i;
  }
  int binary ( int m, int a[])
  { int low , high ,mid;
    low = 0; high = n-1;
    while (low <= high)
    { mid = (low + high)/2;
      if ( m > a[mid] ) low = ____(1)____;
      else if ( m < a[mid] ) high = ____(2)____;
           else return mid;
    }
    return -1;
  }
  vaid sort(int a[])
  { int i ,j ,t ;
    for (i = 1 ; i < n; i++)
    { t = a[i]; j = i-1;
    while (____(3)____)
    { a[j+1] = a[j]; j--;
    }
    a[j+1] = ____(4)_____;
    }
  }
  main ()
  { int m, p, a[MAXN];
    n = readin( a, MAXN );
    printf ( "请输入欲从数组 a 中检索的整数。 \n');
    scanf ("%d", &m);
    sort(a);
    if ((p = ____(5)____ ) != -1)
        printf ( "%d 是数组 a 的第 %d 个元素。 \n",m,p+1);
    else printf ("数组 a 中不存在整数 %d 。 \n",m);
  }

试题十二 略(FoxBASE)

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