📄 train_booking_main.c
字号:
// train_booking_main.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"
#define _DEBUG_
/////////////////////////////////////////////////////////////////////////////
int main(void)
{
system_info this_system_info; // 系统信息数据缓冲区
passenger_info this_psngr_info; // 用户数据缓冲区
passenger_info psngr_links; // 用户数据链表
train_info ok_train_info_list; // 列车数据链头结点缓冲区
train_sq_info *train_sq_pt; // 车次信息体指针
train_info target_train_buffer; // 订退票目标列车数据缓冲区
train_info *target_train_pt; // 订退票目标列车数据缓冲区指针
train_sq_info target_sq_info; // 操作列车的车次数据缓冲区
char choice;
int sq_empty, mgr;
int i;
// 主菜单
char main_menu[][MAX_MENU_LEN] = {
"公共查询系统",
"车站管理员登录",
"注册新乘客信息",
"老乘客登录系统",
"退出订票系统"};
// 管理员菜单
char admin_menu[][MAX_MENU_LEN] = {
"报表生成工具",
"配置乘客信息",
"配置系统信息",
"车次数据管理",
"列车数据管理",
"个人信息管理",
"注册新管理员",
"退出管理登录"};
// 报表工具菜单
char admin_report_menu[][MAX_MENU_LEN] = {
"系统信息报表",
"车次信息报表",
"列车信息报表",
"财务收支报表",
"退出报表工具菜单"};
// 配置乘客信息菜单
char admin_set_psngr_menu[][MAX_MENU_LEN] = {
"注销乘客帐户",
"更改乘客类型",
"退出配置乘客菜单"};
// 配置系统信息菜单
char admin_set_system_menu[][MAX_MENU_LEN] = {
"开放/关闭订票系统",
"重命名本地车站",
"设置每公里软卧标准票价",
"设置每公里硬卧标准票价",
"设置每公里硬座标准票价",
"设置乘客退票打折率",
"设置特殊乘客购票打折率",
"退出配置系统菜单"};
// 车次数据管理菜单
char admin_sq_menu[][MAX_MENU_LEN] = {
"添加新的车次",
"编辑车次信息",
"删除作废车次",
"退出车次管理菜单"};
// 列车数据管理菜单
char admin_train_menu[][MAX_MENU_LEN] = {
"添加新的列车",
"编辑列车信息",
"删除作废列车"
"退出列车管理菜单"};
// 普通乘客菜单
char psngr_menu[][MAX_MENU_LEN] = {
"预订软卧车票",
"预订硬卧车票",
"预订硬座车票",
"退订软卧车票",
"退订硬卧车票",
"退订硬座车票",
"查看订票历史",
"查看系统消息",
"个人信息管理",
"退出乘客登录"};
// 公共查询菜单
char search_menu[][MAX_MENU_LEN] = {
"按车次名查询车次",
"按始发站查询车次",
"按终点站查询车次",
"按过路站查询车次",
"按车次名查询列车",
"退出查询系统"};
// 个人设置菜单
char personal_set_menu[][MAX_MENU_LEN] = {
"更改个人密码",
"退出个人设置菜单"};
////////////////////////////////////////////////////////////////////////////
message(INFO, "正在初始化订票系统信息...", NULL);
// 检测系统资料夹及处理
if (!check_system_data())
{
message(WARN, "系统文件损毁或不完整,原来的车站数据将不可用!", NULL);
message(TIP, "您可以将手中的一套数据复制到程序同一目录下即可正常使用!", NULL);
message(INFO, "按任意键重建系统运行支持文件!", W);
message(INFO, "正在创建系统资料夹...", NULL);
if (!(prepare_system_dir()))
{
message(ERROR, "系统运行故障,意外终止!", WC);
return 1;
}
message(INFO, "系统资料夹创建完成。", NULL);
}
// 加载系统配置信息,若没有则创建默认配置
if (!(load_system_settings(&this_system_info)))
{
message(INFO, "正在创建系统支持文件...", NULL);
if (!(prepare_system_file()))
{
message(ERROR, "系统运行故障,意外终止!", WC);
return 1;
}
message(INFO, "系统支持文件创建完成。", W);
message(INFO, "正在创建系统默认配置信息...", NULL);
if (!(create_default_system_settings(&this_system_info))) // 创建默认系统配置
{
message(ERROR, "系统运行故障,意外终止!", WC);
return 1;
}
#ifdef _DEBUG_
show_system_info(&this_system_info);
#endif
message(INFO, "系统默认配置信息创建完成。", NULL);
message(INFO, "正在创建默认管理员信息...", NULL);
if (!(create_default_admin_info(&this_psngr_info, &this_system_info))) // 创建默认管理员
{
message(ERROR, "系统运行故障,意外终止!", WC);
return 1;
}
message(INFO, "创建默认管理员信息完成。", NULL);
}
// 加载所有的车次信息
message(INFO, "正在加载车次信息...", NULL);
if (!(load_train_sq_info_list(&this_system_info.train_sq_list, this_system_info.location,
this_system_info.total_train_sq)))
{
message(ERROR, "系统运行故障,意外终止!", WC);
return 1;
}
message(INFO, "车次信息加载完成。", NULL);
message(INFO, "正在为每个车次加载其所有的列车信息...", NULL);
if (this_system_info.train_sq_list.next) // 如果车站中已有车次信息
{
train_sq_pt = this_system_info.train_sq_list.next; // 跳过头结点
sq_empty = 0;
}
else
{
message(WARN, "本车站还没有车次信息,暂时不能订票!", NULL);
message(TIP, "本车站暂时只开放乘客注册功能。", W);
sq_empty = 1;
}
// 加载每个车次的所有列车信息
for (i = 0; i < this_system_info.total_train_sq; i++)
{
// 首先取得每个车次的所有列车的时间标识符
if (!(load_train_item_list(&train_sq_pt->train_item_list,
train_sq_pt->train_sq_id, train_sq_pt->running_amount)))
{
message(ERROR, "系统运行故障,意外终止!", WC);
return 1;
}
// 根据标识符加载对应的列车信息(包含站点信息、座位信息)
load_train_info_list(&train_sq_pt->train_list, train_sq_pt->train_sq_id,
&train_sq_pt->train_item_list, train_sq_pt->running_amount);
train_sq_pt = train_sq_pt->next;
}
message(INFO, "加载所有列车信息完成。", NULL);
// 加载用户信息数据
message(INFO, "正在加载注册乘客数据...", NULL);
load_psngr_item_list(&this_system_info.psngr_item_list, this_system_info.location,
this_system_info.psngr_amount); // 加载索引信息
load_psngr_info_list(&psngr_links, this_system_info.location, &this_system_info.psngr_item_list,
this_system_info.psngr_amount);
#ifdef _DEBUG_
show_psngr_info_list(&psngr_links);
#endif
message(INFO, "注册乘客数据加载成功。", NULL);
message(INFO, "初始化订票系统信息完成,按任意键进入主菜单。", WC);
////////////////////////////////////////////////////////////////////////////
main_menu: // 主菜单
{
CLS;
choice = text_menu(main_menu, "", 0, 4);
switch (choice)
{
case '1': // 公共查询系统
goto search_menu;
break;
case '2': // 管理员登录
if (psngr_login(&psngr_links, &this_psngr_info, this_system_info.location, 1))
{
printf("【信息】管理员(%s)已成功登录管理系统!\n", this_psngr_info.passenger_id);
message(INFO, "恭喜恭喜!", W);
mgr = 1; // 设置登录标记
goto admin_menu;
}
else
{
message(ERROR, "您输入的信息有误,登录管理系统失败!", NULL);
message(TIP, "按任意键返回主菜单。", WC);
goto main_menu;
}
break;
case '3': // 新乘客注册
if (psngr_reg(&this_psngr_info, &this_system_info, this_system_info.location, 0))
{
message(INFO, "恭喜!新乘客注册成功!您以后可以凭此身份执行订票操作。", WC);
goto main_menu;
}
else
{
message(ERROR, "注册新乘客的过程中意外出错,注册失败!", WC);
goto main_menu;
}
break;
case '4': // 老乘客登录
if (psngr_login(&this_psngr_info, &psngr_links, this_system_info.location, 0))
{
printf("【信息】乘客(%s)已成功登录订票系统。", this_psngr_info.passenger_id);
message(TIP, "按任意键进入主菜单。", WC);
mgr = 0; // 设置登录标记
goto psngr_menu;
}
else
{
message(ERROR, "输入信息有误,登录订票系统失败!", NULL);
message(TIP, "按任意键返回主菜单。", WC);
goto main_menu;
}
break;
case '5': // 退出订票系统
CLS;
message(WARN, "真的要退出订票系统吗(Y/N)?", NULL);
choice = getch();
if (('y' == choice) || ('Y' == choice))
{
message(INFO, "正在退出订票系统...", NULL);
save_system_info(&this_system_info); // 文件保存
free_passenger_info_list(&psngr_links);
free_train_sq_info_list(&this_system_info.train_sq_list); // 内存清理
message(INFO, "已成功退出订票系统。", NULL);
message(INFO, "谢谢您的使用。", WC);
return 0;
}
break;
default:
goto main_menu;
}
}
////////////////////////////////////////////////////////////////////////////
admin_menu: // 管理员菜单
{
CLS;
choice = text_menu(admin_menu, "", 0, 7);
switch (choice)
{
case '1': // 报表生成工具
goto admin_report_menu;
break;
case '2': // 配置乘客信息
goto admin_set_psngr_menu;
break;
case '3': // 配置系统信息
goto admin_set_system_menu;
break;
case '4': // 车次数据管理
goto admin_sq_menu;
break;
case '5': // 列车数据管理
goto admin_train_menu;
break;
case '6': // 个人信息管理
goto personal_set_menu;
break;
case '7': // 注册新管理员
if (psngr_reg(&this_psngr_info, &this_system_info, this_system_info.location, 1))
{
message(INFO, "新的管理员注册成功!按任意键返回主菜单。", WC);
goto main_menu;
}
else
{
message(ERROR, "注册新的管理员失败!按任意键返回主菜单。", WC);
goto main_menu;
}
break;
case '8': // 退出管理登录
message(TIP, "您真的要退出管理菜单吗(Y/N)?", NULL);
choice = getch();
if (('y' == choice) || ('Y' == choice))
{
if (psngr_logout(&this_psngr_info))
{
message(INFO, "您已成功退出管理系统", W);
mgr = 0; // 设置登录标记
goto main_menu;
}
else
{
message(ERROR, "管理员退出系统过程中出错,您可能会丢失数据!", W);
goto main_menu;
}
}
break;
default:
goto admin_menu;
}
}
////////////////////////////////////////////////////////////////////////////
admin_train_menu: // 列车数据管理菜单
{
CLS;
choice = text_menu(admin_train_menu, "", 0, 3);
switch (choice)
{
case '1': // 添加新的列车
if (train_add_file(&this_system_info.train_sq_list))
{
message(INFO, "添加新车次成功。", WC);
goto admin_sq_menu;
}
else
{
message(WARN, "添加新车次过程中发生异常,添加失败!", WC);
goto admin_sq_menu;
}
case '2': // 编辑列车信息
message(INFO, "功能尚在开发中。", WC);
break;
case '3': // 删除作废列车
message(INFO, "功能尚在开发中。", WC);
break;
case '4': // 退出列车管理菜单
CLS;
message(WARN, "真的要退出列车管理菜单吗(Y/N)?", NULL);
choice = getch();
if (('y' == choice) || ('Y' == choice))
{
goto admin_menu;
}
else
{
goto admin_train_menu;
}
break;
}
}
////////////////////////////////////////////////////////////////////////////
admin_sq_menu: // 车次数据管理
{
CLS;
choice = text_menu(admin_sq_menu, "", 0, 3);
switch (choice)
{
case '1': // 添加新的车次
if (train_sq_add(&this_system_info))
{
message(INFO, "添加新车次成功。", WC);
goto admin_sq_menu;
}
else
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -