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

试题一  (15分)
    阅读以下C代码,将应填人 __(n)__ 处的字句写在答卷的对应栏内。
[程序1.1] 
  #include  &ltstdio.h>
  void nextS(int *h, int *m, int *s)
  {  if (++*s < 60) return;
     *s = O;
     if (++*m < 60) return;
     *m = O;
     *h = (*h + t) % 24;
  }
  void main 0
     int hour = 23, minute = 59, second = 59;
     nextS(&amphour, &ampminute, &ampsecond);
     printf("%d\t%d\t%d\n", hour, minute, second);
    程序1.1的输出结果是 __(1)__ 。

[程序1.2]
  #include  &ltstdio. h>
  int digit( long n, int k )
    { while ( n != 0 && k-- > 1 )
             n / = 10;
       return n%lO;
    }
  main()
    { printf ( "%d,%d\n",digit( 123456789L, 2 ), digit( 123.456789L, 9 ));
    }
程序1.2的输出结果是 __(2)__ , __(3)__ 。

[程序1.3]
  #include  &ltstdio.h>
  void s(int a[], int n)
  {  int  i, j, t, flg;
     for(i = O; i < n-1; i++) {
        for(flg = O, j = O; j < n-i-l: j++)
           if(a[j] > a[j+l]) {
               t = a[j]; a[j] = a[j+l]; a[j+i] = t;
               fig = 1;
           }
        if (!fig) return;
     }
  )
  void main( )
  { int i, cji= {15, 3, 8, 9, 6, 2}; 
    s(c, 6);
    for (i = O; i < 6; i++)
        printf ("%4d\t", c[i]);
    printf ('\n');
  }
程序1.3的输出结果是 __(4)__ ;函数s(int[],int h)的功能是 __(5)__ 。

试题二  (15分) 
    阅读下列程序说明和 C 代码,将应填人 __(n)__ 处的字句写在答卷的对应栏内。
[程序 2 说明)  
    本程序从键盘输入 n(0&ltn&lt100) 个整数,计算并输出其中出现次数最多且数值最大的
元素及其出现次数。
[程序 2]
  #include &ltstdio. h>
  #define  N  100
  void main ( )
  {  iht a[N] , n,  i, j, ind, cl, c2;
     do { printf(" 输入 n(O < n < lO0):\n");
             scanf ("%d", &ampn);
     }while (n 4= 0 || __(1)__ )
     printf (" 输人数组元素:\n");
     for(i = O; i < n; i++)
           scanf ("%d", &ampa[i]);
     for(c2 = i = O; i < n; i++) {
           for(cl = 1, j = i+l; j < n; j++)
                 if(a[j] == a[i])  __(2)__ ;
           if( __(3)__ I| cl == c2 && a[i] > a[ind]) {
                 c2 = cl; __(4)__
           }
     }
     printf (" 其中%d出现%d次\n", a[ind], __(5)__ )
  }

试题三  (15分)  
    阅读下列程序说明和 C 代码,将应填入 __(n)__ 处的字句写在答卷的对应栏内口
[程序3说明]
    幼儿园有 n(&lt20) 个孩子围成一圈分糖果。老师先随机地发给每个孩子若干颗糖果,
然后按以下规则调整:每个孩子同时将自己手中的糖果分一半给坐在他右边的小朋友。如共
有 8 个孩子,则第 1 个将原有的一半分给第 2 个,第 2 个将原有的一半分给第3个,......,
第 8 个将原有的一半分给第 1 个,这样的平分动作同时进行。若平分前,某个孩子手中的糖
果是奇数颗,则必须从老师那里要一颗,使他的糖果数变成偶数。小孩人数和每个小孩的初
始糖果数由键盘输入。下面的程序可求出经过多少次上述这样的调整,使每个孩子手中的糖
果—样多,调整结束时每个孩子有糖果多少颗,在调整过程中老师又新增发了多少颗糖果。
[程序3]  
  #include &ltstdio. h>
  #define N  20
  int allEqual (int a[ ], int n)  /* 检查每个孩子手中的糖果是否一样多 */
  {   iht i;
      for(i = 1; i < n; i++)
           if(a[O] != a[i]) return O;
     return 1;
  }
  int a[N], b[N];
  void main ( )
  {  int i, n, addk, loopc;
     printf("Enter n((20)\n"); scanf("%d", &ampn);
     printf ("Enter data\n");
     for(i = O; i (n; i++)   scanf("%d", &ampa[i]);
     addk = O; __(l)__ ;
     while ( __(2)__ ) {   /* 平分循环 */
         loopc++;
        for ( i = O; i ( n; i++) {   /*  为一次调整作准备 */
                   if(a[i]%2) { a[i]++;  __(3)__ ;}
                   if (i < n-l)  b[i+l] = a[i]/2;  else __(4)__
                   a[i] /= 2;
        }
        for(i = O; i < n; i++)  __(5)__ ;   /*  完成一次调整 */
     }
     printf ("调整 %d 次\n",loopc);printf( "每个孩子有 %d 颗糖果\n", a[O]);
     printf ("调整过程中新增发 %d 颗糖果。\n",addk);
  }

试题四  (15分)
    阅读下列程序说明和C代码,将应填人 __(n)__ 处的字句写在答卷的对应栏内。
[程序 4 说明]
    本程序用于从键盘读人整数,插入到链表,·或从链表删除一个整数。
[程序 4] 
  #include &ltstdio. h>
  #include &ltmalloc. h>
  typedef   struct node { int val;
                          struct node *next;
                        } NODE;
  NODE *ins(NODE ,list, iht x)   /* 将 x 按从小到大的次序插入链表 */
  {  NODE *u, *v = list, *p;
     for(; v != NULL && x < v-&gtval; u = v, v = v-&gtnext );/* 找插入位置 */
     if (v != NULL && x == v-&gtval) return list;   /* 已有,被忽略 */
     p = (NODE *)malloc(sizeof(NODE)); p-&gtval = x; /* 生成新表元 */
     if (v == list) list = p;  else __(1)__ ;
     __(2)__ 
     return 1 ist;
  }
  NODE *del (NODE ,1 ist, int x)   /* 从链表中删除值为 x 的表元 */
  {  NODE *u, *v;
     for(v = list; v != NULL && x < v-&gtval; u = v, v = v-&gtnext)
     if (v != NULL && x == v-&gtval) { /* 找到值为 x 的表元 */
        if(v == list) list = list-&gtnext;  else  __(3)__ ;
          __(4)__ ;     /* 释放空间 */
     } else printf(" 没有找到! \n");
     return list;
  }
  void main( )
  { iht x, ans; NODE *list = NULL, .p;
    while(l) {
      printf("\n输入1:将整数插入到链表。\n输入2:从链表删除一个整数。\n ");
      printf ("其它整数,结束程序。\n\t 请输人选择! ");  scanf("%d", &ampans);
      if( __(5)__ ) return;
      printf(" 输入整数 "); scanf ("%d", &ampx);
      if(ans == 1) list = ins(list, x);
      else list = del (list, x);
      for(p=list; p!=NULL; p=p-&gtnext) printf(" %4d",p-&gtval);
    }
  }

 老顽童校对整理 2002年5月