收藏 分销(赏)

语c言课程设计报告航空订票系统--毕业设计.doc

上传人:w****g 文档编号:7413327 上传时间:2025-01-03 格式:DOC 页数:39 大小:932.50KB 下载积分:12 金币
下载 相关 举报
语c言课程设计报告航空订票系统--毕业设计.doc_第1页
第1页 / 共39页
语c言课程设计报告航空订票系统--毕业设计.doc_第2页
第2页 / 共39页


点击查看更多>>
资源描述
西安郵電學院 C语言课程设计报告 题 目: 航空订票系统 院系名称: 计算机学院 专业名称: 计算机科学与技术 设计起止时间:2013年06月17日~2013年06月20日 一. 设计目的 对所学知识进行体系化、系统化的整理; 进行模块化的训练,将大的程序转化为一个个小的函数一次解决问题; 统筹规划,在设计之前有一个大的构想,以此为基础进行发散设计; 关注细节,避免在设计程序中因为一个小小的bug导致程序崩溃 代码健壮性,考虑一些错误的操作可能带来的影响。 二. 设计内容 航空订票系统 三.概要设计 1. 功能模块图; 系统首页 查询航班信息 订单详情 账号管理 删除航班 增加航班 申请帐号 管理员登陆 游客登陆 修改航班信息 信息查询 订票系统 退票系统 2. 各个模块详细的功能描述。 <一> 游客登陆: 1、信息查询 a.航班号查询 (依据输入的航班号来找到对应的航班信息) b.起降地查询 (依据输入的起飞地和目的地来找到对应航班信息) c.时间查询 (依据输入的时间找到对应航班信息 时间可逐渐具体) 2、订票系统 根据输入的起飞地与目的地显示出所有走此航线的航班信息,然后根 据显示的信息输入想要订购航班的航班号,确认购票后系统自动付款将此 航班加入登陆用户的订单信息中。 3、退票系统 进入后首先显示出当前登陆者已有的航班订单,输入需要退票的航班 的航班号,退票成功。 4、订单详情 显示出当前登陆者已有的航班订单信息,并按照时间先后顺序显示。 <二> 管理员登陆: 1、增加航班 确定增加新航班后依据提示以此输入航班号、起飞地、目的地、起飞 时间、到达时间、票价;之后选择是否继续输入,若选Y继续刚才的循环, 否则退出增加航班。 2、删除航班 输入需要删除航班的航班号,回车后该航班即被删除。 3、修改航班信息 输入需要修改航班的航班号,显示出该航班的航班信息,选项选择修 改航班信息的哪一项,选择后即可对该项信息进行修改。 4、信息查询 a.时间查找 (与游客登陆中的时间查询一样) b.起始地查询 (输入起始地,显示出由此地起飞的所有航班信息) c.目的地查询 (输入目的地,显示飞往此地的所有航班信息) d.起降地查询 (与游客登陆中起降地查询一致) e.航班号查询 (与游客登陆中航班号查询一致) f.所有航班 (显示出当前已录入的所有航班航班信息) 5、账号管理 a.密码修改 (针对遗忘密码的用户可以进行密码的重置) b.所有用户 (显示出所有已注册用户的用户名) <三> 帐号申请: 根据提示输入用户名,若该用户名已有则显示“该用户已存在”,若用户 名可用,则继续输入密码,两次密码一致则注册成功,可使用该用户以游客 身份登陆。 四.详细设计 1. 功能函数的调用关系图 航班号查询函数 打开航班信息 文件函数 起降地查询函数 时间查询函数 显示所有用户名函数 修改用户密码函数 航班信息排序函数 管理员首页函数 所有航班查询函数 航班号查询函数 起降地查询函数 目的地查询函数 起始地查询函数 时间查询函数 保存航班信息 文件函数 打开航班信息 文件函数 管理员首页函数 管理员首页函数 账号管理函数 查看航班信息函数 修改航班信息函数 删除航班函数 增加航班函数 管理员首页函数 密码输入函数 打开游客信息 文件函数 储存游客信息 文件函数 航班信息排序函数 支付宝函数 打开游客信息 文件函数 打开航班信息 文件函数 信息查询函数 游客首页函数 打开游客信息 文件函数 首页函数 订单详情函数 退票系统函数 订票系统函数 信息查询函数 密码输入函数 首页函数 游客首页函数 帐号申请函数 管理员登陆函数 游客登陆函数 首页函数 主函数 2. 各功能函数的数据流程图; 游客登陆后将该游客对应链表中的节点位置进行传递,以便以后对该游客的信息操 做; 在使用到链表时用打开文件的函数将文件信息转化为链表返回其头指针,使用处用 相同类型的指针变量作为接收即可对该链表进行操作; 在对链表操作完成后,将链表头指针传递给保存信息到文件的函数,该函数会将链 表转化为文件信息进行储存; 输入密码函数,只需将用于保存密码的数组名作为参数传递,则可对该数组进行密 码的输入与回删。 3. 重点设计及编码。 <1、将文件信息读入并转化为链表进行操作 Youke *file_1() //将游客信息从文件中读入转化为链表 { FILE *fp; Youke *head_youke,*p1,*p2,*p3; int i; head_youke=(Youke *)malloc(LEN_Youke); //新建头节点不储存数据信息 head_youke->next=NULL; p1=head_youke; if((fp=fopen("youke_information.txt","r"))==NULL) { printf("Open youke_information error!\n"); exit(1); } while(feof(fp)==0) //当读取文件没有结尾时 { p2=(Youke *)malloc(LEN_Youke); //新开辟空间 fread(p2,LEN_Youke,1,fp); //将一个结构体大小的数据信息存放在该空间中 for(i=0,p3=p2;p3->name[i]!='\0';i++) p3->name[i]-=3; //对从文件读入的信息解密 for(i=0,p3=p2;p3->passwd[i]!='\0';i++) p3->passwd[i]-=4; p1->next=p2; //让上一个节点指向这个新节点 p2->next=NULL; //新节点指向空 p1=p2; } fclose(fp); for(p1=p2=head_youke->next;p1->next!=NULL;p2=p1,p1=p1->next); p2->next=NULL; //目的为链表结尾指向NULL,貌似可以不用.. return head_youke; //返回这个链表头节点 以便以后对链表进行操作 } <2、将链表信息储存在文件中 void file_2(Youke *head_youke) //将游客链表信息储存在文件中 传递链表的头节点 { FILE *fp; Youke *p1,*p2; int i; if((fp=fopen("youke_information.txt","w"))==NULL) { printf("Open youke_information error!\n"); exit(1); } p1=head_youke->next; //p1为头节点的下一个节点 while(p1!=NULL) { for(i=0,p2=p1;p2->name[i]!='\0';i++) p2->name[i]+=3; //在将信息保存到文件前进行加密处理 for(i=0,p2=p1;p2->passwd[i]!='\0';i++) p2->passwd[i]+=4; if(fwrite(p1,LEN_Youke,1,fp)!=1) //每次向文件中写入一个结构体大小的数据信息 printf("file write error!\n"); p1=p1->next; } fclose(fp); } <3、输入密码函数,可以进行回删 void passwd(char passwd[]) { int i; char ah; for(i=0;;i++) { ah=getch(); if(ah==13) { passwd[i]='\0'; break; } if(ah==127) { if(i<=0) { i=i-1; continue; } printf("\b \b"); i=i-2; continue; } passwd[i]=ah; putchar('*'); } } 五.测试数据及运行结果 1. 正常测试数据(3组)及运行结果; 首页 游客登陆 游客首页 信息查询 航班号查询 起降地查询 查询结果 时间查询 查询结果 查询结果 订票系统 订票系统 支付宝功能 退票系统 订单详情 管理员登陆 管理员首页 增加航班 删除航班 修改航班 查看已有航班 起始地查找 查询结果 目的地查询 查询结果 所有航班查询 用户管理 密码修改 所有用户 帐号申请 2. 非正常测试数据(2组)及运行结果。 登陆密码错误 错误的航班号 错误的起降地 错误的时间 六.调试情况,设计技巧及体会 1. 对自己的设计进行评价,指出合理和不足之处,提出改进方案; 仍有很多待优化的地方,例如订购机票时没有显示出此航班飞机还有多少座位,是 否还能订购;没有区分游客与用户的区别,作为游客不需要登陆即可进行简单的查询操 作;过期机票不应当予以现实.... 2. 对设计及调试过程的心得体会。 期间会遇到许多难以解决的问题,每次出现Bug使用调试工艺挨个检错,有时也在 必要的地方进行printf来检测当前变量值是否为预期的值。 七. 参考文献 《C Primer Plus》 《Linux C编程实战》 八.附录:源代码(电子版) /*==================================================================== * * Filename: C.c * * Description: Curriculum Design * * Version: 1.0 * Created: 2013年06月08日 18时52分56秒 * Revision: none * Compiler: gcc * * Author: Leehom (RenLixiang), OurHom.759@ * Company: Class 1204 of Computer Science and Technology * * ====================================================================*/ #include <unistd.h> #include <assert.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include "passwd.h" #include "pay.h" #include "file.h" #include "function.h" #include "getch.h" #include "root.h" #include "time_fun.h" int main(int argc, char *argv[]) { home_page(); return EXIT_SUCCESS; } void home_page() //最开始界面 { char ch; do { system("clear"); printf("\n\n\t\t 『航 空 订 票 系 统』\n\n"); printf("\t\t\t 【1】游客登陆\n\n"); printf("\t\t\t 【2】管理员登陆\n\n"); printf("\t\t\t 【3】帐号申请\n\n"); printf("\t\t\t 【0】退出程序\n\n"); ch=getch(); switch(ch) { case'1':youke_denglu();break; case'2':manager_denglu();break; case'3':zhuce();break; case'0':system("clear");printf("\n\n\n\n\t\t\t\tBye~\n");sleep(1);exit(1);break; } }while(1); } void youke_denglu() //游客登陆函数 实现游客登陆功能 { char youke_name[20]; char youke_passwd[20]; int flag=0; Youke *head_youke,*p1; head_youke=file_1(); system("clear"); printf("\n\t\t\t『游客登陆』\n\n"); printf("\n\t【0】返回上页"); printf("\n\n\t\t\t用户名:"); gets(youke_name); if(strcmp(youke_name,"0")==0) home_page(); printf("\n\n\t\t\t密 码:"); passwd(youke_passwd); //调用passwd(char passwd[20])函数 在"passwd.h"中定义 for(p1=head_youke->next;p1!=NULL;p1=p1->next) { if((strcmp(p1->name,youke_name)==0)&&(strcmp(p1->passwd,youke_passwd)==0)) //当密码与用户名匹配时登陆成功 { system("clear"); printf("\n\n\n\n\t\t\t登陆成功!\n"); sleep(1); youke(p1); //传递当前登陆者的节点地址 } if((strcmp(p1->name,youke_name)==0)&&(strcmp(p1->passwd,youke_passwd)!=0)) //当用户名存在 但密码输入错误是显示密码错误 { system("clear"); flag=1; printf("\n\n\n\n\t\t\t密码错误!\n"); sleep(1); youke_denglu(head_youke); // } } if(flag==0) //在之前设置标记符 此时显示无该用户 { system("clear"); printf("\n\n\n\n\t\t\t无该用户!\n"); sleep(1); youke_denglu(head_youke); } } void youke(Youke *UK) //游客登陆成功后跳转到该页面 { char ch; do { system("clear"); printf("\n\n\t 『尊敬的 %s 欢迎来到本航空公司服务系统』\n",UK->name); printf("\n\n\t\t\t【1】信息查询\n\n"); printf("\t\t\t【2】订票系统\n\n"); printf("\t\t\t【3】退票系统\n\n"); printf("\t\t\t【4】订单详情\n\n"); printf("\t\t\t【0】退出登陆\n\n"); ch=getch(); switch(ch) { case'1':polling(UK);break; case'2':ding_ticket(UK);break; case'3':tui_ticket(UK);break; case'4':ding_dan(UK);break; case'0':system("clear");printf("\n\n\n\n\t\t\t正在退出...\n");sleep(1);home_page();break; } }while(1); } void polling(Youke *UK) //查询信息主页面 { char ch; do { system("clear"); printf("\n\n\t\t\t『信息查询系统』\n\n\n"); printf("\t\t\t【1】航班号查询\n\n"); printf("\t\t\t【2】起降地查询\n\n"); printf("\t\t\t【3】时间查询\n\n"); printf("\t\t\t【0】返回上页\n\n"); ch=getch(); switch(ch) { case'1':polling_hangban(UK);break; case'2':polling_start(UK);break; case'3':polling_time(UK);break; case'0':youke(UK);break; } }while(1); } int polling_hangban(Youke *UK) //根据航班号查询信息 { Flight *head_flight,*p1; head_flight=file_3(); char num[20]; int flag=0; system("clear"); printf("\n\t\t 『航班号查询』\n\n\n"); printf("\n\t【0】返回上页\n"); printf("\n\n\t\t\t航班号:"); gets(num); if(strcmp(num,"0")==0) polling(UK); for(p1=head_flight->next;p1!=NULL;p1=p1->next) if(strcmp(num,p1->flight_num)==0) //判断是否找到需要的航班 { system("clear"); flag=1; printf("\n\t\t\t 『查询结果』\n\n"); printf("\n");Pri_Tit //宏 在"file.h"中定义 Pri_Fli //宏 在"file.h"中定义 } if(flag==0) { printf("\n\n\t\t 没有找到 %s 号航班\n",num); sleep(1); polling_hangban(UK); //没有找到时再次进入本函数 } printf("\n\t\t\t按任意键返回上页\n"); getch(); polling(UK); //找到后回到查询信息主页面 return 0; } int polling_start(Youke *UK) //起降地查询 { Flight *head_flight,*p1; head_flight=file_3(); char start[20],end[20]; int flag=0; system("clear"); printf("\n\t\t 『起降地查询』\n\n\n"); printf("\n\t【0】返回上页\n"); printf("\n\n\t\t\t起飞地:"); gets(start); if(strcmp(start,"0")==0) polling(UK); printf("\n\n\t\t\t目的地:"); gets(end); system("clear"); printf("\n\t\t\t 『查询结果』\n\n"); printf("\n");Pri_Tit for(p1=head_flight->next;p1!=NULL;p1=p1->next) if((strcmp(start,p1->flight_start)==0)&&(strcmp(end,p1->flight_end)==0)) //判断是需要找的航班 { flag=1; Pri_Fli } if(flag==0) { system("clear"); printf("\n\n\n\n\t\t没有找到 %s-->%-s 的航班\n",start,end); sleep(1); polling_start(UK); } printf("\n\t\t\t按任意键返回上页\n"); getch(); polling(UK); return 0; } void polling_time(Youke *UK) //根据时间查找航班 { Flight *head_flight,*p1; head_flight=file_3(); char year[21],month[3],day[3]; int flag=0; system("clear"); printf("\n\t\t 『时间查询』\n\n\n"); printf("\n\t【0】返回上页\n"); printf("\n\t\t\t年:"); gets(year); if(strcmp(year,"0")==0) polling(UK); system("clear"); printf("\n\t\t\t 『查询结果』\n\n"); printf("\n");Pri_Tit for(p1=head_flight->next;p1!=NULL;p1=p1->next) if(strncmp(year,p1->flight_time_start,4)==0) //比对时间字符串中前4个字符是否是输入的字符 { flag=1; Pri_Fli } if(flag==0) { printf("\n\t\t\t没有找到相关信息\n"); printf("\n\t\t\t按任意键返回上页\n"); getch(); polling(UK); } flag=0; printf("\n\t【0】返回上页\n"); printf("\n\t\t\t月:"); gets(month); if(strcmp(month,"0")==0) polling(UK); if(strlen(month)==1) { month[1]=month[0]; //将格式转化为可以进行比对的统一模式 month[0]='0'; //与之后的管理员时间查询函数一致 } //与之后的day格式调整一样 year[4]='-'; year[5]='\0'; strcat(year,month); //将输入的月份续接在year数组之后 system("clear"); printf("\n\t\t\t 『查询结果』\n\n"); printf("\n");Pri_Tit for(p1=head_flight->next;p1!=NULL;p1=p1->next) if(strncmp(year,p1->flight_time_start,7)==0) //对比时间字符串中前7个字符是否时输入的字符 { flag=1; Pri_Fli } if(flag==0) { printf("\n\t\t\t没有找到相关信息\n"); printf("\n\t\t\t按任意键返回上页\n"); getch(); polling(UK); }flag=0; printf("\n\t【0】返回上页\n"); printf("\n\t\t\t日:"); gets(day); if(strcmp(day,"0")==0) polling(UK); if(strlen(day)==1) { day[1]=day[0]; day[0]='0'; } year[7]='-'; year[8]='\0'; strcat(year,day); system("clear"); printf("\n\t\t\t 『查询结果』\n\n"); printf("\n");Pri_Tit for(p1=head_flight->next;p1!=NULL;p1=p1->next) if(strncmp(year,p1->flight_time_start,10)==0) { flag=1; Pri_Fli } if(flag==0) { printf("\n\t\t\t没有找到相关信息\n"); printf("\n\t\t\t按任意键返回上页\n"); getch(); polling(UK); } printf("\n\t\t\t按任意键返回上页\n"); getch(); polling(UK); } int ding_ticket(Youke *UK) { Flight *head_flight,*p1; head_flight=file_3(); printf("a\n"); char start[20],end[20]; char num[20]; int flag=0; system("clear"); printf("\n\t\t\t『订票系统』\n"); printf("\n\t【0】返回上页\n"); printf("\n\n\t\t\t起飞地:"); gets(start); if(strcmp(start,"0")==0) youke(UK); printf("\n\n\t\t\t目的地:"); gets(end); system("clear"); printf("\n\t\t\t 『结果如下』\n"); printf("\n");Pri_Tit for(p1=head_flight->next;p1!=NULL;p1=p1->next) { if((strcmp(start,p1->flight_start)==0)&&(strcmp(end,p1->flight_end)==0)) //判断是否是需要订购的航班路线 { flag=1; Pri_Fli } } if(flag==0) { system("clear"); printf("\n\n\n\n\t\t\tSorry! 暂无该路线航班...\n"); sleep(1); ding_ticket(UK); } printf("\n\t\t请输入需要订票的航班号:"); //根据现实输入需要订票的航班号 gets(num); ding_ticket_next(UK,num); //将所定的航班号传递的下一个函数中 youke(UK); return 0; } int ding_ticket_next(Youke *UK,char num[20]) { Flight *head_flight,*p1,*p2; Youke *head_youke,*q1; head_flight=file_3(); head_youke=file_1(); int i,j,flag=0,flag1; char ch; for(q1=head_youke->next;q1!=NULL;q1=q1->next) //让q1与当前登陆者UK所指向的节点相同 if(strcmp(q1->name,UK->name)==0) break; for(p1=head_flight->next;p1!=NULL;p1=p1->next) if(strcmp(num,p1->flight_num)==0) { flag=1; printf("\n\n\t 是否订购 %s 号 %s-->%-s 的航班? Y/N\n",p1->flight_num,p1->flight_start,p1->flight_end); ch=getch(); if(ch=='Y'||ch=='y') { printf("\n\n\t\t\t正在跳转到支付宝\n\n\t\t\t "); for(i=0;i<3;i++) { printf(". "); fflush(NULL); sleep(1); } pay(); //选择支付后跳转到pay()函数 在"pay.h"中定义 for(j=0;j<20;j++) //j对应游客结构体中num[j] { for(flag1=0,p2=head_flight->next;p2!=NULL;p2=p2->next) { if(strcmp(q1->num[j],p2->flight_num)==0) //判断当前num[j]中是否有航班信息 { flag1=1; //如果有 则跳出这个循环j+1 再次进行本循环 break; } } if(flag1==0) //当找到某个num[j]没有保存航班信息的时候跳出循环 break; } strcpy(q1->num[j],p1->flight_num); //将订购的该航班的航班号赋给num[j] file_2(head_youke); //将信息保存到文件 文件函数均定义在"file.h"中 } else { printf("\n\n\t\t\t 已放弃订票\n"); printf("\n\n\t\t\t按任意键返回上页\n"); getch(); youke(UK); } } if(flag==0) { printf("\n\n\t\t\t没有找到 %s 号航班\n",num); sleep(1); ding_ticket(UK); } return 0; } void tui_ticket(Youke *UK) { Youke *head_youke,*q1; head_youke=file_1(); Flight *head_flight,*p1; Flight *new_flight,*a1,*a2; new_flight=(Flight *)malloc(LEN_Flight); new_flight->next=NULL; a1=a2=new_flight; head_flight=file_3(); char num[20]; int i,j,flag; for(q1=head_youke->next;q1!=NULL;q1=q1->ne
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 学术论文 > 毕业论文/毕业设计

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服