程序员考试真题及答案
试题一(15分)
  阅读下列函数说明和 C 代码,将应填入其中__(n)__处的字句写在答卷的对应栏内。
【函数1.1说明】
  设链表结点的类型为
    typedef struct elem{ int val;
                            struct elem *next;
                          } intNode;
  函数 merge(int *a,int *b) 是将两个升序链表 a 和 b 合并成一个升序链表。
【函数1.1】
    intNode *merge(intNode *a,intNode *b)
    {  intNode *h = a,*p,*q;
      while(b)
      {  for (p = h; p && p->val<b->val; q = p, p = p->next);
          if (p == h) __(1)__; else __(2)__;
isalpha 函数          q = b; b = b->next; __(3)__;
      }
      return h;
    } 
【函数1.2说明】
  递归函数 dec(int a[],int n) 判断数组 a[] 的前 n 个元素是否是不递增的。不递增返
回 1 ,否则返回 0 。
【函数1.2】
    int dec(int a[],int n)
    {  if (n <= 1) __(4)__;
      if (a[0] < a[1]) return 0;
      return __(5)__;
    }
试题二(18分)
    阅读下列函数说明和 C 代码,将应填入__(n)__处的字句写在答卷的对应栏内。
【函数2.1说明】
    设长正整数用数组存储,如有 k 位的长整数m用数组 a[] 存储:
      m = a[k]*10k-1a[k-1]*10K-2+……+a[2]*101+a[1]*100
    并用a[0]存储长整数m的位数,即a[0]=k。
    通常,存储长整数数组的每个元素只存储长整数的一位数字。长整数运算时,为了运算方便,
产生的中间结果的某位数字可能会大于 9。这时,就应调用本函数将它规整,使数组的每个元素
只存储长整数的一位数字。规整运算函数 formal(int *a) 就实现这个特殊要求。
【函数2.1】
    void formal(int *a)
    {  int p;
      for (p = 1; p < a[0] || a[p] >= 10; p++) {
          if (p >= a[0] __(1)__;
          a[p+1]+ = a[p]/10;  a[p] = __(2)__;
      }
      if (p > a[0]) __(3)__;
    }
【函数2.2说明】
    函数 combine(a,b,c) 是计算两个整数的组合数。由于计算结果超出 long int 的表示
范围,故用本题【函数2.1说明】的方法存储计算结果。设整数 a 和 b (a>=b) ,它们的组
合 c(a,b) = a!/((a-b)!*b!)。计算 a 和 b 的组合可采用以下方法:
      a!/(a-b)!/b!
    = a*(a-1)*(a-2)*…*(a-b+1)/b!
    = u1*u2*…*ub/(d1*d2*…*db)
其中u1 = a,u2 = a-1,…,ub = a-b+1;d1 = 1,d2 =2 ,…,db = b 。
    从而计算 a 和 b 的组合 c(a,b),可变成计算上述分式。
    为计算上述分式,先从 u1,u2,…,ub 中去掉所有 d1*d2*…*db 的因子,得到新的
u1,u2,…,ub。然后再将它们相乘。以下函数中调用的外部函数 gcd(a,b) 是求两整数 a
和 b 最大公因子的函数;函数 formal() 就是本题中的函数 2.1。
【函数2.2】
    void combine (int a,int b,int *c)
    {  int i, j, x, k;
      int d[MAXN],u[MAXN];
      for (k = 0, i = a; i >= a-b+1; i--) u[++k] = i;
      __(4)__;
      for (i = 1; i <= b; i++) d[i] = i;  /*将整数 1 至 b顺序存于数组 d */
      for (i = 1; i <= u[0]; i++)  /*从u的各元素中,去掉 d 中整数的所有因子*/
        if (u[i] != 1)
          for (j = 1; j <= b; j++)
            if (__(5)__)  {
              x = gcd(u[i], d[j]);  u[i] /= x;  d[j] /= x;
            }
      c[0] = c[1] = 1;  /*长整数c初始化*/
      for (i = 1; i < = u[0]; i++) /*将 u 中各整数相乘,存于长整数 c */
        if (u[i]! = 1)
        {  for (j = 1;j <= c[0]; j++)  c[j] = __(6)__;
            formal(c);  /*将存于c中的长整数规整*/
        }
    }
试题三(21分)
  阅读下列函数说明和 C 代码,将应填入__(n)__处的字句写在答卷的对应栏内。
【程序3说明】
    本程序中的函数 expr() 实现将中缀表达式转换成后缀表达式。设中缀表达式只有加
(+)、减(-)、乘(*)和除(/)四则运算符(双目),运算分量只能是变量,变量用英文字母开
头英文字母和数字符组成的标识符命名。与平常四则运算的计算规则相一致,即先乘除,
后加减,括号内的子表达式优先计算。例如,中缀表达式 a*(c3-x2z/y)+u 的后缀表达式
为 ac3x2zy/-*u+
    程序给每个运算符和括号设定一个优先级,并引入一个栈和一个存储后缀表达式的工
作数组。函数 expr() 工作时,按自左至右逐个顺序扫描中缀表达式,如当前符号是变量
名,就将该变量名直接复制到工作数组;如当前符号是运算符或括号,将当前符号的优先
级和栈顶符号的优先级进行比较;若当前符号的优先级高,则当前符号进栈;反之,则进
行出栈处理,并将从栈中退出的运算符依次复制到工作数组中,直到栈顶符号的优先级比
当前符号的优先级低为止,然后将当前的运算符或左括号进栈。为使子表达式能优先处理,
所以给左括号设定较高的优先级,但又为了能正确处理随后的子表达式,在左括号进栈时,
它在栈中的优先级作了一定的改变。
    初始时,expr() 函数预先在栈底设置一个符号'#',其优先级比所有运算符和括号的
优先级都低。程序还检查输入表达式的运算符和运算分量的合理性,以及括号是否正确配
对。
【程序3】
    #include <stdio.h>
    #include <ctype.h>
    #include <stdlib.h>
    typedef struct node {    /*符号、内部编号、优先级和后继栈元指针*/
      char data;  int code;int pri;strujct mode *link;
    } NODE;
    struct Tb1 {  /*符号、内部编号、优先级*/
      char data; int ckde ; int  pri;
    } opchTb1[] = {{'*', 1, 4}, {'/', 2, 4}, {'+', 3, 2}, {'-', 4, 2},
                  {'(', 5, 5}, {')', 6, 1},{'\0', 7, 0}, {' ',-1, 0}};
    NODE *optop;  /*栈顶指针*/
    Char num[200], *numtop;  /*工作数组和存储指针*/
    Char expStr[200];  /*存储中缀表达式的字符数组*/
    Void push(char x, int c, int p, NODE **topt)  /*链接存储栈的进栈函数*/
    { NODE *q = (NODE *)malloc(sizeof(NODE));
      q->data = x; q->code = c; q->pri = p; ___(1)___ ; *toppt = q;
    }
    int pop(char *op, int *cp, NODE **toppt)  /*链接存储栈的出栈函数*/
    { NODE q = toppt;
      if (*toppt == NULL) return 1;  /*空栈 */
      *op = q->data; cp = q->code; ___(2)___ ; free(q); return 0;
    }
    int expr(char *pos)
    { struct Tb1 *op; char sop; int type, code, n, m, i, c;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。