资源描述
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;
主 函 数: int main()
新建函数:infor *init()
输入函数 :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)
按学号排序函数: infor *index(infor *h)
3 系统实现
3.1 题目一
(源代码)
#include<stdio.h>
#include<stdlib.h>
#include <string.h>
#define N 4
struct infor
{
int term; // 定义学期(1或2)
int no; //学号
int clas; //定义班级(1或2班)
char name[9]; //姓名
float chinese; //定义四门成绩
float english;
float math;
float computer;
struct infor *link;
};
int n=0 ;
//******************************************************************************
//函数功效:创建链表,录入学生相关信息,此函数返回一个指向链表头指针
//******************************************************************************
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(struct infor));
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); //链表返回头指针
}
//******************************************************************************
//函数功效:实现对学生信息修改
//******************************************************************************
void change(struct infor *head)
{
struct infor *p=head;
char ch,m;
char name[9]; //定义一个数组,存放学生姓名
int num;
if(p==NULL)printf("犯错!请先输入学生信息!");
while(1) //设置循环控制
{
printf("\t\t\t请选择要修改信息!\t\n");
printf("\t\t\t~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); // 输出要修改信息
printf("\t\t\t 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')
{
printf("你要修改信息是:学号!\n"); //按姓名修改学号
printf("请输入你要修改学生姓名:");
scanf("%s",name);
if (strcmp(name,p->name)==0)
{
printf("请输入该学生新学号:"); //输入新学号
scanf("%d",&p->no);
}
else printf("无法查找到该学生!\n"); //找不到信息
}
else if(ch=='b') //按学号修改该班级学生信息
{
printf("你要修改信息是:姓名!\n");
printf("请输入你要修改学生学号:");
scanf("%d",&num);
if(num==p->no) //输入学号,判定条件
{
printf("请输入该学生姓名:");
scanf("%s",p->name); //输入要做修改学生姓名
}
else printf("无法查找到该学生!\n"); //找不到信息
}
else if(ch=='c')
{
printf("你要修改信息是:班级!\n"); //按学号修改班级
printf("请输入你要修改学生学号:");
scanf("%d",&num);
if(num==p->no)
{
printf("请输入该学生班级:"); //输入要做修改班级
scanf("%d",p->clas);
}
else printf("无法查找到该学生!\n"); //找不到信息
}
else if(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);
}
else printf("无法查找该学生信息!\n"); //找不到信息
}
else printf("犯错!\n");
p=p->link;
printf("是否还要继续修改信息(y/n):"); //判定,是否还要修改信息,跳出循环
fflush(stdin);
if((m=getchar())=='n')break;
}
}
//******************************************************************************
//函数功效:根据学号查询学生信息
//******************************************************************************
void checkno(struct infor *head)
{ //按学号查询学生成绩
struct infor *p;
p=head;
int num,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("没找到该学生信息!"); //找不到信息
}
void checkclass(struct infor *head)
{
int banji,i=0;
struct infor *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("没找到学生信息!"); //输犯错误,找不到信息
}
}
void checkterm(struct infor *head) //定义按学期查找信息函数
{
int xueqi,i=0;
struct infor *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("没找到学生信息!"); //找不到信息
}
}
void norich(struct infor *head) //定义一个函数,查找不及格学生
{
struct infor *p;
p=head;
int num,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++;
}
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;
}
}
}
void search(struct infor *head) //定义一个查询学生信息函数,调用各子函数,进行查询
{
char k,ch;
struct infor *p=head;
while(p!=NULL) //设置循环控制条件
{ //输出查询方法
printf("\t\t\t 你要选择何种方法查询成绩!\n");
printf("\t~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
printf("\t\t\t a、学号: \n");
printf("\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; //调用学号函数
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; //跳出循环,返回主菜单
}
}
//******************************************************************************
//函数功效:对学生成绩进行统计,按班级求总分及平均分
//******************************************************************************
void zong(struct infor *head) //对该班级学生成绩求总分、平均分
{
float toa=0,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");
printf("已经统计了第%d个学生成绩!\n",i+1); //统计完成
printf("\n");
i++;
p=p->link; //指向下一个结点
}
}
void paixu(struct infor *head) //对该班级学生成绩进行排序
{
int i=0,j;
float a[10],t; //把结点信息输入到数组,然后排序
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]<a[i+1])
{
t=a[i];
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):"); //输入要统计成绩班级
scanf("%d",&clas);
printf("正在统计该班级学生总分,请稍侯!!!\n");
while(1) //设置循环控制条件
{
zong(p); //调用总分函数
printf("是否还要继续统计其它学生成绩(y/n):");
fflush(stdin);
if((ch1=getchar())=='n')break;
}
printf("是否要对该班学生成绩进行排序(y/n):");
fflush(stdin); //清盘
if((ch2=getchar()!='n'))
{printf("正在对该班学生总分进行排序,请稍侯!!!\n");
paixu(p); //调用排序函数
printf("\n");}
}
//******************************************************************************
//函数功效:信息浏览,查看库中全部统计
//******************************************************************************
struct infor *view(struct infor *head)
{
struct infor *p;
p=head;
printf("-------------------------------------------------------------------------\n");
printf("学期\t学号\t班别\t姓名\t语文\t数学\t英语\t计算机\t\n");
printf("-------------------------------------------------------------------------\n");
while(p!=NULL)
{
printf("%d\t",p->term); //查询学期
printf("%d
展开阅读全文