学生成绩管理系统讲解学习.docx
《学生成绩管理系统讲解学习.docx》由会员分享,可在线阅读,更多相关《学生成绩管理系统讲解学习.docx(30页珍藏版)》请在冰豆网上搜索。
学生成绩管理系统讲解学习
1问题描述
学生成绩管理系统
学生成绩管理系统
学生信息包括学期、学号、班级、姓名,和语文、数学、英语、计算机四门课成绩。
并按班级、学期查询学生成绩,并能录入、修改,求学生平均成绩和总成绩,输出不及格科目,按班级输出成绩单,按班级对学生成绩进行排序。
2系统分析
2.1题目要求
学生成绩管理系统设计
学生成绩信息包括:
学期,学号,班别,姓名,四门课程成绩(语文、数学、英语和计算机)。
主要功能:
(1)能按学期、按班级完成对学生成绩的录入、修改
(2)能按班级统计学生的成绩,求学生的总分及平均分,设计并输出统计报表
(3)能查询学生成绩,不及格科目及学生名单
(4)能按班级输出学生的成绩单
(5)能按班级,按课程,对学生成绩进行排序。
要求:
使用二进制文件方式存储数据,系统以菜单方式工作
2.2算法设计
(1)创建主菜单
(2)实现学生成绩信息录入
(3)实现学生成绩信息修改
(4)实现学生成绩信息查询
(a)按学期、班级查询学生的成绩
(b)按学号查询学生的成绩
(c)查询不及格的科目和学生名单
(5)实现学生成绩成绩统计
(a)按班级统计学生的总分、平均分
(b)按班级、课程对学生的总分进行排序
(6)实现学生成绩信息浏览
2.3流程图
2.4关键问题
难点:
指针p、函数。
解决:
head=NULL无条件循环
指针p指向新开辟的单元
指针p是否为空
是否
输入学号p->num
输出p->num是否为@
内存是否
溢出输入姓名p->name
停止for(i=0;i<3;i++)
输入输入成绩
返回p->sum=s;
菜单p->average=(float)s/3;
主函数:
intmain()
新建函数:
infor*init()
输入函数:
infor*creat()
显示函数:
structinfor*view(structinfor*head)
删除函数:
infor*delete(infor*head)
按名字寻找函数:
voidlookup(infor*head)
保存函数:
voidsave(infor*head)
按总分排序函数:
infor*sort(infor*head)
计算总分和均分函数:
voidzong(structinfor*head)
修改函:
voidchange(structinfor*head)
按学号排序函数:
infor*index(infor*h)
3系统实现
3.1题目一
(源代码)
#include
#include
#include
#defineN4
structinfor
{
intterm;//定义学期(1或2)
intno;//学号
intclas;//定义班级(1或2班)
charname[9];//姓名
floatchinese;//定义四门成绩
floatenglish;
floatmath;
floatcomputer;
structinfor*link;
};
intn=0;
//******************************************************************************
//函数功能:
创建链表,录入学生的相关信息,此函数返回一个指向链表头的指针
//******************************************************************************
structinfor*creat()
{
structinfor*head=NULL,*p=NULL,*q=NULL;
charc;
fflush(stdin);
printf("是否要输入信息(y/n):
");
scanf("%c",&c);
p=q=(structinfor*)malloc(sizeof(structinfor));
q=head;
while(p!
=NULL&&c=='y')
{
n++;
p=(structinfor*)malloc(sizeof(structinfor));
printf("请输入要录入学生信息的学期:
");
fflush(stdin);
scanf("%d",&p->term);//学期只能为1或2
while(p->term!
=1&&p->term!
=2)
{
getchar();
printf("输入错误!
请重新输入:
");//若学期不为1或2,则输入有误
scanf("%d",&p->term);
}
printf("请输入要录入学生成绩信息的班级:
");
fflush(stdin);//班级只能为1或2
scanf("%d",&p->clas);
while(p->clas!
=1&&p->clas!
=2)
{
getchar();
printf("输入错误!
请重新输入:
");
scanf("%d",&p->clas);
}
printf("请输入该班的学生信息!
\n");//输入学生信息(包括学号、四门成绩)
printf("请输入学生学号:
");
fflush(stdin);
scanf("%d",&p->no);
printf("请输入学生姓名:
");
fflush(stdin);
scanf("%s",p->name);//输入学生姓名
printf("请输入语文成绩(0-100):
");//输入四门成绩
scanf("%f",&p->chinese);
printf("请输入数学成绩(0-100):
");
scanf("%f",&p->math);
printf("请输入英语成绩(0-100):
");
scanf("%f",&p->english);
printf("请输入计算机成绩(0-100):
");
scanf("%f",&p->computer);
if(n==1)//创建新结点
head=p;
else
q->link=p;
q=p;
printf("是否还要输入信息(y/n):
");
fflush(stdin);
scanf("%c",&c);
}
q->link=NULL;//链表结尾
return(head);//链表返回头指针
}
//******************************************************************************
//函数功能:
实现对学生信息的修改
//******************************************************************************
voidchange(structinfor*head)
{
structinfor*p=head;
charch,m;
charname[9];//定义一个数组,存储学生的姓名
intnum;
if(p==NULL)printf("出错!
请先输入学生信息!
");
while
(1)//设置循环控制
{
printf("\t\t\t请选择要修改的信息!
\t\n");
printf("\t\t\t~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");//输出要修改的信息
printf("\t\t\ta、学号:
\n");
printf("\t\t\tb、姓名:
\n");
printf("\t\t\tc、班级:
\n");
printf("\t\t\td、成绩:
\n");
printf("\t\t\t~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
fflush(stdin);//清盘
scanf("%c",&ch);
if(ch=='a')
{
printf("你要修改的信息是:
学号!
\n");//按姓名修改学号
printf("请输入你要修改的学生姓名:
");
scanf("%s",name);
if(strcmp(name,p->name)==0)
{
printf("请输入该学生新的学号:
");//输入新学号
scanf("%d",&p->no);
}
elseprintf("无法查找到该学生!
\n");//找不到信息
}
elseif(ch=='b')//按学号修改该班级学生的信息
{
printf("你要修改的信息是:
姓名!
\n");
printf("请输入你要修改的学生的学号:
");
scanf("%d",&num);
if(num==p->no)//输入学号,判断条件
{
printf("请输入该学生的姓名:
");
scanf("%s",p->name);//输入要做修改的学生姓名
}
elseprintf("无法查找到该学生!
\n");//找不到信息
}
elseif(ch=='c')
{
printf("你要修改的信息是:
班级!
\n");//按学号修改班级
printf("请输入你要修改的学生的学号:
");
scanf("%d",&num);
if(num==p->no)
{
printf("请输入该学生的班级:
");//输入要做修改的班级
scanf("%d",p->clas);
}
elseprintf("无法查找到该学生!
\n");//找不到信息
}
elseif(ch=='d')
{
printf("你要修改的信息是:
成绩!
\n");//按学号修改成绩
printf("请输入你要修改的学生的学号:
");
scanf("%d",&num);
if(num==p->no)//输入学号
{
printf("请输入该学生新的语文成绩:
");
scanf("%f",p->chinese);
printf("请输入该学生新的数学成绩:
");
scanf("%f",p->math);//输入新的四门成绩
printf("请输入该学生新的英语成绩:
");
scanf("%f",p->english);
printf("请输入该学生新的计算机成绩:
");
scanf("%f",p->computer);
}
elseprintf("无法查找该学生的信息!
\n");//找不到信息
}
elseprintf("出错!
\n");
p=p->link;
printf("是否还要继续修改信息(y/n):
");//判断,是否还要修改信息,跳出循环
fflush(stdin);
if((m=getchar())=='n')break;
}
}
//******************************************************************************
//函数功能:
按照学号查询学生信息
//******************************************************************************
voidcheckno(structinfor*head)
{//按学号查询学生的成绩
structinfor*p;
p=head;
intnum,i=0;
printf("请输入你要查询的学生学号:
\n");
scanf("%d",&num);
if(num==p->no)//输入学号,判断条件
{
printf("--------------------------------------------------------------------------");
printf("\t学期\t学号\t班别\t姓名\t语文\t数学\t英语\t计算机\t\n");
printf("-------------------------------------------------------------------------\n");
printf("%d\t",p->term);
printf("%d\t",p->no);
printf("%d\t",p->clas);//输出学生的班级
printf("%s\t",p->name);
printf("%1f\t",p->chinese);//输出四门成绩
printf("%1f\t",p->math);
printf("%1f\t",p->english);
printf("%1f\t",p->computer);
i=2;
}
if(i==0)
printf("没找到该学生的信息!
");//找不到信息
}
voidcheckclass(structinfor*head)
{
intbanji,i=0;
structinfor*p=head;
while(p!
=NULL)//按班级查询学生的成绩
{
printf("请输入你要查询成绩的班级:
");
scanf("%d",&banji);
if(banji==p->clas)
{
printf("请输出%d班所有同学的成绩:
",banji);
printf("--------------------------------------------------------------------------");
printf("\t学期\t学号\t班别\t姓名\t语文\t数学\t英语\t计算机\t\n");
printf("-------------------------------------------------------------------------\n");
printf("%d\t",p->term);//输出要查询成绩的班级
printf("%d\t",p->no);//输出查询成绩的学生学号
printf("%d\t",p->clas);//输出要查询成绩的班级
printf("%s\t",p->name);//输出要查询成绩的学生姓名
printf("%1f\t",p->chinese);
printf("%1f\t",p->math);//输出四门成绩
printf("%1f\t",p->english);
printf("%1f\t",p->computer);
printf("\n");
i=2;
}
p=p->link;
if(i==0)
printf("没找到学生信息!
");//输出错误,找不到信息
}
}
voidcheckterm(structinfor*head)//定义按学期查找信息的函数
{
intxueqi,i=0;
structinfor*p=head;
while(p!
=NULL)//设置循环控制
{
//按学期查询学生的成绩
printf("请输入你要查询成绩的学期:
");
scanf("%d",&xueqi);
if(xueqi==p->term)
{
printf("请输出第%d学期所有班级的信息:
");
printf("--------------------------------------------------------------------------");
printf("\t学期\t学号\t班别\t姓名\t语文\t数学\t英语\t计算机\t\n");
printf("-------------------------------------------------------------------------\n");
printf("%d\t",p->term);
printf("%d\t",p->no);
printf("%d\t",p->clas);
printf("%s\t",p->name);//输出姓名
printf("%1f\t",p->chinese);
printf("%1f\t",p->math);
printf("%1f\t",p->english);//输出四门成绩
printf("%1f\t",p->computer);
printf("\n");
i=2;
}
p=p->link;
if(i==0)
printf("没找到学生信息!
");//找不到信息
}
}
voidnorich(structinfor*head)//定义一个函数,查找不及格的学生
{
structinfor*p;
p=head;
intnum,i=0;
floattoa;
printf("请输入要查询成绩的学生学号:
");
scanf("%d",&num);
if(num==p->no)
{
printf("正在查询该学生的成绩,请稍侯>>>>>\n");//查询学生的成绩,输出不及格的科目
while(p!
=NULL)
{
if(p->chinese<60)
{
printf("该学生的语文不及格!
\n");
printf("\n");
i++;
}
if(p->math<60)//输出该学生的不及格科目
{
printf("该学生的数学不及格!
\n");
printf("\n");
i++;
}
if(p->english<60)
{
printf("该学生的英语不及格!
\n");//对各门成绩进行判断
printf("\n");
printf("\n");
i++;
}
if(p->computer<60)
{
printf("该学生的计算机不及格!
\n");
printf("\n");
i++;
}
if(i>0)
printf("%s同学共有%d门成绩不及格!
\n学号是:
%d\n",p->name,i,p->no);
printf("\n");
toa=p->chinese+p->math+p->english+p->computer;
if(toa<240)
printf("不及格学生名单为:
%s",p->name);//输出不及格的学生名单
p=p->link;
}
}
}
voidsearch(structinfor*head)//定义一个查询学生信息的函数,调用各子函数,进行查询
{
chark,ch;
structinfor*p=head;
while(p!
=NULL)//设置循环控制条件
{//输出查询方式
printf("\t\t\t你要选择何种方式查询成绩!
\n");
printf("\t~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
printf("\t\t\ta、学号:
\n");
printf("\t\t\tb、班级:
\n");
printf("\t\t\tc、学期:
\n");
printf("\t\t\td、不及格的学生:
\n");
printf("\t~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
fflush(stdin);
scanf("%c",&k);
switch(k)
{
case'a':
checkno(head);break;//调用学号函数
case'b':
checkclass(head);break;
case'c':
checkterm(head);break;
case'd':
norich(head);break;
}
printf("\n");
printf("是否还要继续查询学生的信息(y/n):
");
fflush(stdin);
if((ch=getchar())=='n')break;//跳出循环,返回主菜单
}
}
//******************************************************************************
//函数功能:
对学生成绩进行统计,按班级求总分及平均分
//******************************************************************************
voidzong(structinfor*head)//对该班级的学生成绩求总分、平均分
{
floattoa=0,ave=0;
inti=0;
structinfor*p=head;
while(p!
=NULL)
{
toa=p->chinese+p->math+p->english+p->computer;//输出学生的总分和平均分成绩
ave=toa/N;
printf("第%d个学生的总分为:
%1f!
\n",i+1,toa);
printf("\n");
printf("第%d个学生的平均分:
%1f!
\n",i+1,ave);
printf("\n");
printf("已经统计了第%d个学生的成绩!
\n",i+1);//统计完毕
printf("\n");
i++;
p=p->link;//指向下一个结点
}
}
voidpaixu(structinfor*head)//对该班级的学生成绩进行排序
{
inti=0,j;
floata[10],t;//把结点信息输入到数组,然后排序
structinfor*p=head;
while(p!
=NULL)
{
a