📄 train_booking_bookop.c
字号:
return FAIL;
}
}
// 仍有有效座位,执行订票操作
deal_sb_seat(&train_info_pt->sbed_info_list[i], ok_car_order, t_seat_order,
t_begin_order, t_end_order, 1); // 1为订票
// 上面的函数不包括文件保存功能,需要自己更新文件
if (!(save_sbed_info_list(&train_info_pt->sbed_info_list, train_info_pt->master,
train_info_pt->time_id, SOFT_BED_CAR)))
{
message(ERROR, "执行乘客订票操作时更新文件失败!", NULL);
message(WARN, "预订软卧车票失败!", WC);
return FAIL;
}
// 回馈用户信息
message(INFO, "您已成功订票了!恭喜恭喜!", NULL);
message(INFO, "下面是您这次操作的订票信息,请确认。", NULL);
printf("【信息】%s 车次 %d 趟车 %d 号(软卧)车厢 %d 号座位",
train_info_pt->master, train_info_pt->time_id,
booked_car_order, t_seat_order);
message(INFO, "信息已添加至您的订票清单(历史记录)中。按任意键返回。", WC);
return OK;
}
/////////////////////////////////////////////////////////////////////////////
// 函数功能: 查找用于执行订/退票操作的目标列车信息
//
// 函数参数: target_train_pt:用于返回指向目标列车信息单元的指针变量(不能用地址!)
// system_info_pt:系统信息单元指针
//
/////////////////////////////////////////////////////////////////////////////
status search_target_train(train_info *target_train_pt, system_info *system_info_pt)
{
train_sq_info *train_sq_info_head;
train_info *train_info_head;
char t_re_sq[64], t_re_time_id[64];
int state;
train_sq_info_head = &system_info_pt->train_sq_list; // 取得头结点指针
// 取得退票车次
printf("第一步:确定要退票的列车车次\n");
if (!(get_str("要退票的列车车次", t_re_sq, MIN_TRING_ID_LEN, MAX_TRAIN_ID_LEN)))
{
message(ERROR, "输入退票车次失败!", NULL);
message(WARN, "退订软卧车票失败!", WC);
return OK;
}
// 取得退票列车时间标识
printf("第二步:确定要退票的列车时间标识\n");
message(TIP, "时间标识格式如下:如果是2006年9月12号的列车,则输入 20060912", NULL);
message(TIP, "注意数字小于10时补一个0在前面", W);
if (!(get_str("要退票的列车时间标识", t_re_time_id, 8, 8)))
{
message(ERROR, "输入退票列车时间标识失败!", NULL);
message(WARN, "退订软卧车票失败!", WC);
return OK;
}
// 在内存中搜索列车信息
state = 0;
while (train_sq_info_head->next)
{
train_sq_info_head = train_sq_info_head->next;
if (!(strcmp(train_sq_info_head->train_sq_id, t_re_sq)))
{
train_info_head = &train_sq_info_head->train_list; // 取得列车信息头结点指针
state = 1;
break;
}
}
// 如果没有找到对应车次
if (!state)
{
printf("【警告】没有找到任何有关于车次(%s)的信息!请确认是否输入错误,再重试。\n", t_re_sq);
WAIT;
CLS;
return FAIL;
}
// 在车次链上根据时间标识查找列车信息
state = 0;
while (train_info_head->next)
{
train_info_head = train_info_head->next;
if (!(strcmp(train_info_head->time_id, t_re_time_id)))
{
target_train_pt = train_info_head;
state = 1;
break;
}
}
// 如果没有找到对应列车
if (!state)
{
printf("【警告】没有找到任何有关于列车(%s)的信息!请确认是否输入错误,再重试。\n", t_re_time_id);
WAIT;
CLS;
return FAIL;
}
return OK;
}
/////////////////////////////////////////////////////////////////////////////
// 函数功能: 用户软卧票退票事务处理
//
// 函数参数: op_psngr_pt:操作用户信息结构体指针
// system_info_pt:系统信息结构体指针
// train_info_pt:要退票的列车信息结构体指针
//
// 函数说明: 1、这里train_info_pt只是便于修改某些参数用,并不提供退票的信息
// 2、在使用此函数之前,应已找到对应列车及车次数据,本程序将依次
// 搜索该列车的所有要求类型的车厢,直到找到座位
//
/////////////////////////////////////////////////////////////////////////////
status re_sb_ticket(passenger_info *op_psngr_pt, system_info *system_info_pt,
train_info *train_info_pt)
{
int t_begin_order, t_end_order, t_car_order, t_seat_order;
char t_re_book_station_id[64];
int re_car_order, re_seat_order;
char t_begin_station[64], t_end_station[64];
char t_re_sq[64], t_re_time_id[64];
int this_cost, t_distance;
CLS;
if (0 == op_psngr_pt->total_booked_tickets)
{
message(ERROR, "您还没有在此列车上订过车票,不能退订!", WC);
return FAIL;
}
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;
}
// 取得车票的车厢号(面向用户式输入)
printf("第三步:确定要退票的车票的车厢号\n");
if (!(get_int("要退票的车票的车厢号", &t_car_order, 1, DOT_PER_SB_CAR)))
{
message(WARN, "退订软卧车票失败!", WC);
return FAIL;
}
// 取得车票的座位号
printf("第四步:确定要退票的车票的座位号\n");
if (!(get_int("要退票的车票的座位号", &t_seat_order, 1, DOT_PER_SB_CAR)))
{
message(WARN, "退订软卧车票失败!", WC);
return FAIL;
}
message(INFO, "正在执行退票操作,请稍候...", NULL);
// 取得站点在信息链中的区间序号
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;
}
// 检测用户提供退票信息的真实性:参数为面向用户的车厢号,内部自动转换处理
if (!(check_hs_booked_ii(op_psngr_pt, t_re_sq, t_re_time_id, t_car_order, t_seat_order)))
{
message(ERROR, "您提供的退票信息有误!请重试!", NULL);
message(WARN, "抱歉!退票失败!", WC);
return FAIL;
}
// 取得钱款
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);
//车厢订票信息矩阵的更新
deal_sb_seat(&train_info_pt->sbed_info_list, t_car_order, t_seat_order,
t_begin_order, t_end_order, 0);
// 处理个人信息
op_psngr_pt->total_booked_tickets--;
op_psngr_pt->total_cost -= this_cost;
// 处理系统信息
system_info_pt->total_sold--;
system_info_pt->total_income -= this_cost;
if (!op_psngr_pt->total_cost) // 如果用户把票退光
{
train_info_pt->total_passengers--;
}
// 通知其它用户退票消息
// 返还用户钱款
// 回馈用户信息
message(INFO, "您已成功退票了!恭喜恭喜!", NULL);
message(INFO, "下面是您这次操作的退票信息,请确认。", NULL);
printf("【信息】%s 车次 %d 趟车 %d 号(软卧)车厢 %d 号座位",
train_info_pt->master, train_info_pt->time_id,
re_car_order, t_seat_order);
message(INFO, "信息从您的订票清单(历史记录)中销毁。按任意键返回。", WC);
return OK;
}
/////////////////////////////////////////////////////////////////////////////
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -