您的位置:首页 > 职场人生

九九八年度程序员级下午试题

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

 

#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

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  null fp struct c file 存储