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

📄 train_booking_mgrop.c

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

	train_sq_info_head_reset = train_sq_info_head;		// 保存头结点指针以作后用
	
	actitle("添加新的列车信息");

check_sq_id:		// 取得车次编号并检测其有效性
	{
		message(TIP, "第一步:请输入该列车所属的车次编号:", NULL);
		if (!get_str(t_sq_id, "车次编号", 1, 8))		// 取得列车对应的车次名
		{
			message(ERROR, "添加新列车失败!", WC);

			return FAIL;
		}
		while (train_sq_info_head->next)	// 开始检测
		{
			if (!(strcmp(t_sq_id, train_sq_info_head->train_sq_id)))
			{
				printf("【信息】车次名(%s)已存在,即将为该车次添加新列车!\n", t_sq_id);
				WAIT;
				CLS;
				goto check_train_id;
			}
			train_sq_info_head = train_sq_info_head->next;
		}

		// 如果找不到对应车次
		printf("【错误】找不到您输入的(%s)车次!\n", t_sq_id);
		message(WARN, "添加列车失败,您需要重新确认车次名,或者添加此新车次名。", WC);

		return FAIL;
	}
	
check_train_id:
	{
		message(TIP, "第二步:请确认文件中的信息无误,输入列车信息文件名:", NULL);
		if (!get_str(filepath, "文件名", 1, 8))		// 取得信息文件名
		{
			message(ERROR, "列车信息文件输入失败!", NULL);
			message(WARN, "添加新列车失败!", WC);

			return FAIL;
		}

		// 检测输入文件的有效性
		if (!(fp = fopen(filepath, "rb")))
		{
			message(ERROR, "打开您输入的列车信息文件失败!", NULL);
			message(WARN, "请重新检查您的文件,并确保路径输入正确再试!", NULL);
			message(WARN, "添加新列车失败!", WC);

			return FAIL;
		}
	}
		
	message(INFO, "正在读取文件信息,请稍候...", NULL);

	if (!(train_info_pt = (train_info *)malloc(sizeof(train_info))))
	{
		message(ERROR, "申请内存出错!", NULL);
		message(WARN, "添加新列车失败!", WC);

		return FAIL;
	}

	strcpy(train_info_pt->master, t_sq_id);		// 赋予车次信息

	// 读取文件信息
	fscanf(fp, "%d %d %d", &train_info_pt->start_tm.tm_year,
						&train_info_pt->start_tm.tm_mon,
						&train_info_pt->start_tm.tm_mday);

	fscanf(fp, "%d %d", &train_info_pt->start_tm.tm_hour,
						&train_info_pt->start_tm.tm_min);

	train_info_pt->start_tm.tm_sec = 0;		// 补充完整信息

	// 校验输入的时间信息
	if ((train_info_pt->start_tm.tm_year > MAX_RUN_YEAR) ||
		(!(check_cal_time(&train_info_pt))))
	{
		message(ERROR, "从文件输入的时间信息有误!", NULL);
		message(WARN, "输入的时间必须在当前时间之后!", NULL);
		message(ERROR, "从文件加载列车信息失败!", WC);

		return FAIL;
	}

	// 取得列车的时间标识符
	get_train_time_id(train_info_pt->time_id, &train_info_pt->start_tm); 	
	
	// 创建资料夹及空文件
	prepare_train_dir(train_info_pt->master, train_info_pt->time_id);

	fscanf(fp, "%d", &train_info_pt->speed);
	fscanf(fp, "%d", &train_info_pt->total_station);

	if (train_info_pt->speed > MAX_TRAIN_SPEED)		// 校验速度
	{
		message(ERROR, "从文件输入的列车速度信息有误!", NULL);
		printf("【警告】列车的时速不得超过 %dkm/h !\n", MAX_TRAIN_SPEED);
		message(ERROR, "从文件加载列车信息失败!", WC);

		return FAIL;
	}

	// 取得该列车站点信息链表结点指针
	station_info_head = &train_info_pt->station_links;
		
	// 依次读入站点信息
	for (i = 0; i < train_info_pt->total_station; i++)
	{
		if (!(station_info_pt = (station_info *)malloc(sizeof(station_info))))
		{
			message(ERROR, "从文件加载列车的站点信息时申请内存出错!", NULL);
			message(WARN, "添加新列车失败!", WC);

			return FAIL;
		}
		fscanf(fp, "%s", station_info_pt->station_id);
		fscanf(fp, "%d", station_info_pt->distance);
		
		if (station_info_pt->distance < tmp)		// 校验路程信息
		{
			message(ERROR, "从文件输入的列车距始发站路程信息有误!", NULL);
			message(ERROR, "后一站的路程应该大于前一站的路程!", NULL);
			message(WARN, "从文件加载列车信息失败!", WC);

			return FAIL;
		}
		else
		{
			tmp = station_info_pt->distance;		// 记录临时路程以便下次比较
		}

		// 赋予时间标识符
		strcpy(station_info_pt->time_id, train_info_pt->time_id);

		strcpy(station_info_pt->master, t_sq_id);
		station_info_pt->station_order = i;			// 车站在路线中的次序,以0开始
		station_info_pt->offset = i;
		
		// 使用时间函数必需的初始化		
		station_info_pt->reach_time.tm_year = train_info_pt->start_tm.tm_year;
		station_info_pt->reach_time.tm_mon = train_info_pt->start_tm.tm_mon;
		station_info_pt->reach_time.tm_mday = train_info_pt->start_tm.tm_mday;
		station_info_pt->reach_time.tm_hour = train_info_pt->start_tm.tm_hour;
		station_info_pt->reach_time.tm_min = train_info_pt->start_tm.tm_min;
		station_info_pt->reach_time.tm_sec = train_info_pt->start_tm.tm_sec;

		// 计算得到列车抵达该站时的时间,若为始发站则为零值
		get_train_reach_time(&station_info_pt->reach_time, 
				&train_info_pt->start_tm, 
				station_info_pt->distance,
				train_info_pt->speed);			

		get_train_time_id(station_info_pt->time_id, 
				&train_info_pt->start_tm); 		// 赋予时间标识符

		// 以下步骤将把读取的站点信息链成双向链表
		station_info_head->next = station_info_pt;
		station_info_pt->pre = station_info_head;
		station_info_head = station_info_head->next;
		station_info_pt->next = NULL;

		// 立即将车站信息写入文件
		save_station_info(station_info_pt, t_sq_id, station_info_pt->time_id);

		// 注册列车的抵达时间
		if (i == train_info_pt->total_station - 1)
		{
			train_info_pt->finish_tm = station_info_pt->reach_time;
		}
			
		// 注册列车的始发站、终点站
		if (0 == i)
		{
			strcpy(train_info_pt->start, station_info_pt->station_id);
		}
		else if (i == train_info_pt->total_station - 1)
		{
			strcpy(train_info_pt->final, station_info_pt->station_id);
		}

		printf("【信息】加载第%d个车厢信息成功!", i+1);

	}		

	// 创建列车的系统默认配置
	train_info_pt->locked = 0;
	train_info_pt->expired = 0;
	train_info_pt->total_passengers = 0;
	train_info_pt->total_waiters = 0;
	train_info_pt->train_income = 0;
	strcpy(train_info_pt->master, t_sq_id);

	// 向系统注册此新加的列车信息
	if (!register_train_info(train_sq_info_head, t_sq_id, train_info_pt->time_id))
	{
		message(ERROR, "注册新列车失败!", WC);

		return FAIL;
	}

	// 为此新列车准备资料夹和空文件
	prepare_train_dir(t_sq_id, train_info_pt->time_id);

	// 初始化所有软卧车厢的座位信息
	for (i = 0; i < SOFT_BED_CAR; i++)
	{
		for (j =0; j < DOT_PER_SB_CAR; j++)
		{
			for (k = 0; k < train_info_pt->total_station; k++)
			{
				train_info_pt->sbed_info_list[i].info[j][k] = 0;
			}
		}
		train_info_pt->sbed_info_list[i].car_order = i;		// 车厢次序从0开始计数
		train_info_pt->sbed_info_list[i].offset = i;
		strcpy(train_info_pt->sbed_info_list[i].master, t_sq_id);
		strcpy(train_info_pt->sbed_info_list[i].time_id, train_info_pt->time_id);
	}

	// 初始化所有硬卧车厢的座位信息
	for (i = 0; i < HARD_BED_CAR; i++)
	{
		for (j =0; j < DOT_PER_HB_CAR; j++)
		{
			for (k = 0; k < train_info_pt->total_station; k++)
			{
				train_info_pt->hbed_info_list[i].info[j][k] = 0;
			}
		}
		train_info_pt->hbed_info_list[i].car_order = i;		// 车厢次序从0开始计数
		train_info_pt->hbed_info_list[i].offset = i;
		strcpy(train_info_pt->hbed_info_list[i].master, t_sq_id);
		strcpy(train_info_pt->hbed_info_list[i].time_id, train_info_pt->time_id);
	}

	// 初始化所有硬座车厢的座位信息
	for (i = 0; i < HARD_SEAT_CAR; i++)
	{
		for (j =0; j < DOT_PER_HS_CAR; j++)
		{
			for (k = 0; k < train_info_pt->total_station; k++)
			{
				train_info_pt->hseat_info_list[i].info[j][k] = 0;
			}
		}
		train_info_pt->hseat_info_list[i].car_order = i;		// 车厢次序从0开始计数
		train_info_pt->hseat_info_list[i].offset = i;
		strcpy(train_info_pt->hseat_info_list[i].master, t_sq_id);
		strcpy(train_info_pt->hseat_info_list[i].time_id, train_info_pt->time_id);
	}
	
	// 将生成的新列车资料写入文件
	save_sbed_info_list(&train_info_pt->sbed_info_list, t_sq_id, 
		train_info_pt->time_id, SOFT_BED_CAR);		// 软卧信息
	save_hbed_info_list(&train_info_pt->hbed_info_list, t_sq_id,
		train_info_pt->time_id, HARD_BED_CAR);		// 硬卧信息
	save_hseat_info_list(&train_info_pt->hbed_info_list, t_sq_id,
		train_info_pt->time_id, HARD_SEAT_CAR);		// 硬座信息
	save_train_info(train_info_pt, t_sq_id);		// 列车信息

	// 将刚创建的列车信息立即链上该车次的列车的链表尾
	while (train_sq_info_head_reset->next)
	{
		train_sq_info_head_reset = train_sq_info_head_reset->next;
	}
	train_sq_info_head_reset->next = train_info_pt;

	free(station_info_pt);		// 释放无效内存

	printf("【信息】添加属于%s次列车,时间标识为%s的新列车成功!\n", 
		t_sq_id, train_info_pt->time_id);
	message(INFO, "可喜可贺!您的乘客又有新车坐了!", WC);

	return OK;
}

					
/////////////////////////////////////////////////////////////////////////////
// 函数功能:	为新列车准备资料夹和空文件
// 
// 函数参数:	sq_id:列车所属车次编号
//				time_id:列车的时间标识符
//
/////////////////////////////////////////////////////////////////////////////	
status prepare_train_dir(char *sq_id, char *time_id)
{
	build_iii_dir(TRAIN_INFO_DIR, sq_id, time_id, NULL);	// 创建文件夹

	// 创建必需的空文件
	build_iii_dir(TRAIN_INFO_DIR, sq_id, time_id, TRAIN_INFO_FILE);
	build_iii_dir(TRAIN_INFO_DIR, sq_id, time_id, STATION_INFO_FILE);
	build_iii_dir(TRAIN_INFO_DIR, sq_id, time_id, SB_INFO_FILE);
	build_iii_dir(TRAIN_INFO_DIR, sq_id, time_id, HB_INFO_FILE);
	build_iii_dir(TRAIN_INFO_DIR, sq_id, time_id, HS_INFO_FILE);

	return OK;
}

	
/////////////////////////////////////////////////////////////////////////////
// 函数功能:	向车次系统注册新列车索引信息
// 
// 函数参数:	train_sq_info_pt:与该趟列车有关的车次的结构体的指针
//				sq_id:列车所属车次编号
//				time_id:列车的时间标识符
//
/////////////////////////////////////////////////////////////////////////////	
status register_train_info(train_sq_info *train_sq_info_pt, 
						   char *sq_id, char *time_id)
{
	int count = 0;
	char filepath[64];
	train_item *train_item_pt;
	
	// 创建并保存新的列车标识结点索引信息
	if (!(train_item_pt = (train_item *)malloc(sizeof(train_item))))
	{
		message(ERROR, "向车次系统注册新列车信息时申请内存失败!", NULL);
		message(WARN, "向车次系统注册新列车信息失败!", WC);

		return FAIL;
	}
	strcpy(train_item_pt->master, sq_id);
	strcpy(train_item_pt->train_time_id, time_id);
	train_item_pt->offset = train_sq_info_pt->running_amount;	// 偏移从0算起
	if (!(save_train_item_info(train_item_pt, sq_id)))
	{
		message(ERROR, "向车次系统注册新列车信息时写入列车标识信息文件失败!", WC);

		return FAIL;
	}

	// 更新并保存车次信息
	train_sq_info_pt->running_amount_valid++;
	train_sq_info_pt->running_amount++;
	// 注意:在此没有更新train_sq_info_head指向结构体中的train_item_list信息,是因
	// 为在此之前新列车链表已链上该车次的列车链表尾,而train_item_list正是用来实现
	// 此目的,所以不用更新他。下次再加载文件时,由于新的train_item已存入文件,同样
	// 可以通过新加载的train_item来读出所有的train_info_list。
	if (!(save_train_sq_info(train_sq_info_pt)))
	{
		message(ERROR, "向车次系统注册新列车信息时写入车次信息文件失败!", WC);

		return FAIL;
	}

	return OK;
}


/////////////////////////////////////////////////////////////////////////////
// 函数功能:	设置根据车次信息生成列车信息中的间隔天数
//
// 函数参数:	train_sq_info_pt:车次信息结构体指针
//
/////////////////////////////////////////////////////////////////////////////
status set_train_sq_days_per_train(train_sq_info *train_sq_pt)
{
	actitle("设置同车次运营列车间隔天数");

	printf("【提示】同车次运营列车间隔天数为 %d\n", train_sq_pt->days_per_train);

	if (!get_int(&train_sq_pt->days_per_train, "新的同车次运营列车间隔天数"))
	{
		CLS;

		return FAIL;
	}

	if (save_train_sq_info(train_sq_pt))
	{
		message(INFO, "成功修改同车次运营列车间隔天数!", W);
	}
	else
	{
		message(ERROR, "修改同车次运营列车间隔天数失败!", W);

		return FAIL;
	}

	return OK;
}

/////////////////////////////////////////////////////////////////////////////
// 函数功能:	向订票系统注册新注册乘客索引信息
//
// 函数参数:	system_info_pt:系统信息结构体指针
//				psngr_id:乘客名称
//				admin_in:是否为管理员,1是0否
//
/////////////////////////////////////////////////////////////////////////////
status register_psngr_info(system_info *system_info_pt, char *psngr_id, char admin_in)
{
	user_item *user_item_pt;

	// 创建并保存新注册乘客索引信息
	if (!(user_item_pt = (user_item *)malloc(sizeof(user_item))))
	{
		message(ERROR, "向车次系统注册乘客索引信息时申请内存失败!", NULL);
		message(WARN, "向车次系统注册乘客索引信息失败!", WC);

		return FAIL;
	}

	strcpy(user_item_pt->master, system_info_pt->location);
	strcpy(user_item_pt->psngr, psngr_id);
	user_item_pt->offset = system_info_pt->psngr_amount;	// 偏移从0算起

#ifdef _DEBUG_
	printf("system_info_pt->psngr_amount = %d\n", system_info_pt->psngr_amount);
	WAIT;
#endif

	user_item_pt->next = NULL;
	user_item_pt->offset = 0;
	if (!(save_user_item_info(user_item_pt, psngr_id)))
	{
		message(ERROR, "向车次系统注册新乘客索引信息时写入乘客索引信息文件失败!", WC);

		return FAIL;
	}

	// 更新并保存乘客索引信息
	system_info_pt->psngr_amount++;
	if (admin_in)
	{
		system_info_pt->admin_amount++;
	}
	
	if (!(save_system_info(system_info_pt)))
	{
		message(ERROR, "向车次系统注册新乘客信息时写入系统信息文件失败!", WC);

		return FAIL;
	}

	free(user_item_pt);		// 释放内存

	message(INFO, "新乘客索引信息保存成功。您必须重新登录订票系统才能以该用户身份登录。", W);

	return OK;
}

/////////////////////////////////////////////////////////////////////////////
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -