课程设计——航空客运订票系统
/*Copyright (c)2017,烟台大学计算机与控制工程学院
*All rights reservrd.
*作者:王华慧
*完成时间:2017年12月21日
*版本号:v1.0
*问题描述:航空客运订票系统
/************************************************************* * Copyright (c) 2017, 烟台大学计算机与控制工程学院 * All rights reserved. * 文件名称:fk.h * 文件标识:无 * 内容概要:实现程序各种功能的函数的声明 * 作者:王华慧 * 完成日期:2017年12月21日 * 版本号:V1.0 *************************************************************/
#pragma once
#ifndef FK_H_INCLUDED
#define FK_H_INCLUDED
#define MAXSIZE 6 /定义航线量的最大值/
typedef struct waiting
{
char name[10];/*姓名*/
int wait_ask_number;/*订票量*/
struct waiting *next;
}qnode, *qptr;
typedef struct pqueue
{
qptr front;/*等候替补客户名单域的头指针*/
qptr rear;/*等候替补客户名单域的属指针*/
}linkqueue;
typedef struct ordered_people
{
char name[10];/*客户姓名*/
char zheng[50];
int ordering_number;/*订票量*/
int grade;/*舱位等级*/
struct ordered_people *next;
}linklist;
typedef struct airline
{
char end_station[10];/*终点站名 */
char air_num[10];/*航班号*/
char plane_num[10];/*飞机号*/
char day[7];/*飞行周日(星期几)*/
int people_quota;/*乘员定额*/
int more_ticket;/*余票量*/
linklist *order;/*乘员名单域,指向乘员名单链表的头指针*/
linkqueue wait; /用于等待替补客户的客户等待列表域,分别指示待入队列的客户在头部和尾部的位置/
}lineinfo;/*在后面加,start的意思是定义一种start类型,跟int型一样。/
void list(airline *&start);
void search(airline *&start);
struct airline *find_air_num(airline *&start);
void prtlink(airline *&start);
void ordering(airline *&start);
void return_ticket(airline *&start);
int menu_select();
#endif // FK_H_INCLUDED
1. /*************************************************************
2. * Copyright (c) 2017, 烟台大学计算机与控制工程学院
3. * All rights reserved.
4. * 文件名称:fk.cpp
5. * 文件标识:无
6. * 内容概要:实现程序各种功能的函数的定义
7. * 作者:王华慧
8. * 完成日期:2017年12月21日
9. * 版本号:V1.0
10. *************************************************************/
/************************************************************* * Copyright (c) 2017, 烟台大学计算机与控制工程学院 * All rights reserved. * 文件名称:main.cpp* 文件标识:无 * 内容概要:主函数* 作者:王华慧 * 完成日期:2017年12月21日 * 版本号:V1.0 *************************************************************/ #include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "fk.h"
int main()
{
struct airline *start; /*定义 airline类型的一个start指针*/
struct airline air[MAXSIZE] = { { "beijing","1","B8571","SUN",6,1 },
{ "guangzhou","2","S1002","MON",2,2 },
{ "shenzhen","3","L1003","FRI",1,1 },
{ "beijing","4","D1005","TUE",5,1 },
{ "beijing","5","G1006","SUN",6,3 },
{ "yantai","6","A1007","SUN",6,5 } };/*初始化航线信息*/
start = air;
printf("\t\t=============航空客运订票系统=============\n");
printf("\n");
printf("\n");
printf("\n");
for (;;)
{
switch (menu_select())
{
case 1:list(start); break;
case 2:prtlink(start); break;
case 3:search(start); break;
case 4:ordering(start); break;
case 5:return_ticket(start); break;
case 6:printf("\n欢迎使用本系统,再见!\n"); exit(0);
}
printf("\nPress any key to continue!\n");
getchar();
}
system("pause");
}
/********************************************************* * 功能描述: 打印全部航班信息* 输入描述: 无 * 输出描述: 无 * 返回值 : 无 * 其它说明: 调用即可 ************************************************************/
void list(airline *&start)/*打印全部航线信息*/
{
void display(struct airline *info);
struct airline *info;
int i = 0;
info = start;
printf("终点站名\t航班号\t飞机号\t飞行周日\t乘员定额\t余票量\n");
while (i<MAXSIZE) {
display(info);
info++;
i++;
}
printf("\n\n");
}
/********************************************************* * 功能描述: 打印每条航班信息* 输入描述: 无 * 输出描述: 无 * 返回值 : 无 * 其它说明: 调用即可 ************************************************************/
功能描述:根据终点打印所有航班信息
输入描述:目的地
输出描述:去往该地点的所有航班
返回值:
无
其它说明:调用即可
功能描述:基于指定的目的地列出所有航班信息
输入描述:指定的目的地
输出描述:前往该目的地的所有航班
返回值:
无
其它说明:无需额外操作
void search(airline *&start)
/根据客户提出的终点站名输出航线信息/
{
struct airline *info, *find_air_num();
char name[10];
int i = 0;
info = start;
printf("请输入终点站名:");
scanf("%s", name);
printf("终点站名\t航班号\t飞机号\t飞行周日\t乘员定额\t余票量\n");
while (i<MAXSIZE) {
if (strcmp(name, info->end_station) != 0)//比较两个字符串的内容是否一致
display(info);
info++;
i++;
}
if (i>MAXSIZE)
printf("对不起,该航线未找到!\n");
}
该功能旨在通过航班编号获取全部航班详情;输入字段为目的地;返回结果为所选航线的全部航班信息;返回值为空表示无匹配结果;系统能够自动完成相关操作
struct airline *find_air_num(airline *&start)
/*根据系统提出的航班号查询并以指针形式返回*/
{
struct airline *info;
char number[10];
int i = 0;
info = start;
printf("请输入航班号:");
scanf("%s", number);
while (i<MAXSIZE) {
if (!strcmp(number, info->air_num)) return info;
info++;
i++;
}
printf("对不起,该航线末找到!\n");
return NULL;
}
功能描述:输出客户信息
void prtlink(airline *&start)
/打印订票乘员名单域的客户名单信息/
{
linklist *p;
struct airline *info;
info = find_air_num(start);
p = info->order;
if (p != NULL) {
printf("客户姓名 订票数额 舱位等级\n");
while (p) {
printf("%s\t\t%d\t%d\n", p->name, p->ordering_number, p->grade);
p = p->next;
}
}
else
printf("该航线没有客户信息!!\n");
}
功能描述:支持批量添加等待排队的客户信息
输入描述:采用标准的函数接口形式
输出描述:返回客户的详细信息数据
返回值 :q
其它说明:无需额外配置即可调用使用
linkqueue appendqueue(linkqueue q, char name[], int amount)
/增加排队等候的客户名单域/
{
qptr p = (qptr)malloc(sizeof(qnode));
strcpy(p->name, name);
p->wait_ask_number = amount;
p->next = NULL;
if (q.front == NULL)/*若原排队等候客户名单域为空*/
q.front = p;
else
q.rear->next = p;
q.rear = p;
return q;
}
功能说明:负责管理订票员的客户信息数据;输入参数:标准函数接口;输出结果:无;返回对象:链表头节点;无需额外操作
linklist *insertlink(linklist *head, int amount, char name[], int grade)
/增加订票乘员名单域的客户信息/
{
linklist *p1, *p;
p1 = head;
p = (linklist *)malloc(sizeof(linklist));
if (!p) { printf("\n系统出现错误\n"); return NULL; }
strcpy(p->name, name);
p->ordering_number = amount;
p->grade = grade;
p->next = NULL;
if (head == NULL)/*若原无订票客户信息*/
{
head = p; p->next = NULL;
}
else
head = p;
p->next = p1;
return head;
}
功能说明:订单售票服务
void ordering(airline *&start)
/*办理订票业务*/
{
struct airline *info;
int amount, grade;
char name[10];
char zheng[50];
char r;
info = start;
if (!(info = find_air_num(start))) return;/*根据客户提供的航班号进行查询,如为空,退出该模块*/
printf("请输入你订票所需要的数量:");
scanf("%d", &amount);
if (amount>info->people_quota)/*若客户订票额超过乘员定票总额,退出*/
{
printf("\n对不起,您输入的票的数量已经超过乘员定额!");
return;
}
if (amount <= info->more_ticket)/*若客户订票额末超过余票量,订票成功并等记信息*/
{
int i;
printf("请输入您的姓名(订票客户):");
scanf("%s", name);
printf("请输入您的身份证号(订票用户:");
scanf("%s", zheng);
printf("请输入%s票的舱位等级:", name);
scanf("%d", &grade);
info->order = insertlink(info->order, amount, name, grade);/*在订票乘员名单域中添加客户信息*/
for (i = 0; i<amount; i++)/*依次输出该订票客户的座位号*/
printf("%s的座位号是:%d\n", name, info->people_quota - info->more_ticket + i + 1);
info->more_ticket -= amount;/*该航线的余票量应减掉该客户的订票量*/
printf("\n祝您乘坐愉快!\n");
}
else /*若满员或余票额少于订票额,询问客户是否需要进行排队等候*/
{
printf("\n已经没有更多的票,您需要排队等候吗?(Y/N)");
cin>>r;
printf("%c", r);
if (r == 'Y' || r == 'y')
{
printf("\n请输入您的姓名(排队订票客户):");
scanf("%s", name);
info->wait = appendqueue(info->wait, name, amount);/*在排队等候乘员名单域中添加客户信息*/
printf("\n注册成功!\n");
}
else
{
printf("\n\n您想要查询的航线没有满足你的要求,是否愿意输入终点站名查询别的航班信息?(Y/N)\n");
cin>>r;
printf("%c\n", r);
if (r == 'Y' || r == 'y')
search(start);
else
{
printf("\n欢迎您下次再次订购!\n");
}
}
}
}
/********************************************************* * 功能描述: 退票业务* 输入描述: 用户信息输入* 输出描述: 无* 返回值 :无* 其它说明: 调用即可 ************************************************************
void return_ticket(airline *&start)
/退票模块/
{
struct airline *info;
qnode *t, *back, *f, *r;
int grade;
linklist *p1, *p2, *head;
char cusname[10];
if (!(info = find_air_num(start))) return;/执行查找操作以获取基于客户的飞行路线信息,并判断是否成功/
head = info->order;
p1 = head;
printf("请输入你的姓名(退票客户):");
scanf("%s", cusname);
while (p1 != NULL) {/*根据客户提供的姓名到订票客户名单域进行查询*/
if (!strcmp(cusname, p1->name)) break;
p2 = p1; p1 = p1->next;
}
if (p1 == NULL) { printf("对不起,你没有订过票!\n"); return; }/*若未找到,退出本模块*/
else {/*若信息查询成功,删除订票客户名单域中的信息*/
if (p1 == head) head = p1->next;
else p2->next = p1->next;
info->more_ticket += p1->ordering_number;
grade = p1->grade;
printf("%s成功退票!\n", p1->name);
free(p1);
}
info->order = head;/*重新将航线名单域指向订票单链表的头指针 */
f = (info->wait).front;/*f指向排队等候名单队列的头结点*/
r = (info->wait).rear;/*r指向排队等候名单队列的尾结点*/
t = f;/*t为当前满点条件的排队候补名单域*/
while (t)
{
当(info.moreticket >= info.wait.front.wait_ask_number){/若满足条件时为头结点}/
int i;
info->wait.front = t->next;
printf("%s订票成功!\n", t->name);
for (i = 0; i<t->wait_ask_number; i++)/*输出座位号*/
printf("%s的座位号是:%d\n", t->name, info->people_quota - info->more_ticket + i + 1);
info->more_ticket -= t->wait_ask_number;
info->order被insertlink函数用来将t name和grade参数加入到t->wait_ask_number中;/将信息插入到订票客户信息链表中/
free(t);
break;
}
back = t; t = t->next;
if ((info->more_ticket) >= (t->wait_ask_number) && t != NULL)/*若满足条件者不为头结点*/
{
int i;
back->next = t->next;
printf("%s订票成功!\n", t->name);
for (i = 0; i<t->wait_ask_number; i++)/*输出座位号*/
printf("%s的座位号是:%d\n", t->name, (info->more_ticket) - i);
info->more_ticket -= t->wait_ask_number;
插入到订票客户名单链表中
插入到订票客户名单链表中
free(t); break;
}
if (f == r) break;
}
}
AI写代码
