大数据结构之学生成绩管理系统.docx
《大数据结构之学生成绩管理系统.docx》由会员分享,可在线阅读,更多相关《大数据结构之学生成绩管理系统.docx(20页珍藏版)》请在冰豆网上搜索。
大数据结构之学生成绩管理系统
学生成绩管理系统
一、实验目的
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.流程图
四.代码:
#include
#include
#include
structStudent
{
charname[10];
charsubject[10];
intnum;
intgrade;
Student*next;
};
voidStuMain();//学生成绩管理系统的主函数,由main函数调用
voidStuInput(Student*);
voidStuSelect(Student*);
voidStuAlter(Student*);
voidStuInsert(Student*);
voidStuDelect(Student*);
voidStuSave(Student*);
//学生成绩管理系统的输入函数,由主函数调用
//学生成绩管理系统的查找函数,由主函数调用
//学生成绩管理系统的修改函数,由主函数调用
//学生成绩管理系统的插入函数,由主函数调用
//学生成绩管理系统的删除函数,由主函数调用
//输出函数
//学生成绩管理系统的存储函数,由主函数调用
voidStuOutput(Student*p);
intStuImport(Student*head,Student*p);
voidStuOutput(Student*p)
{
printf("学生姓名:
");
printf("%s",p->name);
printf("学生号:
");
printf("%d",p->num);
printf("科目:
");
printf("%s",p->subject);
printf("学生成绩:
");
printf("%d\n",p->grade);
}
intStuImport(Student*head,Student*p)
{
Student*Opinion=(Student
输入节点中学生号是否有重复
Opinion=head->next;
//输入函数
//打印函数,将链表的该节点信息输出
*)malloc(sizeof(Student));
//用来判断
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))
{
\n");
printf("该学生这门科目已有成绩,请重新输入
return1;
}
Opinion=Opinion->next;
}
printf("学生成绩:
\n");
scanf("%d",&p->grade);
return0;
}
voidmain()
{
StuMain();
}
1输入2查找3修改4插入********\n");
5删除6存储7退出
********\n");
voidStuMain()
{
chardecide='y';
intnum=1;
个子函数
Student*head;
head=(Student*)malloc(sizeof(Student));
head->next=NULL;
while(decide!
='n')
{
printf("
printf("
printf("
printf("
//定义while变量,函数是否继续进行
//定义switch变量,函数跳转到哪
//定义链表的头指针
//给头指针开辟空间
//初始化头指针
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';
intnum;
子函数
//定义while变量,函数是否继续进行
//定义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;
}
printf("是否继续:
1/0\n");
scanf("%d",&decide);
}
}
else
printf("管理系统中已存在信息,若想输入学生信息,请转插入子系统");
}
voidStuInputFile(Student*head)//学生成绩管理系统的文件输入函数,由输入函数调用
{
printf("学生管理系统中已有信息,请跳转到插入选项\n");return;
}
FILE*fp;
printf("请输入文件名(包括物理地址)\n");
charfilename[10];
scanf("%s",filename);
if((fp=fopen(filename,"r"))==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->num==p->num&&!
strcmp(Opinion->subject,p->subject))
{
\n");
printf("该文件中有重复学生信息,请验明再传输
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;
{
Opinion=Opinion->next;if(Opinion->next->next==NULL)
Opinion->next=NULL;
};
fclose(fp);
printf("传输成功\n");
}
voidStuSelectErg(Student*head);//学生成绩管理系统的遍历函数,由查找函数调用voidStuSelectNumFind(Student*head);//学生成绩管理系统的按学号查找函数,由
查找函数调用
voidStuSelectSubFind(Student*head);//学生成绩管理系统的按科目查找函数,由查找函数调用
voidStuSelect(Student*head)//学生成绩管理系统的查找函数,由主函数调用
{
chardecide='y';//定义while变量,函数是否继续进行intnum;//定义switch变量,函数跳转到哪个子函数
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)
{
printf("第%d位学生信息:
\n",i);
StuOutput(p);
p=p->next;
i++;
}
}
有查找函
voidStuSelectNumFind(Student*head)//学生成绩管理系统的查找子系统,数调用
{
intnum;
printf("输入想要查找学生的学生号:
\n");
scanf("%d",&num);
Student*p=(Student*)malloc(sizeof(Student));
p=head->next;
inti=1;
{
if(num==p->num)
{
StuOutput(p);
i++;
}
p=p->next;
}
if(i==1)
printf("没有该学生信息");
}
voidStuSelectSubFind(Student*head)//学生成绩管理系统的按科目查找函数,由查找函数调用
{
charSub[10];
printf("输入想要查找科目:
\n");
scanf("%s",Sub);
Student*p=(Student*)malloc(sizeof(Student));
p=head->next;
inti=1;
{
if(!
strcmp(Sub,p->subject))
{
StuOutput(p);
i++;
}
p=p->next;
}
if(i==1)
printf("没有该学生信息");
}
voidStuAlter(Student*head)//学生成绩管理系统的修改函数,由主函数调用
{
intnum;
printf("输入想要查找学生的学生号:
\n");
scanf("%d",&num);
charSub[10];
printf("输入想要查找科目:
\n");
scanf("%s",Sub);
Student*p=(Student*)malloc(sizeof(Student));
p=head->next;
inti=1;
{
if(num==p->num&&!
strcmp(Sub,p->subject))
{
printf("输入修改成绩:
\n");
scanf("%d",&p->grade);
printf("修改成功\n");
i++;
}
p=p->next;
if(i==1)
printf("没有该学生信息");
}
}
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;
printf("插入成功\n");break;
case2:
StuImport(head,p);point->next=p;p->next=NULL;printf("插入成功\n");break;
default:
decide='n';break;
}
}
}
voidStuDelect(Student*head)//学生成绩管理系统的删除函数,由主函数调用
{
intnum;
printf("输入想要删除学生的学生号:
\n");
scanf("%d",&num);
charSub[10];
printf("输入想要删除科目:
\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);printf("是否删除:
1/0\n");scanf("%d",&i);
if(num==head->next->num&&!
strcmp(Sub,head->next->subject))
{
head->next=head->next->next;
}
elsep->next=p->next->next;
}
i=2;
printf("删除成功\n");
break;
p=p->next;
}
if(i==1)
printf("没有该学生信息\n");
}
voidStuSave(Student*head)//学生成绩管理系统的存储函数,由主函数调用{
FILE*fp;
charfilename[10];
printf("请输入存储文件名(包括物理地址)\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(Student),1,fp);/*成块写入文件*/
p=p->next;
}
fclose(fp);