📄 4-4-5.c
字号:
/*中国系统分析员顾问团,http://www.csai.cn*/
/*程序员下午考试指南书籍源码*/
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#define M 30
#define NLEN 10
typedef struct node {
int cur_s; /* 最近输入成绩的科目*/
char no[NLEN];
int score;
struct node *next;
} NODE;
int s[M], sp, ss, i, mark, order, c;
FILE *fp; NODE *h, *u, *v, *p;
char fname[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);
else break;
}
if (strcmp(fname, "aaaa") == 0) break;
fscanf(fp, "%d", &ss); /* 输入科目号 */
s[sp]=ss;
for (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;
} /* 以下按总成绩和学号对链表排序 */
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->score > p->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 = u->next;
u->next = 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; c++,u = u->next);
printf("%4d%10d%8d", order, v->score, c);
for (order += c, i = 1; c--; v = v->next, i++){
if (i > 1 && i%5 == 1) printf("\n%23c", ' ');
printf("%8s ", v->no);
}
printf("\n");
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -