九九八年度程序员级下午试题
2009-05-28 07:46
267 查看
试题五
阅读以下程序说明和C程序,将应填入--( )--处的字句,写在答卷的对应栏内。
[程序说明]
这里给处的程序逐一从指定课程成绩文件中读入学生的考号和成绩,对同一学生汇总他的总成绩,并按以下格
式输出名次(按总成绩由高到底的顺序)、总成绩、同一名次的学生人数、同一名次学生的学号(按学号由小
到大的顺序)。
程序约定学生学习课程不超过30种,课程成绩文件的第一个数字就是课程号,统计过程中,同一课程号的成绩
文件不能重复输入。
程序采用链表结构存储学生有关信息,链表中的每个表元对应一位学生。程序数据输入过程中,形成一个按学
号从小到大顺序链接的有序链表。当数据数输入结束后,程序按总成绩从高到低,学号从小到大的顺序对链表
排序。程序最后按指定格式输出链表中的信息。程序的输出格式如下例所示:
名次 总成绩 人数 学号 学号 学号
1 470 2 12 25
3 450 3 15 24 50
6 430 1 14
7 401 3 13 18 45
文件格式:
chengji.txt内容如下:
0001 92
0002 91
0003 93
0004 95
0005 98
0006 98
0007 98
阅读以下程序说明和C程序,将应填入--( )--处的字句,写在答卷的对应栏内。
[程序说明]
这里给处的程序逐一从指定课程成绩文件中读入学生的考号和成绩,对同一学生汇总他的总成绩,并按以下格
式输出名次(按总成绩由高到底的顺序)、总成绩、同一名次的学生人数、同一名次学生的学号(按学号由小
到大的顺序)。
程序约定学生学习课程不超过30种,课程成绩文件的第一个数字就是课程号,统计过程中,同一课程号的成绩
文件不能重复输入。
程序采用链表结构存储学生有关信息,链表中的每个表元对应一位学生。程序数据输入过程中,形成一个按学
号从小到大顺序链接的有序链表。当数据数输入结束后,程序按总成绩从高到低,学号从小到大的顺序对链表
排序。程序最后按指定格式输出链表中的信息。程序的输出格式如下例所示:
名次 总成绩 人数 学号 学号 学号
1 470 2 12 25
3 450 3 15 24 50
6 430 1 14
7 401 3 13 18 45
#include <stdio.h> #include <malloc.h> #include <string.h> #define M 30 #define NLEN 10 typedef struct node { int cur_s; /*最近输入成绩的科目 */ char no[NLEN]; int score; struct node *next; }NODE; NODE *bubblesort(NODE *head) { NODE *q, *tail, *p = (NODE *)malloc(sizeof(NODE)); p->next = head; head = p; tail = NULL; while (tail != head->next/*__(1)___*/) { p = head; q = p->next; while (q->next != tail) { if (p->next->score < q->next->score || p->next->score == q->next->score && strcmp(p->next->no, q->next->no) >0) { p->next = q->next/*_(2)_*/, /*两相邻表元链接关系前后颠倒*/ q->next/*_(3)_*/ = q->next->next; p->next->next = q; } p = p->next; /*调整p和q*/ q = p->next/*_(4)_*/; } tail = q; } p = head->next; free(head); return p; } int s[M], sp; int main() { FILE *fp; NODE*h,*u, *v, *p; int ss, mark, order, c, i; char fname[80], no[NLEN], ans; 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); else break; } if(strcmp(fname, "aaaa") == 0) break; fscanf(fp, "%d", &ss); /*输入科目号*/ s[sp] = ss; for(int i = 0; s[i] != ss; i++); if(i != sp) { 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) h = p; else u->next = p; } } fclose(fp); printf("还有科目成绩文件要输入吗?(Y/N)"); scanf("%c", &ans); if (ans == 'N' || ans == 'n') break; } h = bubblesort(h); printf("名次 总成绩 人数 学号/n"); /*以下按格式要求输出*/ v = h; order = 1; while (v != NULL) { for (c = 1, u = v->next; u != NULL && u->score == v->score; c++, u = u->next); printf("%4d%7d%8d ", order, v->score, c); for (order += c, i = 1; i<=c /*_(5)_*/; v = v->next, i++) { if (i>1 && i%5 == 1) printf("/n%23c",' '); printf("%s", v->no); } printf("/n"); } return 0; }
文件格式:
chengji.txt内容如下:
0001 92
0002 91
0003 93
0004 95
0005 98
0006 98
0007 98
相关文章推荐
- 2005年上半年程序员下午试题
- 软考助手新增加了程序员下午试题
- 1992年高级程序员下午试题2(数字排列)
- 1993年高级程序员下午试题1(自然数排列)
- 1992年高级程序员下午试题3(数组操作,流程图)
- 1993年高级程序员下午试题2
- 2004年上半年程序员下午试题
- 1992年高级程序员下午试题6
- 2005年下半年程序员下午试题
- 2011年上半年软考程序员下午试题-试题一答题解析
- 2005年上半年程序员上 下午试题及答案
- 2006年上半年程序员下午试题
- 1998年高级程序员级下午试题
- 1998年高级程序员级下午试题
- 1992年高级程序员下午试题1(统计单词的平均空格数和剩余空格数)
- C++/C程序员面试的一份试题(附标答)
- 2008年上半年 程序员 下午试卷
- [转贴]程序员如何防止脑疲劳:下午补充一些干果
- 数据库系统工程师下午试题分析与解答
- 网络工程师考试2004年下半年下午试题解析(一)