基于c++学生成绩管理系统.docx
《基于c++学生成绩管理系统.docx》由会员分享,可在线阅读,更多相关《基于c++学生成绩管理系统.docx(19页珍藏版)》请在冰点文库上搜索。
基于c++学生成绩管理系统
学生成绩信息管理系统的开发
一、引言
学生成绩信息管理系统,是针对学生的成绩及其他信息整理,方便信息的整合和查询。
本次设计的程序是对学生成绩信息管理系统的初步的开发和应用。
它是一个教育单位不可缺少的部分,它的内容对于学校的决策者和管理者来说都至关重要,它能够为用户提供充足的信息和快捷的查询手段。
能有效的帮助学校和老师掌握学生的情况,为学生提供成绩跟课程方面的查询。
学生成绩管理系统可使学院教职员工减轻工作压力,比较系统地对教务、教学上的各项服务和信息进行管理,同时,可以减少劳动力的使用,加快查询速度、加强管理。
随着科学技术的不断提高,计算机科学日渐成熟,使用日趋成熟的计算机技术来代替传统的人工模式,来实现学生信息的现代化管理,其强大的功能已为人们深刻认识,它已进入人类社会的各个领域并发挥着越来越重要的作用。
作为计算机应用的一部分,使用计算机对学生信息进行管理,具有着手工管理所无法比拟的优点.例如:
检索迅速、查找方便、易修改、可靠性高、存储量大、数据处理快捷、寿命长成本低等。
这些优点能够极大地提高学生信息管理系统论文的效率,也是学校的科学化、正规化管理,与世界接轨的重要条件。
用计算机制作的学生信息管理系统论文还可以通过功能强大的Internet网及时的向学生的家长传递该生在校的最新成绩,有助于学校与家长的信息互动,为更好地把握学校的教育方针起到了一定的促进作用。
因此,开发这样一套管理软件成为很有必要的事情。
二、项目计划
根据要求,由于学生信息是存放在文件中,所以应提供文件的输入,输出等操作;在程序中需要浏览学生的信息,应提供显示,查找,排序等操作;另外还应提供键盘式选择菜单实现功能选择.
三、需求分析
1、设计的任务是:
(1)将学生的基本信息录入计算机;
(2)将学生成绩信息录入计算机;
(3)可以对学生成绩通过班级号进行查询;
(4)可以对学生的成绩进行删除;
(5)可以对学生的成绩进行修改;
(6)可以通过考试的学生信息。
2、已知:
输入学生的姓名、学号、班级、成绩。
程序的输出信息主要是:
按照班级可以查询时每一个学生的姓名,学号及平均课程成绩,操作完成后,程序可以对文件进行保存,然后退出系统。
四、总体设计
根据上面的需求分析,可以将这个系统分为以下模块:
输入模块,修改模块,删除模块,查询模块,显示模块.
学生成绩管理系统
数据输入
数据显示
数据修改
数据删除
数据查询
五、概要设计
1、主函数
主函数一般设计得比较简单,只提供输入,处理和输出部分的函数调用,其中各功能模块用菜单方式选择
.
流程图:
显示一系列功能模块
输入n,判断n是否是A--F
N
根据n的值调用各功能模块函数
Y
程序如下:
voidmain()
{
charchoice;//菜单选择项
charclassname[6];//输入的班级名称
intnumb;//输入的学号
do{
printf("\t\t**********************\n"
"\t\t*学生信息管理*\n"
"\t\t**********************\n\n"
"\t┏━━━━━━━━━━━━━━━━━━┓\n"
"\t┃1.录入学生基本信息┃\n"
"\t┃2.录入成绩信息┃\n"
"\t┃┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┃\n"
"\t┃3.修改学生成绩┃\n"
"\t┃┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┃\n"
"\t┃4.删除学生全部信息┃\n"
"\t┃┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┃\n"
"\t┃5.按[班级]查询学生基本信息┃\n"
"\t┃6.按[班级]查询成绩┃\n"
"\t┃7.显示通过考试的学生信息┃\n"
"\t┃┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┃\n"
"\t┃8.退出┃\n"
"\t┗━━━━━━━━━━━━━━━━━━┛\n\n"
"请输入您的选择(数字1-8):
");
scanf("\n%c",&choice);
system("cls");
switch(choice)
{
case'1':
printf("\t\t录入学生基本信息\n\n");
addinfo();//录入学生基本信息
break;
case'2':
printf("\t\t录入学生成绩\n\n");
printf("请先输入班级名称:
");
scanf("%5s",classname);
addscore(classname);//录入成绩信息
break;
case'3':
printf("\t\t修改学生成绩\n\n");
printf("请先输入要修改的班级名称和学号:
");
scanf("%5s%d",classname,&numb);
updatescore(classname,numb);
break;
case'4':
printf("\t\t删除学生全部信息\n\n");
printf("请先输入要删除的班级名称和学号:
");
scanf("%5s%d",classname,&numb);
deleteall(classname,numb);
break;
case'5':
printf("\t\t按[班级]查询学生信息\n\n");
queryclass();//按[班级]查询学生基本信息
break;
case'6':
printf("\t\t按[班级]查询成绩\n\n");
queryclassscore();//按[班级]查询成绩
break;
case'7':
printf("\t\t显示通过考试的学生信息\n\n");
querypass();//显示通过考试的学生信息
break;
case'8':
printf("程序退出。
\t谢谢使用!
:
)\n\n");
exit(0);
default:
printf("您的输入有误,请重试!
\n\n");
fflush(stdin);
break;
}
printf("\n按任意键返回......");
getch();
system("cls");
}while(choice!
='8');
}
2、输入模块
单独看各数据信息,学号,姓名是字符型,可以采用字符型数组;分数为整数,采用整数;数据信息存放在文件中,一条记录对应一个学生,既符合习惯又方便信息管理.
程序如下:
voidaddinfo()
{
charflag;//是否继续输入
charclas[6];//输入的班级名称
intnewno;
if((fpinfo=fopen("info.dat","ab+"))==NULL)//以追加方式打开学生信息表"info.dat"
{
printf("文件打开失败.\n");
exit
(1);
}
do
{
printf("请输入学生基本信息");
printf("\n\t学生所在班级名称:
");
scanf("%5s",&clas);//输入的班级名称
if(strlen(clas)<1)
{
printf("请输入班级名称.\n");;
return;
}
newno=0;
rewind(fpinfo);//文件指针置于文件开始位置
while(fread(&stu,sizeof(stuinfo),1,fpinfo)==1)//从文件中查找是否已经存在该班级的记录,如果存在找出最大学号
if(strcmp(stu.classes,clas)==0)
{
if(newnonewno=stu.numb;
}
strcpy(stu.classes,clas);
printf("\t班内学号:
");
stu.numb=newno+1;//自动生成该班级的学号=最大学号+1
printf("%d",newno+1);
printf("\n\t学生姓名:
");
scanf("%19s",&stu.name);
if(strlen(stu.name)<1)
{
printf("请输入学生名字.\n");;
return;
}
stu.avgscore=0.0;//向文件中追加记录时,平均成绩默认值为0
fwrite(&stu,sizeof(stuinfo),1,fpinfo);//将输入的结构体数据保存到文件中
printf("继续输入吗?
:
");
scanf("\n%c",&flag);
}while(flag=='Y'||flag=='y');
fclose(fpinfo);
return;
}
/****************************************/
/*录入学生成绩信息*/
//首先输入要录入班级名称,且该班级必须在info.dat中存在,然后再输入相应数据
/****************************************/
voidaddscore(charname[])
{
charflag,flagname='n',flagnumbi='n',flagnumbs='n';//是否继续输入,是否班级名称存在,info.dat是否学号存在,score.dat是否学号存在
intnumb;
if((fpinfo=fopen("info.dat","rb+"))==NULL)//打开学生基本信息文件"info.dat"
{
printf("info.dat文件打开失败.\n");
return;
}
while(fread(&stu,sizeof(stuinfo),1,fpinfo)==1)
{
if(strcmp(name,stu.classes)==0)//通过循环在文件"info.dat"中查找是否有该班级的记录
{
flagname='y';//如果文件"info.dat"中存在该班级的记录,则flagname='y',循环结束
break;
}
else
flagname='n';
}
if(flagname=='n')//如果文件"info.dat"中不存在该班级的记录,关闭文件,函数结束
{
printf("info.dat文件中没有%s班级.\n",name);
fclose(fpinfo);
return;
}
if((fpscore=fopen("score.dat","ab+"))==NULL)//如果文件"info.dat"中存在该班级的记录,以追加方式打开成绩文件"score.dat"
{
printf("文件打开失败.\n");
return;
}
do
{
printf("\n\t请输入学号:
");//输入学号
scanf("%d",&numb);
//numb=atoi(cnumb);
rewind(fpinfo);//"info.dat"文件指针指向文件开始位置
while(fread(&stu,sizeof(stuinfo),1,fpinfo)==1)
{
if((strcmp(name,stu.classes)==0)&&stu.numb==numb)//判断"info.dat"文件中是否存在该班级该学号的记录
{
flagnumbi='y';
rewind(fpscore);//如果存在,"score.dat"文件指针指向文件开始位置
while(fread(&score,sizeof(structallscores),1,fpscore)==1)//循环判断"score.dat"文件中是否已经存在该学号的记录
{
if((strcmp(name,score.classes)==0)&&score.numb==numb)
{
flagnumbs='y';//如果"score.dat"文件中存在该班级该学号的记录,flagnumbs='y'
break;
}
else
flagnumbs='n';
}
break;
}
else
flagnumbi='n';
}
if(flagnumbi=='n'||(flagnumbi=='y'&&flagnumbs=='y'))//如果"info.dat","score.dat"文件都存在,则不允许向"score.dat"追加成绩信息
{
printf("info.dat文件中没有学号为%d学生信息,或者score.dat文件中已经存在改学号学生的成绩\n",numb);
fclose(fpinfo);
fclose(fpscore);
return;
}
strcpy(score.classes,name);//给结构score的classes成员赋值--班级名称
score.numb=numb;//学号
printf("\n\t请输入C语言的成绩:
");
scanf("%f",&score.c_score);//C语言的成绩
printf("\t请输入SQL语言的成绩:
");
scanf("%f",&score.sql_score);//SQL语言的成绩
printf("\t请输入VB语言的成绩:
");
scanf("%f",&score.vb_score);//VB语言的成绩
stu.avgscore=(score.c_score+score.sql_score+score.vb_score)/3.0f;//计算平均成绩
fseek(fpinfo,-1L*(long)sizeof(stuinfo),SEEK_CUR);//修改"info.dat"中该班级该学号的记录
fwrite(&stu,sizeof(stuinfo),1,fpinfo);
fseek(fpinfo,0,SEEK_CUR);//SEEK_CUR当前位置
fwrite(&score,sizeof(structallscores),1,fpscore);//向"score.dat"文件追加记录
printf("继续输入吗?
:
");
scanf("\n%c",&flag);
}while(flag=='Y'||flag=='y');
fclose(fpscore);
fclose(fpinfo);
return;
}
3、修改模块
用户输入要修改学生的成绩,根据学生的学号和班级名称信息查找学生记录,并提示用户修改该记录的哪部分信息.根据用户选择修改相应的信息.
流程图:
输入要修改的成绩
YN
Y
N
程序如下:
voidupdatescore(charname[],intnumb)
{
charflaginfo='n',flagscore='n';
if((fpinfo=fopen("info.dat","rb+"))==NULL)//打开学生基本信息文件"info.dat"
{
printf("info.dat文件打开失败.\n");
return;
}
while(fread(&stu,sizeof(stuinfo),1,fpinfo)==1)
if(strcmp(name,stu.classes)==0&&stu.numb==numb)//通过循环在文件"info.dat"中查找是否有该班级的记录
{
flaginfo='y';
break;
}
if((fpscore=fopen("score.dat","rb+"))==NULL)//以读写方式打开学生基本信息文件"score.dat"
{
printf("score.dat文件打开失败.\n");
return;
}
while(fread(&score,sizeof(structallscores),1,fpscore)==1)
if((strcmp(name,score.classes)==0)&&score.numb==numb)
{
flagscore='y';
break;
}
if(flaginfo=='y'&&flagscore=='y')
{
printf("\n\t请重新输入C语言的成绩:
");
scanf("%f",&score.c_score);//C语言的成绩
printf("\t请重新输入SQL语言的成绩:
");
scanf("%f",&score.sql_score);//SQL语言的成绩
printf("\t请重新输入VB语言的成绩:
");
scanf("%f",&score.vb_score);//VB语言的成绩
stu.avgscore=(score.c_score+score.sql_score+score.vb_score)/3.0f;//计算平均成绩
fseek(fpinfo,-1L*(long)sizeof(stuinfo),SEEK_CUR);//修改"info.dat"中该班级该学号的记录
fwrite(&stu,sizeof(stuinfo),1,fpinfo);
fseek(fpinfo,0,SEEK_CUR);
fseek(fpscore,-1L*(long)sizeof(structallscores),SEEK_CUR);//修改"info.dat"中该班级该学号的记录
fwrite(&score,sizeof(structallscores),1,fpscore);//向"score.dat"文件追加记录
fseek(fpscore,0,SEEK_CUR);
fclose(fpinfo);
fclose(fpscore);
printf("\t恭喜您!
!
成绩修改成功!
");
}
}
四、删除模块
该模块的功能是,用户输入要删除的学生的信息,根据学生学号和班级查找记录并删除.
YN
N
Y
N
Y