c语言课程设计实验报告

更新时间:2024-05-30 16:27:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

目录

1 系统功能模块设计…………………………………………………………3

2 数据结构设计及用法说明…………………………………………………4

3 程序结构……………………………………………………………………………5

4 实验结果 …………………………………………………………………6

5 实验体会 ……………………………………………………………………7

6 参考文献 ……………………………………………………………………7

附录(源程序)………………………………………………………………8

1

1 系统功能模块设计

宾馆客房信息管理系统是由四大模块组成,主模块1,主模块2,主模块3,主模块4。各主模块及子模块如图1所示:

宾馆客房信息管理系统 数数数 文据据据 件管处查统 理理询计 数数数数数按按按按统 据据据据据日姓房身计 加保修插删期名号份在 载存改入除查查查证住询询询查人 询数 图1

各模块功能简介:

主模块1,文件管理,有关文件的一些操作,包括三个小子模块: 子模块1,数据初始化,用来第一次运行系统时进行数据录入。

子模块2,数据加载,当第一次进行数据录入保存后,以后每次运行系统只要先进行数据加载就能使系统与上次保存的数据联系起来。

子模块3,数据保存,进行数据录入或是数据处理后对数据保存。

主模块2,数据处理,用来对系统数据进行处理,包括三个子模块:

数据初始化 2

子模块1,数据修改,对已存在的需要变动的数据进行修改。 子模块2,数据插入,插入新的数据。

子模块3,数据删除,对不需要的数据进行删除。

主模块3,数据查询,查询旅客入住信息,包括四个子模块:

子模块1,按日期查询,输入日期,就能查询该日期所有旅客的入住信息。并输出各项信息。

子模块2,按姓名查询,输入旅客姓名,就能查询旅客是否存在,若存在,则输出旅客的入住信息。

子模块3,按房号查询,输入旅客房间号码,及房间类型,就能查询旅客是否存在,若存在,则输出旅客的入住信息。

子模块4,按身份证号查询,输入旅客的身份证号。就能查询旅客是否存在,若存在,则输出旅客的入住信息。

主模块4,数据统计,统计人数,只有一个子模块:

子模块1,统计人数,统计在住人数,输出在住旅客数。

2 数据结构设计及用法说明

系统数据采用十字交叉链表,十字交叉链表如图2:

head 图2

宾馆客房信息管理系统十字交叉链表

类型1 类型2 … 类型n NULL 房间1基本信息 房间1入住基本信息链 房间1基本信息 房间2入住基本信息链 … 房间n基本信息 房间n入住基本信息链

说明:

实验数据采用三级十字交叉链表的数据结构,第一次运行时进行数据录入后保存,以后再次运行,只需加载就可以进行数据处理和其他操作了,对三级链表的各级在系统中都有很详细的操作说明。

3

3 程序流程图

开始 n不是1~4 显示菜单 输入n,判断 是否是1~4? Y y 各菜单的子菜单显示 N 输入n,判断是否 是一个菜单选项 Y 执行菜单的功能 是否返回界面 N

4

程序结束 图3

4 实验结果 数据的输入: 01 层号 号 位置 房 间 电话 02层号 号位置 房间 电话 1层 旅客姓名 fengpeng11 出生日期 1990/09/01 01 429004 M fengpeng2 02 4290041 M fengpeng3 11 123 M fengpeng2 12 1245 M fengpeng5 3层 123 M 入住日期 退房日期 联系电话 出生日期 入住日期 退房日期 联系电话 2011/09/01 2011/09/02 12345 1990/06/01 2011/09/01 2011/09/02 123456 类型A A区 房号 身份证 001 性别 1层 旅客姓名 A区 房号 身份证 002 性别 旅客姓名 类型B 11 号 房 间 12号房间 层号 2层 出生日期 1990/09/01 入住日期 退房日期 联系电话 出生日期 入住日期 退房日期 联系电话 出生日期 入住日期 退房日期 联系电话 2011/09/01 2011/09/02 12344 1990/06/01 2011/09/01 2011/09/01 12345 1990/09/02 2011/09/02 2011/09/02 12345 位置 A区 房号 身份证 电话 011 性别 层号 2层 旅客姓名 位置 A区 房号 身份证 电话 012 性别 3层 旅客姓名 A区 房号 身份证 021 性别 类型C21层号 号位置 房 间 电话 当查询时,结果如

01号房间的旅客入住情况

5

21号房间的旅客入住情况

5 实验体会

1、这次C语言程序课程设计是把课程学完后的一次大检验,需要把书中的一些没来的及吸收的知识好好巩固,并加以运用。十字交叉链表的数据结构设计,需要把书上例子中的两级十字链表加以发展运用,写出三级十字交叉链表

2、这次实验开始时,不知道怎么从哪里开始,于是把实验书上面的例子一遍一遍的看,对于实验书上的十字交叉链表设计搞懂后,开始自己写,但是写出来的程序构建是有很多的error和wanrning,有时改好提示的错误后,又会出现一大堆新的错误。总之,对于程序的调试,需要极大的耐心,不能急躁。

3、在改完所有的错误后,运行程序,并进行数据的输入,但是在数据修改时,修改完并保存后,再次打开时,数据还是老样子,根本没什么改变,数据插入、删除都出现同样的问题,发现肯定是函数的设计有问题,于是重新检查,最后费了很大劲才解决,原来是指针的问题。

4、这次实验培养了独立思考,动手操作的能力,特别是加深了对C语言的理解与运用。学到了很多东西,通过这次课程设计,使我懂得了理论与实际相

结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,但可喜的是最终都得到了解决。

6 参考文献

图书:

1,曹计昌,卢萍,李开.C语言程序设计(第3版).北京:科学出版社 2008. 2,李开,卢萍,曹计昌.C语言实验与课程设计(第1版).北京:科学出版

6

2011。第121到146页

附录:

本实验采用C语言设计,采用codeblock编译环境,

源程序

#include #include #include

/*旅客入住信息结点结构*/ typedef struct guest {

char name[20]; /* *姓名*/ char roomNum[5]; /* *房号*/ char guestId[19]; /* *身份证号*/ char sex; /* *性别*/ char birthday[11]; /* *出生日期*/ char enrollData[20]; /* *入住日期*/ char exitData[20]; /* *退房日期*/

char guestPhone[12]; /* *旅客联系电话*/ struct guest *next; /* *指向下一结点的指针*/ }GUEST;

/*房间基本信息结点结构*/ typedef struct room_note {

char roomNum[5]; /* *房号*/ char roomType; /* *房间类型*/ char roomLayer; /* *房间层号*/ char roomPosition; /* *房间位置*/

char roomPhone[12]; /* *房间电话号码*/

struct guest* next3; /* *指向旅客入住支链的指针*/ struct room_note *next; /* *指向下一结点的指针*/ }ROOM_NOTE;

/*房间类型信息结点结构*/ typedef struct room_type {

char roomtype; /* *房间类型*/ int standardprice; /* *标准价格*/

7

int hourprice; /* *钟点价格*/

struct room_note *next2;/* *指向房间基本信息支链的指针*/ struct room_type *next; /* *指向下一结点的指针*/ }ROOM_TYPE;

void create_list(ROOM_TYPE** head); /*创建链表*/ void load_list(ROOM_TYPE** head); /*加载数据*/ void save_list(ROOM_TYPE* head); /*保存数据*/ void modif_list(ROOM_TYPE** head); /*修改数据*/ void insert_list(ROOM_TYPE** head); /*插入数据*/ void delete_list(ROOM_TYPE** head); /*删除数据*/

void data_seek(ROOM_TYPE* head); /*按日期查询入住旅客信息*/ void name_seek(ROOM_TYPE* head); /*按姓名查询入住旅客信息*/ void roomNum_seek(ROOM_TYPE* head); /*按房号查询该房间旅客信息*/ void id_seek(ROOM_TYPE* head); /*按身份证号查询旅客入住信息*/ void stat_guest(ROOM_TYPE* head); /*统计在住旅客的数目*/ int data_atoi(char a[]); /*将日期字符串转换成整型数据*/

/*主函数*/ int main() {

ROOM_TYPE *head=NULL; char c,ch;

printf(\

printf(\宾馆客房客房信息管理系统\\n\ /*信息管理系统标题*/ printf(\ lop: do {

printf(\ 1:文件管理\\n\\n\ /*显示菜单1,文件管理*/ printf(\ 2:数据处理\\n\\n\ /*显示菜单2,数据处理*/ printf(\ 3:数据查询\\n\\n\ /*显示菜单3,数据查询*/ printf(\ 4:数据统计\\n\\n\ /*显示菜单4,数据统计*/ scanf(\getchar();

}while(c<'1'||c>'4'); switch(c) { case '1':

lop1: do{

printf(\数据录入\\n\\n\显示文件管理子菜单

8

1*/printf(\数据加载\\n\\n\ /*显示文件管理子菜单2*/

printf(\数据保存\\n\\n\ /*显示文件管理子菜单3*/ scanf(\getchar();

}while(ch<'1'||ch>'3'); switch(ch)

{

case '1':create_list(&head); /*保存数据*/ break;

case '2':load_list(&head); /*加载数据*/ break;

case '3':save_list(head); /*保存数据*/ break;

}

printf(\继续文件操作?yes or no;请输入 Y 或者 N:\ch=getchar(); getchar();

if(ch=='y'||ch=='Y') goto lop1; break; case '2':

lop2: do

{

printf(\数据修改\\n\\n\显示数据处理子菜单1*/ printf(\数据插入\\n\\n\显示数据处理子菜单2*/ printf(\数据删除\\n\\n\显示数据处理子菜单3*/ scanf(\getchar();

}while(ch<'1'||ch>'3'); switch(ch)

{ case '1':

modif_list(&head);/*修改数据*/ break; case '2':

insert_list(&head);/*插入数据*/ break; case '3':

delete_list(&head);/*修改数据*/ break;

}

printf(\继续数据处理操作?yes or no;请输入 Y 或者 N:\

9

ch=getchar(); getchar();

if(ch=='y'||ch=='Y') goto lop2; break; case '3':

lop3: do

{ /*显示数据查询4个子菜单*/

printf(\按日期查询在住旅客基本信息\\n\\n\ printf(\按姓名查询在住旅客基本信息\\n\\n\ printf(\按房号查询在住旅客基本信息\\n\\n\ printf(\按身份证查询在住旅客基本信息\\n\\n\scanf(\getchar();

}while(ch<'1'||ch>'4'); switch(ch)

{ case '1':

data_seek(head);/*按日期查询*/ break; case '2':

name_seek(head);/*按姓名查询* / break; case '3':

roomNum_seek(head);/*按房号查询*/ break; case '4':

id_seek(head);/*按身份证查询*/ break;

}

printf(\继续数据查询操作?yes or no;请输入 Y 或者 N:\

ch=getchar(); getchar();

if(ch=='y'||ch=='Y') goto lop3; break;

case '4': printf(\统计在住旅客数\\n\显示统计子菜单*/ scanf(\getchar();

stat_guest(head); break; }

10

printf(\继续系统操作?yes or no;请输入 Y 或者 N:\ch=getchar(); getchar();

if(ch=='y'||ch=='Y') { goto lop; }

return 0; } /**

*函数名称:creat_list

*函数功能:创建链表,进行最初的数据输入 *输入参数::无

*输出参数:head主链头指针的地址,用来返回创建的十字链 *返回值:无

*调用说明:进行最初的数据输入 */

void create_list(ROOM_TYPE** head) {

ROOM_TYPE *hdtype=NULL,*ptype; ROOM_NOTE *pnote; GUEST *pguest; char ch; int find=0; loop:

ptype=(ROOM_TYPE*)malloc(sizeof(ROOM_TYPE));

printf(\输入入住房间的类型:A(标准单人间),B(标准双人间),C(套房):\

scanf(\getchar();

if(ptype->roomtype=='a'||ptype->roomtype=='A') {

ptype->standardprice=100; ptype->hourprice=30; }

if(ptype->roomtype=='b'||ptype->roomtype=='B') {

ptype->standardprice=200; ptype->hourprice=60; }

if(ptype->roomtype=='c'||ptype->roomtype=='C') {

ptype->hourprice=300;

11

ptype->standardprice=90; }

ptype->next2=NULL; ptype->next=hdtype; hdtype=ptype;

printf(\继续录入房间类型信息:yes or no?输入 Y 或者 N:\ch=getchar(); getchar();

if(ch=='y'||ch=='Y') goto loop;

*head=hdtype;

printf(\输入房间基本信息:yes or no,输入 Y 或者 N:\ch=getchar(); getchar(); loop1: ptype=*head;

while(ch=='Y'||ch=='y') {

pnote=(ROOM_NOTE*)malloc(sizeof(ROOM_NOTE)); printf(\输入房间号码:\scanf(\getchar();

printf(\输入房间类型(A,B,C……):\scanf(\getchar();

printf(\输入房间所在层号(1,2,3……):\scanf(\getchar();

printf(\输入房间位置(A,B,C……):\scanf(\getchar();

printf(\输入房间电话号码:\scanf(\getchar();

pnote->next3=NULL;

while(ptype!=NULL&&ptype->roomtype!=pnote->roomType) { ptype=ptype->next; } if(ptype!=NULL) {

12

pnote->next=ptype->next2; ptype->next2=pnote; } else

{ free(pnote);

printf(\房间类型有问题\\n\

printf(\重新再输入此房间基本信息:yes or no 输入 Y 或者 N:\

ch=getchar(); getchar();

if(ch=='y'||ch=='Y') goto loop1; }

printf(\继续输入其它房间基本信息:yes or no 输入 Y 或者 N:\

ch=getchar(); getchar(); }

printf(\输入旅客入住基本信息:yes or no 输入 Y 或者 N:\ch=getchar(); getchar();

while(ch=='y'||ch=='Y') {

pguest=(GUEST*)malloc(sizeof(GUEST));

printf(\输入旅客姓名(用拼音):\scanf(\getchar();

printf(\输入房间号码:\scanf(\getchar();

printf(\输入旅客身份证号:\scanf(\getchar();

printf(\输入旅客性别(M,男;F,女):\scanf(\getchar();

printf(\输入旅客出生日期(格式xxxx/xx/xx;例1990/06/01):\scanf(\getchar();

printf(\输入旅客入住日期(格式xxxx/xx/xx;例2011/09/01):\scanf(\getchar();

printf(\输入旅客退房日期(格式xxxx/xx/xx;例2011/09/01):\

13

scanf(\getchar();

printf(\输入旅客联系电话:\scanf(\getchar(); ptype=*head; find=0;

while(ptype!=NULL&&find==0) {

pnote=ptype->next2;

while(pnote!=NULL&&find==0) {

if(strcmp(pnote->roomNum,pguest->roomNum)==0) { find=1; break;

} pnote=pnote->next; } ptype=ptype->next; } if(find)

{

pguest->next=pnote->next3; pnote->next3=pguest; } else

{ free(pguest);

printf(\房间号码有问题\\n\ }

printf(\继续输入旅客入住基本信息:yes or no 输入 Y 或者N:\

ch=getchar(); getchar(); } } /**

*函数名称:save_list

*函数功能:保存链表到硬盘 *输入参数::主链头指针head *输出参数:无 *返回值:无

14

*调用说明: */

void save_list(ROOM_TYPE* head) {

FILE *out1,*out2,*out3; ROOM_TYPE *ptype=head; ROOM_NOTE *pnote; GUEST *pguest;

if((out1=fopen(\exit(-1);

if((out2=fopen(\exit(-1);

if((out3=fopen(\exit(-1);

while(ptype!=NULL) {

fwrite(ptype,sizeof(ROOM_TYPE),1,out1); pnote=ptype->next2; while(pnote!=NULL) {

fwrite(pnote,sizeof(ROOM_NOTE),1,out2); pguest=pnote->next3; while(pguest!=NULL) {

fwrite(pguest,sizeof(GUEST),1,out3); pguest=pguest->next; } pnote=pnote->next; }

ptype=ptype->next; }

fclose(out1); fclose(out2); fclose(out3);

printf(\数据保存成功!\\n\} /**

*函数名称:load_list

*函数功能:加载保存的数据到链表中 *输入参数::无

*输出参数:head主链头指针的地址,用来返回加载的十字链15

{

ROOM_TYPE *ptype; ROOM_NOTE *pnote; GUEST *pguest; char a[20]; int find=0;

printf(\输入旅客姓名:\ scanf(\ getchar(); ptype=head;

while(ptype!=NULL) {

pnote=ptype->next2; while(pnote!=NULL) {

pguest=pnote->next3; while(pguest!=NULL) {

if(strcmp(pguest->name,a)==0) {

printf(\姓名:%s \ printf(\房号:%s \ printf(\身份证:%s \ printf(\性别:%c \

printf(\出生日期:%s \printf(\入住日期:%s \

printf(\退房日期:%s \printf(\联系电话:%s \ find++; }

pguest=pguest->next; }

pnote=pnote->next; }

ptype=ptype->next; }

if(find==0) {

printf(\没有符合要求的信息!\\n\ } } /**

*函数名称:roomNum_seek

31

*函数功能:按房间号查询房间住客状况 *输入参数::head主链头指针的地址 *输出参数:无 *返回值:无 *调用说明: */

void roomNum_seek(ROOM_TYPE* head) {

ROOM_TYPE *ptype; ROOM_NOTE *pnote; GUEST *pguest; char a[20]; int find=0;

printf(\输入房间号码:\scanf(\getchar();

for( ptype=head;ptype!=NULL;ptype=ptype->next) {

pnote=ptype->next2; while(pnote!=NULL) {

if(strcmp(pnote->roomNum,a)==0) {

for(pguest=pnote->next3;pguest!=NULL;pguest=pguest->next) {

printf(\姓名: %s\ printf(\房号: %s\ printf(\身份证: %s\ printf(\性别: %c\

printf(\出生日期: %s\printf(\入住日期: %s\

printf(\退房日期: %s\printf(\联系电话: %s\ find++; } }

pnote=pnote->next; } }

if(find==0) {

printf(\没有符合要求的信息!\\n\} }

32

/**

*函数名称:id_seek

*函数功能:按身份证号查询在住旅客信息 *输入参数::head主链头指针的地址 *输出参数:无 *返回值:无 *调用说明: */

void id_seek(ROOM_TYPE* head) {

ROOM_TYPE *ptype; ROOM_NOTE *pnote; GUEST *pguest; char a[20]; int find=0;

printf(\输入旅客身份证号:\scanf(\getchar(); ptype=head;

while(ptype!=NULL) {

pnote=ptype->next2; while(pnote!=NULL) {

pguest=pnote->next3; while(pguest!=NULL) {

if(strcmp(pguest->guestId,a)==0) {

printf(\姓名:%s \ printf(\房号:%s \ printf(\身份证:%s \ printf(\性别:%c \

printf(\出生日期:%s \printf(\入住日期:%s \

printf(\退房日期:%s \printf(\联系电话:%s \ find++; }

pguest=pguest->next; }

pnote=pnote->next; }

33

ptype=ptype->next; }

if(find==0) {

printf(\没有符合要求的信息!\\n\ } } /**

*函数名称:stat_guest

*函数功能:统计在住旅客的总数 *输入参数::head主链头指针的地址 *输出参数:无 *返回值:无 *调用说明: */

void stat_guest(ROOM_TYPE* head) {

ROOM_TYPE *ptype; ROOM_NOTE *pnote; GUEST *pguest; int n=0;

for(ptype=head;ptype!=NULL;ptype=ptype->next) {

pnote=ptype->next2; while(pnote!=NULL) {

for(pguest=pnote->next3;pguest!=NULL;pguest=pguest->next) { n++;

} pnote=pnote->next; } }

printf(\宾馆的总旅客数位:M\\n\} /**

*函数名称:data_atoi

*函数功能:将日期字符串转换成整型数据 *输入参数::日期字符串首地址 *输出参数:无

*返回值:转换后的整型数据

*调用说明:主要用来统计函数中

34

*/

int data_atoi(char a[]) {

int i=0,j=0,t; char s[10];

while(s[j]=a[i++]) { j++;

if(a[i]=='/') { i++;

} }

t=atoi(s); return t; }

35

本文来源:https://www.bwwdw.com/article/ga96.html

Top