1、数据结构之学生成绩管理系统设计学生成绩管理系统一、 实验目的1. 通过此次课程设计中学生成绩管理系统的题目,掌握链表等数据结构的基本操作方面的知识,并能灵活的解决一些基本的问题,加深对其性质及各项操作的理解;2. 将所学数据结构方面的知识与一门具体的语言C语言来进行实现,感受数据结构的强大作用,加深理解。二、 试验要求管理系统中有五个要求:输入 查找 修改 插入 删除 存储(1) 输入要求:能够通过键盘输入和文件输入两种(2) 查找要求:能够根据学生号查找单个学生的信息,也可以遍历所有学生信息(3) 修改要求:能够根据学生号修改单个学生所有信息(4) 插入要求:能够实现头插和尾插(5) 删除要
2、求:能够根据学生号删除单个学生信息(6) 存储要求:通过链表存储所有信息三、 算法的思想与算法实现步骤1. 基本思想 通过链表数据类型进行基本操作,主要有三个模块:分别是主函数模块、主要操作函数及基本操作函数。其中,主函数负责其他子函数的调用实现以及基本界面的操作主要函数包括:void StuInput(Student *); /学生成绩管理系统的输入函数,由主函数调用void StuSelect(Student *); /学生成绩管理系统的查找函数,由主函数调用void StuAlter(Student *); /学生成绩管理系统的修改函数,由主函数调用void StuInsert(Stud
3、ent *); /学生成绩管理系统的插入函数,由主函数调用void StuDelect(Student *); /学生成绩管理系统的删除函数,由主函数调用void StuSave(Student *); /学生成绩管理系统的存储函数,由主函数调用基本操作函数:void StuOutput(Student *p); /输出函数int StuImport(Student *head,Student *p); /输入函数void StuInputHand(Student *head); /学生成绩管理系统的手动输入函数,由输入函数调用void StuInputFile(Student *head);
4、 /学生成绩管理系统的文件输入函数,由输入函数调用void StuSelectErg(Student *head); /学生成绩管理系统的遍历函数,由查找函数调用 void StuSelectNumFind(Student *head); /学生成绩管理系统的按学号查找函数,由查找函数调用void StuSelectSubFind(Student *head); /学生成绩管理系统的按科目查找函数,由查找函数调用2. 实现步骤首先,分析题目要求划分实现模块,定义基本数据类型,诸如结构体、链表等;其次,针对上述的基本操作实现具体需要进行的操作,具体实现每个环节需要进行的基本操作,即具体编写每个小
5、函数实现功能;最后,编写主函数对每个实现进行按需调用,实现操作。3.流程图四代码:#include#include#includestruct Student char name10; char subject10; int num; int grade; Student *next;void StuMain(); /学生成绩管理系统的主函数,由main函数调用void StuInput(Student *); /学生成绩管理系统的输入函数,由主函数调用void StuSelect(Student *); /学生成绩管理系统的查找函数,由主函数调用void StuAlter(Student *
6、); /学生成绩管理系统的修改函数,由主函数调用void StuInsert(Student *); /学生成绩管理系统的插入函数,由主函数调用void StuDelect(Student *); /学生成绩管理系统的删除函数,由主函数调用void StuSave(Student *); /学生成绩管理系统的存储函数,由主函数调用void StuOutput(Student *p); /输出函数int StuImport(Student *head,Student *p); /输入函数void StuOutput(Student *p) /打印函数,将链表的该节点信息输出 printf(学生姓
7、名:); printf(%s ,p-name); printf(学生号:); printf(%d ,p-num); printf(科目: ); printf(%s ,p-subject); printf(学生成绩:); printf(%d n,p-grade);int StuImport(Student *head,Student *p) Student *Opinion=(Student *)malloc(sizeof(Student); /用来判断输入节点中学生号是否有重复 Opinion=head-next; printf(学生姓名:n); scanf(%s,p-name); print
8、f(学生号:n); scanf(%d,&p-num); printf(科目:n); scanf(%s,p-subject); if(Opinion!=NULL) if(Opinion-num=p-num&!strcmp(Opinion-subject,p-subject) printf(该学生这门科目已有成绩,请重新输入n); return 1; Opinion=Opinion-next; printf(学生成绩:n); scanf(%d,&p-grade); return 0;void main() StuMain();void StuMain() char decide=y; /定义whi
9、le变量,函数是否继续进行 int num=1; /定义switch变量,函数跳转到哪个子函数 Student *head; /定义链表的头指针 head=(Student *)malloc(sizeof(Student); /给头指针开辟空间 head-next=NULL; /初始化头指针 while(decide!=n) printf( *n); printf( * 1 输入 2 查找 3 修改 4 插入 *n); printf( * 5 删除 6 存储 7 退出 *n); printf( *n); scanf(%d,&num); switch(num) case 1: StuInput(
10、head); break; case 2: StuSelect(head); break; case 3: StuAlter(head); break; case 4: StuInsert(head); break; case 5: StuDelect(head); break; case 6: StuSave(head); break; default: decide=n; break; ;void StuInputHand(Student *head); /学生成绩管理系统的手动输入函数,由输入函数调用void StuInputFile(Student *head); /学生成绩管理系统的
11、文件输入函数,由输入函数调用void StuInput(Student *head) /学生成绩管理系统的输入函数,由主函数调用 char decide=y; /定义while变量,函数是否继续进行 int num; /定义switch变量,函数跳转到哪个子函数 while(decide!=n) printf( *n); printf( * 1 手动输入 2 文件输入 3 退出 *n); printf( *n); scanf(%d,&num); switch(num) case 1: StuInputHand(head); break; case 2: StuInputFile(head);
12、default: decide=n; break; void StuInputHand(Student *head) /学生成绩管理系统的手动输入函数,由输入函数调用 if(head-next=NULL) Student *point=(Student *)malloc(sizeof(Student); /链表中最后一个节点,只在该函数中存在 point-next=NULL; int decide=1; while(decide!=0) Student *p=(Student *)malloc(sizeof(Student); p-next=NULL; StuImport(head,p); i
13、f(head-next=NULL) head-next=p; point=p; else point-next=p; point=p; printf(是否继续:1/0n); scanf(%d,&decide); else printf(管理系统中已存在信息,若想输入学生信息,请转插入子系统);void StuInputFile(Student *head) /学生成绩管理系统的文件输入函数,由输入函数调用 if(head-next!=NULL) printf(学生管理系统中已有信息,请跳转到插入选项n); return ; FILE *fp; printf(请输入文件名(包括物理地址)n);
14、char filename10; scanf(%s,filename); if(fp=fopen(filename,r)=NULL) printf(can not open filen); return; Student *point=(Student *)malloc(sizeof(Student); Student *Opinion=(Student *)malloc(sizeof(Student); /用来判断输入节点中学生号是否有重复 while(!feof(fp) Opinion=head-next; Student *p=(Student *)malloc(sizeof(Stude
15、nt); p-next=NULL; fread(p,sizeof(Student),1,fp); if(Opinion!=NULL) if(Opinion-num=p-num&!strcmp(Opinion-subject,p-subject) printf(该文件中有重复学生信息,请验明再传输n); head-next=NULL; return ; Opinion=Opinion-next; if(head-next=NULL) head-next=p; point=p; else point-next=p; point=p; ; Opinion=head-next; while(Opini
16、on-next!=NULL) Opinion=Opinion-next; if(Opinion-next-next=NULL) Opinion-next=NULL; ; fclose(fp); printf(传输成功n);void StuSelectErg(Student *head); /学生成绩管理系统的遍历函数,由查找函数调用 void StuSelectNumFind(Student *head); /学生成绩管理系统的按学号查找函数,由查找函数调用void StuSelectSubFind(Student *head); /学生成绩管理系统的按科目查找函数,由查找函数调用void S
17、tuSelect(Student *head) /学生成绩管理系统的查找函数,由主函数调用 char decide=y; /定义while变量,函数是否继续进行 int num; /定义switch变量,函数跳转到哪个子函数 while(decide!=n) printf( *n); printf( * 1 遍历 2 学号查找 3 科目查找 4 退出 *n); printf( *n); scanf(%d,&num); switch(num) case 1: StuSelectErg(head); break; case 2: StuSelectNumFind(head); break; cas
18、e 3: StuSelectSubFind(head); break; default: decide=n; break; void StuSelectErg(Student *head) /学生成绩管理系统的遍历函数,由查找函数调用 Student *p=(Student *)malloc(sizeof(Student); p=head-next; int i=1; while(p!=NULL) printf(第%d位学生信息:n,i); StuOutput(p); p=p-next; i+; void StuSelectNumFind(Student *head) /学生成绩管理系统的查找
19、子系统,有查找函数调用 int num; printf(输入想要查找学生的学生号:n); scanf(%d,&num); Student *p=(Student *)malloc(sizeof(Student); p=head-next; int i=1; while(p!=NULL) if(num=p-num) StuOutput(p); i+; p=p-next; if(i=1) printf(没有该学生信息);void StuSelectSubFind(Student *head) /学生成绩管理系统的按科目查找函数,由查找函数调用 char Sub10; printf(输入想要查找科目
20、:n); scanf(%s,Sub); Student *p=(Student *)malloc(sizeof(Student); p=head-next; int i=1; while(p!=NULL) if(!strcmp(Sub,p-subject) StuOutput(p); i+; p=p-next; if(i=1) printf(没有该学生信息);void StuAlter(Student *head) /学生成绩管理系统的修改函数,由主函数调用 int num; printf(输入想要查找学生的学生号:n); scanf(%d,&num); char Sub10; printf(
21、输入想要查找科目:n); scanf(%s,Sub); Student *p=(Student *)malloc(sizeof(Student); p=head-next; int i=1; while(p!=NULL) if(num=p-num&!strcmp(Sub,p-subject) printf(输入修改成绩:n); scanf(%d,&p-grade); printf(修改成功n); i+; p=p-next; if(i=1) printf(没有该学生信息); void StuInsert(Student *head) /学生成绩管理系统的插入函数,由主函数调用 Student *
22、point=(Student *)malloc(sizeof(Student); point=head-next; while(point-next!=NULL) point=point-next; /找到尾结点 char decide=y; /定义while变量,函数是否继续进行 int num; /定义switch变量,函数跳转到哪个子函数 while(decide!=n) printf( *n); printf( * 1 头插 2 尾插 3 退出 *n); printf( *n); scanf(%d,&num); Student *p=(Student *)malloc(sizeof(S
23、tudent); switch(num) case 1: StuImport(head,p); p-next=head-next; head-next=p; printf(插入成功n); break; case 2: StuImport(head,p); point-next=p; p-next=NULL; printf(插入成功n); break; default: decide=n; break; void StuDelect(Student *head) /学生成绩管理系统的删除函数,由主函数调用 int num; printf(输入想要删除学生的学生号:n); scanf(%d,&nu
24、m); char Sub10; printf(输入想要删除科目:n); scanf(%s,Sub); Student *p=(Student *)malloc(sizeof(Student); p-next=head-next; int i=1; while(p-next!=NULL) if(num=p-next-num&!strcmp(Sub,p-next-subject) StuOutput(p-next); printf(是否删除:1/0n); scanf(%d,&i); if(num=head-next-num&!strcmp(Sub,head-next-subject) head-n
25、ext=head-next-next; else p-next=p-next-next; i=2; printf(删除成功n); break; p=p-next; if(i=1) printf(没有该学生信息n);void StuSave(Student *head) /学生成绩管理系统的存储函数,由主函数调用 FILE *fp; char filename10; printf(请输入存储文件名(包括物理地址)n); scanf(%s,filename); Student *p=(Student *)malloc(sizeof(Student); p=head-next; if(fp=fopen(filename,w)=NULL) printf(cannot open file); return; printf(input data:/n); while(p!=NULL) fwrite(p,sizeof(Student),1,fp); /* 成块写入文件*/ p=p-next; fclose(fp);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1