1、一个完整的成绩管理系统应具有以下功能:(1)输入:成绩录入;(2)输出:输出成绩表;(3)插入:在成绩表中适当位置插入某个学生成绩;(4)删除:在成绩表中删除某个学生成绩;(5)查找:根据某个关键字查找某个学生成绩;(6)排序:根据某一个或某几个关键字进行排序;(7)筛选:根据某个关键字筛选出符合某些条件的数据;【测试数据】用本班的成绩总表作为测试数据。3.需求分析本次课程设计的题目是学生成绩管理系统,要求可以存入学生,学生信息包括学生学号、姓名、每科成绩和平均成绩以及加权平均成绩等。该系统主要有以下七个功能,即对学生信息进行:输入、输出、插入、删除、查找、排序、筛选等功能。对学生进行操作可以
2、有很多思路,而我选用的是单链表村学生信息那一条思路,即设置一个单链表,其中节点数据域保存学生基本信息。由于我们学号比较长,用整型数据无法保存,所以我定义char型的字符串来保存学号和姓名。用一个数组来保存学生每一科的成绩,此外在定义一个总分和平均分变量。定义学生如下:typedef struct Student char mun12; /学号 char name20; /姓名 float score8; /成绩 float all_score; /总分 float ave_score; /加权平均分 struct Student *next;LinkList;二、概要设计本程序采用链表的方法将
3、每一个学生设置成为一个链表中的数据节点,节点中有字符型mun12(学号)、name20(姓名)、浮点型数据score8(放置每一科成绩的数组)、all_score(总分)和ave_score(加权平均分)。主函数中在执行成绩管理系统之前会先创建一个链表,并调用void InitList (LinkList *&L)函数来初始化链表;而后进入菜单选择项选择功能进行操作,主程序流程图如下:三、详细设计1、添加学生: 2、输出学生:创建节点s LinkList *p=L-next;输入学生信息,计算总分与加权分 for(m=1;mnext=s;r=s;(尾插法插入链表) 输出学生信息,p=p-nex
4、t count=count+1;学生总数加13、插入学生 4、删除学生输入要插入的位置 数字选择删除方式scanf(%d,&w); 按编号删除和学号删除调用插入函数 1编号 调用Delete_StudentInsert_Student(h,w); 2学号 调用Locate_Student找到 学生位置,在用Delete_Student的流程图如下:Insert_Student 函数 Delete_Student的函数流程图:Locate_Student函数的流程图与如下:Locate_Student1的流程图类似,不再重复了5查找学生:调用Seek_Student函数,分为按学号查找和按姓名查
5、找1按编号 调用Locate_Student函数返回i在调用Out_one_Student输出第i个学生2 按姓名调用Locate_Student1函数返回i在调用Out_one_Student输出第i个学生6排序函数 调用Queue_Student函数:其中有按学号,总分,各科成绩排序我这里采用的是冒泡排序法进行排序,分别定义了两个节点指针q指向头指针p指向q的下一个节点,在进入双重循环进行比较排序 流程图如下:排序的方法都类似,知识比较数据不同,所以就没有一一画出来了7 筛选创建另一个链表r用于存筛选出来的学生,并调用output_Student函数输出筛选程序流程图如下:筛选程序又分为1
6、 按总分选 2 全部及格的人 3 按各科成绩1 而总分筛选主要是输入一个数值,判断数据是否大于输入数据,大于的都输出2 去不几个的人通过比较每一科成绩是否都大于60分,大于的就选出插入新链表并输出3 各科成绩的话是只比较其中一科来创建链表并输出其比较流程图都如上图所示,这里便不再一一画出来了。四、调试分析(1)调试过程中遇到的问题是如何解决的以及对设计与实现的回顾讨论和分析在调试过程中遇到的第一个问题是输出学生的问题,因为输出的问题,其中总是发现输出乱码,找了好久,后来终于发现是输入时出了问题,因为姓名我定义了字符串型,而字符串长度我定义了20,在创建节点的时候我却把name20给了学生节点,
7、导致输出时地址错误而输出乱码。第二个问题是查找,我开始一直想不到怎么把查找到的学生输出,后来想了很久,找到了方法,我先通过查找关键字去找到该学生是在链表的那个位置,在通过返回的位置的值来输出想要输出的那个学生,所以就定义了Locate_Student和Out_one_Student来完成查找功能。第三个问题是筛选功能的实现,我本来想通过比较,将符合关键字的学生筛选出来在输出,结果发现输出函数是已经定义成一次性全部输出的形式。导致我一直想不到好的方法来进行这个功能的代码编写。后来经过老师的指导,我知道了一种新的方法来编写,就是通过创建一个新的学生链表来存已经筛选出来的学生。然后在通过输出函数来将
8、新链表进行输出,这样就可以达到筛选的目的。改进方法:现在想了一下,其实可以将输出函数进行改进,改成一个一个学生输出的形式,在通过一个判断语句进行选择性输出,用这个输出的方法可以减少代码的的量,而达到同样的效果。第四个问题是主函数的问题,因为我想让主函数看起来简洁一点,就把主函数分成两部分,一部分用于选择操作,另一部分用于进行选择好的操作,可是这样一来却出现了问题,就是输出数据之后无法暂停在输出界面,而是闪了一下就退出来进入主界面了,这个问题我开始以为是输出函数的问题,结果我去改了输出函数,结果还是无法停留。后来知道原因了,主函数退出switch循环之后会立即回到主菜单界面,到时无法停在输出界面
9、。我在主函数最后加一个system(“pause”)之后才打到可以观察到的地方。可以将主函数定义成一个,不用分开,去掉for(;)这个循环会好点。(2)经验和体会本次课程设计的题目我一开始看到的时候以为很容易就能做出来,所以只是大概想了一下思路,就直接开始了,其实这个实验可以用顺序表做会思路更清晰一些,我没有选择顺序表来做,因为我在单链表这一部分有点模糊,所以想挑战一下用单链表来做。这个程序的每一个代码都是我经过一步一步分析写出来的,在编写的过程中遇到了很多的阻碍,很多自己无法预知的错误,在不断的找错过程中,我感觉到自己在c语言这一方面的不足,对算法的精髓还不是很了解, 对于单链表的操作也不是
10、很熟练,尤其是在节点指针多起来的时候会有点乱,甚至搞不清指针到底指向哪里了。然而,在编程过程中,一次次的测试失败,再一次次修改正确却让我慢慢的熟悉了数据结构一些用法,渐渐的知道要编写一个系统,需要各种功能协调才能算一个系统,而每一个功能有需要很多函数之间的相互联系来调用与支撑。同时要想将课程设计完成的好,就需要积极提问,遇到不懂的地方可以找老师或同学相互交流经验,这样才会更加有效率的完成课设。经过这一段时间的课设,我学到的不仅仅是数据结构的想关知识,也懂得了团队协作的重要性,知道学习需要真正扎实去学习,这样才能真正学到知识,并灵活运用这些所学知识。五、用户使用说明1、添加学生功能:进入系统后先
11、选择1回车即可进入输入界面,然后按照提示输入学生学号、姓名和数据结构、数字信号处理、数字电子技术基础的分数在按回车,如果还想再继续添加就按1继续,否则可以按任何键退出。2、输出学生:用户在输入完学生数据后既可以按2输出所输入的全部学生3、插入学生:用户需在主界面按3即可以进入插入界面,此时可以按数字键在选择要插入的位置,如输入1即可以将要插入的学生插入到第一个位置,可以在主界面输入2进行查看是否插入到指定位置。4、删除学生:用户可以在主界面输入4进入删除,在通过选择编号来删除要删除的学生。5、查找:查找查找功能有按学号和姓名查找,如按一进入学号查找,可以输入要查找的学号,回车即可以输出要查找的
12、学生。6、排序:排序可以通过学号,总分,和各科成绩,输入1可以按学号从小到大排序,输入2可以按总分从小到大进行排序,输入3可以进入科目选择,再按1进行数据结构排序,2进行数字型号处理排序,3进行数电的排序。7、筛选:可以按1进入总分筛选,进入之后输入筛选多少分以上的人,输入分数,如:200,即可输出所有大于200分的学生;在筛选界面输入2可以输出全部及格的学生;按3可以进入各科成绩的筛选,再按1选出所有数据结构及格的学生、再按2选出所有数字信号处理及格的学生、再按3选出所有数字电子技术基础及格的学生。8、退出:退出程序只需要在主界面按0再回车即可以退出程序。六、测试结果3、 插入学生:5、查找
13、学生:6、排序7、筛选0、退出程序:七、附录#include malloc.hstring.hstdlib.hint count =0; /记录学生人数void InitList (LinkList *&L) /初始化链表 L=(LinkList *)malloc(sizeof(LinkList); L-next=NULL;void Creat_Student (LinkList *&L) /输入学生并添加到链表里面 LinkList *r=L,*s; int i=0,j=1; float all=0,ave,a8; while(j=1) while(r-next!=NULL) r=r- s=
14、(LinkList *)malloc(sizeof(LinkList); s- printf(输入学生学号、姓名、每科成绩n);学号: scanf(%ss-mun);姓名:name);/*数据结构3.0、数字信号处理4.0、数字电子技术基础2.5 这里只输入三门成绩作为示范*/ for(i=0;iscorei=ai; if(i=1)输入数字信号处理分数n if(i=2)输入数字电子技术基础分数n all=a0+a1+a2;all_score=all; ave=(a0*3.0+a1*4.0+a2*2.5)/9.5;ave_score=ave; r-next=s; r=s; count=count
15、+1;是否继续?(按1继续,其他退出。)j); void output_Student (LinkList *&L,int n) /输出全部学生 LinkList *p=L- if(p=NULL)没有学生成绩!请添加学生。n return; printf(tt 学生成绩表 n编号 学号 姓名 数据结构 数字信号 数字电路 总分 加权平均分n int m; for(m=1;=n&%-5d%-9s%-9s%-10.1f%-10.1f%-10.1f%-8.1f %-10.1fn,m,p-mun,p-name,p-score0,p-score1,p-score2,p-all_score,p-ave_s
16、core); p=p-void Delete_Student(LinkList *&L,int i) /删除第i个学生 int j=0; LinkList *p=L,*q; if (i=0)没有找到该学生 while(j if(q=NULL) return ; p-next=q- free(q); count=count-1;删除成功!int Locate_Student(LinkList *L,char* mun) /按学号定位,返回第i个学生 int i=1; while(p!=NULL&strcmp(p-mun,mun)! i+; return (0); else return (i);
17、int Locate_Student1(LinkList *L,char* name) /按姓名定位,返回第i个学生name,name)!void Queue_Subject(LinkList *&L) /不同科目排序 int i; LinkList *q,*p,*t1,*t2;请输入科目的代号:1 数据结构 2 数字信号处理 3 数电n请输入: scanf(i); if(i=1|iq=q-next) for(p=q-p-p=p- if(q-next-scorei-1scorei-1) if(q-next=p) t1=p- p-next=p- t1- q-next=t1; p=t1; else
18、 t2=q- t2-next=t2; 没有找到该科目! void Queue_Student(LinkList *&L) /排序函数 int i,j=1;1、按照学号 2、总分3、按各科分排序n请输入: switch(i) case 1: /学号排序 if(strcmp(q-mun)=1) break; case 2: /总分排序all_scoreall_score) case 3: Queue_Subject(L); /科目排序 break;void Out_one_Student(LinkList *L,int i) /输出第i个学生 LinkList *p=L;i)%-9s%-9s%-10.1f%-10.1f%-10.1f%-8.1f %-10.1fn,p-int Seek_Student(LinkList *L) /查找学生 1 按学号查找 2 按姓名查找1 按学号查找 2 按姓名查找 3 退出n请输入:m); switch(m) char a12;输入学号:a); return (Locate_Student(L,a); /返回学号查找到的值 char b20;输入姓名:b); return(Locate_Student1(L,b);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1