学生管理系统.docx
- 文档编号:24152363
- 上传时间:2023-05-24
- 格式:DOCX
- 页数:44
- 大小:654.92KB
学生管理系统.docx
《学生管理系统.docx》由会员分享,可在线阅读,更多相关《学生管理系统.docx(44页珍藏版)》请在冰豆网上搜索。
学生管理系统
一:
实验目的
使用标准C或C++实现一般管理系统的基本功能。
进一步巩固C语言的学习,培养一定的综合编程能力。
二:
需要处理的基础数据
学生基本信息包括:
学号(如2011级22班05号写作52112205)
姓
名
性别
出生年月日
课程对应的考试成绩(外语SCORE[0]、高数SCORE[1]、
C语言SCORE[2]、马哲SCORE[3])
平均成绩和总成绩
三:
本系统主要具备以下三个功能
1.学生基本情况录入。
要求对输入的性别、出生年月日的合理性进行判断(如0代 表“女”,1代表“男”,输入其他值非法,年龄不能为负, 月份不能大于13等)。
2.允许对已经录入的数据进行显示。
3.允许进行数据的插入。
4.删除基本数据的相关信息。
5.基于姓名的查询。
如:
姓张的所有同学。
6.基于各种基本数据的统计计算。
如:
①统计每个学生各门功课的平均成绩,并按平均成绩从高到低的次序排名输出每个学生各门功课的综合成绩和平均成绩(名次、学号、姓名、平均成绩、各门功课的考试成绩)。
②列出90分及以上、80分及以上、70分及以上、60分及以上、不及格学生清单(学号、姓名、不及格的课程和成绩)。
③统计并输出各门功课的平均成绩和总平均成绩。
④按班级统计并输出总成绩(需对学号进行解析)。
四:
数据结构设计及用法说明
需处理的车辆及违章基本信息包括:
学号、学生姓名、出生年、月、日,各科成绩。
这些信息采用结构体数据类型表示更为方便,因为违章信息数量的不确定性,所以信息应采用链表进行存储,这更符合实际应用
所以采用的数据结构如下
typedefstructSt1
{
charIDNumber[16];/*学号*/
charFamilyName[16];/*姓*/
charGivenName[16];/*名*/
intsex;/*性别(0代表“女”,1代表“男”)*/
intBirthYear;/*出生年*/
intBirthMonth;/*出生月*/
intBirthDay;/*出生日*/
floatscore[4];/*成绩*/
floatsum;/*总分*/
floataverage;/*平均分*/
structSt1*next;
};StudentNode
该程序中需要处理的基础数据有:
学生基本信息:
学号(例如2003级12班6号写作20031206)、姓、名、性别、出生年月日、课程名称(外语SCORE[0]、高数SCORE[1]、C语言SCORE[2]、马哲SCORE[3])、考试成绩等。
因此定义结构体重要包括所以要素,另外,本程序用链表方法来处理对象。
对象之间连接起来的程序为:
p1=p1->next.数据交换的代码为:
p2=p1->next;
P1->next=p2->next;
P2->next=p1;
P1=p2;
五:
各模块的功能
该程序包含的函数以及作用:
head=Enterlist()输入记录
head=Delet(head)从表中删除记录
Searchrecordonname(head)按照姓名查找记录
PrintfSavethefile(head)显示链表中所有记录
Loadthefile(head)从文件中读入记录
Computethescore(head)计算所有学生的总分和均分
Querybyclass(head)按班级查询显示学生成绩
head=Insert(head)插入记录到表中
exit(0)退出
sortbyaverage(head)以平均成绩排序
waiyu(head)输出英语成绩的平均分,总分,各分数段的同学的信息
gaoshu(head)输出高数成绩的平均分,总分,各分数段的同学的信息
cyuyan(head)输出c语言成绩的平均分,总分,各分数段的同学的信息
mazhe(head)输出马哲绩的平均分,总分,各分数段的同学的信息
bujige(head)输出不及格同学的信息
六:
程序结构图
七:
试验结果(包括输入数据和输出结果)
菜单:
输入1:
输入:
输入:
输入1返回菜单,再输入2:
输入:
输入:
返回主菜单,输入9,再输入信息:
返回主菜单,输入3:
返回主菜单输入4再输入a:
返回主菜单,输入5:
返回主菜单输入6再输入文件名:
返回主菜单输入8再输入14:
输入7:
输入2:
输入6:
八:
体会
编译过程中出现很多错误,其中有因为printf和scanf语句格式不对,落下了分号或者括号,还有用中文输入法打的括号和分号,这都会出现错误;菜单加入清屏代码system(“cls“);实参,时,会出现刚刚打印出来就刷屏了,看不到结果,因此在每个函数后都加上:
printf("输出结束,返回请按任意数字键.........");
scanf("%d",&l);语句,以解决此问题;
定义函数名不能有分号,不然软件会提出错误;函数定义格式和case后面引用函数格式相同,有形参的要传输形参;引用#include"time.h"
voidmain()
{
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;//秒
}
时,将此程序改为:
inttime()
{
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;//秒
returny;
}
这样才能引用此函数里所需要的值。
附录:
程序清单及源程序
#include
#include
#include
#include
#include
#include
#include
#defineNULL0
#defineLsizeof(structSt1)
structSt1
{
charIDNumber[16];/*学号*/
charFamilyName[16];/*姓*/
charGivenName[16];/*名*/
intsex;/*性别(0代表"女",1代表"男")*/
intBirthYear;/*出生年*/
intBirthMonth;/*出生月*/
intBirthDay;/*出生日*/
floatscore[4];/*成绩*/
floatsum;/*总分*/
floataverage;/*平均分*/
structSt1*next;
};
inttime()
{
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;//秒
returny;
}
structSt1*Enterlist(void)//输入记录
{
system("cls");
inti,m,y;
structSt1*head;
structSt1*p1,*p2;
intk;
intn=0;
y=time();
printf("\n\n******输入学生信息******\n\n");
for(k=0;k<1000;k++)
{
if(n==0)
{
p1=p2=(structSt1*)malloc(L);
head=NULL;
}
printf("\n请输入学生的学号:
");//输入学号
scanf("%s",&p1->IDNumber);
printf("\n请输入学生的姓:
");//输入姓
scanf("%s",&p1->FamilyName);
printf("\n请输入学生的名:
");//输入名
scanf("%s",&p1->GivenName);
for(i=0;i<1000;i++)//输入性别
{
printf("\n请输入学生的性别(0代表女,1代表男):
");
scanf("%d",&p1->sex);
if(p1->sex==0||p1->sex==1)break;
printf("\n输入有误,");
}
for(i=0;i<1000;i++)//输入年
{
printf("\n请输入学生的出生年:
");
scanf("%d",&p1->BirthYear);
if(y-p1->BirthYear<100&&y-p1->BirthYear>0)break;
printf("\n输入有误,");
}
for(i=0;i<1000;i++)//输入月
{
printf("\n请输入学生的出生月:
");
scanf("%d",&p1->BirthMonth);
if(p1->BirthMonth>0&&p1->BirthMonth<13)break;
printf("\n输入有误,");
}
for(i=0;i<1000;i++)//输入日
{
printf("\n请输入学生的出生日:
");
scanf("%d",&p1->BirthDay);
if(p1->BirthDay>0&&p1->BirthDay<32)break;
printf("\n输入有误,");
}
printf("\n******请输入学生的成绩******\n");//输入成绩
for(i=0;i<4;i++)
switch(i)
{
case0:
printf("请输入学生的英语成绩\n");scanf("%f",&p1->score[0]);break;
case1:
printf("请输入学生的高数成绩\n");scanf("%f",&p1->score[1]);break;
case2:
printf("请输入学生的C语言成绩\n");scanf("%f",&p1->score[2]);break;
case3:
printf("请输入学生的马哲成绩\n");scanf("%f",&p1->score[3]);break;
}
p1->sum=p1->score[0]+p1->score[1]+p1->score[2]+p1->score[3];
p1->average=p1->sum/4;
n=n+1;
if(n==1)head=p1;
elsep2->next=p1;
p2=p1;
p1=(structSt1*)malloc(L);
printf("\n\n******输入结束请按1,继续输入请按任意数字键******\n\n");
scanf("%d",&m);
if(m==1)
{
p2->next=NULL;
break;
}
}
return(head);
}
voidPrintlist(structSt1*head)
{
system("cls");
structSt1*p;
into,l;
printf("\n******链表中所有记录如下******\n");
p=head;
if(head!
=NULL)
for(o=0;o<1000;o++)
{
do
{
printf("\n学号:
%s\t姓:
%S名:
%s性别(0代表女,1代表男):
%d出生年:
%d出生月:
%d\t出生日:
%d",p->IDNumber,p->FamilyName,p->GivenName,p->sex,p->BirthYear,p->BirthMonth,p->BirthDay);
printf("\n英语:
%f分\t高数:
%f分\tc语言:
%f分\t马哲:
%f分",p->score[0],p->score[1],p->score[2],p->score[3]);
printf("\n总分:
%f\t平均分:
%f\n",p->sum,p->average);
p=p->next;
}
while(p!
=NULL);
printf("输出结束,返回请按任意数字键.........");
scanf("%d",&l);
if(l!
=NULL)break;
}
}
structSt1*Delet(structSt1*head)//从表中删除记录
{
system("cls");
charnumber[16];
intu;
printf("\n\n******删除学生信息******\n\n");
for(u=0;u<1000;u++)
{
printf("请输入想要删除学生的学号:
");
scanf("%s",number);
//查找要删除的结点
structSt1*p1,*p2;
p1=head;
while(p1)
{
if(strcmp(p1->IDNumber,number)==0)
break;
else
{
p2=p1;
p1=p1->next;
}
}
//删除结点
if(p1!
=NULL)//若找到结点,则删除
{
if(p1==head)//若要删除的结点是第一个结点
{
head=p1->next;
}
else//若要删除的结点是后续结点
{
p2->next=p1->next;
}
printf("\n找到学号为%s的学生,并已删除.......\n",p1->IDNumber);
}
else//未找到结点
printf("\n未找到想要删除的学生!
\n");
printf("删除结束,继续删除请按1,返回请按任意键.........");
scanf("%d",&u);
if(u!
=1)break;
}return(head);
}
voidSavethefile(structSt1*head)//保存到文件
{
system("cls");
FILE*fp;
system("cls");
structSt1*p=head;
charc[5];
charfilename[16];
intq;
printf("\n**************************************\n");
printf("\n**************************************\n");
printf("\n\n******保存文件******\n\n");
printf("\n保存学生信息(将覆盖原文件),是否继续?
[Y/N]:
");
scanf("%s",c);
if(strcmp(c,"Y")!
=0)return;
printf("\n\n请输入文件名:
");
scanf("%s",filename);
if((fp=fopen(filename,"w+"))==NULL)
{
printf("\n不能打开文件\n");
}
if((fp=fopen(filename,"w+"))!
=NULL)
{
while(p)//写入文件
{
if(fwrite(p,L,1,fp)!
=1)
printf("\n保存错误");
p=p->next;
}
fclose(fp);
printf("\n保存完毕.......");
}
printf("返回请按任意数字键.........");
scanf("%d",&q);
}
structSt1*Loadthefile()//读取文件
{
system("cls");
structSt1*p,*head1,*w;
intq,n;
n=0;
FILE*fp;
head1=NULL;
p=(structSt1*)malloc(L);
charfilename2[16];
printf("\n**************************************\n");
printf("\n**************************************\n");
printf("\n\n******读取文件******\n\n");
printf("\n\n请读取输入文件名:
");
scanf("%s",filename2);
if((fp=fopen(filename2,"r+"))==NULL)
{
printf("\n不能打开文件\n");
returnhead1;
}
while(!
feof(fp))
{
if(fread(p,L,1,fp)!
=1)break;
n++;
if(n==1)head1=p;
printf("\n学号:
%s姓:
%S名:
%s性别(0代表女,1代表男):
%d出生年:
%d出生月:
%d出生日:
%d\n",p->IDNumber,p->FamilyName,p->GivenName,p->sex,p->BirthYear,p->BirthMonth,p->BirthDay);
printf("\n\t英语:
%f分\t高数:
%f分\tc语言:
%f分\t马哲:
%f分\t总分:
%f\t平均分:
%f\t\n",p->score[0],p->score[1],p->score[2],p->score[3],p->sum,p->average);
p->next=(structSt1*)malloc(L);
w=p;
p=p->next;
}
w->next=NULL;
fclose(fp);
printf("\n学生信息已经装入......\n");
printf("返回请按任意数字键.........");
scanf("%d",&q);
returnhead1;
}
structSt1*Insert(structSt1*head)//插入节点
{
system("cls");
printf("\n**************************************\n");
printf("\n**************************************\n");
printf("\n\n******插入记录到表中******\n\n");
intn,y,i,t;
structSt1*p0,*p1,*p2;
structSt1*stu;
y=time();
p1=head;
for(t=0;t<1000;t++)
{
stu=(structSt1*)malloc(L);
while(p1)
{n++;p1=p1->next;}
printf("\n请输入插入学生信息:
\n\n");
printf("\n请输入学生的学号:
");
scanf("%s",&stu->IDNumber);
printf("\n请输入学生的姓:
");
scanf("%s",&stu->FamilyName);
printf("\n请输入学生的名:
");
scanf("%s",&stu->GivenName);
for(i=0;i<1000;i++)//输入性别
{
printf("\n请输入学生的性别(0代表女,1代表男):
");
scanf("%d",&stu->sex);
if(stu->sex==0||stu->sex==1)break;
printf("\n输入有误,");
}
for(i=0;i<1000;i++)//输入年
{
printf("\n请输入学生的出生年:
");
scanf("%d",&stu->BirthYear);
if(y-stu->BirthYear<100&&y-stu->BirthYear>0)break;
printf("\n输入有误,");
}
for(i=0;i<1000;i++)//输入月
{
printf("\n请输入学生的出生月:
");
scanf("%d",&stu->BirthMonth);
if(stu->BirthMonth>0&&stu->BirthMonth<13)break;
printf("\n输入有误,");
}
for(i=0;i<1000;i++)//输入日
{
printf("\n请输入学生的出生日:
");
scanf("%d",&stu->BirthDay);
if(stu->BirthDay>0&&stu->BirthDay<32)break;
printf("\n输入有误,");
}
printf("\n******请输入学生的成绩******\n");
for(i=0;i<4;i++)
{
switch(i)
{
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 学生 管理 系统