1、西安邮电大学c语言课程设计学生证管理系统西安邮电大学软 件 课 程 设 计 报 告 书院办名称:电子工程学院学生姓名:贾奥专业名称:电子科学与技术班 级:1202班学号:05122065时间: 2013年 3 月 18 日 至 2013 年3 月 25 日实验题目:学生证管理系统一、实验目的能综合应用所学的计算机基础知识和所掌握的程序设计语言(C语言),自行设计并实现一个较为完整的小型管理信息系统或小型应用系统的设计与开发。其主要目的是通过系统分析、系统设计、编程调试,写实验报告等环节,初步掌握软件系统设计的方法和步骤,灵活运用程序设计语言进行软件开发的能力,提高分析问题和解决问题的能力,提高
2、程序设计水平。要求编程时采用结构体、指针、文件等复杂数据结构存储组织数据。 二、实验内容请设计一个学生证的管理程序。该程序应该具有下列功能: (1)通过键盘输入某位学生的学生证信息。学生证包含的信息请参看自己的学生证; (2)给定学号,显示某位学生的学生证信息; (3)给定某个班级的班号,显示该班所有学生的学生证信息; (4)显示全部的学生证信息; (5)给定某位学生的学号,修改该学生的学生证信息; (6)给定某位学生的学号,删除该学生的学生证信息; (7)提供一些统计各类信息的功能。例如统计学生数,男(女)学生数,每个班级的学生数; (8)能够对学生学号进行升序和降序排序; (9)用文件的形
3、式将录入的数据进行存储,并从其中读取数据。三、 需求分析该学生证管理系统可以储存、录入、读取、输出、添加、删除、修改、查询、统计、排序等操作。四、概要设计1、方案设计 1)录入学生信息 2)浏览学生信息3)管理模块(1)添加学生信息 (2)删除学生信息 (3)修改学生信息 4)查询模块 (1)按姓名查询 (2)按学号查询 (3)按身份证号查询(4)按班级号查询(5)按学院查询5)统计模块 (1)按性别统计学生数(2)按学院统计学生数(3)按班级统计学生数(4)统计学生总数6)排序模块 (1)学号升序排序(2)学号降序排序结构图: 2、模块功能说明 录入模块实现功能:能逐一录入数据添加进数组。
4、读取模块实现功能:能从文件中读出数据到内存中。 浏览模块实现功能:能逐一把数据按指定格式输出到屏幕。 删除模块实现功能:能把符合用户指定条件的数据从数组中删除,并释放间。 添加模块实现功能:能按用户的需要添加数据。 查询模块实现功能:能搜索到符合用户指定条件的数据,并将数据输出到幕。 修改模块实现功能:能让用户修改指定的数据。 排序模块实现功能:能按照指定的关键字进行排序。 保存模块实现功能:能将数据保存为文件形式,长期保存。 统计模块实现功能:能将数据进行制定的统计操作。 主程序实现功能:完成主菜单的显示,及对各模块的调用五、详细设计及运行结果1.流程图主程序: 0 1 2 3 4 5 6管
5、理模块: 0 1 2 3查询模块: 0 1 2 3 4 5统计模块: 0 1 2 3 4排序模块:运行结果:2.数据结构设计 此程序应用到数组、结构体、 指针以及它们的综合应用,整型、字符等类型。 3.预测结果 该程序能在屏幕上显示一个菜单。用户可以根据需求,选定相应的操作项目。进入每个操作后,根据应用程序的提示信息,从键盘输入相应的信息。六、调试情况,设计技巧及体会1、对自己设计进行评价,指出合理和不足之处,提出改进的方案。总的来说,这个程序还是很不错的.可以对学生信息进行基本的操作。并且能够给出清楚的提示语句,方便用户操作。就是处理一些出错信息时可能会不太好。程序的功能很多但是处理的数据太
6、少。应该添加密码模块让系统的功能更完整,可以录入更多的数据。2、在设计过程中的感受。 一个好的程序可以轻松的完成许多任务,但是程序的编译工作真是太不容易,更何况这次编的还是一个小程序。 在写程序时一定要仔细认真,决不能粗心大意.应该先把主函数及模块构思出来,然后一个一个写所需要的函数,这样可以及时查找出错误,便于及时修改。 设计程序时必须尽可能考虑到可能出现的所有情况,让程序能够应对出现的各种问题,在对程序调试时候可能会有很多从来没有见过的语法错误类型,(例如我对函数声明那里不是很懂,开始就不需要声明函数我还是声明了,结果导致下边结构体数组电脑无法识别,出现了很多没有见过错误,最后还是请教老师
7、才解决的。)我们应该静下心来自习分析,实在不会应该向老师请教,将自己做的系统一定要调试出来,这样自己会有很大的成就感的,或许你的系统不是很完美,但是毕竟是自己做的自己调试的,在这个过程中是我们熟悉我们学习的c语言的一个很好的机会,只有这样我们才能在实践中体会到这门课程的实际作用。在程序设计并且调试完成后要自己运行,实验每个模块的功能,检查是否还有漏洞或者不完整的地方,进行适当的修改,使程序的功能更加强大。附录代码:#include #include #include #include #define N 100 int sum=0; struct date int year; int mont
8、h; /*出生年月日*/ int day; ; struct student /*学生信息*/ char name40; /*姓名*/ char sex5; /*性别*/ char mz5; /*民族*/ struct date bir_time; /*出生日期*/ int num120; /*身份证号*/ int num220; /*学号*/ char xy20; /*学院*/ char zy20; /*专业*/ int bjh20; /*班级号*/ stuN,t; #define PRINT1 printf(姓名-性别-民族-出生日期(年-月-日)-身份证号-学号-学院-专业-班级号-n)
9、/*输入学生信息函数*/ input (int n) int i; for (i=0;iN) printf(输入的学生数量已经超过上限,请更改N的值); exit(0); input(n); printf(n -%d个学生信息输入完毕!-n,n); printf(n 按任意键返回主菜单!); getch(); /*该处的系统返回到菜单界面不知道如何实现 先放下o(_)o 哈哈*/ /*保存信息函数*/void save_message(int sum) FILE *fp; int i; if(fp=fopen(E:学生证管理信息.txt,a)=NULL) printf(读文件错误!n); ge
10、tch(); for(i=0;isum;i+) if(fwrite(&stui,sizeof(struct student),1,fp)!=1) printf(写文件错误!n); fclose(fp);/*读取信息*/int read_message() FILE *fp; int i=0; if(fp=fopen(E:学生证管理信息,rb)=NULL) printf(nn*暂时还没有任何学生信息,按任意键进入主菜单选择基本信息的录入!*n); return(0); while(!feof(fp) fread(&stui,sizeof(struct student),1,fp); if(stu
11、i.num2=0) break; else i+; fclose(fp); return(i);/*浏览学生信息模块*/void output_message() int i=0; PRINT1; for(i=0;iN) printf(输入的学生数量已经超过上限,请更改N的值); exit(0); input(n); /*调用添加信息函数*/ printf(n -%d个学生信息添加完毕!-n,n); printf(n 按任意键返回主菜单!); getch(); /*该处的系统返回到菜单界面不知道如何实现 先放下o(_)o 哈哈*/*删除学生信息*/ void del_message() int
12、 i,j=0,l,k=sum; int del_num20; char choice; printf(n 请输入要删除的学生的学号:); /*学校同名的人可能存在但是学号不会重复所以用学号提高准确性*/ scanf(%d,&del_num); for(i=0;isum;i+) if(stui.num2=del_num) printf(n -学生信息-n); PRINT1; printf(%8s %s %s %15d-%2d-%2d %20d %10d %15s %15s %8dn,stui.name, stui.sex,stui.mz, stui.bir_time.year,stui.bir_
13、time.month,stui.bir_time.day,stui.num1,stui.num2,stui.xy, stui.zy,stui.bjh); printf(n 确认删除?(Y/N); choice=getch(); if(choice=Y|choice=y) for (l=i;lsum-1;l+) stul=stul+1; sum-; printf(nn 删除成功!n); printf(n 按任意键返回!); getch(); break; else break; else j+; if(j=k) printf(n 该学生不存在!); getch(); /*修改学生信息函数*/vo
14、id revise_message() int i=0,flag,choice; int revise_num10; do printf(n 请输入要修改的学生学号:); scanf(%d,&revise_num); for(i=0;isum;i+) if(stui.num2=revise_num) printf(n -学生信息-n);PRINT1;printf(%8s %s %s %15d-%2d-%2d %20d %10d %15s %15s %8dn,stui.name, stui.sex,stui.mz,stui.bir_time.year,stui.bir_time.month,st
15、ui.bir_time.day,stui.num1,stui.num2,stui.xy,stui.zy,stui.bjh);printf(n 您要修改哪一项信息?n);printf(n 1.姓名n);printf(n 2.性别n);printf(n 3.民族n);printf(n 4.出生日期n);printf(n 5.身份证号n);printf(n 6.学号n);printf(n 7.学院n);printf(n 8.专业n);printf(n 9.班级号n);printf(n 请选择(1-9):);scanf(%d,&choice); switch(choice) case 1: print
16、f(n 请输入修改后的名称:); scanf(%s,stui.name);break; case 2: printf(n 请输入修改后的性别:); scanf(%s,stui.sex);break; case 3: printf(n 请输入修改后的民族:); scanf(%s,stui.mz);break; case 4: printf(n 请输入修改后的出生日期:); scanf(%d-%d-%d,&stui.bir_time.year,&stui.bir_time.month,&stui.bir_time.day); break; case 5: printf(n 请输入修改后的身份证号:
17、); scanf(%d,&stui.num1);break; case 6: printf(n 请输入修改后的学号:); scanf(%d,&stui.num2);break; case 7: printf(n 请输入修改后的学院:); scanf(%s,stui.xy); case 8: printf(n 请输入修改后的专业:); scanf(%s,stui.zy);break; case 9: printf(n 请输入修改后的班级号:); scanf(%d,&stui.bjh);break; PRINT1; printf(%8s %s %s %15d-%2d-%2d %20d %10d %
18、15s %15s %8dn,stui.name, stui.sex,stui.mz, stui.bir_time.year,stui.bir_time.month,stui.bir_time.day, stui.num1,stui.num2,stui.xy,stui.zy,stui.bjh); break; if(i=sum) printf(n 该学生不存在!); getch(); printf(nn 继续修改吗?(Y/N); choice=getch(); if (choice=Y|choice=y) flag=1; printf(n 继续!n); else flag=0;while(fla
19、g=1); printf(n 按任意键返回主菜单!); getch();/*管理模块*/void admin_message() int choice; do printf(nnn *管理学生信息*nn); printf( 1. 添加学生信息nn); printf( 2. 删除学生信息nn); printf( 3. 修改学生信息nn); printf( 0. 返回主菜单nn); printf( 请选择(0-3):); scanf(%d,&choice); switch(choice) case 1: insert_message();break; case 2: del_message();b
20、reak; case 3: revise_message();break; case 0: break; while(choice!=0);/*按名称查询函数*/void inquire_name() int i,j=0; char inquire_name10; printf(n 请输入要查询的学生名称:); scanf(%s,inquire_name); for(i=0;isum;i+) if(strcmp(stui.name,inquire_name)=0) printf(n -学生信息-n); PRINT1; printf(%8s %s %s %15d-%2d-%2d %20d %10
21、d %15s %15s %8dn,stui.name, stui.sex,stui.mz,stui.bir_time.year,stui.bir_time.month,stui.bir_time.day,stui.num1,stui.num2,stui.xy,stui.zy,stui.bjh); else j+; if(j=sum) printf(n 该学生不存在!); getch();/*按学号查询函数*/void inquire_num2() int i,j=0; int inquire_num210; printf(n 请输入要查询的学生学号:); scanf(%d,inquire_nu
22、m2); for(i=0;isum;i+) if(stui.num2=inquire_num2) printf(n -学生信息-n); PRINT1; printf(%8s %s %s %15d-%2d-%2d %20d %10d %15s %15s %8dn,stui.name, stui.sex,stui.mz, stui.bir_time.year,stui.bir_time.month,stui.bir_time.day,stui.num1,stui.num2,stui.xy, stui.zy,stui.bjh); else j+; if(j=sum) printf(n 该学生不存在!
23、); getch();/*按身份证号查询函数*/void inquire_num1() int i,j=0; int inquire_num120; printf(n 请输入要查询的学生身份证号:); scanf(%d,inquire_num1); for(i=0;isum;i+) if(stui.num1=inquire_num1) printf(n -学生信息-n); PRINT1; printf(%8s %s %s %15d-%2d-%2d %20d %10d %15s %15s %8dn,stui.name, stui.sex,stui.mz,stui.bir_time.year,stui.bir_time.month,stui.bir_time.day,stui.num1,stui.num2,stui.xy,stui.zy,stui.bjh); else j+; if(j=sum) printf(n 该学生不存在!); getch();/*按班级号查询函数*/void inquire_bjh() int i,j