1998年度中程下午试卷及答案_第1页
1998年度中程下午试卷及答案_第2页
1998年度中程下午试卷及答案_第3页
1998年度中程下午试卷及答案_第4页
1998年度中程下午试卷及答案_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1998年度中程下午试卷及答案试题1 阅读以下程序说明和 C程序,将应填人棗(n)棗处的字句,写在答卷的对应栏内。 程序说明 函数 int commstr(char*strl, char*str2, int*sublen)从两已知字符串 Strl和 Str2中,找出它们的所有最长的公共子串。如果最长公共子串不止 1个,函数将把它们全部找出,并输出。约定空串不作为公共子串。 函数将最长公共子串的长度送人由参数sublen所指的变量中,并返回字符串str1和 和stf2的最长公共子串的个数。如果字符串 strl和 str2没有公共子串,约定最长公共子串 的个数和最长公共子串的长度均为0。 程序 i

2、nt strlen(char * s) char * t s; while(*t); return t?/FONTS一1; int commstr(char *strl,char *str2, int *sublen) char*sl,*s2; int count=0, len1, len2 , k, j, i, p; len1=strlen(str1); len2=strlen(str2); if(len1len2) s1=str1; s2=str2; else len2=len1; s1=str2; s2=str1; for(j=len2; j0; j-) /* 从可能最长子串开始寻找 *

3、/ for(k=0; _(1)_0 ) break; *sublen = (count0) ? _(5)_ ; 0 ; return count; 试题三 阅读以下程序说明和 C程序,将应填人棗(n)棗处的字句,写在答卷的对应栏内。 程序说明 打保龄球是用一个滚球去打出十个站立的柱,将柱击倒。一局分十轮,每轮可滚球一次或多次,以击倒的柱数为依据计分。一局得分为十轮得分之和,而每轮的得分不仅与本轮滚球情况有关,还可能与后续一两轮的;滚球情况有关。即,某轮某次滚球击倒的柱数不仅要计入本轮得分,还可能会计入前一两轮得分。具体的滚球击柱规则和计分方法如下: 若某一轮的第一次滚球就击倒全部十个柱,则本轮

4、不再滚球。(若是第十轮则还需另加两次滚球)。 该轮得分为本次倒柱数10与以后两次滚球所击倒柱数之和。 若某一轮的第一次滚球未击倒十个柱,则可对剩下未倒的柱再滚球一次。如果这两次滚球击倒全部十个柱,则本轮不再滚球(若是第十轮则还需另加一次滚球),该轮得分为本次倒柱数10与以后一次滚球所击倒柱数之和。 若某一轮的两次滚球未击倒全部十个柱,则本轮不再继续滚球,该轮得分为这两次滚球击倒的柱数这和。 总之,若一轮中一次滚球或两次滚球击倒十个柱,则本轮得分是本轮首次滚球开始的连续三次滚球击倒柱数之和(其中有一次或两次不是本轮滚球)。若一轮内二次滚球击倒柱数不足十个,则本轮得分即为这两次击倒柱数之和。 以实

5、例说明如下: 轮 1 2 3 4 5 6 7 8 9 10 各轮第 一次得 10 10 10 7 9 8 8 10 9 10 8 分 各轮第 二次得 / / / 2 1 1 2 / 1 / 2 分 各轮得 分 30 27 19 9 18 9 20 20 20 20 累计 总分 30 57 76 85 103 112 132 152 172 192 本程序是模拟打一局保龄球的过程,统计各轮得分和累计总分。程序交互地逐轮逐次 输人一次滚球击倒的柱数,计算该轮得分和累计总分。为记录因一轮内击倒十柱,还暂不能计算该轮得分和累计总分的情况,程序引人变量Oh,用来记录当前已完成完整计算的轮次。程序每输人一

6、次滚球击倒柱数,就检查还未完成完整计算的轮次,并计算之。 (程序)1 includestdio h define N 13 struct int n;* 一轮内滚球次数 * int f;* 第一次击倒柱数 * int s;* 第一次击倒柱数 * int score; * 本轮得分 */ int total;* 至本轮累计总分 * int m; * 完成本轮得分计算,还需滚球次数 * a N; int ok = 0; * 已完成完整计算的轮次数 * int ball(int i, int n, int max) /* 完成一次滚球,输入正确击倒柱数 */ int d, j, k; staic c

7、=1; while(1) if (i=10) printf( 输入第%d轮的第%d次滚球击倒柱数。(=%d)n, i, n, max); else printf( 输入附加的第%d次滚球击倒柱数。(=0 & d=max) break; printf( 不合理的击倒柱数,请重新输入。n); if (ok _(1)_) /* 对以前未完成计算的轮次分别计算得分与累计总分 */ for(j=ok+1; _(2)_; j+) aj.score +=d; if (-aj.m=0) aj.total=(_(3)_)+aj.score; ok =_(4)_; return d; main() int i,

8、/* 轮次 */ first, second, k; for(i=1; ok 10; i+) /* 处理第一次滚球 */ ai.score = ai.f = first = ball(i,1,10); if (first = 10) ai.m=2; ai.n=1; if (first 10 & (i =10 | i=11 &ok 10 ) /* 处理第二次滚球*/ _(5)_=second=ball(i,2,10-first); if (first + second =10) ai.m=1; _(6)_; if(i = 10 & first 10 & fist +second 1 ? ai-1

9、.total:0)+ai.score; _(7)_; printf( 各轮第一次得分); for(k=1; k=1; k+) printf(%5d, ak.f); printf(n各轮第二次得分 ); for(k=1; k=i; k+) if (ak.n 2) printf( /); else printf(%5d, ak.s); printf( n 各轮得分 ); for(k=1; k = ok; k+) printf(%5d, ak.score); printf(n 累计总分 ); for(k=1; kno, no)next); if (v !=NULL & strcmp(v-no, no

10、)=0) /* 该生已有成绩 */ if (v-cur_s != ss) /* 该生的当前科目成绩是第一次输入 */ v-score += mark; /* 累计总成绩 */ v-cur_s = ss; /* 同一科目成绩重复输入,后输入成绩被忽略。 */ else p= (NODE *)malloc(sizeof(NODE); /* 一位新的学生 */ strcpy(p-no,no); p-score = mark; p-cur_s = ss; p-next = v; if ( v = h) _(2)_; else _(3)_; fclose(fp); printf( 还有科目成绩文件要输入

11、吗? (Y/N); scanf(%c, &ans); if (ans = N | ans = n) break; /* 以下按总成绩和学号对链表排序 */ v = (NODE *)malloc(sizeof(NODE); v-next =h; h=v; while (v-next != NULL) /* 在余下的部分链表中找总成绩高学号小的表元 */ for(p = v, u = v-next; u-next != NULL; u = u-next) if (u-next-score p-next-score | u-next-score = p-next-score & strcmp(u-n

12、ext-no, p-next-no) next; p-next = _(4)_; _(5)_ =v-next; v-next = u; v = v-next; v=h; h = h-next; free(v); printf( 名次 总成绩 人数 学号n); /* 以下按格式要求输出 */ v = h; order = 1; while (v != NULL) for(c=1, u=V-next; u != NULL & u-score = v-score; _(6)_); printf(%4d%7d%8d , order, v-score, c); for(order += c, i = 1

13、; _(7)_; v = v-next, i+) if (i 1 & i%5 = 1) printf(n%23c, ); printf(%s , v-no); printf(n); 试题七 阅读以下程序说明和 C 程序,将应填入(n)处的字句,写在答卷的对应栏内。 程序说明 本程序的函数 int sum(int total, int d, int n) 用来从已知数组d的前n个元素中找出所有部分元素序列之和等于total的元素序列,约定数组d的元素都是正整数,且都小于等于total。如果函数找到了这样的部分元素序列, 函数返回非0值,否则函数返回0值。 函数sum使用试探法找出全部解答。在找解

14、过程中,依次选取候选元素,浓度组成一个和小于total的部分元素序列,进行试探和回溯。 函数中的数组b用来存放候选元素的下标,变量p用来记录当前b中有效下标的个数,t记录当前部分序列的和,函数用它们实现回溯找解。如果t等于total,则表示找到了一个解答,函数将该解答输出,然后通过回溯,再试探寻找其它的解答;如果t还小于total,则继续从d的还未被考虑的那部分元素中找一个与t之和不超过total的元素,如没有这样的元素,函数也得回溯。 程序 #include #define N 100 int an; int sum(int total, int d,int n) int s, p, t,

15、bN, none=1; b0=0; t=d0; p=1; do if (t=total) /* 找到了一个解,把当前解输出 */ printf(%4d-%d,total, db0); for(s=1; sprintf(+%d,dbs); printf(n); none =0; /* 置找到过解的标志 */ else for(s=_(1)_; stotal;s+); if (s n& t _ds =total) b _(3)_ =s; t+=ds; continue; t -=dbp-1; /* 回溯 */ if (p0 =%d)n,i+1,total); scanf(%d, &d); if (

16、dtotal) printf(出错,请重新输入!n); continue; ai+=d; ai+=d; if (!sum(total, a, n) printf(没有找到解答!n); printf(nn); 答案: 第一题 1 k+j 2 i+j-1 3 s1i+p=s2k+p 4 p=j或p=j 5 j 第三题 1 i-1 2 j3 jnext=p 4 u-next 5 u-next 6 c+,u=u-next 7 iS一1; int commstr(char *strl,char *str2, int *sublen) char*sl,*s2; int count=0, len1, len

17、2 , k, j, i, p; len1=strlen(str1); len2=strlen(str2); if(len1len2) s1=str1; s2=str2; else len2=len1; s1=str2; s2=str1; for(j=len2; j0; j-) /* 从可能最长子串开始寻找 */ for(k=0; _(1)_0 ) break; *sublen = (count0) ? _(5)_ ; 0 ; return count; 试题三 阅读以下程序说明和 C程序,将应填人棗(n)棗处的字句,写在答卷的对应栏内。 程序说明 打保龄球是用一个滚球去打出十个站立的柱,将柱击

18、倒。一局分十轮,每轮可滚球一次或多次,以击倒的柱数为依据计分。一局得分为十轮得分之和,而每轮的得分不仅与本轮滚球情况有关,还可能与后续一两轮的;滚球情况有关。即,某轮某次滚球击倒的柱数不仅要计入本轮得分,还可能会计入前一两轮得分。具体的滚球击柱规则和计分方法如下: 若某一轮的第一次滚球就击倒全部十个柱,则本轮不再滚球。(若是第十轮则还需另加两次滚球)。 该轮得分为本次倒柱数10与以后两次滚球所击倒柱数之和。 若某一轮的第一次滚球未击倒十个柱,则可对剩下未倒的柱再滚球一次。如果这两次滚球击倒全部十个柱,则本轮不再滚球(若是第十轮则还需另加一次滚球),该轮得分为本次倒柱数10与以后一次滚球所击倒柱

19、数之和。 若某一轮的两次滚球未击倒全部十个柱,则本轮不再继续滚球,该轮得分为这两次滚球击倒的柱数这和。 总之,若一轮中一次滚球或两次滚球击倒十个柱,则本轮得分是本轮首次滚球开始的连续三次滚球击倒柱数之和(其中有一次或两次不是本轮滚球)。若一轮内二次滚球击倒柱数不足十个,则本轮得分即为这两次击倒柱数之和。 以实例说明如下: 轮 1 2 3 4 5 6 7 8 9 10 各轮第 一次得 10 10 10 7 9 8 8 10 9 10 8 分 各轮第 二次得 / / / 2 1 1 2 / 1 / 2 分 各轮得 分 30 27 19 9 18 9 20 20 20 20 累计 总分 30 57

20、76 85 103 112 132 152 172 192 本程序是模拟打一局保龄球的过程,统计各轮得分和累计总分。程序交互地逐轮逐次 输人一次滚球击倒的柱数,计算该轮得分和累计总分。为记录因一轮内击倒十柱,还暂不能计算该轮得分和累计总分的情况,程序引人变量Oh,用来记录当前已完成完整计算的轮次。程序每输人一次滚球击倒柱数,就检查还未完成完整计算的轮次,并计算之。 (程序)1 includestdio h define N 13 struct int n;* 一轮内滚球次数 * int f;* 第一次击倒柱数 * int s;* 第一次击倒柱数 * int score; * 本轮得分 */ i

21、nt total;* 至本轮累计总分 * int m; * 完成本轮得分计算,还需滚球次数 * a N; int ok = 0; * 已完成完整计算的轮次数 * int ball(int i, int n, int max) /* 完成一次滚球,输入正确击倒柱数 */ int d, j, k; staic c=1; while(1) if (i=10) printf( 输入第%d轮的第%d次滚球击倒柱数。(=%d)n, i, n, max); else printf( 输入附加的第%d次滚球击倒柱数。(=0 & d=max) break; printf( 不合理的击倒柱数,请重新输入。n);

22、if (ok _(1)_) /* 对以前未完成计算的轮次分别计算得分与累计总分 */ for(j=ok+1; _(2)_; j+) aj.score +=d; if (-aj.m=0) aj.total=(_(3)_)+aj.score; ok =_(4)_; return d; main() int i, /* 轮次 */ first, second, k; for(i=1; ok 10; i+) /* 处理第一次滚球 */ ai.score = ai.f = first = ball(i,1,10); if (first = 10) ai.m=2; ai.n=1; if (first 10

23、 & (i =10 | i=11 &ok 10 ) /* 处理第二次滚球*/ _(5)_=second=ball(i,2,10-first); if (first + second =10) ai.m=1; _(6)_; if(i = 10 & first 10 & fist +second 1 ? ai-1.total:0)+ai.score; _(7)_; printf( 各轮第一次得分); for(k=1; k=1; k+) printf(%5d, ak.f); printf(n各轮第二次得分 ); for(k=1; k=i; k+) if (ak.n 2) printf( /); el

24、se printf(%5d, ak.s); printf( n 各轮得分 ); for(k=1; k = ok; k+) printf(%5d, ak.score); printf(n 累计总分 ); for(k=1; kno, no)next); if (v !=NULL & strcmp(v-no, no)=0) /* 该生已有成绩 */ if (v-cur_s != ss) /* 该生的当前科目成绩是第一次输入 */ v-score += mark; /* 累计总成绩 */ v-cur_s = ss; /* 同一科目成绩重复输入,后输入成绩被忽略。 */ else p= (NODE *)

25、malloc(sizeof(NODE); /* 一位新的学生 */ strcpy(p-no,no); p-score = mark; p-cur_s = ss; p-next = v; if ( v = h) _(2)_; else _(3)_; fclose(fp); printf( 还有科目成绩文件要输入吗? (Y/N); scanf(%c, &ans); if (ans = N | ans = n) break; /* 以下按总成绩和学号对链表排序 */ v = (NODE *)malloc(sizeof(NODE); v-next =h; h=v; while (v-next != N

26、ULL) /* 在余下的部分链表中找总成绩高学号小的表元 */ for(p = v, u = v-next; u-next != NULL; u = u-next) if (u-next-score p-next-score | u-next-score = p-next-score & strcmp(u-next-no, p-next-no) next; p-next = _(4)_; _(5)_ =v-next; v-next = u; v = v-next; v=h; h = h-next; free(v); printf( 名次 总成绩 人数 学号n); /* 以下按格式要求输出 */

27、 v = h; order = 1; while (v != NULL) for(c=1, u=V-next; u != NULL & u-score = v-score; _(6)_); printf(%4d%7d%8d , order, v-score, c); for(order += c, i = 1; _(7)_; v = v-next, i+) if (i 1 & i%5 = 1) printf(n%23c, ); printf(%s , v-no); printf(n); 试题七 阅读以下程序说明和 C 程序,将应填入(n)处的字句,写在答卷的对应栏内。 程序说明 本程序的函数 int sum(int total, int d, int n) 用来从已知数组d的前n个元素中找出所有部分元素序列之和等于total的元素序列,约定数组d的元素都是正整数,且都小于等于total。如果函数找到了这样的部分元素序列,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论