学生证管理系统.docx
《学生证管理系统.docx》由会员分享,可在线阅读,更多相关《学生证管理系统.docx(55页珍藏版)》请在冰豆网上搜索。
![学生证管理系统.docx](https://file1.bdocx.com/fileroot1/2023-1/22/085381aa-75ee-4d71-a29f-ec8a9083a5ae/085381aa-75ee-4d71-a29f-ec8a9083a5ae1.gif)
学生证管理系统
C语言课程设计报告
学院:
地球科学学院
专业:
资源环境与城乡规划管理
题目:
学生证管理系统
班号:
xxxxxxxx
姓名:
李仙伟
学号:
xxxxxxxx
指导教师:
张锋
2010年11月26日
报告目录
一、课程设计目的………………………………………………………………3
二、实习内容及要求……………………………………………………………3
三、需求分析……………………………………………………………………3
四、总体分析……………………………………………………………………3
五、详细设计……………………………………………………………………4
5.0头文件及结构体……………………………………………………………4
5.1主函数………………………………………………………………………4
5.2菜单模块……………………………………………………………………5
5.3公共函数……………………………………………………………………6
5.4添加模块……………………………………………………………………10
5.5修改模块……………………………………………………………………10
5.6浏览模块…………………………………………………………………11
5.7查询模块…………………………………………………………………11
5.7.1按学号查询……………………………………………………………12
5.7.2按名字查询……………………………………………………………13
5.7.3按班级查询……………………………………………………………14
5.8统计模块…………………………………………………………………14
5.8.1男生信息………………………………………………………………15
5.8.2女生信息………………………………………………………………17
5.8.3全体学生信息…………………………………………………………18
5.9删除模块…………………………………………………………………19
六、上机操作……………………………………………………………………20
6.1系统说明…………………………………………………………………20
6.2系统测试…………………………………………………………………20
七、总结……………………………………………………………………25
八、源代码…………………………………………………………………25
一、课程设计目的
通过实践,学会编制结构清晰、风格良好、数据结构适当的C语言程序,加深对C语言基础知识的理解和掌握,进一步巩固C语言编程实践能力,锻炼思维逻辑和解决综合性实际问题的能力。
二、实习内容及要求
1、用C语言编写一个学生证管理系统,该系统具有以下功能:
(1)录入某位学生的学生证信息;
(2)给定学号,显示某位学生的学生证信息;
(3)给定某个班级的班号,显示该班所有学生的学生证信息;
(4)给定某位学生的学号,修改该学生的学生证信息;
(5)给定某位学生的学号,删除该学生的学生证信息;
(6)提供一些统计各类信息的功能;
(7)提供浏览所有学生的学生证信息的功能。
2、输入要求
应用程序运行后,在屏幕上显示一个菜单;用户可以根据要求,选定相应的操作项目;进入某个操作后,根据应用程序的提示,从键盘输入相应的信息。
3、输出要求
(1)应用程序运行后,要在屏幕上显示一个菜单;
(2)要求用户输入数据时,给出清晰、明确的提示信息,包括输入的数据内容、格式
及结束方式等。
三、需求分析
根据题目要求,学生信息要从文本文件中存取,所以本程序应该提供读写文件,显示、
统计、查询、修改记录,保存文件等操作,此外,还应该提供键盘式选择菜单实现功能。
四、总体设计
根据需求分析,可以把这个系统的设计分为添加、修改、查询、浏览、统计、删除六大
模块,其中查询模块可以分为三个子模块,统计模块可以分为三个子模块,子模块下面还有子
函数;系统功能模块图如下所示:
五、详细设计
5.0头文件及结构体
#include
#include
#include
#defineN100
structClass//班级
{
charCname[20];//班名
charCno[20];//班号
};
structStudent//学生
{
charSname[20];//姓名
charSex[10];//性别
charSno[20];//学号
intAge;//年龄
structClassCInfo;//嵌套结构体,表示班级信息
}StuInfo[N];//结构体数组,用作读取和存放临时数据
5.1主函数
voidmain()
{
menu();//菜单
getchar();
}
5.2菜单模块
voidmenu()
{
intchose;
intright;
do
{
system("cls");
printf("\n\t\t\t\t学生证管理系统\n");
printf("········································");
printf("菜单:
\t1-添加\t2-修改\t3-浏览全部\t4-查询\t5-统计\t6-删除\t7-退出\n");
printf("········································");
printf("请输入数字选择:
");
scanf("%d",&chose);
if(chose<1||chose>8)
{
right=1;
printf("输入错误,请重新输入!
\n");
getchar();
}
elseright=0;
}while(right==1);
switch(chose)
{
case1:
add();break;//添加模块
case2:
modify();break;//修改模块
case3:
browse();break;//浏览模块
case4:
quiry();break;//查询模块
case5:
stastic();break;//统计模块
case6:
Delete();break;//删除模块
case7:
exit(0);//退出
}
}
5.3公共函数
5.3.1返回主菜单函数
voidBackMenu()
{
printf("\n请按enter键返回主菜单!
\n");
getchar();
getchar();
menu();
}
5.3.2加载文件函数
以读(r)的方式打开StuInfo.txt文件,若不能打开,表示文件不存在,返回0;若文件存在,就读入所有记录到结构体数组中,并返回记录数;
intLoadFile()
{
inti;
FILE*fp;
if((fp=fopen("StuInfo.txt","r"))==NULL)
{
return0;//返回0,表示文件不存在
}
for(i=0;!
feof(fp);i++)
{
fscanf(fp,"%s%s%s%d%s%s",&StuInfo[i].Sname,&StuInfo[i].Sex,&StuInfo[i].Sno,&StuInfo[i].Age,&StuInfo[i].CInfo.Cno,&StuInfo[i].CInfo.Cname);
}
fclose(fp);
returni;//返回记录条数
}
5.3.3输入第num+1条记录
首先要判断记录数num==N是否成立,因为结构体数组的大小为N,当num=N时,表示已满,不能再存储数据,需要修改N的值。
若num性别为男或女,学号为11位且不能重复,年龄在0-100之间,班级号为6位,程序提供了完善的验证机制,输入错误时将提示重新输入直到正确为止。
voidInput(intnum)
{
inti;
intage;
charsno[20];
charsex[20];
charcno[20];
intright;
if(num==N)
{
printf("\n保存记录数超出结构体数组数的大小,请先修改N的值\n");
BackMenu();
}
printf("\n请按照提示输入学生信息:
\n\n");
printf("姓名:
");
scanf("%s",&StuInfo[num].Sname);
do
{
printf("\n性别(男或女):
");
scanf("%s",sex);
if((strcmp(sex,"男")!
=0)&&(strcmp(sex,"女")!
=0))
{
printf("输入错误,请输入男或女!
\n");
right=1;
getchar();
}
elseright=0;
}while(right==1);
strcpy(StuInfo[num].Sex,sex);
do
{
printf("\n学号(11位):
");
scanf("%s",sno);
if(strlen(sno)!
=11)
{
printf("输入错误,学号长度应为11位数!
\n");
right=1;
getchar();
}
elseright=0;
for(i=0;i{
if(strcmp(sno,StuInfo[i].Sno)==0)
{
printf("该学号已经存在,请重新输入!
\n");
right=1;
getchar();
}
}
}while(right==1);
strcpy(StuInfo[num].Sno,sno);
do
{
printf("\n年龄:
");
scanf("%d",&age);
if(age<=0||age>100)
{
printf("年龄应在0-100之间,请重新输入年龄!
\n");
right=1;
getchar();
}
elseright=0;
}while(right==1);
StuInfo[num].Age=age;
do
{
printf("\n班号(6位):
");
scanf("%s",cno);
if(strlen(cno)!
=6)
{
printf("输入错误,班号长度应为6位数!
\n");
right=1;
getchar();
}
elseright=0;
}while(right==1);
strcpy(StuInfo[num].CInfo.Cno,cno);
printf("\n班名:
");
scanf("%s",&StuInfo[num].CInfo.Cname);
}
5.3.4保存文件
以写的方式新建文件StuInfo.txt,然后将结构体数组中的记录写入文件中。
voidSaveFile(intnum)//保存num+1条记录
{
FILE*fpw;
inti;
if((fpw=fopen("StuInfo.txt","w"))==NULL)
{
printf("文件打不开,保存失败!
\n");
BackMenu();
}
for(i=0;i<=num;i++)
{
fprintf(fpw,"\n%s\t%s\t%s\t%d\t%s\t%s",StuInfo[i].Sname,StuInfo[i].Sex,StuInfo[i].Sno,StuInfo[i].Age,StuInfo[i].CInfo.Cno,StuInfo[i].CInfo.Cname);
}
fclose(fpw);
printf("\n保存成功!
\n");
}
5.4添加模块
voidadd()
{
intnum;
system("cls");
num=LoadFile();
Input(num);
SaveFile(num);
BackMenu();
}
5.5修改模块
与输入模块一样,输入的格式要求:
性别为男或女,学号为11位且不能与除当前修改的记录的学号外的记录的学号重复,年龄在0-100之间,班级号为6位,程序提供了完善的验证机制,输入错误时将提示重新输入直到正确为止,输入完成后,保存文件。
voidmodify()
{
intnum;
inti;
intright;
intfound=-1;
charStuNO[20];
num=LoadFile();
system("cls");
if(num==0)
{
printf("文件为空!
");
BackMenu();
}
printf("\n请输入学号选择要修改的记录:
");
scanf("%s",StuNO);
for(i=0;i{
if(strcmp(StuNO,StuInfo[i].Sno)==0)
{
found=i;
printf("\n你要修改的学生信息为:
\n\n");
printf("姓名性别学号年龄班号班名\n");
printf("%s\t%s\t%s\t%d\t%s\t%s\n",StuInfo[i].Sname,StuInfo[i].Sex,StuInfo[i].Sno,StuInfo[i].Age,StuInfo[i].CInfo.Cno,StuInfo[i].CInfo.Cname);
}
}
if(found<0)
{
printf("\n没有找到该学号的记录!
\n");
BackMenu();
}
Input(found);
SaveFile(num-1);
BackMenu();
}
5.6浏览模块
voidbrowse()//显示所有学生信息
{
intnum;
inti;
num=LoadFile();
system("cls");
if(num==0)
{
printf("文件为空!
");
BackMenu();
}
printf("\n已添加%d个学生信息\n\n",num);
printf("姓名性别学号年龄班号班名\n");
for(i=0;i{
printf("%s\t%s\t%s\t%d\t%s\t%s\n",StuInfo[i].Sname,StuInfo[i].Sex,StuInfo[i].Sno,StuInfo[i].Age,StuInfo[i].CInfo.Cno,StuInfo[i].CInfo.Cname);
}
BackMenu();
}
5.7查询模块
voidquiry()
{
intchose;
intright;
do
{
system("cls");
printf("\n\t1-按学号查询\t2-按姓名查询\t3-某班学生信息\t4-返回\n");
printf("\n请输入数字选择:
");
scanf("%d",&chose);
if(chose<1||chose>4)
{
right=1;
getchar();
}
elseright=0;
}while(right==1);
switch(chose)
{
case1:
system("cls");bySno();break;
case2:
system("cls");bySname();break;
case3:
system("cls");byCno();break;
case4:
menu();
}
}
5.6.0返回查询子菜单
voidBackQuiry()
{
printf("\n请按enter键返回上级菜单!
\n");
getchar();
getchar();
quiry();
}
5.6.1根据学号查找某学生的学生证信息:
voidbySno()
{
intfound=-1;
intnum;
inti;
charno[20];
num=LoadFile();
if(num==0)
{
printf("文件为空!
");
BackQuiry();
}
printf("\n请输入学生学号:
");
scanf("%s",no);
for(i=0;i{
if(strcmp(no,StuInfo[i].Sno)==0)
{
found=i;
printf("\n该学生的信息为:
\n\n");
printf("姓名性别学号年龄班号班名\n");
printf("%s\t%s\t%s\t%d\t%s%s\n",StuInfo[found].Sname,StuInfo[found].Sex,StuInfo[found].Sno,StuInfo[found].Age,StuInfo[found].CInfo.Cno,StuInfo[found].CInfo.Cname);
}
}
if(found<0)
printf("\n没有找到该班号的记录!
\n");
BackQuiry();
}
5.6.2根据姓名查找某学生的学生证信息:
voidbySname()
{
intfound=-1;
intnum;
inti;
charname[20];
num=LoadFile();
if(num==0)
{
printf("文件为空!
");
BackQuiry();
}
printf("\n请输入学生姓名:
");
scanf("%s",name);
printf("\n叫该姓名的学生信息为:
\n\n");
printf("姓名性别学号年龄班号班名\n");
for(i=0;i{
if(strcmp(name,StuInfo[i].Sname)==0)
{
found=i;
printf("%s\t%s\t%s\t%d\t%s%s\n",StuInfo[found].Sname,StuInfo[found].Sex,StuInfo[found].Sno,StuInfo[found].Age,StuInfo[found].CInfo.Cno,StuInfo[found].CInfo.Cname);
}
}
if(found<0)
printf("\n没有找到该班号的记录!
\n");
BackQuiry();
}
5.6.3根据班号查询某个班级所有学生的学生证信息:
voidbyCno()
{
intfound=-1;
intnum;
inti;
charClaNO[20];
num=LoadFile();
if(num==0)
{
printf("文件为空!
");
BackQuiry();
}
printf("\n请输入班号:
");
scanf("%s",ClaNO);
printf("\n该班级的学生信息为:
\n\n");
printf("姓名性别学号年龄班号班名\n");
for(i=0;i{
if(strcmp(ClaNO,StuInfo[i].CInfo.Cno)==0)
{
found=i;
printf("%s\t%s\t%s\t%d\t%s%s\n",StuInfo[found].Sname,StuInfo[found].Sex,StuInfo[found].Sno,StuInfo[found].Age,StuInfo[found].CInfo.Cno,StuInfo[found].CInfo.Cname);
}
}
if(found<0)
printf("\n没有找到该班号的记录!
\n");
BackQuiry();
}
5.7统计模块
该模块实现了基本的统计功能,包括分别统计男女生的人数、平均年龄,以及全体学生的人数和平均年龄;
voidstastic()
{
intchose;
intright;
do
{
printf("\n1-全体男生\t2-全体女生\t3-全体学生\t4-返回\n");
printf("\n请输入数字选择:
");
scanf("%d",&chose);
if(chose<1||chose>4)
{
right=1;
getchar();
}
elseright=0;
}while(right==1);
switch(chose)
{
case1:
system("cls");Male();
BackStastic();break;
case2:
system("cls");Female();
BackStastic();break;
case3:
system("cls");StuMsg();
BackStastic();break;
case4:
menu();
}
}
5.7.0统计模块的公共函数,返回统计子菜单
voidBackStastic()
{
printf("\n请按enter键返回上级菜单!
\n");
getchar();
getchar();
stastic();
}
5.7.1统计男生信息子模块
voidMale()
{
intnum;//人数
floatmg;//平均年龄
num=MaleNum();
mg=MaleMG();
printf("\n男生总人数为:
%d\n平均年龄为:
%f\n",num,mg);
}
5.7.1.1返回男生人数子函数
intMaleNum()
{
intnum;
intcount=0;
inti;
num=LoadFile();
if(num==0)
{
printf("文件为空!
");
BackStastic();