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

📄 train_booking_bookop.c

📁 火车定标系统...用VC编译通过的
💻 C
📖 第 1 页 / 共 2 页
字号:

			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 + -