1、课 程 设 计 报 告课程名称 数据结构 课题名称 学生成绩管理系统 专 业 通信工程 班 级 1301 学 号 0302 姓 名 momom 指导老师 张鏖烽 彭帧 黄哲 7月 2日湖南工程学院课 程 设 计 任 务 书课程名称 数据结构 课 题 学生成绩管理系统 专业班级 通信工程1301 学生姓名 momom 学 号 0302 指导老师 张鏖烽 彭帧 黄哲 审 批 张鏖烽 任务书下达日期 6月 29日任 务 完成日期 7月 5日 目 录一、课程设计分析41.课程设计目标:42.课程设计题目43.需求分析5二、概要设计5三、具体设计6四、调试分析11(1)调试过程中碰到问题11(2)经验和
2、体会11五、用户使用说明12六、测试结果13七、附录18八、课程设计评分表37一、课程设计分析1.课程设计目标:课程设计是对学生一个全方面综合训练,是和课堂听讲、自学和练习相辅相成必不可少一个教学步骤。通常,实习题中问题比平时习题复杂得多,也更靠近实际。实习着眼于原理和应用结合点,使读者学会怎样把书上学到知识用于处理实际问题,培养软件工作所需要动手能力;其次,能使书上知识变“活”,起到深化了解和灵活掌握教学内容目标。平时练习较偏重于怎样编写功效单一“小”算法,而实习题是软件设计综合训练,包含问题分析、总体结构设计、用户界面设计、程序设计基础技能和技巧,多人合作,以至一整套软件工作规范训练和科学
3、作风培养。2.课程设计题目【课题】学生成绩管理系统【问题描述】依据自己这个学期课程表,设计一个成绩管理系统管理自己班成绩;每个学生统计包含学号、姓名、每门课程成绩、总分和加权平均分。【基础要求】一个完整成绩管理系统应含有以下功效:(1)输入:成绩录入;(2)输出:输出成绩表;(3)插入:在成绩表中合适位置插入某个学生成绩;(4)删除:在成绩表中删除某个学生成绩;(5)查找:依据某个关键字查找某个学生成绩;(6)排序:依据某一个或某多个关键字进行排序;(7)筛选:依据某个关键字筛选出符合一些条件数据;【测试数据】用本班成绩总表作为测试数据。3.需求分析此次课程设计题目是学生成绩管理系统,要求能够
4、存入学生,学生信息包含学生学号、姓名、每科成绩和平均成绩和加权平均成绩等。该系统关键有以下七个功效,即对学生信息进行:输入、输出、插入、删除、查找、排序、筛选等功效。对学生进行操作能够有很多思绪,而我选择是单链表村学生信息那一条思绪,即设置一个单链表,其中节点数据域保留学生基础信息。因为我们学号比较长,用整型数据无法保留,所以我定义char型字符串来保留学号和姓名。用一个数组来保留学生每一科成绩,另外在定义一个总分和平均分变量。定义学生以下:typedef struct Studentchar mun12; /学号char name20; /姓名float score8; /成绩float a
5、ll_score; /总分float ave_score; /加权平均分struct Student *next;LinkList;二、概要设计本程序采取链表方法将每一个学生设置成为一个链表中数据节点,节点中有字符型mun12(学号)、name20(姓名)、浮点型数据score8(放置每一科成绩数组)、all_score(总分)和ave_score(加权平均分)。主函数中在实施成绩管理系统之前会先创建一个链表,并调用void InitList (LinkList *&L)函数来初始化链表;以后进入菜单选择项选择功效进行操作,主程序步骤图以下:三、具体设计1、添加学生: 2、输出学生:创建节点s
6、 LinkList *p=L-next;输入学生信息,计算总分和加权分 for(m=1;mnext=s;r=s;(尾插法插入链表)输出学生信息,p=p-nextcount=count+1;学生总数加13、插入学生4、删除学生输入要插入位置 数字选择删除方法scanf(%d,&w); 按编号删除和学号删除调用插入函数 1编号 调用Delete_StudentInsert_Student(h,w); 2学号 调用Locate_Student找到 学生位置,在用Delete_Student步骤图以下:Insert_Student 函数 Delete_Student函数步骤图: Locate_Stud
7、ent函数步骤图和以下:Locate_Student1步骤图类似,不再反复了 5查找学生:调用Seek_Student函数,分为按学号查找和按姓名查找1按编号 调用Locate_Student函数返回i在调用Out_one_Student输出第i个学生2 按姓名调用Locate_Student1函数返回i在调用Out_one_Student输出第i个学生6排序函数 调用Queue_Student函数:其中有按学号,总分,各科成绩排序我这里采取是冒泡排序法进行排序,分别定义了两个节点指针q指向头指针p指向q下一个节点,在进入双重循环进行比较排序 步骤图以下:排序方法全部类似,知识比较数据不一样,
8、所以就没有一一画出来了7 筛选创建另一个链表r用于存筛选出来学生,并调用output_Student函数输出筛选程序步骤图以下:筛选程序又分为1 按总分选 2 全部及格人 3 按各科成绩1 而总分筛选关键是输入一个数值,判定数据是否大于输入数据,大于全部输出2 去不多个人经过比较每一科成绩是否全部大于60分,大于就选出插入新链表并输出3 各科成绩话是只比较其中一科来创建链表并输出其比较步骤图全部如上图所表示,这里便不再一一画出来了。四、调试分析(1)调试过程中碰到问题是怎样处理和对设计和实现回顾讨论和分析在调试过程中碰到第一个问题是输出学生问题,因为输出问题,其中总是发觉输出乱码,找了很久,以
9、后最终发觉是输入时出了问题,因为姓名我定义了字符串型,而字符串长度我定义了20,在创建节点时候我却把name20给了学生节点,造成输出时地址错误而输出乱码。第二个问题是查找,我开始一直想不到怎么把查找到学生输出,以后想了很久,找到了方法,我先经过查找关键字去找到该学生是在链表那个位置,在经过返回位置值来输出想要输出那个学生,所以就定义了Locate_Student和Out_one_Student来完成查找功效。第三个问题是筛选功效实现,我原来想经过比较,将符合关键字学生筛选出来在输出,结果发觉输出函数是已经定义成一次性全部输出形式。造成我一直想不到好方法来进行这个功效代码编写。以后经过老师指导
10、,我知道了一个新方法来编写,就是经过创建一个新学生链表来存已经筛选出来学生。然后在经过输出函数来将新链表进行输出,这么就能够达成筛选目标。改善方法:现在想了一下,其实能够将输出函数进行改善,改成一个一个学生输出形式,在经过一个判定语句进行选择性输出,用这个输出方法能够降低代码量,而达成一样效果。第四个问题是主函数问题,因为我想让主函数看起来简练一点,就把主函数分成两部分,一部分用于选择操作,另一部分用于进行选择好操作,可是这么一来却出现了问题,就是输出数据以后无法暂停在输出界面,而是闪了一下就退出来进入主界面了,这个问题我开始认为是输出函数问题,结果我去改了输出函数,结果还是无法停留。以后知道
11、原因了,主函数退出switch循环以后会立即回到主菜单界面,到时无法停在输出界面。我在主函数最终加一个system(“pause”)以后才打到能够观察到地方。改善方法:能够将主函数定义成一个,不用分开,去掉for(;)这个循环会好点。(2)经验和体会此次课程设计题目我一开始看到时候认为很轻易就能做出来,所以只是大约想了一下思绪,就直接开始了,其实这个试验能够用次序表做会思绪更清楚部分,我没有选择次序表来做,因为我在单链表这一部分有点模糊,所以想挑战一下用单链表来做。这个程序每一个代码全部是我经过一步一步分析写出来,在编写过程中碰到了很多阻碍,很多自己无法预知错误,在不停找错过程中,我感觉到自己
12、在c语言这首先不足,对算法精髓还不是很了解, 对于单链表操作也不是很熟练,尤其是在节点指针多起来时候会有点乱,甚至搞不清指针到底指向哪里了。然而,在编程过程中,一次次测试失败,再一次次修更正确却让我慢慢熟悉了数据结构部分使用方法,逐步知道要编写一个系统,需要多种功效协调才能算一个系统,而每一个功效有需要很多函数之间相互联络来调用和支撑。同时要想将课程设计完成好,就需要主动提问,碰到不懂地方能够找老师或同学相互交流经验,这么才会愈加有效率完成课设。经过这一段时间课设,我学到不仅仅是数据结构想关知识,也知道了团体协作关键性,知道学习需要真正扎实去学习,这么才能真正学到知识,并灵活利用这些所学知识。
13、五、用户使用说明1、添加学生功效:进入系统后先选择1回车即可进入输入界面,然后根据提醒输入学生学号、姓名和数据结构、数字信号处理、数字电子技术基础分数在按回车,假如还想再继续添加就按1继续,不然能够按任何键退出。2、输出学生:用户在输入完学生数据后既能够按2输出所输入全部学生3、插入学生:用户需在主界面按3即能够进入插入界面,此时能够按数字键在选择要插入位置,如输入1即能够将要插入学生插入到第一个位置,能够在主界面输入2进行查看是否插入到指定位置。4、删除学生:用户能够在主界面输入4进入删除,在经过选择编号来删除要删除学生。5、查找:查找查找功效有按学号和姓名查找,如按一进入学号查找,能够输入
14、要查找学号,回车即能够输出要查找学生。6、排序:排序能够经过学号,总分,和各科成绩,输入1能够按学号从小到大排序,输入2能够按总分从小到大进行排序,输入3能够进入科目选择,再按1进行数据结构排序,2进行数字型号处理排序,3进行数电排序。7、筛选:能够按1进入总分筛选,进入以后输入筛选多少分以上人,输入分数,如:200,即可输出全部大于200分学生;在筛选界面输入2能够输出全部及格学生;按3能够进入各科成绩筛选,再按1选出全部数据结构及格学生、再按2选出全部数字信号处理及格学生、再按3选出全部数字电子技术基础及格学生。8、退出:退出程序只需要在主界面按0再回车即能够退出程序。六、测试结果1、添加
15、学生:2、输出学生:3、 插入学生: 4、删除学生: 5、查找学生:6、排序7、筛选0、退出程序:七、附录#include #include #include #include int count =0; /统计学生人数typedef struct Studentchar mun12; /学号char name20; /姓名float score8; /成绩float all_score; /总分float ave_score; /加权平均分struct Student *next;LinkList;void InitList (LinkList *&L) /初始化链表L=(LinkList
16、*)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-next;s=(LinkList *)malloc(sizeof(LinkList);s-next=NULL;printf(输入学生学号、姓名、每科成绩n);printf(学号:);scanf(%s,&s-mun);printf(姓名:);scanf(%s,&s-na
17、me);/*数据结构3.0、数字信号处理4.0、数字电子技术基础2.5 这里只输入三门成绩作为示范*/for(i=0;iscorei=ai;if(i=1)printf(输入数字信号处理分数n);scanf(%f,&ai);s-scorei=ai;if(i=2)printf(输入数字电子技术基础分数n);scanf(%f,&ai);s-scorei=ai;all=a0+a1+a2;s-all_score=all;ave=(a0*3.0+a1*4.0+a2*2.5)/9.5;s-ave_score=ave;r-next=s;r=s;count=count+1;printf(是否继续?(按1继续,其
18、它退出。));scanf(%d,&j);void output_Student (LinkList *&L,int n) /输出全部学生LinkList *p=L-next;if(p=NULL)printf(没有学生成绩!请添加学生。n);return;printf(tt 学生成绩表 n);printf(编号 学号 姓名 数据结构 数字信号 数字电路 总分 加权平均分n);int m;for(m=1;mmun,p-name,p-score0,p-score1,p-score2,p-all_score,p-ave_score);p=p-next;void Delete_Student(LinkL
19、ist *&L,int i) /删除第i个学生int j=0;LinkList *p=L,*q;if (i=0)printf(没有找到该学生);return;while(jnext;if(p=NULL)printf(没有找到该学生);return ;elseq=p-next;if(q=NULL)return ;p-next=q-next;free(q);count=count-1;printf(删除成功!n);return;int Locate_Student(LinkList *L,char* mun) /按学号定位,返回第i个学生int i=1;LinkList *p=L-next;whi
20、le(p!=NULL&strcmp(p-mun,mun)!=0)i+;p=p-next;if(p=NULL)return (0);else return (i);int Locate_Student1(LinkList *L,char* name) /按姓名定位,返回第i个学生int i=1;LinkList *p=L-next;while(p!=NULL&strcmp(p-name,name)!=0)i+;p=p-next;if(p=NULL)return (0);else return (i);void Queue_Subject(LinkList *&L) /不一样科目排序int i;L
21、inkList *q,*p,*t1,*t2;printf(请输入科目标代号:1 数据结构 2 数字信号处理 3 数电n请输入:);scanf(%d,&i);if(i=1|inext!=NULL;q=q-next)for(p=q-next;p-next!=NULL;p=p-next)if(q-next-scorei-1p-next-scorei-1)if(q-next=p)t1=p-next;p-next=p-next-next;t1-next=q-next;q-next=t1;p=t1;elset1=p-next;t2=q-next;p-next=p-next-next;q-next=q-ne
22、xt-next;t1-next=q-next;q-next=t1;t2-next=p-next;p-next=t2;elseprintf(没有找到该科目!n);return;void Queue_Student(LinkList *&L) /排序函数int i,j=1;printf(1、根据学号 2、总分3、按各科分排序n请输入:);scanf(%d,&i);LinkList *q,*p,*t1,*t2;switch(i) case 1: /学号排序for(q=L;q-next!=NULL;q=q-next)for(p=q-next;p-next!=NULL;p=p-next)if(strcm
23、p(q-next-mun,p-next-mun)=1)if(q-next=p)t1=p-next;p-next=p-next-next;t1-next=q-next;q-next=t1;p=t1;elset1=p-next;t2=q-next;p-next=p-next-next;q-next=q-next-next;t1-next=q-next;q-next=t1;t2-next=p-next;p-next=t2;break;case 2: /总分排序for(q=L;q-next!=NULL;q=q-next)for(p=q-next;p-next!=NULL;p=p-next)if(q-n
24、ext-all_scorep-next-all_score)if(q-next=p)t1=p-next;p-next=p-next-next;t1-next=q-next;q-next=t1;p=t1;elset1=p-next;t2=q-next;p-next=p-next-next;q-next=q-next-next;t1-next=q-next;q-next=t1;t2-next=p-next;p-next=t2;break;case 3:Queue_Subject(L); /科目排序break;void Out_one_Student(LinkList *L,int i) /输出第i
25、个学生int j=0;LinkList *p=L;while(jnext;printf(%-9s%-9s%-10.1f%-10.1f%-10.1f%-8.1f %-10.1fn,p-mun,p-name,p-score0,p-score1,p-score2,p-all_score,p-ave_score);int Seek_Student(LinkList *L) /查找学生 1 按学号查找 2 按姓名查找int m;printf(1 按学号查找 2 按姓名查找 3 退出n请输入:);scanf(%d,&m);switch(m)case 1:char a12;printf(输入学号:);sca
26、nf(%s,&a);return (Locate_Student(L,a); /返回学号查找到值break;case 2:char b20;printf(输入姓名:);scanf(%s,&b);return(Locate_Student1(L,b);break;case 3:break;void Filter_Student(LinkList *&L) /筛选LinkList *s,*p=L-next,*r,*q;int y,count2=0;printf(1 按总分选 2 全部及格人 3 按各科成绩 4 退出n请输入:);scanf(%d,&y);switch(y)case 1:s=(Lin
27、kList *)malloc(sizeof(LinkList);q=s;int i;float all;printf(您要总分多少分以上人,请输入:);scanf(%f,&all);for (i=0;inext)if (p=NULL)printf(没有);return;if(p-all_scoreall)r=(LinkList *)malloc(sizeof(LinkList);strcpy(r-mun,p-mun);strcpy(r-name,p-name); r-score1=p-score1;r-score2=p-score2;r-score0=p-score0;r-all_score=
28、p-all_score;r-ave_score=p-ave_score;q-next=r;q=q-next;q-next=NULL;count2+;output_Student(s,count2);free(s);break;case 2:s=(LinkList *)malloc(sizeof(LinkList);q=s;int j;for (j=0;jnext)if (p=NULL)printf(没有);return;if(p-score059&p-score159&p-score259)r=(LinkList *)malloc(sizeof(LinkList);strcpy(r-mun,p
29、-mun);strcpy(r-name,p-name); r-score1=p-score1;r-score2=p-score2;r-score0=p-score0;r-all_score=p-all_score;r-ave_score=p-ave_score;q-next=r;q=q-next;q-next=NULL;count2+;output_Student(s,count2);free(s);break;case 3:s=(LinkList *)malloc(sizeof(LinkList);q=s;int k,x;printf(选择 1 数据结构及格 2 数字信号处理及格 3 数电及
30、格n);printf(请输入:);scanf(%d,&x);for (k=0;knext)if (p=NULL)printf(没有);return;if(p-scorex-159)r=(LinkList *)malloc(sizeof(LinkList);strcpy(r-mun,p-mun);strcpy(r-name,p-name); r-score1=p-score1;r-score2=p-score2;r-score0=p-score0;r-all_score=p-all_score;r-ave_score=p-ave_score;q-next=r;q=q-next;q-next=NU
31、LL;count2+;output_Student(s,count2);free(s);break;case 4:break;bool Insert_Student(LinkList *&L,int i) /插入学生int j=0;LinkList *p=L,*s;if (i=0)printf(对不起,没有该位置!n);return false;while(jnext;if(p=NULL)printf(对不起,没有该位置!n);return false;elses=(LinkList *)malloc(sizeof(LinkList);s-next=NULL;float all,ave,sco
32、re;printf(输入学生学号、姓名、每科成绩n);printf(学号:);scanf(%s,&s-mun);printf(姓名:);scanf(%s,&s-name);for(i=0;iscorei=score;if(i=1)printf(输入数字信号处理分数n);scanf(%f,&score);s-scorei=score;if(i=2)printf(输入数字电子技术基础分数n);scanf(%f,&score);s-scorei=score;all=s-score1+s-score2+s-score0;s-all_score=all;ave=(s-score0*3.0+s-score
33、1*4.0+s-score2*2.5)/9.5;s-ave_score=ave;s-next=p-next;p-next=s;count+;printf(插入成功n);return true;int menu_select() /*菜单选择程序*/ int c; do system(cls); printf(nt 欢迎使用学生成绩管理系统 n);printf(t 1. 添加学生 n); printf(t 2. 输出学生 n); printf(t 3. 插入学生 n); printf(t 4. 删除学生 n); printf(t 5. 查找学生 n); printf(t 6. 排序 n);pri
34、ntf(t 7. 筛选 n); printf(t 0. 退出程序 n); printf(t *n); printf(t 请您选择(0-7):); scanf(%d,&c); while(c7); return(c); void main() LinkList *h; InitList(h); /初始化for(;) switch(menu_select() case 1: /添加学生Creat_Student(h); /添加学生break; case 2: output_Student(h,count); /输出全部学生break;case 3: /插入int w;printf(输入插入位置,位置为大于或等于