数据结构课程设计学生成绩管理系统

合集下载

数据结构之学生成绩管理系统

数据结构之学生成绩管理系统

数据结构之学绩管理系统【正文】1:引言1.1 编写目的本文档旨在设计一个学绩管理系统,来有效管理学生的各门课程成绩。

1.2 范围本文档将详细描述学绩管理系统的各个模块、功能和操作流程,并提供必要的设计和实现细节。

1.3 定义、缩略词和缩写- 学绩管理系统:用于管理学生的各门课程成绩的软件系统。

- 学生:指在学校注册并接受教育的个体。

- 课程:学生所学习的各门课程科目。

2:需求分析2.1 功能需求2.1.1 学生信息管理- 添加学生信息:包括学生姓名、学号、班级等基本信息。

- 修改学生信息:对已存在的学生信息进行修改操作。

- 删除学生信息:从系统中删除学生的信息。

2.1.2 成绩管理- 添加成绩:录入学生的各门课程成绩。

- 修改成绩:对已录入的成绩进行修改操作。

- 查询成绩:根据学生学号或姓名查询学生的成绩信息。

- 统计成绩:统计每门课程成绩的平均值、最高分和最低分。

2.2 性能需求2.2.1 响应时间- 系统应能够在用户输入操作后即时响应,保证操作的实时性。

2.2.2 数据存储- 系统应能够快速、可靠地存储和检索学生信息和成绩数据。

2.3 安全需求2.3.1 访问控制- 系统应设定不同用户角色,具备不同的访问权限。

- 管理员用户可以对学生信息和成绩数据进行修改和删除,普通用户仅可以查询和统计成绩。

2.3.2 数据保密性- 系统应保护学生个人信息和成绩数据的隐私,仅允许授权用户访问。

3:系统设计与实现3.1 系统架构3.1.1 前端设计- 使用界面简洁直观的图形化界面,方便用户操作。

- 考虑到不同平台的兼容性,采用跨平台的前端技术。

3.1.2 后端设计- 使用面向对象的编程语言实现系统的后端逻辑。

- 设计合理的数据结构和算法,以满足系统的性能需求。

3.2 数据库设计3.2.1 学生信息表- 设计学生信息表,包括学生姓名、学号、班级等字段。

- 为学号字段设置主键,确保唯一性。

3.2.2 成绩表- 设计成绩表,包括学生学号和各门课程成绩字段。

数据结构课程设计-学生成绩管理系统

数据结构课程设计-学生成绩管理系统

广东学院《数据结构课程设计》题目:学生成绩管理系统学号:姓名:年级:计算机科学与技术6班学院:智能制造学院专业:指导教师:目录一、问题描述与基本要求 (3)1.1问题描述 (3)1.2基本要求 (3)二、数据结构的设计 (3)2.1数据结构的选择 (3)2.2单链表的定义 (3)2.3重要函数的定义及说明 (4)三、软件模块结构图....................... 错误!未定义书签。

3.1大体模块关系图 (13)3.2各模块具体分析..................... 错误!未定义书签。

四、程序流程图 (15)五、源程序 (17)六、调试分析............................. 错误!未定义书签。

6.1程序错误修改及完善的过程 (37)6.2最终程序所有功能运行结果........... 错误!未定义书签。

6.3测试数据 (39)七、用户使用手册 (40)八、心得体会............................. 错误!未定义书签。

一、问题描述与基本要求1.1问题描述设计一个学生管理系统,建立初始学生成绩,添加/插入,查找,修改,删除学生成绩。

1.2基本要求系统设计要求:1、能比较迅速地实现添加学生的学号,姓名和成绩2、能比较迅速地通过学生的学号或姓名查询、修改或删除学生成绩3、当有学生时,输出所有学生的成绩信息,包括语文,数学,英语的成绩二、数据结构的设计2.1数据结构的选择课程设计题目的要求是,要较简单迅速地实现添加、查询、修改、删除学生成绩的的功能,于是我很自然地想到了可以用单链表的结构,通过编写相应功能函数来实现建立新结点、删除结点、修改结点中数据域的内容、输出结点数据域中的内容等功能,即可满足课程设计题目的要求。

2.2单链表的定义先定义单链表结点的数据域,数据域包括学生姓名、学生学号、学生成绩等学生信息,然后再定义链表结点,链表结点包括结点数据域和结点链域,最后再定义指向链表结点的指针。

(2023)数据结构课设报告学生成绩管理系统(一)

(2023)数据结构课设报告学生成绩管理系统(一)

(2023)数据结构课设报告学生成绩管理系统(一)数据结构课设报告学生成绩管理系统一、背景介绍为了方便教师管理学生的成绩,提高数据处理的效率和准确性,我们团队开发了一款可以管理学生成绩的系统。

二、需求分析•教师可以登录系统,并进行学生信息的录入、修改、查询和删除。

•教师可以录入、修改、查询和删除学生的成绩。

•学生也可以登录系统,并查看自己的成绩。

•教师和学生的密码需要进行加密存储,并能够找回密码。

三、设计方案1. 数据结构设计我们采用链表的数据结构,实现学生信息和成绩的存储。

- 学生信息:学号、姓名、密码。

- 学生成绩:科目、成绩。

2. 模块划分•登录模块:实现教师和学生的登录、密码加密和找回密码。

•学生信息管理模块:实现学生信息的录入、修改、查询和删除。

•成绩管理模块:实现成绩的录入、修改、查询和删除。

•学生成绩查询模块:实现学生查看自己成绩的功能。

3. 界面设计我们采用Java Swing库实现图形化界面,美观易用。

四、开发过程1. 环境配置我们使用Java语言进行开发,并采用MySQL数据库存储数据。

开发工具为Eclipse和Navicat。

2. 实现过程在开发过程中,我们分别完成了登录模块、学生信息管理模块、成绩管理模块和学生成绩查询模块。

同时,我们进行了严格的测试和优化,保证了系统的稳定性和用户体验。

五、总结通过本次课设,我们学习到了如何设计、实现一款简单的大型软件。

同时,我们也深入理解了数据结构的应用和开发过程中需要注意的问题。

未来,我们将继续学习和提升自己的技术水平,为社会创造更多有用的产品。

六、存在的问题和改进计划1. 学生信息和成绩输入需要更为便捷目前的输入方式需要逐一输入每个学生的信息以及成绩,如果要录入多个学生的信息,效率不高。

我们计划实现批量导入的功能,可以通过Excel表格导入学生信息和成绩。

2. 安全性还需要更高的保障目前我们只是简单使用密码加密保护了教师和学生的账户信息,如果系统被攻击者入侵,那么所有的账户信息和成绩信息都会暴露,对学生隐私和数据安全造成极大威胁。

数据结构课程设计---成绩管理系统

数据结构课程设计---成绩管理系统

《数据结构》课程设计报告(成绩管理系统)目录一.需求分析 (3)二.概要设计 (3)三.详细设计 (5)四.调试分析 (17)五.用户使用说明 (17)六.测试结果 (19)七.附录 (19)一、需求分析1.实现功能:该程序有非常清晰的所以能够方便用户的使用,该成绩系统能够添加多科成绩,并能够统计总成绩,能够按照学号,姓名两种方式查看,修改,删除数据. 同时可以按照学号的升序排序成绩表,已经按照单科成绩,总成绩降序排序成绩表,统计学生成绩的情况,成绩有容量查询功能,保存成绩表到磁盘,以及打开磁盘成绩表的功能,且存储位置就在程序运行文件夹内,存储文件名可以自定.2.测试数据:输入一组成绩学号12,姓名:zengyao,数学:75,语文:67学号14,姓名:taokai, 数学:84,语文:72学号27,姓名:xucheng,数学:92,语文:95能够在程序中正确运行达到要求中的所有功能二、概要设计1.成绩管理系统:struct st{long num;char c[21];float grade;float chinese;float total;}std[NUM];基本操作:int empty();操作结果:判断成绩表是否为空.void done();操作结果:从键盘上输入所选择的功能.void creat();操作结果:从键盘输入新的成绩.void print();初始条件:成绩表已存在.操作结果:输出已有的成绩表.void fix_number()初始条件:成绩表已存在.操作结果:按照学号修改成绩.void fix_name()初始条件:成绩表已存在.操作结果:按照姓名修改成绩.void fix()初始条件:成绩表已存在.操作结果:选择修改成绩方式.void del_number()初始条件:成绩表已存在.操作结果:按照学号删除成绩. void del_name()初始条件:成绩表已存在.操作结果:按照姓名删除成绩. void del()初始条件:成绩表已存在.操作结果:选择删除方式.void search_number()初始条件:成绩表已存在.操作结果:按照学号查找.void search_name()初始条件:成绩表已存在.操作结果:按照姓名查找.void search()初始条件:成绩表已存在.操作结果:选择查找方式.void line_number(int m)初始条件:成绩表已存在.操作结果:按照学号排序.void line_grade(int m)初始条件:成绩表已存在.操作结果:按照数学成绩排序. void line_chinese(int m)初始条件:成绩表已存在.操作结果:按照语文成绩排序.void line_total(int m)初始条件:成绩表已存在.操作结果:按照总成绩排序.void line()初始条件:成绩表已存在.操作结果:选择排序方式.void save()初始条件:成绩表已存在.操作结果:保存成绩表到磁盘.void load()初始条件:磁盘中存在此名称的成绩表.操作结果:从磁盘打开成绩表.2.主程序:void main(){初始化:do{接受命令;处理命令;}while(“命令”=“退出”);}三、详细设计struct st//定义结构体{long num;//定义学号char c[21];// 定义姓名字符数组float grade;//定义浮点型变量gradefloat chinese;// 定义浮点型变量chinesefloat total;// 定义浮点型变量total}std[NUM];//定义结构体数组int n=0;//定义表单容量记录变量1.成绩表为空判断函数int empty()int flag=1;if (n==0)printf("\n%c 成绩表为空!回车键返回!",19);flag=0;while(1)//如果不输入回车则继续进行循环getchar();if (getchar()=='\n') break;return(flag);//将flag的值返回进行接下来操作//判断成绩表为空函数是许多子函数调用之前if语句的判断条件,而返回值flag将赋为0,1用于之后的函数判断.2.操作完成格式输出函数void done()printf("\n%c 操作完成!回车键结束!\n",19);while(1)//不是回车则不断循环getchar();if (getchar()=='\n')//判断输入的是否是回车system("cls");break;//进行系统清屏//设计操作完成函数在整个程序运行中都将起到非常重要的作用,其中调用了系统清屏函数,同时while(1)的使用比较巧妙,简单确有非常好的操作效果;3.查看表单容量函数void capacity()printf("\n%c 成绩表最大容量:%d条",16,NUM-1);printf("\n%c 已用容量:%d条",16,n);printf("\n%c 剩余容量:%d条",16,NUM-n-1);done();//本身设计程序时,开始开辟了100个容量为最大空间,所以设计了表单容量查询.4.添加数据函数void creat()int i,j,flag;printf("\n-------添加数据-------\n\n");for(i=n+1;i<=NUM;i++)flag=0;printf("请输入要添加的学号:");scanf("%ld",&std[i].num);if (i>=1)//当成绩表中已经存在成绩,进行循环查找若存在相同的学号则跳出循环,不输入成绩for(j=1;j<i;j++)if (std[i].num==std[j].num)printf("%c该学号已存在!请输入新的学号!\n\n",19);flag=1;i--;break;//将i++减回去if (flag!=0) continue;printf(" 姓名:");scanf("%s",std[i].c);printf(" 数学成绩:");scanf("%f",&std[i].grade);printf(" 语文成绩:");scanf("%f",&std[i].chinese);std[i].total=std[i].chinese+std[i].grade;n+=1;printf("\n%c 是否继续添加数据(1、退出;任意键继续!):\n",19);getchar();if (getchar()=='1') break;else continue;system("cls");//添加成绩首先将所有成绩查询,看是否存在相同的学号,若存在还要将循环时i的计数减1,添加时直接将各项数据循环存储与结构体数组中,利用continue 语句和getchar()函数结合做条件判断实现了选择性的继续添加或者退出,也区别开了存在相同学号成绩的情况5.查看数据函数void print()if (empty()==0) system("cls");//判断成绩表是否为空,不为空就执行下面程序输出成绩表elseint i;for(i=1;i<=n;i++)printf("\n%ld\t\t%s\t\t%5.2f\t\t%5.2f\t\t%5.2f\n",std[i].num,std[i].c,std[i].gr ade,std[i].chineses,std[i].total);done();//查看函数简单的利用数组的循环输出数据,但是在开头必须判断成绩表是否为空,\t%s\t\t%5.2f不断改变间距使得输出的数据整齐好看.6.按学号修改数据函数void fix_number()long num;int i,flag=0;printf("%c 请输入学生的学号:",16);scanf("%ld",&num);//输入学号for(i=1;i<=n;i++)//循环查找到这个学号if (std[i].num==num)flag=1;break;//做标记if (flag==1)printf("%c 变更%ld的姓名为:",16,num);scanf("%s",std[i].c);printf("%c 变更%ld的数学成绩为:",16,num);scanf("%f",&std[i].grade);printf("%c 变更%ld的语文成绩为:",16,num);scanf("%f",&std[i].chinese);std[i].total=std[i].chinese+std[i].grade;done();else {printf("%c 此学号不存在!!!",19);done();}//修改函数与添加成绩思路比较接近,只是在开始查找是否存在需要修改的数据.7.按姓名修改数据函数void fix_name()printf("%c 请输入学生的姓名:",16);scanf("%s",&c);for(i=1;i<=n;i++)if (strcmp(std[i].c,c)==0)//判断是否存在此姓名的学生flag=1;break;//如果没有则跳出操作if (flag==1)printf("%c 变更%s的学号为:",16,c);scanf("%ld",&std[i].num);printf("%c 变更%s的数学成绩为:",16,c);scanf("%f",&std[i].grade);printf("%c 变更%s的语文成绩为:",16,c);scanf("%f",&std[i].chinese);std[i].total=std[i].chinese+std[i].grade;//将总成绩修改done();else {printf("\n%c 此姓名不存在!!!",19);done();//该函数与按学号修改函数思路完全一致.8.修改数据函数void fix()if (empty()==0) system("cls");elseint s;scanf("%d",&s);switch(s)case 1:fix_number();break; //按学号修改成绩case 2:fix_name();break; //按姓名修改成绩default :system("cls");9.按学号删除数据函数void del_number()long num;int i,j,flag=0;printf("\n%c 请输入学生的学号:",16);scanf("%ld",&num);for(i=1;i<=n;i++)//循环搜索需要删除的成绩if (std[i].num==num)flag=1;break;if (flag==1)for(j=i;j<=n;j++)std[j].num=std[j+1].num; //将删除数据之后的学号前移一位strcpy(std[j].c,std[j+1].c);// 将删除数据之后的姓名前移一位std[j].grade=std[j+1].grade; //分别将数学,语文,总成绩前移一位std[j].chinese=std[j+1].chinese;std[j].total=std[j+1].total;n-=1;done();else {printf("\n%c 此学号不存在!!!",19);done()//删除算法的思路,经典在于删除数据后将之后所有数据提前的循环量的控制首先还是简单的查找删除数据的位置,n-=1改变表单数据量10.按姓名删除数据函数void del_name()char c[21];int i,j,flag=0;printf("\n%c 请输入学生的姓名:",16);scanf("%s",c);for(i=1;i<=n;i++)if (strcmp(std[i].c,c)==0)flag=1;break;if (flag==1)for(j=i;j<=n;j++)std[j].num=std[j+1].num; //将删除数据之后的学号前移一位strcpy(std[j].c,std[j+1].c); // 将删除数据之后的姓名前移一位std[j].grade=std[j+1].grade; //分别将数学,语文,总成绩前移一位std[j].chinese=std[j+1].chinese;n-=1;done();else {printf("\n%c 此姓名不存在!!!\n",19);done();按照姓名删除与按照学号删除思路一致11.删除数据函数void del()if (empty()==0) system("cls");elseint s;scanf("%d",&s);switch(s)case 1:del_number();break;//按照学号删除成绩case 2:del_name();break; //按照姓名删除成绩default :system("cls");11.按学号查找函数void search_number()long num;int i,flag=0;scanf("%ld",&num);for(i=1;i<=n;i++) //循环查找若找到了该学号则进行输出,没有找到则跳出查找if (std[i].num==num)flag=1;break;if (flag==1)printf("\n%ld\t\t%s\t\t%5.2f\t\t%5.2f\n",std[i].num,std[i].c,std[i].grade,std[i ].chinese);done();else {printf("\n%c 此学号不存在!!!",19);done();}12.按姓名查找函数void search_name()char c[21];int i,flag=0;printf("%c 请输入学生的姓名:",16);scanf("%s",c);for(i=1;i<=n;i++)if (strcmp(std[i].c,c)==0)//循环查找该姓名,没有找到则跳出操作flag=1;break;if (flag==1)printf("\n%ld\t\t%s\t\t%5.2f\t\t%5.2f\n",std[i].num,std[i].c,std[i].grade,std[i ].chinese);done();else {printf("\n%c 此姓名不存在!!!",19);done();}13.查找数据函数void search()if (empty()==0) system("cls");elseint s;printf("\n-------查找数据-------\n\n");printf("请选择查找方式(1、按学号查找;2、按姓名查找;任意键返回!):");scanf("%d",&s);switch(s)case 1:search_number();break;// 按学号查找case 2:search_name();break;// 按姓名查找default :system("cls");//进行系统清屏14.按学号排序函数void line_number(int m)struct st temp;//定义结构体变量tempfor(i=1;i<m;i++)for(j=i+1;j<=m;j++)if (std[i].num>std[j].num)//比较学号大小按从小到大排序temp.num=std[i].num; //利用中间变量排序学号std[i].num=std[j].num;std[j].num=temp.num;strcpy(temp.c,std[i].c);//利用中间变量按学号排序调整姓名strcpy(std[i].c,std[j].c);strcpy(std[j].c,temp.c);temp.chinese=std[i].chinese;//利用中间变量按学号排序调整语文成绩std[i].chinese=std[j].chinese;std[j].chinese=temp.chinese;temp.grade=std[i].grade; //利用中间变量按学号排序调整数学成绩std[i].grade=std[j].grade;std[j].grade=temp.grade;temp.total=std[i].total;//利用中间变量按学号排序调整总成绩std[i].total=std[j].total;std[j].total=temp.total;done();//排序函数简单的利用中间变量来交换位置排序,只是for循环中j=i+1;j<=m这些变量的的选择比较关键.15.按数学成绩排序函数void line_grade(int m)struct st temp;//定义结构体变量tempfor(i=1;i<m;i++)for(j=i+1;j<=m;j++)if (std[i].grade<std[j].grade)//比较数学成绩大小按从大到小排序temp.num=std[i].num; //利用中间变量按数学成绩排序调整学号std[i].num=std[j].num;std[j].num=temp.num;strcpy(temp.c,std[i].c);//利用中间变量按数学成绩排序调整姓名strcpy(std[i].c,std[j].c);strcpy(std[j].c,temp.c);temp.chinese=std[i].chinese;//利用中间变量按数学成绩排序调整语文成绩std[i].chinese=std[j].chinese;std[j].chinese=temp.chinese;temp.grade=std[i].grade; //利用中间变量排序数学成绩std[i].grade=std[j].grade;std[j].grade=temp.grade;temp.total=std[i].total;//利用中间变量按数学成绩排序调整总成绩std[i].total=std[j].total;std[j].total=temp.total;done();//调用操作完成函数//按其他方式排序思想与数学成绩排序完全一致16.表单数据排序函数void line()if (empty()==0) system("cls");elsescanf("%d",&s);switch(s)case 1:line_number(n);break;// 按学号排序case 2:line_grade(n);break//;按数学成绩排序case 3:line_chinese(n);break;//按语文成绩排序case 4:line_total(n);break;//按总成绩排序default :system("cls");17.保存成绩表文件函数void save()if (empty()==0) system("cls");//成绩表如果为空,就不进行保存elseprintf("\n-------保存成绩表-------\n\n");FILE *fp; //定义文件指针int i;char c[21];printf("%c 输入文件名:",1);scanf("%s",c);if ((fp=fopen(c,"wb"))==NULL)//此文件不存在,无法保存.printf("%c 成绩表保存失败!\n",19);done();return;for(i=1;i<=n;i++)fwrite(&std[i],sizeof(struct st),1,fp);//进行文件保存fclose(fp);// 函数fclose()关闭给出的文件流, 释放已关联到流的所有缓冲区done();18.打开成绩表文件函数void load()FILE *fp; //定义文件指针printf("%c 输入文件名:",1);scanf("%s",c);if ((fp=fopen(c,"rb+"))==NULL)//没有找到此文件,打开失败printf("\n%c 无此文件!\n",19);done();return;for(i=1;i<NUM;i++)循环读取数据fread(&std[i],sizeof(struct st),1,fp);//读取成绩表if (feof(fp)) break;n+=1;fclose(fp);//保存和打开成绩表的函数都是基本的文件存储方式,利用数组保存到磁盘,储存的位置就在运行该程序的文件夹所以方便找到,同时n+=1;非常重要否则将出现打开文件成功但是查看成绩表依旧为空的情况,19.主程序void main(){char c;while(1){printf("\n\t\t ——学生成绩管理工具——\n");printf("\t\t <<A Production By archer21>>\n\n");printf("\t\t\t 1、查看已有的成绩表\n");printf("\t\t\t 2、修改一个已有的数据\n");printf("\t\t\t 3、添加一个新的数据\n");printf("\t\t\t 4、删除一个已有的数据\n");printf("\t\t\t 5、查找一个已有的数据\n");printf("\t\t\t 6、排列成绩表中的数据\n");printf("\t\t\t 7、保存已有的成绩表到磁盘\n");printf("\t\t\t 8、打开磁盘上的成绩表\n");printf("\t\t\t 9、查看成绩表容量\n");printf("\t\t\t 0、退出程序\n");printf("\n%c 选择操作:",16);scanf("%c",&c);switch(c){case '1':print();break;//输出查看case '2':fix();break; //修改成绩case '3':creat();break; //添加成绩case '4':del();break; //删除成绩case '5':search();break; // 查找成绩case '6':line();break; //排序成绩case '7':save();break; //保存成绩表case '8':load();break; //打开成绩表case '9':capacity();break//查看成绩表容量;case '0':printf("\n\t\t\t\t信息工程2班,许城\n\t\t\t<<A Production By archer21>>\n\t\t\t Produced On 15/12/2009\n\n");exit(7);break;//主函数仅仅是用来选择操作选项以及其中的16,19,如箭头,感叹等符号使程序界面更加清晰default :system("cls"); /*默认清屏*/4.函数的调用关系图四、 调试分析1. 由于在程序中要求输出整齐美观,所以在格式上遇到了一些问题/t 的用法,查看操作中由于在添加函数中经常不注意多加了个n+=1,改变了循环次数,使得查看操作造成输出了很多0的无数据情况.2. 在读写成绩表文件时少了个n+=1造成读取出来的成绩表为空,empty(),done(),default :system("cls")这几个函数在多处需要用到,一但不用都会使得程序运行受阻,经过不断调试该进才完善了程序的功能. 3. 时空复杂度的分析由于程序思想,以及算法比较简单所以时间复杂度仅取决于循环的层数多是O(n),O(n*(n+1)),O(n 2),由于开始就开辟了结构体数组,也定义了容量,所以空间复杂度控制在O(n),以内,在creatsavesearch_namesearch_numbe rfix_namefix_numberdel_namedel_numberline_numberline_chineseline_gradeline_totalmain:printsearch load line fix del排序算法时可能会达到O(n+1).五、用户使用说明1.本程序的运行环境为DOS操作系统,成绩管理系统的执行文件为:XCgrade.exe2.本程序有清晰的索引列表,能够让用户轻松的使用,输入1至9可选择不同的功能,其中又有更加具体的功能实现,选择后,按回车即可。

数据结构课程设计报告学生成绩管理系统

数据结构课程设计报告学生成绩管理系统

《数据结构》课程设计报告课题名称:学生成绩管理系统专业班级: 2015221学号: 201522122姓名:赵敏指导老师:杨彬一、课题名称学生成绩管理系统二、课题设计的基本思想,原理和算法描述1,、基本思想:建立一个学生成绩管理系统,能够实现每位学生的成绩的录入、删除、修改、查找、排序(按成绩降序排序)等功能。

2、原理:首先定义项目的数据结构,然后将每个功能写成一个函数来完成对数据的操作,然后完成主函数以验证各个函数功能并得出运行结果,最后调试改进。

/3、算法描述定义项目的数据结构void display(){cout<<setw(6)<<name<<" "<<setw(3)<<num<<" "<<setw(3)<<score<<endl;//setw()设置输出宽度输出项目占6个字符的位置,它由头文件iomanip定义}friend void insert();// 定义插入(用友元函数方便调用类中成员)friend void del();// 定义删除friend void search();// 定义查找friend void change();// 定义修改friend void sort();////定义每个学生数据private:char name[15]; //姓名int num; //学号int score; //成绩};#include<iostream> //使用标注命名空间调用函数,需要名空间的支持#include<iomanip> //I/O流控制头文件#include<fstream> //文件操作的类和方法头文件using namespace std; //申请内存空间class student{public: //定义为公共成员函数void setdata(){cin>>name>>num>>score;}三、源程序及注释#include <iostream>#include <fstream>#include <string>#include <iomanip>using namespace std;string str[5] ; //定义一个str字符串来吸收文件2.txt中重复的标题int aNum=0; //使用全局变量定义学生的人数struct adent //构建结构体{char name[10]; //姓名int id;int chinese;int math;int english;int sum;}a[50],temp;//实现对文件1.txt和文件2.txt数据的合并,生成文件3.txtvoid Merge(){char* f1 = "d:\\1.txt";char* f2 = "d:\\2.txt";char* f3 = "d:\\3.txt";ifstream inFile1( f1 ); //从磁盘读取文件1.txtifstream inFile2( f2 ); //从磁盘读取文件2.txtofstream outFile( f3 ); //写入信息到文件3.xtxoutFile << inFile1.rdbuf(); //把文件1.txt中的数据写入到outfilefor(int i=0;!inFile2.eof()==true;i++) //遍历文件2.txt的所有数据{string str;getline(inFile2,str); //读取第一行信息放到str中if(i==0)continue; //跳过第一行outFile<<str<<endl; //把后面的信息放入到文件3.txt}inFile1.close(); //关闭文件f1inFile2.close();outFile.close();ifstream f ( f3 );cout <<"**文件已生成,合并后数据如下**"<<endl;cout << f.rdbuf(); //输出文件3.txt};//把文件3.txt中的数据读出到结构体中,便于对数据的操作void FillStruct(adent *p){int i=aNum, j=0; //这里让i = aNum,假如先添加数据,后合并,则结构体下标中人数i不是从0开始计,而是从先输入的数据的个数aNum开始的ifstream infile("D:\\3.txt",ios::in); //以读的方式打开文件3.txtif(!infile) //测试是否成功打开{cerr<<"open error!"<<endl;exit(1);}while(!infile.eof()) //遍历infile,只把数据写入进去,过滤掉第一行的头标题{while(j<5) //用一个str数组把文件3.txt中的头标题给吸收进去{infile>>str[j];j++;}//把磁盘中的文件读出来写入到结构体中infile >> p[i].name >> p[i].id >> p[i].chinese >> p[i].math >> p[i].english;aNum++;i++;}aNum=aNum-1; //数据读完后因光标移到下一行,等于是多读了一行,所以真实的人数要比计数减一(不知道理解的对不?)infile.close(); //关闭文件};//抽取出三科成绩中有补考的学生并保存在一个新文件4.txtint FailList(adent *p){/*如果先开始进行的操作不是合并或者添加数据,那么其他的操作将无法进行,因为结构体中没有学生数据,返回主菜单*/if(aNum==0){cout<<"请先合并或者输入数据"<<endl;return 0;}ofstream in;in.open("d:\\4.txt",ios::trunc); //如不空则清空in<<"补考名单"<<endl; //用插入器(<<)向文件输出;用析取器(>>)从文件输入for(int i=0;i<aNum;i++){if(p[i].chinese<60||p[i].english<60||p[i].math<60){in<<p[i].name<<"\t";}}};void sum(adent *p) //求总和{for(int i=0;i<aNum;i++){p[i].sum=p[i].chinese+p[i].english+p[i].math;}}void traversal(adent *p) //遍历输出学生数据{cout<<"姓名"<<'\t'<<"学号"<<'\t'<<"语文"<<'\t'<<"数学"<<'\t'<<"英语"<<'\t'<<"总分"<<endl;for(int i=0;i<aNum;i++){cout<<p[i].name<<'\t'<<p[i].id<<'\t'<<p[i].chinese<<'\t'<<p[i].math<<'\t'<<p[i].english<<'\t'<<p[i] .sum<<endl;}}//对学生总分按照从高到低的顺序排列int Sort(adent *p){if(aNum==0){cout<<"请先合并或者输入数据"<<endl;return 3;}sum(p);int flag=0; //设标识位do{cout<<"请输入排序方式,输入“1”冒泡排序, 输入“2”直接插入排序"<<endl;cin>>flag;if(flag==1)//冒泡{for(int i=0;i<aNum-1;++i) //外层循环{for(int k=i;k<aNum-1;++k) //内层循环{if(p[k].sum <p[k+1].sum) //按照从大到小的顺序进行排列{temp = p[k];p[k] = p[k+1];p[k+1] = temp;}}}traversal(p); //输出排序后的结果return 1;}if(flag==2)//直接插入{for(int i=1;i<aNum;i++){temp=p[i]; //将要比较的关键数赋给哨兵tempint j=i-1;while(j>=0 && temp.sum>p[j].sum) //直到越界或者把哨兵的值和j的值进行比较{p[j+1]=p[j]; //如果J的值比哨兵的值小,则把j的值向后移动j--; //j向前移,循环进行比较}p[j+1]=temp; //直到找到temp的值比j的值小,就把哨兵里的值放在j得后面}traversal(p);return 1;}if(flag!=1 && flag!=2){cout<<"输入错误,请重新输入";flag=3;}}while(flag=3);}//输入一个学生姓名后,能查找到此学生的信息并输出结果int Select(adent *p){if(aNum==0){cout<<"请先合并或者输入数据"<<endl;return 3;}int i=0;cout<<"请输入查询的姓名:";char sname[10];cin>>sname;while(i<aNum){if(strcmp(sname,p[i].name)==0) //通过字符串的比较来搜索要查找的姓名{cout<<"姓名"<<'\t'<<"学号"<<'\t'<<"语文"<<'\t'<<"数学"<<'\t'<<"英语"<<endl;cout<<p[i].name<<'\t'<<p[i].id<<'\t'<<p[i].chinese<<'\t'<<p[i].math<<'\t'<<p[i].english<<end l;return 1;}else{i++;if(i==aNum){cout<<"无此学生返回主菜单"<<endl;return 0;}}//while}//统计输出各门课程的平均分,最高分、最低分//统计各门课程优秀、良好、中等、及格、不及格的人数及百分比int Statistics(adent *p){ if(aNum==0){cout<<"请先合并或者输入数据"<<endl;return 0;}int flag=0;cout<<"请输入您想进行统计的科目,语文输入“1”,数学输入“2”,英语输入“3”"<<endl;cin>>flag;if(flag==1){float tempmax=0,tempmin=100,tempsum=0,tempgood=0,tempnormal=0,tempbad=0;for(int i=0;i<aNum;i++){if(p[i].chinese>tempmax)tempmax=p[i].chinese; //找到最高分if(p[i].chinese<tempmin)tempmin=p[i].chinese; //找到最低分if(p[i].chinese>=85)tempgood++; //找到优秀的人数if(p[i].chinese>=60 &&p[i].chinese<85)tempnormal++; //中等的人数if(p[i].chinese<60)tempbad++; //不及格的人数tempsum=tempsum+p[i].chinese; //语文的总分}cout<<"语文成绩平均分为:"<<setprecision(4)<<tempsum/aNum<<'\t'<<"最高分为:"<<tempmax<<'\t'<<"最低分为:"<<tempmin<<endl;cout<<"优秀的人数:"<<tempgood<<" 普通的人数:"<<tempnormal<<" 不及格的人数:"<<tempbad<<endl;cout<<"优秀(大于等于85)百分比为:"<<setprecision(4)<<tempgood/aNum*100<<'\t'<<"中等(60到85之间)百分比为:"<<tempnormal/aNum*100<<'\t'<<"不及格(小于60)百分比为:"<<tempbad/aNum*100<<endl;}if(flag==2){float tempmax=0,tempmin=100,tempsum=0,tempgood=0,tempnormal=0,tempbad=0;for(int i=0;i<aNum;i++)if(p[i].math>tempmax)tempmax=p[i].math;if(p[i].math<tempmin)tempmin=p[i].math;if(p[i].math>=85)tempgood++;if(p[i].math>=60 && p[i].math<85)tempnormal++;if(p[i].math<60)tempbad++;tempsum=tempsum+p[i].math;}cout<<"数学成绩平均分为:"<<setprecision(4)<<tempsum/aNum<<'\t'<<"最高分为:"<<tempmax<<'\t'<<"最低分为:"<<tempmin<<endl;cout<<"优秀的人数:"<<tempgood<<" 普通的人数:"<<tempnormal<<" 不及格的人数:"<<tempbad<<endl;cout<<"优秀(大于等于85)百分比为:"<<setprecision(4)<<tempgood/aNum*100<<'\t'<<"中等(60到85之间)百分比为:"<<tempnormal/aNum*100<<'\t'<<"不及格(小于60)百分比为:"<<tempbad/aNum*100<<endl;}if(flag==3){float tempmax=0,tempmin=100,tempsum=0,tempgood=0,tempnormal=0,tempbad=0;for(int i=0;i<aNum;i++){if(p[i].english>tempmax)tempmax=p[i].english;if(p[i].english<tempmin)tempmin=p[i].english;if(p[i].english>=85)tempgood++;if(p[i].english>=60 &&p[i].english<85)tempnormal++;if(p[i].english<60)tempbad++;tempsum=tempsum+p[i].english;}cout<<"英语成绩平均分为:"<<setprecision(4)<<tempsum/aNum<<'\t'<<"最高分为:"<<tempmax<<'\t'<<"最低分为:"<<tempmin<<endl;cout<<"优秀的人数:"<<tempgood<<" 普通的人数:"<<tempnormal<<" 不及格的人数:"<<tempbad<<endl;cout<<"优秀(大于等于85)百分比为:"<<setprecision(4)<<tempgood/aNum*100<<'\t'<<"中等(60到85之间)百分比为:"<<tempnormal/aNum*100<<'\t'<<"不及格(小于60)百分比为:"<<tempbad/aNum*100<<endl;}};void adda(adent *p){int aid=0,ac=0,am=0,ae=0;char aname[10];cout<<"请输入学号:"<<endl;cin>>aid;p[aNum].id=aid;cout<<"请输入姓名:"<<endl;cin>>aname;strcpy(p[aNum].name,aname);cout<<"请输入语文成绩:"<<endl;cin>>ac;p[aNum].chinese=ac;cout<<"请输入数学成绩:"<<endl;cin>>am;p[aNum].math=am;cout<<"请输入英语成绩:"<<endl;cin>>ae;p[aNum].english=ae;cout<<"录入成功"<<endl;aNum++; //学生人数}//删除数据int dela(adent *p){if(aNum==0){cout<<"请先合并或者输入数据"<<endl;return 3;}int i=0,aid=0;cout<<"请输入要删除学生的学号"<<endl; cin>>aid;while(i<aNum){if(p[i].id==aid) //找到要删除的id{for(int j=i;j<aNum-1;j++)p[i]=p[i+1]; //向前移动一位aNum--; //人数减一cout<<"删除成功"<<endl;return 1;else{i++;if(i==aNum){cout<<"无此学生返回主菜单"<<endl;return 0;}}}//while}//修改数据int altera(adent *p){if(aNum==0){cout<<"请先合并或者输入数据"<<endl;return 3;}int aid=0,ac=0,am=0,ae=0,i=0;char aname[10];cout<<"请输入要修改学生的学号"<<endl;cin>>aid;while(i<aNum){if(p[i].id==aid){cout<<"请输入新姓名:"<<endl;cin>>aname;strcpy(p[aNum].name,aname);cout<<"请输入新语文成绩:"<<endl;cin>>ac;p[aNum].chinese=ac;cout<<"请输入新数学成绩:"<<endl;cin>>am;p[aNum].math=am;cout<<"请输入新英语成绩:"<<endl;cin>>ae;p[aNum].english=ae;cout<<"修改成功"<<endl;return 1;}elsei++;if(i==aNum){cout<<"无此学生返回主菜单"<<endl;return 0;}}}//while}//菜单void menu(){cout<<"-------------------------------学生成绩管理系统---------------------------------"<<endl;cout<<" 1:对文件进行合并生成3.txt(在D盘下)"<<endl;cout<<" 2:添加数据"<<endl;cout<<" 3:修改数据"<<endl;cout<<" 4:删除数据"<<endl;cout<<" 5:按姓名查找某一学生成绩"<<endl;cout<<" 6:生成需补考学生名单4.txt(在D盘下)"<<endl;cout<<" 7:对学生成绩进行排序"<<endl;cout<<" 8:进行各科成绩的统计(平均分,最高分,最低分,成绩层次分布)"<<endl; cout<<" 9:退出"<<endl;cout<<"--------------------------------------------------------------------------------"<<endl;}//主函数void main(){system("color 79"); //系统颜色int choice;do{menu();cout<<"请输入您需要操作对应阿拉伯数字(1~9)"<<endl;cin>>choice;switch(choice){case 1:Merge();FillStruct(a);break;case 2:adda(a);break;case 3:altera(a);break;case 4:dela(a);break;case 5:Select(a);break;case 6:FailList(a);break;case 7:Sort(a);break;case 8:Statistics(a);break;case 9:exit(0);break;}//switch}while(1);}四、运行示例及结果分析结果分析:实现功能主要有:1) 要求使用链表或数组等实现上述要求2) 实现对两个文件数据进行合并,生成新文件3.txt3) 可实现学生成绩信息的输入、修改、删除功能4) 抽取出三科成绩中有补考的学生并保存在一个新文件4.txt5) 对合并后的文件3.txt中的数据按总分降序排序(至少采用两种排序方法实现)6)输入一个学生姓名后,能查找到此学生的信息并输出结果(至少采用两种查找方法实现)7)统计输出各门课程的平均分,最高分、最低分8)统计各门课程优秀、良好、中等、及格、不及格的人数及百分比五、调试和运行程序过程中产生的问题及采取的措施在做的时候,我把统计功能改成了排序,即对学生成绩进行降序排序。

数据结构课程设计学生成绩管理系统

数据结构课程设计学生成绩管理系统

课程设计报告课程设计题目:1:学生成绩管理系统2:joseph环3:猴子选大王姓名洪军学号201420180706班级1421807指导教师邹国华2015年12月17日1:学生成绩管理系统1, 问题分析;定义一个学生管理系统实现对学生基本数据的管理,录入:输入每位学生的信息;输出:输出每位学生的信息;查询:可以按3学号和4姓名查询某个学生的信息;修改:可以修改学生(按1学号修改,按2成绩修改)的信息;插入:可以插入一个学生的信息;删除:可以删除(按1学号删除,按2成绩删除)满足条件的学生信息;排序:可以按学生的总成绩排序。

2 结构分析首先分析结果我采用的是单链表的存储结构通过此系统可以实现如下功能:定义一个学生类型student(学号,姓名,四门课程成绩),学生链表student,含有学生数组和学生数。

3 实现流程分析定义数据类型typedef struct student⇩初始化结构体并输入学生的数据inputstu(stu &s,int n)⇩重载运算符便于输入输出学生的成绩⇩输出函数输出全部学生的信息output(stu s)⇩查找学生3按学号查找getstu1(stu s,char i[]) 4按姓名查找getstu2(stu s,char c[])⇩插入学生insetstu(stu &s,int i,char nu[],char na[],char se[],int sc[])⇩1按学号删除学生deletestu1(stu &s),2按姓名删除学生deletestu2(stu &s)⇩1按学号修改学生的信息update1(stu &s) 2按姓名修改学生的信息update2(stu &s)⇩对总成绩排序sort(stu &s,struct shu shuzu[])⇩CPP文件实现所有功能4 算法实现头文件status.htypedef int status;#define TURE 1#define FALSE 0#define OK 1#define ERROR 0#define OVERFLOW -2#define N 10typedef struct student{ //学生结构体(链表)char num[9];char name[15];char sex[2];int score[4];student *next;}student,*stu;struct shu{ //辅助结构体数组存储学生总成绩和学号便于排序float allscore;char num[9];}shuzu[10];ostream &operator<<(ostream &os,stu &s); //运算符的重载istream &operator>>(istream &is,stu &s); //运算符的重载void inputstu(stu &s,int n) //初始化并且输入函数{student *p,*r;int i;s=(stu)malloc(sizeof(student)); //申请头节点r=s;for(i=0;i<n;i++){p=(student *)malloc(sizeof(student)); //申请链表空间}status insetstu(stu &s,int i,char nu[],char na[],char se[],int sc[]) //插入学生{student *p=s,*q;int j=0,m;while(j<i-1&&p->next) //找到学生的位置{p=p->next;j++;}if(j==i-1){q=(student*)malloc(sizeof(student)); //申请新结点if(!q)return OVERFLOW; //申请失败返回错误{strcpy(q->name,na); //赋值strcpy(q->num,nu);for(m=0;m<4;m++)q->score[m]=sc[m];strcpy(q->sex,se);q->next=p->next;p->next=q;return OK;}}elsereturn ERROR;}status deletestu1(stu &s) //按学号删除学生{char i[10];cout<<"请输入你要删除学生的学号"<<endl;cin>>i;student *p=s,*r;while(strcmp(p->next->num,i)!=0) //找到修改学生{p=p->next;}if(p) //存在就删除不存在就返回错误{r=p->next;p->next=r->next;free(r);return 0;}elsereturn ERROR;}status deletestu2(stu &s) //按姓名删除学生{char i[10];cout<<"请输入你要删除学生的姓名"<<endl;cin>>i;student *p=s,*r;while(strcmp(p->next->name,i)!=0) //找到修改学生{p=p->next;}if(p){r=p->next;p->next=r->next;free(r);return 0;}elsereturn ERROR;}status update1(stu &s) //按学号修改学生的信息{char i[10];cout<<"请输入你要修改学生的学号"<<endl;cin>>i;student *p=s;while(strcmp(p->num,i)!=0) //找到修改学生{p=p->next;}if(p){cin>>p;return 0;}elsereturn ERROR;}status update2(stu &s) //按姓名修改学生的信息{char i[10];cout<<"请输入你要修改学生的姓名"<<endl;cin>>i;student *p=s;while(strcmp(p->name,i)!=0) //找到修改学生{p=p->next;}if(p){cin>>p;return 0;}elsereturn ERROR;}void sort(stu &s,struct shu shuzu[]) //对总成绩排序{int n=0,i,j,k;student *p=s->next;while(p){ //获取多少个人数n++;p=p->next;};p=s->next;for(i=1;i<=n;i++) //对结构体进行赋值{ shuzu[i].allscore=0;for(j=0;j<4;j++)shuzu[i].allscore=shuzu[i].allscore+p->score[j];strcpy(shuzu[i].num,p->num);p=p->next;}for(i=1;i<n;i++){ //对结构体进行排序k=i;for(j=i+1;j<=n;j++)if(shuzu[j].allscore>shuzu[k].allscore)k=j;if(k!=j){shuzu[0].allscore=shuzu[i].allscore;strcpy(shuzu[0].num,shuzu[i].num);shuzu[i].allscore=shuzu[k].allscore;strcpy(shuzu[i].num,shuzu[k].num);shuzu[k].allscore=shuzu[0].allscore;strcpy(shuzu[k].num,shuzu[0].num);}}for(i=1;i<=n;i++){ //对总成绩从大到小输出p=s->next;while(strcmp(p->num,shuzu[i].num)!=0) //按学号查找相对应的学生信息{p=p->next;}cout<<p<<" 总成绩为:"<<shuzu[i].allscore<<endl;}}ostream &operator<<(ostream &os,stu &s) //输出函数的重载{os<<"学号:"<<s->num<<" 姓名:"<<s->name<<" 性别:"<<s->sex<<"科目 1 "<<s->score[0]<<"科目 2 "<<s->score[1]<<"科目3 "<<s->score[2]<<"科目4 "<<s->score[3]<<endl;return os;}istream &operator>>(istream &is,stu &s) //输入函数的重载{ cout<<""<<"学号"<<"姓名"<<"性别"<<"科目1 "<<"科目2 "<<"科目3 "<<"科目4 "<<endl; is>>s->num>>s->name>>s->sex>>s->score[0]>>s->score[1]>>s->score[2]>>s->score[3];return is;}CPP文件#include<iostream.h>#include<stdio.h>#include<string.h>#include<stdlib.h>#include"Status.h"void menu(){cout<<"* * * * * * * *学生管理系统* * * * * * *"<<endl;cout<<"* * * 1:添加学生* * *"<<endl;cout<<"* * * 2:显示信息* * *"<<endl;cout<<"* * * 3:按学号查找* * *"<<endl;cout<<"* * * 4:按姓名查找* * *"<<endl;cout<<"* * * 5: 插入学生* * *"<<endl;cout<<"* * * 6: 删除学生* * *"<<endl;cout<<"* * * 7: 修改学生* * *"<<endl;cout<<"* * * 8: 学生总成绩排序* * *"<<endl;cout<<"* 其他:返回主菜单"<<endl;cout<<"请选择";}int main(){ stu s;struct shu shuzu[10];int i,k[4],j;char c[9],p[9];char x[20],o[20];char l[3];menu();while(1){static int n;scanf("%d",&n);switch(n){case 1:cout<<"输入多少个学生"<<endl;cin>>n;inputstu(s,n);break;case 2:output(s);break;case 3:cout<<"请输入你要找的学生学号:";cin>>c;getstu1(s,c);break;case 4:cout<<"请输入你要找的学生姓名:";cin>>x;getstu2(s,x);break;case 5:cout<<"需要插入位置,学号,姓名,性别,科目1,科目2,科目3,科目4"<<endl;cin>>i>>p>>o>>l;for(j=0;j<4;j++)cin>>k[j]; insetstu(s,i,p,o,l,k);break;case 6:cout<<"1:按学号删除学生的信息;2:按姓名删除学生的信息"<<endl;cin>>j;switch(j){case 1:deletestu1(s);break;case 2:deletestu2(s);break;};break;case 7:cout<<"1:按学号修改学生的信息;2:按姓名修改学生的信息"<<endl;cin>>j;switch(j){case 1:update1(s);break;case 2:update2(s);break;};break;case 8:sort(s,shuzu);break;default:return 0;}}调试结果5 课程小结我采用的是链表来存储学生的信息,最大的难点就是总成绩的排序,其他的功能实现还是比较简单,总成绩排序我用啦一个辅助结构体struct shu 来存储每个学生的学号char num来记录学生以及便于排序的时候查找,还有总成绩float allscore,且用结构体数组来存储首先对每个学生的学号及总成绩赋值给结构体数组shuzu[],然后对结构体数组进行从大到小排序(选择排序)然后对结构体一一查找相应的信息。

学生成绩管理系统数据结构课程设计

学生成绩管理系统数据结构课程设计

学生成绩管理系统数据结构课程设计学生成绩管理系统是一个用于管理学生学习成绩的软件系统。

它通常用于学校、教育机构或教师们来跟踪和记录学生的学习进展,并生成报告和分析数据。

在数据结构课程设计中,学生成绩管理系统需要设计合适的数据结构来存储和操作学生成绩数据。

在设计学生成绩管理系统时,可以使用以下数据结构:1. 数组:可以使用数组来存储学生成绩数据。

每个学生的成绩可以用一个数组元素表示,可以将学生按照学号或者其他标识符按顺序存储在数组中。

这样可以方便地通过索引来访问和修改学生成绩。

2. 链表:链表是另一种常用的数据结构,可以用于存储学生成绩数据。

每个学生的成绩可以用一个节点表示,节点可以包含学生的信息和成绩,同时包含指向下一个节点的指针。

这样可以方便地插入、删除和查找学生成绩。

3. 树:树可以用于组织学生成绩数据。

可以使用二叉搜索树或平衡二叉树来存储学生成绩,其中学生的学号或者姓名可以作为关键字。

这样可以方便地进行查找、插入和删除操作,并可支持对学生成绩进行排序。

以上是一些常用的数据结构,用于存储学生成绩管理系统的数据。

在具体的设计中,还可以根据实际需求选择其他合适的数据结构。

除了数据结构,学生成绩管理系统还可能包括其他功能,例如:1. 添加学生:可以通过输入学生的基本信息和成绩,将学生添加到系统中。

2. 删除学生:可以通过学生的学号或其他标识符,从系统中删除某个学生的信息和成绩。

3. 修改成绩:可以根据学生的学号或其他标识符,修改学生的成绩信息。

4. 查询成绩:可以根据学号、姓名或其他条件,查询学生的成绩信息。

5. 成绩统计和分析:可以对学生的成绩进行统计和分析,生成报告和图表,帮助教师或学校了解学生的学习情况。

以上只是学生成绩管理系统可能包含的一些基本功能,具体的设计和实现还需要根据实际需求和要求进行进一步的扩展和深入分析。

通过合适的数据结构和功能设计,可以实现一个高效、易用和功能完善的学生成绩管理系统。

数据结构之学生成绩管理系统

数据结构之学生成绩管理系统

学生成绩管理系统一、试验目旳1. 通过本次课程设计中学生成绩管理系统旳题目,掌握链表等数据构造旳基本操作方面旳知识,并能灵活旳处理某些基本旳问题,加深对其性质及各项操作旳理解;2. 将所学数据构造方面旳知识与一门详细旳语言——C语言来进行实现, 感受数据构造旳强大作用, 加深理解。

二、试验规定(1)管理系统中有五个规定: 输入查找修改插入删除存储(2)输入规定: 可以通过键盘输入和文献输入两种(3)查找规定:可以根据学生号查找单个学生旳信息, 也可以遍历所有学生信息(4)修改规定: 可以根据学生号修改单个学生所有信息(5)插入规定: 可以实现头插和尾插(6)删除规定: 可以根据学生号删除单个学生信息三、存储规定: 通过链表存储所有信息四、算法旳思想与算法实现环节1. 基本思想通过链表数据类型进行基本操作, 重要有三个模块: 分别是主函数模块、重要操作函数及基本操作函数。

其中, 主函数负责其他子函数旳调用实现以及基本界面旳操作重要函数包括:void StuInput(Student *); //学生成绩管理系统旳输入函数, 由主函数调用void StuSelect(Student *); //学生成绩管理系统旳查找函数, 由主函数调用void StuAlter(Student *); //学生成绩管理系统旳修改函数, 由主函数调用void StuInsert(Student *); //学生成绩管理系统旳插入函数, 由主函数调用void StuDelect(Student *); //学生成绩管理系统旳删除函数, 由主函数调用void StuSave(Student *); //学生成绩管理系统旳存储函数, 由主函数调用基本操作函数:void StuOutput(Student *p); //输出函数int StuImport(Student *head,Student *p); //输入函数void StuInputHand(Student *head); //学生成绩管理系统旳手动输入函数, 由输入函数调用void StuInputFile(Student *head); //学生成绩管理系统旳文献输入函数, 由输入函数调用void StuSelectErg(Student *head); //学生成绩管理系统旳遍历函数, 由查找函数调用void StuSelectNumFind(Student *head); //学生成绩管理系统旳按学号查找函数, 由查找函数调用void StuSelectSubFind(Student *head); //学生成绩管理系统旳按科目查找函数, 由查找函数调用2. 实现环节首先, 分析题目规定划分实现模块, 定义基本数据类型, 诸如构造体、链表等;另一方面, 针对上述旳基本操作实现详细需要进行旳操作, 详细实现每个环节需要进行旳基本操作, 即详细编写每个小函数实现功能;最终, 编写主函数对每个实现进行按需调用, 实现操作。

学生成绩管理系统数据结构课程设计

学生成绩管理系统数据结构课程设计

学生成绩管理系统数据结构课程设计近年来,随着信息技术的快速发展,学生成绩管理系统在学校中得到了广泛应用。

学生成绩管理系统是一种基于数据结构的软件系统,旨在帮助学校更好地管理学生的学习成绩。

本文将介绍一个基于数据结构的学生成绩管理系统的设计。

首先,我们需要设计一个合适的数据结构来存储学生的学习成绩。

在这个系统中,我们可以使用一个二维数组来存储学生的成绩信息。

数组的行表示学生的学号,列表示不同科目的成绩。

这样,我们就可以方便地对学生成绩进行增删改查的操作。

接下来,我们需要设计一些基本的功能来实现学生成绩的管理。

首先是添加学生的成绩信息。

当学生入学时,管理员可以通过系统将学生的学号和成绩添加到数组中。

其次是删除学生的成绩信息。

当学生毕业或者转学时,管理员可以通过系统将学生的学号和成绩从数组中删除。

再次是修改学生的成绩信息。

当学生的成绩发生变化时,管理员可以通过系统修改学生的成绩。

最后是查询学生的成绩信息。

管理员可以通过系统查询学生的学号,然后系统会返回该学生的成绩信息。

除了基本的功能,我们还可以设计一些高级功能来提升学生成绩管理系统的实用性。

例如,我们可以设计一个成绩统计功能,用于统计学生的平均成绩、最高成绩和最低成绩。

这样,管理员可以更好地了解学生的学习情况。

另外,我们还可以设计一个成绩排名功能,用于按照成绩对学生进行排名。

这样,管理员可以更方便地找出成绩优秀的学生。

在实际应用中,我们还可以将学生成绩管理系统与其他系统进行集成。

例如,我们可以将学生成绩管理系统与学生信息管理系统进行集成,这样可以更方便地管理学生的学习情况。

另外,我们还可以将学生成绩管理系统与家长端进行集成,这样家长可以通过系统查看孩子的成绩情况,及时了解孩子的学习进展。

总之,学生成绩管理系统是一种基于数据结构的软件系统,可以帮助学校更好地管理学生的学习成绩。

通过合适的数据结构和功能设计,我们可以方便地对学生成绩进行增删改查的操作,并且可以提供一些高级功能来提升系统的实用性。

数据结构课设报告学生成绩管理系统-V1

数据结构课设报告学生成绩管理系统-V1

数据结构课设报告学生成绩管理系统-V1数据结构课设报告——学生成绩管理系统一、前言学生成绩管理系统是一种方便学校和老师管理学生成绩的软件,可以提高教学效率,减轻教师工作负担,使学校管理更加科学化,并且有利于提高学生的成绩。

本篇报告将重点介绍数据结构课设——学生成绩管理系统的设计与实现。

二、系统功能1.学生信息的录入、修改、删除和查询。

2.成绩信息的录入、修改、删除和查询。

3.根据学号、姓名、班级等条件进行成绩查询和统计。

4.可以查询某个学生的所有科目的成绩。

5.可以查询某个科目的所有学生成绩。

6.可以进行成绩的按科目排名和按班级排名。

7.可以导入和导出学生成绩信息。

三、主要数据结构本系统的主要数据结构采用了链表和树结构。

1.链表结构:用来存储学生信息和成绩信息,每个节点包含了学号、姓名、班级、科目、成绩等信息。

2.树结构:用来存储学生成绩信息,每个节点表示一个学生的成绩信息,包含了学号、姓名、班级、所有科目的成绩等信息。

四、系统设计1.采用了MVC思想,把视图、控制器和模型分开管理,提高了系统的安全性、可维护性和可扩展性。

2.系统采用了图形界面,用户友好,易于操作。

3.实现了学生信息的录入、修改、删除和查询、成绩的录入、修改、删除和查询等重要功能。

4.使用了数据结构中的排序算法,可以按照科目成绩和班级成绩进行排序展示。

五、实现效果本系统的实现效果良好,满足了学校和教师的各种需求。

系统可以快速查询和统计学生成绩,提高了学校管理水平和教学质量。

同时,系统也减轻了教师工作负担,提高了教学效率。

六、总结学生成绩管理系统是一种非常实用的软件,在现代教育管理中扮演着重要的角色。

本次数据结构课设——学生成绩管理系统的设计与实现,深入运用了数据结构的知识,使得系统运行更加快捷高效。

在未来的学校管理中,我们会进一步优化和完善这个系统,为广大教师和学生服务。

学生成绩管理系统数据结构课程设计

学生成绩管理系统数据结构课程设计

学生成绩管理系统数据结构课程设计1. 介绍学生成绩管理系统是一种用于管理学生学业成绩的应用软件。

该系统能够帮助教师和学生方便地录入、查询和统计学生的各科成绩,以便更好地进行教学和学习工作。

本文将针对该系统的数据结构进行设计和实现。

2. 系统需求学生成绩管理系统需要满足以下功能要求:•学生信息管理:包括学生姓名、学号、专业等信息。

•课程信息管理:包括课程名称、课程编号、学分等信息。

•成绩信息管理:包括学生的各科成绩。

•信息查询:能够查询学生的个人信息、课程信息和成绩信息。

•成绩统计:能够对学生的各科成绩进行统计和分析。

3. 数据结构设计基于上述需求,我们可以设计以下数据结构:3.1 学生信息数据结构struct Student {int studentId; // 学号string name; // 姓名string major; // 专业};3.2 课程信息数据结构struct Course {int courseId; // 课程编号string name; // 课程名称int credit; // 学分};3.3 成绩信息数据结构struct Score {int studentId; // 学生学号int courseId; // 课程编号float score; // 成绩};3.4 数据存储结构设计3.4.1 学生信息存储使用数组或链表存储学生信息,可以根据学号快速查找和修改学生信息。

struct StudentNode {Student stu;StudentNode* next;};3.4.2 课程信息存储使用数组或链表存储课程信息,可以根据课程编号快速查找和修改课程信息。

struct CourseNode {Course crs;CourseNode* next;};3.4.3 成绩信息存储使用数组或链表存储成绩信息,可根据学生学号和课程编号查找和修改成绩信息。

struct ScoreNode {Score scr;ScoreNode* next;};4. 系统实现4.1 添加学生信息通过输入学生的学号、姓名和专业信息,创建一个学生结构体,并将其插入学生信息存储数据结构中。

数据结构课程设计报告-学生成绩管理系统(1)

数据结构课程设计报告-学生成绩管理系统(1)

学院:职业技术学院专业:计算机科学与技术姓名:学号: 1 班级:计科061班实习性质:课程设计实习地点:蔡家关校区国合楼二楼计算机房指导教师:曾劼成绩:学生成绩管理系统设计一、需求分析随着社会的发展,学校的规模不断的扩大,日常教学活动中提取相关信息,以反映教学情况。

传统的手工操作方式,易发生数据丢失,统计错误,劳动强度高,且速度慢。

使用计算机可以高速,快捷地完成以上工作。

在计算机联网后,数据在网上传递,可以实现数据共享,避免重复劳动,规范教学管理行为,从而提高了管理效率和水平。

学生成绩管理系统以计算机为工具,通过对学生成绩管理所需的信息管理,把管理人员和老师从繁琐的数据计算处理中解脱出来,使其有更多的精力从事教务管理政策的研究实施,教学计划的制定执行和教学质量的监督检查,从而全面提高教学质量。

信息社会的高科技,商品经济化的高效益,使计算机的应用已普及到经济和社会生活的各个领域。

计算机虽然与人类的关系愈来愈密切,还有人由于计算机操作不方便继续用手工劳动。

为了适应现代社会人们高度强烈的时间观念,学生成绩管理系统软件为教学办公室带来了极大的方便。

该软件是以C语言为实现语言,其功能在系统内部有源代码直接完成。

通过操作目录,管理者和老师可以了解本软件的基本工作原理。

管理者和老师只需输入一些简单的汉字、数字,即可达到自己管理学生成绩的目标。

在学生成绩管理系统中,需要从大量的日常教学活动中提取相关信息,以反映教学情况。

传统的手工操作方式,易发生数据丢失,统计错误,劳动强度高,且速度慢。

使用计算机可以高速,快捷地完成以上工作。

在计算机联网后,数据在网上传递,可以实现数据共享,避免重复劳动,规范教学管理行为,从而提高了管理效率和水平。

通过本学生成绩管理系统,可以从一下几个方面减少老师的工作负担和提高学校的管理效率,实现学校的信息化和自动化。

1.应用学生成绩管理系统,把老师从繁杂的学生成绩了登记分数、统计分数、学生排名等等的工作职工解脱出来,把更多的时间和精力用来提高教学质量和学生的辅导工作上,提高学生的学生效率和成绩。

学生成绩管理系统数据结构课程设计报告

学生成绩管理系统数据结构课程设计报告

学生成绩管理系统数据结构课程设计报告一、背景学生成绩管理系统是学校教务处常用的软件之一,旨在方便学校管理学生成绩信息。

数据结构是计算机科学中的基础课程,对于学生成绩管理系统的设计和实现有着重要意义。

本课程设计报告将针对学生成绩管理系统的数据结构设计展开讨论。

二、需求分析学生成绩管理系统需要存储学生的基本信息和成绩信息,可以进行成绩录入、查询、统计等操作。

系统需要能够高效地处理大量学生信息,并提供快速、准确的查询功能。

三、数据结构设计1. 学生信息存储为了高效地存储学生信息,可以使用链表数据结构。

每个学生信息包括学号、姓名、性别、班级等字段,可以设计一个学生结构体来存储这些信息。

链表节点可以包含一个学生结构体和指向下一个节点的指针,从而构成一个链表来存储所有学生信息。

typedef struct Student {int studentID;char name[50];char gender;char className[50];float score;struct Student* next;} Student;Student* head = NULL;2. 成绩信息存储成绩信息可以存储在一个数组中,数组的每个元素对应一个学生的成绩,可以通过学号索引到对应的成绩信息。

为了方便查询和统计,可以对成绩数组进行排序,例如按学号或成绩值排序。

float scores[1000];四、功能实现1. 成绩录入在管理系统中,可以提供成绩录入功能,输入学生的学号和成绩信息后,将成绩信息存储到成绩数组中。

2. 查询功能查询功能可以根据学生的学号或姓名查询学生的基本信息和成绩信息,可以使用链表和数组的结合来实现高效的查询功能。

3. 成绩统计系统可以根据输入的条件,如班级、科目等进行成绩统计,计算平均成绩、最高分、最低分等统计信息。

五、总结本设计报告对学生成绩管理系统的数据结构设计进行了详细讨论,包括学生信息和成绩信息的存储方式、功能实现等方面。

数据结构与算法课程设计 学生成绩管理系统

数据结构与算法课程设计 学生成绩管理系统

数据结构与算法课程设计学生成绩管理系统学生成绩管理系统是一种用于管理学生的课程成绩和相关信息的软件系统。

该系统旨在帮助学校、教师和学生更好地管理和了解学生的学术表现。

下面是一个标准格式的文本,详细描述了学生成绩管理系统的功能和特点。

一、系统概述学生成绩管理系统是基于数据结构与算法课程设计的一个软件系统。

该系统通过使用合适的数据结构和算法,实现了对学生课程成绩的管理和统计分析。

系统具有用户友好的界面和丰富的功能,能够满足学校、教师和学生的需求。

二、系统功能1. 学生信息管理:系统可以记录学生的基本信息,包括学号、姓名、性别、年级等。

教师和管理员可以通过系统添加、修改和删除学生信息。

2. 课程管理:系统可以管理学校开设的各门课程,包括课程名称、授课教师、学分等信息。

教师和管理员可以在系统中添加、修改和删除课程信息。

3. 成绩录入:教师可以通过系统录入学生的课程成绩。

系统会自动计算每门课程的平均成绩和总评成绩,并将成绩与学生的个人信息进行关联。

4. 成绩查询:学生和教师可以通过系统查询学生的课程成绩。

学生可以查看自己的成绩,教师可以查看所教授课程的学生成绩。

查询结果可以按照学生、课程、成绩等进行排序和筛选。

5. 统计分析:系统可以对学生的课程成绩进行统计分析。

教师和管理员可以查看学生的平均成绩、最高成绩、最低成绩等统计信息,并生成相应的报表。

6. 数据备份与恢复:系统支持对学生信息和成绩数据进行备份和恢复。

管理员可以定期备份数据,以防止数据丢失或损坏。

7. 用户权限管理:系统具有不同的用户角色,包括学生、教师和管理员。

每个用户角色有不同的权限,保证了系统的安全性和数据的保密性。

三、系统特点1. 高效性:系统使用了合适的数据结构和算法,能够快速处理大量的学生信息和成绩数据,提高了系统的响应速度和处理效率。

2. 可扩展性:系统具有良好的可扩展性,可以根据实际需求进行功能的扩展和定制。

例如,可以添加更多的统计分析功能,或者与其他系统进行集成。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

辽宁科技大学课程设计报告设计题目:学生成绩管理学院、系:电子与信息工程学院专业班级:计算机11-2 班学生姓名:赵月指导教师:龙艳彬成绩:2013年1 月8 日目录一、需求分析------------------------------------------------3二、概要设计------------------------------------------------3三、详细设计------------------------------------------------53.1系统流程图-----------------------------------------------------53.2界面设计-------------------------------------------------------63.3各功能模块的设计----------------------------------------------7四、测试与分析---------------------------------------------9五、总结-----------------------------------------------------15六、附录(源代码)--------------------------------------161.需求分析1.1问题描述本系统实现了学生成绩管理的功能,具有学生成绩的输入、读取、查询、修改、插入、删除、排序,统计等功能。

1.2基本要求(1) 输入的形式和输入值的范围;首先输入学生个数,按回车键。

按照提示选择,将学生信息保存在文本文档中,具体对学生信息进行插入删除查询操作时,将保存在文本文档中的学生信息提取出来,保存在自己定义的数据结构中,然后再对该数据结构进行操作,所有操作完成,或者在相应的命令后,再将学生信息保存到文本文档中。

输入数据类型主要是char、int、float等数据类型,输入内容包括:学期、学号、姓名、高等数学成绩,数据机构成绩,大学英语成绩总分,平均分等数据。

(2) 输出的形式;学期、学号、姓名、高等数学成绩,数据结构成绩,大学英语成绩,总分,平均分等数据。

(3) 程序所能达到的功能;1. 数据输入功能,输入的数据能最终保存在文件中;2.数据删除功能,能最终从文件中删除;3. 排序功能,根据自己设计的数据结构,设计排序算法4.多种查询(如按学号查询、按姓名查询、按成绩查询等)及输出功能;6. 学生信息的修改(比如修改学生姓名,修改学生某门课程的成绩)7. 其它功能(如各种统计,统计每个学生所有课程的平均分,统计某门课程所有学生的平均分等等)2、概要设计1. 数据结构:数组(顺序存储结构)2. 程序模块:(1)先编入系统所需的库函数,使程序可运行#include <iostream.h>#include <stdlib.h>#include <iomanip.h> //主要是对cin,cout之类的一些操纵运算,是I/O流控制头文件。

#include <conio.h> //文件和标准控制台的输入输出#include <stdio.h>(2)主界面的设计在主界面中包括“①输入学生信息并保存到文件②读取文件并输出学生信息③按学号及学期查询④按姓名及学期查询⑤按学号及学期修改信息⑥插入信息⑦按学号及学期删除信息⑧按数据结构降序(冒泡)排序⑨按总分降序(选择)排序⑩统计各科成绩的总分和平均分11退出”等全部的功能。

每个函数体如下:void input(Student *r); //输入void output(Student *r); //输出void searchnum(Student *r); //按学号及学期查找void searchname(Student *r); //按姓名及学期查找void change(Student *r); //按学号及学期修改信息Student *insert(Student *r); //插入信息void shanchu(Student *r); //按学号及学期删除信息void maopao(Student *r); //按数据结构降序(冒泡)排序void xuanze(Student *r); //按总分降序(选择)排序void tongji(Student *r); //统计各科总分和平均分信息(3)Main()函数的设计在main()函数中主要运用do-while循环语句和switch()-case选择判断语句来调用相关功能模块。

系统的运行是在一个循环里进行的,只有在主界面并选择“退出”时,才会跳出循环,并退出程序。

void main(){c out<<"输入学生的个数:";c in>>num; //全局变量S tudent *p=(Student *)new Student[num]; //定义指针数组,存放学生个数i nt m;d o{cout<<endl;cout<<endl;cout<<"\t*----------------------------->菜单栏<-----------------------------*\n"<<endl;cout<<"\t* <1> 输入学生信息并保存到文件<2> 读取文件并输出学生信息*"<<endl;cout<<"\t* <3> 按学号及学期查询<4> 按姓名及学期查询*"<<endl;cout<<"\t* <5> 按学号及学期修改信息<6> 插入信息*"<<endl;cout<<"\t* <7> 按学号及学期删除信息<8> 按数据结构降序(冒泡)排序*"<<endl;cout<<"\t* <9> 按总分降序(选择)排序<10> 统计各科成绩的总分和平均分*"<<endl;cout<<"\t* <11> 退出*"<<endl;cout<<"\t*------------------------------------------------------------------*\n"<<endl;cout<<"请选择:";cin>>m;switch(m){case 1:input(p); //输入break;case 2:output(p);break;case 3:searchnum(p);break;case 4:searchname(p);break;case 5:change(p);break;case 6:p=insert(p);break;case 7:shanchu(p);break;case 8:maopao(p);break;case 9:xuanze(p);break;case 10:tongji(p);break;case 11: //退出break;}}while(m!=11);}3、详细设计1、系统流程图2、界面设计在此界面用户可以选择要操作的选项,回车之后即可进入相关的页面进行操作(例如:选择1,即可进入输入学生信息页面)输入学生个主界输入学生输出学生查询学生修改学生插入学生删除学生按总分排按单科排统计分数退出 退出3、各功能模块的设计主函数模块:用函数void main()来实现主要是来显示主菜单,使用户选择操作。

首先定义一个指针数组(全局使用)Student *p=(Student *)new Student[num];在此处num是指学生个数,并不是学号,在这里应用了do-while和switch-case语句来进行选择。

最后若选择“11”则是保存记录并退出循环。

输入学生记录模块:用函数void input(Student *r);来实现主要功能用来对学生的成绩进行输入。

首先会有个提示“输入学生的个数”,之后跳出主菜单,选择"1",进入输入模块输入所需学生个数的学生信息,比如学期,学号,姓名,成绩等。

输完之后会自动跳出主菜单。

期间会有一些提示语,按照提示操作。

根据if 和for语句来判定是否有重复学号输入,在本操作中,允许有重复学生姓名出现。

t=1表示找到了与之重复的学号,t=0表示未出现重复学号。

在此期间会根据语句算出总分和平均分,并默认按学号排序保存到文件中去。

之后返回主菜单。

输出学生记录模块:用函数void output(Student *r);来实现主要功能是用来输出学生的信息。

在系统已经录入了学生资料的前提下,用该功能可以显示学生的信息资料。

同时也会自动跳出主菜单进行后续操作。

其中stew()指的是两字节之间的间隔,在括号中填入数字就会有相应的间隔。

按学号及学期来查找学生记录模块:用函数void searchnum(Student *r);来实现主要功能时用来查找学生记录。

首先会有提示输入学号及学期,再用for循环语句和if判断语句来进行查找,if(r[m].num==n&&r[m].term==k)若找到则显示学生记录并跳出循环;if(r[m].num!=n&&r[m].term!=k)若没有则提示“该学号不存在,或没有这个学期的成绩!”。

按姓名及学期来查找学生记录模块:用函数void searchname(Student *r)来实现主要功能也是用来查找学生记录的。

首先会有提示输入姓名及学期,再用for循环语句和if判断语句来进行查找,if((r[m].name[0] == n[0]) && (r[m].term == k))若找到则显示学生记录并跳出循环;if(r[m].name[0]!=n[0]&&r[m].term!=k)若没有则提示"该姓名不存在,或没有这个学期的成绩!"按学号及学期修改信息:用函数void change(Student *r)来实现主要功能是用来修改学生记录。

相关文档
最新文档