From a3f114b862ac8fba9bba4191745226744af1eae3 Mon Sep 17 00:00:00 2001 From: bluecyan <61640041+Vbluecyan@users.noreply.github.com> Date: Wed, 14 Jun 2023 14:40:59 +0800 Subject: [PATCH] =?UTF-8?q?Update=20=E6=88=90=E7=BB=A9=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F.c?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1.更改文件编码为UTF-8,更加通用 2.删除了无效的头文件(malloc.h)引入代码 3.多个printf()调用优化为一个调用,提高性能 --- ...241\347\220\206\347\263\273\347\273\237.c" | 278 +++++++----------- 1 file changed, 114 insertions(+), 164 deletions(-) diff --git "a/\346\210\220\347\273\251\347\256\241\347\220\206\347\263\273\347\273\237.c" "b/\346\210\220\347\273\251\347\256\241\347\220\206\347\263\273\347\273\237.c" index 00b9f57..8961806 100644 --- "a/\346\210\220\347\273\251\347\256\241\347\220\206\347\263\273\347\273\237.c" +++ "b/\346\210\220\347\273\251\347\256\241\347\220\206\347\263\273\347\273\237.c" @@ -1,55 +1,53 @@ #include #include #include -#include "malloc.h" #include -#define MAX_LEN 10 /* ַ󳤶 */ -#define STU_NUM 30 /* ѧ */ -#define COURSE_NUM 6 /* ĿԿĿ */ +#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]; /* ÿѧCOURSE_NUMŹεijɼ */ - float sum; /* ÿѧܳɼ */ - float aver; /* ÿѧƽɼ */ + long num; /* 每个学生的学号 */ + char name[MAX_LEN]; /* 每个学生的姓名 */ + float score[COURSE_NUM]; /* 每个学生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); //¼Ϣ +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); //ļжÿѧļ¼Ϣʾ +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; //ͷڵ + STU *head; //定义头节点 head = (STU *)malloc(LEN); while (1) { i = Menu(); if (i == 1) { - system("cls"); // + system("cls"); //清屏 printf("\t\t\t******************************************************************************\n"); - printf("\t\t\tInput student number(n<30):\n"); //ѧ + printf("\t\t\tInput student number(n<30):\n"); //输入学生数 printf("\t\t\t"); scanf("%d", &n); printf("\t\t\tInput course number(m<=6):\n"); @@ -61,84 +59,84 @@ int main() case 1: printf("\t\t\tInput student's ID, name and score:\n"); head = Creat(n, m); - system("cls"); // + system("cls"); //清屏 break; case 2: - system("cls"); // + system("cls"); //清屏 AverSumofEveryStudent(head, n, m); break; case 3: - system("cls"); // + system("cls"); //清屏 AverSumofEveryCourse(head, n, m); break; case 4: - system("cls"); // + system("cls"); //清屏 printf("\n\n\n"); printf("\t\t\tSort in ascending order by score:\n"); head = SortbyScore(head, n); Print(head, n, m); break; case 5: - system("cls"); // + system("cls"); //清屏 printf("\n\n\n"); printf("\t\t\tSort in ascending order by score:\n"); head = SortbyScore1(head, n); Print(head, n, m); break; case 6: - system("cls"); // + system("cls"); //清屏 printf("\n\n\n"); printf("\t\t\tSort in ascending order by number:\n"); head = SortbyNum(head); Print(head, n, m); break; case 7: - system("cls"); // + system("cls"); //清屏 printf("\n\n\n"); printf("\t\t\tSort in dictionary order by name:\n"); head = SortbyName(head, n); Print(head, n, m); break; case 8: - system("cls"); // + system("cls"); //清屏 printf("\n\n\n"); printf("\t\t\t******************************************************************************\n"); printf("\t\t\tInput the number you want to search:\n"); SearchbyNum(head, n, m); break; case 9: - system("cls"); // + system("cls"); //清屏 printf("\n\n\n"); printf("\t\t\t******************************************************************************\n"); printf("\t\t\tInput the name you want to search:\n"); SearchbyName(head, n, m); break; case 10: - system("cls"); // + system("cls"); //清屏 StatisticAnalysis(head, n, m); break; case 11: - system("cls"); // + system("cls"); //清屏 printf("\n\n\n"); Print(head, n, m); break; case 12: - system("cls"); // + system("cls"); //清屏 WritetoFile(head, n, m); break; case 13: - system("cls"); // + system("cls"); //清屏 head = ReadfromFile(head, &n, &m); break; case 0: - system("cls"); // + system("cls"); //清屏 printf("\n\n\n"); printf("\t\t\t******************************************************************************\n"); printf("\t\t\tEnd of program!\n"); printf("\t\t\t******************************************************************************\n"); return 0; default: - system("cls"); // + system("cls"); //清屏 printf("\n\n\n"); printf("\t\t\t******************************************************************************\n"); printf("\t\t\tInput error!\n"); @@ -152,41 +150,40 @@ int main() } -// ˵ +// 创建菜单 int Menu(void) { int i; - system("title ѧɼϵͳV7.0 By wyxiang"); - printf("\n\n"); - printf("\t\t\t ѧɼϵͳV7.0\n"); - printf("\t\t\t******************************************************************************\n"); - printf("\t\t\t* Management for Students' scores *\n"); - printf("\t\t\t* 1. Input record *\n"); - printf("\t\t\t* 2. Caculate total and average score of every course *\n"); - printf("\t\t\t* 3. Caculate total and average score of every student *\n"); - printf("\t\t\t* 4. Sort in descending order by score *\n"); - printf("\t\t\t* 5. Sort in ascending order by score *\n"); - printf("\t\t\t* 6. Sort in ascending order by number *\n"); - printf("\t\t\t* 7. Sort in dictionary order by name *\n"); - printf("\t\t\t* 8. Search by number *\n"); - printf("\t\t\t* 9. Search by name *\n"); - printf("\t\t\t* 10. Statistic analysis *\n"); - printf("\t\t\t* 11. List record *\n"); - printf("\t\t\t* 12. Write to a file *\n"); - printf("\t\t\t* 13. Read from a file *\n"); - printf("\t\t\t* 0. Exit *\n"); - printf("\t\t\t******************************************************************************\n"); - printf("\n"); - printf("\n"); - printf("\n"); - printf("\n"); - printf("\t\t\t*****************Please Input your choice:"); + system("title 学生成绩管理系统V7.0 By wyxiang"); + printf( "\n\n" + "\t\t\t 学生成绩管理系统V7.0\n" + "\t\t\t******************************************************************************\n" + "\t\t\t* Management for Students' scores *\n" + "\t\t\t* 1. Input record *\n" + "\t\t\t* 2. Caculate total and average score of every course *\n" + "\t\t\t* 3. Caculate total and average score of every student *\n" + "\t\t\t* 4. Sort in descending order by score *\n" + "\t\t\t* 5. Sort in ascending order by score *\n" + "\t\t\t* 6. Sort in ascending order by number *\n" + "\t\t\t* 7. Sort in dictionary order by name *\n" + "\t\t\t* 8. Search by number *\n" + "\t\t\t* 9. Search by name *\n" + "\t\t\t* 10. Statistic analysis *\n" + "\t\t\t* 11. List record *\n" + "\t\t\t* 12. Write to a file *\n" + "\t\t\t* 13. Read from a file *\n" + "\t\t\t* 0. Exit *\n" + "\t\t\t******************************************************************************\n" + "\n" + "\n" + "\n" + "\n" + "\t\t\t*****************Please Input your choice:"); // 只需调用一次 printf(),速度更快 scanf("%d", &i); return i; - } -// +// 创建链表 STU *Creat(int n, int m) { STU *head; STU *p1, *p2; @@ -293,19 +290,19 @@ void AverSumofEveryCourse(STU *head, int n, int m) STU *SortbyScore(STU *head, int n) { - STU *endpt; //ѭȽ - STU *p; //ʱָ + STU *endpt; //控制循环比较 + STU *p; //临时指针变量 STU *p1, *p2; p1 = (STU *)malloc(LEN); - p1->next = head; //ע⣺һڵ㣬ڵһڵǰ棬ҪΪ˱ڱȽϡΪһڵûǰDzַܽ - head = p1; //headָp1ڵ㣬ɺٰp1ڵͷŵ + 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) //ǰĽڵֵȺڵļֵ򽻻 + if (p1->next->sum < p1->next->next->sum) //如果前面的节点键值比后面节点的键值大,则交换 { p2 = p1->next->next; p1->next->next = p2->next; @@ -316,29 +313,29 @@ STU *SortbyScore(STU *head, int n) } } - p1 = head; //p1Ϣȥ - head = head->next; //headָĵһڵ - free(p1); //ͷp1 - p1 = NULL; //p1ΪNULL֤Ұָ롱ַȷָ + 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 *endpt; //控制循环比较 + STU *p; //临时指针变量 STU *p1, *p2; p1 = (STU *)malloc(LEN); - p1->next = head; //ע⣺һڵ㣬ڵһڵǰ棬ҪΪ˱ڱȽϡΪһڵûǰDzַܽ - head = p1; //headָp1ڵ㣬ɺٰp1ڵͷŵ + 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) //ǰĽڵֵȺڵļֵ򽻻 + if (p1->next->sum > p1->next->next->sum) //如果前面的节点键值比后面节点的键值大,则交换 { p2 = p1->next->next; p1->next->next = p2->next; @@ -349,39 +346,39 @@ STU *SortbyScore1(STU *head, int n) } } - p1 = head; //p1Ϣȥ - head = head->next; //headָĵһڵ - free(p1); //ͷp1 - p1 = NULL; //p1ΪNULL֤Ұָ롱ַȷָ + 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; //ʱָ + STU *first; //为原链表剩下用于直接插入排序的节点头指针 + STU *t; //临时指针变量:插入节点 + STU *p, *q; //临时指针变量 - first = head->next; //ԭʣֱӲĽڵɸͼ12 - head->next = NULL; //ֻһڵɸͼ11 + first = head->next; //原链表剩下用于直接插入排序的节点链表:可根据图12来理解 + head->next = NULL; //只含有一个节点的链表的有序链表:可根据图11来理解 - while (first != NULL) //ʣ + while (first != NULL) //遍历剩下无序的链表 { - //ע⣺forֱӲ˼ĵط - for (t = first, q = head; ((q != NULL) && (q->num < t->num)); p = q, q = q->next); //ڵҲλ + //注意:这里for语句就是体现直接插入排序思想的地方 + for (t = first, q = head; ((q != NULL) && (q->num < t->num)); p = q, q = q->next); //无序节点在有序链表中找插入的位置 - first = first->next; //еĽڵ뿪Ա뵽 + first = first->next; //无序链表中的节点离开,以便它插入到有序链表中 - if (q == head) //ڵһڵ֮ǰ + if (q == head) //插在第一个节点之前 { head = t; } - else //pqǰ + else //p是q的前驱 { p->next = t; } - t->next = q; //ɲ붯 + t->next = q; //完成插入动作 //first = first->next; } return head; @@ -389,33 +386,33 @@ STU *SortbyNum(STU *head) STU *SortbyName(STU *head, int n) { - STU *endpt; //ѭȽ - STU *p; //ʱָ + STU *endpt; //控制循环比较 + STU *p; //临时指针变量 STU *p1, *p2; p1 = (STU *)malloc(LEN); - p1->next = head; //ע⣺һڵ㣬ڵһڵǰ棬ҪΪ˱ڱȽϡΪһڵûǰDzַܽ - head = p1; //headָp1ڵ㣬ɺٰp1ڵͷŵ + 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) //ǰĽڵֵȺڵļֵ򽻻 + 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->next = p2; //结合第4点理解 + p = p1->next->next; //结合第6点理解 } } } - p1 = head; //p1Ϣȥ - head = head->next; //headָĵһڵ - free(p1); //ͷp1 - p1 = NULL; //p1ΪNULL֤Ұָ롱ַȷָ + p1 = head; //把p1的信息去掉 + head = head->next; //让head指向排序后的第一个节点 + free(p1); //释放p1 + p1 = NULL; //p1置为NULL,保证不产生“野指针”,即地址不确定的指针变量 return head; } @@ -427,7 +424,7 @@ void Print(STU *head, int n, int m) int i; p = head; - if (head != NULL) //ֻҪǿнڵ + if (head != NULL) //只要不是空链表,就输出链表中所有节点 { printf("\t\t\t******************************************************************************\n"); do @@ -439,7 +436,7 @@ void Print(STU *head, int n, int m) printf("%.0f\t", p->score[i]); } printf("%.0f\t%.0f\n", p->sum, p->sum / m); - p = p->next; //Ƶһڵ + p = p->next; //移到下一个节点 } while (p != NULL); printf("\t\t\t******************************************************************************\n"); } @@ -526,8 +523,8 @@ void StatisticAnalysis(STU *head, int n, int m) int i, j; for (i = 0; i