1、课程设计 课程名称 C语言程序设计课程设计题目名称 学生信息管理系统学生学院 经济管理学院专业班级 08信管1班学 号 3108006217学生姓名 李嘉宁指导教师 黄跃梅2009 年 6 月 15 日目录一、 课程简介二、 系统功能分析三、 系统设计四、 系统实现五、 总结一、课程简介1、课程设计的内容学生信息包括:学号、姓名、年龄、性别、出生年月、地址、邮编、电话、E-mail等。设计一学生信息管理系统,使之能提供以下功能:学生信息录入功能(录入时可考虑对录入信息是否正确进行判断,学生信息用文件保存),学生信息浏览功能,查询(按学号、姓名查询),排序功能(按学号、姓名),学生信息的删除与修
2、改。要求系统界面友好,使用方便。2、课程设计的要求与数据1开发环境要求:Turbo C 3.0。2提交课程设计报告一份,包括以下内容:(1)系统分析:包括设计题目、设计内容以及系统功能需求分析;(2)系统设计:包括总体设计(主要功能模块的划分)及详细设计(各功能模块的算法设计以及对应的流程图);(3)系统实现:包括使用的所有变量、自定义函数、结构体的说明,以及完整源程序清单,关键代码应加注释。(4)系统运行:包括系统操作使用的简单说明,使用测试数据运行的结果。(5)总结。包括课程设计过程中的学习体会与收获,出现的问题和解决的方法,没有完成的部分及原因,对C语言和本次课程设计的认识以及自己的建议
3、等内容。3提交光盘(每班统一制作1张光盘,每人一个文件夹,文件夹名为“学号姓名”)。每人的光盘文件夹内含:(1)任务书;(2)源程序文件和可执行程序文件;(3)测试用例和编译运行结果;(4)课程设计报告电子文档。3、课程设计应完成的工作1进行需求分析,将系统划分为多个模块;2为每个模块设计算法及流程;3编写代码实现各模块功能;4运行调试程序;5撰写课程设计报告。4、应收集的资料及主要参考文献1 谭浩强,C程序设计(第三版), 清华大学出版社, 20052 谭浩强,C程序设计题解与上机指导(第三版), 清华大学出版社, 2005 教材第11章“结构体”部分及有关习题。二、系统功能分析1.设计题目
4、:学生信息管理系统2.设计内容:3.系统功能需求分析:系统所具备功能:1.建立学生信息文件,并可进行:(1)学生学号、姓名、年龄、性别、出生年月、地址、邮编、电话、E-mail等信息的输入。(2)对指定学生信息进行修改,删除。(3)对指定(按学号或姓名)学生进行信息查询。(4)按学号顺序显示所有学生信息。(5)保存信息。三、系统设计1.总体设计主要功能模块:(1)开始界面选择,初始菜单,二级菜单。(选择结构)(2)数据文件的打开与关闭。(fopen,fclose,save等)(3)学生信息输入。(结构体,结构体数组指针,信息校正,数据保存)(3)信息修改、删除。(数据的读写,fread,fwr
5、ite,链表等)(4)学生信息查询。(结构体,循环结构,选择结构)(5)保存信息。2.详细设计(1)界面初始菜单界面* 欢迎使用学生信息管理系统 * 请选择: 1.学生信息添加 2.修改或删除学生信息 3.学生信息查询 4.退出* 欢迎使用学生信息管理系统 *二级菜单*学生信息的更改* 1.学生信息的删除 2.学生信息的修改 0.返回主菜单 请选择(0-2)*学生信息删除* 1.按编号删除 2.按姓名删除 0.返回主菜单 请选择(0-2)*学生信息查询* 1.按学号进行信息查询 2.按姓名进行信息查询 0.返回主菜单 请选择(0-2)三级菜单*修改学生信息* 1.修改学号 2.修改年龄 3.修
6、改性别 4.修改出生年月 5.修改地址 6.修改电话 7.修改email 8.修改邮编 0. 返回上级菜单(2)数据结构设计struct student int num; char name20; int age; char sex5; char birthday10; char adr20; char mailbox10; char tel10; char email20; studentN,student2N; (3)函数模块设计Save函数int save(int sum) FILE *fp; int i; if(fp=fopen(student.txt,wt)=NULL) printf
7、(读文件错误!n); return 0; for(i=0;isum;i+) if(fwrite(&studenti,sizeof(struct student),1,fp)!=1) printf(写文件错误!n); fclose(fp); return i;用于学生信息的存储。函数输入int input()列出所需输入的数据类型,并且调用Save函数,生成新的信息文件。文件读取int load_file()在程序开头时即调用,检查是否已经存在信息文件,并告知用户文件内信息。按照编号查询信息int search_by_num()在二级菜单中发挥作用,以学号为标准进行信息查询。for(i=0;is
8、um;i+) if(num=studenti.num&studenti.num!=0) PRINT; printf(%s %d %d %s %s %s %s %s %s,studenti.name,studenti.num,studenti.age,studenti.birthday,studenti.adr,studenti.mailbox,studenti.tel,studenti.email); 按姓名进行查询int search_by_name()for(i=0;isum;i+) if(strcmp(studenti.name,name)=0&studenti.num!=0) prin
9、tf(学生%s的信息,studenti.name); PRINT; printf(%s %d %d %s %s %s %s %s %s,studenti.name,studenti.num,studenti.age,studenti.birthday,studenti.adr,studenti.mailbox,studenti.tel,studenti.email); 以姓名和学号为标准,进行学生信息排列for(i=0;isum;i+) if(strcmp(studenti.name,name)=0&studenti.num!=0) printf(学生%s的信息,studenti.name);
10、 PRINT; printf(%s %d %d %s %s %s %s %s %s,studenti.name,studenti.num,studenti.age,studenti.birthday,studenti.adr,studenti.mailbox,studenti.tel,studenti.email);学生信息按学号删除int delete_by_num() int delete_num=0,i,f=0; printf(nn 请输入您要删除学生的学号:); scanf(%d,delete_num); for(i=0;isum;i+) if(studenti.num=delete_
11、num) studenti.num=0; printf( 该学生信息已删除!);学生信息按姓名删除int delete_by_name() char delete_name20,i,f=0; printf(nn 请输入要删除学生的姓名:); scanf(%s,&delete_name); for(i=0;isum;i+) if(strcmp(studenti.name,delete_name)=0) tudenti.num=0; printf( %s的信息已删除!,studenti.name);学生信息修改,通过switch语句对需要指定的信息进行修改。四、系统实现打开程序检测是否已存在学生信
12、息文件:初始菜单:学生信息添加菜单:二级菜单:源代码:/*学生信息管理系统*/ #include#include#include#define N 100#define PRINT printf( 姓名 学号 年龄 出生年月 地址 邮编 电话 E-mail n);int sum=0; struct student int num; char name20; int age; char sex5; char birthday10; char adr20;char mailbox10;char tel10;char email20; studentN,student2N; /*保存信息*/int
13、save(int sum) FILE *fp; int i; if(fp=fopen(student.txt,wt)=NULL) printf(读文件错误!n); return 0; for(i=0;isum;i+) if(fwrite(&studenti,sizeof(struct student),1,fp)!=1) printf(写文件错误!n); fclose(fp); return i; void clear() getchar(); system(cls);int input() int i,j,flag=1; clear(); printf(添加学生信息,当输入学号为0时,将结束
14、操作。n); printf(输入例子:n); printf(学号:1n); printf(姓名:ZhangFein); printf(年龄:18n); printf(性别:Mn); printf(出生年月:19891007n); printf(地址:Tianhen); printf(邮编:510000n); printf(电话:12345678n); printf(E-mail:n); for(i=1;iN;i+) printf(第%d个学生,i); printf(学号:); scanf(%d,&studenti.num); if(studenti.num=0) break; for(j=0;
15、jsum;j+) if(studentj.num=studenti.num) printf(学号重复,请重新输入学号:n); flag=0; break; ; if(flag=0)break; printf(姓名:); scanf(%s,studenti.name); printf(年龄:); scanf(%d,&studenti.age); printf(性别:); scanf(%s,studenti.sex); printf(出生年月:); scanf(%s,studenti.birthday); printf(地址:); scanf(%s,studenti.adr); printf(邮编
16、:); scanf(%s,studenti.mailbox); printf(电话:); scanf(%s,studenti.tel); printf(E-mail:); scanf(%s,studenti.email); flag=1; if(flag=1) printf(你所输入的学生信息已添加成功!n); printf(按回车键返回主菜单!n); getchar();sum=i;save(sum);return i; /*读取信息*/int load_file() FILE *fp; int i=0; if(fp=fopen(student.txt,rt)=NULL) printf(尚未
17、发现已经保存的学生信息!); return 0; while(feof(fp)!=1) fread(&studenti,sizeof(struct student),1,fp); if(studenti.num=0) break; else i+; sum+; printf(已有学生信息n); PRINT; for(i=0;isum;i+) if(studenti.num!=0) printf(%s %d %d %s %s %s %s %s %s,studenti.name,studenti.num,studenti.age,studenti.birthday,studenti.adr,stu
18、denti.mailbox,studenti.tel,studenti.email); printf( 按回车键返回主菜单!); fclose(fp); return(i); /*输出信息*/int output_message() int i=0; clear(); printf(nn -学生信息表-n); PRINT; for(i=0;isum;i+) if(studenti.num!=0) printf(%s %d %d %s %s %s %s %s %s,studenti.name,studenti.num,studenti.age,studenti.birthday,studenti
19、.adr,studenti.mailbox,studenti.tel,studenti.email); printf(按回车键返回主菜单!); return 0; /*按编号查询*/int search_by_num() int i,j=0;int num; clear(); printf(请输入要查询学生的编号:); scanf(%s,&num); for(i=0;isum;i+) if(num=studenti.num&studenti.num!=0) printf( 编号为%d的学生信息 ,studenti.num); PRINT; printf(%s %d %d %s %s %s %s
20、 %s %s,studenti.name,studenti.num,studenti.age,studenti.birthday,studenti.adr,studenti.mailbox,studenti.tel,studenti.email); else j+; if(j=sum) printf(编号为%d的学生不存在! ,num); printf(n 该生信息不存在!); getchar(); return 0; /*按姓名查询*/int search_by_name() int i,j=0; char name20; clear(); printf(请输入要查询学生的姓名:); sca
21、nf(%s,name); for(i=0;isum;i+) if(strcmp(studenti.name,name)=0&studenti.num!=0) printf(学生%s的信息,studenti.name); PRINT; printf(%s %d %d %s %s %s %s %s %s,studenti.name,studenti.num,studenti.age,studenti.birthday,studenti.adr,studenti.mailbox,studenti.tel,studenti.email); else j+; if(j=sum) printf(该学生不存
22、在! ); printf(按回车键返回上级菜单!); getchar(); return 0; /*学生信息查询模块*/inquire_message() int choice; do clear(); printf(nnn *学生信息查询*nn); printf( 1.按学号查询;nnn); printf( 2.按姓名查询;nnn); printf( 0.返回主菜单;nnn); printf( 请选择(0-2):); scanf(%d,&choice); switch(choice) case 1: search_by_num();break; case 2: search_by_name(
23、);break; case 0: break; while(choice!=0); return 1; /*两种排序方式*/ /*按编号排序*/sort_by_num()int i; PRINT; for(i=0;isum;i+) printf(%s %d %d %s %s %s %s %s %s,studenti.name,studenti.num,studenti.age,studenti.birthday,studenti.adr,studenti.mailbox,studenti.tel,studenti.email); printf(按回车键返回上级菜单!); getchar();
24、return 0;sort_by_name() int i,j=0; char name20; clear(); printf(请输入要查询学生的姓名:); scanf(%s,name); for(i=0;isum;i+) if(strcmp(studenti.name,name)=0&studenti.num!=0) printf(学生%s的信息,studenti.name); PRINT; printf(%s %d %d %s %s %s %s %s %s,studenti.name,studenti.num,studenti.age,studenti.birthday,studenti.
25、adr,studenti.mailbox,studenti.tel,studenti.email); else j+; if(j=sum) printf(该学生不存在! ); printf(按回车键返回上级菜单!); getchar(); return 0; /*排序模块*/sort_message() int choice; do clear(); printf(nnn *学生信息排序*nn); printf( 1.按学号进行信息查询 nn); printf( 2.按姓名进行信息查询 nn); printf( 0.返回主菜单nn); printf( 请选择(0-2):); scanf(%d,
26、&choice); switch(choice) case 1: sort_by_num();break; case 2: sort_by_name();break; case 0: break; while(choice!=0); return 1;void range() int i,j=0,k=0; for(i=0;isum;i+) if(studenti.num!=0) student2j=studenti; j+; else k+; sum-=k; if(k!=0) for(i=0;isum;i+) studenti=student2i; /*按编号删除*/int delete_by
27、_num() int delete_num=0,i,f=0; printf(nn 请输入您要删除学生的学号:); scanf(%d,delete_num); for(i=0;isum;i+) if(studenti.num=delete_num) studenti.num=0; printf( 该学生信息已删除!); f=1; range(); break; if(f=0) printf(nn *经查并无该学生信息!*nn); printf(n 按回车键返回上级菜单!); getchar(); return 1; /*按姓名删除*/int delete_by_name() char delet
28、e_name20,i,f=0; printf(nn 请输入要删除学生的姓名:); scanf(%s,&delete_name); for(i=0;isum;i+) if(strcmp(studenti.name,delete_name)=0) studenti.num=0; printf( %s的信息已删除!,studenti.name); f=1; range(); break; if(f=0) printf(nn *经查并无该学生信息!*nn); printf(n 按回车键返回上级菜单!); getchar(); return 0; /*学生信息删除模块*/int delete_messa
29、ge() int choice; do clear(); printf( *学生信息删除*nn); printf( 1.按编号删除:nn); printf( 2.按姓名删除:nn); printf( 0.返回主菜单.nn); printf( 请选择(0-2):nn); scanf(%d,&choice); switch(choice) case 1: delete_by_num();break; case 2: delete_by_name();break; case 0: break; while(choice!=0); save(sum); return 1; /*学生信息的修改*/int
30、 change(int i,int l) int choice,j; if(l=1) for(j=0;jsum;j+) if(studentj.num=i) i=j; do clear(); printf(nn); printf(%s %d %d %s %s %s %s %s %s,studenti.name,studenti.num,studenti.age,studenti.birthday,studenti.adr,studenti.mailbox,studenti.tel,studenti.email); printf( *修改学生信息* n); printf( 1.修改学号:nn);
31、 printf( 2.修改年龄:nn); printf( 3.修改性别:nn); printf( 4.修改出生年月:nn); printf( 5.修改地址:nn); printf( 6.修改电话:nn);printf( 7.修改email:nn); printf( 8.修改邮编:nn); printf( 0. 返回上级菜单.nn); printf( 请选择(0-8)nn); scanf(%d,&choice); switch(choice) case 1: printf( 请输入学号:); scanf(%d,studenti.num); printf(%s的班级修改完毕!,studenti.name); getchar(); break; case 2: printf(请输入年龄); scanf(%d,&studenti.age); printf(%s的年龄修改完毕!,studenti.name); getchar(); break; case 3: printf(请输入性别:); scanf(%s,studenti.sex); printf(%s的性别修改完毕!,studenti.name);