📄 train_booking_mgrop.c
字号:
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 + -