学生宿舍管理方案计划系统C语言学习知识编程.doc
-*“学生宿舍管理系统”C语言课程设计报告一、 程序功能简介我设计的是“学生宿舍管理系统”,主要是针对住宿学生个人信息的管理,适用对象主要是学校,以方便学校对住宿学生的管理。包括学生的姓名、学号、性别、专业、班级等等。在编写过程中主要运用C语言的基本知识有:数据类型(整形、实型、字符型、指针、数组、结构等);运算类型(算术运算、逻辑运算、自增自减运算、赋值运算等);程序结构(顺序结构、判断选择结构、循环结构);大程序的功能分解方法(即函数的调用与使用)等。 二、 课程设计要求该程序是由C语言编写的一个学生宿舍管理查询软件,程序在Microsoft Visual C+ 6.0下运行,其主要功能是实现对学生信息的录入、添加、删除、修改、查询、统计。其中查询可以分别以姓名、学号、宿舍号为关键字查询学生信息。统计可以分别以学号、宿舍号、性别、班级、专业为关键字进行统计,并且输出信息按学号大小从小到大输出。三、 源程序分析1) 结构分析1. 方案设计 主函数录入模块添加模块修改模块删除模块查询模块统计模块退出系统学号姓名班级宿舍性别年龄专业返回按姓名按学号按宿舍返回按学号按宿舍按性别按班级按专业返回2. 数据结构说明程序中数据主要是学生信息,具体属于类型如下:struct st_message char name20; /*学生姓名*/char dorm7; /*宿舍号*/char num10; /*学号*/char sex5; /*性别*/char age4; /*年龄*/char major20; /*专业*/char classs8; /*班级*/3. 模块功能说明第一录入模块:调用input_message(),对住宿学生信息进行录入。第二添加模块:调用append_message(),对新来学生信息进行添加录入。第三修改模块:调用revise_message(),对需修改学生的信息进行修改。第四删除模块:调用delete_message(),对某一学生信息进行删除操作。第五查询模块:调用find_message(),分别以姓名、学号、宿舍号对学生信息进行查询。第六统计模块:调用census_message(),分别以学号、宿舍号、性别、班级、专业方式对学生信息进行统计,并按学号由小到大输出。四、 编程中遇到的问题及解决方法在调试过程中,时常会出现输入或显示为乱码的情况,这可能是上下定义的数据类型不同或定义数组长度不够所导致的。有时候程序中还会出现录入五个数据而只显示四个的情况,这也经常是因为定义的结构体数组长度过低所造成的。像这些问题只要把数据类型都定义成字符型,并且定义一个合理的数组长度一般都能解决。在调试过程中我遇到最大的问题出现在删除模块。在运用“rt+”打开文件并对某一数据进行删除后,往往显示会多显示一行数据。这是由于“rt+”写数据时只会覆盖数据而不会清除原文件数据,因此文件最后一行数据总会保留在原文件中。后来我先用“rt”打开文件并读取文件中的数据,然后再用“wt”打开原文件将删除后的数据重新写入文件,最终成功运行。五、 程序运行截屏与结果分析1. 测试数据对功能1(录入学生信息)的测试:按照先后顺序分别输入学生信息:学号 姓名 班级 宿舍号 性别 年龄 专业05111101 张三 051111 429 女 18 土木工程04111102 李四 041111 218 男 18 信息工程对功能2(添加学生信息)的测试:按照先后顺序分别输入学生信息:学号 姓名 班级 宿舍号 性别 年龄 专业02111101 陈红 021111 429 女 18 机械系03111203 赵娜 031112 101 女 18 能源与环境对功能3(修改学生信息)的测试:输入要修改学生的姓名:林丹,系统显示“该学生信息不存在”。输入修改学生姓名:张三,系统显示出该学生信息。选择修改学号为:05111118,系统显示出修改后的学生信息。对功能4(删除学生信息)的测试:输入要删除学生的学号:03111210,系统显示“该学生信息不存在”。输入要删除的学生的学号:03111203,系统显示出该学生信息。选择删除该学生信息。对功能5(查询学生信息)的测试:查询宿舍号为429的信息,系统显示为:学号 姓名 班级 宿舍号 性别 年龄 专业02111101 陈红 021111 429 女 18 机械系05111101 张三 051111 429 女 18 土木工程对功能6(统计学生信息)的测试:选择按学号统计,系统显示为:学号 姓名 班级 宿舍号 性别 年龄 专业02111101 陈红 021111 429 女 18 机械系04111102 李四 041111 218 男 18 信息工程05111101 张三 051111 429 女 18 土木工程 学生总人数3人,其中男生1人,女生2人。 对功能7(退出系统)的测试:选择退出系统,程序关闭。2. 详细设计及运行结果1) 函数调用关系图2) 部分模块流程图及运行结果截屏主页界面主页流程图开始功能选择是录入模块选1否是添加模块选2否是修改模块选3否是删除模块选4否是选5查询模块否是选6统计模块否选0退出系统结束录入界面输入姓名输入班级输入宿舍输入学号输入性别输入年龄输入专业是否继续录入结 束NY录入界面修改模块输入要修改学生的姓名功能选择选1选7选4选8选2选3选5选6修改学号修改姓名修改班级修改宿舍修改性别修改年龄修改专业是否继续结束返回主页是是是是是是是是否否否否否否否修改界面统计模块输入统计方式功能选择选1选4选6选2选3选5按学号按宿舍按性别按班级按专业结束返回主页是是是是是是否否否否否统计界面六、 心得体会“万事开头难”这句话在我编写程序的过程中得到了真正的体现。在最初编写的几天里出现了这样那样的错误一大堆,这主要是由于我对基础知识掌握不扎实所造成的。但是随后几天里,我对课本知识进行了回顾并不时的向老师和同学进行请教,慢慢的对编写程序也开始得心应手起来。程序的编写总归是一件费时费力的事情,但只要我们认真编写和调试最后总能成功。 短短以周实习时间我收获颇多,我相信经过这次实习必将为我以后的深入学习打下扎实的基础。七、 源程序#include<stdio.h>#include<string.h>#include<stdlib.h>#include<io.h>#define N 900struct st_message /*学生信息*/ char name20; /*学生姓名*/char dorm7; /*宿舍号*/char num10; /*学号*/char sex5; /*性别*/char age4; /*年龄*/char major20; /*专业*/char classs8; /*班级*/stN,t;sort_message() /*排序模块*/int i,j,fno,fsize,fnum;FILE *fp;fp=fopen("student.txt","rt+"); if(fp=NULL) printf("nn*文件打开错误。按任意键退出!"); getchar(); exit(1); fno=fileno(fp); fsize=filelength(fno); fnum=fsize/sizeof(struct st_message); for(i=0;i<fnum;i+) fread(&sti,sizeof(struct st_message),1,fp); for(i=0;i<fnum-1;i+) for(j=i+1;j<fnum;j+) if(strcmp(sti.num,stj.num)>0) t=sti; sti=stj; stj=t; rewind(fp); for(i=0;i<fnum;i+) fwrite(&sti,sizeof(struct st_message),1,fp); fclose(fp); input_message() /*录用信息模块*/int i; char choice; FILE *fp; fp=fopen("student.txt","at+"); if(fp=NULL) printf("nn*库存文件不存在!请建立。按任意键退出!"); getchar(); exit(1); for (i=0;i+) system ("cls"); getchar(); printf("请输入学生姓名:"); gets(sti.name); printf("n请输入学生班级:"); gets(sti.classs); printf("n请输入学生宿舍号:"); gets(sti.dorm); printf("n请输入学生学号:"); gets(sti.num); printf("n请输入学生性别:"); gets(sti.sex); printf("n请输入学生年龄:"); gets(sti.age); printf("n请输入学生专业:"); gets(sti.major); fwrite(&sti,sizeof(struct st_message),1,fp); printf("输入成功!n是否继续录入(Y/N)?"); choice=getchar(); if(choice=y|choice=Y) continue; else fclose(fp); break; append_message() /*添加模块*/int i; char choice; FILE *fp; fp=fopen("student.txt","at+"); if(fp=NULL) printf("nn*库存文件不存在!请建立。按任意键退出!"); getchar(); exit(1); for (i=0;i+) struct st_message stN; system ("cls"); getchar(); printf("请输入所添加学生姓名:"); gets(sti.name); printf("n请输入所添加学生班级:"); gets(sti.classs); printf("n请输入所添加学生宿舍号:"); gets(sti.dorm); printf("n请输入所添加学生学号:"); gets(sti.num); printf("n请输入所添加学生性别:"); gets(sti.sex); printf("n请输入所添加学生年龄:"); gets(sti.age); printf("n请输入所添加学生专业:"); gets(sti.major); fwrite(&sti,sizeof(struct st_message),1,fp); printf("输入成功!n是否继续添加(Y/N)?"); choice=getchar(); if(choice=y|choice=Y) continue; else fclose(fp); break; revise_message() /*修改模块*/int i,choice,flag,fno,fsize,fnum; char re_name20,s20; FILE *fp; do fp=fopen("student.txt","rt+"); fno=fileno(fp); fsize=filelength(fno); fnum=fsize/sizeof(struct st_message); system("cls"); gets(s); printf("请输入需要修改的学生姓名:"); gets(re_name); for (i=0;i<fnum;i+) fread(&sti,sizeof(struct st_message),1,fp); if(!strcmp(re_name,sti.name) printf("n -该学生信息-nn"); printf("学号-姓名-班级-宿舍号-性别-年龄-专业-n"); printf("-n"); printf("%-8s %-6s %-4s %-6s %-4s %-4s %-20sn",sti.num,sti.name,sti.classs,sti.dorm,sti.sex,sti.age,sti.major); printf("您要修改哪一项?n"); printf("1.学号n"); printf("2.姓名n"); printf("3.班级n"); printf("4.宿舍号n"); printf("5.性别n"); printf("6.年龄n"); printf("7.专业n"); printf("8.返回主页n"); scanf("%d",&choice); switch(choice) case 1:printf("n请输入修改后的学号:"); scanf("%s",sti.num);break; case 2:printf("n请输入修改后的姓名:"); scanf("%s",sti.name);break; case 3:printf("n请输入修改后的班级:"); scanf("%s",sti.classs);break; case 4:printf("n请输入修改后的宿舍号:"); scanf("%s",sti.dorm);break; case 5:printf("n请输入修改后的性别:"); scanf("%s",sti.sex);break; case 6:printf("n请输入修改后的年龄:"); scanf("%s",sti.age);break; case 7:printf("n请输入修改后的专业:"); scanf("%s",sti.major);break; case 8:return 1; getchar(); system("cls"); printf("n -修改后的学生信息-nn"); printf("学号-姓名-班级-宿舍号-性别-年龄-专业-n"); printf("-n"); printf("%-8s %-6s %-4s %-6s %-4s %-4s %-20sn",sti.num,sti.name, sti.classs,sti.dorm,sti.sex,sti.age,sti.major); rewind(fp); fseek(fp,sizeof(struct st_message)*i,0); fwrite(&sti,sizeof(struct st_message),1,fp); fclose(fp); break; if(i=fnum) printf("n该学生信息不存在!"); printf("nn继续修改吗?(Y/N)"); choice=getchar(); if(choice=Y|choice=y) flag=1; system("pause"); else flag=0; while(flag=1); return 1; delete_message() /*删除模块*/int i,j,choice,fno,fsize,fnum; char d_num10; FILE *fp; system("cls"); getchar(); fp=fopen("student.txt","rt"); if(fp=NULL) printf("nn*库存文件不存在!请先建立。按任意键退出!"); getchar(); exit(1); fno=fileno(fp); fsize=filelength(fno); fnum=fsize/sizeof(struct st_message); for(i=0;i<fnum;i+) fread(&sti,sizeof(struct st_message),1,fp); printf("请输入需要删除学生的学号:n"); gets(d_num); system("cls"); for(i=0;i<fnum;i+) if(!strcmp(d_num,sti.num) printf("n -该学生信息-nn"); printf("学号-姓名-班级-宿舍号-性别-年龄-专业-n"); printf("-n"); printf("%-8s %-6s %-4s %-6s %-4s %-4s %-20sn",sti.num,sti.name, sti.classs,sti.dorm,sti.sex,sti.age,sti.major); printf("n是否删除该学生信息:n"); printf("1.是n"); printf("2.否n"); scanf("%d",&choice); switch(choice) case 1:for(j=i;j<fnum-1;j+) stj=stj+1; rewind(fp); fp=fopen("student.txt","wt"); for(i=0;i<fnum-1;i+) fwrite(&sti,sizeof(struct st_message),1,fp); fclose(fp); getchar(); break; case 2:printf("按任意键返回主菜单!"); getchar();return 0; break; if(i=fnum) printf("所查学生信息不存在,按任意键返回主菜单!"); getchar(); return 0; printf("删除信息成功,按任意键返回主菜单!"); return 1; find_message() /*查找信息模块*/int i,choice,flag,fno,fsize,fnum; char f_name20; char f_num10; char f_dorm7; FILE *fp; system("cls"); do sort_message(); fp=fopen("student.txt","rt"); if(fp=NULL) printf("nn*库存文件不存在!请先建立。按任意键退出!"); getchar(); exit(1); fno=fileno(fp); fsize=filelength(fno); fnum=fsize/sizeof(struct st_message); system("cls"); printf("请选择查询方式:n"); printf("1.按姓名查询n"); printf("2.按学号查询n"); printf("3.按宿舍号查询n"); printf("4.返回主页n"); scanf("%d",&choice); system("cls"); getchar(); switch(choice) case 1:printf("请输入需要查询的姓名:n"); gets(f_name); printf("n -该学生信息-nn"); printf("学号-姓名-班级-宿舍号-性别-年龄-专业-n"); printf("-n"); for (i=0;i<fnum;i+) if(!strcmp(f_name,sti.name) printf("%-8s %-6s %-4s %-6s %-4s %-4s %-20sn",sti.num,sti.name, sti.classs,sti.dorm,sti.sex,sti.age,sti.major); printf("-n"); break; case 2:printf("请输入要查询的学号:"); gets(f_num); printf("n -该学生信息-nn"); printf("学号-姓名-班级-宿舍号-性别-年龄-专业-n"); printf("-n"); for (i=0;i<fnum;i+) fread(&sti,sizeof(struct st_message),1,fp); if(!strcmp(f_num,sti.num) printf("%-8s %-6s %-4s %-6s %-4s %-4s %-20sn",sti.num,sti.name, sti.classs,sti.dorm,sti.sex,sti.age,sti.major); printf("-n"); break; case 3:printf("请输入要查询的宿舍号:"); gets(f_dorm); printf("n -该宿舍学生信息-nn"); printf("学号-姓名-班级-宿舍号-性别-年龄-专业-n"); printf("-n"); rewind(fp); for (i=0;i<fnum;i+) fread(&sti,sizeof(struct st_message),1,fp); if(!strcmp(f_dorm,sti.dorm) printf("%-8s %-6s %-4s %-6s %-4s %-4s %-20sn",sti.num,sti.name, sti.classs,sti.dorm,sti.sex,sti.age,sti.major); printf("-n"); break; case 4:return 0; printf("nn继续查询吗?(Y/N)"); choice=getchar(); if(choice=Y|choice=y) flag=1; system("pause"); else flag=0; while(flag=1); return 1; census_message() /*统计信息模块*/int i,choice,fno,fsize,fnum; int m=0,n=0,k=0; char dorm7; char classs8; char major20; FILE *fp; sort_message(); fp=fopen("student.txt","rt"); if(fp=NULL) printf("nn*文件打开错误。按任意键退出!"); getchar(); exit(1); fno=fileno(fp); fsize=filelength(fno); fnum=fsize/sizeof(struct st_message); system("cls"); printf("请选择显示方式:n"); printf("1.按学号显示n"); printf("2.按宿舍号显示n"); printf("3.按性别显示n"); printf("4.按班级显示n"); printf("5.按专业显示n"); printf("6.返回主页n"); scanf("%d",&choice); system("cls"); switch(choice) case 1: printf("n -学生信息-nn"); printf("学号-姓名-班级-宿舍号-性别-年龄-专业-n"); printf("-n"); for(i=0;i<fnum;i+) fread(&sti,sizeof(struct st_message),1,fp); printf("%-8s %-6s %-4s %-6s %-4s %-4s %-20sn",sti.num,sti.name, sti.classs,sti.dorm,sti.sex,sti.age,sti.major); k+; if(!strcmp(sti.sex,"男") m+; if(!strcmp(sti.sex,"女") n+; printf("-n"); printf("nn学生总人数为%d,其中男生为%d,女生为%d。",k,m,n); break; case 2: getchar(); printf("请输入要显示的宿舍号:"); gets(dorm); printf("n -该宿舍学生信息-nn"); printf("学号-姓名-班级-宿舍号-性别-年龄-专业-n"); for (i=0;i<fnum;i+) if(!strcmp(dorm,sti.dorm) printf("-n"); printf("%-8s %-6s %-4s %-6s %-4s %-4s %-20sn",sti.num,sti.name, sti.classs,sti.dorm,sti.sex,sti.age,sti.major); break; case 3:printf("请输入需要显示的性别:n"); printf("1.男n"); printf("2.女n"); scanf("%d",&choice); printf("n -学生信息-nn"); printf("学号-姓名-班级-宿舍号-性别-年龄-专业-n"); printf("-n"); switch(choice)case 1: for(i=0;i<fnum;i+) if(!strcmp(sti.sex,"男") printf("%-8s %-6s %-4s %-6s %-4s %-4s %-20sn",sti.num,sti.name, sti.classs,sti.dorm,sti.sex,sti.age,sti.major); m+; printf("-n"); printf("nn男生人数为%d。",m); break; case 2: for(i=0;i<fnum;i+) if(!strcmp(sti.sex,"女") printf("%-8s %-6s %-4s %-6s %-4s %