📄 1998-ۤ-+
字号:
<td height="10" colspan="2"></td>
</tr>
<tr>
<td colspan="2" height="40">
<div align="center">
<h3>
1998年度中程下午试卷及答案 </h3>
</div>
</td>
</tr>
<tr>
<td width="370" height="30">
<div align="right" >(
2001-10-31 20:09:43 ) </div>
</td>
<td width="230">
<div align="right" >本文浏览次数:
1954 次</div>
</td>
</tr>
<tr>
<td colspan="2" class="content">
试题1
<br>
<br>阅读以下程序说明和 C程序,将应填人棗(n)棗处的字句,写在答卷的对应栏内。
<br>
<br>[程序说明]
<br>
<br>函数 int commstr(char*strl, char*str2, int*sublen)从两已知字符串 Strl和 Str2中,找出它们的所有最长的公共子串。如果最长公共子串不止 1个,函数将把它们全部找出,并输出。约定空串不作为公共子串。
<br>
<br>函数将最长公共子串的长度送人由参数sublen所指的变量中,并返回字符串str1和
<br>
<br>和stf2的最长公共子串的个数。如果字符串 strl和 str2没有公共子串,约定最长公共子串 的个数和最长公共子串的长度均为0。
<br>
<br>[程序]
<br>
<br>
<br>
<br>int strlen(char * s)
<br>
<br>{ char * t= s;
<br>
<br>while(*t++);
<br>
<br>return t?/FONT>S一1;
<br>
<br>}
<br>
<br>int commstr(char *strl,char *str2, int *sublen)
<br>
<br>{ char*sl,*s2;
<br>
<br>int count=0, len1, len2 , k, j, i, p;
<br>
<br>len1=strlen(str1);
<br>
<br>len2=strlen(str2);
<br>
<br>if(len1>len2)
<br>
<br>{s1=str1; s2=str2;}
<br>
<br>else {len2=len1; s1=str2; s2=str1;}
<br>
<br>for(j=len2; j>0; j--) /* 从可能最长子串开始寻找 */
<br>
<br>{ for(k=0; __(1)__<=len2; k++) /* k为子串S2的开始位置 */
<br>
<br>{ for( i=0; s1[ __(2)__ ] !=’\0’; i ++;) /* I为子串s1的开始位置 */
<br>
<br>{ /* s1的子串与 的子串比较 */
<br>
<br>for (p=0; p<j && __(3)__; p++);
<br>
<br>if ( __(4)__ ) /* 如果两子串相同 */
<br>
<br>{ for(p=0; p<j; p++) /* 输出子串 */
<br>
<br>printf(“%c”, s2[k+p]);
<br>
<br>printf(“\n”);
<br>
<br>count++; /* 计数增1 */
<br>
<br>}
<br>
<br>}
<br>
<br>}
<br>
<br>if (count >0 ) break;
<br>
<br>}
<br>
<br>*sublen = (count>0) ? __(5)__ ; 0 ;
<br>
<br>return count;
<br>
<br>}
<br>
<br>
<br>
<br>试题三
<br>
<br>阅读以下程序说明和 C程序,将应填人棗(n)棗处的字句,写在答卷的对应栏内。
<br>
<br>[程序说明]
<br>
<br>打保龄球是用一个滚球去打出十个站立的柱,将柱击倒。一局分十轮,每轮可滚球一次或多次,以击倒的柱数为依据计分。一局得分为十轮得分之和,而每轮的得分不仅与本轮滚球情况有关,还可能与后续一两轮的;滚球情况有关。即,某轮某次滚球击倒的柱数不仅要计入本轮得分,还可能会计入前一两轮得分。具体的滚球击柱规则和计分方法如下:
<br>
<br>若某一轮的第一次滚球就击倒全部十个柱,则本轮不再滚球。(若是第十轮则还需另加两次滚球)。 该轮得分为本次倒柱数10与以后两次滚球所击倒柱数之和。
<br>若某一轮的第一次滚球未击倒十个柱,则可对剩下未倒的柱再滚球一次。如果这两次滚球击倒全部十个柱,则本轮不再滚球(若是第十轮则还需另加一次滚球),该轮得分为本次倒柱数10与以后一次滚球所击倒柱数之和。
<br>若某一轮的两次滚球未击倒全部十个柱,则本轮不再继续滚球,该轮得分为这两次滚球击倒的柱数这和。
<br>总之,若一轮中一次滚球或两次滚球击倒十个柱,则本轮得分是本轮首次滚球开始的连续三次滚球击倒柱数之和(其中有一次或两次不是本轮滚球)。若一轮内二次滚球击倒柱数不足十个,则本轮得分即为这两次击倒柱数之和。
<br>
<br>以实例说明如下:
<br>
<br>轮 1 2 3 4 5 6 7 8 9 10
<br>
<br>各轮第
<br>一次得 10 10 10 7 9 8 8 10 9 10 8
<br> 分
<br>
<br>各轮第
<br>二次得 / / / 2 1 1 2 / 1 / 2
<br> 分
<br>各轮得
<br> 分 30 27 19 9 18 9 20 20 20 20
<br>
<br>累计
<br>总分 30 57 76 85 103 112 132 152 172 192
<br>
<br>本程序是模拟打一局保龄球的过程,统计各轮得分和累计总分。程序交互地逐轮逐次
<br>
<br>输人一次滚球击倒的柱数,计算该轮得分和累计总分。为记录因一轮内击倒十柱,还暂不能计算该轮得分和累计总分的情况,程序引人变量Oh,用来记录当前已完成完整计算的轮次。程序每输人一次滚球击倒柱数,就检查还未完成完整计算的轮次,并计算之。
<br>
<br>(程序)1
<br>
<br>#include<stdio. h>
<br>
<br>#define N 13
<br>
<br>struct { int n;/* 一轮内滚球次数 */
<br>
<br>int f;/* 第一次击倒柱数 */
<br>
<br>int s;/* 第一次击倒柱数 */
<br>
<br>int score; /* 本轮得分 */
<br>
<br>int total;/* 至本轮累计总分 */
<br>
<br>int m; /* 完成本轮得分计算,还需滚球次数 */
<br>
<br>} a [N];
<br>
<br>int ok = 0; /* 已完成完整计算的轮次数 */
<br>
<br>int ball(int i, int n, int max) /* 完成一次滚球,输入正确击倒柱数 */
<br>
<br>{ int d, j, k; staic c=1;
<br>
<br>while(1)
<br>
<br>{ if (i<=10)
<br>
<br>printf(" 输入第%d轮的第%d次滚球击倒柱数。(<=%d)\n", i, n, max);
<br>
<br>else
<br>
<br>printf(" 输入附加的第%d次滚球击倒柱数。(<=%d)\n", C++, max);
<br>
<br>scanf("%d", &d);
<br>
<br>if (d >=0 && d<=max) break;
<br>
<br>printf(" 不合理的击倒柱数,请重新输入。\n");
<br>
<br>}
<br>
<br>if (ok <__(1)__)
<br>
<br>{ /* 对以前未完成计算的轮次分别计算得分与累计总分 */
<br>
<br>for(j=ok+1; __(2)__; j++)
<br>
<br>{ a[j].score +=d;
<br>
<br>if (--a[j].m==0)
<br>
<br>{a[j].total=(__(3)__)+a[j].score; ok =__(4)__;}
<br>
<br>}
<br>
<br>}
<br>
<br>return d;
<br>
<br>}
<br>
<br>main()
<br>
<br>{ int i, /* 轮次 */ first, second, k;
<br>
<br>for(i=1; ok < 10; i++)
<br>
<br>{ /* 处理第一次滚球 */
<br>
<br>a[i].score = a[i].f = first = ball(i,1,10);
<br>
<br>if (first == 10) a[i].m=2;
<br>
<br>a[i].n=1;
<br>
<br>if (first <10 && (i <=10 || i==11 &&ok <10 ))
<br>
<br>{ /* 处理第二次滚球*/
<br>
<br>__(5)__=second=ball(i,2,10-first);
<br>
<br>if (first + second ==10) a[i].m=1;
<br>
<br>__(6)__;
<br>
<br>}
<br>
<br>if(i <= 10 && first <10 && fist +second <10)
<br>
<br>{ a[i].total =(i>1 ? a[i-1].total:0)+a[i].score;
<br>
<br>__(7)__;
<br>
<br>}
<br>
<br>printf(" 各轮第一次得分");
<br>
<br>for(k=1; k<=1; k++) printf("%5d", a[k].f);
<br>
<br>printf("\n各轮第二次得分 ");
<br>
<br>for(k=1; k<=i; k++)
<br>
<br>if (a[k].n <2) printf(" /"); else printf("%5d", a[k].s);
<br>
<br>printf(" \n 各轮得分 ");
<br>
<br>for(k=1; k <= ok; k++) printf("%5d", a[k].score);
<br>
<br>printf("\n 累计总分 ");
<br>
<br>for(k=1; k<= ok; k++) printf("%5d", a[k].total);
<br>
<br>printf("\n\n");
<br>
<br>}
<br>
<br>}
<br>
<br>
<br>
<br>
<br>
<br>试题五
<br>
<br>阅读以下程序说明和C程序,将应填入--( )--处的字句,写在答卷的对应栏内。
<br>
<br>[程序说明]
<br>
<br>这里给处的程序逐一从指定课程成绩文件中读入学生的考号和成绩,对同一学生汇总他的总成绩,并按以下格式输出名次(按总成绩由高到底的顺序)、总成绩、同一名次的学生人数、同一名次学生的学号(按学号由小到大的顺序)。
<br>
<br>程序约定学生学习课程不超过30种,课程成绩文件的第一个数字就是课程号,统计过程中,同一课程号的成绩文件不能重复输入。
<br>
<br>程序采用链表结构存储学生有关信息,链表中的每个表元对应一位学生。程序数据输入过程中,形成一个按学号从小到大顺序链接的有序链表。当数据数输入结束后,程序按总成绩从高到低,学号从小到大的顺序对链表排序。程序最后按指定格式输出链表中的信息。程序的输出格式如下例所示:
<br>
<br>
<br>
<br>名次 总成绩 人数 学号 学号 学号
<br>
<br> 1 470 2 12 25
<br> 3 450 3 15 24 50
<br> 6 430 1 14
<br> 7 401 3 13 18 45
<br>
<br>
<br>[程序]
<br>
<br>
<br>#include <stdio.h>
<br>
<br>#define M 30
<br>
<br>#define NLEN 10
<br>
<br>typedef struct node {
<br>
<br>int cur_s; /* 最近输入成绩的科目*/
<br>
<br>char no[NLEN];
<br>
<br>int score;
<br>
<br>struct node *next;
<br>
<br>}NODE;
<br>
<br>int s[M], sp, ss, i, mark, order, c;
<br>
<br>FILE *fp; NODE *h, *u, *v, *p;
<br>
<br>char fname[80], no[NLEN], ans;
<br>
<br>main()
<br>
<br>{ for(h=NULL, sp=0; ;)
<br>
<br>{ printf(" 输入科目成绩文件名(输入aaaa表示强行结束)。 \n");
<br>
<br>while(1)
<br>
<br>{ scanf("%s", fname);
<br>
<br>if (strcmp(fname, "aaaa") == 0) break;
<br>
<br>if ((fp = fopen(fname, "r")) == NULL)
<br>
<br>printf(" 不能打开文件%s, 请重新输入科目文件名。 \n", fname);
<br>
<br>else break;
<br>
<br>}
<br>
<br>if (strcmp(fname, "aaaa") == 0) break;
<br>
<br>fscanf(fp, "%d", &ss); /* 输入科目号 */ s[sp]=s;
<br>
<br>for(i=0; s[i] !=ss; i++);
<br>
<br>if (__(1)__)
<br>
<br>{ printf(" 该科目的成绩已输入,请输入别的科目成绩文件。\n");
<br>
<br>continue;
<br>
<br>}
<br>
<br>sp++;
<br>
<br>while (fscanf(fp, "%s%d", no, &mark) == 2)
<br>
<br>{ /* 在链表中寻找最近输入的学号 */
<br>
<br>for(v =h; v!= NULL && strcmp(v->no, no)<0; u=v, v= v->next);
<br>
<br>if (v !=NULL && strcmp(v->no, no)==0)
<br>
<br>{ /* 该生已有成绩 */
<br>
<br>if (v->cur_s != ss)
<br>
<br>{ /* 该生的当前科目成绩是第一次输入 */
<br>
<br>v->score += mark; /* 累计总成绩 */ v->cur_s = ss;
<br>
<br>} /* 同一科目成绩重复输入,后输入成绩被忽略。 */
<br>
<br>}
<br>
<br>else { p= (NODE *)malloc(sizeof(NODE)); /* 一位新的学生 */
<br>
<br>strcpy(p->no,no); p->score = mark; p->cur_s = ss;
<br>
<br>p->next = v;
<br>
<br>if ( v == h) __(2)__; else __(3)__;
<br>
<br>}
<br>
<br>}
<br>
<br>
<br>fclose(fp);
<br>
<br>printf(" 还有科目成绩文件要输入吗? (Y/N)"); scanf("%c", &ans);
<br>
<br>if (ans == 'N' || ans == 'n') break;
<br>
<br>} /* 以下按总成绩和学号对链表排序 */
<br>
<br>v = (NODE *)malloc(sizeof(NODE));
<br>
<br>v->next =h; h=v;
<br>
<br>while (v->next != NULL)
<br>
<br>{ /* 在余下的部分链表中找总成绩高学号小的表元 */
<br>
<br>for(p = v, u = v->next; u->next != NULL; u = u->next)
<br>
<br>if (u->next->score > p->next->score ||
<br>
<br>u->next->score == p->next->score &&
<br>
<br>strcmp(u->next->no, p->next->no) < 0) p = u;
<br>
<br>if (p != v) { u = p->next; p->next = __(4)__;
<br>
<br>__(5)__ =v->next; v->next = u;
<br>
<br>}
<br>
<br>v = v->next;
<br>
<br>}
<br>
<br>v=h; h = h->next; free(v);
<br>
<br>printf(" 名次 总成绩 人数 学号\n"); /* 以下按格式要求输出 */
<br>
<br>v = h; order = 1;
<br>
<br>while (v != NULL)
<br>
<br>{ for(c=1, u=V->next; u != NULL && u->score == v->score; __(6)__);
<br>
<br>printf("%4d%7d%8d ", order, v->score, c);
<br>
<br>for(order += c, i = 1; __(7)__; v = v->next, i++)
<br>
<br>{ if (i > 1 && i%5 == 1) printf("\n%23c", ' ');
<br>
<br>printf("%s ", v->no);
<br>
<br>} printf("\n");
<br>
<br>}
<br>
<br>}
<br>
<br>
<br>
<br>试题七
<br>
<br>阅读以下程序说明和 C 程序,将应填入_(n)_处的字句,写在答卷的对应栏内。
<br>
<br>[程序说明]
<br>
<br>本程序的函数
<br>
<br>int sum(int total, int d[], int n)
<br>
<br>用来从已知数组d的前n个元素中找出所有部分元素序列之和等于total的元素序列,约定数组d的元素都是正整数,且都小于等于total。如果函数找到了这样的部分元素序列, 函数返回非0值,否则函数返回0值。
<br>
<br>函数sum使用试探法找出全部解答。在找解过程中,依次选取候选元素,浓度组成一个和小于total的部分元素序列,进行试探和回溯。
<br>
<br>函数中的数组b用来存放候选元素的下标,变量p用来记录当前b中有效下标的个数,t记录当前部分序列的和,函数用它们实现回溯找解。如果t等于total,则表示找到了一个解答,函数将该解答输出,然后通过回溯,再试探寻找其它的解答;如果t还小于total,则继续从d的还未被考虑的那部分元素中找一个与t之和不超过total的元素,如没有这样的元素,函数也得回溯。
<br>
<br>
<br>
<br>[程序]
<br>
<br>#include<stdio.h>
<br>
<br>#define N 100
<br>
<br>int a[n];
<br>
<br>int sum(int total, int d[],int n)
<br>
<br>{int s, p, t, b[N], none=1;
<br>
<br>b[0]=0; t=d[0]; p=1;
<br>
<br>do
<br>
<br>{ if (t==total)
<br>
<br>{/* 找到了一个解,把当前解输出 */
<br>
<br>printf("%4d-%d",total, d[b[0]]);
<br>
<br>for(s=1; s<p;s++)
<br>
<br>printf(+%d",d[b[s]]);
<br>
<br>printf("\n");
<br>
<br>none =0; /* 置找到过解的标志 */
<br>
<br>}
<br>
<br>}
<br>
<br>else
<br>
<br>{ for(s=__(1)__; s< n-1 &&__(2) >total;s++);
<br>
<br>if (s< n&& t _d[s] <=total)
<br>
<br>{b[ __(3)__] =s; t+=d[s];
<br>
<br>continue;
<br>
<br>}
<br>
<br>}
<br>
<br>t -=d[b[p-1]]; /* 回溯 */
<br>
<br>if (p<1&& ___(4)__)
<br>
<br>{ p--; t-=__(5)__;
<br>
<br>}
<br>
<br>if (p==1&&__(6)__)break; /* 回溯到底,退出找解循环 */
<br>
<br>t+=d[__(7)__];/* 回溯后,调整 */
<br>
<br>}while(1);
<br>
<br>return !none; /* 返回找到过解答的标志 */
<br>
<br>]
<br>
<br>main( )
<br>
<br>{int i,n, total, d;
<br>
<br>printf("输入 total!/n"); scanf("%d",&total);
<br>
<br>printf("输入 n!/n"); scanf("%d",&n);
<br>
<br>for(i=0; i<n;)
<br>
<br>{print("输入数组的第%d 个正整数(>0 <=%d)\n",i+1,total);
<br>
<br>scanf("%d", &d);
<br>
<br>if (d<1||d>total)
<br>
<br>{printf("出错,请重新输入!\n");
<br>
<br>continue;
<br>
<br>}
<br>
<br>a[i++]=d;
<br>
<br>}
<br>
<br>a[i++]=d;
<br>
<br>}
<br>
<br>if (!sum(total, a, n)) printf("没有找到解答!\n");
<br>
<br>printf("\n\n");
<br>
<br>}
<br>
<br>
<br>答案:
<br>
<br>第一题
<br> 1 k+j
<br> 2 i+j-1
<br> 3 s1[i+p]==s2[k+p]
<br> 4 p==j或p>=j
<br> 5 j
<br>第三题
<br> 1 i-1
<br> 2 j<i
<br> 3 j<1?a[j-1].total:0
<br> 4 ok+1
<br> 5 a[i].score+=a[i].s
<br> 6 a[i].n=2或a[i].n++
<br> 7 ok=i
<br>第五题
<br> 1 i<sp
<br> 2 h=p
<br> 3 u->next=p
<br> 4 u->next
<br> 5 u->next
<br> 6 c++,u=u->next
<br> 7 i<=c
<br>第七题
<br> 1 b[p-1]+1
<br> 2 t+d[s]
<br> 3 p++
<br> 4 b[p-1]==n-1
<br> 5 d[b[p-1]]
<br> 6 b[0]==n-1
<br> 7 ++b[p-1]
<br>
<br> </td>
</tr>
<tr>
<td colspan="2"> </td>
</tr>
</table>
<!-- #EndEditable --></td>
</tr>
<tr>
<td><!-- #BeginLibraryItem "/Library/foot.lbi" -->
<table align=center border=0 cellpadding=0 cellspacing=0 width=100% vspace="0"
hspace="0">
<tbody>
<tr>
<td height=10>
<div align=center>
<hr size=1>
</div>
</td>
</tr>
<tr>
<td height=11 align="center">如有任何问题,请<a href="link.htm" target="_blank"><font color="#3333CC">联系我们</font></a></td>
</tr>
<tr>
<td height=22>
<div align="center"><a href="http://www.kaowang.com/">考网版权所有 </a> Copyight(c)
2000 kaowang.com. All Rights Reserved.</div>
</td>
</tr>
</tbody>
</table>
<!-- #EndLibraryItem --></td>
</tr>
</table>
</body>
<!-- #EndTemplate -->
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -