数据结构课程设计学分管理系统
数据结构课程设计-学生成绩管理系统
![数据结构课程设计-学生成绩管理系统](https://img.taocdn.com/s3/m/6b58c105195f312b3069a512.png)
广东学院《数据结构课程设计》题目:学生成绩管理系统学号:姓名:年级:计算机科学与技术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)数据结构课设报告学生成绩管理系统(一)](https://img.taocdn.com/s3/m/40759a20876fb84ae45c3b3567ec102de2bddf66.png)
(2023)数据结构课设报告学生成绩管理系统(一)数据结构课设报告学生成绩管理系统一、背景介绍为了方便教师管理学生的成绩,提高数据处理的效率和准确性,我们团队开发了一款可以管理学生成绩的系统。
二、需求分析•教师可以登录系统,并进行学生信息的录入、修改、查询和删除。
•教师可以录入、修改、查询和删除学生的成绩。
•学生也可以登录系统,并查看自己的成绩。
•教师和学生的密码需要进行加密存储,并能够找回密码。
三、设计方案1. 数据结构设计我们采用链表的数据结构,实现学生信息和成绩的存储。
- 学生信息:学号、姓名、密码。
- 学生成绩:科目、成绩。
2. 模块划分•登录模块:实现教师和学生的登录、密码加密和找回密码。
•学生信息管理模块:实现学生信息的录入、修改、查询和删除。
•成绩管理模块:实现成绩的录入、修改、查询和删除。
•学生成绩查询模块:实现学生查看自己成绩的功能。
3. 界面设计我们采用Java Swing库实现图形化界面,美观易用。
四、开发过程1. 环境配置我们使用Java语言进行开发,并采用MySQL数据库存储数据。
开发工具为Eclipse和Navicat。
2. 实现过程在开发过程中,我们分别完成了登录模块、学生信息管理模块、成绩管理模块和学生成绩查询模块。
同时,我们进行了严格的测试和优化,保证了系统的稳定性和用户体验。
五、总结通过本次课设,我们学习到了如何设计、实现一款简单的大型软件。
同时,我们也深入理解了数据结构的应用和开发过程中需要注意的问题。
未来,我们将继续学习和提升自己的技术水平,为社会创造更多有用的产品。
六、存在的问题和改进计划1. 学生信息和成绩输入需要更为便捷目前的输入方式需要逐一输入每个学生的信息以及成绩,如果要录入多个学生的信息,效率不高。
我们计划实现批量导入的功能,可以通过Excel表格导入学生信息和成绩。
2. 安全性还需要更高的保障目前我们只是简单使用密码加密保护了教师和学生的账户信息,如果系统被攻击者入侵,那么所有的账户信息和成绩信息都会暴露,对学生隐私和数据安全造成极大威胁。
数据结构课程设计学生管理系统
![数据结构课程设计学生管理系统](https://img.taocdn.com/s3/m/5310f419182e453610661ed9ad51f01dc2815723.png)
#include<stdio.h>#include <malloc.h>#include<string.h>#include<stdlib.h>#include <io.h>//建立结构体struct student{long num;//学号char name[10];//姓名char sex[10];//性别char id[20];//身份证号char adress[80];//家庭地址long tel; //电话号码struct student * next;};/*此学生信息管理系统一共分为八个模块,分别为信息录入、信息浏览、信息查询、信息删除、信息修改、信息插入、信息保存、信息读取,其中信息保存和信息读取为隐藏模块。
系统界面清晰,操作简单,用户输入密码之后就可进入进行各种操作。
*/FILE *fp;//文件指针int count=0;//记录学生数量struct student *head;//学生信息录入struct student *input(){struct student *head=NULL; //定义头指针struct student *p1,*p2; //定义结点while(1){int choice;printf(" |------------------| \n");printf(" | 【1】录入学生信息| \n");printf(" | 【0】退出| \n");printf(" |------------------| \n");printf(" 请输入你的选择:");scanf("%d",&choice);if(choice==1){printf(" *****学生信息录入模块***** \n");p1=(struct student *)malloc(sizeof(struct student));//开辟一个新结点printf(" 请输入学号: ");scanf("%ld",&p1->num);printf(" 请输入姓名: ");scanf("%s",p1->name);printf(" 请输入性别:");scanf("%s",p1->sex);printf(" 请输入身份证号:");scanf("%s",&p1->id);printf(" 请输入家庭住址:");scanf("%s",p1->adress);printf(" 请输入手机号:");scanf("%ld",&p1->tel );count++;if(head==NULL){head=p1;}elsep2->next=p1;//p1指向下一个结点p2=p1;}else if(choice==0)break;elseprintf(" 选择错误!请重新选择!\n");}p1->next=NULL;return head;}//学生信息浏览void displayall(struct student *head){struct student *p1=head;if(head==NULL){printf("无学生信息!\n");return;}else{printf("总共有%d个学生!\n",count);printf(" 所有学生信息为:\n");printf("***************************************************************\n");while(p1!=NULL){printf("\n学号:%ld\n姓名:%s\n性别:%s\n身份证号:%s\n家庭住址:%s\n手机号:%ld\n\n", p1->num, p1->name,p1->sex,p1->id,p1->adress,p1->tel);p1=p1->next;}}}void display(struct student *p1){{printf(" 该学生信息为:\n");printf("***************************************************************\n");printf(" \n学号\t姓名\t性别\t身份证号\t家庭住址\t手机号\n");printf("%ld\t%s\t%s\t%s\t\t%s\t\t%ld\n", p1->num,p1->name,p1->sex,p1->id,p1->adress,p1->tel); }}//查询学生信息struct student *query(struct student *head){ struct student *p1;int choice;int num;char name[10];if(head==NULL) {printf("链表为空或无学生记录!\n");return head;}while(1){printf(" |---------------|\n");printf(" |【1】按学号查询|\n");printf(" |【2】按姓名查询|\n");printf(" |【0】退出|\n");printf(" |---------------|\n");printf(" 请输入你的选择:");scanf("%d",&choice);if(choice==1){printf(" 请输入要查询学生的学号:"); scanf("%ld", &num);p1=head;while(1){if(num == p1->num) {printf(" *****找到该学生信息*****\n"); display(p1);break;}if(p1->next==NULL){printf(" 没有学号为%d的学生信息!\n",num); break;}else p1=p1->next;}}else if(choice==2){printf(" 请输入要查询学生的姓名:"); scanf("%s", name);p1=head;if(strcmp(name, p1->name)==0){printf(" *****找到该学生信息*****\n");}else{while((strcmp(name, p1->name)!=0)&& p1->next!=NULL) { p1=p1->next;if(strcmp(name, p1->name)==0){printf(" *****找到该学生信息*****\n");display(p1);break;}elseprintf(" 没有姓名为%s的学生!\n",name);}}}else if(choice==0)break;elseprintf(" 选择错误!\n");}return (p1);} //删除学生信息struct student *del(struct student *head){struct student * p1, * p2;int num,choice;if(head==NULL){printf(" 链表为空或无学生记录!\n");return head;}printf(" 请输入要删除的学生学号:");scanf("%ld",&num);p1=head;while(1){if(num == p1->num) {printf(" ****找到该学生信息****\n");display(p1);break;}if(p1->next==NULL){printf(" 没有学号为%d的学生信息!\n",num);return head;}else{p2=p1;}}printf(" |-------------|\n");printf(" |【1】确认删除|\n");printf(" |【0】返回|\n");printf(" |-------------|\n");printf(" 请输入你的选择:");scanf("%d",&choice);if(choice==1){count--;if(p1 == head)head=p1->next;elsep2->next=p1->next;free(p1);printf(" 该学生信息已删除!\n");}else if(choice==0)return head;elseprintf("无效选择,请重新输入!");return head;}//修改学生信息struct student *change(struct student *head){ struct student *p1,*p2;int choice;long num;int flog;if(head==NULL){printf(" 链表为空或无学生记录!\n"); return head;}printf(" 请输入要修改的学生的学号:"); scanf("%ld",&num);p1=head;while(1){if(num == p1->num) {flog=1;break;}if(p1->next==NULL){flog=0;break;}else{p2=p1;p1=p1->next;}}if(flog==0){printf(" 没有学号为%d的学生信息!\n",num); }else if(flog==1){printf(" ****找到该学生信息****\n"); display(p1);while(1){printf(" |**********************|\n");printf(" |【1】修改姓名|\n");printf(" |【2】修改性别|\n");printf(" |【3】修改身份证号|\n");printf(" |【4】修改家庭住址|\n");printf(" |【5】修改电话号码|\n");printf(" |【0】退出|\n");printf(" |**********************|\n");printf(" 请输入你的选择:");scanf("%d",&choice);switch(choice){case 1:{printf(" 请输入修改后的姓名:");scanf("%s",p1->name);break;}case 2:{printf(" 请输入修改后的性别:");scanf("%s",p1->sex);break;}case 3:{printf(" 请输入修改后的身份证号:"); scanf("%s",&p1->id);break;}case 4:{printf(" 请输入修改后的家庭住址:"); scanf("%s",p1->adress);break;}case 5:{printf(" 请输入修改后的电话号码:");scanf("%ld",&p1->tel);break;}case 0:return head;default:printf(" 无效选择,请重新输入!\n");}}}return head;}//插入一个学生信息struct student *insert(struct student *head){struct student *p1,*p2,*insertstu;int place,choice,mark=0,num=0;if(head==NULL){printf(" 信息为空请选择信息录入!\n");return head;}while(1){printf(" |-------------|\n");printf(" |【1】继续|\n");printf(" |【0】退出|\n");printf(" |-------------|\n");printf(" 请输入你的选择:");scanf("%d",&choice);if(choice==1){insertstu=(struct student *)malloc(sizeof(struct student));displayall(head);printf(" 请输入要插入的位置:");scanf("%d",&place);if(place==1){mark=1;insertstu->next=head;head=insertstu;}else{for(p2=p1=head,num=1;p1->next !=NULL;p2=p1,p1=p1->next,num++){ if(num==place){mark=1;insertstu->next=p1;p2->next=insertstu;break;}}if(place==num){mark=1;insertstu->next=p1;p2->next=insertstu;}else if(place==num+1){mark=1;p1->next=insertstu;insertstu->next=NULL;}else if(place>num+1){printf(" 超出插入范围,请核对!\n"); continue;}}if(mark==1){printf(" 请输入要插入的学生信息!\n"); printf(" 请输入学号:");scanf("%ld",&insertstu->num);printf(" 请输入姓名:");scanf("%s",insertstu->name);printf(" 请输入性别:");scanf("%s",insertstu->sex);printf(" 请输入身份证号:");scanf("%s",&insertstu->id);printf(" 请输入家庭住址:");scanf("%s",insertstu->adress);printf(" 请输入手机号:");scanf("%ld",&insertstu->tel );count++;display(insertstu);}}else if(choice==0)break;elseprintf("无效选择,请重新输入!\n");}return head;}//学生信息保存int SaveStudent(struct student *head){struct student *p1;p1=head;if((fp=fopen("student.txt","w+"))==NULL){printf("文件打开失败!\n");exit(0);}fprintf(fp,"%d\n",count);fprintf(fp,"学号\t姓名\t性别\t身份证号\t家庭住址\t手机号\n");while(p1!=NULL){fprintf(fp,"%ld\t%s\t%s\t%s\t\t%s\t\t%ld\n", p1->num, p1->name,p1->sex,p1->id,p1->adress,p1->tel);p1=p1->next;}return 1;fclose(fp);}void freeAll(struct student *head){struct student *p1, *p2;p1=p2=head;while(p1){p2=p1->next;free(p1);p1=p2;}}struct student *LoadStudent(){struct student *head;struct student *p1, *p2;fp = fopen("student.txt", "r+");if (!fp){printf("文件打开错误!\n");exit(0);}fscanf(fp,"%d\n", &count);fscanf(fp, "学号\t姓名\t性别\t身份证号\t家庭住址\t手机号\n");head=p1=p2=(struct student *)malloc(sizeof(struct student));fscanf(fp,"%ld%s%s%s%s%ld\n", &p1->num, p1->name,p1->sex,&p1->id,p1->adress,&p1->tel); while(!feof(fp)){p1=(struct student *)malloc(sizeof(struct student));fscanf(fp,"%ld%s%s%s%s%ld\n", &p1->num, p1->name,p1->sex,&p1->id,p1->adress,&p1->tel); p2->next=p1;p2=p1;}p2->next = NULL;fclose(fp);return head;}//主菜单void menu(struct student *head){int n;while(1){int choice;printf(" |*****学生信息系统*****|\n");printf(" |**********************|\n");printf(" |【1】录入学生信息|\n");printf(" |【2】浏览学生信息|\n");printf(" |【3】查询学生信息|\n");printf(" |【4】删除学生信息|\n");printf(" |【5】修改学生信息|\n");printf(" |【6】插入学生信息|\n");printf(" |【0】退出系统|\n");printf(" |**********************|\n");printf(" 请输入你的选择:");scanf("%d",&choice);switch(choice){case 1:{if(head==NULL){head=input();}else{head=insert(head);}break;}case 2:{displayall(head);break;}case 3:{query(head);break;}head=del(head);break;}case 5:{change(head);break;}case 6:{head=insert(head);break;}case 0:{n=SaveStudent(head);freeAll(head);printf("信息已成功保存!\n");return;}default:printf("无效选项,请重新输入!\n");}}}//欢迎界面void welcome(){int choice;printf(" ************************\n"); printf(" * *\n");printf(" * 欢迎使用学生信息系统*\n"); printf(" * *\n");printf(" ************************\n"); printf(" * *\n");printf(" ************************\n"); printf(" |【1】继续|\n");printf(" |【0】退出|\n");printf(" |------------|\n");printf(" 请输入你的选择:");scanf("%d",&choice);system("cls");if(choice==1){if((fp=fopen("student.txt","r+"))==NULL){ menu(head);}head=LoadStudent();menu(head);}}else{return;}}//程序入口void main(){char userName[9];char userPWD[7];int i;for(i=0;i<3;i++){printf("\n\n\n\n\n\n\n");printf("\n请输入您的用户名:");scanf("%s", userName);printf("\n请输入您的密码:");scanf("%s", userPWD);if ((strcmp(userName,"123")==0) && (strcmp(userPWD,"123")==0)){ printf("用户名和密码输入正确!\n");system("cls");//用户名和密码正确,显示欢迎菜单welcome();break;}else{if(i<2){system("cls");//用户名或密码错误,提示用户重新输入printf("用户名或密码错误,请重新输入!");}else{system("cls");//连续3次输错用户名或密码,退出系统。
数据结构课程设计---成绩管理系统
![数据结构课程设计---成绩管理系统](https://img.taocdn.com/s3/m/3837878cdd88d0d233d46af0.png)
《数据结构》课程设计报告(成绩管理系统)目录一.需求分析 (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可选择不同的功能,其中又有更加具体的功能实现,选择后,按回车即可。
数据结构课程设计学生成绩管理系统
![数据结构课程设计学生成绩管理系统](https://img.taocdn.com/s3/m/f1cb3672a98271fe910ef9d9.png)
西北工业大学数据结构课程设计报告选题名称:学生成绩管理系统系(院):理学院专业:信息与计算科学目录一、需求分析 (2)1,系统需求 (2)2,开发环境 (3)二、概要设计 (3)三、详细设计 (4)●元素类型,结点类型和指针类型 (5)●主函数和其他函数的伪码算法 (6)●系统流程图 (7)四、调试分析 (8)五、用户手册 (9)六、测试结果 (10)七、参考文献: (11)一、需求分析1,系统需求(1)以单链表的结点p表示学生,其中p->num表示学号,p->name表示姓名,p->score表示分数,p->total表示总分.学生人数没有限制,由用户随意设定.该系统实现对若干个大学生的学习成绩进行管理.包括以下信息:学号、姓名、科目、成绩,总排名.(2)程序命令执行1.登记成绩2.查询成绩3.插入成绩4.删除成绩5.成绩排序6.输出所有学生成绩7.退出程序(3)输入输出的形式本系统是一个学生成绩管理系统,采用VC++6.0 编译器作为开发环境,这个环境是我们在学习C++的平台.输入数据类型主要是char、int、float等数据类型,输入内容包括:学号、姓名、复变函数成绩,数据机构成绩,实变函数成绩,常微分成绩,总分,排名.用户在输入学生数据时要保证输入数据格式的正确性,系统不会自动检测输入的数据是否正确,输出形式与输入形式类似,根据需要可以选择显示输入的各项内容,还可以选择显示计算好平均分后并排序后的记录,显示内容包括:学号、姓名、复变函数成绩,数据机构成绩,实变函数成绩,常微分成绩,总分.如图:3 2,开发环境Visual C++不仅仅是是一个C++编译器,而是一个基于Windows操作系统的可视化集成开发环境IDE,这种环境开发出来的软件稳定性好、可移植性强,可以编制各种各样的Windows应用程序.二、概要设计为实现上述程序功能,应以线性链表表示学生.为此,需要一个抽象数据类型:线性链表.1.线链表的抽象数据类型定义为:抽象数据类型线性表的定义如下:ADT List {数据对象:D={ ai | ai∈ ElemSet, i =1, 2, ……, n, n≥0 }数据关系:R1 = { < ai-1 , ai> | ai-1 ,ai∈ D, i =2, ……, n }基本操作:InitList (&L )操作结果:构造一个空的线性表L .DestoryList (&L)初始条件:线性表L已存在.操作结果:销毁线性表L.ClearList (&L)初始条件:线性表L已存在.操作结果:将L重置为空表.ListEmpty (L)初始条件:线性表L已存在.操作结果:若L 为空表,则返回TRUE,否则返回 FALSE.ListLength (L)初始条件:线性表L已存在.操作结果:返回L中数据元素个数.GetElem ( L, i, &e )初始条件:线性表L已存在,1≤i≤ListLength(L)+1.操作结果:用e返回L中第i个数据元素的值.LocateElem ( L,e, compare() )初始条件:线性表L已存在,compare()是判定函数.操作结果:返回L中第1个与e满足关系compare()的数据元素的位序.若这样的数据元素不存在,则返回值0.PriorElem ( L, cur_e, &pre_e )初始条件:线性表L已存在.操作结果:若cur_e是L的数据元素且不是第1个,则用pre_e返回它的前驱,否则操作失败.NextElem ( L, cur_e, &next_e )初始条件:线性表L已存在.操作结果:若cur_e是L的数据元素且不是最后一个,则用next_e返回它的后继,否则操作失败.ListInsert ( &L, i, e )初始条件:线性表L已存在,1≤i≤ListLength(L)+1.操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1.ListDelete( &L, i, &e )初始条件:线性表L已存在且非空,1≤i≤ListLength(L).操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1.ListTraverse ( L,visit())初始条件:线性表L已存在.操作结果:依次对L的每个数据元素调用函数 visit().一旦visit()失败,则操作失败.} ADT List2、本程序主要包含三个模块1)主程序模块:void main(){初始化;while(1){switch(命令){case 接受命令;处理命令;break;}}}2)单链表模块—实现单链表抽象类型3)学生成绩管理模块—实现学生成绩管理系统各模块之间的调用关系如下:主程序模块学生成绩管理模块单链表模块三、详细设计元素类型,结点类型和指针类型Typedef char ElemType ; //元素类型typedef struct Node{ElemType data;struct Node *next;}Node,*LinkList;ADT Node{//建立头结点Node* CreatHead(){Node *head;//Node *head,*tail;head=new Node;//建立链表头指针,记得释放!//tail=head;//临时变量,此处没有太多意义head->link=NULL;return head;}链表遍历查找,按照关键字查找Node*TravFind(Node*head,DataType key){Node*p=head->link;while(p!=NULL&&p->info!=key)p=p->link;return p;}结点p后插入一个信息域为X的新结点void InsertAfter(Node*p,DataType x){Node*q=new Node;q->info=x;q->link=p->link;p->link=q;}删除一结点后的结点,返回备用Node* RemoveAft_rt(Node*p){Node*q;q=p->link;//Or, if(p->link=NULL) q=NULL; else p->link=q->link;return q;//返回备用}删除一结点后的结点,不返回void RemoveAfter(Node*p){Node*q;q=p->link;p->link=q->link;if(q!=NULL){delete q;q=NULL;}}删除指定结点p,返回Node* RemoveCur_rt(Node*head,Node*p){Node*q=head;while(q->link!=NULL && q->link!=p) q=q->link;//遍历查找//if(q->link==tail) tail=q;//已经找到末尾return RemoveAft_rt(q);//删除q后面的结点p.若q==tail,返回NULL.}删除指定结点p,不返回void RemoveCur(Node*head,Node*p){Node*q=head;while(q->link!=NULL && q->link!=p) q=q->link;//遍历查找RemoveAfter(q);//删除q后面的结点p.若q==tail,返回NULL.}清空单链表,保留表头结点void MakeEmpty(Node* head){Node*p;while(head->link!=NULL){//未到尾节点p=head->link;head->link=p->link;//头结点后第一个结点从链中脱落delete p; p=NULL;//删除脱离下来的结点}}链表打印void PrintSLL(Node* head){Node* p=head->link;while(p!=NULL){cout<<p->info<<'\t';p=p->link;}cout<<endl;}}主函数和其他函数的伪码算法void main( ){//主函数Initialization();//初始化while (cmd=’q’&&cmd=’Q’){ReadCommand(cmd);//读入一个操作命令符Interpret(cmd);//解释执行操作命令符switch (cmd){case 1:p=create(p,n);break;case 2:find(p);break;case 3:insert(p);break;case 4:Delete(p);break;case 5:sort(p);break;case 6:output(p);break;case 0:exit(0);default:cout<<"选择错误,重新开始!"<<endl;}//switch}//while}void Initialization{//系统初始化在屏幕上显示操作命令清单:1.登记成绩,2.查询成绩;3.插入成绩,4.删除成绩,5.成绩排名;6.输出所有学生成绩,7.退出程序} //Initialization系统流程图四、 调试分析1、存在的不足本学生成绩管理系统由七大模块组成,每个模块相互联系又相互独立.这个学生成绩管理系统存在着很多不足之处,由于自己本身编程能力的问题,这个系统可以实现的功能非常有限.只能实现学生管理系统最基本的功能,可以进行简单的输入、输出学生资料,查询和修改学生信息,能直接从文件中读入数据,能对系统所作的修改、操作进行保存等.而且在每个模块也有不足的地方,比如在输入学生资料时,对每个信息项没有严格的规定,可以输入任何的字符.这有待以后努力,更详尽的实现模块的功能. 2、do-while 语句的位置问题在修改学生记录此模块中,若循环语句的位置不对那么这个循环就会自动跳出,或变为乱码,不能实现原有的功能.所以要想清楚到底是在哪安放,按照逻辑思路找到相应的语句正确添加就行了. 3、指针数组的使用就是在插入学生记录模块中,另一个指针数组的定义,之前做的时候没有注意到这点,结果所做的修改不能够保存到文件,之后操作的时候也没有显示所做修改的记录,之后找了资料看了之后才知道,是变量的问题,所以最后作了修改,加了一个另外的指针数组. 4、细节方面其实在有些细节方面还是要特别注意啊,比如分号的添加,<<与>>的方向问题,函数的主界面输入学生成绩输出学生成绩查询学生信息 插入学生成绩按排序删除学生信息退出本系统结束开始返回值等问题,虽然容易改掉,但是很容易养成不好的习惯,而且还会浪费时间,所以在一开始写的时候就要很仔细,这样才能保证程序编的精细,同时若出现很多这样的错误的话,在编写程序的时候也会心里烦的,所以在编程的时候要认真仔细.5、文件的写入与读出刚开始时对文件的操作不是很明白,一直不能很好的操作文件,直到最后验收的时候,仍旧出现了严重的问题,就是对已经存在的文件读取问题,通过"读取文件并输出学生信息",将数据从文件中读取,但是不能够正常的读出,最后把读文件的操作语句进行仔细检查后,发现语句的顺序有点问题,把fscanf()语句进行再修改后就能够正常的读取文件了.6、内存的分配问题对于初学者的话对内存的分配和释放问题是比较抽象的和模糊的问题,在排序是之前就出现了交换数据困难的问题,以及内存分配空间繁琐释放空间不及时的问题,造成空间的浪费,使得程序运行时效率较低,因此最后采用了顺序存储记录的方式,这就能改变前面所出现的问题.7、较小的问题方面其余的就没什么比较大的问题了,基本上只要细心一点的话就可以正确调试了.五、用户手册1.本程序的运行环境为DOS操作系统,执行文件为:GradeCheck.exe.2.进入演示程序后即可显示文本方式的用户界面:3.进入“登记成绩”的命令后,即提示输入学生的信息,包括各科成绩和学号姓名等;4.接受其他命令后即执行相应运算和显示相应结果.六、测试结果执行命令‘1’:出现如下图相继输入学生人数和其他信息,如下图:执行命令‘2’:得如下图执行命令‘3’:得结果为执行命令‘4’:删除学生成绩;执行命令‘5’:得成绩排序如下:执行命令‘6’:便会出现总成绩.七、参考文献:1.《数据结构C语言》严蔚敏清华大学出版社2.《c++语言程序设计》谭浩强清华大学出版社3.《数据结构》高教出版社4.《数据结构实验与实训教程》刘勇郭韶生张炜周雅丽国防工业出版社忽略此处..。
数据结构课程设计学生成绩管理系统
![数据结构课程设计学生成绩管理系统](https://img.taocdn.com/s3/m/0e7c182d910ef12d2bf9e7d7.png)
课程设计报告课程设计题目: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[],然后对结构体数组进行从大到小排序(选择排序)然后对结构体一一查找相应的信息。
学生成绩管理系统数据结构课程设计
![学生成绩管理系统数据结构课程设计](https://img.taocdn.com/s3/m/7f889d4b854769eae009581b6bd97f192279bff2.png)
学生成绩管理系统数据结构课程设计学生成绩管理系统是一个用于管理学生学习成绩的软件系统。
它通常用于学校、教育机构或教师们来跟踪和记录学生的学习进展,并生成报告和分析数据。
在数据结构课程设计中,学生成绩管理系统需要设计合适的数据结构来存储和操作学生成绩数据。
在设计学生成绩管理系统时,可以使用以下数据结构:1. 数组:可以使用数组来存储学生成绩数据。
每个学生的成绩可以用一个数组元素表示,可以将学生按照学号或者其他标识符按顺序存储在数组中。
这样可以方便地通过索引来访问和修改学生成绩。
2. 链表:链表是另一种常用的数据结构,可以用于存储学生成绩数据。
每个学生的成绩可以用一个节点表示,节点可以包含学生的信息和成绩,同时包含指向下一个节点的指针。
这样可以方便地插入、删除和查找学生成绩。
3. 树:树可以用于组织学生成绩数据。
可以使用二叉搜索树或平衡二叉树来存储学生成绩,其中学生的学号或者姓名可以作为关键字。
这样可以方便地进行查找、插入和删除操作,并可支持对学生成绩进行排序。
以上是一些常用的数据结构,用于存储学生成绩管理系统的数据。
在具体的设计中,还可以根据实际需求选择其他合适的数据结构。
除了数据结构,学生成绩管理系统还可能包括其他功能,例如:1. 添加学生:可以通过输入学生的基本信息和成绩,将学生添加到系统中。
2. 删除学生:可以通过学生的学号或其他标识符,从系统中删除某个学生的信息和成绩。
3. 修改成绩:可以根据学生的学号或其他标识符,修改学生的成绩信息。
4. 查询成绩:可以根据学号、姓名或其他条件,查询学生的成绩信息。
5. 成绩统计和分析:可以对学生的成绩进行统计和分析,生成报告和图表,帮助教师或学校了解学生的学习情况。
以上只是学生成绩管理系统可能包含的一些基本功能,具体的设计和实现还需要根据实际需求和要求进行进一步的扩展和深入分析。
通过合适的数据结构和功能设计,可以实现一个高效、易用和功能完善的学生成绩管理系统。
数据结构之学生成绩管理系统
![数据结构之学生成绩管理系统](https://img.taocdn.com/s3/m/94a2b322a36925c52cc58bd63186bceb19e8ed2c.png)
学生成绩管理系统一、试验目旳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. 实现环节首先, 分析题目规定划分实现模块, 定义基本数据类型, 诸如构造体、链表等;另一方面, 针对上述旳基本操作实现详细需要进行旳操作, 详细实现每个环节需要进行旳基本操作, 即详细编写每个小函数实现功能;最终, 编写主函数对每个实现进行按需调用, 实现操作。
数据结构课程设计 学生成绩管理系统
![数据结构课程设计 学生成绩管理系统](https://img.taocdn.com/s3/m/22a5943466ec102de2bd960590c69ec3d5bbdbaa.png)
任务书摘要管理信息系统正在向着网络化、智能化和集成化等趋势发展.学生成绩管理系统是为了更好的管理学生考试成绩而开发的数据管理软件。
它对于一个学校是不可缺少的重要部分,它的内容对于学校的决策者和管理者来说都至关重要.学生成绩管理管理系统为用户提供充足的信息和快捷的查询手段,实现学生基本信息、成绩的录入,删除,查询,维护以及成绩的统计分析等几方面的功能,是现实问题的迫切要求。
本系统开发的总体任务是实现学生成绩管理的系统化、规范化、自动化。
达到提高学生成绩管理效率的目的。
与传统管理方法相比有明显的优点:查找方便,可靠性高,保密性好,成本低。
彻底改变了以前繁杂的管理模式,实现全面的、相对集中的、职能化的信息综合管理.计算机被用到信息管理系统的环境正是适应了当今时代飞速发展的信息时代。
人们深刻的认识到了计算机功能的强大,对于复杂的信息管理,计算机充分发挥着它的优越性.检索迅速、查找方便、可靠性高、存储量大、保密性好、寿命长、成本低,这些优点极大地减轻了学院教学人员的工作量,缩小开支,提高了学生档案管理的效率和准确性,能够合理的安排时间,学生能够尽快的知道自己的考试成绩。
同时,学生管理系统的应用也为今天的教育在未来市场的竞争力有所提高.目录1.引言 (3)2.课题分析 (6)3.具体设计过程 .................................................................... 错误!未定义书签。
3.1设计思路 (6)3.2程序设计流程图 (7)3.3.函数实现说明 (7)4.程序运行结果 (13)5。
软件使用说明 (14)6。
结论 (14)参考文献 (16)附录:源代码 (16)1。
引言数据结构在计算机科学界至今没有标准的定义。
个人根据各自的理解的不同而有不同的表述方法:Sartaj Sahni在他的《数据结构、算法与应用》一书中称:“数据结构是数据对象,以及存在于该对象的实例和组成实例的数据元素之间的各种联系。
学生成绩管理系统数据结构课程设计
![学生成绩管理系统数据结构课程设计](https://img.taocdn.com/s3/m/47e4c70a3868011ca300a6c30c2259010302f35f.png)
学生成绩管理系统数据结构课程设计近年来,随着信息技术的快速发展,学生成绩管理系统在学校中得到了广泛应用。
学生成绩管理系统是一种基于数据结构的软件系统,旨在帮助学校更好地管理学生的学习成绩。
本文将介绍一个基于数据结构的学生成绩管理系统的设计。
首先,我们需要设计一个合适的数据结构来存储学生的学习成绩。
在这个系统中,我们可以使用一个二维数组来存储学生的成绩信息。
数组的行表示学生的学号,列表示不同科目的成绩。
这样,我们就可以方便地对学生成绩进行增删改查的操作。
接下来,我们需要设计一些基本的功能来实现学生成绩的管理。
首先是添加学生的成绩信息。
当学生入学时,管理员可以通过系统将学生的学号和成绩添加到数组中。
其次是删除学生的成绩信息。
当学生毕业或者转学时,管理员可以通过系统将学生的学号和成绩从数组中删除。
再次是修改学生的成绩信息。
当学生的成绩发生变化时,管理员可以通过系统修改学生的成绩。
最后是查询学生的成绩信息。
管理员可以通过系统查询学生的学号,然后系统会返回该学生的成绩信息。
除了基本的功能,我们还可以设计一些高级功能来提升学生成绩管理系统的实用性。
例如,我们可以设计一个成绩统计功能,用于统计学生的平均成绩、最高成绩和最低成绩。
这样,管理员可以更好地了解学生的学习情况。
另外,我们还可以设计一个成绩排名功能,用于按照成绩对学生进行排名。
这样,管理员可以更方便地找出成绩优秀的学生。
在实际应用中,我们还可以将学生成绩管理系统与其他系统进行集成。
例如,我们可以将学生成绩管理系统与学生信息管理系统进行集成,这样可以更方便地管理学生的学习情况。
另外,我们还可以将学生成绩管理系统与家长端进行集成,这样家长可以通过系统查看孩子的成绩情况,及时了解孩子的学习进展。
总之,学生成绩管理系统是一种基于数据结构的软件系统,可以帮助学校更好地管理学生的学习成绩。
通过合适的数据结构和功能设计,我们可以方便地对学生成绩进行增删改查的操作,并且可以提供一些高级功能来提升系统的实用性。
学生成绩管理系统数据结构课程设计
![学生成绩管理系统数据结构课程设计](https://img.taocdn.com/s3/m/289bdbe2ac51f01dc281e53a580216fc710a5369.png)
学生成绩管理系统数据结构课程设计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 添加学生信息通过输入学生的学号、姓名和专业信息,创建一个学生结构体,并将其插入学生信息存储数据结构中。
学生成绩管理系统数据结构课程设计报告
![学生成绩管理系统数据结构课程设计报告](https://img.taocdn.com/s3/m/75985950a9114431b90d6c85ec3a87c240288a8e.png)
学生成绩管理系统数据结构课程设计报告一、背景学生成绩管理系统是学校教务处常用的软件之一,旨在方便学校管理学生成绩信息。
数据结构是计算机科学中的基础课程,对于学生成绩管理系统的设计和实现有着重要意义。
本课程设计报告将针对学生成绩管理系统的数据结构设计展开讨论。
二、需求分析学生成绩管理系统需要存储学生的基本信息和成绩信息,可以进行成绩录入、查询、统计等操作。
系统需要能够高效地处理大量学生信息,并提供快速、准确的查询功能。
三、数据结构设计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. 成绩统计系统可以根据输入的条件,如班级、科目等进行成绩统计,计算平均成绩、最高分、最低分等统计信息。
五、总结本设计报告对学生成绩管理系统的数据结构设计进行了详细讨论,包括学生信息和成绩信息的存储方式、功能实现等方面。
数据结构与算法课程设计 学生成绩管理系统
![数据结构与算法课程设计 学生成绩管理系统](https://img.taocdn.com/s3/m/e6bcc139cd1755270722192e453610661ed95a2e.png)
数据结构与算法课程设计学生成绩管理系统学生成绩管理系统是一种用于管理学生的课程成绩和相关信息的软件系统。
该系统旨在帮助学校、教师和学生更好地管理和了解学生的学术表现。
下面是一个标准格式的文本,详细描述了学生成绩管理系统的功能和特点。
一、系统概述学生成绩管理系统是基于数据结构与算法课程设计的一个软件系统。
该系统通过使用合适的数据结构和算法,实现了对学生课程成绩的管理和统计分析。
系统具有用户友好的界面和丰富的功能,能够满足学校、教师和学生的需求。
二、系统功能1. 学生信息管理:系统可以记录学生的基本信息,包括学号、姓名、性别、年级等。
教师和管理员可以通过系统添加、修改和删除学生信息。
2. 课程管理:系统可以管理学校开设的各门课程,包括课程名称、授课教师、学分等信息。
教师和管理员可以在系统中添加、修改和删除课程信息。
3. 成绩录入:教师可以通过系统录入学生的课程成绩。
系统会自动计算每门课程的平均成绩和总评成绩,并将成绩与学生的个人信息进行关联。
4. 成绩查询:学生和教师可以通过系统查询学生的课程成绩。
学生可以查看自己的成绩,教师可以查看所教授课程的学生成绩。
查询结果可以按照学生、课程、成绩等进行排序和筛选。
5. 统计分析:系统可以对学生的课程成绩进行统计分析。
教师和管理员可以查看学生的平均成绩、最高成绩、最低成绩等统计信息,并生成相应的报表。
6. 数据备份与恢复:系统支持对学生信息和成绩数据进行备份和恢复。
管理员可以定期备份数据,以防止数据丢失或损坏。
7. 用户权限管理:系统具有不同的用户角色,包括学生、教师和管理员。
每个用户角色有不同的权限,保证了系统的安全性和数据的保密性。
三、系统特点1. 高效性:系统使用了合适的数据结构和算法,能够快速处理大量的学生信息和成绩数据,提高了系统的响应速度和处理效率。
2. 可扩展性:系统具有良好的可扩展性,可以根据实际需求进行功能的扩展和定制。
例如,可以添加更多的统计分析功能,或者与其他系统进行集成。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2015-2016学年第一学期《数据结构程序设计》课程设计报告题目:学分管理系统专业:计算机科学与技术班级:14级(2)班姓名:欣指导教师:广宏成绩:计算机学院2015年12月1日目录1 需求分析 (2)2 总体设计 (3)3 详细设计 (4)4 小结 (10)致 (10)参考文献 (10)源代码 (11)1 需求分析学生学分管理系统是运行于计算机系统下的应用软件,主要用于对学生的学号、姓名以及各项学科学分进行录入、删除、修改、查询、排序、统计、存盘等操作,为学校的教师和学生提供了一个对学生学分进行管理和查看的平台,给用户提供了一个简单友好的用户接口,主要任务如下:1.1查看所有学生信息根据菜单提示,选择该功能,能够逐条显示全部学生学分记录1.2输入学生记录用户根据菜单提示选择输入学生记录选项,进行有关学生的学号、姓名、班级、基础课学分、专业课学分、选修课学分、人文类课学分以及实验课学分的录入。
可一次性输入多条学生的学分信息记录。
1.3删除学生记录根据提示,用户输入要进行删除学生的学号,如果在不存在该学号,则显示没有找到该学生;如果在文件中有该学号的信息存在,则将该学号所对应的姓名、学号、班级、各科学分等在对应文件中加以删除。
1.4修改学生记录根据提示,用户输入要进行修改学分记录的学生的学号,如果在文件中不存在该学号,则显示没有找到该学生;如果在文件中有该学生的信息存在,则将提示用户选择要修改的某课程,当用户选择某课程的代码后,则将显示你所要修改的课程。
然后提示用户选择是否继续进行修改操作。
1.5查询学生信息查询学生信息,分为根据学号查询和根据班级查询两个具体需求,菜单选项分别提示用户输入要查询学生信息的学号或班级,如果在磁盘文件中有对应的输入信息,则提示用户已找到,并逐项列出对应查找到的学生学分状况。
1.6根据学号排序学生记录该项功能根据学生的学号项进行排序,以便用户对学生学分状况有较为直观便的了解,并能够让学号有规律排列的学生项,在显示时集中出现,让浏览者更加清楚明白。
1.7统计学生学分完成情况该项是统计各班学生的学分完成情况,可以很便了解该班学生的学习水平。
2 总体设计进行总体设计,以比较抽象的式概括的确定系统如完成预定的任务,进而确定组成系统的每个子程序的结构,从而将一个大的程序按功能分割成一些模块,是每个模块具有功能单一、结构清晰、接口简单易于理解的小程序,并且确定各个函数之间的调用关系。
本系统主要应用结构化的设计思想,实现学生学分的输入、删除、修改、查询以及浏览等管理功能,各主要模块的数据均存储在文件中,因此包含对文件的读、写等基本操作。
在软件开发过程中应用了高级语言程序设计中的基本控制结构,如选择、循环、顺序等结构。
系统的设计法是结构化设计法,采用C语言进行开发。
系统功能结构图,如图1所示。
图1 系统结构图3 详细设计本系统采用主函数调用子函数的设计法,先整体在逐步细化的过程,具体法如下:在主函数前,进行子函数声明,如下:void menu();//菜单函数void to_menu();//返回菜单函数void view_data();//查看所有学生信息void save_data();//保存数据void add_data();//输入学生数据void read_data();//读取数据void delete_data();//删除数据void edit_data();//修改数据void query_data_no();//查找(按学号)void query_data_clas();//查找(按班级)void sort_data_no();//排序(学号)void tongji();//统计某班学生学分完成情况3.1主函数设计编写主函数,主函数运行时,先调用void read_data()函数,将数据从文件读取到结构体数组中,再调用菜单函数void menu(),显示菜单选择项,设计一个while循环,让函数进入循环,设计switch函数,对菜单各项功能进行选择,使各项功能能够运行,最后退出循环,调用to_menu()函数,返回主菜单main(){int fun;read_data();menu();while(1){printf("请输入功能号[0-8]:",&fun);scanf("%d",&fun);switch(fun){case 0: break; // 退出case 1: view_data();break; // 查看所有学生信息case 2: add_data(); break; // 输入学生记录case 3: delete_data();break; // 删除学生记录case 4:edit_data();break; // 修改学生记录case 5: query_data_no();break; // 查询(学号)case 6:query_data_clas();break; // 查询(班级)case 7:sort_data_no(); break; // 排序(学号)case 8:tongji();break; //统计某班学生学分完成情况default:printf("输入错误!");break;}if(fun==0) break;to_menu();}}3.2子函数设计3.2.1菜单函数设计菜单函数首先运行库函数system("cls")进行清屏,然后运行各个printf语句,显示主菜单,如图2所示。
图2 系统主菜单3.2.2返回主菜单函数设计设计字符c1,c2,用c1来接受第一次输入的回车,然后再次输入回车时,调用函数menu(),返回主菜单,来实现各次操作完成后返回主菜单的任务。
3.2.3查看所有学生信息函数设计设计for循环,定义i=0,学生总数为dd.count,利用for循环,可以显示所有学生已经记录的信息。
如图3所示:图3 查看所有学生信息3.2.4数据从结构体数组保存到文件的函数设计创建文件data.txt,利用for循环,把数据逐个写入文件。
3.2.5输入学生记录函数设计根据printf语句提示,逐个输入学号、姓名、班级,调用库函数strcpy(),把各个输入项,拷贝到数组中,再对各项分数进行赋值,如果大于最大值,则显示最大值,设计成循环模式,末尾提示是否继续添加数据,利用break终止循环,最后存盘,退出程序,显示主菜单。
输入学号为106的学生信息后如图4所示。
图4 输入学生信息3.2.6删除学生记录函数设计设计for循环以及库函数strcmp(),把输入的学号,跟已有的学号进行对比,如果没有相同的学号,则提示没有找到该学生,如果找到相同的学号,则把该学号以后的数据向前移动一位,再把学生总数减一,实现删除学生。
删除过程如下图5和图6所示。
图5 输入要删除的学生图6 删除后显示3.2.7修改学生记录函数设计根据printf语句提示,输入要修改的学生的学号,设计for循环和库函数strcmp,对输入学号进行查找,如果没有查找到,显示没有找到该学生,如果能够查找到给学生,则进一步提示输入学生的姓名、班级,然后选择要修改的学生记录项,最后提示,是否继续录入,退出后可返回主菜单。
修改过程如下图7和图8所示。
图7 编辑学生信息窗口图8 修改学生信息完成3.2.8查询学生记录函数设计查询学生记录分为,根据学生学号查询和根据班级查询该班所有学生的成绩,设计for循环和调用ctrcmp()函数,把要查询的结果进行显示,如果没有找到与输入匹配的字符,则显示没有找到该班级或没有找到该学生。
查询显示如下图,根据学号查询如图9所示,根据班级查询如图10所示。
图9 根据学号查询学生信息图10 根据班级查询学生信息3.2.9排序函数设计设计while循环,用for循环和库函数strcmp将学号依次比较,然后用冒泡排序法将学号数据由小到大排列,并且各数据交换,完成排序。
排序结果如下图11所示。
图11 根据学号排序结果3.2.10统计函数设计输入要统计的班级号,调用strcmp函数,查找相同班级号的学生数据,再设计for循环并调用strcmp函数,把差找出的学生数据,与要求完成的学分标准进行对比,统计出符合要求和不符合要求的学生个数,最后显示。
统计结果如下图12所示。
图12 根据班级统计结果4 总结本系统可以完成学生学分的录入、查询、修改、删除、排序以及班级总体水平的统计功能,但是对于系统的访问权限设置,访问途径(网络访问还是单机使用)等功能,还没有提出解决的案,在这些问题上还有待于对系统的进一步开发完善。
学分管理系统是介于学生管理者和学生之间的一个数据库平台,他让数据管理者可以便的录入修改学生成绩,在管理过程中可以节省时间,增加工作效率,假如学生可以通过网络来进行查询,就可以避免学分改动而引发的矛盾,同时也可以给学生带来便,因此在访问途径上可以设置为单机服务器管理,网络访问的数据库模式,来为学生和学校之间提供一个信息查询的平台。
本系统的开发过程,主要利用了for循环、switch循环、库函数strcmp与strcpy等,在排序函数设计时,略显繁琐,有待于使用者在使用时,提出宝贵的意见和建议。
通过对本程序的开发,让我了解到一个完整系统的开发过程,将一个大的工程问题可以细化到各个模块,让每个模块可以独立去完成各自的功能,最后用函数之间的调用来解决程序开发的全部问题,让我在以后开发程序的道路上更加拥有信心。
致在这次数据结构课程设计中,我的老师和同学给了我及大的帮助。
特别是我的指导老师广宏老师,还有我的小组组长晶的耐心帮助,在此,我对他们表示感!感他们在我面对困难时给了我帮助和支持。
也感那些给我帮助的所有同学!参考文献[1] 启兰.库存管理[M].北京:高等教育出版社,2005[2] 谭浩强,基温.C语言程序设计教程(第3版)[M].北京:高等教育出版社,2006[3] 黄明、梁旭、万洪莉.C语言课程设计[M].北京:电子工业出版社,2006[4] 郭宁,小玲.管理信息系统[M].北京:人民邮电出版社,2006[5] 池龙,林,伟.实用软件工程[M].北京:电子工业出版社,2006源代码#include <stdio.h>#include <io.h>#include <stdlib.h>#include <string.h>#define MAX 60struct student{char no[10]; // 学号char name[50]; // 姓名char clas[5]; // 班级int score[5]; // 学分};struct data{int count; // 当前学生数组中学生的个数struct student stu[MAX]; // 学生数组} dd;//子函数声明void menu();//菜单函数void to_menu();//返回菜单函数void view_data();//查看所有学生信息void save_data();//保存数据void add_data();//输入学生数据void read_data();//读取数据void delete_data();//删除数据void edit_data();//修改数据void query_data_no();//查找(按学号)void query_data_clas();//查找(按班级)void sort_data_no();//排序(学号)void tongji();//统计某班学生学分完成情况// 主函数main(){int fun;read_data();menu();while(1){printf("请输入功能号[0-8]:",&fun); scanf("%d",&fun);switch(fun){case 0: break; // 退出case 1: view_data();break; // 查看所有学生信息case 2: add_data(); break; // 输入学生记录case 3: delete_data();break; // 删除学生记录case 4:edit_data();break; // 修改学生记录case 5: query_data_no();break; // 查询(学号)case 6:query_data_clas();break; // 查询(班级)case 7:sort_data_no(); break; // 排序(学号)case 8:tongji();break; //统计某班学生学分完成情况default:printf("输入错误!");break;}if(fun==0) break;to_menu();}}void menu()/*显示主菜单*/{system("cls");//清屏printf("\n");printf("\t\t★☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆★\n"); printf("\t\t☆☆\n");printf("\t\t☆★☆学分管理系统☆★☆\n"); printf("\t\t☆☆\n"); printf("\t\t☆[0] 退出[1] 查看所有学生信息☆\n"); printf("\t\t☆☆\n"); printf("\t\t☆[2] 输入学生记录[3] 删除学生记录☆\n"); printf("\t\t☆☆\n"); printf("\t\t☆[4] 修改学生记录[5] 查询(学号)☆\n"); printf("\t\t☆☆\n"); printf("\t\t☆[6] 查询(班级)[7] 排序(学号)☆\n"); printf("\t\t☆☆\n"); printf("\t\t☆[8]统计某班学生学分完成情况☆\n"); printf("\t\t☆☆\n"); printf("\t\t★☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆★\n\n"); }void to_menu()// 等待用户按回车后回到主菜单{char c1,c2;printf("\n\n\n按回车键返回主菜单...");scanf("%c%c",&c1,&c2);//第一个字符吸收上次的确认回车键menu();}void view_data()// 查看所有学生信息{int i;printf("学号\t姓名\t 班级\t 基础课\t 专业课选修课人文类课实验课\n"); printf("\n-------------------------------------------------------------------\n");for(i=0;i<dd.count;i++)printf("%s\t %s\t %s\t %d\t %d\t %d\t %d\t %d\n",dd.stu[i].no,dd. stu[i].name,dd.stu[i].clas,dd.stu[i].score[0],dd.stu[i].score[1],dd.stu[i].score[2],d d.stu[i].score[3],dd.stu[i].score[4]);}void save_data()// 将数据从结构体数组保存到文件中{FILE *fp;//文件指针int i,k;k=dd.count;fp=fopen("dada.txt","w");//文件存储位置:当前文件夹fwrite(&k,sizeof(int),1,fp);for(i=0;i<k;i++)fwrite(&dd.stu[i],sizeof(struct student),1,fp);fclose(fp);}void add_data()// 输入学生记录{struct student st;int b;int a;int k;while(1){printf("\n请输入学生信息:");printf("\n学号\t姓名\t班级");printf("\n---------------------------------------------------------------\n"); scanf("%s%s%s",st.no,,st.clas);k = dd.count;strcpy(dd.stu[k].no,st.no);strcpy(dd.stu[k].name,);strcpy(dd.stu[k].clas,st.clas);printf("\n请输入基础课学分(0-50):"); scanf("%d",&a);if(a>50) dd.stu[k].score[0]=50;else dd.stu[k].score[0]=a;printf("\n请输入专业课学分(0-50):"); scanf("%d",&a);if(a>50) dd.stu[k].score[1]=50;else dd.stu[k].score[1]=a;printf("\n请输入选修课学分(0-24):"); scanf("%d",&a);if(a>24) dd.stu[k].score[2]=24;else dd.stu[k].score[2]=a;printf("\n请输入人文课学分(0-8):"); scanf("%d",&a);if(a>8) dd.stu[k].score[3]=8;else dd.stu[k].score[3]=a;;printf("\n请输入实验课学分(0-20):"); scanf("%d",&a);if(a>20) dd.stu[k].score[4]=20;else dd.stu[k].score[4]=a;dd.count++;printf("\n\n继续添加学生信息[1-yes 0-no]:");scanf("%d",&b);if(b==0) break;}save_data();}void read_data()// 将数据从文件读到结构体数组中{FILE *fp;int i,k;struct student st;k=0;if(access("dada.txt",0)==-1) // 如果文件不存在{fp=fopen("dada.txt","w");fwrite(&k,sizeof(int),1,fp);fclose(fp);}fp=fopen("dada.txt","r");fread(&k,sizeof(int),1,fp);dd.count=k;for(i=0;i<k;i++){fread(&st,sizeof(struct student),1,fp);strcpy(dd.stu[i].no,st.no);strcpy(dd.stu[i].name,);strcpy(dd.stu[i].clas,st.clas);dd.stu[i].score[4]=st.score[4];dd.stu[i].score[3]=st.score[3];dd.stu[i].score[2]=st.score[2];dd.stu[i].score[1]=st.score[1];dd.stu[i].score[0]=st.score[0];}fclose(fp);}void delete_data()// 删除学生记录{int i,k,j;char no[10];printf("\n请输入要删除学生的学号:"); scanf("%s",no);k=-1;for(i=0;i<dd.count;i++){if(strcmp(dd.stu[i].no,no)==0){k=i;break;}}if(k==-1){printf("\n\n没有找到该学生(学号-%s)!",no);}else{for(j=k;j<dd.count-1;j++){dd.stu[j]=dd.stu[j+1];}save_data();printf("\n\n删除学生(学号-%s)记录成功!",no);dd.count--;}}void edit_data()// 修改学生记录{struct student st;int i,k,a,b,select;char no[10];printf("\n请输入要编辑学生的学号:");scanf("%s",no);k=-1;for(i=0;i<dd.count;i++){if(strcmp(dd.stu[i].no,no)==0){k=i;break;}}if(k==-1){printf("\n\n没有找到该学生(学号-%s)!",no); }else{printf("\n姓名\t班级\n");printf("\n----------------------------------\n");scanf("%s%s",,st.clas);strcpy(dd.stu[k].name,);strcpy(dd.stu[k].clas,st.clas);printf("1基础课***2专业课***3选修课***4人文类课***5实验课"); printf("请选择你要修改的课程");scanf("%d",&select);switch(select){case 1:printf("\n请输入基础课学分(0-50):"); scanf("%d",&a);if(a>50) dd.stu[k].score[0]=50;else dd.stu[k].score[0]=a;break;case 2:printf("\n请输入专业课学分(0-50):"); scanf("%d",&a);if(a>50) dd.stu[k].score[1]=50;else dd.stu[k].score[1]=a;break;case 3:printf("\n请输入选修课学分(0-24):"); scanf("%d",&a);if(a>24) dd.stu[k].score[2]=24;else dd.stu[k].score[2]=a;break;case 4:printf("\n请输入人文课学分(0-8):"); scanf("%d",&a);if(a>8) dd.stu[k].score[3]=8;else dd.stu[k].score[3]=a;break;case 5:printf("\n请输入实验课学分(0-20):"); scanf("%d",&a);if(a>20) dd.stu[k].score[4]=20;else dd.stu[k].score[4]=a;break;}printf("\n\n继续修改学生信息[1-yes 0-no]:");scanf("%d",&b);if(b==1)edit_data();elsesave_data();printf("\n\n编辑学生记录(学号-%s)成功!",no); }}void query_data_no()// 查询(学号){int i,k;char no[10];printf("\n请输入要查询学生的学号:");scanf("%s",no);k=-1;for(i=0;i<dd.count;i++){if(strcmp(dd.stu[i].no,no)==0){if(k==-1){printf("\n\n学号\t姓名\t班级\t基础课\t专业课\t选修课\t人文类课\t实验课");printf("\n-----------------------------------------------------------------\n");}k=i;printf("%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d\n",dd.stu[i].no,dd.stu[i].name,dd .stu[i].clas,dd.stu[i].score[0],dd.stu[i].score[1],dd.stu[i].score[2],dd.stu[i].score[3 ],dd.stu[i].score[4]);}}if(k==-1){printf("\n\n没有找到该学生(学号-%s)!",no);}}void query_data_clas()// 查询(班级){int i,k;char clas[10];printf("\n请输入要查询学生的班级:");scanf("%s",clas);k=-1;for(i=0;i<dd.count;i++){if(strcmp(dd.stu[i].clas,clas)==0){if(k==-1){printf("\n\n学号\t姓名\t班级\t基础课\t专业课\t选修课\t人文类课\t实验课");printf("\n-----------------------------------------------------------------\n");}k=i;printf("%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d\n",dd.stu[i].no,dd.stu[i].name,dd .stu[i].clas,dd.stu[i].score[0],dd.stu[i].score[1],dd.stu[i].score[2],dd.stu[i].score[3 ],dd.stu[i].score[4]);}}if(k==-1){printf("\n\n没有找到该班级-%s!",clas);}void sort_data_no()// 排序(学号){int i,k;struct student tmp;k=dd.count-1;while(k>0){for(i=0;i<k;i++){if(strcmp(dd.stu[i].no,dd.stu[i+1].no)>0)//最大的放末尾{strcpy(tmp.no,dd.stu[i].no);strcpy(,dd.stu[i].name);strcpy(tmp.clas,dd.stu[i].clas);tmp.score[4]=dd.stu[i].score[4];tmp.score[3]=dd.stu[i].score[3];tmp.score[2]=dd.stu[i].score[2];tmp.score[1]=dd.stu[i].score[1];tmp.score[0]=dd.stu[i].score[0];strcpy(dd.stu[i].no,dd.stu[i+1].no); strcpy(dd.stu[i].name,dd.stu[i+1].name); strcpy(dd.stu[i].clas,dd.stu[i+1].clas); dd.stu[i].score[4]=dd.stu[i+1].score[4]; dd.stu[i].score[3]=dd.stu[i+1].score[3]; dd.stu[i].score[2]=dd.stu[i+1].score[2]; dd.stu[i].score[1]=dd.stu[i+1].score[1]; dd.stu[i].score[0]=dd.stu[i+1].score[0];strcpy(dd.stu[i+1].no,tmp.no);strcpy(dd.stu[i+1].name,); strcpy(dd.stu[i+1].clas,tmp.clas);dd.stu[i+1].score[4]=tmp.score[4];dd.stu[i+1].score[3]=tmp.score[3];dd.stu[i+1].score[2]=tmp.score[2];dd.stu[i+1].score[1]=tmp.score[1];dd.stu[i+1].score[0]=tmp.score[0];}}k--;}save_data();printf("\n\n排序成功!");}void tongji() /*统计某班学生学分完成情况*/{ char clas[5]; int i,j=0,k=0;printf("\n请输入要统计的班级:");scanf("%s",clas);for(i=0;i<dd.count;i++){ if(strcmp(clas,dd.stu[i].clas)==0)j++;}for(i=0;i<dd.count;i++){ if(strcmp(clas,dd.stu[i].clas)==0&&dd.stu[i].score[0]>=50&&dd.stu[i].score[1]>=50&&dd.stu[i].score[2]>=24&&dd.stu[i].score[3]>=8&&dd.stu[i].score[4]>=20)k++; }printf("\n %s 班中有%d 个学生完成学分!!!\n有%d 个学生未完成!!!!",clas,k,j-k);scanf("%*c"); /*******用于吸收上面所按下的字符************/ printf("\n\n按回车键回主菜单!");getchar();menu();}。