1998年度中程下午试卷及答案

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1998年度中程下午试卷及答案试题1阅读以下程序说明和C程序,将应填人棗(n)棗处的字句,写在答卷的对应栏内。[程序说明]函数intcommstr(char*strl,char*str2,int*sublen)从两已知字符串Strl和Str2中,找出它们的所有最长的公共子串。如果最长公共子串不止1个,函数将把它们全部找出,并输出。约定空串不作为公共子串。函数将最长公共子串的长度送人由参数sublen所指的变量中,并返回字符串str1和和stf2的最长公共子串的个数。如果字符串strl和str2没有公共子串,约定最长公共子串的个数和最长公共子串的长度均为0。[程序]intstrlen(char*s){char*t=s;while(*t++);returnt?/FONTS一1;}intcommstr(char*strl,char*str2,int*sublen){char*sl,*s2;intcount=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--)/*从可能最长子串开始寻找*/{for(k=0;__(1)__=len2;k++)/*k为子串S2的开始位置*/{for(i=0;s1[__(2)__]!=’\0’;i++;)/*I为子串s1的开始位置*/{/*s1的子串与的子串比较*/for(p=0;pif(__(4)__)/*如果两子串相同*/{for(p=0;pprintf(“%c”,s2[k+p]);printf(“\n”);count++;/*计数增1*/}}}if(count0)break;}*sublen=(count0)?__(5)__;0;returncount;}试题三阅读以下程序说明和C程序,将应填人棗(n)棗处的字句,写在答卷的对应栏内。[程序说明]打保龄球是用一个滚球去打出十个站立的柱,将柱击倒。一局分十轮,每轮可滚球一次或多次,以击倒的柱数为依据计分。一局得分为十轮得分之和,而每轮的得分不仅与本轮滚球情况有关,还可能与后续一两轮的;滚球情况有关。即,某轮某次滚球击倒的柱数不仅要计入本轮得分,还可能会计入前一两轮得分。具体的滚球击柱规则和计分方法如下:若某一轮的第一次滚球就击倒全部十个柱,则本轮不再滚球。(若是第十轮则还需另加两次滚球)。该轮得分为本次倒柱数10与以后两次滚球所击倒柱数之和。若某一轮的第一次滚球未击倒十个柱,则可对剩下未倒的柱再滚球一次。如果这两次滚球击倒全部十个柱,则本轮不再滚球(若是第十轮则还需另加一次滚球),该轮得分为本次倒柱数10与以后一次滚球所击倒柱数之和。若某一轮的两次滚球未击倒全部十个柱,则本轮不再继续滚球,该轮得分为这两次滚球击倒的柱数这和。总之,若一轮中一次滚球或两次滚球击倒十个柱,则本轮得分是本轮首次滚球开始的连续三次滚球击倒柱数之和(其中有一次或两次不是本轮滚球)。若一轮内二次滚球击倒柱数不足十个,则本轮得分即为这两次击倒柱数之和。以实例说明如下:轮12345678910各轮第一次得1010107988109108分各轮第二次得///2112/1/2分各轮得分302719918920202020累计总分30577685103112132152172192本程序是模拟打一局保龄球的过程,统计各轮得分和累计总分。程序交互地逐轮逐次输人一次滚球击倒的柱数,计算该轮得分和累计总分。为记录因一轮内击倒十柱,还暂不能计算该轮得分和累计总分的情况,程序引人变量Oh,用来记录当前已完成完整计算的轮次。程序每输人一次滚球击倒柱数,就检查还未完成完整计算的轮次,并计算之。(程序)1#include<stdio.h>#defineN13struct{intn;/*一轮内滚球次数*/intf;/*第一次击倒柱数*/ints;/*第一次击倒柱数*/intscore;/*本轮得分*/inttotal;/*至本轮累计总分*/intm;/*完成本轮得分计算,还需滚球次数*/}a[N];intok=0;/*已完成完整计算的轮次数*/intball(inti,intn,intmax)/*完成一次滚球,输入正确击倒柱数*/{intd,j,k;staicc=1;while(1){if(i=10)printf(输入第%d轮的第%d次滚球击倒柱数。(=%d)\n,i,n,max);elseprintf(输入附加的第%d次滚球击倒柱数。(=%d)\n,C++,max);scanf(%d,&d);if(d=0&&d=max)break;printf(不合理的击倒柱数,请重新输入。\n);}if(ok__(1)__){/*对以前未完成计算的轮次分别计算得分与累计总分*/for(j=ok+1;__(2)__;j++){a[j].score+=d;if(--a[j].m==0){a[j].total=(__(3)__)+a[j].score;ok=__(4)__;}}}returnd;}main(){inti,/*轮次*/first,second,k;for(i=1;ok10;i++){/*处理第一次滚球*/a[i].score=a[i].f=first=ball(i,1,10);if(first==10)a[i].m=2;a[i].n=1;if(first10&&(i=10||i==11&&ok10)){/*处理第二次滚球*/__(5)__=second=ball(i,2,10-first);if(first+second==10)a[i].m=1;__(6)__;}if(i=10&&first10&&fist+second10){a[i].total=(i1?a[i-1].total:0)+a[i].score;__(7)__;}printf(各轮第一次得分);for(k=1;k=1;k++)printf(%5d,a[k].f);printf(\n各轮第二次得分);for(k=1;k=i;k++)if(a[k].n2)printf(/);elseprintf(%5d,a[k].s);printf(\n各轮得分);for(k=1;k=ok;k++)printf(%5d,a[k].score);printf(\n累计总分);for(k=1;k=ok;k++)printf(%5d,a[k].total);printf(\n\n);}}试题五阅读以下程序说明和C程序,将应填入--()--处的字句,写在答卷的对应栏内。[程序说明]这里给处的程序逐一从指定课程成绩文件中读入学生的考号和成绩,对同一学生汇总他的总成绩,并按以下格式输出名次(按总成绩由高到底的顺序)、总成绩、同一名次的学生人数、同一名次学生的学号(按学号由小到大的顺序)。程序约定学生学习课程不超过30种,课程成绩文件的第一个数字就是课程号,统计过程中,同一课程号的成绩文件不能重复输入。程序采用链表结构存储学生有关信息,链表中的每个表元对应一位学生。程序数据输入过程中,形成一个按学号从小到大顺序链接的有序链表。当数据数输入结束后,程序按总成绩从高到低,学号从小到大的顺序对链表排序。程序最后按指定格式输出链表中的信息。程序的输出格式如下例所示:名次总成绩人数学号学号学号14702122534503152450643011474013131845[程序]#include#defineM30#defineNLEN10typedefstructnode{intcur_s;/*最近输入成绩的科目*/charno[NLEN];intscore;structnode*next;}NODE;ints[M],sp,ss,i,mark,order,c;FILE*fp;NODE*h,*u,*v,*p;charfname[80],no[NLEN],ans;main(){for(h=NULL,sp=0;;){printf(输入科目成绩文件名(输入aaaa表示强行结束)。\n);while(1){scanf(%s,fname);if(strcmp(fname,aaaa)==0)break;if((fp=fopen(fname,r))==NULL)printf(不能打开文件%s,请重新输入科目文件名。\n,fname);elsebreak;}if(strcmp(fname,aaaa)==0)break;fscanf(fp,%d,&ss);/*输入科目号*/s[sp]=s;for(i=0;s[i]!=ss;i++);if(__(1)__){printf(该科目的成绩已输入,请输入别的科目成绩文件。\n);continue;}sp++;while(fscanf(fp,%s%d,no,&mark)==2){/*在链表中寻找最近输入的学号*/for(v=h;v!=NULL&&strcmp(v-no,no)0;u=v,v=v-next);if(v!=NULL&&strcmp(v-no,no)==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(还有科目成绩文件要输入吗?(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-scorep-next-score||u-next-score==p-next-score&&strcmp(u-next-no,p-next-no)0)p=u;if(p!=v){u=p-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;__(7)__;v=v-next,i++){if(i1&&i%5==1)printf(\n%23c,'');printf(%s,v-no);}printf(\n);}}试题七阅读以下程序说明和C程序,将应填入_(n)_处的字句,写在答卷的对应栏内。[程序说明]本程序的函数intsum(inttotal,intd[],intn)用来从已知数组d的前n个元素中找出所有部分元素序列之和等于total的元素序列,约定数组d的元素都是正整数,且都小于等于total。如果函数找到了这样的部分元素序列,函数返回非0值,否则函数返回0值。函数sum使用试探法找出全部解答。在找解过程中,依次选取候选元素,浓度组成一个和小于total的部分元素序列,进行试探和回溯。函数中的数组b用来存放候选元素的下

1 / 28
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功