试题一 <函数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("Cant 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 及两者的等效形式  |