⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 4-4-5.c

📁 2005软件工程师考试下午编程题源代码
💻 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 + -