📄 train_booking_bookop.c
字号:
// train_booking_bookop.c -- 包含用户票务操作函数
//
/////////////////////////////////////////////////////////////////////////////
#ifndef TRAIN_BOOKING_BOOKOP_C_
#define TRAIN_BOOKING_BOOKOP_C_
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include "train_booking_declare.h"
#include "train_booking_const.h"
#include "train_booking_unit.h"
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// 函数功能: 用户软卧票订票事务处理
//
// 函数参数: op_psngr_pt:操作用户信息结构体指针
// system_info_pt:系统信息结构体指针
// train_info_pt:订票列车信息结构体指针
//
// 函数说明: 1、车次、时间信息输入在此函数外完成,站点信息输入在此函数内完成
// 2、在使用此函数之前,应已找到对应列车及车次数据,本程序将依次
// 搜索该列车的所有要求类型的车厢,直到找到座位
//
/////////////////////////////////////////////////////////////////////////////
status book_sb_ticket(passenger_info *op_psngr_pt, system_info *system_info_pt,
train_info *train_info_pt)
{
booked_info *booked_info_head, *booked_info_pt;
char t_begin_station[64], t_end_station[64];
int t_begin_order, t_end_order, t_seat_order, t_distance;
int booked_state = 0, car_amount = 0, this_cost;
int ok_car_order, ok_seat_order;
int booked_car_order;
char ch;
int i, j;
CLS;
actitle("预订软卧车票");
// 取得订票的起点
printf("第一步:确定始发站(当前站为 %s 站,回车直接确认)\n",
system_info_pt->location);
if (!(get_str("始发站", t_begin_station, MIN_STATION_ID_LEN, MAX_STATION_ID_LEN)))
{
message(INFO, "将当前站点设置为始发站!", NULL);
printf("【信息】您输入的始发站为 %s 站!\n", system_info_pt->location);
WAIT;
}
// 取得订票的终点
printf("第二步:确定终点站\n");
if (!(get_str("终点站", t_end_station, MIN_STATION_ID_LEN, MAX_STATION_ID_LEN)))
{
message(WARN, "预订软卧车票失败!", WC);
return FAIL;
}
// 根据始、终点确定列车行程区间的开始、结束序号
if (!(get_span_order(&train_info_pt->station_links, t_begin_station, t_end_station,
&t_begin_order, &t_end_order)))
{
message(WARN, "抱歉!订票失败!", WC);
return FAIL;
}
message(INFO, "正在执行订票操作,请稍候...", NULL);
// 依次检测每个软卧车厢是否还有空位
for (i = 0; i < SOFT_BED_CAR; i++)
{
if (check_sbed_remained(&train_info_pt->sbed_info_list[i], t_begin_order,
t_end_order, &t_seat_order)) // 查找到合适的车厢号
{
ok_car_order = i;
printf("【信息】在第%d个软卧车厢发现合适座位!", i + 1);
printf("【信息】该车厢在列车内编号为 %d !\n", ok_car_order + 1);
message(INFO, "恭喜恭喜", W);
}
}
if (i == SOFT_BED_CAR - 1) // 如果没有找到合适的车厢
{
message(WARN, "抱歉!本趟列车已经没有你需要的票了。", NULL);
message(TIP, "告诉你一个好消息,本车站提供系统通知功能。", NULL);
message(TIP, "如果你选择排队等票,那么你的运气够好的情况下,", NULL);
message(TIP, "如果有人退了符合您的要求的票,系统将会以消息形", NULL);
message(TIP, "式通知你,以便你能够得以订票。", NULL);
message(TIP, "需要排队,请按Y键,按其他任意键返回。", W);
ch = getch();
if ('y' == ch) // 如果用户要求通知
{
// 如果排队等候人满则拒绝请求
if (train_info_pt->total_waiters == MAX_NOTIFY_AMOUNT)
{
message(INFO, "实在不好意思,排队的人太多了,您还是换订另一趟车的票吧,谢谢合作!", NULL);
message(WARN, "预订软卧车票失败!", WC);
return FAIL;
}
else
{
// 登记本乘客至等候用户列表
strcpy(train_info_pt->waiter[train_info_pt->total_waiters],
op_psngr_pt->passenger_id);
train_info_pt->total_waiters++;
// 将候票操作保存至文件
if (!(save_train_info(train_info_pt, train_info_pt->master)))
{
message(ERROR, "排队时更新文件失败!", NULL);
message(WARN, "未能成功排队候票!", W);
}
}
}
else
{
message(INFO, "您已放弃订票操作!", WC);
return FAIL;
}
}
confirm_check:
{
booked_car_order = ok_car_order + 1; // 生成面向用户的车厢号
// 确认乘客的订票行为
printf("【提示】将要预订 %s 次列车的 %s 第趟列车的第 %d 号(软卧)车厢的第 %d 号座位,您确认吗(Y/N)?", train_info_pt->master, train_info_pt->time_id,
booked_car_order, t_seat_order);
ch == get_choice("yn");
if ('n' == ch)
{
message(INFO, "您已放弃订票操作!", WC);
return FAIL;
}
else if ('y' != ch)
{
goto confirm_check;
}
else
{
get_distance(&t_distance, &train_info_pt->station_links,
t_begin_order, t_end_order); //计算路程
pay_bill(&this_cost, system_info_pt->price_sbed_per_km, t_distance);
// 取得票价 this_cost
}
}
// 查找用户是否已在该趟车上订过票
booked_info_head = &op_psngr_pt->booked_links;
while (booked_info_head->next)
{
booked_info_pt = booked_info_head->next;
car_amount++; // 可直接用作 offset值
// 如果用户曾在此趟车上订过票
if ((!(strcmp(train_info_pt->master, booked_info_pt->booked_train_sq_id))) &&
(!(strcmp(train_info_pt->time_id, booked_info_pt->booked_train_time_id))))
{
booked_state = 1;
}
}
if (booked_state) // 如果用户曾在此趟车上订过票
{
for (i = 0; i < MAX_BOOK_PER_PSNGR; i++) // 查找是否还未达到订票的最大数目
{
if (!booked_info_pt->soft_bed_sq[ok_car_order][i])
{
booked_info_pt->soft_bed_sq[ok_car_order][i] = t_seat_order;
}
}
if (MAX_BOOK_PER_PSNGR == i) // 已达到订票的最大数目
{
message(ERROR, "您单独在这趟车上订票数已达到最大数目,不能再订了!", WC);
return FAIL;
}
strcpy(booked_info_pt->soft_bed_st[booked_info_pt->soft_bed], t_begin_station);
strcat(booked_info_pt->soft_bed_st[booked_info_pt->soft_bed], "#");
strcat(booked_info_pt->soft_bed_st[booked_info_pt->soft_bed], t_end_station);
booked_info_pt->soft_bed++;
save_booked_info(booked_info_pt, op_psngr_pt->passenger_id);
}
else // 如果用户没有在此趟车上订过票
{
if (!(booked_info_pt = (booked_info *)malloc(sizeof(booked_info))))
{
message(ERROR, "用户订票创建订票信息时申请内存失败!", NULL);
message(WARN, "预订软卧车票失败!", WC);
return FAIL;
}
// 创建新的列车-用户订票信息
strcpy(booked_info_pt->booked_train_sq_id, train_info_pt->master);
strcpy(booked_info_pt->booked_train_time_id, train_info_pt->time_id);
for (i = 0; i < SOFT_BED_CAR; i++) // 软卧订票历史记录清零
{
for (j = 0; j < SOFT_BED_CAR; j++)
{
booked_info_pt->soft_bed_sq[i][j] = 0;
}
}
for (i = 0; i < HARD_BED_CAR; i++) // 硬卧订票历史记录清零
{
for (j = 0; j < MAX_BOOK_PER_PSNGR; j++)
{
booked_info_pt->soft_bed_sq[i][j] = 0;
}
}
for (i = 0; i < HARD_SEAT_CAR; i++) // 硬座订票历史记录清零
{
for (j = 0; j < MAX_BOOK_PER_PSNGR; j++)
{
booked_info_pt->soft_bed_sq[i][j] = 0;
}
}
booked_info_pt->hard_bed = 0;
booked_info_pt->hard_seat = 0;
strcpy(booked_info_pt->master, op_psngr_pt->passenger_id);
booked_info_pt->offset = car_amount; // 见前文
booked_info_pt->soft_bed = 0;
booked_info_pt->soft_bed_sq[ok_car_order][booked_info_pt->soft_bed] = t_seat_order;
booked_info_pt->next = NULL;
strcpy(booked_info_pt->soft_bed_st[booked_info_pt->soft_bed], t_begin_station);
strcat(booked_info_pt->soft_bed_st[booked_info_pt->soft_bed], "#");
strcat(booked_info_pt->soft_bed_st[booked_info_pt->soft_bed], t_end_station);
booked_info_pt->soft_bed++;
// 即时更新系统信息并保存在文件
booked_info_head->next = booked_info_pt;
if (!(save_booked_info(booked_info_pt, op_psngr_pt->passenger_id)))
{
message(ERROR, "执行乘客订票操作时更新文件失败!", NULL);
message(WARN, "预订软卧车票失败!", WC);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -