数据结构之学生成绩管理系统.docx
《数据结构之学生成绩管理系统.docx》由会员分享,可在线阅读,更多相关《数据结构之学生成绩管理系统.docx(17页珍藏版)》请在冰豆网上搜索。
![数据结构之学生成绩管理系统.docx](https://file1.bdocx.com/fileroot1/2023-3/18/0708894d-eae2-4f42-b5ca-037dc9164a1e/0708894d-eae2-4f42-b5ca-037dc9164a1e1.gif)
数据结构之学生成绩管理系统
学生成绩管理系统
一、实验目的
1.通过此次课程设计中学生成绩管理系统的题目,掌握链表等数据结构的基本操作方面的知识,并能灵活的解决一些基本的问题,加深对其性质及各项操作的理解;
2.将所学数据结构方面的知识与一门具体的语言——C语言来进行实现,感受数据结构的强大作用,加深理解。
二、试验要求
管理系统中有五个要求:
输入查找修改插入删除存储
(1)输入要求:
能够通过键盘输入和文件输入两种
查找要求:
能够根据学生号查找单个学生的信息,也可以遍历所有学生信息
(2)
修改要求:
能够根据学生号修改单个学生所有信息)(3插入要求:
能够实现头插和尾插(4)
删除要求:
能够根据学生号删除单个学生信息)5(存储要求:
通过链表存储所有信息)(6
三、算法的思想与算法实现步骤
1.基本思想
通过链表数据类型进行基本操作,主要有三个模块:
分别是主函数模块、
主要操作函数及基本操作函数。
其中,主函数负责其他子函数的调用实现以及基本界面的操作
主要函数包括:
voidStuInput(Student*);//学生成绩管理系统的输入函数,由主函数调用
voidStuSelect(Student*);//学生成绩管理系统的查找函数,由主函数调用
voidStuAlter(Student*);//学生成绩管理系统的修改函数,由主函数调用
voidStuInsert(Student*);//学生成绩管理系统的插入函数,由主函数调用
学生成绩管理系统的删除函数,由主函数调用voidStuDelect(Student*);//
voidStuSave(Student*);//学生成绩管理系统的存储函数,由主函数调用
基本操作函数:
voidStuOutput(Student*p);//输出函数
intStuImport(Student*head,Student*p);//输入函数
voidStuInputHand(Student*head);//学生成绩管理系统的手动输入函数,由输入函数调用
voidStuInputFile(Student*head);//学生成绩管理系统的文件输入函数,由输入函数调用
voidStuSelectErg(Student*head);//学生成绩管理系统的遍历函数,由查找函数调用
voidStuSelectNumFind(Student*head);//学生成绩管理系统的按学号查找函数,由查找函数调用
voidStuSelectSubFind(Student*head);//学生成绩管理系统的按科目查找函数,由查找函数调用
2.实现步骤
首先,分析题目要求划分实现模块,定义基本数据类型,诸如结构体、链表等;
其次,针对上述的基本操作实现具体需要进行的操作,具体实现每个环节需要进行的基本操作,即具体编写每个小函数实现功能;
最后,编写主函数对每个实现进行按需调用,实现操作。
流程图3.
main
StuMain
StuSave
StuInsertStuDelectStuInputStuSelectStuAlter
StuSelectSubStuSelectEStuSelectNStuInputStuInpuFind
rgHandumFindFile
四.代码:
#include
#include
#include
structStudent
{
charname[10];
charsubject[10];
intnum;
intgrade;
Student*next;
};
main函数调用//学生成绩管理系统的主函数,由voidStuMain();
//学生成绩管理系统的输入函数,由主函数调用voidStuInput(Student*);
学生成绩管理系统的查找函数,由主函数调用voidStuSelect(Student*);//学生成绩管理系统的修改函数,由主函数调用//voidStuAlter(Student*);
学生成绩管理系统的插入函数,由主函数调用//voidStuInsert(Student*);
//学生成绩管理系统的删除函数,由主函数调用voidStuDelect(Student*);
学生成绩管理系统的存储函数,由主函数调用//voidStuSave(Student*);
输出函数//voidStuOutput(Student*p);
输入函数intStuImport(Student*head,Student*p);//
voidStuOutput(Student*p)//打印函数,将链表的该节点信息输出
{
牰湩晴尨学生姓名:
);
printf(%s,p->name);
牰湩晴尨学生号:
);
printf(%d,p->num);
牰湩晴尨科目:
);
printf(%s,p->subject);
牰湩晴尨学生成绩:
);
printf(%d\n,p->grade);
}
intStuImport(Student*head,Student*p)
{
Student*Opinion=(Student*)malloc(sizeof(Student));//用来判断输入节点中学生号是否有重复
Opinion=head->next;
牰湩晴尨学生姓名:
\n);
scanf(%s,p->name);
牰湩晴尨学生号:
\n);
scanf(%d,&p->num);
牰湩晴尨科目:
\n);
scanf(%s,p->subject);
if(Opinion!
=NULL)
{
if(Opinion->num==p->num&&!
strcmp(Opinion->subject,p->subject))
{
牰湩晴尨该学生这门科目已有成绩,请重新输入\n);
return1;
}
Opinion=Opinion->next;
}
牰湩晴尨学生成绩:
\n);
scanf(%d,&p->grade);
return0;
}
voidmain()
{
StuMain();
}
voidStuMain()
{
chardecide='y';//定义while变量,函数是否继续进行
变量,函数跳转到哪个switch定义//num=1;int
子函数
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)
{
case1:
StuInput(head);
break;
case2:
StuSelect(head);
break;
case3:
StuAlter(head);
break;
case4:
StuInsert(head);
break;
case5:
StuDelect(head);
break;
case6:
StuSave(head);
break;
default:
decide='n';
break;
}
};
}
voidStuInputHand(Student*head);//学生成绩管理系统的手动输入函数,由输入函数调用
voidStuInputFile(Student*head);//学生成绩管理系统的文件输入函数,由输入函数调用
学生成绩管理系统的输入函数,由主函数调用//voidStuInput(Student*head)
{
chardecide='y';//定义while变量,函数是否继续进行
intnum;//定义switch变量,函数跳转到哪个子函数
while(decide!
='n')
{
printf(***************************************************\n);
printf(**1手动输入2文件输入3退出**\n);
printf(***************************************************\n);
scanf(%d,&num);
switch(num)
{
case1:
StuInputHand(head);
break;
case2:
StuInputFile(head);
default:
decide='n';
break;
}
}
}
voidStuInputHand(Student*head)//学生成绩管理系统的手动输入函数,由输入函数调用
{
if(head->next==NULL)
{
Student*point=(Student*)malloc(sizeof(Student));//链表中最后一个节点,只在该函数中存在
point->next=NULL;
intdecide=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;
}
牰湩晴尨是否继续:
1/0\n);
scanf(%d,&decide);
}
}
else
牰湩晴尨管理系统中已存在信息,若想输入学生信息,请转插入子系统);
}
voidStuInputFile(Student*head)//学生成绩管理系统的文件输入函数,由输入函数调用
{
if(head->next!
=NULL)
{
牰湩晴尨学生管理系统中已有信息,请跳转到插入选项\n);
return;
}
FILE*fp;
牰湩晴尨请输入文件名(包括物理地址)\n);
charfilename[10];
scanf(%s,filename);
if((fp=fopen(filename,
))==NULL)
{
printf(cannotopenfile\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))
{
牰湩晴尨该文件中有重复学生信息,请验明再传输\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);
牰湩晴尨传输成功\n);
}
voidStuSelectErg(Student*head);//学生成绩管理系统的遍历函数,由查找函数调用
voidStuSelectNumFind(Student*head);//学生成绩管理系统的按学号查找函数,由查找函数调用
voidStuSelectSubFind(Student*head);//学生成绩管理系统的按科目查找函数,由查找函数调用
voidStuSelect(Student*head)//学生成绩管理系统的查找函数,由主函数调用
{
chardecide='y';//定义while变量,函数是否继续进行
intnum;//定义switch变量,函数跳转到哪个子函数
while(decide!
='n')
{
printf(***************************************************\n);
printf(****1遍历2学号查找3科目查找4退出****\n);
printf(***************************************************\n);
scanf(%d,&num);
switch(num)
{
case1:
StuSelectErg(head);
break;
case2:
StuSelectNumFind(head);
break;
case3:
StuSelectSubFind(head);
break;
default:
decide='n';
break;
}
}
}
voidStuSelectErg(Student*head)//学生成绩管理系统的遍历函数,由查找函数调用
{
Student*p=(Student*)malloc(sizeof(Student));
p=head->next;
inti=1;
while(p!
=NULL)
{
牰湩晴尨第%d位学生信息:
\n,i);
StuOutput(p);
p=p->next;
i++;
}
}
voidStuSelectNumFind(Student*head)//学生成绩管理系统的查找子系统,有查找函数调用
{
intnum;
牰湩晴尨输入想要查找学生的学生号:
\n);
scanf(%d,&num);
Student*p=(Student*)malloc(sizeof(Student));
p=head->next;
inti=1;
while(p!
=NULL)
{
if(num==p->num)
{
StuOutput(p);
i++;
}
p=p->next;
}
if(i==1)
);
没有该学生信息牰湩晴尨
}
voidStuSelectSubFind(Student*head)//学生成绩管理系统的按科目查找函数,由查找函数调用
{
charSub[10];
牰湩晴尨输入想要查找科目:
\n);
scanf(%s,Sub);
Student*p=(Student*)malloc(sizeof(Student));
p=head->next;
inti=1;
while(p!
=NULL)
{
if(!
strcmp(Sub,p->subject))
{
StuOutput(p);
i++;
}
p=p->next;
}
if(i==1)
牰湩晴尨没有该学生信息);
}
voidStuAlter(Student*head)//学生成绩管理系统的修改函数,由主函数调用
{
intnum;
牰湩晴尨输入想要查找学生的学生号:
\n);
scanf(%d,&num);
charSub[10];
牰湩晴尨输入想要查找科目:
\n);
scanf(%s,Sub);
Student*p=(Student*)malloc(sizeof(Student));
p=head->next;
inti=1;
while(p!
=NULL)
{
if(num==p->num&&!
strcmp(Sub,p->subject))
{
牰湩晴尨输入修改成绩:
\n);
scanf(%d,&p->grade);
牰湩晴尨修改成功\n);
i++;
}
p=p->next;
if(i==1)
牰湩晴尨没有该学生信息);
}
}
voidStuInsert(Student*head)//学生成绩管理系统的插入函数,由主函数调用
{
Student*point=(Student*)malloc(sizeof(Student));
point=head->next;
while(point->next!
=NULL)
point=point->next;//找到尾结点
chardecide='y';//定义while变量,函数是否继续进行
intnum;//定义switch变量,函数跳转到哪个子函数
while(decide!
='n')
{
printf(***************************************************\n);
printf(****1头插2尾插3退出****\n);
printf(***************************************************\n);
scanf(%d,&num);
Student*p=(Student*)malloc(sizeof(Student));
switch(num)
{
case1:
StuImport(head,p);
p->next=head->next;
head->next=p;
牰湩晴尨插入成功\n);
break;
case2:
StuImport(head,p);
point->next=p;
p->next=NULL;
牰湩晴尨插入成功\n);
break;
default:
decide='n';
break;
}
}
}
voidStuDelect(Student*head)//学生成绩管理系统的删除函数,由主函数调用
{
intnum;
牰湩晴尨输入想要删除学生的学生号:
\n);
scanf(%d,&num);
charSub[10];
牰湩晴尨输入想要删除科目:
\n);
scanf(%s,Sub);
Student*p=(Student*)malloc(sizeof(Student));
p->next=head->next;
inti=1;
while(p->next!
=NULL)
{
if(num==p->next->num&&!
strcmp(Sub,p->next->subject))
{
StuOutput(p->next);
牰湩晴尨是否删除:
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;
牰湩晴尨删除成功\n);
break;
}
p=p->next;
}
if(i==1)
牰湩晴尨没有该学生信息\n);
}
voidStuSave(Student*head)//学生成绩管理系统的存储函数,由主函数调用
{
FILE*fp;
charfilename[10];
牰湩晴尨请输入存储文件名(包括物理地址)\n);
scanf(%s,filename);
Student*p=(Student*)malloc(sizeof(Student));
p=head->next;
if((fp=fopen(filename,w))==NULL)
{
printf(cannotopenfile);
return;
}
printf(inputdata:
/n);
while(p!
=NULL)
{
fwrite(p,sizeof(St