学生成绩管理系统实验C语言.docx
- 文档编号:12639831
- 上传时间:2023-04-21
- 格式:DOCX
- 页数:29
- 大小:411.09KB
学生成绩管理系统实验C语言.docx
《学生成绩管理系统实验C语言.docx》由会员分享,可在线阅读,更多相关《学生成绩管理系统实验C语言.docx(29页珍藏版)》请在冰豆网上搜索。
学生成绩管理系统实验C语言
学生成绩管理系统
一,实验目的
用C语言实现基本的学生成绩管理系统的基本功能,完成既定要求。
二,需要处理的基础数据
学生基本信息包括:
①学号(如2010级14班6号写作20101406)
②姓
③名
④性别
⑤出生年月日
⑤课程对应的考试成绩(外语SCORE[0]、高数SCORE[1]、C语言SCORE[2]、马哲SCORE[3])
平均成绩和总成绩
三,系统功能
1学生基本情况录入。
要求对输入的性别、出生年月日的合理性进行判断(如0代表“女”,1代表“男”,输入其他值非法,年龄不能为负,月份不能大于13等)。
2允许对已经录入的数据进行显示。
3允许进行数据的插入。
4删除基本数据的相关信息。
5基于姓名的查询。
如:
姓张的所有同学。
6基于各种基本数据的统计计算。
如:
①统计每个学生各门功课的平均成绩,并按平均成绩从高到低的次序排名输出每个学生各门功课的综合成绩和平均成绩(名次、学号、姓名、平均成绩、各门功课的考试成绩)。
②列出90分及以上、80分及以上、70分及以上、60分及以上、不及格学生清单(学号、姓名、不及格的课程和成绩)。
③统计并输出各门功课的平均成绩和总平均成绩。
④按班级统计并输出总成绩(需对学号进行解析)。
四,系统功能模块图
五,数据结构设计
structSt
{
charIDNumber[16];//学号
charFamilyName[16];//姓
charGivenName[16];//名
intsex;//性别(0女,1男)
intBirthYear;//出生年
intBirthMonth;//出生月
intBirthDay;//出生日
floatscore[4];//成绩
floatsum;//总分
floataverage;//平均分
structSt*next;
};
六,程序结构流程图
七,模块功能
在结构流程图中已经给出。
八,实验结果
体会:
这个实验较上一个比起来更困难一些,不过经过和同学们的探讨和自己的努力最终完成了这个实验的基本要求,从中我受益匪浅,对以前学习的知识进行了进一步的巩固,对以后的学习有着很大的帮助。
附录:
#include
#include
#include
#include
#include
#include
structSt
{
charIDNumber[16];//学号
charFamilyName[16];//姓
charGivenName[16];//名
intsex;//性别(0女,1男)
intBirthYear;//出生年
intBirthMonth;//出生月
intBirthDay;//出生日
floatscore[4];//成绩
floatsum;//总分
floataverage;//平均分
structSt*next;
};
voidInput(structSt*head,structSt*per);//录入学生数据
intdel(structSt*head,charIDNumber[]);//删除学生数据
voidaverage(structSt*head);//按照平均分排序
voidlistprint(structSt*head);//链表中学生信息输出
intsearchname(structSt*head,charFamilyName[],charGivenName[]);
//按照姓名查询信息
intfsave(structSt*head);//将链表中的数据保存到文件中
intfread(structSt*head,FILE*fp);//读取文件信息
intclasearch(structSt*head);//按班级查找
intgrades(structSt*head);//计算学生的总分和平均分
intmain()
{
printf("\t\t$********************$$**********************$\t\t\t\n");
printf("\t\t¥**************学生成绩管理系统*************¥\t\t\t\n");
printf("\t\t$********************$$**********************$\t\t\t\n");
structSt*head=(structSt*)malloc(sizeof(structSt));
head->next=NULL;
charIDNumber[16];
charFamilyName[16];
charGivenName[16];
FILE*fp=NULL;
inti=1;
while(i!
=9)
{
printf("\t\t1.输入学生信息\n");
printf("\t\t2.按学号从表中删除学生信息\n");
printf("\t\t3.显示链表中所有记录\n");
printf("\t\t4.按照姓名查找记录\n");
printf("\t\t5.将链表中记录保存到文件中\n");
printf("\t\t6.从文件中读入记录\n");
printf("\t\t7.计算所有学生的总分和平均分\n");
printf("\t\t8.按班级查询显示学生总分\n");
printf("\t\t9.退出\n");
printf("请选择:
");
scanf("%d",&i);
switch(i){
case1:
system("cls");
if(head==NULL){
printf("数据出错!
");
exit(0);
}
else
{
structSt*per=(structSt*)malloc(sizeof(structSt));
per->next=NULL;
Input(head,per);
}
break;
case2:
system("cls");
printf("\t\t\t删除学生信息\n");
printf("请输入要删除的学生的学号:
");
scanf("%s",IDNumber);
del(head,IDNumber);break;
case3:
system("cls");
printf("\t\t\t显示链表中学生信息\n");
listprint(head);break;
case4:
system("cls");
printf("\t\t\t学生信息查询\n");
printf("请输入要查询学生的姓:
");
scanf("%s",FamilyName);
printf("请输入要查询学生的名:
");
scanf("%s",GivenName);
searchname(head,FamilyName,GivenName);break;
case5:
system("cls");
fsave(head);break;
case6:
system("cls");
fread(head,fp);break;
case7:
system("cls");
grades(head);break;
case8:
system("cls");
clasearch(head);break;
case9:
return1;
default:
break;
}
}
return1;
}
voidInput(structSt*head,structSt*per)//录入学生数据
{
structSt*p=head->next;
if(p!
=NULL)
{
while(p->next!
=NULL)
p=p->next;
p->next=per;
}
else
head->next=per;
printf("\t\t\t录入学生信息\n");
printf("请输入学生的学号:
");
scanf("%s",per->IDNumber);
printf("请输入学生的姓:
");
scanf("%s",per->FamilyName);
printf("请输入学生的名:
");
scanf("%s",per->GivenName);
do{
printf("请输入学生的性别(0女,1男):
");
scanf("%d",&per->sex);
if(1!
=per->sex&&0!
=per->sex)
printf("您输入的性别有误!
\n");
}while(1!
=per->sex&&0!
=per->sex);
structtm*ptm;//当前时间获取
longts;
inty,m,d,h,n,s;
ts=time(NULL);
ptm=localtime(&ts);
y=ptm->tm_year+1900;/*年*/
m=ptm->tm_mon+1;/*月*/
d=ptm->tm_mday;/*日*/
h=ptm->tm_hour;/*时*/
n=ptm->tm_min;/*分*/
s=ptm->tm_sec;/*秒*/
do{
printf("请输入出生年:
");
scanf("%d",&per->BirthYear);
if(per->BirthYear>y)
printf("您输入的年份有错请重新输入!
\n");
}while(per->BirthYear>y);
do{
printf("请输入出生月:
");
scanf("%d",&per->BirthMonth);
if(per->BirthMonth>12)
printf("您输入的月份份有错请重新输入!
\n");
}while(per->BirthMonth>12);
do{
printf("请输入出生日:
");
scanf("%d",&per->BirthDay);
if(per->BirthDay>31)
printf("您输入的日期有错请重新输入!
\n");
}while(per->BirthDay>31);
printf("外语:
");
scanf("%f",&per->score[0]);
printf("高数:
");
scanf("%f",&per->score[1]);
printf("C语言:
");
scanf("%f",&per->score[2]);
printf("马哲:
");
scanf("%f",&per->score[3]);
per->average=(per->score[0]+per->score[1]+per->score[2]+per->score[3])/4;
per->sum=per->score[0]+per->score[1]+per->score[2]+per->score[3];
}
intdel(structSt*head,charIDNumber[])//删除学生数据
{
if(head->next==NULL)
{
printf("数据列表为空,无法删除!
\n");
return0;
}
else
{
structSt*p=head->next;
structSt*pfront=head;
while(p!
=NULL&&strcmp(p->IDNumber,IDNumber)!
=0)
{
pfront=p;
p=p->next;
}
if(p==NULL)
printf("记录中没有发现您要删除的人\n");
else
{
pfront->next=p->next;
free(p);
printf("该生信息已删除\n");
}
return1;
}
}
voidaverage(structSt*head)//按照平均分将列表排序
{
structSt*p,*q,*m,*n;
structSt*temp1;
if(head->next==NULL)
printf("NOLINKLIST!
!
!
");
else
{
p=head;q=head->next;
while(q->next!
=NULL)
{
m=p->next;
n=q->next;
temp1=m;
while(temp1->next!
=NULL)
{
if(temp1->next->average
{
m=temp1;n=temp1->next;
}
temp1=temp1->next;
}/*此循环用于找到基准(q)以后的序列的最小的节点*/
if(m!
=p->next||(m==p->next&&m->average>n->average))
{
p->next=n;
p=n;
m->next=q;
m=q;
q=q->next;
n=n->next;
p->next=q;
m->next=n;
}/*此条件用于交换两个节点*/
else
{
p=p->next;
q=q->next;
}/*此条件用于没有找到最小值时的p,q后移操作*/
}/*外循环用于从前往后扫描,通过移动p,q指针实现*/
}
}
voidlistprint(structSt*head)//链表中学生信息输出
{
average(head);
if(head->next!
=NULL)
{
structSt*p=head->next;
while(p!
=NULL)
{
printf("学号:
%s姓氏:
%s名字:
%s性别:
%d\n出生年:
%d月:
%d日:
%d\n",p->IDNumber,p->FamilyName,p->GivenName,p->sex,p->BirthYear,p->BirthMonth,p->BirthDay);
printf("外语:
%f高数:
%fc语言:
%f马哲:
\n%f总分:
%f平均分:
%f\n",p->score[0],p->score[1],p->score[2],p->score[3],p->sum,p->average);
p=p->next;
}
}
else
{
printf("链表为空,请先输入数据\n");
}
}
intsearchname(structSt*head,charFamilyName[],charGivenName[])//按照姓名查询信息
{
if(head->next==NULL)
{
printf("数据列表为空,无法查询!
\n");
return0;
}
else
{
structSt*p=head->next;
while(p!
=NULL)
{
if(strcmp(p->FamilyName,FamilyName)==0&&strcmp(p->GivenName,GivenName)==0)
break;
p=p->next;
}
if(p==NULL)
printf("记录中并没有发现您要找的人!
\n");
else
{
printf("学号:
%s姓氏:
%s名字:
%s性别:
%d\n出生年:
%d月:
%d日:
%d\n",p->IDNumber,p->FamilyName,p->GivenName,p->sex,p->BirthYear,p->BirthMonth,p->BirthDay);
printf("外语:
%f高数:
%fc语言:
%f马哲:
\n%f总分:
%f平均分:
%f\n",p->score[0],p->score[1],p->score[2],p->score[3],p->sum,p->average);
}
return1;
}
}
intfsave(structSt*head)//将链表中的数据保存到文件中
{printf("\t\t\t文件保存\n");
FILE*fp;
if((fp=fopen("grades.txt","wb+"))==NULL)
{
printf("文件无法打开!
\n");
return1;
}
else
{
structSt*p=head->next;
while(p!
=NULL)
{
fwrite(p,sizeof(structSt),1,fp);
p=p->next;
}
fclose(fp);
printf("链表已经写入文件\n");
}
return1;
}
intfread(structSt*head,FILE*fp)//读取文件信息
{
printf("\t\t\t文件读取\n");
structSt*p,*p1;
p=p1=(structSt*)malloc(sizeof(structSt));
if((fp=fopen("grades.txt","rb"))==NULL)
{
printf("文件读取错误!
\n");
return1;
}
else
{printf("正在读取...\n");
while(!
feof(fp))
{
p=(structSt*)malloc(sizeof(structSt));
fread(p,sizeof(structSt),1,fp);
if(feof(fp))
break;
if(head->next==NULL)
head->next=p;
else
p1->next=p;
p1=p;
p1->next=NULL;
listprint(head);
}
fclose(fp);
printf("文件已读完\n");
}
return1;
}
intgrades(structSt*head)//计算有学生的总分和平均分
{
printf("\t\t\t计算学生的总分和平均分\n");
average(head);
structSt*p=head->next;
floattotalScore[4]={0,0,0,0};
floattotalAverage[4]={0,0,0,0};
intamount=0;
if(head->next==NULL)
{
printf("数据列表为空,无法计算所有学生的总分和平均分!
\n");
return0;
}
else
{
while(p!
=NULL)
{
totalScore[0]+=p->score[0];
totalScore[1]+=p->score[1];
totalScore[2]+=p->score[2];
totalScore[3]+=p->score[3];
amount++;
p=p->next;
}
totalAverage[0]=totalScore[0]/amount;
totalAverage[1]=totalScore[1]/amount;
totalAverage[2]=totalScore[2]/amount;
totalAverage[3]=totalScore[3]/amount;
printf("记录中共有%d个学生的信息,各科总分和平均分如下:
\n",amount);
printf("外语总分为:
%f\t\t外语平均分:
%f\n",totalScore[0],totalAverage[0]);
printf("高数总分为:
%f\t\t高数平均分:
%f\n",totalScore[1],totalAverage[1]);
printf("C语言总分为:
%f\t\tC语言平均分:
%f\n",totalScore[2],totalAverage[2]);
printf("马哲总分为:
%f\t\t马哲平均分:
%f\n",totalScore[3],totalAverage[3]);
}
printf("平均分90分以上的学生信息:
\n");
p=head->next;
while(p!
=NULL)
{
if(p->average>=90)
{
printf("学号:
%s姓氏:
%s名字:
%s性别:
%d出生年:
%d月:
%d日:
%d\n",p->IDNumber,p->FamilyName,p->GivenName,p->sex,p->BirthYear,p->BirthMonth,p->BirthDay);
printf("外语:
%f高数:
%fc语言:
%f马哲:
\n%f总分:
%f平均分:
%f\n",p->score[0],p->score[1],p->score[2],p->score[3],p->sum,p->average);
}
p=p->next;
}
printf("平均分80~90分的学生信息:
\n");
p=head->next;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 学生 成绩管理系统 实验 语言