网站建设| 数据库类| 图形图象| 程序设计| 现代办公| 操作系统| 考试认证| 网络技术| 软件工程| 电脑相关| 文学作品
网站开发| 网页制作| 操作系统| 图象图形| 考试认证| 数据库类| 程序设计| 硬件技术| 现代办公| 网络技术| 笑话频道
 
您的位置: 电脑书库首页-> 电脑文摘-> 考试认证-> 水平考试-> 一九九九年度程序员级-下午试卷

一九九九年度程序员级-下午试卷
作者:佚名 来源:InterNet 加入时间:2005-1-17
相关文章
  • 一九九九年度程序员级-上午试卷
  • 相关书籍:
  • JAVA程序员必读基础篇
  • Visual Basic 6.0中文版程序员指南
  • 程序员修炼之道
  • 程序员面试公略
  • 程序员超级开发宝典
  • 程序员 2005 第12期
  • 程序员 2005 第11期
  • 程序员 2005 第10期
  • 程序员 2005 第9期
  • 程序员 2005 第8期
  • 试题一
    <函数1.1说明>
    函数strcpy(char *to,char *from)将字符串from复制到字符串to.
    <函数1.1>
    void strcpy(char *to,char *from)
    {while (____(1)____);}

    <函数1.2说明>
    函数merge(int a[],int n,int b[],int m,int *c)是将两个从小到大有序数组,a和b复制合并出一个有序整数序列c,其中形参n和m分别是数组a和b的元素个数.
    <函数1.2>
     void merge(int a[],int n,int b[],int m,int *c)
    { int i,j;
     for (i=j=0;i<n&&j<m;)
      *c++=a[i]<b[j]?a[i++]:b[j++];
      while (____(2)____) *c++=a[i++];
      while (____(3)____) *c++=b[j++];
      }

    <函数 1.3说明>
      递归函数sum(int a[],int n)的返回值是数组a[]的前n个元素之和
    <函数 1.3>
    int sum(int a[],int n)
    { if (n>0) return ____(4)____ ;
      else ____(5)_____;
    }

    试题二
    阅读下列函数说明和C代码,将应填入____(n)____处的子句写在答卷的对应栏内.
    <函数 2说明>
      本题中的函数encode()和decode()分别实现对字符串的变换和复原.变换函数encode()顺序考察已知字符串的字符,按以下规则逐组生成新字符串:
      (1)若已知字符串的当前字符不是数字字符,则复制该字符于新字符串中.
      (2)若已知字符串的当前字符是一个数字字符,且它之后没有后继字符,则简单地将它复制到新字符串中
      (3)若已知字符串的当前字符是一个数字字符,并且还有后继字符,设该数字字符的面值为n,则将它的后继字符(包括后继字符是一个数字字符)重复复制n+1次到新字符串中.
      (4)以上述一次变换为一组,在不同组之间另插入一个下划线'_'用于分隔.例如:encode()函数对字符串26a3t2的变换结果为666_a_tttt_2
      复原函数decode()做变换函数encode()的相反的工作.即复制不连续相同的单个字符,而将一组连续相同的字符(不超过10个)变换成一个用于表示重复次数的数字符和一个重复出现的字符,并在复原过程中掠过变换函数为不同组之间添加的一个下划线字符.
      假定调用变换函数encode()时的已知字符串中不含下划线字符.
    <函数>
    int encode(char *instr,char *outstr)
    { char *ip,*op,c;int k,n;
     ip=instr; op=outstr;
     while (*ip) {
      if (*ip>='0'&&*ip<='9'&&*(ip+1)) {
        n=____(1)____;
        c=____(2)____;
        for (k=0;k<n;k++)
          *op++=c;
       }else____(3)____;
       *op++='_';
       ip++;
      }
      if (op>outstr) op--;
      ____(4)____;
      return op - outstr;
    }
    int decode(char *instr,char *outstr)
    { char *ip,*op,c;  int n;
      ip=instr; op=outstr;
      while (*ip) {
       c=*ip; n=0;
       while (*ip==c&&n<10) {ip++; n++; }
       if (____(5)_____) *op++='0'+n-1;
       *op++=c;
       if (____(6)____) ip++;
     }
     *op='\0';
     return op - outstr;
     }

    试题三
      本程序从正文文件text.ini读入一篇英文短文,统计该短文中不同单词和它的出现次数,并按词典编辑顺序将单词及它的出现次数输出到正文文件word.out中.
      程序用一棵有序二叉树存储这些单词及其出现的次数,一边读入一边建立.然后中序遍历该二叉树,将遍历经过的二叉树上结点的内容输出.
      程序中的外部函数
      int getword(FILE *fpt,char *word)
    从与fpt所对应的文件中读取单词置入word,并返回1;若读单词遇文件尾,已无单词可读时,则返回0.
    <程序3>
      #include <stdio.h>
      #include <malloc.h>
      #include <ctype.h>
      #include <string.h>
      #define INF "TEXT.IN"
      #define OUTF "WORD.OUT"
      typedef struct treenode { char *word;
                   int count;
                   struct treenode *left, *right;
                   }BNODE;
    int getword(FILE *fpt,char *word);
    void binary_tree(BNODE **t,char *word)
    { BNODE *ptr, *p; int cmpres;
     p=NULL; ____(1)____;
     while (ptr) {/*寻找插入位置*/
       cmpres=strcmp(word,____(2)____); /* 保存当前比较结果 */
       if (!cmpres) { ____(3)____; return;}
       else { ____(4)____;
          ptr=cmpres>0 ? ptr->right:ptr->left;
          }
    }
    ptr=(BNODE *)malloc(sizeof(BNODE));
    ptr->right=ptr->left=NULL;
    ptr->word=(char *)malloc(strlen(word)+1);
    strcpy(ptr->word,word); ptr->count=1;
    if (p==NULL) ____(5)_____
    else if (cmpres >0) p->right=ptr;
        else p->left=ptr;
    }

    void midorder(FILE *fpt, BNODE *t)
    { if ( ____(6)____) return;
     midorder(fpt,t->left);
     fprintf(fpt,"%s  %d\n",t->word,t->count);
     midorder(fpt,t->right);
    }

    void main()
    { FILE *fpt; char word[40];
     BNODE *root=NULL;
     if ((fpt=fopen(INF,"r"))==NULL) {
       printf("Can't open file %s\n",INF);
       return;
    }
    while (getword(fpt,word)==1)
       binary_tree(____(7)____);
     fclose(fpt);
     fpt=fopen(OUTF,"w");
     midorder(fpt,root);
     fclose(fpt);
    }

    试题4
      本程序在3X3方格中填入数字1~N(N>=10)内的某9个互不相同的整数,使所有相邻两个方格内的两个整数之和为质数.试求出满足这个要求的所有填法.3X3方格中的每个方格序号如图4所示.
      程序采用试探法,即从序号为0的方格开始,为当前方格寻找一个合理的可填整数,并在当前位置正确填入后,为下一方格寻找可填入的合理整数.如不能为当前方格寻找一个合理的可填整数,就要后退到前一方格,调整前一方格的填入整数.当直至序号为8的方格也填入合理的整数后,就找到了一个解。为了检查当前方格的填入整数的合理性,程序引入二维数组CheckMatrix,存放需要进行合理性检查的相邻方格的序号。
    <程序4>
      #include <stdio.h>
      #define N 12
      int pos;
      int a[9]; /*用于存储方格所填入的整数 */
      checkMatrix[][3]={{-1},{0,-1},{1,-1},
                {0,-1},{1,3,-1},{2,4,-1},
                {3,-1},{4,6,-1},{5,7,-1}};
    void write(int a[])
    { int i,j;
     for (i=0;i<3;i++) {
      for (j=0;j<3;j++) printf("%3d",a[3*i+j]);
      printf("\n");
      }
    }
    int isPrime(int m)
    { int i;
     if (m==2) return 1;
     if (m==1 || m%2==0) return 0;
     for (i=3; i*i<=m;) {
       if (m%i==0) return 0;
       i+=2;
     }
     return 1;
    }
    int selectNum(int start)
    { int j;
     for (j=start;j<=N;j++)
      if (b[j]) return j;
     return 0;
    }
    int check() /*检查填入pos位置的整数是否合理*/
    {int i,j;
     for (i=0; (j=____(1)____) >=0; i++)
        if (!isPrime(a[pos]+a[j])) ____(2)____;
       (3)  ;
    }
    extend() /*为下一方格找一个尚未使用过的整数*/
    { a[____(4)____]=selectNum(1); b[a[pos]]=0; }
    void change() /*为当前方格找下一个尚未使用过的整数*/
    { a[____(4)____]=selectNum(1);b[a[pos]]=0;}
    void change() /*为当前方格找下一个尚未使用过的整数。(找不到回溯)*/
    { int j;
     while (pos>=0 && (j=selectNum(____(5)____))==0) _____(6)_____;
     if (pos<0) return;
     b[a[pos]]=1; a[pos]=j; b[j]=0;
    }
    find()
    {int ok=1;
     pos=0;a[pos]=1; b[a[pos]]=0;
     do {
       if (ok)
        if (____(7)____) {
          write(a);
          change();
        }
        else extend();
       else change();
       ok=check(pos);
      }while (pos>=0);
    }
    main()
    { int i;
     for (i=1;i<=N;i++) b[i]=1;
     find();
    }




    -----------------------------------------
    参考答案

    试题一
      (1)*to++=*from++ 或 (*to++=*from++) != '\0'
      (2)i<n 或 i!=n
      (3)j<m 或 j!=m
      (4)a[n-1]+sum(a,n-1) 或 a[0]+sum(a+1,n-1)
      (5)return 0

    试题二
      (1)*ip - '0' + 1 或 *ip-47
      (2)*++ip
      (3)*op++=*ip
      (4)*op='\0'
      (5)n>1
      (6)*ip=='_'

    试题三
      (1)*ptr=*t
      (2)ptr->word
      (3)ptr->count++ 或任何使ptr->count 增1的c代码
      (4)p=ptr
      (5)*t=ptr
      (6)t=NULL 或!(
      (7)&root,word

    试题四
      (1)checkMatrix[pos][i]
      (2)(3) return0 return1 或 break return j<0 ? 1: 0 及类似效果的代码
      (4)++pos
      (5)a[pos]+1
      (6)b[a[pos--]]=1
      (7)pos==8 或 pos>7 及两者的等效形式


    [文章录入员:tonny]

    相关文章
  • 一九九九年度程序员级-上午试卷
  • 相关书籍:
  • JAVA程序员必读基础篇
  • Visual Basic 6.0中文版程序员指南
  • 程序员修炼之道
  • 程序员面试公略
  • 程序员超级开发宝典
  • 程序员 2005 第12期
  • 程序员 2005 第11期
  • 程序员 2005 第10期
  • 程序员 2005 第9期
  • 程序员 2005 第8期
  • 本站推荐内容

    近期主机类热搜关键词:
    美国服务器 美国服务器租用 海外服务器租用 国外服务器租用

    水平考试
    微软认证
    思科认证
    其他认证
    等级考试
    水平考试
    公务员考试
    其它
    电脑教程阅读排行
    ·2004年11月软考模拟试题(网...
    ·2004年11月软考模拟试题(网...
    ·2004年11月软考模拟试题(网...
    ·软考辅导难题精讲:题目(1)
    ·国家网络技术水平考试认证的分级及...
    ·2004年11月软考模拟试题(程...
    ·90天搞定系统分析员考试回顾
    ·软考辅导难题精讲:题目(5)
    ·一九九九年度程序员级-上午试卷
    ·一九九九年度程序员级-下午试卷