⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 train_booking_bookop.c

📁 火车定标系统...用VC编译通过的
💻 C
📖 第 1 页 / 共 2 页
字号:
//	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 + -