该程序包括以下功能:
1.录入每个学生的学号、姓名和各科考试成绩
2.计算每门课程的总分和平均分
3.计算每个学生的总分和平均分
4.按每个学生的总分由高到低排出名次表
5.按每个学生的总分由低到高排出名次表
6.按学号由小到大排出成绩表
7.按姓名的字典顺序排出成绩表
8.按学号查询学生排名及其考试成绩
9.按姓名查询学生排名及其考试成绩
10.按优秀(90-100)、良好(80-89)、中等(70-79)、及格(60-69)、不及格(0-59)5个类别,对每门课程分别统计每个类别的人数以及所占的百分比
11.输出每个学生的学号、姓名、各科考试成绩,以及每门课程的总分和平均分
12.将每个学生的纪录信息写入文件
13.从文件中读出每个学生的纪录信息并显示
#include#include #include #include "malloc.h" #include #define MAX_LEN 10 #define STU_NUM 30 #define COURSE_NUM 6 #define LEN sizeof(struct Student) typedef struct Student { long num; char name[MAX_LEN]; float score[COURSE_NUM]; float sum; float aver; struct Student *next; }STU; int Menu(void); //创建菜单 void Print(STU *head, int n, int m); //打印函数 void AverSumofEveryStudent(STU *head, int n, int m); //计算每门课程的总分和平均分 void AverSumofEveryCourse(STU *head, int n, int m); //计算每个学生的总分和平均分 STU *SortbyScore(STU *head, int n); //按每个学生的总分由高到低排出名次表 STU *Creat(int n, int m); //创建链表并录入信息 STU *Creat1(int n, int m); STU *SortbyScore1(STU *head, int n); //按每个学生的总分由低到高排出名次表 STU *SortbyNum(STU *head); //按学号由小到大排出成绩表 STU *SortbyName(STU *head, int n); //按姓名的字典顺序排出成绩表 void SearchbyNum(STU *head, int n, int m); //按学号查询学生排名及其考试成绩 void SearchbyName(STU *head, int n, int m); //按姓名查询学生排名及其考试成绩 void StatisticAnalysis(STU *head, int n, int m); //按类别及比例输出 void WritetoFile(STU *head, int n, int m); //将每个学生的纪录信息写入文件 STU *ReadfromFile(STU *head, int *n, int *m); //从文件中读出每个学生的纪录信息并显示 int main() { int n, m; int i; STU *head; //定义头节点 head = (STU *)malloc(LEN); while (1) { i = Menu(); if (i == 1) { system("cls"); //清屏 printf("ttt******************************************************************************n"); printf("tttInput student number(n<30):n"); //输入学生数 printf("ttt"); scanf("%d", &n); printf("tttInput course number(m<=6):n"); printf("ttt"); scanf("%d", &m); } switch (i) { case 1: printf("tttInput student's ID, name and score:n"); head = Creat(n, m); system("cls"); //清屏 break; case 2: system("cls"); //清屏 AverSumofEveryStudent(head, n, m); break; case 3: system("cls"); //清屏 AverSumofEveryCourse(head, n, m); break; case 4: system("cls"); //清屏 printf("nnn"); printf("tttSort in ascending order by score:n"); head = SortbyScore(head, n); Print(head, n, m); break; case 5: system("cls"); //清屏 printf("nnn"); printf("tttSort in ascending order by score:n"); head = SortbyScore1(head, n); Print(head, n, m); break; case 6: system("cls"); //清屏 printf("nnn"); printf("tttSort in ascending order by number:n"); head = SortbyNum(head); Print(head, n, m); break; case 7: system("cls"); //清屏 printf("nnn"); printf("tttSort in dictionary order by name:n"); head = SortbyName(head, n); Print(head, n, m); break; case 8: system("cls"); //清屏 printf("nnn"); printf("ttt******************************************************************************n"); printf("tttInput the number you want to search:n"); SearchbyNum(head, n, m); break; case 9: system("cls"); //清屏 printf("nnn"); printf("ttt******************************************************************************n"); printf("tttInput the name you want to search:n"); SearchbyName(head, n, m); break; case 10: system("cls"); //清屏 StatisticAnalysis(head, n, m); break; case 11: system("cls"); //清屏 printf("nnn"); Print(head, n, m); break; case 12: system("cls"); //清屏 WritetoFile(head, n, m); break; case 13: system("cls"); //清屏 head = ReadfromFile(head, &n, &m); break; case 0: system("cls"); //清屏 printf("nnn"); printf("ttt******************************************************************************n"); printf("tttEnd of program!n"); printf("ttt******************************************************************************n"); return 0; default: system("cls"); //清屏 printf("nnn"); printf("ttt******************************************************************************n"); printf("tttInput error!n"); printf("ttt******************************************************************************n"); } } return 0; } // 创建菜单 int Menu(void) { int i; system("title 学生成绩管理系统V7.0 By wyxiang"); printf("nn"); printf("ttt 学生成绩管理系统V7.0n"); printf("ttt******************************************************************************n"); printf("ttt* Management for Students' scores *n"); printf("ttt* 1. Input record *n"); printf("ttt* 2. Caculate total and average score of every course *n"); printf("ttt* 3. Caculate total and average score of every student *n"); printf("ttt* 4. Sort in descending order by score *n"); printf("ttt* 5. Sort in ascending order by score *n"); printf("ttt* 6. Sort in ascending order by number *n"); printf("ttt* 7. Sort in dictionary order by name *n"); printf("ttt* 8. Search by number *n"); printf("ttt* 9. Search by name *n"); printf("ttt* 10. Statistic analysis *n"); printf("ttt* 11. List record *n"); printf("ttt* 12. Write to a file *n"); printf("ttt* 13. Read from a file *n"); printf("ttt* 0. Exit *n"); printf("ttt******************************************************************************n"); printf("n"); printf("n"); printf("n"); printf("n"); printf("ttt*****************Please Input your choice:"); scanf("%d", &i); return i; } // 创建链表 STU *Creat(int n, int m) { STU *head; STU *p1, *p2; int i, j; // system("cls"); for (i = 1; i num); printf("ttt"); scanf("%s", p1->name); for (j = 0; j score[j]); } p1->next = NULL; if (i == 1) { head = p2 = p1; } else { p2->next = p1; p2 = p1; } } return(head); } STU *Creat1(int n, int m) { STU *head; STU *p1, *p2; int i, j; // system("cls"); for (i = 1; i next = NULL; if (i == 1) { head = p2 = p1; } else { p2->next = p1; p2 = p1; } } return(head); } void AverSumofEveryStudent(STU *head, int n, int m) { STU *p; int i, j = 1; char ch; float sum; p = head; if (head != NULL) { printf("ttt******************************************************************************n"); for (i = 0; i score[i]; p = p->next; } while (p != NULL); printf("tttcourse %d: sum=%.0f , aver=%.0fn", j, sum, sum / n); j++; } printf("ttt******************************************************************************n"); } } void AverSumofEveryCourse(STU *head, int n, int m) { STU *p; int i, j; p = head; if (head != NULL) { printf("nnn"); printf("ttt******************************************************************************n"); for (i = 0; i sum = 0.0; for (j = 0; j sum += p->score[j]; } p->aver = p->sum / m; printf("tttstudent %d: sum=%.0f , aver=%.0fn", i + 1, p->sum, p->aver); p = p->next; } printf("ttt******************************************************************************n"); } } STU *SortbyScore(STU *head, int n) { STU *endpt; //控制循环比较 STU *p; //临时指针变量 STU *p1, *p2; p1 = (STU *)malloc(LEN); p1->next = head; //注意理解:我们增加一个节点,放在第一个节点的前面,主要是为了便于比较。因为第一个节点没有前驱,我们不能交换地址 head = p1; //让head指向p1节点,排序完成后,我们再把p1节点释放掉 for (endpt = NULL; endpt != head; endpt = p) { for (p = p1 = head; p1->next->next != endpt; p1 = p1->next) { if (p1->next->sum < p1->next->next->sum) //如果前面的节点键值比后面节点的键值大,则交换 { p2 = p1->next->next; p1->next->next = p2->next; p2->next = p1->next; p1->next = p2; p = p1->next->next; } } } p1 = head; //把p1的信息去掉 head = head->next; //让head指向排序后的第一个节点 free(p1); //释放p1 p1 = NULL; //p1置为NULL,保证不产生“野指针”,即地址不确定的指针变量 return head; } STU *SortbyScore1(STU *head, int n) { STU *endpt; //控制循环比较 STU *p; //临时指针变量 STU *p1, *p2; p1 = (STU *)malloc(LEN); p1->next = head; //注意理解:我们增加一个节点,放在第一个节点的前面,主要是为了便于比较。因为第一个节点没有前驱,我们不能交换地址 head = p1; //让head指向p1节点,排序完成后,我们再把p1节点释放掉 for (endpt = NULL; endpt != head; endpt = p) { for (p = p1 = head; p1->next->next != endpt; p1 = p1->next) { if (p1->next->sum > p1->next->next->sum) //如果前面的节点键值比后面节点的键值大,则交换 { p2 = p1->next->next; p1->next->next = p2->next; p2->next = p1->next; p1->next = p2; p = p1->next->next; } } } p1 = head; //把p1的信息去掉 head = head->next; //让head指向排序后的第一个节点 free(p1); //释放p1 p1 = NULL; //p1置为NULL,保证不产生“野指针”,即地址不确定的指针变量 return head; } STU *SortbyNum(STU *head) { STU *first; //为原链表剩下用于直接插入排序的节点头指针 STU *t; //临时指针变量:插入节点 STU *p, *q; //临时指针变量 first = head->next; //原链表剩下用于直接插入排序的节点链表:可根据图12来理解 head->next = NULL; //只含有一个节点的链表的有序链表:可根据图11来理解 while (first != NULL) //遍历剩下无序的链表 { //注意:这里for语句就是体现直接插入排序思想的地方 for (t = first, q = head; ((q != NULL) && (q->num < t->num)); p = q, q = q->next); //无序节点在有序链表中找插入的位置 first = first->next; //无序链表中的节点离开,以便它插入到有序链表中 if (q == head) //插在第一个节点之前 { head = t; } else //p是q的前驱 { p->next = t; } t->next = q; //完成插入动作 //first = first->next; } return head; } STU *SortbyName(STU *head, int n) { STU *endpt; //控制循环比较 STU *p; //临时指针变量 STU *p1, *p2; p1 = (STU *)malloc(LEN); p1->next = head; //注意理解:我们增加一个节点,放在第一个节点的前面,主要是为了便于比较。因为第一个节点没有前驱,我们不能交换地址 head = p1; //让head指向p1节点,排序完成后,我们再把p1节点释放掉 for (endpt = NULL; endpt != head; endpt = p) { for (p = p1 = head; p1->next->next != endpt; p1 = p1->next) { if (strcmp(p1->next->name, p1->next->next->name)>0) //如果前面的节点键值比后面节点的键值大,则交换 { p2 = p1->next->next; p1->next->next = p2->next; p2->next = p1->next; p1->next = p2; //结合第4点理解 p = p1->next->next; //结合第6点理解 } } } p1 = head; //把p1的信息去掉 head = head->next; //让head指向排序后的第一个节点 free(p1); //释放p1 p1 = NULL; //p1置为NULL,保证不产生“野指针”,即地址不确定的指针变量 return head; } void Print(STU *head, int n, int m) { STU *p; int i; p = head; if (head != NULL) //只要不是空链表,就输出链表中所有节点 { printf("ttt******************************************************************************n"); do { printf("ttt%ldt%st", p->num, p->name); for (i = 0; i score[i]); } printf("%.0ft%.0fn", p->sum, p->sum / m); p = p->next; //移到下一个节点 } while (p != NULL); printf("ttt******************************************************************************n"); } } void SearchbyNum(STU *head, int n, int m) { long num; int i; int flag = 1; printf("ttt"); scanf("%ld", &num); STU *p; p = head; if (head != NULL) { do { if (p->num == num) { printf("ttt"); printf("%ldt%st", p->num, p->name); for (i = 0; i score[i]); } printf("%.0ft%.0fn", p->sum, p->sum / m); flag = 0; } p = p->next; } while (p != NULL); if (flag) { printf("ttt"); printf("Not found!n"); } } printf("ttt******************************************************************************n"); } void SearchbyName(STU *head, int n, int m) { char name[MAX_LEN]; int i; int flag = 1; printf("ttt"); scanf("%s", name); STU *p; p = head; if (head != NULL) { do { if (strcmp(name, p->name) == 0) { printf("ttt"); printf("%ldt%st", p->num, p->name); for (i = 0; i score[i]); } printf("%.0ft%.0fn", p->sum, p->sum / m); flag = 0; } p = p->next; } while (p != NULL); if (flag) { printf("ttt"); printf("Not found!n"); } } printf("ttt******************************************************************************n"); } void StatisticAnalysis(STU *head, int n, int m) { int a[6]; STU *p; p = head; int i, j; for (i = 0; i score[i]<60) { a[0]++; } else if (p->score[i]<70) { a[1]++; } else if (p->score[i]<80) { a[2]++; } else if (p->score[i]<90) { a[3]++; } else if (p->score[i]<100) { a[4]++; } else { a[5]++; } p = p->next; } while (p != NULL); printf("nnn"); printf("ttt******************************************************************************n"); printf("ttt* For course %d:n", i + 1); printf("ttt* <60t%dt%.2f%%n", a[0], 100 * a[0] / 6.0); printf("ttt* %d-%dt%dt%.2f%%n", 60, 69, a[1], 100 * a[1] / 6.0); printf("ttt* %d-%dt%dt%.2f%%n", 70, 79, a[2], 100 * a[2] / 6.0); printf("ttt* %d-%dt%dt%.2f%%n", 80, 89, a[3], 100 * a[3] / 6.0); printf("ttt* %d-%dt%dt%.2f%%n", 90, 99, a[4], 100 * a[4] / 6.0); printf("ttt* %dt%dt%.2f%%n", 100, a[5], 100 * a[5] / 6.0); printf("ttt******************************************************************************n"); } } void WritetoFile(STU *head, int n, int m) { STU *p; p = head; FILE *fp; int i, j; printf("nnn"); printf("ttt******************************************************************************n"); if ((fp = fopen("student.txt", "w")) == NULL) { printf("tttFail to open student.txtn"); return; } fprintf(fp, "%dt%dn", n, m); for (i = 0; i num, p->name); for (j = 0; j score[j]); } fprintf(fp, "%12.0f%12.0fn", p->sum, p->sum / m); p = p->next; } printf("tttExport Successfully!n"); fclose(fp); printf("ttt******************************************************************************n"); } //这里用了直接生成了一个新的链表,确保可以直接读取存好的数据 STU *ReadfromFile(STU *head, int *n, int *m) { STU *p; FILE *fp; int i, j; if ((fp = fopen("student.txt", "r")) == NULL) { printf("tttFail to open student.txtn"); return NULL; } fscanf(fp, "%dt%dn", n, m); head = Creat1(*n, *m); //创建了一个空链表,并且赋给head p = head; for (i = 0; i<*n; i++) { fscanf(fp, "%12ld", &p->num); fscanf(fp, "%12s", &p->name); for (j = 0; j<*m; j++) { fscanf(fp, "%12f", &p->score[j]); } fscanf(fp, "%12f%12f", &p->sum, &p->aver); p = p->next; } i = *n; j = *m; printf("tttimport Successfully!n"); fclose(fp); Print(head, i, j); return head; }
注意各个功能的实现,拿来练手最合适不过。



