单位文秘网 2020-09-09 10:32:57 点击: 次
可编辑范本
学生成绩管理系统
一、 实验目的通过此次课程设计中学生成绩管理系统的题目 ,掌握链表等数据结构的 基本操作方面的知识 ,并能灵活的解决一些基本的问题 ,加深对其性质及各项操作 的理解;
将所学数据结构方面的知识与一门具体的语言—— 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. 实现步骤
首先,分析题目要求划分实现模块,定义基本数据类型,诸如结构体、链表 等;
其次,针对上述的基本操作实现具体需要进行的操作,具体实现每个环节需 要进行的基本操作,即具体编写每个小函数实现功能;
最后,编写主函数对每个实现进行按需调用,实现操作。
流程图
代码:
#in clude<stdio.h>
#in clude<malloc.h>
#in clude<stri ng.h> struct Stude nt {
char n ame[10];
char subject[10];
int num;
int grade;
Stude nt *n ext;
};
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 ",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);
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(){
void StuMain()
{
char decide='y';
int num=1;
子函数
Student *head;
head=(Student *)malloc(sizeof(Student)); head->next=NULL;
// 定义 while 变量,函数是否继续进行
// 定义 switch 变量,函数跳转到哪个
// 定义链表的头指针
// 给头指针开辟空间
// 初始化头指针
while(decide!='n')
{ printf("printf("**********************************************\n");1 输入 2 查找
{ printf("
printf("
**********
************************************\n");
1 输入 2 查找 3 修改 4 插入 ********\n");
printf("
printf("
**********
5 删除 6 存储 7 退出
********\n");
***************************************************\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); // 学生成绩管理系统的文件输入函数,由输入函数调用
{ printf(" printf(" printf("***************************************************\n");1 手动输入 2
{ printf(" printf(" printf("
*************************************************
**\n");
1 手动输入 2 文件输入 3 退出
*************************************************
**\n");
**\n");
void StuInput(Student *head)
{
char decide='y';
int num;
函数
// 学生成绩管理系统的输入函数,由主函数调用
// 定义 while 变量,函数是否继续进行
// 定义 switch 变量,函数跳转到哪个子
while(decide!='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'; int num;
// 定义 while 变量,函数是否继续进行
// 定义 switch 变量,函数跳转到哪个子
函数
while(decide!='n')
{
printf("***************************************************\n");
printf("
*************************************************
**\n");
printf("
printf("
**** 1 遍历 2 学号查找 3 科目查找 4 退出 ****\n"); ***************************************************\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",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/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);
}
(责任编辑:单位文秘网) )
地址:https://www.kgf8887.com/show-122-24201-1.html
下一篇:语文教师工作个人总结2020
版权声明:
本站由单位文秘网原创策划制作,欢迎订阅或转载,但请注明出处。违者必究。单位文秘网独家运营 版权所有 未经许可不得转载使用