[一九九八年抗洪]一九九八年度程序员级下午试题

计算机技术 2020-12-24 网络整理 可可

【shitiku.jxxyjl.com--计算机技术】

试题1..joxue.
阅读以下程序说明和 C程序,将应填人棗(n)棗处的字句,写在答卷的对应栏内。..joxue.
[程序说明]..joxue.
函数 int commstr(char*strl, char*str2, int*sublen)从两已知字符串 Strl和 Str2中,找出它们..joxue.
的所有最长的公共子串。如果最长公共子串不止 1个,函数将把它们全部找出,并输出。约定空串不作为公共..joxue.
子串。..joxue.
函数将最长公共子串的长度送人由参数sublen所指的变量中,并返回字符串str1和..joxue.
和stf2的最长公共子串的个数。如果字符串 strl和 str2没有公共子串,约定最长公共子串 的个数和最长公..joxue.
共子串的长度均为0。..joxue.
[程序]..joxue.
int strlen(char * s)..joxue.
{ char * t= s;..joxue.
while(*t++);..joxue.
return t?/FONT>S一1;..joxue.
..joxue.
int commstr(char *strl,char *str2, int *sublen)..joxue.
{ char*sl,*s2;..joxue.
int count=0, len1, len2 , k, j, i, p;..joxue.
len1=strlen(str1);..joxue.
len2=strlen(str2);..joxue.
if(len1>len2)..joxue.
{s1=str1; s2=str2;}..joxue.
else {len2=len1; s1=str2; s2=str1;}..joxue.
for(j=len2; j>0; j--) /* 从可能最长子串开始寻找 */..joxue.
{ for(k=0; __(1)__<=len2; k++) /* k为子串s2的开始位置 */ { for( i=0; s1[ __(2)__ ] !=’\0’; i ++;) /* i为子串s1的开始位置 */ { /* s1的子串与 的子串比较 */ for (p=0; p0 )..joxue.
break;..joxue.
}..joxue.
*sublen = (count>0) ? __(5)__ ; 0 ;..joxue.
return count;..joxue.
}..joxue.

试题三..joxue.
阅读以下程序说明和 C程序,将应填人棗(n)棗处的字句,写在答卷的对应栏内。..joxue.
[程序说明]..joxue.
打保龄球是用一个滚球去打出十个站立的柱,将柱击倒。一局分十轮,每轮可滚球一次或多次,以击倒的柱数..joxue.
为依据计分。一局得分为十轮得分之和,而每轮的得分不仅与本轮滚球情况有关,还可能与后续一两轮的;滚..joxue.
球情况有关。即,某轮某次滚球击倒的柱数不仅要计入本轮得分,还可能会计入前一两轮得分。具体的滚球击..joxue.
柱规则和计分方法如下:..joxue.
若某一轮的第一次滚球就击倒全部十个柱,则本轮不再滚球。(若是第十轮则还需另加两次滚球)。 该轮得分..joxue.
为本次倒柱数10与以后两次滚球所击倒柱数之和。 ..joxue.
若某一轮的第一次滚球未击倒十个柱,则可对剩下未倒的柱再滚球一次。如果这两次滚球击倒全部十个柱,则本..joxue.
轮不再滚球(若是第十轮则还需另加一次滚球),该轮得分为本次倒柱数10与以后一次滚球所击倒柱数之和。 ..joxue.
若某一轮的两次滚球未击倒全部十个柱,则本轮不再继续滚球,该轮得分为这两次滚球击倒的柱数这和。 ..joxue.
总之,若一轮中一次滚球或两次滚球击倒十个柱,则本轮得分是本轮首次滚球开始的连续三次滚球击倒柱数之..joxue.
和(其中有一次或两次不是本轮滚球)。若一轮内二次滚球击倒柱数不足十个,则本轮得分即为这两次击倒柱..joxue.
数之和。..joxue.
以实例说明如下:..joxue.

..joxue.

..joxue.

..joxue.

1..joxue.

..joxue.

2..joxue.

..joxue.

3..joxue.

..joxue.

4..joxue.

..joxue.

5..joxue.

..joxue.

6..joxue.

..joxue.

7..joxue.

..joxue.

8..joxue.

..joxue.

9..joxue.

..joxue.

10..joxue.

..joxue.
..joxue.

..joxue.

..joxue.

各轮第一次得分..joxue.

..joxue.

10..joxue.

..joxue.

10..joxue.

..joxue.

10..joxue.

..joxue.

7..joxue.

..joxue.

9..joxue.

..joxue.

8..joxue.

..joxue.

8..joxue.

..joxue.

10..joxue.

..joxue.

9..joxue.

..joxue.

10..joxue.

..joxue.

8..joxue.

..joxue.

..joxue.

各轮第二次得分..joxue.

..joxue.

/..joxue.

..joxue.

/..joxue.

..joxue.

/..joxue.

..joxue.

2..joxue.

..joxue.

1..joxue.

..joxue.

1..joxue.

..joxue.

2..joxue.

..joxue.

/..joxue.

..joxue.

1..joxue.

..joxue.

/..joxue.

..joxue.

2..joxue.

..joxue.

..joxue.

各轮得分..joxue.

..joxue.

30..joxue.

..joxue.

27..joxue.

..joxue.

19..joxue.

..joxue.

9..joxue.

..joxue.

18..joxue.

..joxue.

9..joxue.

..joxue.

20..joxue.

..joxue.

20..joxue.

..joxue.

20..joxue.

..joxue.

20..joxue.

..joxue.
..joxue.

..joxue.

..joxue.

累计总分..joxue.

..joxue.

30..joxue.

..joxue.

57..joxue.

..joxue.

76..joxue.

..joxue.

85..joxue.

..joxue.

103..joxue.

..joxue.

112..joxue.

..joxue.

132..joxue.

..joxue.

152..joxue.

..joxue.

172..joxue.

..joxue.

192..joxue.

..joxue.
..joxue.

..joxue.

..joxue.
本程序是模拟打一局保龄球的过程,统计各轮得分和累计总分。程序交互地逐轮逐次..joxue.
输人一次滚球击倒的柱数,计算该轮得分和累计总分。为记录因一轮内击倒十柱,还暂不能计算该轮得分和累..joxue.
计总分的情况,程序引人变量Oh,用来记录当前已完成完整计算的轮次。程序每输人一次滚球击倒柱数,就检..joxue.
查还未完成完整计算的轮次,并计算之。..joxue.
(程序)1..joxue.
#include<stdio. h>..joxue.
#define N 13..joxue.
struct { int n;/* 一轮内滚球次数 */..joxue.
int f;/* 第一次击倒柱数 */..joxue.
int s;/* 第一次击倒柱数 */..joxue.
int score; /* 本轮得分 */..joxue.
int total;/* 至本轮累计总分 */..joxue.
int m; /* 完成本轮得分计算,还需滚球次数 */..joxue.
} a [N];..joxue.
int ok = 0; /* 已完成完整计算的轮次数 */..joxue.
int ball(int i, int n, int max) /* 完成一次滚球,输入正确击倒柱数 */..joxue.
{ int d, j, k; staic c=1;..joxue.
while(1)..joxue.
{ if (i<=10) printf(" 输入第%d轮的第%d次滚球击倒柱数。(<=%d)\n", i, n, max); else printf(" 输入附加的第%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)__;} } } return d; } main() { int i, /* 轮次 */ first, second, k; for(i=1; ok < 10; i++) { /* 处理第一次滚球 */ a[i].score=a[i].f =first =ball(i,1,10); if (first== 10) a[i].m=2; a[i].n=1; if (first <10 && (i <=10 || i==11 &&ok <10 )) { /* 处理第二次滚球*/ __(5)__=second=ball(i,2,10-first); if (first + second==10) a[i].m=1; __(6)__; } if(i <=10 && first <10 && fist +second <10) { a[i].total=(i>1 ? a[i-1].total:0)+a[i].score;..joxue.
__(7)__;..joxue.
}..joxue.
printf(" 各轮第一次得分");..joxue.
for(k=1; k<=1; k++) printf("%5d", a[k].f); printf("\n各轮第二次得分 "); for(k=1; k<=i; k++) if (a[k].n <2) printf(" /"); else printf("%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"); } } 试题五..joxue.
阅读以下程序说明和C程序,将应填入--( )--处的字句,写在答卷的对应栏内。..joxue.
[程序说明]..joxue.
这里给处的程序逐一从指定课程成绩文件中读入学生的考号和成绩,对同一学生汇总他的总成绩,并按以下格..joxue.
式输出名次(按总成绩由高到底的顺序)、总成绩、同一名次的学生人数、同一名次学生的学号(按学号由小..joxue.
到大的顺序)。..joxue.
程序约定学生学习课程不超过30种,课程成绩文件的第一个数字就是课程号,统计过程中,同一课程号的成绩..joxue.
文件不能重复输入。..joxue.
程序采用链表结构存储学生有关信息,链表中的每个表元对应一位学生。程序数据输入过程中,形成一个按学..joxue.
号从小到大顺序链接的有序链表。当数据数输入结束后,程序按总成绩从高到低,学号从小到大的顺序对链表..joxue.
排序。程序最后按指定格式输出链表中的信息。程序的输出格式如下例所示:..joxue.

..joxue.

名次..joxue.

..joxue.

总成绩..joxue.

..joxue.

人数..joxue.

..joxue.

学号..joxue.

..joxue.

学号..joxue.

..joxue.

学号..joxue.

..joxue.

..joxue.

1..joxue.

..joxue.

470..joxue.

..joxue.

2..joxue.

..joxue.

12..joxue.

..joxue.

25..joxue.

..joxue.
..joxue.

..joxue.

..joxue.

3..joxue.

..joxue.

450..joxue.

..joxue.

3..joxue.

..joxue.

15..joxue.

..joxue.

24..joxue.

..joxue.

50..joxue.

..joxue.

..joxue.

6..joxue.

..joxue.

430..joxue.

..joxue.

1..joxue.

..joxue.

14..joxue.

..joxue.
..joxue.

..joxue.
..joxue.

..joxue.

..joxue.

7..joxue.

..joxue.

401..joxue.

..joxue.

3..joxue.

..joxue.

13..joxue.

..joxue.

18..joxue.

..joxue.

45..joxue.

..joxue.

[程序]..joxue.
#include ..joxue.
#define M 30..joxue.
#define NLEN 10..joxue.
typedef struct node {..joxue.
int cur_s; /* 最近输入成绩的科目*/..joxue.
char no[NLEN];..joxue.
int score;..joxue.
struct node *next;..joxue.
}NODE;..joxue.
int s[M], sp, ss, i, mark, order, c;..joxue.
FILE *fp; NODE *h, *u, *v, *p;..joxue.
char fname[80], no[NLEN], ans;..joxue.
main()..joxue.
{ for(h=NULL, sp=0; ;)..joxue.
{ printf(" 输入科目成绩文件名(输入aaaa表示强行结束)。 \n");..joxue.
while(1)..joxue.
{ scanf("%s", fname);..joxue.
if (strcmp(fname, "aaaa") == 0) break;..joxue.
if ((fp = fopen(fname, "r")) == NULL)..joxue.
printf(" 不能打开文件%s, 请重新输入科目文件名。 \n", fname);..joxue.
else break;..joxue.
}..joxue.
if (strcmp(fname, "aaaa") == 0) break;..joxue.
fscanf(fp, "%d", &ss); /* 输入科目号 */ s[sp]=s;..joxue.
for(i=0; s[i] !=ss; i++);..joxue.
if (__(1)__)..joxue.
{ printf(" 该科目的成绩已输入,请输入别的科目成绩文件。\n");..joxue.
continue;..joxue.
}..joxue.
sp++;..joxue.
while (fscanf(fp, "%s%d", no, &mark) == 2)..joxue.
{ /* 在链表中寻找最近输入的学号 */..joxue.
for(v =h; v!= NULL && strcmp(v->no, no)<0; u=v, v=v->next);..joxue.
if (v !=NULL && strcmp(v->no, no)==0)..joxue.
{ /* 该生已有成绩 */..joxue.
if (v->cur_s != ss)..joxue.
{ /* 该生的当前科目成绩是第一次输入 */..joxue.
v->score += mark; /* 累计总成绩 */ v->cur_s = ss;..joxue.
} /* 同一科目成绩重复输入,后输入成绩被忽略。 */..joxue.
}..joxue.
else { p= (NODE *)malloc(sizeof(NODE)); /* 一位新的学生 */..joxue.
strcpy(p->no,no); p->score = mark; p->cur_s = ss;..joxue.
p->next = v;..joxue.
if ( v == h) __(2)__; else __(3)__;..joxue.
}..joxue.
}..joxue.
fclose(fp);..joxue.
printf(" 还有科目成绩文件要输入吗? (Y/N)"); scanf("%c", &ans);..joxue.
if (ans == "N" || ans == "n") break;..joxue.
} /* 以下按总成绩和学号对链表排序 */..joxue.
v = (NODE *)malloc(sizeof(NODE));..joxue.
v->next =h; h=v;..joxue.
while (v->next != NULL)..joxue.
{ /* 在余下的部分链表中找总成绩高学号小的表元 */..joxue.
for(p = v, u = v->next; u->next != NULL; u = u->next)..joxue.
if (u->next->score > p->next->score ||..joxue.
u->next->score == p->next->score &&..joxue.
strcmp(u->next->no, p->next->no) <0) p=u; if (p !=v) { u=p->next; p->next = __(4)__;..joxue.
__(5)__ =v->next; v->next = u;..joxue.
}..joxue.
v = v->next;..joxue.
}..joxue.
v=h; h = h->next; free(v);..joxue.
printf(" 名次 总成绩 人数 学号\n"); /* 以下按格式要求输出 */..joxue.
v = h; order = 1;..joxue.
while (v != NULL)..joxue.
{ for(c=1, u=V->next; u != NULL && u->score == v->score; __(6)__);..joxue.
printf("%4d%7d%8d ", order, v->score, c);..joxue.
for(order += c, i = 1; __(7)__; v = v->next, i++)..joxue.
{ if (i > 1 && i%5 == 1) printf("\n%23c", " ");..joxue.
printf("%s ", v->no);..joxue.
} printf("\n");..joxue.
}..joxue.
}..joxue.

试题七..joxue.
阅读以下程序说明和 C 程序,将应填入_(n)_处的字句,写在答卷的对应栏内。..joxue.
[程序说明]..joxue.
本程序的函数..joxue.
int sum(int total, int d[], int n)..joxue.
用来从已知数组d的前n个元素中找出所有部分元素序列之和等于total的元素序列,约定数组d的元素都是正整..joxue.
数,且都小于等于total。如果函数找到了这样的部分元素序列, 函数返回非0值,否则函数返回0值。..joxue.
函数sum使用试探法找出全部解答。在找解过程中,依次选取候选元素,浓度组成一个和小于total的部分元素..joxue.
序列,进行试探和回溯。..joxue.
函数中的数组b用来存放候选元素的下标,变量p用来记录当前b中有效下标的个数,t记录当前部分序列的和,..joxue.
函数用它们实现回溯找解。如果t等于total,则表示找到了一个解答,函数将该解答输出,然后通过回溯,再..joxue.
试探寻找其它的解答;如果t还小于total,则继续从d的还未被考虑的那部分元素中找一个与t之和不超过total..joxue.
的元素,如没有这样的元素,函数也得回溯。..joxue.
[程序]..joxue.
#include..joxue.
#define N 100..joxue.
int a[n];..joxue.
int sum(int total, int d[],int n)..joxue.
{int s, p, t, b[N], none=1;..joxue.
b[0]=0; t=d[0]; p=1;..joxue.
do..joxue.
{ if (t==total)..joxue.
{/* 找到了一个解,把当前解输出 */..joxue.
printf("%4d-%d",total, d[b[0]]);..joxue.
for(s=1; s n-1 &&__(2) >total;s++);..joxue.
if (s=total) {b[ __(3)__]=s; t+=d[s]; continue; } } t -=d[b[p-1]]; /* 回溯 */ if (p<1&& ___(4)__) { p--; t-=__(5)__; } if (p==1&&__(6)__)break; /* 回溯到底,退出找解循环 */ t+=d[__(7)__];/* 回溯后,调整 */ }while(1); return !none; /* 返回找到过解答的标志 */ ] main( ) {int i,n, total, d; printf("输入 total!/n"); scanf("%d",&total); printf("输入 n!/n"); scanf("%d",&n); for(i=0; i0 <=%d)\n",i+1,total); scanf("%d", &d); if (d<1||d>total)..joxue.
{printf("出错,请重新输入!\n");..joxue.
continue;..joxue.
}..joxue.
a[i++]=d;..joxue.
}..joxue.
a[i++]=d;..joxue.
}..joxue.
if (!sum(total, a, n)) printf("没有找到解答!\n");..joxue.
printf("\n\n");..joxue.
}..joxue.


本文来源:https://shitiku.jxxyjl.com/jisuanjijishu/285.html

Copyright @ 2011- 考试题库网 All Rights Reserved. 版权所有

免责声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。

 站长统计