1、1 问题描述 学生成绩管理系统 学生成绩管理系统 学生信息包含学期、学号、班级、姓名,和语文、数学、英语、计算机四门课成绩。并按班级、学期查询学生成绩,并能录入、修改,求学生平均成绩和总成绩,输出不及格科目,按班级输出成绩单,按班级对学生成绩进行排序。 2 系统分析 2.1 题目要求 学生成绩管理系统设计 学生成绩信息包含:学期,学号,班别,姓名,四门课程成绩(语文、数学、英语和计算机)。 关键功效: (1) 能按学期、按班级完成对学生成绩录入、修改 (2) 能按班级统计学生成绩,求学生总分及平均分,设计并输出统计报表 (3) 能查询学生成绩,不及格科目及
2、学生名单 (4) 能按班级输出学生成绩单 (5) 能按班级,按课程,对学生成绩进行排序。 要求:使用二进制文件方法存放数据,系统以菜单方法工作 2.2算法设计 (1)创建主菜单 (2)实现学生成绩信息录入 (3)实现学生成绩信息修改 (4)实现学生成绩信息查询 (a)按学期、班级查询学生成绩 (b)按学号查询学生成绩 (c)查询不及格科目和学生名单 (5)实现学生成绩成绩统计 (a)按班级统计学生总分、平均分 (b)按班级、课程对学生总分进行排序 (6)实现学生成绩信息浏览 2.3步骤图
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; 主 函 数: int main() 新建函数:infor *init()
4、输入函数 :infor *creat() 显示函数: struct infor *view(struct infor *head) 删除函数: infor *delete(infor *head) 按名字寻求函数: void lookup(infor *head) 保留函数: void save(infor *head) 按总分排序函数: infor *sort(infor *head) 计算总分和均分函数: void zong(struct infor *head) 修改函:void change(struct infor *head) 按学号排序函数: in
5、for *index(infor *h)
3 系统实现
3.1 题目一
(源代码)
#include
6、 //定义四门成绩 float english; float math; float computer; struct infor *link; }; int n=0 ; //****************************************************************************** //函数功效:创建链表,录入学生相关信息,此函数返回一个指向链表头指针 //***************************************************************************
7、 struct infor *creat() { struct infor *head=NULL,*p=NULL,*q=NULL; char c; fflush(stdin); printf("是否要输入信息(y/n):"); scanf("%c",&c); p=q=(struct infor *)malloc(sizeof(struct infor)); q=head; while(p!=NULL&&c=='y') { n++; p=(struct infor *)malloc(sizeof(
8、struct infor)); printf("请输入要录入学生信息学期:"); fflush(stdin); scanf("%d",&p->term); //学期只能为1或2 while(p->term!=1&&p->term!=2) { getchar(); printf("输入错误!请重新输入:"); //若学期不为1或2,则输入有误 scanf("
9、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); }
10、 printf("请输入该班学生信息!\n"); //输入学生信息(包含学号、四门成绩) printf("请输入学生学号:"); fflush(stdin); scanf("%d",&p->no); printf("请输入学生姓名:"); fflush(stdin); scanf("%s",p->name); //输入学生姓名 printf("请输入语文成绩(0-100
11、):"); //输入四门成绩 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)
12、 //创建新结点 head=p; else q->link=p; q=p; printf("是否还要输入信息(y/n):"); fflush(stdin); scanf("%c",&c); } q->link=NULL; //链表结尾 return(head); //链表返回头
13、指针 } //****************************************************************************** //函数功效:实现对学生信息修改 //****************************************************************************** void change(struct infor *head) { struct infor *p=head; char ch,m; char name[9];
14、 //定义一个数组,存放学生姓名 int num; if(p==NULL)printf("犯错!请先输入学生信息!"); while(1) //设置循环控制 { printf("\t\t\t请选择要修改信息!\t\n"); printf("\t\t\t~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); // 输出要修改信息 printf("\t\t\t
15、 a、学号: \n"); printf("\t\t\t b、姓名: \n"); printf("\t\t\t c、班级: \n"); printf("\t\t\t d、成绩: \n"); printf("\t\t\t~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); fflush(stdin); //清盘 scanf("%c",&ch); if(ch=='a')
16、 { printf("你要修改信息是:学号!\n"); //按姓名修改学号 printf("请输入你要修改学生姓名:"); scanf("%s",name); if (strcmp(name,p->name)==0) { printf("请输入该学生新学号:"); //输入新学号 scanf("%d",&p->no); } else printf("无法
17、查找到该学生!\n"); //找不到信息 } else if(ch=='b') //按学号修改该班级学生信息 { printf("你要修改信息是:姓名!\n"); printf("请输入你要修改学生学号:"); scanf("%d",&num); if(num==p->no) //输入学号
18、判定条件 { printf("请输入该学生姓名:"); scanf("%s",p->name); //输入要做修改学生姓名 } else printf("无法查找到该学生!\n"); //找不到信息 } else if(ch=='c') { printf("你要修改信息是:班级!\n"); //按学号修改班级 printf("请输入你要修改学
19、生学号:"); scanf("%d",&num); if(num==p->no) { printf("请输入该学生班级:"); //输入要做修改班级 scanf("%d",p->clas); } else printf("无法查找到该学生!\n"); //找不到信息 } else if(ch=='d') { printf("你要修改信息是:成绩!
20、\n"); //按学号修改成绩 printf("请输入你要修改学生学号:"); scanf("%d",&num); if(num==p->no) //输入学号 { printf("请输入该学生新语文成绩:"); scanf("%f",p->chinese); printf("请输入该学生新数学成绩:"); scanf("%f",p->
21、math); //输入新四门成绩 printf("请输入该学生新英语成绩:"); scanf("%f",p->english); printf("请输入该学生新计算机成绩:"); scanf("%f",p->computer); } else printf("无法查找该学生信息!\n"); //找不到信息 } else printf("犯错!\n"); p=p->link; printf("是否
22、还要继续修改信息(y/n):"); //判定,是否还要修改信息,跳出循环 fflush(stdin); if((m=getchar())=='n')break; } } //****************************************************************************** //函数功效:根据学号查询学生信息 //*****************************************************************
23、 void checkno(struct infor *head) { //按学号查询学生成绩 struct infor *p; p=head; int num,i=0; printf("请输入你要查询学生学号:\n"); scanf("%d",&num); if(num==p->no)
24、 //输入学号,判定条件 { printf("--------------------------------------------------------------------------"); printf("\t学期\t学号\t班别\t姓名\t语文\t数学\t英语\t计算机\t\n"); printf("-------------------------------------------------------------------------\n");
25、 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",
26、p->computer); i=2; } if(i==0) printf("没找到该学生信息!"); //找不到信息 } void checkclass(struct infor *head) { int banji,i=0; struct infor *p=head; while(p!=NULL) //按班级查询学生成绩 { printf("请输入你要查询成
27、绩班级:"); scanf("%d",&banji); if(banji==p->clas) { printf("请输出%d班全部同学成绩:",banji); printf("--------------------------------------------------------------------------"); printf("\t学期\t学号\t班别\t姓名\t语文\t数学\t英语\t计算机\t\n"); printf("
28、\n"); printf("%d\t",p->term); //输出要查询成绩班级 printf("%d\t",p->no); //输出查询成绩学生学号 printf("%d\t",p->clas);
29、 //输出要查询成绩班级 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);
30、 printf("\n"); i=2; } p=p->link; if(i==0) printf("没找到学生信息!"); //输犯错误,找不到信息 } } void checkterm(struct infor *head) //定义按学期查找信息函数 { int xueqi,i=0; struct infor *p=head;
31、 while(p!=NULL) //设置循环控制 { //按学期查询学生成绩 printf("请输入你要查询成绩学期:"); scanf("%d",&xueqi); if(xueqi==p->term) { printf("请输出第%d学期全部班级信息:");
32、 printf("--------------------------------------------------------------------------"); printf("\t学期\t学号\t班别\t姓名\t语文\t数学\t英语\t计算机\t\n"); printf("-------------------------------------------------------------------------\n"); printf("%d\t",p->term);
33、 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); //输出四门成绩
34、printf("%1f\t",p->computer); printf("\n"); i=2; } p=p->link; if(i==0) printf("没找到学生信息!"); //找不到信息 } } void norich(struct infor *head) //定义一个函数,查找不及格学生 { struct infor *p; p=head; int num,
35、i=0; float toa; printf("请输入要查询成绩学生学号:"); scanf("%d",&num); if(num==p->no) { printf("正在查询该学生成绩,请稍侯>>>>>\n"); //查询学生成绩,输出不及格科目 while(p!=NULL) { if(p->chinese<60) { printf("该学生语文不及格!\n"); printf("\n"); i++; }
36、 if(p->math<60) //输出该学生不及格科目 { printf("该学生数学不及格!\n"); printf("\n"); i++; } if(p->english<60) { printf("该学生英语不及格!\n"); //对各门成绩进行判定 printf
37、"\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=
38、p->chinese+p->math+p->english+p->computer; if(toa<240) printf("不及格学生名单为:%s ",p->name); //输出不及格学生名单 p=p->link; } } } void search(struct infor *head) //定义一个查询学生信息函数,调用各子函数,进行查询 { char k,ch; struct infor *p=head;
39、 while(p!=NULL) //设置循环控制条件 { //输出查询方法 printf("\t\t\t 你要选择何种方法查询成绩!\n"); printf("\t~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); printf("\t\t\t a、学号: \n"); printf("\
40、t\t\t b、班级: \n"); printf("\t\t\t c、学期: \n"); printf("\t\t\t d、不及格学生: \n"); printf("\t~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); fflush(stdin); scanf("%c",&k); switch(k) { case 'a':checkno(head);break; //调用学号函数
41、 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; //跳出循环,返回主菜单
42、 } } //****************************************************************************** //函数功效:对学生成绩进行统计,按班级求总分及平均分 //****************************************************************************** void zong(struct infor *head) //对该班级学生成绩求总分、平均分 { float toa=0,
43、ave=0; int i=0; struct infor *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"); prin
44、tf("已经统计了第%d个学生成绩!\n",i+1); //统计完成 printf("\n"); i++; p=p->link; //指向下一个结点 } } void paixu(struct infor *head) //对该班级学生成绩进行排序 { int i=0,j; float a[10],t; //把结点信
45、息输入到数组,然后排序
struct infor *p=head;
while(p!=NULL)
{
a[i]=p->chinese+p->math+p->computer+p->english;
i++;
p=p->link;
}
for(j=0;j<4;j++) //用数组排序
for(i=0;i<3-j;i++)
if(a[i] 46、 a[i]=a[i+1];
a[i+1]=t;
i++;
}
for(i=0;i<4;i++) //输出排序后总分
printf("%f ",a[i]);
}
void deal(struct infor * head) //按学号和班级对学生成绩进行统计
{
struct infor *p;
p=head;
int clas;
char ch1,ch2;
printf("请输入要统计成绩班级(1或2):"); 47、 //输入要统计成绩班级
scanf("%d",&clas);
printf("正在统计该班级学生总分,请稍侯!!!\n");
while(1) //设置循环控制条件
{
zong(p); //调用总分函数
printf("是否还要继续统计其它学生成绩(y/n):");
fflush(stdin);
if((ch1=getchar())=='n')break; 48、
}
printf("是否要对该班学生成绩进行排序(y/n):");
fflush(stdin); //清盘
if((ch2=getchar()!='n'))
{printf("正在对该班学生总分进行排序,请稍侯!!!\n");
paixu(p); //调用排序函数
printf("\n");}
}
//**************************** 49、
//函数功效:信息浏览,查看库中全部统计
//******************************************************************************
struct infor *view(struct infor *head)
{
struct infor *p;
p=head;
printf("--------------------------------------------------------------- 50、\n");
printf("学期\t学号\t班别\t姓名\t语文\t数学\t英语\t计算机\t\n");
printf("-------------------------------------------------------------------------\n");
while(p!=NULL)
{
printf("%d\t",p->term); //查询学期
printf("%d






