1、C语言课程设计 设计题目: 住宿结帐管理系统 专 业 计算机科学与技术、软件工程 班 级 计053、软件051、软件052 学 生 郭凌瑞 张亮 方宇 指导教师 王晓帆 2005-2006 年 2 学期 设计任务: 试设计一个住宿结帐管理系统,住宿结帐管理信息包括:顾客姓名、入住时间、住宿房间、顾客数量、每日价格、住宿天数、折扣率、实收金额。系统包括以下功能:住宿信息的录入、修改、删
2、除功能;住宿信息的排序、浏览功能;按住宿天数查询、按住宿房间号码查询;住宿信息的统计:总人数、总收入、空房数。 建议:一人负责信息的录入、修改、删除;一人负责文件的读取与写入操作;一人负责排序、查询。 教师评语: 目录 1、试验目的及内容……………………………3 2、系统总体模块图……………………………3 3、小组任务分工………………………………4 4、子系统设计方案……………………………4 (1) 信息的录入、修改、删除;………………4 (2) 文件的读取与写入、统计、主函数;……4
3、3) 信息的排序、浏览、查询;………………4 5、子系统主要程序流程图……………………4 (1) 信息读取模块流程图………………………5 (2) 信息修改模块流程图………………………6 (3) 信息修改模块流程图 ……………………7 (4) 按住宿时间查询模块流程图………………8 (5) 按房间号码查询模块流程图………………9 6、个人设计小结与心得体会…………………10 7、小组设计总结………………………………11 8、系统源代码…………………………………12 试验目的: (1)加深对C语言的理解,将在书本上掌握的知识点运用到实际的系统编程中去,为以后的学习
4、打下基础。 (2)通过简单的系统设计,增强面对复杂问题的处理能力,为以后实际中解决问题打下基础。 实验内容:试设计一个住宿结帐管理系统,住宿结帐管理信息包括:顾客姓名、入住时间、住宿房间、顾客数量、每日价格、住宿天数、折扣率、实收金额。系统包括以下功能:住宿信息的录入修改、删除功能;住宿信息的排序浏览功能;按住宿天数查询、按住宿房间号码查询;住宿信息的统计:总人数、总收入、空房数。 系统总体模块图: 住宿结帐管理系统 主程序模块 信息保存模块 按住宿房间号码查询模块 按住宿天数查询模块 按住宿天数浏
5、览模块 信息统计模块 信息删除模块 信息修改模块 信息读取模块 信息录入模块 按住房间号码浏览模块 按房间号码排序模块 按住宿天数排序模块 小组任务分工 (1) 由郭凌瑞负责住宿信息的录入、修改、删除功能; (2) 由张亮负责文件的读取与写入操作,统计及主函数; (3) 由方宇负责排序、浏览、查询功能; 子系统设计方案: (1) 信息的录入、修改、删除; 信息的录入、修改与删除通过对信息的标志的判断与修改,执行信息录入的地址、修改的
6、目标及删除功能的实现。 (2) 文件的读取与写入、统计、主函数; 文件的读取与写入可用已知的库函数来完成,统计工作可由已有信息通过计算获得,主函数可由swith语句来达到菜单选折功能的目的。 (3) 信息的排序、浏览、查询; 排序功能可通过冒泡法来实现,浏览实现排序然后显示即可,查询时,根据“==”来达到找到匹配信息的目的。 子系统主要程序流程图 N为所有房间数,NN为非空房间数 信息读取模块流程图 开始 0=>i
7、 i+1=>i i < N ? N Y P[i].flang= =1? Y N 输入一个信息P[i] 1=>P [i].flang NN+1=>NN
8、 i+1=>i i= =N-1? Y N “y”or “n” Y N i= =N-1?
9、 N Y 输入信息房间已满 结束 信息修改模块流程图 开始 输出所有住宿信息 输入修改的房间号n 0=>i, NN=>j n = =0?
10、 Y N i < N ? N i+1=>i N Y P[i].flang= =1? N j - - Y
11、 Y P[i].Rome= =n ? N Y “y”or “n” N
12、 Y 重新输入该信息P[i] “y”or “n” i= =N-1? i= =N-1? i= =N-1? j = =0? N Y 未找到要修改的信息 “y”or “n” 输入修
13、改的房间号n 输入一个信息P[i] 输入一个信息P[i] 输入一个信息P[i] 输入一个信息P[i] 输入一个信息P[i] 输入一个信息P[i] 输入一个信息P[i] 结束 信息删除模块流程图 开始 输出所有住宿信息 输入要删除的房间号n 0=>i, NN=>j n = =0?
14、 Y i < N ? N i+1=>i Y P[i].flang= =1? N j - - P[i].Rome= =n ? Y N “y”or “n”
15、 Y N Y 1=>P[i].flang j = =0? N Y 未找到要删除的信息 输入删除的房间号n 结束 按住宿时间查询模块 开始 输出所有住宿信息
16、
输入要查询的日期(年月日)
0=>i, NN=>j
i
17、 日期是否相等 N Y 输出要查询的信息P[i] j= =0? Y N Y 未找到要查询的信息 结束
18、
按房间号码查询模块
开始
输出所有住宿信息
输入要查询房间号码 no
0=>i, NN=>j
i
19、 N Y 输出要查询的信息P[i] j= =0? N Y 未找到要查询的信息 结束 0=>i, NN=>j 0=>i, NN=>j 个人设计小结及心得体会: (1)在我设计的子系统部分,包含很多细节问题,如果稍有不慎,往往导致模块无法运行,在设计中,我尝试了很多方法,对思维能力有了
20、很大锻炼,提高了解决复杂问题的能力,同时,也很大程度上锻炼了耐心,做到不急不弃是系统最终成功的保证。 计053 郭凌瑞 (2)我的工作比较简单,但在书写代码时,发现了自己的问题:文件无法顺利操作!文件是很重要的一个知识点,很兴庆在这次实践中我及时弥补了以前的缺憾,为以后的继续学习和面对复杂问题打下了坚实的基础,问题在实践中才能被更好地发现和解决,在今后的学习中要更加重视实践的作用! 软051 张亮 (3)在我设计的模块中,主要是对已有信息的处理,对排序算法有了一个新的认识
21、从深层次理解了排序函数的思想,突破了以前是似而非的局限。查询模块的书写,注意了很多细节,使模块在整体上有了很大优化,给了用户一个人性化的界面。 软052 方宇 小组设计总结: 本次课程设计,我们做了一个简单管理系统,系统的功能较以前的小程序有了很大加强,对个人及团队的能力有了更大的要求,事实上,在本次课设中的确出现了很多以前没有遇到的问题,这是一次自我提高的过程,从中我们弥补了以前遗漏的很多东西,使自己的知识结构更加完善和牢固;同时,这也是一次实践的机会,是增加面对复杂问题处理经验的机会,对
22、以后做一些比较大的系统有一定的借鉴。在本次试验的整个过程中,组员之间的合作起到了很大作用,共同解决了很多关键性难题,最终,在我们的共同努力下,我们的第一个系统正常运行了,巨大成就感促使我们有一种挑战更高目标的欲望!
#include
23、 //入住时间 int year; int month; int day; }; struct Payroll{ //顾客信息列表 int flang; //用来标志该顾客信息是否存在 char Name[15]; //顾客姓名 Date date; //入住时间 int Rome; //房间号 int Number;
24、 //顾客数量 int Price; //每日价格 int Days; //住宿天数 float Discountrate; //折扣率 float Money; //实收金额 }; //子函数声名区 void Imput(Payroll P[],FILE *fp); //结帐信息的录入 void Read(Payr
25、oll P[],FILE *fp); //结账信息的读取 void Save(Payroll P[],FILE *fp); //信息保存为文件 void Reput(Payroll P[],FILE *fp); //结账信息的修改 void Delete(Payroll P[],FILE *fp); //结账信息的删除 void Stat(Payroll P[],FILE *fp); //信息统计 void Timeread(Payroll P[],
26、FILE *fp); //按住宿天数浏览 void Romenumber(Payroll P[],FILE *fp); //按住宿房间浏览 void Time(Payroll P[],FILE *fp); //按住宿天数查询 void Rome(Payroll P[],FILE *fp); //按住宿房间查询 void DAY(Payroll P[],FILE *fp); //按住宿天数排序 void ROME(Payroll P[],FI
27、LE *fp); //按房间号码排序 //以下为主函数 void main() { FILE *fp; struct Payroll P[N]; fp=fopen("accout.dat","ab+"); int select; Read(P,fp); //从文件中读取结账信息 printf("*******************住宿结账管理系统***************\n\n"); printf("~~~~~~~~~~~~~~~~~~~~欢迎使用本系
28、统!~~~~~~~~~~~~\n\n"); printf("===============菜单===============\n" "请选择:\n" "1--添加新信息\n" "2--修改信息\n" "3--删除信息\n" "4--统计信息\n" "5--按住宿天数浏览\n" "6--按住宿天数查询\n" "7--按放房间号码浏览\n" "8--按房间号码查询\n" "9--退出\n"); scanf("%d",&select); while(select!=9)
29、 //没有退出本系统时,循环提示操作 { switch(select) { case 1:Imput(P,fp); //信息录入 break; case 2:Reput(P,fp); //修改信息 break; case 3:Delete(P,fp); //删除信息 break; case 4:Stat(P,fp); /
30、/统计信息 break; case 5:Timeread(P,fp); //按住宿天数浏览 break; case 6:Time(P,fp); //按住宿天数查询 break; case 7:Romenumber(P,fp); //按放房间号码浏览 break; case 8:Rome(P,fp); //按房间号码查询 break; } printf("\n\n");
31、 printf("请选择要进行的操作:\n" //每完成一次操作选折下一次操作 "1--添加新信息\n" "2--修改信息\n" "3--删除信息\n" "4--统计信息\n" "5--按住宿天数浏览\n" "6--按住宿天数查询\n" "7--按放房间号码浏览\n" "8--按房间号码查询\n" "9--退出\n"); scanf("%d",&select); } Save(P,fp); //将本次系统运行结果保存为文件
32、 printf("谢谢使用,再见!\n");
}
//子函数定义区
void Imput(Payroll P[],FILE *fp) //结帐信息的录入
{
int i;
char ch;
printf("姓名 入住时间 房间 顾客数量 每日价格 住宿天数 折扣率\n");
printf("=============================================\n"); for(i=0;i 33、覆盖已有信息
{
scanf("%s%d%d%d%d%d%d%d%f",P[i].Name,&P[i].date.year,
&P[i].date.month,&P[i].date.day,&P[i].Rome,&P[i].Number,
&P[i].Price,&P[i].Days,&P[i].Discountrate);
P[i].flang=1; //标示已存信息
NN++;
P[i].Money=P[i].Days*P[i].Discountrate*P[i].Price;
if(i==N-1 34、)
break;
printf("是否继续录入?(y or n) ");
getchar();
ch=getchar();
if(ch!='n')
{
printf("姓名 入住时间 房间 顾客数量 每日价格住宿天数 折扣率\n");
printf("======================================\n");
}
else
break;
}
}
if(i==N-1)
printf("抱歉,所有房间已满!\n\n");
} 35、
void Save(Payroll P[],FILE *fp) //信息保存为文件
{
int i;
for(i=0;i 36、 fread(&P[i],sizeof(struct Payroll),1,fp);
}
void Reput(Payroll P[],FILE *fp) //结账信息的修改
{
int i;
int n,j=NN;
char ch;
printf(" 姓名 住宿时间 房间 顾客数量 每日价格 住宿天数 折扣率 实收金额\n");
printf("=========================================================================\n"); 37、
for(i=0;i 38、
for(i=0;i 39、姓名 入住时间 房间 顾客数量 每日价格 住宿天数 折扣率\n");
printf("===========================================================\n");
scanf("%s%d%d%d%d%d%d%d%f",P[i].Name,
&P[i].date.year,&P[i].date.month,&P[i].date.day,
&P[i].Rome,&P[i].Number,&P[i].Price,
&P[i].Days,&P[i].Discountrate);
40、 P[i].Money=P[i].Days*P[i].Discountrate*P[i].Price;
}
else
continue;
}
else
j--;
}
else
continue;
}
if(j==0)
printf("没有找到要修改的内容!请确认后再输入!\n");
printf("请输入要修改的房间 41、号(输入零结束修改!):\n");
scanf("%d",&n);
}
}
void Delete(Payroll P[],FILE *fp) //住宿信息的删除
{
int i,n;
int k=NN,j=NN;
int NO=NN;
char ch;
printf(" 姓名 入住时间 房间 顾客数量 每日价格 住宿天数 折扣率 实收金额\n");
printf("=============================================== 42、\n");
for(i=0;i 43、删除!):\n");
scanf("%d",&n);
while(n!=0)
{
for(i=0;i 44、
if(k==1) //此时删除所有住宿信息
for(i=0;i 45、
else
j--;
}
}
if(k==0)
break;
if(j==0)
printf("没有找到要删除的内容,请确认!\n");
printf("请输入要删除的房间号(输入零结束删除!):\n");
scanf("%d",&n);
}
NN=NO;
}
void Timeread(Payroll P[],FILE *fp) 46、 //按天数浏览
{
int i;
//Read(P,fp);
DAY(P,fp);
printf(" 姓名 入住时间 房间 顾客数量 每日价格
住宿天数 折扣率 实收金额\n");
printf("============================================
=======================\n");
for(i=0;i 47、6d%8d%8d%8.2f%8.2f\n",
P[i].Name,P[i].date.year,P[i].date.month,P[i].date.day,
P[i].Rome,P[i].Number,P[i].Price,P[i].Days,
P[i].Discountrate,P[i].Money);
}
}
printf("\n\n");
}
void Romenumber(Payroll P[],FILE *fp) //按住宿房间浏览
{
int i,j=NN;
ROME(P,fp);
printf(" 姓名 48、 入住时间 房间 顾客数量 每日价格
住宿天数 折扣率 实收金额\n");
printf("================================================
=================\n");
for(i=0;i 49、[i].Number,P[i].Price,P[i].Days,
P[i].Discountrate,P[i].Money);
printf("\n\n");
}
void Stat(Payroll P[],FILE *fp) //信息统计
{
int i,n=N;
int Sumperson=0; //总人数
float Sum=0; //总收入
struct Payroll t;
50、 //Read(P,fp);
for(i=0;i






