中国教育在线 中国教育网 加入收藏 设为首页

一九九九年度程序员级 下午试卷

http://itpx.eol.cn  来源:  作者:  2004-04-14    


试题一

<函数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();
}

推荐给好友    我要收藏    我要纠错    分享到

相关资讯

免责声明:

① 凡本站注明“稿件来源:中国教育在线”的所有文字、图片和音视频稿件,版权均属本网所有,任何媒体、网站或个人未经本网协议授权不得转载、链接、转贴或以其他方式复制发表。已经本站协议授权的媒体、网站,在下载使用时必须注明“稿件来源:中国教育在线”,违者本站将依法追究责任。

② 本站注明稿件来源为其他媒体的文/图等稿件均为转载稿,本站转载出于非商业性的教育和科研之目的,并不意味着赞同其观点或证实其内容的真实性。如转载稿涉及版权等问题,请作者在两周内速来电或来函联系。

内容推荐
eol.cn简介 | 联系方式 | 网站声明 | 京ICP证140769号 | 京ICP备12045350号 | 京公网安备 11010802020236号
版权所有 北京中教双元科技集团有限公司 EOL Corporation
Mail to: webmaster@eol.cn