计算机课程设计景点查询系统实验报告_第1页
计算机课程设计景点查询系统实验报告_第2页
计算机课程设计景点查询系统实验报告_第3页
计算机课程设计景点查询系统实验报告_第4页
计算机课程设计景点查询系统实验报告_第5页
已阅读5页,还剩160页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

《C语言程序设计》课程设计实验报告题目:景点信息查询系统 专业: 班级:学号: 姓名: 成绩: 指导教师:完成日期:2010年09月18日目录一、课程设计题目:景点信息查询系统 2二、要求 2三、系统功能模块结构图 2四、数据结构的设计说明 5五、各模块的功能解析、程序结构及部分流程图 65.1.主函数 65.2.文件 125.2.1文件菜单下的保存<save>功能的函数: 125.2.2.文件菜单下的备份<BackupData>功能的函数 145.2.3文件菜单下的恢复<RestoreData>功能的函数 145.2.4文件菜单下的退出<ExitSys>功能的函数 145.3.数据维护 145.3.1城市信息维护 145.3.2景区信息维护 155.3.3景点信息维护 155.4.数据查询 225.4.1城市信息查询 225.4.2景区信息查询 225.4.3景点信息查询 225.5.清屏 285.6.帮助 285.6.1帮助菜单下的帮助<HelpTopic>功能的函数: 28函数原型:BOOLBackupData(void) 28函数功能:使用说明 285.6.2.帮助菜单下的关于<AboutDorm>功能的函数: 285.6.3帮助菜单下的帮助<information>功能的函数: 29函数原型:BOOLinformation(void) 29六、试验结果 296.1.初始界面 296.2.文件 306.3.信息查询 436.4.帮助 49七、心得体会 517.1.充分了解供需关系 517.2.链表的创建 517.3.功能函数的编写测试 517.4.收获 52八、参考文献 52九、源代码及注释 52一、课程设计题目:景点信息查询系统二、要求:1、只能使用C语言,源程序要有适当的注释,使程序容易阅读。2、要有用户界面。要求至少采用教材p215-p216类似的简易菜单;鼓励采用文本菜单界面甚至采用图形菜单界面。3、必须使用结构和十字交叉链表等数据结构。4、使用文件保存数据。5、至少输出一份报表(屏幕输出即可),鼓励自行增加新功能。6、设计测试的模拟数据,完成系统测试。三、系统功能模块结构图整个程序分为以下五个大块:景点信息查询系统文件景点信息查询系统文件数据维护数据查询清屏帮助

每一块的功能:文件文件数据保存数据备份数据恢复数据加载退出系统界面初始化 景点景点信息修改景点信息插入景点信息删除景区信息删除景区信息插入景区信息修改数据维护城市信息维护景区信息维护景点信息维护城市信息删除城市信息插入城市信息修改城市精确查询城市精确查询城市组合查询景区精确查询景区组合查询景点精确查询景点组合查询景点信息查询数据查询景区信息查询城市信息查询帮助帮助帮助关于所有信息四、数据结构的设计说明:系统所操作的数据分三类,使用三级的十字交叉链表,链表使用单向链表,其数据结构图是如下:……head…景区11景区12景区1m城市1城市2城市n景点111…景点11p∧∧∧在程序中对数据结构的定义如下:structscespo/*景点*/{charsp_sr_num[NUM];/*景区编号*/charsp_c_num[NUM];/*城市编号*/charscespo[NUM];/*景点名称*/charsp_num[NUM];/*景点编号*/charsp_location[NUM];/*景点地址*/charsp_time[NUM];/*花费时间*/structscespo*next;/*指向下一个景点节点*/};structscearea/*景区*/{charsr_c_num[NUM];/*城市编号*/charscearea[NUM];/*景区名称*/charsr_num[NUM];/*景区编号*/charsr_level[NUM];/*景区级别*/charsr_location[NUM];/*景区地址*/charsr_ticket[NUM];/*景区分类*/charsr_time[NUM];/*开放时间*/charsr_connum[NUM];/*查询电话*/structscearea*next;/*指向下一个景区节点*/structscespo*sp_head;/*景点链表的头指针*/};structcity/*城市*/{charcity[NUM];/*城市名称*/charc_num[NUM];/*城市编号*/charc_inspnum[NUM],c_consnum[NUM];/*城市邮编、城市特色*/structcity*next;/*指向下一个城市节点*/structscearea*sr_head;/*景区链表的头指针*/};其中城市、景区的每一个节点都有两个指针,城市的节点的一个指针(structcity*p->sr_head)指向在该城市的景区链表,另一个指针(structcity*p->next)指向该节点的下一结点;景区的节点的一个指针(structscearea*psr->sp_head)指向该景区的景点信息链表,另一个指针(struct*psr->next)指向该节点的下一结点;景点的节点的一个指针(struct*psp->next)指向该节点的下一结点;另外在内存中是以链表的形式储存的。其数据结构图是如下:head…head…景区1城市1城市2城市n…景区nNULLNULLhead景区2NULLhead景区2head…景点head…景点1景点2景点nNULL五、各模块的功能解析、程序结构及部分流程图5.1.主函数主函数负责主界面的构造以及对程序的各个功能函数的调用。其原型声明如下:voidmain(void);该函数在文件main.c中。其主要调用了以下函数:LoadData();/*数据加载*/InitInterface();/*界面初始化*/RunSys(&gp_head);/*系统功能模块的选择及运行*/CloseSys(gp_head);/*退出系统*/主函数中加载<LoadData>功能的函数函数原型:BOOLLoadData();函数功能:从三个文件中加载城市、景区、景点信息形成链表。该程序流程图如下:YY开始BOOLRe=FALSEgc_sys_state|=1;gc_sys_state|=2;Re=createlist(&gp_head)gc_sys_state|=Re;gc_sys_state&=~(4+8+16-Re);gc_sys_state<(1|2|4|8|16)printf("\n系统基础数据不完整!\n");printf("\n按任意键继续...\n");getch();returnTRUENNNYhp==NULLprintf("城市信息数据加载失败!\n");returnre;关闭文件Yp=(structcity*)malloc(sizeof(structcity));/申请一个单元/fscanf(pFile,"%s\t\t%s\t\t%s\t\t%s\n",p->c_num,p->city,p->c_inspnum,p->c_consnum);/读取文件中的城市信息,存在刚申请的单元中/p->sr_head=NULL;/景区头指针置空//先进后出/p->next=hp;hp=p;!feof(pFile)NYprintf("城市信息数据文件打开失败!\n");returnre;printf("城市信息数据文件打开成功!\n");pFile=fopen(gp_c_info_filename,"r+")==NULL定义变量:structcity*hp=NULL,*p;/头指针/structscearea*psr;/景区信息链指针/structscespo*psp;/景点信息链指针/FILE*pFile;intfindintre=0;开始N1

YNYNp=p->next;2psr=(structscearea*)malloc(sizeof(structscearea));//创建结点,存放从数据文件中读出的景区基本信息fscanf(pFile,"%s\t\t%s\t\t%s\t\t%s\t\t%s\t\t%s\t\t%s\t\t%s\n",psr->sr_c_num,psr->sr_num,psr->scearea,psr->sr_level,psr->sr_location,psr->sr_ticket,psr->sr_time,psr->sr_connum);psr->sp_head=NULL;p=hp;/先进后出/p!=NULL&&strcmp(psr->sr_c_num,p->c_num)!=0YN!feof(pFile)printf("景区基本信息数据文件打成功!\n");re+=8;Yprintf("城市信息数据加载成功!\n");(*head)=hp;/指向链头/re+=4;(pFile=fopen(gp_sr_info_filename,"r+"))==NULL1printf("景区基本信息数据文件打开败!\n");returnre;N54YYpsp=(structscespo*)malloc(sizeof(structscespo));//创建结点,存放从数据文件中读出的景点信息fscanf(pFile,"%s\t\t%s\t\t%s\t\t%s\t\t%s\t\t%s\n",psp->sp_c_num,psp->sp_sr_num,psp->sp_num,psp->scespo,psp->sp_location,psp->sp_time);/*查找景区信息支链上对应的景点结点*/p=hp;find=0;3!feof(pFile)Nprintf("景点信息文件打开成功!\n");re+=16;fclose(pFile);/关闭文件/printf("景点信息文件打开失败!\n");returnre;Y(pFile=fopen(gp_sp_info_filename,"r+"))==NULLNYNfree(psr);/释放所创建结点的内存空间/psr->next=p->sr_head;p->sr_head=psr;2p!=NULL456fclose(pFile)returnre

YYfree(psp);psp->next=psr->sp_head;psr->sp_head=psp;以后进先出方式插入景点信息支链中psr=p->sr_head;YYNYp!=NULL&&find==0psr=psr->next;p=p->next;3Npsr!=NULL&&find==0strcmp(psr->sr_num,psp->sp_sr_num)==0find=1;break;Nfind=1N6

5.2.文件5.2.1文件菜单下的保存<save>功能的函数:函数原型:BOOLsave(void);函数功能:调用createlist函数,将城市、景区、景点三级链表分别存在三个文件中,分别是c.txt、sr.txt、sp.txt。该程序的流程图如下:关闭文件开始关闭文件开始定义所需变量:定义所需变量:structcity*p/指向城市信息链的指针/structscearea*psr/指向景区信息链的指针/structscespo*psp/指向景点信息链的指gp_sp_info_filename针/FILE*pfout=NULL/文件指针/BOOLbret=TRUE/返回布尔值/gp_c_info_filename,gp_sr_info_filename,gp_sp_info_filename是存放链表的三个文件打开打开gp_c_info_filenamePP指向链头NPNP!=NULLYY读一条城市信息存到读一条城市信息存到gp_c_info_filename中22p=p->nextp=p->next 22打开打开gp_sr_info_filename关闭文件p=p->nextpsr=关闭文件p=p->nextpsr=psr->nextpsr=p->sr_headp=gp_headNpNp!=NULLYYpsrpsr!=NULL打开gp_sp打开gp_sp_info_filenameY读一条景区信息存到读一条景区信息存到gp_sr_info_filename中6p=gp_head6p=gp_headNNpp!=NULLYYpsr=p->sr_headpsr=p->sr_headNNpsr!=NULLpsr!=NULLset_text_success()关闭文件 打开gp_sp_info_filename3p=p打开gp_sp_info_filename3p=p->nextpsr=psr->nextY返回bretY返回bretpspsp=psr->pr_headNN453453 33N654Ypsp!=NULLp=p->nextpsp=psp->nextpsr=psr->next读一条景点信息存到gp_spN654Ypsp!=NULLp=p->nextpsp=psp->nextpsr=psr->next读一条景点信息存到gp_sp_info_filename中5.2.2.文件菜单下的备份<BackupData>功能的函数:函数原型:BOOLBackupData(void)函数功能:备份数据,将三类基础数据备份到一个数据文件backup.txt中5.2.3文件菜单下的恢复<RestoreData>功能的函数:函数原型:BOOLRestoreData(void)函数功能:恢复数据,备份数据后,文件被修改,可以通过回复函数,是三个文件的内容恢复到和备份文件里的数据相同。5.2.4文件菜单下的退出<ExitSys>功能的函数:函数原型:BOOLExitSys(void)函数功能:退出系统。5.3.数据维护5.3.1城市信息维护数据维护菜单下的城市信息维护<Maintainc_Info>功能的函数函数原型:BOOLMaintainc_Info(void)函数功能:维护城市信息,包括删除、插入以及修改。调用了以下函数:BOOLdelc(structcity**hp,char*c_num);/*删除城市信息结点*/BOOLins_city(structcity**hp,structcity*p);/*插入城市信息结点*/BOOLmodifc(structcity*hp,char*c_num,structcity*p);/*修改城市信息结点*/5.3.2景区信息维护数据维护菜单下的景区信息维护<Maintainsr_Info>功能的函数函数原型:BOOLMaintainsr_Info(void)函数功能:维护景区信息,包括删除、插入以及修改。调用了以下函数:BOOLins_scespo(structcity*hp,structscespo*psp);/*插入景点信息结点*/BOOLdelsp(structcity*hp,char*sr_num,char*sp_num);/*删除景点信息结点*/BOOLmodifsp(structcity*hp,char*sr_num,char*sp_num,structscespo*psp);/*修改景点信息结点*/5.3.3景点信息维护数据维护菜单下的景点信息维护<Maintainsp_Info>功能的函数函数原型:BOOLMaintainsp_Info(void)函数功能:维护景点信息,包括删除、插入以及修改。调用了以下函数:BOOLdelsr(structcity*hp,char*sr_num);/*删除景区信息结点*/BOOLins_scearea(structcity*hp,structscearea*psr);/*插入景区信息结点*/BOOLmodifsr(structcity*hp,char*sr_num,structscearea*psr);/*修改景区信息结点*/.现就城市链表给出Maintainc_Info的流程图:(见p)Y输出操作成功Y输出操作成功输出操作失败输入:需要删除的城市编号并把其存放在c_num调用delc函数返回值为TRUEN显示:删除城市信息插入城市信息修改城市信息用户选择1定义:字符数组c_num用来存放要删除的城市编号YN1开始结束输入操作成功输出操作失败输入操作成功输出操作失败调用ins_city函数返回值为TRUEYN1用户选择2Ystructcity*pc1=(structcity*)malloc(sizeof(structcity))申请一个动态空间节点用来存放要插入的城市信息输入:城市编号pc1->c_num,城市名称pc1->city,城市邮编pc1->c_inspnum,城市特色pc1->c_consnum,2结束

用户选择用户选择3输入操作成功输出操作失败调用modifc函数返回值为TRUEYN2structcity*pc2=(structcity*)malloc(sizeof(structcity))申请一个动态空间节点用来存放要新修改的城市信息字符数组c_num来存放要修改的城市编号输入:城市编号pc2->c_num,城市名称pc2->city,城市邮编pc2->c_inspnum,城市特色c_consnum,原城市编号结束开始strcmp(开始strcmp(p->c_num,c_num)==0编号相同,为要删除的城市Find=1,找到Yp=p->next指针往下移一位Find=1申请:指向城市节点指针p,用来遍历链表整型变量find,用来标识是否找到,置初值为0p=hp;使遍历指针指向链表开头p!=NULL,未到链表尾部YN返回该城市指针pc结束Y申请:structcity*p;申请:structcity*p;指向要删除节点指针structcity*p_prior=NULL;指向要删除节点的前一节点structscearea*psr;指向要删除节点指针structscearea*psr_prior;指向要删除节点的前一节点structscespo*psp;指向要删除节点指针structscespo*psp_prior;指向要删除节点的前一节点BOOLdel=FALSE;判断是否删除成功所用变量p=*hp使p指向链表头p!=NULL&&Strcmp(pc->c_num,c_num)!=0;未到链表尾且未找到Yp_prior=pc;p=p->next把指针向后移一位Np!=NULL,找到Ydel=TRUE3开始YpYpsp_prior=psp;psp=psp->next;free(psp_prior);释放景点节点空间psr=psr->next;free(psr_prior);释放景点节点空间psp=psr->sp_head;psr_prior=psr;psp!=NULLN3YNpsr=p->sr_head;free(pc);释放要删除的城市节点空间p_prior->next=p->next;使要删除节点的前一节点与其后一节点相连*hp=p->next;使头指针指向要删除的节点的下一结点p_prior==NULL;判断是否为第一个城市节点点psr!=NULLN444del=TRUE输出操作成功输出操作失败结束5.4.数据查询5.4.1城市信息查询数据查询菜单下的城市信息查询<Queryc_Info>功能的函数函数原型:BOOLQueryc_Info(void))函数功能:查询城市信息,包括精确查找(城市编号)和精确查找(所有信息)调用了以下函数:structcity*seekc(structcity*hp,char*c_num);/*查找城市信息结点*/structcity*seek_c(structcity*ph,intcond_num,...);5.4.2景区信息查询数据查询菜单下的景区信息查询<Querysr_Info>功能的函数函数原型:BOOLQuerysr_Info(void)函数功能:查询景区信息,包括精确查找(城市编号)和精确查找(所有信息)调用了以下函数:structscearea*seeksr(structcity*hp,char*sr_num);/*查找景区信息结点*/structscearea*seek_sr(structcity*hp,intcond_num,...);/*模糊查询城市信息结点*/5.4.3景点信息查询数据查询菜单下的景区信息查询<Querysr_Info>功能的函数函数原型:BOOLQuerysr_Info(void)函数功能:查询景区信息,包括精确查找(城市编号)和精确查找(所有信息)调用了以下函数:structscespo*seeksp(structcity*hp,char*sr_num,char*sp_num);/*查找景点信息结点*/structscespo*seek_sp(structcity*hp,intcond_num,...);/*模糊查询景点信息结点*/现就城市链表给出Querysr_Info的流程图:YYY定义所需变量:structcity*p;structscearea*psr;structscearea*psr_net==NULL;structscearea*psr_temp;sp_c_num;sp_sr_num;/*城市编号、景区编号*/ihot;/*用户选择操作*/i=0;/*循环控制变量*/result;/*函数操作结果*/ihot!=0绘制窗口;用户选择:1、精确查询;2、多条件组合查询;0、返回N结束ihot=1用户选择:1、开始输入;0、取消;1用户选择:1、开始输入;0、取消;2开始YihotYihot!=01N输入:城市编号sp_c_num;景区编号sp_sr_num;调用函数seekc(gp_head,p_num);返回p输出确切查找出的景区信息到屏幕返回值!=voidYN输出“操作无效”,结束ihot!=0;NY输入:组合条件个数cond_num;查询条件;2调用函数seek_c(gp_head,p_num);返回p_ret输出确切查找出的景区信息到屏幕返回值!=voidYN输出“操作无效”,结束结束结束结束结束开始N开始NN返回psrY调用函数strcmp(psr->sr_num,major),返回值为result;result!=0Npsr=psr->next;Yp!=NULL;psr!=NULL;Ypsr=p->sr_head;输出“操作无效”,结束结束输出“操作无效”,结束Psr=p->sr_head;Psr=p->sr_head;0<Cond_num<6NYP=phd;P!=NULLNY56定义所需变量:structcity*p;structscearea*psr;structscearea*psr_net==NULL;structscearea*psr_temp;sr_c_num;sr_num;/*城市编号、景区编号*/ihot;/*用户选择操作*/I=0;/*循环控制变量*/result;/*函数操作结果*/开始输出“操作无效”,结束输出“操作无效”,结束5P5Psr!=NULL;YPsr=psr->next;6P=p->next;NI<cond_num;I++;NY调用函数judge_sr(psr,condition[i]);返回值为result;Result!=0;NY789输出“操作无效”,结束输出“操作无效”,结束77I=cond_num;Y*psr_temp=*psr;Psr_temp->next=psr_ret;Psr_ret=psr_temp;返回psra_ret;89N结束5.5.清屏其原型声明如下:voidClearScreen(void);该函数在文件main.c中。其主要调用了以下函数:voidClearScreen(void);函数功能:清屏负责清除界面文字5.6.帮助5.6.1帮助菜单下的帮助<HelpTopic>功能的函数:函数原型:BOOLBackupData(void)函数功能:使用说明5.6.2.帮助菜单下的关于<AboutDorm>功能的函数:函数原型:BOOLAboutDorm(void)函数功能:制作人、指导老师、完成时间5.6.3帮助菜单下的帮助<information>功能的函数:函数原型:BOOLinformation(void)函数功能:调用voidtravers(structcity*head)函数,打出表中所有的的城市景区和景点信息,其中实参为链表的头指针gp_head.六、试验结果6.1.初始界面:A.加载成功B.加载失败C.下拉菜单6.2.文件:A.城市信息维护城市信息删除输入:027删除成功:删除失败:城市信息插入输入:040西藏440000风景优美的地方输入:enter插入成功输入:027武汉440000风景优美的地方输入:enter插入失败(城市编号已经存在)城市信息修改输入:027厦门470000海边城市027输入:enter修改成功输入:050厦门470000海边城市050输入:enter修改失败(城市编号不存在)B.景区信息维护景区信息删除输入:01输入:enter删除成功输入:15输入:enter删除失败(景区编号不存在)景区信息插入输入:02710户部巷4A武昌区司门口人文美食四季87654321输入:enter插入成功输入:09011户部巷4A武昌区司门口人文美食四季987654321输入:enter插入失败(城市编号不存在)输入:0272某某5A武昌区自然景观四季87654321输入:enter插入失败(景区编号已经存在)景区信息修改输入:02701户部巷4A武昌区司门口美食人文全天8765432101输入:enter修改成功输入:04001户部巷4A武昌区司门口美食人文全天8765432101输入:enter修改失败(城市彪悍或景区编号不存在)C.景点信息维护点击数据维护下拉菜单的景区信息维护选项跳出窗口:景点信息删除输入:06061输入:enter删除成功当景区编号或景点标号不存在时删除失败景点信息插入输入:02703东湖武昌区珞瑜路80元/人输入:enter插入成功当城市编号、景区编号或景点编号不存在时插入失败。当景点编号已经存在是插入失败。景点信息修改输入:02702021黄鹤楼武昌区大东门70元/人输入:ener修改成功当城市编号、景区编号和景点编号不存在或不匹配时修改失败。6.3.信息查询:A.城市信息查询点击数据查询下拉菜单下的城市信息查询跳出窗口:①.城市精确查询输入:0571输入:enter②.城市组合查询输入:101=武汉输入:enterB.景区信息查询①.景区精确查询输入:09输入:enter②.景区组合查询输入:21@池2>3A输入:enterC.景点信息查询①.景点精确查询输入:05051输入:enter②.景点组合查询输入:11@岛输入:enter6.4.帮助1.帮助点击帮助下拉菜单的帮助选项跳出窗口:2.关于点击帮助下拉菜单的关于选项跳出窗口:3.所有信息点击帮助下拉菜单的所有信息选项跳出窗口:七、心得体会接到这个课设题目的时候其实我心里是没底的,因为对这样一个系统,没有整体的认识,也不知道应该从哪里下手。后来在和同学讨论之后又来大概的了解和明确的目的,于是在暑假刚开始我就开始着手写课设。7.1.充分了解供需关系景点查询系统,是面向游客的,所以我得从游客的角度思考,我的系统应该具备哪些信息,当然,我也上网搜了一些资料,比如:湖北旅游查询系统。这个系统能够是个很好的例子,所以在任务数的基础上,我对城市景区和景点的信息都做了些调整和修改,是信息更全面更有用。并且确定了信息查询功能,包括精确查询和模糊查询。在这,针对管理员,此系统应该有基本的文件保存,备份,恢复,以及信息的删除,插入和修改功能。7.2.链表的创建最开始我就定义了三个动态链表,分别是城市,景区和景点,但是明显这样做是不够的,必须把这三个链表连起来,于是我通过两个指针,一个下一级另一个则指向下一个链表的头。于是链表就创建出来了。7.3.功能函数的编写测试前面做的都是些准备工作,到功能函数时就遇到了麻烦。3.1创建链表例:while(!feof(pFile)){p=(structcity*)malloc(sizeof(structcity));fscanf(pFile,"%s\t\t%s\t\t%s\t\t%s\n",p->c_num,p->city,p->c_inspnum,p->c_consnum);p->sr_head=NULL;p->next=hp;hp=p;}fclose(pFile);a.刚开始我是用fread函数从文件中读取信息,但是在这种情况下,判断是否为空功能的函数(feof)在读取最后一个信息后不会立刻跳出while循环,而是又走了一次,这样导致我读取的信息都是乱码,或者干脆停止工作.b.在修改了这个问题后,我发现我的系统只能读取第一级的全部信息,但是读第二级也就是景区信息的时候会无法读入。在经过断点调试后最终发现是因为p->sr_head没有置空,导致指针失效。3.2保存保存的函数比较简单,但是和创建链表一起用时却会停止工作,我起先以为是创建链表哪里出问题了,但是在debug无果后,原来是save和createlist两个函数创建链表的方式不同,我一个写的是先进后出,一个是先进先出,导致出错,在改正后,就可以正常运行了。3.3数据维护a.写删除函数时,忽略了被删除链表下的其他链表,导致,这些链表依然存在文件中却已经没有用处,反而会干扰程序的正常运行例:if(p_prior==NULL)//如果是链头{*hp=p_current->next;}else{p_prior->next=p_current->next;}b.做这些处理时,因为忽略了头指针和其他指针的区别,也出了错,还好立马发现并且改了过来。3.4界面这个是最让我头疼的,刚开始看资料时根本看不懂,太多的变量名让我头昏眼花,后来是问的同学,外加通过不断使实验,了解这些变量的作用,做出了现在的界面。7.4.收获通过这次的课程设计,我对链表和链表的操作都有了更深的理解和运用,初步了解了人机交换界面,最重要的是,通过不断地debug,掌握了找出bug的经验,比如断点调试等多种方法。八、参考文献[1]曹计昌,卢萍,李开.C语言程序设计,北京:科学出版社,2008[2]张引.C程序设计基础课程设计,杭州:浙江大学出版社,2007[3]黄明,梁旭,万洪莉.C语言课程设计,北京:电子工业出版社,2006九、源代码及注释<system.h>#include<stdio.h>#include<stdlib.h>#include<windows.h>#include<wincon.h>#include<conio.h>#include<string.h>#include<io.h>#include<fcntl.h>#include<sys\stat.h>#include<ctype.h>#include<time.h>#defineNUM100#ifndefTYPE_H_INCLUDED#defineTYPE_H_INCLUDED#defineSCR_ROW9999/*屏幕行数*/#defineSCR_COL80/*屏幕列数*/structscespo/*景点*/{charsp_sr_num[NUM];/*景区编号*/charsp_c_num[NUM];/*城市编号*/charscespo[NUM];/*景点名称*/charsp_num[NUM];/*景点编号*/charsp_location[NUM];/*景点地址*/charsp_time[NUM];/*花费时间*/structscespo*next;/*指向下一个景点节点*/};structscearea/*景区*/{charsr_c_num[NUM];/*城市编号*/charscearea[NUM];/*景区名称*/charsr_num[NUM];/*景区编号*/charsr_level[NUM];/*景区级别*/charsr_location[NUM];/*景区地址*/charsr_ticket[NUM];/*景区分类*/charsr_time[NUM];/*开放时间*/charsr_connum[NUM];/*查询电话*/structscearea*next;/*指向下一个景区节点*/structscespo*sp_head;/*景点链表的头指针*/};structcity/*城市*/{charcity[NUM];/*城市名称*/charc_num[NUM];/*城市编号*/charc_inspnum[NUM],c_consnum[NUM];/*城市邮编、城市特色*/structcity*next;/*指向下一个城市节点*/structscearea*sr_head;/*景区链表的头指针*/};/***屏幕窗口信息链结点结点结构*/typedefstructlayer_node{charLayerNo;/**<弹出窗口层数*/SMALL_RECTrcArea;/**<弹出窗口区域坐标*/CHAR_INFO*pContent;/**<弹出窗口区域字符单元原信息存储缓冲区*/char*pScrAtt;/**<弹出窗口区域字符单元原属性值存储缓冲区*/structlayer_node*next;/**<指向下一结点的指针*/}LAYER_NODE;/***标签束结构*/typedefstructlabe1_bundle{char**ppLabel;/**<标签字符串数组首地址*/COORD*pLoc;/**<标签定位数组首地址*/intnum;/**<标签个数*/}LABEL_BUNDLE;/***热区结构*/typedefstructhot_area{SMALL_RECT*pArea;/**<热区定位数组首地址*/char*pSort;/**<热区类别(按键、文本框、选项框)数组首地址*/char*pTag;/**<热区序号数组首地址*/intnum;/**<热区个数*/}HOT_AREA;LAYER_NODE*gp_top_layer=NULL;/*弹出窗口信息链链头*/structcity*gp_head=NULL;char*gp_sys_name="景点信息查询系统";/*系统名称*/char*gp_c_info_filename="d:\\c.txt";/*城市信息数据文件*/char*gp_sr_info_filename="d:\\sr.txt";/*景区信息数据文件*/char*gp_sp_info_filename="d:\\sp.txt";/*景点信息数据文件*/char*gp_filename="d:\\backupdata.txt";/*备份数据文件*/char*ga_main_menu[]={"文件(F)",/*系统主菜单名*/"数据维护(M)","数据查询(Q)","清理屏幕(S)","帮助(H)"};char*ga_sub_menu[]={"","[S]数据保存",/*系统子菜单名*/"[B]数据备份","[R]数据恢复","[X]退出Alt+X","",/*空串用来在弹出菜单中分隔子菜单项,下同*/"[D]城市信息维护","[P]景区信息维护","[C]景点信息维护","","[D]城市信息查询","[P]景区信息查询","[C]景点信息查询","","[T]清理屏幕","","[A]帮助","[B]关于...","[Y]所有信息"};intga_sub_menu_count[]={5,4,4,2,4};/*各主菜单项下子菜单的个数*/intgi_sel_menu=1;/*被选中的主菜单项号,初始为1*/intgi_sel_sub_menu=0;/*被选中的子菜单项号,初始为0,表示未选中*/CHAR_INFO*gp_buff_menubar_info=NULL;/*存放菜单条屏幕区字符信息的缓冲区*/CHAR_INFO*gp_buff_stateBar_info=NULL;/*存放状态条屏幕区字符信息的缓冲区*/char*gp_scr_att=NULL;/*存放屏幕上字符单元属性值的缓冲区*/chargc_sys_state='\0';/*用来保存系统状态的字符*/HANDLEgh_std_out;/*标准输出设备句柄*/HANDLEgh_std_in;/*标准输入设备句柄*/intcreatelist(structcity**head);/*数据链表初始化*/voidInitInterface(void);/*系统界面初始化*/voidClearScreen(void);/*清屏*/voidShowMenu(void);/*显示菜单栏*/voidPopMenu(intnum);/*显示下拉菜单*/voidPopPrompt(intnum);/*显示弹出窗口*/voidPopUp(SMALL_RECT*,WORD,LABEL_BUNDLE*,HOT_AREA*);/*弹出窗口屏幕信息维护*/voidPopOff(void);/*关闭顶层弹出窗口*/voidDrawBox(SMALL_RECT*parea);/*绘制边框*/voidLocSubMenu(intnum,SMALL_RECT*parea);/*主菜单下拉菜单定位*/voidShowState(void);/*显示状态栏*/voidTagMainMenu(intnum);/*标记被选中的主菜单项*/voidTagSubMenu(intnum);/*标记被选中的子菜单项*/intDealConInput(HOT_AREA*phot_area,int*pihot_num);/*控制台输入处理*/voidSetHotPoint(HOT_AREA*phot_area,inthot_num);/*设置热区*/voidRunSys(structcity**pphd);/*系统功能模块的选择和运行*/BOOLExeFunction(intmain_menu_num,intsub_menu_num);/*功能模块的调用*/voidCloseSys(structcity*hp);/*退出系统*/BOOLLoadData(void);/*数据加载*/BOOLsave(void);/*保存数据*/BOOLBackupData(void);/*备份数据*/BOOLRestoreData(void);/*恢复数据*/BOOLExitSys(void);/*退出系统*/BOOLHelpTopic(void);/*帮助主体*/BOOLAboutDorm(void);/*关于系统*/BOOLinformation(void);/*所有信息*/BOOLMaintainc_Info(void);/*维护城市信息*/BOOLMaintainsr_Info(void);/*维护景区信息*/BOOLMaintainsp_Info(void);/*维护景点信息*/BOOLQueryc_Info(void);/*查询城市信息*/BOOLQuerysr_Info(void);/*查询景区信息*/BOOLQuerysp_Info(void);/*查询景点信息*/voidClearWorkArea(void);BOOLset_text_success(void);BOOLset_text_fail(void);BOOLins_scespo(structcity*hp,structscespo*psp);/*插入景点信息结点*/BOOLdelsp(structcity*hp,char*sr_num,char*sp_num);/*删除景点信息结点*/BOOLmodifsp(structcity*hp,char*sr_num,char*sp_num,structscespo*psp);/*修改景点信息结点*/BOOLdelsr(structcity*hp,char*sr_num);/*删除景区信息结点*/BOOLins_scearea(structcity*hp,structscearea*psr);/*插入景区信息结点*/BOOLmodifsr(structcity*hp,char*sr_num,structscearea*psr);/*修改景区信息结点*/BOOLdelc(structcity**hp,char*c_num);/*删除城市信息结点*/BOOLins_city(structcity**hp,structcity*p);/*插入城市信息结点*/BOOLmodifc(structcity*hp,char*c_num,structcity*p);/*修改城市信息结点*/structcity*seekc(structcity*hp,char*c_num);/*查找城市信息结点*/structscearea*seeksr(structcity*hp,char*sr_num);/*查找景区信息结点*/structscespo*seeksp(structcity*hp,char*sr_num,char*sp_num);/*查找景点信息结点*/structcity*seek_c(structcity*ph,intcond_num,...);/*模糊查询景区信息结点*/structscearea*seek_sr(structcity*hp,intcond_num,...);/*模糊查询城市信息结点*/structscespo*seek_sp(structcity*hp,intcond_num,...);/*模糊查询景点信息结点*/BOOLjudge_c(structcity*p,char*pcondition);/*判断景区信息数据项是否满足查询条件*/BOOLjudge_sr(structscearea*psr,char*pcondition);/*判断城市信息数据项是否满足查询条件*/BOOLjudge_sp(structscespo*psp,char*pcondition);/*判断景点信息数据项是否满足查询条件*/BOOLmatchstring(char*string_item,char*pcond);/*字符串与查询条件是否满足指定的运算关系*/voidtravers(structcity*head);#endif/**<TYPE_H_INCLUDED*/<main.c>#include"systerm.h"intmain(void){COORDsize={SCR_COL,SCR_ROW};/*窗口缓冲区大小*/gh_std_out=GetStdHandle(STD_OUTPUT_HANDLE);/*获取标准输出设备句柄*/gh_std_in=GetStdHandle(STD_INPUT_HANDLE);/*获取标准输入设备句柄*/SetConsoleTitle(gp_sys_name);/*设置窗口标题*/SetConsoleScreenBufferSize(gh_std_out,size);/*设置窗口缓冲区大小80*25*/LoadData();/*数据加载*/InitInterface();/*界面初始化*/RunSys(&gp_head);/*系统功能模块的选择及运行*/CloseSys(gp_head);/*退出系统*/return0;}/***函数名称:LoadData*函数功能:将三类基础数据从数据文件载入到内存缓冲区和十字链表中.*输入参数:无*输出参数:无*返回值:bool类型,功能函数中除了函数ExitSys的返回值可以为外,*其他函数的返回值必须为true.**调用说明:为了能够以统一的方式调用各功能函数,将这些功能函数的原型设为*一致,即无参数且返回值为BOOL.返回值为时,结束程序运行.*/BOOLLoadData(){intRe=0;gc_sys_state|=1;gc_sys_state|=2;Re=createlist(&gp_head);gc_sys_state|=Re;gc_sys_state&=~(4+8+16-Re);if(gc_sys_state<(1|2|4|8|16)){/*数据加载提示信息*/printf("\n系统基础数据不完整!\n");printf("\n按任意键继续...\n");getch();}returnTRUE;}/***函数名称:createlist*函数功能:从数据文件读取基础数据,并存放到所创建的十字链表中.*输入参数:无*输出参数:head主链头指针的地址,用来返回所创建的十字链.*返回值:int型数值,表示链表创建的情况.*0空链,无数据*4已加载城市信息数据,无景区信息和景点信息数据*12已加载城市信息和景区基本信息数据,无景点信息数据*28三类基础数据都已加载**调用说明:*/intcreatelist(structcity**head)/*创建链表*/{structcity*hp=NULL,*p;structscearea*psr;structscespo*psp;FILE*pFile;intfind;intre=0;if((pFile=fopen(gp_c_info_filename,"r+"))==NULL){printf("城市信息数据文件打开失败!\n");returnre;}printf("城市信息数据文件打开成功!\n");/*从数据文件中读城市信息数据,孙茹以后进先出方式建立的主链*/while(!feof(pFile)){p=(structcity*)malloc(sizeof(structcity));fscanf(pFile,"%s\t\t%s\t\t%s\t\t%s\n",p->c_num,p->city,p->c_inspnum,p->c_consnum);p->sr_head=NULL;p->next=hp;hp=p;}fclose(pFile);if(hp==NULL){printf("城市信息数据加载失败!\n");returnre;}printf("城市信息数据加载成功!\n");(*head)=hp;re+=4;if((pFile=fopen(gp_sr_info_filename,"r+"))==NULL){printf("景区基本信息数据文件打开败!\n");returnre;}printf("景区基本数据文件打开成功!\n");re+=8;while(!feof(pFile)){psr=(structscearea*)malloc(sizeof(structscearea));//创建结点,存放从数据文件中读出的景区基本信息fscanf(pFile,"%s\t\t%s\t\t%s\t\t%s\t\t%s\t\t%s\t\t%s\t\t%s\n",psr->sr_c_num,psr->sr_num,psr->scearea,psr->sr_level,psr->sr_location,psr->sr_ticket,psr->sr_time,psr->sr_connum);psr->sp_head=NULL;p=hp;/*在主链上查找盖景区所在城市对应的主链结点*/while(p!=NULL&&strcmp(psr->sr_c_num,p->c_num)!=0){p=p->next;}if(p!=NULL)//如果找到,则将结点以后进先出的方式插入景区支链{psr->next=p->sr_head;p->sr_head=psr;}else//如果没有找到,则释放所创建结点的内存空间{free(psr);}}fclose(pFile);if((pFile=fopen(gp_sp_info_filename,"r+"))==NULL){printf("景点信息文件打开失败!\n");returnre;}printf("景点信息文件打开成功!\n");re+=16;/*凑够数据文件中读取景点信息数据,存入景区基本信息支链对应的结点的景区支链中*/while(!feof(pFile)){psp=(structscespo*)malloc(sizeof(structscespo));//创建结点,存放从数据文件中读出的景点信息fscanf(pFile,"%s\t\t%s\t\t%s\t\t%s\t\t%s\t\t%s\n",psp->sp_c_num,psp->sp_sr_num,psp->sp_num,psp->scespo,psp->sp_location,psp->sp_time);/*查找景区信息支链上对应的景点结点*/p=hp;find=0;while(p!=NULL&&find==0){psr=p->sr_head;while(psr!=NULL&&find==0){if(strcmp(psr->sr_num,psp->sp_sr_num)==0){find=1;break;}psr=psr->next;}p=p->next;}

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论