C语言课程设计报告学院:地球科学学院专业:资源环境与城乡规划管理题目:学生证管理系统班号:xxxxxxxx姓名:李仙伟学号:xxxxxxxx指导教师:张锋2010年11月26日-2-报告目录一、课程设计目的………………………………………………………………3二、实习内容及要求……………………………………………………………3三、需求分析……………………………………………………………………3四、总体分析……………………………………………………………………3五、详细设计……………………………………………………………………45.0头文件及结构体……………………………………………………………45.1主函数………………………………………………………………………45.2菜单模块……………………………………………………………………55.3公共函数……………………………………………………………………65.4添加模块……………………………………………………………………105.5修改模块……………………………………………………………………105.6浏览模块…………………………………………………………………115.7查询模块…………………………………………………………………115.7.1按学号查询……………………………………………………………125.7.2按名字查询……………………………………………………………135.7.3按班级查询……………………………………………………………145.8统计模块…………………………………………………………………145.8.1男生信息………………………………………………………………155.8.2女生信息………………………………………………………………175.8.3全体学生信息…………………………………………………………185.9删除模块…………………………………………………………………19六、上机操作……………………………………………………………………206.1系统说明…………………………………………………………………206.2系统测试…………………………………………………………………20七、总结……………………………………………………………………25八、源代码…………………………………………………………………25-3-一、课程设计目的通过实践,学会编制结构清晰、风格良好、数据结构适当的C语言程序,加深对C语言基础知识的理解和掌握,进一步巩固C语言编程实践能力,锻炼思维逻辑和解决综合性实际问题的能力。二、实习内容及要求1、用C语言编写一个学生证管理系统,该系统具有以下功能:(1)录入某位学生的学生证信息;(2)给定学号,显示某位学生的学生证信息;(3)给定某个班级的班号,显示该班所有学生的学生证信息;(4)给定某位学生的学号,修改该学生的学生证信息;(5)给定某位学生的学号,删除该学生的学生证信息;(6)提供一些统计各类信息的功能;(7)提供浏览所有学生的学生证信息的功能。2、输入要求应用程序运行后,在屏幕上显示一个菜单;用户可以根据要求,选定相应的操作项目;进入某个操作后,根据应用程序的提示,从键盘输入相应的信息。3、输出要求(1)应用程序运行后,要在屏幕上显示一个菜单;(2)要求用户输入数据时,给出清晰、明确的提示信息,包括输入的数据内容、格式及结束方式等。三、需求分析根据题目要求,学生信息要从文本文件中存取,所以本程序应该提供读写文件,显示、统计、查询、修改记录,保存文件等操作,此外,还应该提供键盘式选择菜单实现功能。四、总体设计根据需求分析,可以把这个系统的设计分为添加、修改、查询、浏览、统计、删除六大-4-模块,其中查询模块可以分为三个子模块,统计模块可以分为三个子模块,子模块下面还有子函数;系统功能模块图如下所示:五、详细设计5.0头文件及结构体#includestdio.h#includestdlib.h#includestring.h#defineN100structClass//班级{charCname[20];//班名charCno[20];//班号};structStudent//学生{charSname[20];//姓名charSex[10];//性别charSno[20];//学号intAge;//年龄structClassCInfo;//嵌套结构体,表示班级信息}StuInfo[N];//结构体数组,用作读取和存放临时数据5.1主函数voidmain(){menu();//菜单getchar();}-5-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(chose1||chose8){right=1;printf(输入错误,请重新输入!\n);getchar();}-6-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;//返回记录条数}-7-5.3.3输入第num+1条记录首先要判断记录数num==N是否成立,因为结构体数组的大小为N,当num=N时,表示已满,不能再存储数据,需要修改N的值。若numN,则按提示输入一条记录,输入格式要求:性别为男或女,学号为11位且不能重复,年龄在0-100之间,班级号为6位,程序提供了完善的验证机制,输入错误时将提示重新输入直到正确为止。voidInput(intnum){inti;intage;charsno[20];charsex[20];charcno[20];intright;if(num==N){-8-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;inum;i++){if(strcmp(sno,StuInfo[i].Sno)==0){printf(该学号已经存在,请重新输入!\n);right=1;getchar();}}}while(right==1);strcpy(StuInfo[num].Sno,sno);do{printf(\n年龄:);-9-scanf(%d,&age);if(age=0||age100){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);}-10-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;inum;i++){if(strcmp(StuNO,StuInfo[i].Sno)==0){found=i;printf(\n你要修改的学生信息为:\n\n);printf(姓名性别学号年龄班号班名\n);-11-printf(%s\t%s\t%s\t%d\t%s\t%s\n,StuInfo[i].Sna