寝室管理系统c语言.docx
《寝室管理系统c语言.docx》由会员分享,可在线阅读,更多相关《寝室管理系统c语言.docx(26页珍藏版)》请在冰豆网上搜索。
寝室管理系统c语言
课程设计成绩
考勤成绩(%)
指导老师评语
报告及程序成绩(%)
总评成绩
指导老师签名:
《数据结构》
课程设计报告
学院(系):
电计系
班级:
软件一班
学生姓名:
董涛学号201020205114
指导教师:
李思莉
时间:
从2011年9月5日到2011年9月9日
课程设计题目
一、程序设计目标
建立数据文件,数据文件按关键字包含(姓名、学号、房号),本程序采用冒泡排序发排序,实现按照姓名首字母排序,学号排序,以及寝室号排序,因为查找时涉及相同姓名以及相同寝室号的情况,故查找采用的是顺序查找法,考虑到方便管理,故以一栋楼为对象,人数上限设为400,可设立外部程序调用每栋楼的数据,即可实现对全院是寝室管理。
姓名字符长度不能超过20,学号要12位数字,寝室号格式为X+5位数字,未按照规定输入时会自提示出错,然后退出程序,菜单选项分别有:
0,插入学员
插入学员能在指定的寝室中插入,输入寝室号,规定每个寝室住4人,如果该寝室人数已满,则会显示:
该寝室人数已满!
插入成功会提醒:
恭喜你已是该寝室成员。
该项功能将有助于小规模调寝室。
1,重新输入学员
重新输入学员。
功能是格式化原来记录,重新输入新成员,用于大规模的寝室调动。
2,删除记录
删除记录是输入学号进行删除,因为考虑到按照姓名删除会出现相同姓名的情况,故只设这种删除方式。
3,按照姓名查找
输入姓名后能查找该姓名的人的姓名,学号以及房号,相同姓名的人也会一起找到,并显示出来。
4,按照学号查找
输入学号,能准确快速的找到你要查找的记录。
一旦找到记录,就会即刻跳出循环,减少时间。
5,按照寝室号查找
输入寝室号,会显示该寝室里住的每个成员。
6,按照姓名排序
按照姓名的首字母排序。
从a到z。
7,按照学号排序
按照学号的大小排序。
从小到大。
8,按照寝室号排序
按照寝室号码的顺序排序,从小到大。
9,显示记录
打印出所有记录。
10,保存记录
保存记录到程序目录下的record.txt文件中。
11,加载记录
自动读取程序目录下的record.txt文件。
12,退出
退出整个程序。
1、问题描述
建立结构体,结构体元素有:
姓名,学号,寝室号。
用switch语句和循环语句实现程序的反复使用,用了结构体,排序,折半查找,问题关键在用折半查找法找出名字相同的人,寝室号相同的多个人,文件的保存和读取。
2、问题分析
排序直接比较字符的大小,折半查找查多个人:
用折半查找先找到其中一个人,然后再用那个人和相邻的人比较,相同的就打印出来。
由此解决了用折半查找,找出多个人的问题。
二、概要设计
利用switch语句将程序各个部分联系起来,函数相互调用,可实现交互作用。
1、数据结构:
姓名,学号,寝室号
2、程序模块:
12个功能模块+主程序+菜单选项
3、各模块之间的调用关系:
用主程序进入菜单选项,用switch语句连接所有功能函数,折半查找用了排序功能。
三、详细设计
模块的功能描述
流程框图
四、C源程序清单:
//1213.cpp:
Definestheentrypointfortheconsoleapplication.
//
#include"stdafx.h"
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
#include"ctype.h"
#defineM400/*M为寝室总人数*/
typedefstruct/*定义一个结构体,存姓名,学号,寝室号*/
{
charname[20];/*姓名*/
charxuehao[20];/*学号*/
charfanghao[20];/*寝室号*/
}ADDRESS;
inttianjia(ADDRESSt[]);/*重新添加成员*/
intshanchu(ADDRESSt[],intn);/*删除寝室成员*/
intxingming(ADDRESSt[],intn);/*按照姓名查找*/
intxuehao(ADDRESSt[],intn);/*按照学号查找*/
intfanghao(ADDRESSt[],intn);/*按照寝室号查找*/
voidxingmingpx(ADDRESSt[],intn);/*按照姓名排序*/
voidxuehaopx(ADDRESSt[],intn);/*按照学号排序*/
voidfanghaopx(ADDRESSt[],intn);/*按照寝室号排序*/
voidxianshi(ADDRESSt[],intn);/*显示*/
voidsave(ADDRESSt[],intn);/*保存记录*/
intmenu_select();/*主菜单*/
intload(ADDRESSt[]);/*从外部加载文件记录*/
intadd(ADDRESSt[],intn);/*添加成员*/
voidmain()/*主函数*/
{
ADDRESSadr[M];/*定义一个结构体数组,M=400*/
intlength;/*成员个数*/
system("cls");/*清屏*/
for(;;)/*无限循环,实现重复操作*/
{
switch(menu_select())/*功能选项*/
{
case0:
length=add(adr,length);break;
case1:
length=tianjia(adr);break;
case2:
length=shanchu(adr,length);break;
case3:
xingming(adr,length);break;
case4:
xuehao(adr,length);break;
case5:
fanghao(adr,length);break;
case6:
xingmingpx(adr,length);break;
case7:
xuehaopx(adr,length);break;
case8:
fanghaopx(adr,length);break;
case9:
xianshi(adr,length);break;
case10:
save(adr,length);break;
case11:
length=load(adr);break;
case12:
exit(0);/*退出*/
}
}
}
intmenu_select()/*主菜单*/
{
chars[80],a;/*用s装选择的数字*/
intc;/*整形C*/
printf("pressanykeyentermenu......\n");
scanf("%s",&a);
system("cls");/*清屏*/
printf("**********welcometouseme!
************\n");
printf("*0,插入学员*\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");
printf("*9,显示记录*\n");
printf("*10,保存记录*\n");
printf("*11,加载记录*\n");
printf("*12,退出*\n");
printf("****************************************\n");
do{
printf("\n请选择:
");
scanf("%s",s);
c=atoi(s);/*将字符S转化为整数*/
}while(c<0||c>12);/*c的输入值在~12有效,否则一直选择*/
returnc;/*返回C值供switch用*/
}
inttianjia(ADDRESSt[])/*重新输入记录*/
{
chara;
inti,n;
system("cls");/*clrscr();/*清屏*/
printf("\n输入记录个数(到):
\n");
scanf("%d",&n);/*输入记录的个数*/
while(n<0||n>400)
{
printf("输入记录个数有误,请重新输入记录个数(到):
\n");
scanf("%d",&n);/*输入记录的个数*/
}
printf("输入记录:
\n");
printf("姓名学号寝室号\n");
printf("------------------------------------------------\n");
for(i=0;i{
scanf("%s%s%s",t[i].name,t[i].xuehao,t[i].fanghao);
printf("------------------------------------------------\n");
if(strlen(t[i].name)>20)
{
printf("你输入的姓名有误,按任意键退出:
");
scanf("%s",&a);
exit
(1);
}
if(strlen(t[i].xuehao)!
=12)
{
printf("你输入的学号有误,按任意键退出:
");
scanf("%s",&a);
exit
(1);
}
if(strlen(t[i].fanghao)!
=6)
{
printf("你输入的寝室号有误,按任意键退出:
");
scanf("%s",&a);
exit
(1);
}
}
returnn;/*返回n的值*/
}
voidxianshi(ADDRESSt[],intn)/*显示记录*/
{
inti;
chara;
system("cls");/*clrscr();*/
if(n>M){/*当没有记录时,M为一个很大的随机数,利用此属性,解决没记录时点击显示出现乱码的BUG*/
printf("没有可以显示的类容,按任意键退出!
!
!
");
scanf("%s",&a);
exit
(1);
}
printf("\n******************************************\n");
printf("姓名学号寝室号\n");
printf("-----------------------------------------------\n");
for(i=0;iprintf("%-20s%-20s%-20s\n",t[i].name,t[i].xuehao,t[i].fanghao);
printf("-----------------------------------------------\n");
if((i+1)%10==0)/*以十个为一组,用-------分割开,便于观察*/
{
printf("----------------------------------------------\n");
}
printf("按任意键继续.......\n");/*按任意键继续*/
}
intshanchu(ADDRESSt[],intn)/*删除记录*/
{
chars[20];/*S存储姓名*/
intch=0;
inti,j,b=-1;
printf("请输入要删除的人的学号:
\n");/*请输入要删除的人的学号*/
scanf("%s",s);
for(i=0;i{
if(strcmp(s,t[i].xuehao)==0)/*当输入的姓名和已找到姓名相同时,将i赋值b*/
{
b=i;
break;/*找到后就退出查找,节约时间*/
}
}
if(b!
=-1)/*如果b不为-1,那么执行删除命令*/
{
printf("要删除的记录为:
\n%-20s%-20s%-20s\n确认按:
1取消按:
0\n",t[b].name,t[b].xuehao,t[b].fanghao);/*打印出查找到的记录*/
scanf("%s",&ch);
if(ch=='1')/*确认删除*/
{
for(j=i+1;j{
strcpy(t[j-1].name,t[j].name);
strcpy(t[j-1].xuehao,t[j].xuehao);
strcpy(t[j-1].fanghao,t[j].fanghao);
}
n--;/*n的值减一*/
}
elseprintf("已经取消操作\n");/*否则,取消操作*/
}
elseprintf("未找到你要删除的记录\n");/*如果B=0,未找到你要删除的记录*/
returnn;/*返回n的值*/
}
intxingming(ADDRESSt[],intn)/*按照姓名查找,二分查找法*/
{
chars[20];
inti=1,j=1;
intlow,mid,high;
printf("输入你要查找的人的姓名:
\n");/*输入你要查找的人的姓名*/
scanf("%s",s);
xingmingpx(t,n);
system("cls");/*清屏*/
low=0;high=n-1;
printf("你要查找的人是:
\n姓名学号寝室号\n----------------------------------------------------\n");
while(low<=high)
{
mid=(low+high)/2;
if(strcmp(t[mid].name,s)==0)
{
printf("%-20s%-20s%-20s\n",t[mid].name,t[mid].xuehao,t[mid].fanghao);
while((strcmp(t[mid].name,t[mid+i].name))==0||(strcmp(t[mid].name,t[mid-j].name))==0){/*分别判断左右字符是否相同*/
if((strcmp(t[mid].name,t[mid+i].name))==0){/*如果右字符相同,打印出来,i++*/
printf("%-20s%-20s%-20s\n",t[mid+i].name,t[mid+i].xuehao,t[mid+i].fanghao);
i++;
}
if((strcmp(t[mid].name,t[mid-j].name))==0){/*如果左字符相同,打印出来,j++*/
printf("%-20s%-20s%-20s\n",t[mid-j].name,t[mid-j].xuehao,t[mid-j].fanghao);
j++;
}
}
break;
}
elseif(strcmp(t[mid].name,s)>0)high=mid-1;
elselow=mid+1;
}
if(strcmp(t[mid].name,s)!
=0)
printf("未找到记录\n");
return0;
}
intxuehao(ADDRESSt[],intn)/*按照学号查找*/
{
chars[20];
intlow,mid,high;
printf("输入你要查找的人的学号:
\n");/*输入你要查找的人的学号*/
scanf("%s",s);
xuehaopx(t,n);
system("cls");/*清屏*/
low=0;high=n-1;
printf("你要查找的人是:
\n姓名学号寝室号\n----------------------------------------------------\n");
while(low<=high)
{
mid=(low+high)/2;
if(strcmp(t[mid].xuehao,s)==0)
{
printf("%-20s%-20s%-20s\n",t[mid].name,t[mid].xuehao,t[mid].fanghao);
break;
}
elseif(strcmp(t[mid].xuehao,s)>0)high=mid-1;
elselow=mid+1;
}
if(strcmp(t[mid].xuehao,s)!
=0)
printf("未找到记录\n");
return0;
}
intfanghao(ADDRESSt[],intn)/*按照寝室号码查找*/
{
chars[20];
inti=1,j=1;
intlow,mid,high;
printf("输入你要查找的寝室号码:
\n");/*输入你要查找的寝室号码*/
scanf("%s",s);
fanghaopx(t,n);
system("cls");/*清屏*/
low=0;high=n-1;
printf("你要查找的人是:
\n姓名学号寝室号\n----------------------------------------------------\n");
while(low<=high)
{
mid=(low+high)/2;
if(strcmp(t[mid].fanghao,s)==0)
{
printf("%-20s%-20s%-20s\n",t[mid].name,t[mid].xuehao,t[mid].fanghao);
while((strcmp(t[mid].fanghao,t[mid+i].fanghao))==0||(strcmp(t[mid].fanghao,t[mid-j].fanghao))==0)/*分别判断左右字符是否相同*/
{
if((strcmp(t[mid].fanghao,t[mid+i].fanghao))==0){/*如果右字符相同,打印出来,i++*/
printf("%-20s%-20s%-20s\n",t[mid+i].name,t[mid+i].xuehao,t[mid+i].fanghao);
i++;
}
if((strcmp(t[mid].fanghao,t[mid-j].fanghao))==0){/*如果左字符相同,打印出来,j++*/
printf("%-20s%-20s%-20s\n",t[mid-j].name,t[mid-j].xuehao,t[mid-j].fanghao);
j++;
}
}
break;
}
elseif(strcmp(t[mid].fanghao,s)>0)high=mid-1;
elselow=mid+1;
}
if(strcmp(t[mid].fanghao,s)!
=0)
printf("未找到记录\n");
return0;
}
voidxingmingpx(ADDRESSt[],intn)/*按照姓名排序*/
{
inti,j;
ADDRESStemp;/*结构体temp*/
for(i=0;i{
for(j=0;j{
if(strcmp(t[i].name,t[j].name)<0)
{
strcpy(temp.name,t[i].name);
strcpy(t[i].name,t[j].name);
strcpy(t[j].name,temp.name);
strcpy(temp.xuehao,t[i].xuehao);
strcpy(t[i].xuehao,t[j].xuehao);
strcpy(t[j].xuehao,temp.xuehao);
strcpy(temp.fanghao,t[i].fanghao);
strcpy(t[i].fanghao,t[j].fanghao);
strcpy(t[j].fanghao,temp.fanghao);
}
}
}
printf("排序成功!
!
!
\n");/*排序成功*/
}
voidxuehaopx(ADDRESSt[],intn)/*按照学号排序*/
{
inti,j;
ADDRESStemp;
for(i=0;i{
for(j=0;j{
if(strcmp(t[i].xuehao,t[j].xuehao)<0)
{
strcpy(temp.name,t[i].name);
strcpy(t[i].name,t[j].name);
strcpy(t[j].name,temp.name);
strcpy(temp.xuehao,t[i].xuehao);
strcpy(t[i].xuehao,t[j].xuehao);
strcpy(t[j].xuehao,temp.xuehao);
strcpy(temp.fanghao,t[i].fanghao);
strcpy(t[i].fanghao,t[j].fanghao);
strcpy(t[j].fanghao,temp.fanghao);
}
}
}
printf("排序成功!
!
!
\n");
}
voidfanghaopx(ADDRESSt[],intn)/*按照寝室号查找*/
{
inti