一、实验目的
1.熟练掌握线性表的基本操作在顺序存储和链式存储上的实现。、;
2.以线性表的各种操作(建立、插入、删除、遍历等)的实现为重点;
3.掌握线性表的动态分配顺序存储结构的定义和基本操作的实现;
4.通过实验帮助学生加深对C语言的使用(特别是函数的参数调用、指针类型的应用和链表的建立等各种基本操作)。
二、实验内容
我组设计的是“学生宿舍管理系统”,主要是针对住宿学生个人信息的管理,适用对象主要是学校,以方便学校对住宿学生的管理。包括学生的姓名、学号、性别、专业、班级等等。在编写过程中主要运用C语言的基本知识有:数据类型(整形、实型、字符型、指针、数组、结构等);运算类型(算术运算、逻辑运算、自增自减运算、赋值运算等);程序结构(顺序结构、判断选择结构、循环结构);大程序的功能分解方法(即函数的调用与使用)等。
三、实验环境
台式计算机每人一台;
软件:Visual C++6.0;
四、需求分析
该程序是由C语言编写的一个宿舍管理查询软件,本程序在Microsoft Visual C++ 6.0下运行,其主要功能是实现对学生信息的录入、添加、删除、修改、查询、统计。其中查询可以分别以姓名、学号、宿舍号为关键字查询学生信息。统计可以分别以学号、宿舍号、性别、班级、专业为关键字进行统计,并且输出信息按学号大小从小到大输出。
五、概要设计
1、方案设计
2、数据结构说明
程序中数据主要是学生信息和宿舍信息,具体属于类型如下:
struct stu
{
char name[20];
int num;
char sex;
int age;
int grade;
int nclass;
char zhuanye[30];
};
struct dom
{
int bui_num;
int floor_num;
int room_num;
int bed_num;
struct stu st;
}s[MAX],p;
3、模块功能说明
第一密码模块:调用cipher(),进行管理者的注册与登录操作。
第二录入模块:调用input_message(),对住宿学生信息进行录入。
第三添加模块:调用append_message(),对新来学生信息进行添加录入。
第四修改模块:调用revise_message(),对需修改学生的信息进行修改。
第五删除模块:调用delete_message(),对某一学生信息进行删除操作。
第六查询模块:调用find_message(),分别以姓名、学号、宿舍号对学生信息进行查询。
第七统计模块:调用census_message(),分别以学号、宿舍号、性别、班级、专业方式对学生信息进行统计,并按学号由小到大输出。
六、详细设计及运行结果
1、登陆界面
2、主界面
3、录入模块
4、录入界面
5、打印学生信息界面
6、更新学生信息界面
7、查询宿舍信息界面
8、统计宿舍信息界面
9、学生宿舍排序
七、源程序
#include #include "string.h" #define MAX 10 #define PRINT1 printf("---------------------------------------------------------------------------\\n") #define PRINT2 printf("学号--学生姓名--性别--年龄--年级--班级--专业--楼号--楼层号--房间号--床号\\n\\n") int sum; struct stu { char name[20]; int num; char sex; int age; int grade; int nclass; char zhuanye[30]; }; struct dom { int bui_num; int floor_num; int room_num; int bed_num; struct stu st; }s[MAX],p; /*保存信息*/ save_message() { FILE *fp; int i; if((fp=fopen("dom.txt { printf("读文件错误!\\n"); return 0; } for(i=0;i printf("写文件错误!\\n"); fclose(fp); } /*输入模块*/ input_message() { int i=0; //clrscr(); printf("\\n\\n 录入学生信息(最多%d个)\\n",MAX); printf(" ----------------------------\\n"); do { printf("\\n 第%d个学生\\n\\n",i+1); printf("\\n 学号: "); scanf("%d",&s[i].st.num); if(s[i].st.num==0) break; printf("\\n 学生姓名: "); scanf("%s",s[i].st.name); printf("\\n 学生性别(男生用M表示,女生用F表示):"); getchar(); scanf("%c",&s[i].st.sex); printf("\\n 学生年龄: "); scanf("%d",&s[i].st.age); printf("\\n 学生年级: "); scanf("%d",&s[i].st.grade); printf("\\n 学生班级: "); scanf("%d",&s[i].st.nclass); printf("\\n 学生专业: "); scanf("%s",&s[i].st.zhuanye); printf("\\n 宿舍楼号: "); scanf("%d",&s[i].bui_num); printf("\\n 宿舍楼层号: "); scanf("%d",&s[i].floor_num); printf("\\n 宿舍房间号: "); scanf("%d",&s[i].room_num); printf("\\n 宿舍床号: "); scanf("%d",&s[i].bed_num); i++; }while(i sum=i; printf("\\n 按任意键返回主菜单!"); getchar(); // bioskey(0); return 0; } /*读取信息*/ int read_message() { FILE *fp; int i=0; if((fp=fopen("dom.txt { printf("\\n\\n*****暂时还没有任何信息,按任意键进入主菜单选择基本信息的录入!*****\\n"); return 0; } while(!feof(fp)) { fread(&s[i],sizeof(struct dom),1,fp); i++; } fclose(fp); return(i); } /*输出模块*/ output_message() { int i=0; // clrscr(); printf("\\n\\n --学生信息表-- \\n\\n"); PRINT2; PRINT1; for(i=0;i { printf("%2d%10s%6c%7d%6d%5d%8s%5d%6d%8d%9d\\n\\n",s[i].st.num,s[i].st.name,s[i].st.sex,s[i].st.age, s[i].st.grade,s[i].st.nclass,s[i].st.zhuanye,s[i].bui_num,s[i].floor_num,s[i].room_num,s[i].bed_num); printf("\\n"); // bioskey(0); } return 0; /// } /*添加学生信息*/ insert_message() {int i=sum,flag=0; char choice; printf("\\n\\n 添加一个新同学\\n"); printf(" ---------------\\n"); do { printf("\\n 新学号: "); scanf("%d",&s[i].st.num); printf("\\n 学生姓名: "); scanf("%s",s[i].st.name); printf("\\n 学生性别(男生用M表示,女生用F表示):"); getchar(); scanf("%c",&s[i].st.sex); printf("\\n 学生年龄: "); scanf("%d",&s[i].st.age); printf("\\n 学生年级: "); scanf("%d",&s[i].st.grade); printf("\\n 学生班级: "); scanf("%d",&s[i].st.nclass); printf("\\n 学生专业: "); scanf("%s",s[i].st.zhuanye); printf("\\n 宿舍楼号: "); scanf("%d",&s[i].bui_num); printf("\\n 宿舍楼层号: "); scanf("%d",&s[i].floor_num); printf("\\n 宿舍房间号: "); scanf("%d",&s[i].room_num); printf("\\n 宿舍床号: "); scanf("%d",&s[i].bed_num); sum++; printf("\\n 要继续吗?(Y/N)"); getchar(); scanf("%c",&choice); if(choice=='y' || choice=='Y') { flag=1; i++; printf("\\n 继续!\\n"); } else flag=0; }while(flag==1); printf("\\n 按任意键返回主菜单!"); return 0; } /*删除模块*/ del_message() {int flag,del_num,i,k; char choice; do {printf("\\n 输入要删除的学生学号: "); scanf("%d",&del_num); for(i=0;i for(k=i;k sum--; printf("\\n\\n 继续吗?(Y/N)"); getchar(); scanf("%c",&choice); if(choice=='y' || choice=='Y') { flag=1; printf("\\n 继续!\\n"); } else flag=0; }while(flag==1); printf("\\n\\n 按任意键返回主菜单!"); getchar(); return 0; } /*修改模块*/ revise_message() {int i=0,choices,revise_num,flag=0; char choice; do { printf("\\n 输入要修改的学生号: "); scanf("%d",&revise_num); for(i=0;i { printf("\\n --学生信息--\\n"); PRINT1; PRINT2; printf("%2d%10s%6c%7d%6d%5d%8s%5d%6d%8d%9d\\n\\n",s[i].st.num,s[i].st.name,s[i].st.sex,s[i].st.age,s[i].st.grade,s[i].st.nclass,s[i].st.zhuanye,s[i].bui_num,s[i].floor_num,s[i].room_num,s[i].bed_num); 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 10.房间号\\n"); printf("\\n 11.床号\\n"); printf("\\n 请选择(1-11): "); scanf("%d",&choices); switch(choices) { case 1:printf("\\n 输入修改后的学号"); scanf("%d",&s[i].st.num);break; case 2:printf("\\n 输入修改后的姓名"); scanf("%s",s[i].st.name);break; case 3:printf("\\n 输入修改后的性别"); scanf("%s",s[i].st.sex);break; case 4:printf("\\n 输入修改后的年龄"); scanf("%d",&s[i].st.age);break; case 5:printf("\\n 输入修改后的年级"); scanf("%d",&s[i].st.grade);break; case 6:printf("\\n 输入修改后的班级"); scanf("%d",&s[i].st.nclass);break; case 7:printf("\\n 输入修改后的专业"); scanf("%s",&s[i].st.zhuanye);break; case 8:printf("\\n 输入修改后的楼号"); scanf("%d",&s[i].bui_num);break; case 9:printf("\\n 输入修改后的楼层号"); scanf("%d",&s[i].floor_num);break; case 10:printf("\\n 输入修改后的房间号"); scanf("%d",&s[i].room_num);break; case 11:printf("\\n 输入修改后的床号"); scanf("%d",&s[i].bed_num);break; } PRINT1; PRINT2; printf("%2d%10s%6c%7d%6d%5d%8s%5d%6d%8d%9d\\n\\n",s[i].st.num,s[i].st.name,s[i].st.sex,s[i].st.age,s[i].st.grade,s[i].st.nclass,s[i].st.zhuanye,s[i].bui_num,s[i].floor_num,s[i].room_num,s[i].bed_num); break; } if(i==sum) printf("\\n 该学生不存在!"); // bioskey(0); return 0; /* printf("\\n\\n 继续修改吗?(Y/N)"); getchar(); scanf("%c",&choice); if(choice=='y'|| choice=='Y') { flag=1; printf("\\n 继续!\\n"); } else flag=0; */ }while(flag==1); getchar(); printf("\\n 按任意键返回主菜单! "); return 0; } /*更新模块*/ renew_message() { int choice; do { printf("\\n\\n\\n *****更新学生信息*****\\n\\n"); printf(" 1.添加学生信息\\n\\n"); printf(" 2.删除学生信息\\n\\n"); printf(" 3.修改学生信息\\n\\n"); printf(" 0.返回主菜单\\n\\n"); printf(" 请选择(0-3): "); scanf("%d",&choice); switch(choice) { case 1:insert_message();break; case 2:del_message();break; case 3:revise_message();break; case 0:break; } }while(choice!=0); return 0; } inquire_name() /*按姓名查询*/ { int i,j=0; char inquire_name[10]; printf("\\n 输入要查询的学生姓名: "); scanf("%s",inquire_name); for(i=0;i { printf("\\n --学生信息-- \\n"); PRINT1; PRINT2; printf("%2d%10s%6c%7d%6d%5d%8s%5d%6d%8d%9d\\n\\n",s[i].st.num,s[i].st.name,s[i].st.sex,s[i].st.age, s[i].st.grade,s[i].st.nclass,s[i].st.zhuanye,s[i].bui_num,s[i].floor_num,s[i].room_num,s[i].bed_num); } else j++; if(j==sum) printf("\\n 该学生不存在!"); return 0; } int inquire_num() /*按学号查询*/ { int i,j=0,inquire_num; printf("\\n 输入要查询的学生学号: "); scanf("%d",&inquire_num); for(i=0;i { printf("\\n --学生信息--\\n"); PRINT1; PRINT2; printf("%2d%10s%6c%7d%6d%5d%8s%5d%6d%8d%9d\\n\\n",s[i].st.num,s[i].st.name,s[i].st.sex,s[i].st.age, s[i].st.grade,s[i].st.nclass,s[i].st.zhuanye,s[i].bui_num,s[i].floor_num,s[i].room_num,s[i].bed_num); } else j++; if(j==sum) printf("\\n 该学生不存在!"); return 0; } /*查询模块*/ inquire_message() {int choice; do { printf("\\n\\n *****查询学生信息*****\\n\\n"); printf(" 1.按学生姓名查询\\n"); printf(" 2.按学生学号查询\\n"); printf(" 0.回主菜单\\n"); printf(" 请选择(0-2): "); scanf("%d",&choice); switch(choice) { case 1:inquire_name();break; case 2:inquire_num();break; case 0:break; } }while(choice!=0); return 0; } count_person() /*学生住宿情况统计*/ { int i,j=0,count_grade,count_nclass; char count_zhuanye[20]; printf("\\n 输入要统计的学生专业,年级,班级: "); scanf("%10s %8d %8d",&count_zhuanye,&count_grade,&count_nclass); printf("\\n 住宿情况"); printf("\\n -------------------------------\\n"); printf("\\n 姓名 学号 楼号 楼层号 房间号 床号 \\n"); for(i=0;i printf("\\n%10s%8d%8d%8d%8d%8d\\n",s[i].st.name,s[i].st.num,s[i].bui_num,s[i].floor_num, s[i].room_num,s[i].bed_num); else j++; if(j==sum) printf("\\n 该学生不存在!"); return 0; } /*统计模块*/ count_message() { int choice; do { printf("\\n\\n *****统计住宿信息*****\\n"); printf(" 1.学生住宿情况统计\\n"); printf(" 0.返回主菜单\\n"); printf(" 请选择(0-1): "); scanf("%d",&choice); switch(choice) { case 1:count_person();break; case 0:break; } }while(choice!=0); return 0; } sort_domitry() /*学生宿舍情况排序*/ { int i,j ; printf("\\n 宿舍排序\\n"); printf(" --------------------------------------------\\n"); printf("\\n 排序 姓名 学号 性别 楼号 楼层号 房间号 床号\\n"); for(i=0;i for(j=i+1;j p=s[i]; s[i]=s[j]; s[j]=p; } else if(s[i].bui_num==s[j].bui_num) if(s[i].floor_num p=s[i]; s[i]=s[j]; s[j]=p; } else if(s[i].floor_num==s[j].floor_num) if(s[i].room_num p=s[i]; s[i]=s[j]; s[i]=p; } else if(s[i].room_num==s[j].room_num) if(s[i].bed_num p=s[i]; s[i]=s[j]; s[j]=p; } } for(i=0;i printf("\\n%12d%8s%8d%8c%8d%8d%8d%6d\\n\\n",i+1,s[i].st.name,s[i].st.num,s[i].st.sex,s[i].bui_num,s[i].floor_num,s[i].room_num,s[i].bed_num); return 0; } /*排序模块*/ sort_message() { int choice; do { printf("\\n *****宿舍排序*****\\n"); printf(" 1.宿舍情况排序\\n"); printf(" 0.返回主菜单!\\n"); printf(" 请选择(0-1): "); scanf("%d",&choice); switch(choice) { case 1:sort_domitry();break; case 0:break; } } while(choice!=0); return 0; } void main() { int choice; sum=read_message(); // bioskey(0); do { // clrscr(); printf("\\n\\n\\n *****宿舍管理系统*****\\n\\n"); printf(" 1.录入学生信息\\n\\n"); printf(" 2.打印学生信息\\n\\n"); printf(" 3.更新学生信息\\n\\n"); printf(" 4.查询宿舍信息\\n\\n"); printf(" 5.统计宿舍信息\\n\\n"); printf(" 6.学生宿舍排序\\n\\n"); printf(" 0.退出系统\\n\\n"); printf(" 请选择(0-6):"); scanf("%d",&choice); switch(choice) { case 1: input_message(); break; /*录入模块*/ case 2: output_message(); break; /*输出模块*/ case 3: renew_message(); break; /*更新模块*/ case 4: inquire_message(); break; /*查询模块*/ case 5: count_message(); break; /*统计模块*/ case 6: sort_message(); break; /*排序模块*/ ; case 0: break; /*退出系统*/ } }while(choice!=0); save_message(); //save_message(sum) printf("\\n以上学生信息已保存!-(文件名:domitry.txt)\\n"); } 八、心得体会 做了一个星期的程序设计终于做完了,在这次程序设计课中,真是让我获益匪浅,我突然发现写程序还挺有意思的。 通过这次的程序设计,发现一个程序设计就是算法与数据结构的结合体,自己也开始对程序产生了前所未有的兴趣,以前偷工减料的学习也不可能一下子写出一个程序出来,于是我就认真看老师写的程序,发现我们看懂了一个程序其实不难,难的是对于一个程序的思想的理解,我们要掌握一个算法,不仅仅限于读懂,主要的是要理解老师的思路,学习老师的解决问题的方法。自己在写程序的时候,发现自己的知识太少了,特别是基础知识很多都是模模糊糊的一个概念,没有落实到真正的程序,所以自己写的时候也感到万分痛苦! 我以后一定会好好学习,学以致用! { { { {