?? train_booking_bookop.c
字號(hào):
// train_booking_bookop.c -- 包含用戶票務(wù)操作函數(shù)
//
/////////////////////////////////////////////////////////////////////////////
#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"
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// 函數(shù)功能: 用戶軟臥票訂票事務(wù)處理
//
// 函數(shù)參數(shù): op_psngr_pt:操作用戶信息結(jié)構(gòu)體指針
// system_info_pt:系統(tǒng)信息結(jié)構(gòu)體指針
// train_info_pt:訂票列車信息結(jié)構(gòu)體指針
//
// 函數(shù)說明: 1、車次、時(shí)間信息輸入在此函數(shù)外完成,站點(diǎn)信息輸入在此函數(shù)內(nèi)完成
// 2、在使用此函數(shù)之前,應(yīng)已找到對(duì)應(yīng)列車及車次數(shù)據(jù),本程序?qū)⒁来?// 搜索該列車的所有要求類型的車廂,直到找到座位
//
/////////////////////////////////////////////////////////////////////////////
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("預(yù)訂軟臥車票");
// 取得訂票的起點(diǎn)
printf("第一步:確定始發(fā)站(當(dāng)前站為 %s 站,回車直接確認(rèn))\n",
system_info_pt->location);
if (!(get_str("始發(fā)站", t_begin_station, MIN_STATION_ID_LEN, MAX_STATION_ID_LEN)))
{
message(INFO, "將當(dāng)前站點(diǎn)設(shè)置為始發(fā)站!", NULL);
printf("【信息】您輸入的始發(fā)站為 %s 站!\n", system_info_pt->location);
WAIT;
}
// 取得訂票的終點(diǎn)
printf("第二步:確定終點(diǎn)站\n");
if (!(get_str("終點(diǎn)站", t_end_station, MIN_STATION_ID_LEN, MAX_STATION_ID_LEN)))
{
message(WARN, "預(yù)訂軟臥車票失??!", WC);
return FAIL;
}
// 根據(jù)始、終點(diǎn)確定列車行程區(qū)間的開始、結(jié)束序號(hào)
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, "正在執(zhí)行訂票操作,請(qǐng)稍候...", NULL);
// 依次檢測(cè)每個(gè)軟臥車廂是否還有空位
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)) // 查找到合適的車廂號(hào)
{
ok_car_order = i;
printf("【信息】在第%d個(gè)軟臥車廂發(fā)現(xiàn)合適座位!", i + 1);
printf("【信息】該車廂在列車內(nèi)編號(hào)為 %d !\n", ok_car_order + 1);
message(INFO, "恭喜恭喜", W);
}
}
if (i == SOFT_BED_CAR - 1) // 如果沒有找到合適的車廂
{
message(WARN, "抱歉!本趟列車已經(jīng)沒有你需要的票了。", NULL);
message(TIP, "告訴你一個(gè)好消息,本車站提供系統(tǒng)通知功能。", NULL);
message(TIP, "如果你選擇排隊(duì)等票,那么你的運(yùn)氣夠好的情況下,", NULL);
message(TIP, "如果有人退了符合您的要求的票,系統(tǒng)將會(huì)以消息形", NULL);
message(TIP, "式通知你,以便你能夠得以訂票。", NULL);
message(TIP, "需要排隊(duì),請(qǐng)按Y鍵,按其他任意鍵返回。", W);
ch = getch();
if ('y' == ch) // 如果用戶要求通知
{
// 如果排隊(duì)等候人滿則拒絕請(qǐng)求
if (train_info_pt->total_waiters == MAX_NOTIFY_AMOUNT)
{
message(INFO, "實(shí)在不好意思,排隊(duì)的人太多了,您還是換訂另一趟車的票吧,謝謝合作!", NULL);
message(WARN, "預(yù)訂軟臥車票失??!", 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, "排隊(duì)時(shí)更新文件失敗!", NULL);
message(WARN, "未能成功排隊(duì)候票!", W);
}
}
}
else
{
message(INFO, "您已放棄訂票操作!", WC);
return FAIL;
}
}
confirm_check:
{
booked_car_order = ok_car_order + 1; // 生成面向用戶的車廂號(hào)
// 確認(rèn)乘客的訂票行為
printf("【提示】將要預(yù)訂 %s 次列車的 %s 第趟列車的第 %d 號(hào)(軟臥)車廂的第 %d 號(hào)座位,您確認(rèn)嗎(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); //計(jì)算路程
pay_bill(&this_cost, system_info_pt->price_sbed_per_km, t_distance);
// 取得票價(jià) 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++) // 查找是否還未達(dá)到訂票的最大數(shù)目
{
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) // 已達(dá)到訂票的最大數(shù)目
{
message(ERROR, "您單獨(dú)在這趟車上訂票數(shù)已達(dá)到最大數(shù)目,不能再訂了!", 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, "用戶訂票創(chuàng)建訂票信息時(shí)申請(qǐng)內(nèi)存失敗!", NULL);
message(WARN, "預(yù)訂軟臥車票失?。?quot;, WC);
return FAIL;
}
// 創(chuàng)建新的列車-用戶訂票信息
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++;
// 即時(shí)更新系統(tǒng)信息并保存在文件
booked_info_head->next = booked_info_pt;
if (!(save_booked_info(booked_info_pt, op_psngr_pt->passenger_id)))
{
message(ERROR, "執(zhí)行乘客訂票操作時(shí)更新文件失??!", NULL);
message(WARN, "預(yù)訂軟臥車票失??!", WC);
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -