您好,欢迎来到筏尚旅游网。
搜索
您的当前位置:首页数据结构之学生成绩管理系统

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

来源:筏尚旅游网


学生成绩管理系统

一、 实验目的

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。 实现步骤

首先,分析题目要求划分实现模块,定义基本数据类型,诸如结构体、链表等;

其次,针对上述的基本操作实现具体需要进行的操作,具体实现每个环节需要进行的基本操作,即具体编写每个小函数实现功能;

最后,编写主函数对每个实现进行按需调用,实现操作。 3.流程图

main StuMain StuInput StuSelect StuAlter StuInsert StuDelect StuSave StuInputHand StuInputFile StuSelectErg StuSelectNumFind StuSelectSubFind

四.代码:

#include〈stdio.h〉

#include〈malloc。h〉 #include struct Student {

char name[10]; char subject[10]; int num; int grade;

Student *next; };

void StuMain(); //学生成绩管理系统的主函数,由main函数调用

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 StuOutput(Student *p) //打印函数,将链表的该节点信息输出 {

printf(\"学生姓名:\"); printf(”%s ”,p—>name); printf(”学生号:\"); printf(\"%d ”,p-〉num);

printf(\"科目: ”); printf(\"%s \—〉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); printf(”学生号:\\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'; //定义while变量,函数是否继续进行 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(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); //学生成绩管理系统的文件输入函数,由输入函数调用

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); 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); if(head—>next==NULL) { head—〉next=p; point=p; } else { point—〉next=p; point=p; } printf(”是否继续:1/0\\n\"); scanf(”%d”,&decide); } }

else printf(”管理系统中已存在信息,若想输入学生信息,请转插入子系统”); }

void StuInputFile(Student *head) //学生成绩管理系统的文件输入函数,由输入函数调用 { if(head-〉next!=NULL) { printf(\"学生管理系统中已有信息,请跳转到插入选项\\n\"); return ; } FILE *fp;

printf(\"请输入文件名(包括物理地址)\\n\"); char filename[10]; scanf(\"%s”,filename);

if((fp=fopen(filename,”r”))==NULL) { printf(\"can not open file\\n\"); return; } Student *point=(Student *)malloc(sizeof(Student)); Student *Opinion=(Student *)malloc(sizeof(Student)); //用来判断输入节点中学生号是否有重复 while(!feof(fp)) { Opinion=head—〉next; Student *p=(Student *)malloc(sizeof(Student)); 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(Opinion—〉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 StuSelect(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; case 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) //学生成绩管理系统的查找子系统,有查找函数调用 { 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 Sub[10];

printf(”输入想要查找科目:\\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 Sub[10]; printf(”输入想要查找科目:\\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 *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(Student)); 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”,&num); char Sub[10]; printf(”输入想要删除科目:\\n”); scanf(”%s\

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/0\\n\"); scanf(”%d\",&i); if(num==head->next->num&&!strcmp(Sub,head-〉next->subject)) { head—>next=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 filename[10]; 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 © 2019- efsc.cn 版权所有 赣ICP备2024042792号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务