资源描述
C语言课程设计报告
学 院:计算机学院
专 业:网络工程
题 目:学生证管理系统
班序号 :19313126
学 号:20131004080
姓 名: 赵清华
2013年12月31日
报告目录
一、 实习内容要求—-———-——-----———-——————-—3
二、需求分析 ——-——————-——-——-———————--3
三、总体设计-——-—————-—-—--—-————-——-3
四、设计简介—-——-—-—-—————---—---—--—4
4。0头文件 —————————--————-—---—————-4
4.1主函数—-———--———-——————---——--—5
4.2子函数菜单———-————-———-—-—————————-5
4。3子函数添加—-———-———————————————————5
4.4子函数修改—-———--————————-—----——--10
4。5子函数浏览———————-———————-—————-———13
4.6子函数查询-———————————————-—-—-————14
4.7子函数统计———————-————-———————————-18
4.8 子函数删除—-——-———————--—-—————————23
五、上机操作---—--———-———--———————-——25
5.1系统说明—-——--———----—————————--—25
5。2 系统测试-——-——-———-——-——-—-—--———25
六、总结 __________________________________________________31
一、实习内容要求
1、用C语言编写一个学生证管理系统,该系统具有以下功能:
(1)录入某位学生的学生证信息;
(2)给定学号,显示某位学生的学生证信息;
(3)给定某个班级的班号,显示该班所有学生的学生证信息;
(4)给定某位学生的学号,修改该学生的学生证信息;
(5)给定某位学生的学号,删除该学生的学生证信息;
(6)提供一些统计各类信息的功能;
(7)提供浏览所有学生的学生证信息的功能。
2、输入要求
应用程序运行后,在屏幕上显示一个菜单;用户可以根据要求,选定相应的操作项目;进入某个操作后,根据应用程序的提示,从键盘输入相应的信息.
3、输出要求
(1)应用程序运行后,要在屏幕上显示一个菜单;
(2)要求用户输入数据时,给出清晰、明确的提示信息,包括输入的数据内容、格式
及结束方式等.
二、需求分析
学生证信息采用文件存储,因而要提供问价的输入/输出操作;要根据给定的学号或班号进行相应操作,要提供查找操作;实现一些统计给雷信息的功能要提供统计操作;另外,还要提供键盘式选择菜单以实现功能选择。
三、总体设计
这个程序被设计成数据输入模块、数据查找模块、数据子函数删除和数据子函数统计。
即:添加,修改、查询,浏览、删除,统计等,如下图所示:
四、设计简介
4。0头文件
#include〈stdio。h>
#include〈stdlib。h〉
#include<string.h〉
#define N 100
struct Class
{
char Cname[20]; //班名
char Cno[20];//班号
};
struct Student //学生
{
char Sname[20]; //姓名
char Sex[10];//性别
char Sno[20];//学号
int Age;//年龄
struct Class CInfo;//嵌套结构体,表示班级信息
}StuInfo[N]; //结构体数组,用作读取和存放临时数据
4。1 主函数
void main()
{
menu();
getchar();
}
4.2子函数菜单
void menu()
{
int chose;
int right;
do
{
printf("\n\t\t\t\t学生证管理系统\n");
printf("*******************************************************************************\n”);
printf(”\t\t\t\t1.添加学生信息");
printf(”\n\t\t\t\t2.修改学生信息");
printf(”\n\t\t\t\t3.全部学生信息");
printf(”\n\t\t\t\t4。查询学生信息”);
printf("\n\t\t\t\t5。统计学生信息”);
printf("\n\t\t\t\t6。删除学生信息”);
printf("\n\t\t\t\t7。退出系统\n”);
printf(”*******************************************************************************”); printf(”请输入数字选择:”);
scanf("%d",&chose);
if(chose<1||chose〉8)
{
right=1;
printf(”输入错误,请重新输入!\n");
getchar();
}
else right=0;
}while(right==1);
switch(chose)
{
case 1:add(); break; //子函数添加
case 2:modify(); break; //子函数修改
case 3:browse(); break; //子函数浏览
case 4:quiry(); break; //子函数查询
case 5:stastic(); break; //子函数统计
case 6:Delete(); break; //子函数删除
case 7:exit(0); //退出
}
}
4.3子函数添加
首先要判断文件StuInfo.txt是否存在,如果存在就以读写(r+)的方式打开,如果不存在,就以写(w)的方式创建文件StuInfo.txt。输入格式要求:性别为男或女,学号为11位且不能重复,年龄在0—100之间,班级号为6位,程序提供了完善的验证机制,输入错误时将提示重新输入直到正确为止。此外,如果以读写的方式打开,还要判断记录数num<N是否成立,因为结构体数组的大小为N,当num=N时,表示已满,不能再存储数据,需要修改N的值。
void add()
{
int num;
int i;
int age;
char sno[20];
char sex[20];
char cno[20];
int right;
FILE*fp;
if((fp=fopen(”StuInfo。txt”,"r+"))==NULL)
{
if((fp=fopen(”StuInfo.txt”,”w”))==NULL)
{
printf(”\n文件不存在且创建失败,返回!\n”);
menu();
}
printf(”\n请按照提示输入学生信息:\n\n”);
printf(”姓名:");
scanf("%s”,&StuInfo[0]。Sname);
do
{
printf(”\n性别(男或女):”);
scanf(”%s”,sex);
if((strcmp(sex,"男")!=0)&&(strcmp(sex,"女”)!=0))
{
printf("输入错误,请输入男或女!\n”);
right=1;
getchar();
}
else right=0;
}while(right==1);
strcpy(StuInfo[0]。Sex,sex);
do
{
printf(”\n学号(11位):”);
scanf(”%s”,sno);
if(strlen(sno)!=11)
{
printf("输入错误,学号长度应为11位数!\n”);
right=1;
getchar();
}
else right=0;
}while(right==1);
strcpy(StuInfo[0]。Sno,sno);
do
{
printf(”\n年龄:”);
scanf(”%d”,&age);
if(age〈=0||age>100)
{
printf("年龄应在0—100之间,请重新输入年龄!\n”);
right=1;
getchar();
}
else right=0;
}while(right==1);
StuInfo[0]。Age=age;
do
{
printf("\n班号(6位):");
scanf(”%s”,cno);
if(strlen(cno)!=6)
{
printf(”输入错误,班号长度应为6位数!\n");
right=1;
getchar();
}
else right=0;
}while(right==1);
strcpy(StuInfo[0]。CInfo.Cno,cno);
printf(”\n班名:");
scanf("%s",&StuInfo[0].CInfo.Cname);
fprintf(fp,”\n%s\t%s\t%s\t%d\t%s\t%s",StuInfo[0]。Sname,StuInfo[0]。Sex,StuInfo[0]。Sno,StuInfo[0].Age,StuInfo[0]。CInfo。Cno,StuInfo[0].CInfo。Cname);
fclose(fp);
printf("\n保存成功!\n”);
printf(”\n请按enter键返回主菜单!\n”);
getchar();
getchar();
menu();
}//以上的输入是以写的方式输入,下面是以读写的方式输入数据
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);
}
num=i; //记录数
if(num==N)
{
printf(”\n保存记录数超出结构体数组数的大小,请先修改N的值!\n”);
printf("\n请按enter键返回主菜单!\n”);
getchar();
getchar();
menu();
}
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();
}
else right=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();
}
else right=0;
for(i=0;i〈num;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();
}
else right=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();
}
else right=0;
}while(right==1);
strcpy(StuInfo[num].CInfo。Cno,cno);
printf(”\n班名:”);
scanf("%s”,&StuInfo[num]。CInfo。Cname);
//把该记录写到文件末尾
fprintf(fp,”\n%s\t%s\t%s\t%d\t%s\t%s”,StuInfo[num]。Sname,StuInfo[num]。Sex,StuInfo[num]。Sno,StuInfo[num]。Age,StuInfo[num]。CInfo。Cno,StuInfo[num]。CInfo。Cname);
fclose(fp);
printf(”\n保存成功!\n”);
printf(”\n请按enter键返回主菜单!\n");
getchar();
getchar();
menu();
}
4。4子函数修改
先判断文件StuInfo.txt以读(r)的方式能否打开,不能就返回,可以就读入记录;然后输入学号查找记录,没找到就返回,找到就按照提示修改该记录,与输入模块一样,输入的格式要求:性别为男或女,学号为11位且不能与除当前修改的记录的学号外的记录的学号重复,年龄在0-100之间,班级号为6位,程序提供了完善的验证机制,输入错误时将提示重新输入直到正确为止。输入完成后,再以写(w)的方式创建文件,不能创建就返回,可以就将结构体数组中的所有记录保存到文件中,这与添加稍有差别,最后返回主菜单。
void modify()
{
int num;
int i;
int right;
int age;
char sex[20];
char cno[20];
char sno[20];
int found=—1;
char StuNO[20];
FILE*fpr,*fpw;
if((fpr=fopen(”StuInfo.txt”,"r"))==NULL)
{
printf(”文件打不开!\n”);
menu();
}
for(i=0;!feof(fpr);i++) /
{
fscanf(fpr,”%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);
}
num=i;
fclose(fpr);
printf(”\n请输入学号选择要修改的记录:");
scanf(”%s”,StuNO);
for(i=0;i〈num;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);
printf(”\n请按照提示输入学生的新信息:\n”);
printf("姓名:”);
scanf(”%s",&StuInfo[found]。Sname);
do
{
printf("\n性别(男或女):”);
scanf(”%s”,sex);
if((strcmp(sex,"男”)!=0)&&(strcmp(sex,”女”)!=0))
{
printf(”输入错误,请输入男或女!\n”);
right=1;
getchar();
}
else right=0;
}while(right==1);
strcpy(StuInfo[found].Sex,sex);
do
{
printf(”\n学号(11位):”);
scanf(”%s”,sno);
if(strlen(sno)!=11)
{
printf("输入错误,学号长度应为11位数!\n”);
right=1;
getchar();
}
else right=0;
for(i=0;i<num;i++)
{
if((i!=found)&&(strcmp(sno,StuInfo[i].Sno)==0))
{
printf("该学号已经存在,请重新输入!\n”);
right=1;
getchar();
}
}
}while(right==1);
strcpy(StuInfo[found]。Sno,sno);
do
{
printf("\n年龄:”);
scanf(”%d",&age);
if(age〈=0||age>100)
{
printf(”年龄应在0-100之间,请重新输入年龄!\n");
right=1;
getchar();
}
else right=0;
}while(right==1);
StuInfo[found].Age=age;
do
{
printf("\n班号(6位):”);
scanf("%s”,cno);
if(strlen(cno)!=6)
{
printf(”输入错误,班号长度应为6位数!\n”);
right=1;
getchar();
}
else right=0;
}while(right==1);
strcpy(StuInfo[found].CInfo.Cno,cno);
printf(”\n班名:");
scanf("%s”,&StuInfo[found].CInfo。Cname);
if((fpw=fopen(”StuInfo。txt”,”w”))==NULL)
{
printf("文件打不开,保存失败!\n”);
menu();
}
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");
printf(”\n请按enter键返回主菜单!\n”);
getchar();
getchar();
menu();
}
}
if(found〈0)
{
printf(”\n没有找到该学号的记录:\n”);
printf("\n请按enter键返回主菜单!\n”);
getchar();
getchar();
menu();
}
}
4。5 子函数浏览
void browse()
{
int num;
int i;
FILE*fp;
if((fp=fopen(”StuInfo。txt”,”r”))==NULL)
{
printf("文件打不开!\n");
menu();
}
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);
num=i;
printf(”\n已添加%d个学生信息\n\n”,num);
printf(”姓名 性别 学号 年龄 班号 班名\n");
for(i=0;i<num;i++)
{
printf(”%s\t%s\t%s\t%d\t%s%s\n",StuInfo[i]。Sname,StuInfo[i].Sex,StuInfo[i]。Sno,StuInfo[i]。Age,StuInfo[i].CInfo.Cno,StuInfo[i]。CInfo。Cname);
}
printf(”\n请按enter键返回主菜单!\n");
getchar();
getchar();
menu();
}
4。6 子函数查询
void quiry()
{
int chose;
int right;
do
{
printf(”\n1—按学号查询\t2-按姓名
查询\t3—某班学生信息\t4—返回\n");
printf(”\n请输入数字选择:”);
scanf(”%d”,&chose);
if(chose<1||chose>4)
{
right=1;
getchar();
}
else right=0;
}while(right==1);
switch(chose)
{
case 1:bySno();break;
case 2:bySname();break;
case 3:byCno();break;
case 4:menu();
}
}
4。6.1 根据学号查找某学生的学生证信息:
void bySno()
{
int found=-1;
int num;
int i;
char no[20];
FILE*fp;
if((fp=fopen("StuInfo。txt”,”r"))==NULL)
{
printf(”文件打不开!\n”);
menu();
}
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);
}
num=i;
fclose(fp);
printf("\n请输入学生学号:");
scanf("%s",no);
for(i=0;i<num;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\t%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”);
printf(”\n请按enter键返回上级菜单!\n”);
getchar();
getchar();
quiry();
}
4.6.2 根据姓名查找某学生的学生证信息:
void bySname()
{
int found=—1;
int num;
int i;
char name[20];
FILE*fp;
if((fp=fopen(”StuInfo。txt”,”r"))==NULL)
{
printf(”文件打不开!\n");
menu();
}
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);
}
num=i;
fclose(fp);
printf("\n请输入学生姓名:”);
scanf(”%s”,name);
for(i=0;i〈num;i++)
{
if(strcmp(name,StuInfo[i].Sname)==0)
{
found=i;
printf(”\n该学生的信息为:\n\n");
printf(”姓名性别学号年龄班号班名\n”); printf("%s\t%s\t%s\t%d\t%s\t%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”);
printf("\n请按enter键返回上级菜单!\n");
getchar();
getchar();
quiry();
}
4。6.3 根据班号查询某个班级所有学生的
学生证信息:
void byCno()
{
int found=-1;
int num;
int i;
char ClaNO[20];
FILE*fp;
if((fp=fopen("StuInfo。txt",”r"))==NULL)
{
printf(”文件打不开!\n”);
menu();
}
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);
}
num=i;
fclose(fp);
printf(”\n请输入班号:”);
scanf(”%s”,ClaNO);
printf("\n该班级的学生信息为:\n\n”);
printf(”姓名 性别 学号 年龄 班号 班名\n");
for(i=0;i<num;i++)
{
if(strcmp(ClaNO,StuInfo[i]。CInfo。Cno)==0)
{
found=i; printf(”%s\t%s\t%s\t%d\t%s\t%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) //found小于0,说明不存在班号的学生记录
printf(”\n没有找到该班号的记录!\n");
printf(”\n请按enter键返回上级菜单!\n”);
getchar();
getchar();
quiry();
}
4.7 子函数统计
该模块实现了基本的统计功能,包括
分别统计男女生的人数、平均年龄,以及
全体学生的人数和基本年龄;
void stastic()
{
int chose;
int right;
do
{
printf(”\n1-全体男生\t2-全体女生
\t3—全体学生\t4—返回\n”);
printf(”\n请输入数字选择:”);
scanf("%d",&chose);
if(chose〈1||chose>4)
{
right=1;
getchar();
}
else right=0;
}while(right==1);
switch(chose)
{
case 1:
Male(); //男生的统计信息
printf(”\n请按enter键返回上级菜单!\n");
getchar(); getchar();
stastic();
break;
case 2:
Female(); //女生的统计信息
printf("\n请按enter键返回上级菜单!\n");
getchar();getchar();
stastic();
break;
case 3:
StuMsg(); //全体学生的统计信息
printf(”\n请按enter键返回上级菜单!\n");
getchar();getchar();
stastic();
break;
case 4:menu();
}
}
4。7。1统计男生信息子模块
void Male()
{
int num; //人数
float mg; //平均年龄
num=MaleNum();
mg=MaleMG();
printf("\n男生总人数为:%d\n平均年
龄为:%f\n”,num,mg);
}
4.7。1。1 返回男生人数子函数
int MaleNum()
{
int num;
int count=0;
int i;
展开阅读全文