航班售票系统课程设计报告
课程设计报告
课程名称:姓 名:班级学号:
指导教师:
完成日期: 6月20日
目 录
1 课程设计目的与要求 ..................................... 1
2问题描述 ............................................... 2
3总体设计 ............................................... 3
3.1功能分析 ............................................................................................................. 3
3.2系统主要使用的函数 ......................................................................................... 3
3.3 系统使用的主要数据结构 ................................................................................ 4
4详细设计 ............................................... 6
4.1 程序总体结构图 ................................................................................................ 6
4.2 程序流程图 ........................................................................................................ 6
5功能测试 ............................................... 8
5.1 航班售票系统 .................................................................................................... 8 6程序设计调试情况(程序设计及调试过程中碰到的问题及解决的方
法) .................................................... 11
7课程设计小结 .......................................... 12
参考文献 ................................................ 13
附录 系统源程序 ......................................... 14
1 课程设计目的与要求
高级语言程序设计是本科工科类各专业的重要基础课,课程以影响深远的、传统的、面向过程的优秀编程语言C 语言为基础,学习程序设计的基本概念和方法,通过本门课程学习,应使同学掌握高级语言的基本原理,熟练掌握程序设计的基础知识、基本概念;掌握程序设计的思想和编程技巧。
课程设计是在学生已经具备了使用C 语言编写简单的应用程序的能力,为使学生对C 语言有更全面的理解,进一步提高运用C 语言编程解决实际问题的能力,通过提出算法、指定输入输出来设计一个解决方案。经过该实践环节,培养学生的探索精神和创新能力。通过答辩训练学生的综合表达能力。
参加本课程设计的学生,应当认真完成本课程设计的全部过程。并以最终课程设计成果来证明其独立完成各种实际任务的能力。从而反映出理解和运用本课程知识的水平和能力。具体如下:
(1)数据组织方面尽量使用到:数组、链表、结构体、文件;
(2)程序结构方面做到函数调用,尽量采用指针运算;
(3)代码编写规范,形成良好的编程习惯;
(4)程序须有一定的健壮性和必要的提示信息,考虑问题的多种可能和边界数据。
(5)课设完成须进行答辩,提交课设报告电子稿、装订的打印稿。课设报告内容包括以下几个方面:
● 程序的总体设计和算法分析。
● 程序流程图、函数说明
● 源程序代码清单
● 测试数据和测试过程记录
● 遇到的问题及解决方法分析
● 课程设计小结
2问题描述
航班售票系统:
(1)系统以菜单方式工作
(2)假设该民航有若干航班,要求实现增加航班和取消某个航班的功能。
(3)查询:根据用户提出的终到站查询航班号、售票情况等航班信息;也可根据航班号,列出该航班已订票的乘客名单。
(4)订票:根据航班号为客户订票,如该航班有余票,则为客户订票;如该航班已满员,则显示相应信息。
(5)退票:按乘客要求退出已预定的机票。
3总体设计
3.1功能分析
系统提供主界面,各种功能操作以独立的函数为基础,运用对链表操作的技术来实现航班的管理,同时对操作结果在计算机中做永久保存。)
3.1.1航班售票系统
(1)订票功能:
此功能是Reserve 函数来实现的,里面嵌套调用了3个函数Deletereturn ,Addcustomer ,
WriteCustomer ,
(2)退票功能:
我用的是ReturnTicket 函数来实现的,里面嵌套调用了3个函数AddReturn ,DeleteCustomer ,WriteCustomer ,
(3)修改航线功能:
在实现这个功能的时候,必须有航线的增加,取消,和修改三个不同的功能,所以我编写了3个不同的函数,AddAirFlight ,DeleteAirFlight ,ChangeAirFlight ,
(4)查询航班及乘客信息功能
WriteCustomer 的作用在本部分当中体现,它用来输出客户的信息,在Init 函数中,我事先置入了3个默认的乘客,分别是我们小组的3个人,OutInfo 函数则输出了所有航班的信息
3.2系统主要使用的函数
int Reserve(char name[],int airNum,int i) /*订票系统函数*/
void ReturnTicket (int i,int airNum,int seat) /*退票系统函数*/
int DeleteReturn(AirFlight *p) /*删除退票函数*/
void AddReturn (AirFlight *p,int seat) /*添加退票信息函数*/
void ChangeAirFlight() /*修改航线函数*/
void DeleteAirFlight() /*删除航线函数*/
void DestroyCustomer(CNode *p) /*删除客户信息函数*/
void AddCustomer(AirFlight *p,char *name,int airNum,int seat) /*添加客户信息函数*/
void DeleteCustomer(AirFlight *p,int seat) /*删除客户信息函数*/
void AddAirFlight() /*添加航线信息函数*/
void WriteAirInfo(FILE *fp) /*输出输出航线函数*/
void OutInfo() /*输出所有信息*/
void WriteCustomer(FILE *fp) /*输出客户文件函数*/
3.3 系统使用的主要数据结构
typedef struct Return /*定义退票系统的结构体*/
{
int seat; struct Return *next;
}Return;
typedef struct /*定义客户信息的结构体*/
{
char name[20]; int airNum; int seat;
}Customer;
typedef struct CNode /*定义客户单链表的结构体*/
{
Customer cust; struct CNode *next;
}CNode;
typedef struct AirFlight /*定义航班信息的结构体*/
{
int flight; int plane; int reservation; int availnum; CNode *cHead; Return *rHead; struct AirFlight *next;
}AirFlight;
typedef struct Airline /*定义航线信息的结构体*/
{
char dest[20]; AirFlight *head;
Airline airInfo[3]; /*定义三条航线为全局变量*/}Airline;
4详细设计
4.1 程序总体结构图
图4-1航班售票系统结构图
4.2 程序流程图
图4-2-1航班售票系统中的AddCustomer ()
图4-2-2航班售票系统中的ChangeAirFlight ()
图4-2-3航班售票系统中的operation3()
5功能测试
5.1 航班售票系统
图5-2-1运行后文件中的截图
图5-2-2航班售票系统主菜单
图5-2-3订票提示语
图5-2-4订票成功
图5-2-5退票成功
图5-2-6修改航线提示语
图5-2-7增加航线提示语
图5-2-8增加航线成功
图5-2-8取消航线成功
图5-2-8修改航线成功
图5-2-9显示乘客信息
6程序设计调试情况(程序设计及调试过程
中碰到的问题及解决的方法)
在程序设计中,我遇到的最大的问题就是结构体变量的定义和链表的运用,应为一开始在学习链表的时候我就感觉到很吃力,所以在编航空售票系统的大程序时,我上网查找了很多资料,有不懂的也去百度,或者在同学之间讨论,至今还有一些不能熟练运用,但和之前相比已经有了很大的进步,我会在今后的学习中进一步巩固。
在调试过程中,也有不少的问题。比如,漏加了取地址符,导致程序没有错误而无法运行;字符串输入函数getchar 的用法出错,导致无法输入菜单命令;头文件的名字和文件名不一致而出错,这是连接时候出现的问题;还有曾遇到,同样一个文件,以.c 的后缀运行时有错,以.cpp 的后缀运行时就没有错了,老师说这涉及到了兼容性的问题。总之,由于粗心大意犯的错误,自己是可以找出来
的,实在太隐蔽的,我也就只能求助同学或者老师了。
7课程设计小结
本次课程设计已经完成,编写好的程序整体上运行与题目要求很吻合,算法大多比较通用,各个函数模块的正确性、完备性、对输入的容错能力以及算法的进一步改进在设计中都有表述,这道题使我熟悉了文件的输入输出操作,也深刻认识到了链表在实际的操作中有多么的难,我会在进一步的学习中,对链表进行深层次的理解。
本次程序编写我从简单入手,在进行复杂的编写过程。首先我搜集资料,掌握航空售票系统方面的种种相关知识,其次我们对这个系统应该如何编译作了一个简单的思考和讨论,确定要运用到的知识和相关难点,并对这些难点进行解决,最终到发杂的程序上。
回望本次的课程设计,我学到了很多的东西。无论是枯燥的搜集资料,还是一遍遍地调试程序给我带来的疲惫感,都在最终看到程序正常运行的那刻消失殆尽,感受到了努力付出,然后收获硕果的成就感。
总结我这周的实训,我学到了很多的知识。不论是理论知识的掌握亦或是实践经验的积累,我都有了进一步的提升。面对科学实践过程中所遇到的难题,我不能退缩,要严谨,认真,无所畏惧地面对它。正如本次的课程设计,编写的过程很艰难,一个小小的错误都会导致最终程序无法正常运行。因此,只有我们每个人认真严谨的完成自己的任务,不出现一丝一毫的马虎,才能获得最后的成功。
本以为掌握课本上所教授的理论知识对于我们当代大学生而言就足够了。然而,在实训过后才发现这样的理解是十分错误的。理论知识若没有经过实践的考验,那它便是经不起推敲的。只有把实践和理论结合起来,用理论知识支持实践,用实践来肯定理论知识,才能提高自己的学习能力和动手能力。
在设计的过程中我们遇到了各种各样的问题,也发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,通过这次课程设计,把以前所学过的知识重新温故,巩固了所学的知识,也能够了解到自己相对薄弱的环节。总而言之,本次实训我真的受益匪浅。
小组成员分工:
组长: 负责 修改航线信息和查询航班信息 模块
组员: 负责 主程序模块
负责订票、退票 模块
参考文献
[1]. 迟剑,刘艳飞等.C 语言宝典.北京:电子工业出版社,2009.6
[2]. 李恬,邱小平等.C 语言程序设计实训与应用教程.北京:清华大学出版社,2010.2
[3]. 黄锐军.C#程序设计项目实训教程.北京:化学工业出版社,2009.10
[4]. 耿祥义,张跃平.C 语言程序设计实用教程.北京:清华大学出版社,2010.11
附录 系统源程序
#include
#include
#include
#include
typedef struct Return
{
int seat; struct Return *next;
}Return;
typedef struct
{
char name[20]; int airNum; int seat;
}Customer;
typedef struct CNode
{
Customer cust; struct CNode *next;
}CNode;
typedef struct AirFlight
{
int flight; int plane; int reservation; int availnum; CNode *cHead; Return *rHead; struct AirFlight *next;
}AirFlight;
typedef struct Airline
{
char dest[20];
AirFlight *head;
}Airline;
Airline airInfo[3];
int Reserve(char name[],int airNum,int i)
{
}
void ReturnTicket (int i,int airNum,int seat)
{
void AddReturn(AirFlight*p,int seat); void DeleteCustomer (AirFlight *p,int seat); void WriteCustomer(FILE *fp); int DeleteReturn(AirFlight *p); void AddCustomer(AirFlight *p,char *name,int airNum,int seat); void WriteCustomer(FILE *fp); FILE *fp; AirFlight *p; int seat; for(p=airInfo[i].head;p&&p->flight!=airNum;p=p->next); if(p==NULL) return -2; if(p->availnum==0) return -1; else if(p->rHead!=NULL) seat=DeleteReturn(p); seat =p->reservation; else p->availnum--; p->reservation++; AddCustomer (p,name,airNum,seat); if(!(fp=fopen("customer.txt","w"))) { } WriteCustomer(fp); return seat; puts("对不起,操作有误,无法打开文件\"customer.txt\"!"); return -2;
} AirFlight *p; for(p=airInfo[i].head;p&&p->flight!=airNum;p=p->next); if(p==NULL) { } return; AddReturn(p,seat); p->availnum++; p->reservation--; DeleteCustomer(p,seat); if(!(fp=fopen("customer.txt","w"))) { } WriteCustomer(fp); puts("对不起,操作有误,无法打开文件\"customer.txt\"!"); return; puts("对不起,操作有误,没有找到退票信息!\n"); else
int DeleteReturn(AirFlight *p)
{
}
void AddReturn (AirFlight *p,int seat)
{
Return *temp; temp=(Return *)malloc(sizeof(Return)); if(temp==NULL) Return *temp; int seat; temp=p->rHead; p->rHead=temp->next; seat=temp->seat; free(temp); return seat;
} } temp->seat=seat; temp->next=p->rHead; p->rHead=temp; puts("对不起,操作有误,分配空间失败!"); return;
void ChangeAirFlight()
{
}
}
void DeleteAirFlight()
{
void DestroyCustomer(CNode *p); void DestroyReturn(Return *p); else printf("对不起,不存在该航线%d!\n",airFlight); int airFlight,k,changeFlight; AirFlight *p; CNode *pC; puts("请输入您所要修改的航线:\n"); scanf("%d",&airFlight); if(0flight!=airFlight;p=p->next); if(p!=NULL) { puts("请输入您的新航线:\n"); scanf("%d",&changeFlight); p->flight=changeFlight; for(pC=p->cHead; pC; pC=pC->next) pC->cust.airNum=changeFlight; printf("恭喜!航线 %d 已成功修改成 %d.\n",airFlight,p->flight);
} int airFlight,k; AirFlight *p,*pre=NULL; puts("请输入您要取消的航线!\n"); scanf("%d",&airFlight); if(0flight!=airFlight;p=p->next) pre=p; if(p==NULL) { } if(pre==NULL) airInfo[k].head=p->next; else pre->next=p->next; DestroyCustomer(p->cHead); DestroyReturn(p->rHead); free(p); printf("恭喜!已成功取消该航线%d\n",airFlight); OutInfo(); printf("对不起,不存在该航线%d!\n",airFlight); return;
void DestroyCustomer(CNode *p)
{
}
void DestroyReturn(Return *p)
{ CNode *pNext; while(p!=NULL) { } pNext=p->next; free(p); p=pNext;
} while(p!=NULL) { } pNext=p->next; free(p); p=pNext;
void AddCustomer(AirFlight *p,char *name,int airNum,int seat)
{
}
void DeleteCustomer(AirFlight *p,int seat)
{
CNode *temp,*pre=NULL; for(temp=p->cHead;temp&&temp->cust.seat!=seat;temp=temp->next) { } if(pre==NULL) p->cHead=temp->next; else pre->next=temp->next; free(temp); puts("对不起,没有找到相应的客户,请您核对后继续!"); return; pre=temp; if(temp==NULL) CNode *temp; if(!(temp=(CNode*)malloc(sizeof(CNode)))) { } temp->cust.airNum=airNum; temp->cust.seat=seat; strcpy(temp->cust.name,name); temp->next=p->cHead; p->cHead=temp; puts("对不起,操作有误,开辟空间失败!\n"); return;
void WriteCustomer(FILE *fp)
{
}
void WriteAirInfo(FILE *fp)
{
int i; AirFlight *p,*q; fputs(" ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\n",fp); fputs("以下为本航空公司提供的航班信息:\n",fp); for(i=0;inext) { fputs("\n\n",fp); int i; AirFlight *p; CNode *q; fputs(" ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\n",fp); fputs("以下为本航空公司提供的乘客信息:\n",fp); for(i=0;inext) { } fputs("\n\n",fp); fputs("航班\t座位号\t乘客姓名\n",fp); for(q=p->cHead;q;q=q->next) fprintf(fp,"%d\t%d\t%s\n",q->cust.airNum,q->cust.seat,q->cust.name);
} } } fprintf(fp,"\t航班号:%d\n\t飞机号:%d\n\t订票数:" "%d\n\t余票数:%d\n",q->flight,q->plane,q->reservation,q->availnum);
void OutInfo()
{
}
void AddAirFlight()
{
int k,airflight; AirFlight *temp; puts("请选择本次航程的着陆点:[0/1/2]\n"); puts("☆0. 北京\n☆1. 上海\n☆2. 广州\n"); scanf("%d",&k); if(k2) { puts("对不起,操作有误,输入无效!"); return; FILE *fp,*fp2; if(!(fp=fopen("airinfo.txt","w"))) { } WriteAirInfo(fp); fclose(fp); if(!(fp2=fopen("customer.txt","w"))) { } WriteCustomer(fp2); fclose(fp2); puts("对不起,操作有误,无法打开文件\"airinfo.txt\"!\n"); return; puts("对不起,操作有误,无法打开文件\"airinfo.txt\"!\n"); return;
} printf("请输入航班号:"); switch(k) { case 0: puts("[1~300]:"); break; case 1: puts("[301~600]:"); break; case 2: puts("[601~900]:"); } scanf("%d",&airflight); if(airflight300*(k+1)) { } temp=(AirFlight*)malloc(sizeof(AirFlight)); if(temp==NULL) { } temp->availnum=100; temp->reservation=0; temp->cHead=NULL; temp->rHead=NULL; temp->plane=1; temp->flight=airflight; temp->next=airInfo[k].head; airInfo[k].head=temp; printf("恭喜!新航线已成功建立!\n"); OutInfo(); puts("对不起,操作有误,开辟空间失败!\n"); return; puts("Wrong input!"); return;
void Init()
{
int i; strcpy(airInfo[0].dest,"Beijing");
} strcpy(airInfo[2].dest,"Guangzhou"); for(i=0;iflight=300*i+1; airInfo[i].head->plane=i+1; airInfo[i].head->reservation=0; airInfo[i].head->availnum=100; airInfo[i].head->cHead=NULL; airInfo[i].head->rHead=NULL; airInfo[i].head->next=NULL; puts("对不起,操作有误,分配空间失败!"); return;
void Operation1()
{
int i,seat; int airNum; char name[20]; printf("本航空公司为您提供的航班有:\n"); printf("航线1飞往北京:航班号1-300\n"); printf("航线2飞往上海:航班号301-600\n"); printf("航线3飞往广州:航班号601-900\n"); printf("\n若开始订票,请输入您的姓名及航班号:\n"); printf("友情提示:姓名和航班号用空格隔开\n"); scanf("%s %d",name,&airNum); if(0
} else if(600
void Operation2()
{
} int i,seat; int airNum; printf("\n请输入您的飞机号及座位号:\n"); printf("友情提示:飞机号和座位号用空格隔开\n"); scanf("%d%d",&airNum,&seat); if(0
void Operation3()
{
}
void main()
{
int flag=1; char ch; Init(); while(flag) { printf("\n\t 欢迎进入航空订票系统\t\n"); printf("\n\t\t---我们将竭诚为您服务\n"); puts("\n\t\t服务菜单\t\n"); puts("☆\t\t1.订票 \t\t☆\n☆\t\t2.退票 \t\t☆\n☆\t\t3.修改航线信息 char chm; printf("请您再次选择服务项目:\n\t1.增加航线\n\t2.取消航线\n\t3.修改航线chm=getch(); if(chm=='1') AddAirFlight(); else if(chm=='2') DeleteAirFlight(); else if(chm=='3') ChangeAirFlight(); else puts("对不起,操作有误,输入无效!"); return; \n"); \t☆\n"
" ☆\t\t4.查询航班信息 \t☆\n★\t\t5.退出服务 \t★");
puts("\n"); puts("请您选择服务项目:"); ch=getch(); if(ch=='1') Operation1(); else if(ch=='2') Operation2(); else if (ch=='3') Operation3(); else if(ch=='4') { WriteAirInfo(stdout); WriteCustomer(stdout);
} } } OutInfo(); else if(ch=='5') flag=0; else puts("对不起,操作有误,输入无效!");