一、项目描述
编制一个程序,火车售票系统包括用户及管理部分,能实现录票、订票、退票、查看信息、修改信息等等功能。
二、功能解析
该程序分为用户端及管理端两部分。用户端可以进行用户注册和用户登录,用户登录之后可以修改自己的用户信息及订票、退票、查看火车信息等等功能。管理端可以通过账号(123456)及密码(csdn)登录,登录之后可以查看火车信息,录入火车信息及查看用户信息等等功能。
三、编译器
该程序代码在Visual Studio 2022编译器中可以正确运行,在Dev-C++编译器中可能存在部分代码格式错误,需要修改才能运行。
四、部分运行图
五、代码部分
(1)第一部分
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <windows.h>
#define _CRT_SECURE_NO_WARNINGS
//火车信息
typedef struct {
int ticket;//票数
int money;//价格
char StartingTime[10];//火车出发时间
char ArriveTime[10];//火车到达时间
char TrainID[10];//火车编号
char From[100];//火车起始站
char To[100];//火车终点站
}Train;
typedef struct {
char id[6];
int bycount;
}Buy;
//用户信息
typedef struct {
char Name[25];//用户姓名
char Gender[5];//用户性别
char ID[20];//用户身份证号码
char username[20];//用户名
char password[20];//用户登录密码
char PhoneNumber[16];//用户手机号码
int count;//用户订票数量
Buy u_TrainID[100];
}User;
//定义链表
typedef struct TrainNode {
Train data;
struct TrainNode* next;
}TN;
//定义链表
typedef struct UserNode {
User data;
struct UserNode* next;
}UN;
void clearInputBuffer();
void nowTime();
void goBack(UN* u, UN* tail, TN* s, TN* rear, int* currentPos);
void user(UN* u, UN* tail, TN* s, TN* rear, int* currentPos);
void user_register(UN* u, UN* tail, TN* s, TN* rear, int* currentPos);
void user_registert_name(UN* p, UN* u, UN* tail, TN* s, TN* rear, int* currentPos);
void user_register_id(UN* p, UN* u);
void user_register_phoneNumber(UN* p, UN* u);
void user_register_username(UN* p);
void user_register_password(UN* p);
void user_register_passworeAgain(UN* p, UN* tail, UN* u, TN* s, TN* rear, int* currentPos);
void user_login(UN* u, UN* tail, TN* s, TN* rear, int* currentPos);
void user_login_accountNumber(UN* a, UN* tail, UN* u);
void user_login_password(UN* a);
void user_interface(UN* a, UN* u, UN* tail, UN* g, TN* s, TN* rear, int* currentPos);
void user_interface_changeUsername(UN* a, UN* u, UN* tail, UN* g, TN* s, TN* rear, int* currentPos);
void user_interface_changePhonenumber(UN* a, UN* u, UN* g, UN* tail, TN* s, TN* rear, int* currentPos);
void user_interface_changePassword(UN* a, UN* u, UN* g, UN* tail, TN* s, TN* rear, int* currentPos);
void user_interface_changePassword_two(UN* op, UN* g, UN* tail, UN* u, TN* s, TN* rear, int* currentPos);
void user_interface_buyTrainTicket(UN* a, UN* u, UN* tail, UN* g, TN* s, TN* rear, int* currentPos);
void user_interface_buyTrainTicket_functionOne(UN* a, UN* u, UN* tail, UN* g, TN* s, TN* rear, int* currentPos);
void user_interface_buyTrainTicket_functionTwo(UN* a, UN* u, UN* tail, UN* g, TN* s, TN* rear, int* currentPos);
void user_interface_buyTrainTicket_functionTwo_1(UN* a, UN* u, UN* tail, UN* g, TN* s, TN* rear, int* currentPos);
void user_interface_checkTrainTicket(UN* a, UN* u, UN* tail, UN* g, TN* s, TN* rear, int* currentPos);
void user_interface_returnTrainTicket(UN* a, UN* u, UN* tail, UN* g, TN* s, TN* rear, int* currentPos);
void manager(UN* u, UN* tail, TN* s, TN* rear, int* currentPos);
void manager_login(UN* u, UN* tail, TN* s, TN* rear, int* currentPos);
void manager_login_acount(char* account, char* ao);
void manager_login_password(char* managerPassword, char* bo);
void manager_interface(UN* u, UN* tail, TN* s, TN* rear, char* managerPassword, int* currentPos);
void manager_interface_enterTrain(UN* u, UN* tail, TN* s, TN* rear, char* managerPassword, int* currentPos);
void manager_interface_enterTrain_trainId(UN* u, UN* tail, TN* s, TN* rear, TN* t, char* managerPassword, int* currentPos);
void manager_interface_enterTrain_trainFrom(UN* u, UN* tail, TN* s, TN* rear, TN* t, char* managerPassword);
void manager_interface_enterTrain_trainTo(UN* u, UN* tail, TN* s, TN* rear, TN* t, char* managerPassword);
void manager_interface_enterTrain_trainStartingTime(UN* u, UN* tail, TN* s, TN* rear, TN* t, char* managerPassword);
void manager_interface_enterTrain_trainArriveTime(UN* u, UN* tail, TN* s, TN* rear, TN* t, char* managerPassword);
void manager_interface_enterTrain_trainMoney(UN* u, UN* tail, TN* s, TN* rear, TN* t, char* managerPassword);
void manager_interface_enterTrain_trainTicket(UN* u, UN* tail, TN* s, TN* rear, TN* t, char* managerPassword, int* currentPos);
void manager_interface_checkTrain(UN* u, UN* tail, TN* s, TN* rear, char* managerPassword, int* currentPos);
void manager_interface_checkTrain_functionOne(UN* u, UN* tail, TN* s, TN* rear, char* managerPassword, int* currentPos);
void manager_interface_checkTrain_functionTwo(UN* u, UN* tail, TN* s, TN* rear, char* managerPassword, int* currentPos);
void manager_interface_checkTrain_functionThree(UN* u, UN* tail, TN* s, TN* rear, char* managerPassword, int* currentPos);
void manager_interface_checkTrain_functionFour(UN* u, UN* tail, TN* s, TN* rear, char* managerPassword, int* currentPos);
void manager_interface_reviseTrain(UN* u, UN* tail, TN* s, TN* rear, char* managerPassword, int* currentPos);
void manager_interface_reviseTrain_Id(UN* u, UN* tail, TN* s, TN* rear, TN* rp, TN* tp, char* managerPassword, int* currentPos);
void manager_interface_reviseTrain_From(UN* u, UN* tail, TN* s, TN* rear, TN* rp, TN* tp, char* managerPassword);
void manager_interface_reviseTrain_To(UN* u, UN* tail, TN* s, TN* rear, TN* rp, TN* tp, char* managerPassword);
void manager_interface_reviseTrain_StartingTime(UN* u, UN* tail, TN* s, TN* rear, TN* rp, TN* tp, char* managerPassword);
void manager_interface_reviseTrain_ArriveTime(UN* u, UN* tail, TN* s, TN* rear, TN* rp, TN* tp, char* managerPassword);
void manager_interface_reviseTrain_money(UN* u, UN* tail, TN* s, TN* rear, TN* rp, TN* tp, char* managerPassword);
void manager_interface_reviseTrain_ticket(UN* u, UN* tail, TN* s, TN* rear, TN* rp, TN* tp, char* managerPassword, int* currentPos);
void manager_interface_deleteTrain(UN* u, UN* tail, TN* s, TN* rear, char* managerPassword, int* currentPos);
void manager_interface_userInformation(UN* u, UN* tail, TN* s, TN* rear, char* managerPassword, int* currentPos);
void manager_interface_userInformation_functionOne(UN* u, UN* tail, TN* s, TN* rear, char* managerPassword, int* currentPos);
void manager_interface_userInformation_functionTwo(UN* u, UN* tail, TN* s, TN* rear, char* managerPassword, int* currentPos);
void manager_interface_userInformation_functionThree(UN* u, UN* tail, TN* s, TN* rear, char* managerPassword, int* currentPos);
(2)第二部分
#define _CRT_SECURE_NO_WARNINGS
#include"head.h"
void clearInputBuffer()
{
int c = 0;
while ((c = getchar()) != '\n' && c != EOF)
{
c = 0;
}
}
void nowTime()
{
time_t rawtime;
struct tm* timeinfo;
time(&rawtime);
timeinfo = localtime(&rawtime);
printf("\t%04d-%02d-%02d\t", timeinfo->tm_year + 1900, timeinfo->tm_mon + 1, timeinfo->tm_mday);
char* weekdays[] = { "周日", "周一", "周二", "周三", "周四", "周五", "周六" };
printf("%s\t", weekdays[timeinfo->tm_wday]);
printf(" %02d:%02d:%02d\t\n", timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec);
return;
}
void goBack(UN* u, UN* tail, TN* s, TN* rear, int* currentPos)
{
int a = 0;
system("cls");
system("color 0A");
nowTime();
printf("\t*********************************\t\n");
printf("\t* 欢 迎 使 用 火 车 购 票 系 统 *\t\n");
printf("\t*********************************\t\n");
printf("\t* 1、进入客户端 *\t\n");
printf("\t* 2、进入管理端 *\t\n");
printf("\t* 3、直接退出系统 *\t\n");
printf("\t*********************************\t\n");
printf("\t请输入您的选择:");
clearInputBuffer();
while (scanf("%d", &a) != 1)
{
system("cls");
system("color 0C");
printf("\t输入错误,请重新输入!\n");
Sleep(1000);
goBack(u, tail, s, rear, currentPos);
return;
}
if (a == 1)
{
user(u, tail, s, rear, currentPos);
return;
}
else if (a == 2)
{
manager(u, tail, s, rear, currentPos);
return;
}
else if (a == 3)
{
system("cls");
system("color 09");
printf("\t欢迎下次使用!\n");
Sleep(1000);
exit(0);
}
else
{
system("cls");
system("color 0C");
printf("\t输入错误,请重新输入!\n");
Sleep(1000);
goBack(u, tail, s, rear, currentPos);
return;
}
}
void user(UN* u, UN* tail,TN* s,TN* rear,int* currentPos)
{
int b = 0;
system("cls");
system("color 0A");
nowTime();
printf("\t*********************************\t\n");
printf("\t* 客 户 端 *\t\n");
printf("\t*********************************\t\n");
printf("\t* 1、用户注册 *\t\n");
printf("\t* 2、用户登录 *\t\n");
printf("\t* 3、返回上一级 *\t\n");
printf("\t* 4、直接退出系统 *\t\n");
printf("\t*********************************\t\n");
printf("\t请输入您的选择:");
while (scanf("%d", &b) != 1)
{
system("cls");
system("color 0C");
printf("\t输入错误,请重新输入!\n");
Sleep(1000);
clearInputBuffer();
user(u, tail, s, rear, currentPos);
return;
}
if (b == 1)
{
user_register(u, tail, s, tail, currentPos);
return;
}
else if (b == 2)
{
user_login(u, tail, s, rear, currentPos);
return;
}
else if (b == 3)
{
goBack(u, tail, s, rear, currentPos);
return;
}
else if (b == 4)
{
system("cls");
system("color 09");
printf("\t欢迎下次使用!\n");
Sleep(1000);
exit(0);
}
else if (b != 1 && b != 2 && b != 3 && b != 4)
{
system("cls");
system("color 0C");
printf("\t输入错误,请重新输入!\n");
Sleep(1000);
user(u, tail, s, rear, currentPos);
return;
}
}
void user_register(UN* u, UN* tail,TN* s,TN* rear,int* currentPos)
{
int a = 0;
UN* p;
p = (UN*)malloc(sizeof(UN));
if (p == NULL)
{
system("color 0C");
printf("操作失败,自动返回上一级!");
Sleep(2000);
user(u, tail, s, rear, currentPos);
return;
}
system("cls");
system("color 0A");
nowTime();
printf("\t*********************************\t\n");
printf("\t* 用 户 注 册 *\t\n");
printf("\t*********************************\t\n");
user_registert_name(p, u, tail, s, rear, currentPos);
user_register_id(p, u);
user_register_phoneNumber(p, u);
user_register_username(p);
user_register_password(p);
user_register_passworeAgain(p, tail, u,s,rear, currentPos);
}
void user_registert_name(UN*p,UN*u,UN*tail,TN* s,TN* rear,int* currentPos)
{
int a = 0;
clearInputBuffer();
printf("\n\t请输入您的姓名(中文):");
scanf("%s", p->data.Name);
for (int i = 0; p->data.Name[i]!='\0'; i++)
{
if (p->data.Name[i] >= 32 && p->data.Name[i] <= 127)
{
printf("\n\t您输入的姓名格式错误,请重新输入。\n");
user_registert_name(p, u, tail,s,rear, currentPos);
return;
}
}
UN* q;
q = u->next;
while (q != NULL)
{
if (strcmp(p->data.Name, q->data.Name) == 0)
{
printf("\n\t该姓名之前已注册!\n");
Sleep(1000);
printf("\n\t正在跳转,请稍等!\n");
Sleep(2000);
system("cls");
system("color 0A");
while (strcmp(p->data.Name, q->data.Name) == 0)
{
nowTime();
printf("\t*********************************\t\n");
printf("\t* 1、前往客户端登录入口登录 *\t\n");
printf("\t* 2、重新注册 *\t\n");
printf("\t* 3、返回客户端 *\t\n");
printf("\t* 4、直接退出系统 *\t\n");
printf("\t*********************************\t\n");
printf("\t请输入您的选择:");
clearInputBuffer();
scanf("%d", &a);
if (a == 1)
{
user_login(u, tail, s, rear, currentPos);
free(p);
free(q);
return;
}
else if (a == 2)
{
free(p);
user_register(u, tail, s, rear, currentPos);
free(q);
return;
}
else if (a == 3)
{
free(p);
user(u, tail, s, rear, currentPos);
free(q);
return;
}
else if (a == 4)
{
system("cls");
system("color 09");
printf("\t欢迎下次使用!\n");
Sleep(1000);
exit(0);
}
else
{
system("cls");
system("color 0C");
printf("\n\t输入错误,请重新输入!\n");
Sleep(1000);
system("cls");
system("color 0A");
}
}
}
q = q->next;
}
}
void user_register_id(UN* p,UN* u)
{
clearInputBuffer();
printf("\n\t请输入您的身份证号码:");
scanf("%s", p->data.ID);
int length = 0;
int l = 0;
length = strlen(p->data.ID);
if (length != 18)
{
printf("\n\t您输入的身份证号码长度错误,请重新输入。\n");
user_register_id(p, u);
return;
}
for (int i = 0; i < 17; i++)
{
if (p->data.ID[i] < '0' || p->data.ID[i] > '9')
{
printf("\n\t您输入的身份证号码格式错误,请重新输入。\n");
user_register_id(p, u);
return;
}
}
if (p->data.ID[17] != 'X' && (p->data.ID[17] < '0' || p->data.ID[17] > '9'))
{
printf("\n\t您输入的身份证号码格式错误,请重新输入。\n");
user_register_id(p, u);
return;
}
char province_code[3];
strncpy(province_code, p->data.ID, 2);
province_code[2] = '\0';
int code = atoi(province_code);
if (code < 11 || code > 91)
{
printf("\n\t您输入的身份证号码格式错误,请重新输入。\n");
user_register_id(p, u);
return;
}
char year[5], month[3], day[3];
strncpy(year, p->data.ID + 6, 4);
year[4] = '\0';
strncpy(month, p->data.ID + 10, 2);
month[2] = '\0';
strncpy(day, p->data.ID + 12, 2);
day[2] = '\0';
int y = atoi(year);
int m = atoi(month);
int d = atoi(day);
if (y < 1900 || y > 2021 || m < 1 || m > 12 || d < 1 || d > 31)
{
printf("\n\t您输入的身份证号码格式错误,请重新输入。\n");
user_register_id(p, u);
return;
}
int weights[17] = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };
char checksum[12] = "10X98765432";
int sum = 0;
for (int z = 0; z < 17; z++)
{
sum += (p->data.ID[z] - '0') * weights[z];
}
int remainder = sum % 11;
if (p->data.ID[17] != checksum[remainder])
{
printf("\n\t您输入的身份证号码格式错误,请重新输入。\n");
user_register_id(p, u);
return;
}
UN* a;
a = u->next;
while (a != NULL)
{
if (strcmp(p->data.ID, a->data.ID) == 0)
{
printf("\n\t您输入的身份证号码已注册,请重新输入。\n");
user_register_id(p, u);
return;
}
a = a->next;
}
free(a);
int gender_code = 0;
gender_code = p->data.ID[16] - '0';
if (gender_code % 2 == 0)
{
printf("\n\t性别:女\n");
char woman[3] = "女";
memcpy(p->data.Gender,woman, sizeof(woman));
p->data.Gender[3] = '\0';
}
else
{
printf("\n\t性别:男\n");
char man[3] = "男";
memcpy(p->data.Gender, man, sizeof(man));
p->data.Gender[3] = '\0';
}
}
void user_register_phoneNumber(UN* p,UN* u)
{
clearInputBuffer();
printf("\n\t请输入您的电话号码:");
scanf("%s", p->data.PhoneNumber);
int length = 0;
length = strlen(p->data.PhoneNumber);
if (length != 11)
{
printf("\n\t您输入的电话号码格式错误,请重新输入。\n");
user_register_phoneNumber(p, u);
return;
}
for (int i = 0; i < length; i++)
{
if (p->data.PhoneNumber[i] < '0' || p->data.PhoneNumber[i] > '9')
{
printf("\n\t您输入的电话号码格式错误,请重新输入。\n");
user_register_phoneNumber(p, u);
return;
}
}
UN* a;
a = u->next;
while (a != NULL)
{
if (strcmp(p->data.PhoneNumber, a->data.PhoneNumber) == 0)
{
printf("\n\t您输入的电话号码已注册,请重新输入。\n");
user_register_phoneNumber(p, u);
return;
}
a = a->next;
}
free(a);
}
void user_register_username(UN* p)
{
clearInputBuffer();
printf("\n\t请输入您的用户名(中文):");
scanf("%s", p->data.username);
int length = 0;
length = strlen(p->data.username);
while (length > 12)
{
printf("\n\t您输入的用户名长度大于6,请重新输入。\n");
user_register_username(p);
return;
}
for (int i = 0; i <= length; i++)
{
if (p->data.username[i] >= 32 && p->data.username[i] <= 127)
{
printf("\n\t您输入的用户名格式错误,请重新输入。\n");
user_register_username(p);
return;
}
}
}
void user_register_password(UN* p)
{
clearInputBuffer();
printf("\n\t请输入您账号的登录密码(数/英/数英):");
scanf("%s", p->data.password);
int length = 0;
length = strlen(p->data.password);
if (length > 20)
{
printf("\n\t您输入的登录密码长度大于20,请重新输入。\n");
user_register_password(p);
return;
}
for (int i = 0; p->data.password[i] != '\0'; i++)
{
if (!((p->data.password[i] >= '0' && p->data.password[i] <= '9') || (p->data.password[i] >= 'A' && p->data.password[i] <= 'Z') || (p->data.password[i] >= 'a' && p->data.password[i] <= 'z')))
{
printf("\n\t您输入的登录密码格式错误,请重新输入。\n");
user_register_password(p);
return;
}
}
}
void user_register_passworeAgain(UN* p, UN* tail, UN* u,TN* s,TN* rear,int* currentPos)
{
UN* k;
k = (UN*)malloc(sizeof(UN));
if (k == NULL)
{
system("color 0C");
printf("操作失败,自动返回上一级!");
Sleep(2000);
user(u, tail,s,rear, currentPos);
return;
}
clearInputBuffer();
printf("\n\t请输入您账号的确认密码:");
scanf("%s", k->data.password);
int length = 0;
length = strlen(k->data.password);
if (length > 20)
{
printf("\n\t您输入的确认密码长度大于20,请重新输入。\n");
user_register_passworeAgain(p, tail, u, s, rear, currentPos);
return;
}
for (int i = 0; k->data.password[i] != '\0'; i++)
{
if (!((k->data.password[i] >= '0' && k->data.password[i] <= '9') || (k->data.password[i] >= 'A' && k->data.password[i] <= 'Z') || (k->data.password[i] >= 'a' && k->data.password[i] <= 'z')))
{
printf("\n\t您输入的登录密码格式错误,请重新输入。\n");
user_register_passworeAgain(p, tail, u, s, rear, currentPos);
return;
}
}
if (strcmp(k->data.password, p->data.password) == 0)
{
if (u->next == NULL)
{
tail = u;
}
p->next = NULL;
tail->next = p;
tail = p;
memset(&p->data.u_TrainID, 0, sizeof(p->data.u_TrainID));
memset(&p->data.u_TrainID, 0, sizeof(p->data.u_TrainID));
p->data.count = 0;
printf("\n\t注册成功!");
printf("\t时间:");
nowTime();
printf("\n\n\t自动返回上一级。");
Sleep(2000);
user(u, tail, s, rear, currentPos);
free(k);
return;
}
else if (strcmp(k->data.password, p->data.password) != 0)
{
printf("\n\t确认密码与登录密码不同,请重新输入确认密码。\n");
user_register_passworeAgain(p, tail, u, s, rear, currentPos);
return;
}
}
void user_login(UN* u, UN* tail,TN* s,TN* rear,int* currentPos)
{
UN* a;
a = (UN*)malloc(sizeof(UN));
if (a == NULL)
{
system("color 0C");
printf("操作失败,自动返回用户端!");
Sleep(2000);
user(u, tail,s,rear, currentPos);
return;
}
system("cls");
system("color 0A");
nowTime();
printf("\t*********************************\t\n");
printf("\t* 用 户 登 录 *\t\n");
printf("\t*********************************\t\n");
user_login_accountNumber(a, tail, u);
user_login_password(a);
UN* g;
g = u->next;
while (g != NULL)
{
if (strcmp(g->data.PhoneNumber, a->data.PhoneNumber) == 0 && strcmp(g->data.password, a->data.password) == 0)
{
system("cls");
system("color 09");
printf("\n\t登录成功!");
printf("\n\t正在进入用户界面,请稍等!");
Sleep(2000);
system("cls");
system("color 0A");
printf("\n\t欢迎 %s 用户登录\n", g->data.username);
Sleep(2000);
user_interface(a, u, tail, g, s, rear, currentPos);
return;
}
g = g->next;
}
printf("\n\t账号或者密码输入错误。\n");
free(g);
free(a);
Sleep(1000);
printf("\n\t正在跳转,请稍等!\n");
Sleep(2000);
int h = 0;
while (h < '1' || h>'2')
{
system("cls");
system("color 0A");
printf("\t*********************************\t\n");
printf("\t* 1、重新输入 *\t\n");
printf("\t* 2、返回用户端 *\t\n");
printf("\t*********************************\t\n");
printf("\t请输入您的选择:");
clearInputBuffer();
scanf("%d", &h);
if (h == 1)
{
user_login(u, tail, s, rear, currentPos);
return;
}
else if (h == 2)
{
user(u, tail,s,rear, currentPos);
return;
}
else
{
system("color 0C");
printf("\n\t输入错误,请重新输入!\n");
Sleep(1000);
system("cls");
system("color 0A");
}
}
}
void user_login_accountNumber(UN* a, UN* tail, UN* u)
{
printf("\n\t请输入您的手机号:");
clearInputBuffer();
scanf("%s", a->data.PhoneNumber);
int length = 0;
length = strlen(a->data.PhoneNumber);
if (length != 11)
{
printf("\n\t您输入的电话号码格式错误,请重新输入。\n");
user_login_accountNumber(a, tail, u);
return;
}
for (int i = 0; i < length; i++)
{
if (a->data.PhoneNumber[i] < '0' || a->data.PhoneNumber[i] > '9')
{
printf("\n\t您输入的电话号码格式错误,请重新输入。\n");
user_login_accountNumber(a, tail, u);
return;
}
}
}
void user_login_password(UN* a)
{
printf("\n\t请输入您的密码:");
clearInputBuffer();
scanf("%s", a->data.password);
int length = 0;
length = strlen(a->data.password);
if (length > 20)
{
printf("\n\t您输入的登录密码长度大于20,请重新输入。\n");
user_login_password(a);
return;
}
for (int i = 0; a->data.password[i] != '\0'; i++)
{
if (!((a->data.password[i] >= '0' && a->data.password[i] <= '9') || (a->data.password[i] >= 'A' && a->data.password[i] <= 'Z') || (a->data.password[i] >= 'a' && a->data.password[i] <= 'z')))
{
printf("\n\t您输入的登录密码格式错误,请重新输入。\n");
user_login_password(a);
return;
}
}
}
void user_interface(UN* a, UN* u, UN* tail,UN* g,TN* s,TN* rear, int* currentPos)
{
system("cls");
system("color 0A");
int h = 0;
while (h < '1' || h > '9')
{
nowTime();
printf("\t*********************************\t\n");
printf("\t* 用 户 界 面 *\t\n");
printf("\t*********************************\t\n");
printf("\t* 1、更改用户名 *\t\n");
printf("\t* 2、更改电话号码 *\t\n");
printf("\t* 3、更改登录密码 *\t\n");
printf("\t* 4、购买列车票 *\t\n");
printf("\t* 5、查看我的列车票 *\t\n");
printf("\t* 6、退掉我的列车票 *\t\n");
printf("\t* 7、重新登录 *\t\n");
printf("\t* 8、返回用户端 *\t\n");
printf("\t* 9、直接退出系统 *\t\n");
printf("\t*********************************\t\n");
printf("\t请输入您的选择:");
clearInputBuffer();
scanf("%d", &h);
if (h == 1)
{
user_interface_changeUsername(a, u, tail, g,s,rear, currentPos);
return;
}
else if (h == 2)
{
user_interface_changePhonenumber(a, u, g, tail,s,rear,currentPos);
return;
}
else if (h == 3)
{
user_interface_changePassword(a, u, g, tail, s, rear, currentPos);
return;
}
else if (h == 4)
{
user_interface_buyTrainTicket(a, u, tail, g, s, rear, currentPos);
return;
}
else if (h == 5)
{
user_interface_checkTrainTicket(a, u, tail, g, s, rear, currentPos);
return;
}
else if (h == 6)
{
user_interface_returnTrainTicket(a, u, tail, g, s, rear, currentPos);
return;
}
else if (h == 7)
{
user_login(u, tail, s, rear, currentPos);
free(a);
return;
}
else if (h == 8)
{
user(u, tail,s,rear, currentPos);
free(a);
return;
}
else if (h == 9)
{
system("cls");
system("color 09");
printf("\t欢迎下次使用!\n");
Sleep(1000);
exit(0);
}
else
{
system("cls");
system("color 0C");
printf("\n\t输入错误,请重新输入!\n");
Sleep(1000);
system("cls");
system("color 0A");
}
}
}
void user_interface_changeUsername(UN* a, UN* u, UN* tail, UN* g, TN* s, TN* rear,int* currentPos)
{
UN* o;
o = (UN*)malloc(sizeof(UN));
if (o == NULL)
{
system("color 0C");
printf("操作失败,自动返回用户界面!");
Sleep(2000);
user_interface(a, u, tail, g,s,rear, currentPos);
return;
}
system("cls");
system("color 0A");
printf("\t**********************************\t\n");
printf("\t* 用 户 名 更 改 界 面 *\t\n");
printf("\t**********************************\t\n");
printf("\n\t当前用户名为:%s", g->data.username);
printf("\n\n\t请输入您要更改的用户名:");
clearInputBuffer();
scanf("%s", o->data.username);
int length = 0;
length = strlen(o->data.username);
while (length > 12)
{
printf("\n\t您输入的用户名长度大于20,请重新输入。\n");
user_interface_changeUsername(a, u, tail, g, s, rear, currentPos);
return;
}
for (int i = 0; i <= length; i++)
{
if (o->data.username[i] >= 32 && o->data.username[i] <= 127)
{
printf("\n\t您输入的用户名格式错误,请重新输入。\n");
Sleep(2000);
user_interface_changeUsername(a, u, tail, g, s, rear, currentPos);
return;
}
}
if (strcmp(o->data.username, g->data.username) == 0)
{
printf("\n\t您要更改的用户名与原用户名相同。\n");
printf("\n\t自动返回上一级。");
Sleep(2000);
user_interface(a, u, tail, g, s, rear, currentPos);
free(o);
return;
}
else
{
memcpy(g->data.username, o->data.username, sizeof(o->data.username));
printf("\n\t用户名更改成功。\n");
printf("\n\t自动返回上一级。\n");
Sleep(2000);
user_interface(a, u, tail, g, s, rear, currentPos);
free(o);
return;
}
}
void user_interface_changePhonenumber(UN* a, UN* u,UN* g,UN*tail,TN* s,TN* rear,int* currentPos)
{
UN* o;
o = (UN*)malloc(sizeof(UN));
if (o == NULL)
{
system("color 0C");
printf("操作失败,自动返回用户界面!");
Sleep(2000);
user_interface(a, u, tail, g, s, rear, currentPos);
return;
}
system("cls");
system("color 0A");
printf("\t*************************************\t\n");
printf("\t* 电 话 号 码 更 改 界 面 *\t\n");
printf("\t*************************************\t\n");
printf("\n\t当前电话号码为:%s",g->data.PhoneNumber);
printf("\n\n\t请输入您要更改的电话号码:");
clearInputBuffer();
scanf("%s", o->data.PhoneNumber);
int length = 0;
length = strlen(o->data.PhoneNumber);
if (length != 11)
{
printf("\n\t您输入的电话号码格式错误,请重新输入。\n");
user_interface_changePhonenumber(a, u, g, tail, s, rear, currentPos);
free(o);
return;
}
for (int i = 0; i < length; i++)
{
if (o->data.PhoneNumber[i] < '0' || o->data.PhoneNumber[i] > '9')
{
printf("\n\t您输入的电话号码格式错误,请重新输入。\n");
user_interface_changePhonenumber(a, u, g, tail, s, rear, currentPos);
free(o);
return;
}
}
if (strcmp(o->data.PhoneNumber, g->data.PhoneNumber) == 0)
{
int h = 0;
printf("\n\t您要更改的电话号码与原电话号码相同。\n");
printf("\n\t正在跳转,请稍后。\n");
Sleep(2000);
while (h < '1' || h>'2')
{
system("cls");
system("color 0A");
printf("\t*********************************\t\n");
printf("\t* 1、重新输入 *\t\n");
printf("\t* 2、返回用户界面 *\t\n");
printf("\t*********************************\t\n");
printf("\t请输入您的选择:");
clearInputBuffer();
scanf("%d", &h);
if (h == 1)
{
user_interface_changePhonenumber(a, u, g, tail, s, rear, currentPos);
free(o);
return;
}
else if (h == 2)
{
user_interface(a, u, tail, g, s, rear, currentPos);
free(o);
return;
}
else
{
system("color 0C");
printf("\n\t输入错误,请重新输入!\n");
Sleep(1000);
system("cls");
system("color 0A");
}
}
}
UN* r;
r = u->next;
while (r != NULL)
{
if (strcmp(o->data.PhoneNumber, r->data.PhoneNumber) == 0)
{
int t = 0;
printf("\n\t您输入的电话号码已注册。\n");
printf("\n\t正在跳转,请稍后。\n");
Sleep(2000);
while (t < '1' || t>'2')
{
system("cls");
system("color 0A");
printf("\t*********************************\t\n");
printf("\t* 1、重新输入 *\t\n");
printf("\t* 2、返回用户界面 *\t\n");
printf("\t*********************************\t\n");
printf("\t请输入您的选择:");
clearInputBuffer();
scanf("%d", &t);
if (t == 1)
{
user_interface_changePhonenumber(a, u, g, tail,s,rear, currentPos);
free(o);
return;
}
else if (t == 2)
{
user_interface(a, u, tail, g, s, rear, currentPos);
free(o);
return;
}
else
{
system("color 0C");
printf("\n\t输入错误,请重新输入!\n");
Sleep(1000);
system("cls");
system("color 0A");
}
}
}
r = r->next;
}
memcpy(g->data.PhoneNumber, o->data.PhoneNumber, sizeof(o->data.PhoneNumber));
printf("\n\t电话号码更改成功,请重新登录。\n");
Sleep(2000);
user_login(u, tail,s,rear, currentPos);
free(o);
free(r);
return;
}
void user_interface_changePassword(UN* a, UN* u, UN* g, UN* tail,TN* s,TN* rear,int* currentPos)
{
UN* o;
o = (UN*)malloc(sizeof(UN));
if (o == NULL)
{
system("color 0C");
printf("操作失败,自动返回用户界面!");
Sleep(2000);
user_interface(a, u, tail, g,s,rear, currentPos);
return;
}
UN* op;
op = (UN*)malloc(sizeof(UN));
if (op == NULL)
{
system("color 0C");
printf("操作失败,自动返回用户界面!");
Sleep(2000);
user_interface(a, u, tail, g,s,rear, currentPos);
return;
}
system("cls");
system("color 0A");
printf("\t**************************************\t\n");
printf("\t* 登 录 密 码 更 改 界 面 *\t\n");
printf("\t**************************************\t\n");
printf("\n\t请输入当前登录密码(数/英/数英):");
clearInputBuffer();
scanf("%s", o->data.password);
int length = 0;
length = strlen(o->data.password);
while (length > 20)
{
printf("\n\t您输入的登录密码长度大于20,请重新输入。\n");
user_interface_changePassword(a, u, g, tail, s, rear, currentPos);
return;
}
for (int i = 0; o->data.password[i] != '\0'; i++)
{
if (!((o->data.password[i] >= '0' && o->data.password[i] <= '9') || (o->data.password[i] >= 'A' && o->data.password[i] <= 'Z') || (o->data.password[i] >= 'a' && o->data.password[i] <= 'z')))
{
printf("\n\t您输入的登录密码格式错误,请重新输入。\n");
user_interface_changePassword(a, u, g, tail, s, rear, currentPos);
return;
}
}
if (strcmp(o->data.password, g->data.password) == 0)
{
user_interface_changePassword_two(op, g, tail, u,s,rear, currentPos);
free(o);
return;
}
else
{
int h = 0;
printf("\n\t您输入的登录密码错误。\n");
Sleep(1000);
printf("\n\t正在跳转,请稍后。\n");
Sleep(2000);
while (h < '1' || h>'2')
{
system("cls");
system("color 0A");
printf("\t*********************************\t\n");
printf("\t* 1、重新输入 *\t\n");
printf("\t* 2、返回用户界面 *\t\n");
printf("\t*********************************\t\n");
printf("\t请输入您的选择:");
clearInputBuffer();
scanf("%d", &h);
if (h == 1)
{
user_interface_changePassword(a, u, g, tail, s, rear, currentPos);
free(o);
free(op);
return;
}
else if (h == 2)
{
user_interface(a, u, tail, g,s,rear, currentPos);
free(o);
free(op);
return;
}
else
{
system("color 0C");
printf("\n\t输入错误,请重新输入!\n");
Sleep(1000);
system("cls");
system("color 0A");
}
}
}
}
void user_interface_changePassword_two(UN* op,UN* g,UN* tail,UN* u,TN*s,TN* rear,int* currentPos)
{
printf("\n\n\t请输入您要更改的登录密码(数/英/数英):");
clearInputBuffer();
scanf("%s", op->data.password);
int length = 0;
length = strlen(op->data.password);
while (length > 20)
{
printf("\n\t您输入的登录密码长度大于20,请重新输入。\n");
user_interface_changePassword_two(op, g, tail, u, s, rear, currentPos);
return;
}
for (int i = 0; op->data.password[i] != '\0'; i++)
{
if (!((op->data.password[i] >= '0' && op->data.password[i] <= '9') || (op->data.password[i] >= 'A' && op->data.password[i] <= 'Z') || (op->data.password[i] >= 'a' && op->data.password[i] <= 'z')))
{
printf("\n\t您输入的登录密码格式错误,请重新输入。\n");
user_interface_changePassword_two(op, g, tail, u, s, rear, currentPos);
return;
}
}
memcpy(g->data.password, op->data.password, sizeof(op->data.password));
printf("\n\t登录密码更改成功,请重新登录。\n");
Sleep(2000);
user_login(u, tail,s,rear, currentPos);
free(op);
return;
}
void user_interface_buyTrainTicket(UN* a, UN* u, UN* tail, UN* g, TN* s, TN* rear,int* currentPos)
{
int ao = 0;
system("cls");
system("color 0A");
while (ao < 1 || ao>4)
{
nowTime();
printf("\t*********************************\t\n");
printf("\t* 列 车 票 购 买 界 面 *\t\n");
printf("\t*********************************\t\n");
printf("\t* 1、按列车编号购买 *\t\n");
printf("\t* 2、按起始站和终点站购买 *\t\n");
printf("\t* 3、返回用户界面 *\t\n");
printf("\t* 4、直接退出系统 *\t\n");
printf("\t*********************************\t\n");
printf("\t请输入您的选择:");
clearInputBuffer();
scanf("%d", &ao);
if (ao == 1)
{
user_interface_buyTrainTicket_functionOne(a, u, tail, g, s, rear, currentPos);
return;
}
else if (ao == 2)
{
user_interface_buyTrainTicket_functionTwo(a, u, tail, g, s, rear, currentPos);
return;
}
else if (ao == 3)
{
user_interface(a, u, tail, g, s, rear, currentPos);
return;
}
else if (ao = 4)
{
system("cls");
system("color 09");
printf("\t欢迎下次使用!\n");
Sleep(1000);
exit(0);
}
else
{
system("cls");
system("color 0C");
printf("\n\t输入错误,请重新输入!\n");
Sleep(1000);
system("cls");
system("color 0A");
}
}
}
void user_interface_buyTrainTicket_functionOne(UN* a, UN* u, UN* tail, UN* g, TN* s, TN* rear, int* currentPos)
{
system("cls");
system("color 0A");
printf("\n\t按列车编号购买\t\n\n");
TN* f;
f = s->next;
if (f == NULL)
{
system("color 0A");
printf("\n\t当前暂无列车信息。\n");
Sleep(1000);
printf("\n\t自动返回上一级。\n");
Sleep(2000);
user_interface_buyTrainTicket(a, u, tail, g, s, rear, currentPos);
return;
}
TN* ao;
ao = (TN*)malloc(sizeof(TN));
if (ao == NULL)
{
system("cls");
system("color 0C");
printf("操作失败,自动返回上一级!");
Sleep(2000);
user_interface_buyTrainTicket(a, u, tail, g, s, rear, currentPos);
return;
}
printf("\n\t请输入您要购买的列车号:");
clearInputBuffer();
scanf("%s", ao->data.TrainID);
int length = 0;
length = strlen(ao->data.TrainID);
if (length != 5)
{
printf("\n\t您输入的列车编号长度错误,输入长度应为5,请按照正确编号格式(如:A1234)重新输入。\n");
user_interface_buyTrainTicket_functionOne(a, u, tail, g, s, rear, currentPos);
return;
}
if (ao->data.TrainID[0] < 'A' || ao->data.TrainID[0]>'Z')
{
printf("\n\t您输入的列车编号第一位应为大写英文,请重新输入。\n");
user_interface_buyTrainTicket_functionOne(a, u, tail, g, s, rear, currentPos);
return;
}
for (int i = 1; ao->data.TrainID[i] != '\0'; i++)
{
if (ao->data.TrainID[i] < '0' || ao->data.TrainID[i]>'9')
{
printf("\n\t您输入的列车编号后四位应为数字,请重新输入。\n");
user_interface_buyTrainTicket_functionOne(a, u, tail, g, s, rear, currentPos);
return;
}
}
while (f != NULL)
{
if (strcmp(ao->data.TrainID, f->data.TrainID) == 0)
{
printf("\n\t列车编号 起点站 终点站 出发时间 到达时间 价格(元/张) 剩余票数(单位:张)\n");
printf("\n\t%-15s%-15s%-15s%-15s%-15s%-18d%-18d\n", &f->data.TrainID, &f->data.From, &f->data.To, &f->data.StartingTime, &f->data.ArriveTime, f->data.money, f->data.ticket);
int many = 0;
while (many<1 || many>f->data.ticket)
{
clearInputBuffer();
printf("\n\t请输入您要购买的票数(单位:张):");
scanf("%d", &many);
if (many<1 || many>f->data.ticket)
{
printf("\n\n输入票数错误,请重新输入!");
}
else
{
printf("\n\t***********************************");
printf("\n\t* 1、确定购买 2、放弃购买 *");
printf("\n\t***********************************");
int kaibai = 0;
while (kaibai < 1 || kaibai>2)
{
printf("\n\t请输入您的选择:");
clearInputBuffer();
scanf("%d", &kaibai);
if (kaibai == 1)
{
if (g->data.u_TrainID[0].id == 0)
{
strcpy(g->data.u_TrainID[g->data.count].id, f->data.TrainID);
g->data.u_TrainID[g->data.count].bycount = g->data.u_TrainID[g->data.count].bycount + many;
g->data.count = g->data.count + 1;
f->data.ticket = f->data.ticket - many;
printf("\n\t购买成功。");
Sleep(1000);
printf("\n\t自动返回用户界面。\n");
Sleep(2000);
user_interface(a, u, tail, g, s, rear, currentPos);
free(f);
free(ao);
return;
}
else
{
strcpy(g->data.u_TrainID[g->data.count].id, f->data.TrainID);
g->data.u_TrainID[g->data.count].bycount = g->data.u_TrainID[g->data.count].bycount + many;
g->data.count = g->data.count + 1;
f->data.ticket = f->data.ticket - many;
printf("\n\t购买成功。");
Sleep(1000);
printf("\n\t自动返回用户界面。\n");
Sleep(2000);
user_interface(a, u, tail, g, s, rear, currentPos);
free(f);
free(ao);
return;
}
}
else if (kaibai == 2)
{
printf("\n\t放弃购买。");
Sleep(1000);
printf("\n\t自动返回上一级。");
Sleep(1000);
user_interface_buyTrainTicket(a, u, tail, g, s, rear, currentPos);
return;
}
else
{
printf("\n\t输入错误,请重新输入!\n");
}
}
}
}
}
f = f->next;
}
printf("\n\t暂无列车编号为 %s 的列车", &ao->data.TrainID);
Sleep(1000);
printf("\n\t自动返回上一级。\n");
Sleep(2000);
user_interface_buyTrainTicket(a, u, tail, g, s, rear, currentPos);
return;
}
void user_interface_buyTrainTicket_functionTwo(UN* a, UN* u, UN* tail, UN* g, TN* s, TN* rear, int* currentPos)
{
system("cls");
system("color 0A");
printf("\n\t按列车起始站与终点站购买\t\n\n");
TN* f;
f = s->next;
if (f == NULL)
{
system("color 0A");
printf("\n\t当前暂无列车信息。\n");
Sleep(1000);
printf("\n\t自动返回上一级。\n");
Sleep(2000);
user_interface_buyTrainTicket(a, u, tail, g, s, rear, currentPos);
return;
}
TN* ao;
ao = (TN*)malloc(sizeof(TN));
if (ao == NULL)
{
system("cls");
system("color 0C");
printf("\n\t操作失败,自动返回上一级!");
Sleep(2000);
user_interface_buyTrainTicket(a, u, tail, g, s, rear, currentPos);
return;
}
printf("\n\t请输入您要购买的列车票的起始站名称:");
clearInputBuffer();
scanf("%s", ao->data.From);
for (int i = 0; ao->data.From[i] != '\0'; i++)
{
if (ao->data.From[i] >= 32 && ao->data.From[i] <= 127)
{
printf("\n\t您输入的列车起点站名称格式错误,请重新输入。\n");
Sleep(2000);
user_interface_buyTrainTicket_functionTwo(a, u, tail, g, s, rear, currentPos);
return;
}
}
printf("\n\t请输入您要购买的列车票的终点站名称:");
clearInputBuffer();
scanf("%s", ao->data.To);
for (int i = 0; ao->data.To[i] != '\0'; i++)
{
if (ao->data.To[i] >= 32 && ao->data.To[i] <= 127)
{
printf("\n\t您输入的列车终点站名称格式错误,请重新输入。\n");
Sleep(2000);
user_interface_buyTrainTicket_functionTwo(a, u, tail, g, s, rear, currentPos);
return;
}
}
if (strcmp(ao->data.From, ao->data.To) == 0)
{
printf("\n\t您输入的列车终点站名称与列车起点站名称一致,请重新输入。\n");
Sleep(2000);
user_interface_buyTrainTicket_functionTwo(a, u, tail, g, s, rear, currentPos);
return;
}
TN* fo;
fo = s->next;
while (fo != NULL)
{
if (strcmp(ao->data.From, fo->data.From) == 0 && strcmp(ao->data.To, fo->data.To) == 0)
{
printf("\n\t搜寻到以下列车\n\n");
printf("\n\t列车编号 起点站 终点站 出发时间 到达时间 价格(元/张) 剩余票数(单位:张)\n");
break;
}
fo = fo->next;
}
while (f != NULL)
{
if (strcmp(ao->data.From, f->data.From) == 0 && strcmp(ao->data.To, f->data.To) == 0)
{
printf("\n\t%-15s%-15s%-15s%-15s%-15s%-18d%-18d\n", &f->data.TrainID, &f->data.From, &f->data.To, &f->data.StartingTime, &f->data.ArriveTime, f->data.money, f->data.ticket);
}
f = f->next;
}
TN* fa;
fa = s->next;
while (fa != NULL)
{
if (strcmp(ao->data.From, fa->data.From) == 0 && strcmp(ao->data.To, fa->data.To) == 0)
{
user_interface_buyTrainTicket_functionTwo_1(a, u, tail, g, s, rear, currentPos);
return;
}
fa = fa->next;
}
printf("\n\t暂无 %s——%s 的列车", &ao->data.From,&ao->data.To);
Sleep(1000);
printf("\n\t自动返回上一级。\n");
Sleep(2000);
user_interface_buyTrainTicket(a, u, tail, g, s, rear, currentPos);
return;
}
void user_interface_buyTrainTicket_functionTwo_1(UN* a, UN* u, UN* tail, UN* g, TN* s, TN* rear, int* currentPos)
{
TN* f;
f = s->next;
if (f == NULL)
{
system("color 0A");
printf("\n\t当前暂无列车信息。\n");
Sleep(1000);
printf("\n\t自动返回上一级。\n");
Sleep(2000);
user_interface_buyTrainTicket(a, u, tail, g, s, rear, currentPos);
return;
}
TN* ao;
ao = (TN*)malloc(sizeof(TN));
if (ao == NULL)
{
system("cls");
system("color 0C");
printf("操作失败,自动返回上一级!");
Sleep(2000);
user_interface_buyTrainTicket(a, u, tail, g, s, rear, currentPos);
return;
}
printf("\n\t请输入您要购买的列车号:");
clearInputBuffer();
scanf("%s", ao->data.TrainID);
int length = 0;
length = strlen(ao->data.TrainID);
if (length != 5)
{
printf("\n\t您输入的列车编号长度错误,输入长度应为5,请按照正确编号格式(如:A1234)重新输入。\n");
user_interface_buyTrainTicket_functionTwo_1(a, u, tail, g, s, rear, currentPos);
return;
}
if (ao->data.TrainID[0] < 'A' || ao->data.TrainID[0]>'Z')
{
printf("\n\t您输入的列车编号第一位应为大写英文,请重新输入。\n");
user_interface_buyTrainTicket_functionTwo_1(a, u, tail, g, s, rear, currentPos);
return;
}
for (int i = 1; ao->data.TrainID[i] != '\0'; i++)
{
if (ao->data.TrainID[i] < '0' || ao->data.TrainID[i]>'9')
{
printf("\n\t您输入的列车编号后四位应为数字,请重新输入。\n");
user_interface_buyTrainTicket_functionTwo_1(a, u, tail, g, s, rear, currentPos);
return;
}
}
while (f != NULL)
{
if (strcmp(ao->data.TrainID, f->data.TrainID) == 0)
{
printf("\n\t列车编号 起点站 终点站 出发时间 到达时间 价格(元/张) 剩余票数(单位:张)\n");
printf("\n\t%-15s%-15s%-15s%-15s%-15s%-18d%-18d\n", &f->data.TrainID, &f->data.From, &f->data.To, &f->data.StartingTime, &f->data.ArriveTime, f->data.money, f->data.ticket);
int many = 0;
while (many<1 || many>f->data.ticket)
{
printf("\n\t当前列车剩余票数:%d", f->data.ticket);
printf("\n\n\t请输入您需要的购买的列车票数量:");
clearInputBuffer();
scanf("%d", &many);
if (many<1 || many>f->data.ticket)
{
printf("\n\t输入票数错误,请重新输入!\t");
}
else
{
printf("\n\t***********************************");
printf("\n\t* 1、确定购买 2、放弃购买 *");
printf("\n\t***********************************");
int kaibai = 0;
while (kaibai < 1 || kaibai>2)
{
printf("\n\t请输入您的选择:");
clearInputBuffer();
scanf("%d", &kaibai);
if (kaibai == 1)
{
if (g->data.u_TrainID[0].id == 0)
{
strcpy(g->data.u_TrainID[g->data.count].id, f->data.TrainID);
g->data.u_TrainID[g->data.count].bycount = g->data.u_TrainID[g->data.count].bycount + many;
g->data.count = g->data.count + 1;
f->data.ticket = f->data.ticket - many;
printf("\n\t购买成功。");
Sleep(1000);
printf("\n\t自动返回用户界面。\n");
Sleep(2000);
user_interface(a, u, tail, g, s, rear, currentPos);
free(f);
free(ao);
return;
}
else
{
strcpy(g->data.u_TrainID[g->data.count].id, f->data.TrainID);
g->data.u_TrainID[g->data.count].bycount = g->data.u_TrainID[g->data.count].bycount + many;
g->data.count = g->data.count + 1;
f->data.ticket = f->data.ticket - many;
Sleep(1000);
printf("\n\t自动返回用户界面。\n");
Sleep(2000);
user_interface(a, u, tail, g, s, rear, currentPos);
free(f);
free(ao);
return;
}
}
else if (kaibai == 2)
{
printf("\n\t放弃购买。");
Sleep(1000);
printf("\n\t自动返回上一级。");
Sleep(1000);
user_interface_buyTrainTicket(a, u, tail, g, s, rear, currentPos);
return;
}
else
{
printf("\n\t输入错误,请重新输入!\n");
}
}
}
}
}
f = f->next;
}
}
void user_interface_checkTrainTicket(UN* a, UN* u, UN* tail, UN* g, TN* s, TN* rear, int* currentPos)
{
system("cls");
system("color 0A");
printf("\n\t我的列车票\t\n\n");
if (g->data.count == 0)
{
printf("\n\t您还未购买列车票。\n");
Sleep(1000);
printf("\n\t自动返回上一级。\n");
Sleep(2000);
user_interface(a, u, tail, g, s, rear, currentPos);
return;
}
printf("\n\t您共有 %d 张不同列车票。\n", g->data.count);
printf("\n\t列车编号 起点站 终点站 出发时间 到达时间 价格(元/张) 票数(单位:张)\n");
for (int i = g->data.count; i >= 0; i--)
{
TN* f;
f = s->next;
while (f != NULL)
{
if (strcmp(f->data.TrainID, g->data.u_TrainID[i].id) == 0)
{
printf("\n\t%-15s%-15s%-15s%-15s%-15s%-18d%-18d\n", &f->data.TrainID, &f->data.From, &f->data.To, &f->data.StartingTime, &f->data.ArriveTime, f->data.money, &g->data.u_TrainID[i].bycount);
}
f = f->next;
}
}
printf("\n\t按任意返回用户界面。\n");
getch();
user_interface(a, u, tail, g, s, rear, currentPos);
return;
}
void user_interface_returnTrainTicket(UN* a, UN* u, UN* tail, UN* g, TN* s, TN* rear, int* currentPos)
{
system("cls");
system("color 0A");
printf("\n\t退订列车票\t\n\n");
if (g->data.count == 0)
{
printf("\n\t您还未购买列车票。\n");
Sleep(1000);
printf("\n\t自动返回上一级。\n");
Sleep(2000);
user_interface(a, u, tail, g, s, rear, currentPos);
return;
}
TN* ao;
ao = (UN*)malloc(sizeof(UN));
if (ao == NULL)
{
system("cls");
system("color 0C");
printf("\n\t操作失败,自动返回上一级!");
Sleep(2000);
user_interface(a, u, tail, g, s, rear, currentPos);
return;
}
for (int i = g->data.count; i >= 0; i--)
{
printf("\n\t您当前的列车票有:");
printf("%s ", &g->data.u_TrainID[i].id);
}
printf("\n\n\t请输入要退掉的列车编号:");
clearInputBuffer();
scanf("%s", ao->data.TrainID);
int length_a = 0;
length_a = strlen(ao->data.TrainID);
if (length_a != 5)
{
printf("\n\t您输入的列车编号长度错误,输入长度应为5,请按照正确编号格式(如:A1234)重新输入。\n");
Sleep(1000);
user_interface_returnTrainTicket(a, u, tail, g, s, rear, currentPos);
return;
}
if (ao->data.TrainID[0] < 'A' || ao->data.TrainID[0]>'Z')
{
printf("\n\t您输入的列车编号第一位应为大写英文,请重新输入。\n");
Sleep(1000);
user_interface_returnTrainTicket(a, u, tail, g, s, rear, currentPos);
return;
}
for (int i = 1; ao->data.TrainID[i] != '\0'; i++)
{
if (ao->data.TrainID[i] < '0' || ao->data.TrainID[i]>'9')
{
printf("\n\t您输入的列车编号后四位应为数字,请重新输入。\n");
Sleep(1000);
user_interface_returnTrainTicket(a, u, tail, g, s, rear, currentPos);
return;
}
}
int i = 0;
i = g->data.count;
while (i != 0)
{
if (strcmp(ao->data.TrainID, g->data.u_TrainID[i].id) == 0)
{
int many = 0;
printf("\n\t列车编号:%s", &g->data.u_TrainID[i].id);
printf("\n\t票数:%d 张", g->data.u_TrainID[i].bycount);
printf("\n\n\t请输入您要退的票数:");
scanf("%d", &many);
while (many<1 || many>g->data.u_TrainID[i].bycount)
{
printf("\n\t您输入的票数无效,请重新输入。");
printf("\n\n\t请输入您要退的票数:");
scanf("%d", &many);
}
if (many == g->data.u_TrainID[i].bycount)
{
for (int io = i; io <= g->data.count; io++)
{
memcpy(g->data.u_TrainID[io].id, g->data.u_TrainID[io + 1].id, sizeof(g->data.u_TrainID[io].id));
}
g->data.count = g->data.count - 1;
g->data.u_TrainID[i].bycount = g->data.u_TrainID[i].bycount - many;
TN* f;
f = u->next;
while (f != NULL)
{
if (strcmp(g->data.u_TrainID[i].id, f->data.TrainID) == 0)
{
f->data.ticket = f->data.ticket + many;
printf("\n\t列车票退订成功。\n");
Sleep(1000);
printf("\n\t自动返回上一级。\n");
Sleep(2000);
user_interface(a, u, tail, g, s, rear, currentPos);
return;
}
f = f->next;
}
}
else
{
g->data.u_TrainID[i].bycount = g->data.u_TrainID[i].bycount - many;
TN* fo;
fo = u->next;
while (fo != NULL)
{
if (strcmp(g->data.u_TrainID[i].id, fo->data.TrainID)==0)
{
fo->data.ticket = fo->data.ticket + many;
printf("\n\t列车票退订成功。\n");
Sleep(1000);
printf("\n\t自动返回上一级。\n");
Sleep(2000);
user_interface(a, u, tail, g, s, rear, currentPos);
return;
}
fo = fo->next;
}
}
}
i--;
}
printf("\n\t未在您的列车票中搜寻到您输入的列车编号。\n");
Sleep(1000);
printf("\n\t自动返回上一级。\n");
Sleep(2000);
user_interface(a, u, tail, g, s, rear, currentPos);
return;
}
void manager(UN* u, UN* tail,TN* s,TN* rear,int* currentPos)
{
int a = 0;
system("cls");
system("color 0A");
nowTime();
printf("\t*********************************\t\n");
printf("\t* 管 理 端 *\t\n");
printf("\t*********************************\t\n");
printf("\t* 1、管理员登录 *\t\n");
printf("\t* 2、返回上一级 *\t\n");
printf("\t* 3、直接退出系统 *\t\n");
printf("\t*********************************\t\n");
printf("\t请输入您的选择:");
while (scanf("%d", &a) != 1)
{
system("cls");
system("color 0C");
printf("\t输入错误,请重新输入!\n");
Sleep(1000);
clearInputBuffer();
manager(u, tail, s, rear, currentPos);
return;
}
if (a == 1)
{
manager_login(u, tail, s, rear, currentPos);
return;
}
else if (a == 2)
{
goBack(u, tail, s, rear, currentPos);
return;
}
else if (a == 3)
{
system("cls");
system("color 09");
printf("\t欢迎下次使用!\n");
Sleep(1000);
exit(0);
}
else if (a != 1 && a != 2 && a != 3)
{
system("cls");
system("color 0C");
printf("\t输入错误,请重新输入!\n");
Sleep(1000);
manager(u, tail, s, rear, currentPos);
return;
}
}
void manager_login(UN* u,UN* tail,TN* s,TN* rear,int* currentPos)
{
char account[20];
char managerPassword[20];
char ao[20];
char bo[20];
strcpy(account, "123456");
strcpy(managerPassword, "csdn");
system("cls");
system("color 0A");
nowTime();
printf("\t*********************************\t\n");
printf("\t* 管 理 员 登 录 *\t\n");
printf("\t*********************************\t\n");
manager_login_acount(account, ao);
manager_login_password(managerPassword, bo);
if (strcmp(ao, account) == 0 && strcmp(bo, managerPassword) == 0)
{
system("cls");
system("color 09");
printf("\n\t登录成功!");
printf("\n\t正在进入管理界面,请稍等!");
Sleep(2000);
manager_interface(u, tail, s, rear, managerPassword, currentPos);
return;
}
else
{
printf("\n\t账号或者密码输入错误。\n");
Sleep(1000);
printf("\n\t正在跳转,请稍等!\n");
Sleep(2000);
int h = 0;
while (h < '1' || h>'2')
{
system("cls");
system("color 0A");
printf("\t*********************************\t\n");
printf("\t* 1、重新输入 *\t\n");
printf("\t* 2、返回管理端 *\t\n");
printf("\t*********************************\t\n");
printf("\t请输入您的选择:");
clearInputBuffer();
scanf("%d", &h);
if (h == 1)
{
manager_login(u, tail, s, rear, currentPos);
return;
}
else if (h == 2)
{
manager(u, tail, s, rear, currentPos);
return;
}
else
{
system("color 0C");
printf("\n\t输入错误,请重新输入!\n");
Sleep(1000);
system("cls");
system("color 0A");
}
}
}
}
void manager_login_acount(char* account, char* ao)
{
printf("\n\t请输入账号(数字):");
clearInputBuffer();
scanf("%s", ao);
int length = 0;
length = strlen(ao);
if (length > 20)
{
printf("\n\t您输入的账号长度大于20,请重新输入。\n");
manager_login_acount(account, ao);
return;
}
for (int i = 0; ao[i]!='\0'; i++)
{
if (ao[i] < '0' || ao[i]> '9')
{
printf("\n\t您输入的账号格式错误,请重新输入。\n");
manager_login_acount(account, ao);
return;
}
}
}
void manager_login_password(char* managerPassword, char* bo)
{
printf("\n\t请输入密码(数/英/数英):");
clearInputBuffer();
scanf("%s", bo);
int length = 0;
length = strlen(bo);
if (length > 20)
{
printf("\n\t您输入的密码长度大于20,请重新输入。\n");
manager_login_password(managerPassword, bo);
return;
}
for (int i = 0; bo[i] != '\0'; i++)
{
if (!((bo[i] >= '0' && bo[i] <= '9') || (bo[i] >= 'A' && bo[i] <= 'Z') || (bo[i] >= 'a' && bo[i] <= 'z')))
{
printf("\n\t您输入的登录密码格式错误,请重新输入。\n");
manager_login_password(managerPassword, bo);
return;
}
}
}
void manager_interface(UN* u, UN* tail, TN* s, TN* rear, char* managerPassword,int* currentPos)
{
system("cls");
system("color 0A");
int h = 0;
while (h < '1' || h > '7')
{
nowTime();
printf("\t*********************************\t\n");
printf("\t* 管 理 界 面 *\t\n");
printf("\t*********************************\t\n");
printf("\t* 1、查看目前列车信息 *\t\n");
printf("\t* 2、录入列车信息 *\t\n");
printf("\t* 3、修改已录入的列车信息 *\t\n");
printf("\t* 4、删除列车信息 *\t\n");
printf("\t* 5、用户信息 *\t\n");
printf("\t* 6、返回管理端 *\t\n");
printf("\t* 7、直接退出系统 *\t\n");
printf("\t*********************************\t\n");
printf("\t请输入您的选择:");
clearInputBuffer();
scanf("%d", &h);
if (h == 1)
{
manager_interface_checkTrain(u, tail, s, rear, managerPassword, currentPos);
return;
}
else if (h == 2)
{
manager_interface_enterTrain(u, tail, s, rear, managerPassword, currentPos);
return;
}
else if (h == 3)
{
manager_interface_reviseTrain(u, tail, s, rear, managerPassword, currentPos);
return;
}
else if (h == 4)
{
manager_interface_deleteTrain(u, tail, s, rear, managerPassword, currentPos);
return;
}
else if (h == 5)
{
manager_interface_userInformation(u, tail, s, rear, managerPassword, currentPos);
return;
}
else if (h == 6)
{
manager(u, tail, s, rear, currentPos);
return;
}
else if (h == 7)
{
system("cls");
system("color 09");
printf("\t欢迎下次使用!\n");
Sleep(1000);
exit(0);
}
else
{
system("cls");
system("color 0C");
printf("\n\t输入错误,请重新输入!\n");
Sleep(1000);
system("cls");
system("color 0A");
}
}
}
void manager_interface_checkTrain(UN* u, UN* tail, TN* s, TN* rear, char* managerPassword,int* currentPos)
{
int h = 0;
while (h < '1' || h > '6')
{
system("cls");
system("color 0A");
printf("\t**************************************\t\n");
printf("\t* 列 车 信 息 查 看 界 面 *\t\n");
printf("\t**************************************\t\n");
printf("\t* 1、查看所有列车信息 *\t\n");
printf("\t* 2、按列车编号查看列车信息 *\t\n");
printf("\t* 3、按列车起点站查看列车信息 *\t\n");
printf("\t* 4、按列车终点站查看列车信息 *\t\n");
printf("\t* 5、返回管理界面 *\t\n");
printf("\t* 6、直接退出系统 *\t\n");
printf("\t**************************************\t\n");
printf("\t请输入您的选择:");
clearInputBuffer();
scanf("%d", &h);
if (h == 1)
{
manager_interface_checkTrain_functionOne(u, tail, s, rear, managerPassword, currentPos);
return;
}
else if (h == 2)
{
manager_interface_checkTrain_functionTwo(u, tail, s, rear, managerPassword, currentPos);
return;
}
else if (h == 3)
{
manager_interface_checkTrain_functionThree(u, tail, s, rear, managerPassword, currentPos);
return;
}
else if (h == 4)
{
manager_interface_checkTrain_functionFour(u, tail, s, rear, managerPassword, currentPos);
return;
}
else if (h == 5)
{
manager_interface(u, tail, s, rear, managerPassword, currentPos);
return;
}
else if (h == 6)
{
system("cls");
system("color 09");
printf("\t欢迎下次使用!\n");
Sleep(1000);
exit(0);
}
else
{
system("cls");
system("color 0C");
printf("\n\t输入错误,请重新输入!\n");
Sleep(1000);
system("cls");
system("color 0A");
}
}
}
void manager_interface_checkTrain_functionOne(UN* u, UN* tail, TN* s, TN* rear, char* managerPassword,int* currentPos)
{
TN* check;
check = s->next;
system("cls");
system("color 09");
printf("\n\t列车信息目录\n\n");
if (check == NULL)
{
system("color 0A");
printf("\n\t当前暂无列车信息。");
Sleep(1000);
printf("\n\t自动返回上一级。\n");
Sleep(2000);
manager_interface_checkTrain(u, tail, s, rear, managerPassword, currentPos);
return;
}
if (check != NULL)
{
system("color 0A");
printf("\n\t列车编号 起点站 终点站 出发时间 到达时间 价格(元/张) 票数(单位:张)\n");
}
if (check != NULL)
{
while (check != NULL)
{
system("color 0A");
printf("\n\t%-15s%-15s%-15s%-15s%-15s%-18d%-16d\n", &check->data.TrainID, &check->data.From, &check->data.To, &check->data.StartingTime,&check->data.ArriveTime, check->data.money, check->data.ticket);
check = check->next;
}
printf("\n\t按任意返回列车信息查看界面。\n");
getch();
manager_interface_checkTrain(u, tail, s, rear, managerPassword, currentPos);
return;
}
}
void manager_interface_checkTrain_functionTwo(UN* u, UN* tail, TN* s, TN* rear, char* managerPassword,int* currentPos)
{
TN* o;
o = (TN*)malloc(sizeof(TN));
if (o == NULL)
{
system("cls");
system("color 0C");
printf("操作失败,自动返回上一级!");
Sleep(2000);
manager_interface_checkTrain(u, tail, s, rear, managerPassword, currentPos);
return;
}
system("cls");
system("color 0A");
printf("\n\t按列车编号查询列车信息\t\n\n");
TN* p;
p = s->next;
if (p == NULL)
{
system("color 0A");
printf("\n\t当前暂无列车信息。");
Sleep(1000);
printf("\n\t自动返回上一级。\n");
Sleep(2000);
manager_interface_checkTrain(u, tail, s, rear, managerPassword, currentPos);
return;
}
printf("\n\t请输入列车编号:");
clearInputBuffer();
scanf("%s",o->data.TrainID);
int length = 0;
length = strlen(o->data.TrainID);
if (length != 5)
{
printf("\n\t您输入的列车编号长度错误,输入长度应为5,请按照正确编号格式(如:A1234)重新输入。\n");
Sleep(1000);
manager_interface_checkTrain_functionTwo(u, tail, s, rear, managerPassword, currentPos);
return;
}
if (o->data.TrainID[0] < 'A' || o->data.TrainID[0]>'Z')
{
printf("\n\t您输入的列车编号第一位应为大写英文,请重新输入。\n");
Sleep(1000);
manager_interface_checkTrain_functionTwo(u, tail, s, rear, managerPassword, currentPos);
return;
}
for (int i = 1; o->data.TrainID[i] != '\0'; i++)
{
if (o->data.TrainID[i] < '0' || o->data.TrainID[i]>'9')
{
printf("\n\t您输入的列车编号后四位应为数字,请重新输入。\n");
Sleep(1000);
manager_interface_checkTrain_functionTwo(u, tail, s, rear, managerPassword, currentPos);
return;
}
}
while (p != NULL)
{
if (strcmp(o->data.TrainID, p->data.TrainID) == 0)
{
printf("\n\t列车编号 起点站 终点站 出发时间 到达时间 价格(元/张) 票数(单位:张)\n");
printf("\n\t%-15s%-15s%-15s%-15s%-15s%-18d%-16d\n", &p->data.TrainID, &p->data.From, &p->data.To, &p->data.StartingTime, &p->data.ArriveTime, p->data.money, p->data.ticket);
printf("\n\t按任意返回列车信息查看界面。\n");
getch();
manager_interface_checkTrain(u, tail, s, rear, managerPassword, currentPos);
return;
}
p = p->next;
}
printf("\n搜寻不到列车编号为 %s 的信息", &o->data.TrainID);
Sleep(1000);
printf("\n\t自动返回上一级。\n");
Sleep(2000);
manager_interface_checkTrain(u, tail, s, rear, managerPassword, currentPos);
return;
}
void manager_interface_checkTrain_functionThree(UN* u, UN* tail, TN* s, TN* rear, char* managerPassword,int* currentPos)
{
TN* o;
o = (TN*)malloc(sizeof(TN));
if (o == NULL)
{
system("cls");
system("color 0C");
printf("操作失败,自动返回上一级!");
Sleep(2000);
manager_interface_checkTrain(u, tail, s, rear, managerPassword, currentPos);
return;
}
system("cls");
system("color 0A");
printf("\n\t按列车起点站查询列车信息\t\n\n");
TN* p;
p = s->next;
if (p == NULL)
{
system("color 0A");
printf("\n\t当前暂无列车信息。");
Sleep(1000);
printf("\n\t自动返回上一级。\n");
Sleep(2000);
manager_interface_checkTrain(u, tail, s, rear, managerPassword, currentPos);
return;
}
printf("\n\t请输入列车起点站名称:");
clearInputBuffer();
scanf("%s", o->data.From);
for (int i = 0; o->data.From[i] != '\0'; i++)
{
if (o->data.From[i] >= 32 && o->data.From[i] <= 127)
{
printf("\n\t您输入的列车起点站名称格式错误,请重新输入。\n");
Sleep(1000);
manager_interface_checkTrain_functionThree(u, tail, s, rear, managerPassword, currentPos);
return;
}
}
while (p != NULL)
{
if (strcmp(o->data.From, p->data.From) == 0)
{
printf("\n\t列车编号 起点站 终点站 出发时间 到达时间 价格(元/张) 票数(单位:张)\n");
break;
}
p = p->next;
}
TN* pa;
pa = s->next;
while (pa != NULL)
{
if (strcmp(o->data.From, pa->data.From) == 0)
{
printf("\n\t%-15s%-15s%-15s%-15s%-15s%-18d%-16d\n", &pa->data.TrainID, &pa->data.From, &pa->data.To, &pa->data.StartingTime, &pa->data.ArriveTime, pa->data.money, pa->data.ticket);
}
pa = pa->next;
}
TN* pb;
pb = s->next;
while (pb != NULL)
{
if (strcmp(o->data.From, pb->data.From) == 0)
{
printf("\n\t按任意返回列车信息查看界面。\n");
getch();
manager_interface_checkTrain(u, tail, s, rear, managerPassword, currentPos);
return;
}
pb = pb->next;
}
printf("\n\t搜寻不到列车编号为 %s 的信息", &o->data.From);
Sleep(1000);
printf("\n\t自动返回上一级。\n");
Sleep(2000);
manager_interface_checkTrain(u, tail, s, rear, managerPassword,currentPos);
return;
}
void manager_interface_checkTrain_functionFour(UN* u, UN* tail, TN* s, TN* rear, char* managerPassword,int* currentPos)
{
TN* o;
o = (TN*)malloc(sizeof(TN));
if (o == NULL)
{
system("cls");
system("cls");
system("color 0C");
printf("操作失败,自动返回上一级!");
Sleep(2000);
manager_interface_checkTrain(u, tail, s, rear, managerPassword, currentPos);
return;
}
system("cls");
system("color 0A");
printf("\n\t按列车终点站查询列车信息\t\n\n");
TN* p;
p = s->next;
if (p == NULL)
{
system("color 0A");
printf("\n\t当前暂无列车信息。");
Sleep(1000);
printf("\n\t自动返回上一级。\n");
Sleep(2000);
manager_interface_checkTrain(u, tail, s, rear, managerPassword, currentPos);
return;
}
printf("\n\t请输入列车终点站名称:");
clearInputBuffer();
scanf("%s", o->data.To);
for (int i = 0; o->data.To[i] != '\0'; i++)
{
if (o->data.To[i] >= 32 && o->data.To[i] <= 127)
{
printf("\n\t您输入的列车终点站名称格式错误,请重新输入。\n");
Sleep(1000);
manager_interface_checkTrain_functionFour(u, tail, s, rear, managerPassword, currentPos);
return;
}
}
while (p != NULL)
{
if (strcmp(o->data.To, p->data.To) == 0)
{
printf("\n\t列车编号 起点站 终点站 出发时间 到达时间 价格(元/张) 票数(单位:张)\n");
break;
}
p = p->next;
}
TN* pa;
pa = s->next;
while (pa != NULL)
{
if (strcmp(o->data.To, pa->data.To) == 0)
{
printf("\n\t%-15s%-15s%-15s%-15s%-15s%-18d%-16d\n", &pa->data.TrainID, &pa->data.From, &pa->data.To, &pa->data.StartingTime, &pa->data.ArriveTime, pa->data.money, pa->data.ticket);
}
pa = pa->next;
}
TN* pb;
pb = s->next;
while (pb != NULL)
{
if (strcmp(o->data.To, pb->data.To) == 0)
{
printf("\n\t按任意返回列车信息查看界面。\n");
getch();
manager_interface_checkTrain(u, tail, s, rear, managerPassword, currentPos);
return;
}
pb = pb->next;
}
printf("\n\t搜寻不到终点站名称为 %s 的信息", &o->data.To);
Sleep(1000);
printf("\n\t自动返回上一级。\n");
Sleep(2000);
manager_interface_checkTrain(u, tail, s, rear, managerPassword, currentPos);
return;
}
void manager_interface_enterTrain(UN* u,UN* tail,TN* s,TN* rear,char* managerPassword,int* currentPos)
{
system("cls");
system("color 0A");
printf("\t**************************************\t\n");
printf("\t* 列 车 信 息 录 入 界 面 *\t\n");
printf("\t**************************************\t\n");
TN* t;
t = (TN*)malloc(sizeof(TN));
if (t == NULL)
{
system("cls");
system("color 0C");
printf("操作失败,自动返回上一级!");
Sleep(2000);
manager_interface(u, tail, s, rear, managerPassword, currentPos);
return;
}
manager_interface_enterTrain_trainId(u, tail, s, rear, t, managerPassword, currentPos);
manager_interface_enterTrain_trainFrom(u, tail, s, rear, t, managerPassword);
manager_interface_enterTrain_trainTo(u, tail, s, rear, t, managerPassword);
manager_interface_enterTrain_trainStartingTime(u, tail, s, rear, t, managerPassword);
manager_interface_enterTrain_trainArriveTime(u, tail, s, rear, t, managerPassword);
manager_interface_enterTrain_trainMoney(u, tail, s, rear, t, managerPassword);
manager_interface_enterTrain_trainTicket(u, tail, s, rear, t, managerPassword, currentPos);
}
void manager_interface_enterTrain_trainId(UN* u, UN* tail, TN* s, TN* rear,TN* t, char* managerPassword,int* currentPos)
{
printf("\n\t请输入列车编号:");
clearInputBuffer();
scanf("%s", t->data.TrainID);
int length = 0;
length = strlen(t->data.TrainID);
if (length !=5)
{
printf("\n\t您输入的列车编号长度错误,输入长度应为5,请按照正确编号格式(如:A1234)重新输入。\n");
manager_interface_enterTrain_trainId(u, tail, s, rear, t, managerPassword, currentPos);
return;
}
if (t->data.TrainID[0] < 'A' || t->data.TrainID[0]>'Z')
{
printf("\n\t您输入的列车编号第一位应为大写英文,请重新输入。\n");
manager_interface_enterTrain_trainId(u, tail, s, rear, t, managerPassword, currentPos);
return;
}
for (int i = 1; t->data.TrainID[i] != '\0'; i++)
{
if(t->data.TrainID[i]<'0'|| t->data.TrainID[i]>'9')
{
printf("\n\t您输入的列车编号后四位应为数字,请重新输入。\n");
manager_interface_enterTrain_trainId(u, tail, s, rear, t, managerPassword, currentPos);
return;
}
}
TN* to;
to = s->next;
while (to != NULL)
{
if (strcmp(t->data.TrainID, to->data.TrainID) == 0)
{
printf("\n\t该列车编号之前已录入!\n");
Sleep(1000);
printf("\n\t正在跳转,请稍等!\n");
Sleep(2000);
system("cls");
system("color 0A");
while (strcmp(t->data.TrainID, to->data.TrainID) == 0)
{
int a;
nowTime();
printf("\t*********************************\t\n");
printf("\t* 1、重新录入 *\t\n");
printf("\t* 2、返回管理界面 *\t\n");
printf("\t* 3、直接退出系统 *\t\n");
printf("\t*********************************\t\n");
printf("\t请输入您的选择:");
clearInputBuffer();
scanf("%d", &a);
if (a == 1)
{
manager_interface_enterTrain(u, tail, s, rear, managerPassword, currentPos);
free(to);
free(t);
return;
}
else if (a == 2)
{
manager_interface(u, tail, s, rear, managerPassword, currentPos);
free(to);
free(t);
return;
}
else if (a == 3)
{
system("cls");
system("color 09");
printf("\t欢迎下次使用!\n");
Sleep(1000);
exit(0);
}
else
{
system("cls");
system("color 0C");
printf("\n\t输入错误,请重新输入!\n");
Sleep(1000);
system("cls");
system("color 0A");
}
}
}
to = to->next;
}
}
void manager_interface_enterTrain_trainFrom(UN* u, UN* tail, TN* s, TN* rear, TN* t, char* managerPassword)
{
printf("\n\t请输入列车起点站名称(中文):");
clearInputBuffer();
scanf("%s", t->data.From);
for (int i = 0; t->data.From[i]!='\0'; i++)
{
if (t->data.From[i] >= 32 && t->data.From[i] <= 127)
{
printf("\n\t您输入的列车起点站名称格式错误,请重新输入。\n");
manager_interface_enterTrain_trainFrom(u, tail, s, rear, t, managerPassword);
return;
}
}
}
void manager_interface_enterTrain_trainTo(UN* u, UN* tail, TN* s, TN* rear, TN* t, char* managerPassword)
{
printf("\n\t请输入列车终点站名称(中文):");
clearInputBuffer();
scanf("%s", t->data.To);
for (int i = 0; t->data.To[i] != '\0'; i++)
{
if (t->data.To[i] >= 32 && t->data.To[i] <= 127)
{
printf("\n\t您输入的列车终点站名称格式错误,请重新输入。\n");
manager_interface_enterTrain_trainTo(u, tail, s, rear, t, managerPassword);
return;
}
}
if (strcmp(t->data.From, t->data.To) == 0)
{
printf("\n\t您输入的列车终点站名称与列车起点站名称一致,请重新输入。\n");
manager_interface_enterTrain_trainTo(u, tail, s, rear, t, managerPassword);
return;
}
}
void manager_interface_enterTrain_trainStartingTime(UN* u, UN* tail, TN* s, TN* rear, TN* t, char* managerPassword)
{
printf("\n\t请输入列车出发时间(时分格式为00:00):");
clearInputBuffer();
scanf("%s", t->data.StartingTime);
int length = 0;
length = strlen(t->data.StartingTime);
while (length > 5)
{
printf("\n\t您输入的列车出发时间格式错误,请重新输入。\n");
manager_interface_enterTrain_trainStartingTime(u, tail, s, rear, t, managerPassword);
return;
}
if (t->data.StartingTime[0] < '0' || t->data.StartingTime[0]>'2')
{
printf("\n\t您输入的列车出发时间格式错误,请按照24小时计时法重新输入。\n");
manager_interface_enterTrain_trainStartingTime(u, tail, s, rear, t, managerPassword);
return;
}
else if (t->data.StartingTime[1] < '0' || t->data.StartingTime[1]>'9')
{
printf("\n\t您输入的列车出发时间格式错误,请按照24小时计时法重新输入。\n");
manager_interface_enterTrain_trainStartingTime(u, tail, s, rear, t, managerPassword);
return;
}
else if (t->data.StartingTime[3] < '0' || t->data.StartingTime[3]>'5')
{
printf("\n\t您输入的列车出发时间格式错误,请按照24小时计时法重新输入。\n");
manager_interface_enterTrain_trainStartingTime(u, tail, s, rear, t, managerPassword);
return;
}
else if (t->data.StartingTime[4] < '0' || t->data.StartingTime[4]>'9')
{
printf("\n\t您输入的列车出发时间格式错误,请按照24小时计时法重新输入。\n");
manager_interface_enterTrain_trainStartingTime(u, tail, s, rear, t, managerPassword);
return;
}
}
void manager_interface_enterTrain_trainArriveTime(UN* u, UN* tail, TN* s, TN* rear, TN* t, char* managerPassword)
{
printf("\n\t请输入列车到达时间(时分格式为00:00):");
clearInputBuffer();
scanf("%s", t->data.ArriveTime);
int length = 0;
length = strlen(t->data.ArriveTime);
while (length > 5)
{
printf("\n\t您输入的列车到达时间格式错误,请重新输入。\n");
manager_interface_enterTrain_trainArriveTime(u, tail, s, rear, t, managerPassword);
return;
}
if (t->data.ArriveTime[0] < '0' || t->data.ArriveTime[0]>'2')
{
printf("\n\t您输入的列车到达时间格式错误,请按照24小时计时法重新输入。\n");
manager_interface_enterTrain_trainArriveTime(u, tail, s, rear, t, managerPassword);
return;
}
else if (t->data.ArriveTime[1] < '0' || t->data.ArriveTime[1]>'9')
{
printf("\n\t您输入的列车到达时间格式错误,请按照24小时计时法重新输入。\n");
manager_interface_enterTrain_trainArriveTime(u, tail, s, rear, t, managerPassword);
return;
}
else if (t->data.ArriveTime[3] < '0' || t->data.ArriveTime[3]>'5')
{
printf("\n\t输入的列车到达时间格式错误,请按照24小时计时法重新输入。\n");
manager_interface_enterTrain_trainArriveTime(u, tail, s, rear, t, managerPassword);
return;
}
else if (t->data.ArriveTime[4] < '0' || t->data.ArriveTime[4]>'9')
{
printf("\n\t您输入的列车到达时间格式错误,请按照24小时计时法重新输入。\n");
manager_interface_enterTrain_trainArriveTime(u, tail, s, rear, t, managerPassword);
return;
}
}
void manager_interface_enterTrain_trainMoney(UN* u, UN* tail, TN* s, TN* rear, TN* t, char* managerPassword)
{
printf("\n\t请输入列车票价(单位:元(整数)):");
clearInputBuffer();
scanf("%d", &t->data.money);
if (t->data.money < 0 || t->data.money>99999)
{
printf("\n\t您输入的列车票价错误,请重新输入。\n");
manager_interface_enterTrain_trainMoney(u, tail, s, rear, t, managerPassword);
return;
}
}
void manager_interface_enterTrain_trainTicket(UN* u, UN* tail, TN* s, TN* rear, TN* t, char* managerPassword,int* currentPos)
{
printf("\n\t请输入列车票数(单位:张(整数)):");
clearInputBuffer();
scanf("%d", &t->data.ticket);
if (s->next == NULL)
{
rear = s;
}
if (t->data.ticket < 0 || t->data.ticket>6000)
{
printf("\n\t您输入的列车票数错误,请重新输入。\n");
manager_interface_enterTrain_trainTicket(u, tail, s, rear, t, managerPassword, currentPos);
return;
}
t->next = NULL;
rear->next = t;
rear = t;
printf("\n\t列车信息录入成功!");
printf("\t时间:");
nowTime();
printf("\n\n\t自动返回上一级。");
Sleep(2000);
manager_interface(u, tail, s, rear, managerPassword, currentPos);
return;
}
void manager_interface_reviseTrain(UN* u, UN* tail, TN* s, TN* rear, char* managerPassword,int* currentPos)
{
TN* o;
o = (TN*)malloc(sizeof(TN));
if (o == NULL)
{
system("color 0C");
printf("操作失败,自动返回上一级!");
Sleep(2000);
manager_interface(u, tail, s, rear, managerPassword, currentPos);
return;
}
system("cls");
system("color 0A");
printf("\t**************************************\t\n");
printf("\t* 列 车 信 息 修 改 界 面 *\t\n");
printf("\t**************************************\t\n");
TN* tp;
tp = s->next;
if (tp == NULL)
{
system("color 0A");
printf("\n\t当前暂无列车信息。");
Sleep(1000);
printf("\n\t自动返回上一级。\n");
Sleep(2000);
manager_interface(u, tail, s, rear, managerPassword, currentPos);
return;
}
printf("\n\t请输入要修改的列车编号:");
clearInputBuffer();
scanf("%s", o->data.TrainID);
TN* rp;
rp = (TN*)malloc(sizeof(TN));
if (rp == NULL)
{
system("color 0C");
printf("操作失败,自动返回上一级!");
Sleep(2000);
manager_interface(u, tail, s, rear, managerPassword, currentPos);
return;
}
while (tp != NULL)
{
if (strcmp(o->data.TrainID, tp->data.TrainID) == 0)
{
printf("\n\t当前列车信息\n\n");
printf("\n\t列车编号 起点站 终点站 出发时间 到达时间 价格(元/张) 票数(单位:张)\n");
printf("\n\t%-15s%-15s%-15s%-15s%-15s%-18d%-16d\n", &tp->data.TrainID, &tp->data.From, &tp->data.To, &tp->data.StartingTime, &tp->data.ArriveTime, tp->data.money, tp->data.ticket);
manager_interface_reviseTrain_Id(u, tail, s, rear, rp, tp, managerPassword, currentPos);
manager_interface_reviseTrain_From(u, tail, s, rear, rp, tp, managerPassword);
manager_interface_reviseTrain_To(u, tail, s, rear, rp, tp, managerPassword);
manager_interface_reviseTrain_StartingTime(u, tail, s, rear, rp, tp, managerPassword);
manager_interface_reviseTrain_ArriveTime(u, tail, s, rear, rp, tp, managerPassword);
manager_interface_reviseTrain_money(u, tail, s, rear, rp, tp, managerPassword);
manager_interface_reviseTrain_ticket(u, tail, s, rear, rp, tp, managerPassword, currentPos);
}
tp = tp->next;
}
printf("\n搜寻不到列车编号为 %s 的信息", &o->data.TrainID);
Sleep(1000);
printf("\n\t自动返回上一级。\n");
Sleep(2000);
manager_interface(u, tail, s, rear, managerPassword, currentPos);
return;
}
void manager_interface_reviseTrain_Id(UN* u, UN* tail, TN* s, TN* rear, TN* rp,TN* tp, char* managerPassword,int* currentPos)
{
printf("\n\n\t请输入新的列车编号:");
clearInputBuffer();
scanf("%s",rp->data.TrainID);
int length = 0;
length = strlen(rp->data.TrainID);
if (length != 5)
{
printf("\n\t您输入的列车编号长度错误,输入长度应为5,请按照正确编号格式(如:A1234)重新输入。\n");
manager_interface_reviseTrain_Id(u, tail, s, rear, rp, tp, managerPassword, currentPos);
return;
}
if (rp->data.TrainID[0] < 'A' || rp->data.TrainID[0]>'Z')
{
printf("\n\t您输入的列车编号第一位应为大写英文,请重新输入。\n");
manager_interface_reviseTrain_Id(u, tail, s, rear, rp, tp, managerPassword, currentPos);
return;
}
for (int i = 1; rp->data.TrainID[i] != '\0'; i++)
{
if (rp->data.TrainID[i] < '0' || rp->data.TrainID[i]>'9')
{
printf("\n\t您输入的列车编号后四位应为数字,请重新输入。\n");
manager_interface_reviseTrain_Id(u, tail, s, rear, rp, tp, managerPassword, currentPos);
return;
}
}
TN* to;
to = s->next;
while (to != NULL)
{
if (strcmp(rp->data.TrainID, to->data.TrainID) == 0)
{
printf("\n\t该列车编号之前已录入!\n");
Sleep(1000);
printf("\n\t正在跳转,请稍等!\n");
Sleep(2000);
system("cls");
system("color 0A");
int a = 0;
while (strcmp(rp->data.TrainID, to->data.TrainID) == 0)
{
nowTime();
printf("\t*********************************\t\n");
printf("\t* 1、返回列车信息修改界面 *\t\n");
printf("\t* 2、返回管理界面 *\t\n");
printf("\t* 3、直接退出系统 *\t\n");
printf("\t*********************************\t\n");
printf("\t请输入您的选择:");
clearInputBuffer();
scanf("%d", &a);
if (a == 1)
{
manager_interface_reviseTrain(u, tail, s, rear, managerPassword, currentPos);
free(to);
return;
}
else if (a == 2)
{
manager_interface(u, tail, s, rear, managerPassword, currentPos);
free(to);
return;
}
else if (a == 3)
{
system("cls");
system("color 09");
printf("\t欢迎下次使用!\n");
Sleep(1000);
exit(0);
}
else
{
system("cls");
system("color 0C");
printf("\n\t输入错误,请重新输入!\n");
Sleep(1000);
system("cls");
system("color 0A");
}
}
}
to = to->next;
}
memcpy(tp->data.TrainID, rp->data.TrainID, sizeof(rp->data.TrainID));
}
void manager_interface_reviseTrain_From(UN* u, UN* tail, TN* s, TN* rear, TN* rp, TN* tp, char* managerPassword)
{
printf("\n\t请输入新的列车起点站名称:");
clearInputBuffer();
scanf("%s", rp->data.From);
for (int i = 0; rp->data.From[i] != '\0'; i++)
{
if (rp->data.From[i] >= 32 && rp->data.From[i] <= 127)
{
printf("\n\t您输入的列车起点站名称格式错误,请重新输入。\n");
manager_interface_reviseTrain_From(u, tail, s, rear, rp, tp, managerPassword);
return;
}
}
memcpy(tp->data.From, rp->data.From, sizeof(rp->data.From));
}
void manager_interface_reviseTrain_To(UN* u, UN* tail, TN* s, TN* rear, TN* rp, TN* tp, char* managerPassword)
{
printf("\n\t请输入新的列车终点站名称:");
clearInputBuffer();
scanf("%s", rp->data.To);
for (int i = 0; rp->data.To[i] != '\0'; i++)
{
if (rp->data.To[i] >= 32 && rp->data.To[i] <= 127)
{
printf("\n\t您输入的列车终点站名称格式错误,请重新输入。\n");
manager_interface_reviseTrain_To(u, tail, s, rear, rp, tp, managerPassword);
return;
}
}
if (strcmp(rp->data.From, rp->data.To) == 0)
{
printf("\n\t您输入的列车终点站名称与列车起点站名称一致,请重新输入。\n");
manager_interface_reviseTrain_To(u, tail, s, rear, rp, tp, managerPassword);
return;
}
memcpy(tp->data.To, rp->data.To, sizeof(rp->data.To));
}
void manager_interface_reviseTrain_StartingTime(UN* u, UN* tail, TN* s, TN* rear, TN* rp, TN* tp, char* managerPassword)
{
printf("\n\t请输入新的列车出发时间(00:00):");
clearInputBuffer();
scanf("%s", rp->data.StartingTime);
int length = 0;
length = strlen(rp->data.StartingTime);
while (length > 5)
{
printf("\n\t您输入的列车出发时间格式错误,请重新输入。\n");
manager_interface_reviseTrain_StartingTime(u, tail, s, rear, rp, tp, managerPassword);
return;
}
if (rp->data.StartingTime[0] < '0' || rp->data.StartingTime[0]>'2')
{
printf("\n\t您输入的列车出发时间格式错误,请按照24小时计时法重新输入。\n");
manager_interface_reviseTrain_StartingTime(u, tail, s, rear, rp, tp, managerPassword);
return;
}
else if (rp->data.StartingTime[1] < '0' || rp->data.StartingTime[1]>'9')
{
printf("\n\t您输入的列车出发时间格式错误,请按照24小时计时法重新输入。\n");
manager_interface_reviseTrain_StartingTime(u, tail, s, rear, rp, tp, managerPassword);
return;
}
else if (rp->data.StartingTime[3] < '0' || rp->data.StartingTime[3]>'5')
{
printf("\n\t您输入的列车出发时间格式错误,请按照24小时计时法重新输入。\n");
manager_interface_reviseTrain_StartingTime(u, tail, s, rear, rp, tp, managerPassword);
return;
}
else if (rp->data.StartingTime[4] < '0' || rp->data.StartingTime[4]>'9')
{
printf("\n\t您输入的列车出发时间格式错误,请按照24小时计时法重新输入。\n");
manager_interface_reviseTrain_StartingTime(u, tail, s, rear, rp, tp, managerPassword);
return;
}
memcpy(tp->data.StartingTime, rp->data.StartingTime, sizeof(rp->data.StartingTime));
}
void manager_interface_reviseTrain_ArriveTime(UN* u, UN* tail, TN* s, TN* rear, TN* rp, TN* tp, char* managerPassword)
{
printf("\n\t请输入新的列车到达时间(00:00):");
clearInputBuffer();
scanf("%s", rp->data.ArriveTime);
int length = 0;
length = strlen(rp->data.ArriveTime);
while (length > 5)
{
printf("\n\t您输入的列车到达时间格式错误,请重新输入。\n");
manager_interface_reviseTrain_ArriveTime(u, tail, s, rear, rp, tp, managerPassword);
return;
}
if (rp->data.ArriveTime[0] < '0' || rp->data.ArriveTime[0]>'2')
{
printf("\n\t您输入的列车到达时间格式错误,请按照24小时计时法重新输入。\n");
manager_interface_reviseTrain_ArriveTime(u, tail, s, rear, rp, tp, managerPassword);
return;
}
else if (rp->data.ArriveTime[1] < '0' || rp->data.ArriveTime[1]>'9')
{
printf("\n\t您输入的列车到达时间格式错误,请按照24小时计时法重新输入。\n");
manager_interface_reviseTrain_ArriveTime(u, tail, s, rear, rp, tp, managerPassword);
return;
}
else if (rp->data.ArriveTime[3] < '0' || rp->data.ArriveTime[3]>'5')
{
printf("\n\t输入的列车到达时间格式错误,请按照24小时计时法重新输入。\n");
manager_interface_reviseTrain_ArriveTime(u, tail, s, rear, rp, tp, managerPassword);
return;
}
else if (rp->data.ArriveTime[4] < '0' || rp->data.ArriveTime[4]>'9')
{
printf("\n\t您输入的列车到达时间格式错误,请按照24小时计时法重新输入。\n");
manager_interface_reviseTrain_ArriveTime(u, tail, s, rear, rp, tp, managerPassword);
return;
}
memcpy(tp->data.ArriveTime, rp->data.ArriveTime, sizeof(rp->data.ArriveTime));
}
void manager_interface_reviseTrain_money(UN* u, UN* tail, TN* s, TN* rear, TN* rp, TN* tp, char* managerPassword)
{
printf("\n\t请输入新的列车票价格(元):");
clearInputBuffer();
scanf("%d", &rp->data.money);
if (rp->data.money < 0 || rp->data.money>99999)
{
printf("\n\t您输入的列车票价错误,请重新输入。\n");
manager_interface_reviseTrain_money(u, tail, s, rear, rp, tp, managerPassword);
return;
}
tp->data.money = rp->data.money;
}
void manager_interface_reviseTrain_ticket(UN* u, UN* tail, TN* s, TN* rear, TN* rp, TN* tp, char* managerPassword,int* currentPos)
{
printf("\n\t请输入列车票数(单位:张(整数)):");
clearInputBuffer();
scanf("%d", &rp->data.ticket);
if (rp->data.ticket < 0 || rp->data.ticket>6000)
{
printf("\n\t您输入的列车票数错误,请重新输入。\n");
manager_interface_reviseTrain_ticket(u, tail, s, rear, rp, tp, managerPassword, currentPos);
return;
}
tp->data.ticket = rp->data.ticket;
printf("\n\t列车信息修改成功!");
printf("\t时间:");
nowTime();
printf("\n\n\t自动返回上一级。");
Sleep(2000);
manager_interface(u, tail, s, rear, managerPassword, currentPos);
return;
}
void manager_interface_deleteTrain(UN* u, UN* tail, TN* s, TN* rear, char* managerPassword,int* currentPos)
{
TN* o;
o = (TN*)malloc(sizeof(TN));
if (o == NULL)
{
system("color 0C");
printf("操作失败,自动返回上一级!");
Sleep(2000);
manager_interface(u, tail, s, rear, managerPassword, currentPos);
return;
}
system("cls");
system("color 0A");
printf("\t**************************************\t\n");
printf("\t* 列 车 信 息 删 除 界 面 *\t\n");
printf("\t**************************************\t\n");
TN* pt;
pt = s->next;
if (pt == NULL)
{
system("color 0A");
printf("\n\t当前暂无列车信息。");
Sleep(1000);
printf("\n\t自动返回上一级。\n");
Sleep(2000);
manager_interface(u, tail, s, rear, managerPassword, currentPos);
return;
}
printf("\n\t请输入要删除的列车编号:");
clearInputBuffer();
scanf("%s", o->data.TrainID);
int length = 0;
length = strlen(o->data.TrainID);
if (length != 5)
{
printf("\n\t您输入的列车编号长度错误,输入长度应为5,请按照正确编号格式(如:A1234)重新输入。\n");
manager_interface_deleteTrain(u, tail, s, rear, managerPassword, currentPos);
return;
}
if (o->data.TrainID[0] < 'A' || o->data.TrainID[0]>'Z')
{
printf("\n\t您输入的列车编号第一位应为大写英文,请重新输入。\n");
manager_interface_deleteTrain(u, tail, s, rear, managerPassword, currentPos);
return;
}
for (int i = 1; o->data.TrainID[i] != '\0'; i++)
{
if (o->data.TrainID[i] < '0' || o->data.TrainID[i]>'9')
{
printf("\n\t您输入的列车编号后四位应为数字,请重新输入。\n");
manager_interface_deleteTrain(u, tail, s, rear, managerPassword, currentPos);
return;
}
}
while (pt != NULL)
{
if (strcmp(o->data.TrainID, pt->data.TrainID) == 0)
{
if (pt == s->next)
{
s->next = pt->next;
}
else if (pt == rear)
{
TN* de;
de = s->next;
while (de->next != rear)
{
de = de->next;
}
rear = de;
de->next = NULL;
}
else
{
TN* c;
c = s->next;
while (c->next != pt)
{
c = c->next;
}
c->next = pt->next;
}
printf("\n\t列车信息删除成功,自动返回上一级。\n");
Sleep(2000);
manager_interface(u, tail, s, rear, managerPassword, currentPos);
free(pt);
free(o);
return;
}
pt = pt->next;
}
printf("\n搜寻不到列车编号为 %s 的信息", &o->data.TrainID);
Sleep(1000);
printf("\n\t自动返回上一级。\n");
Sleep(2000);
manager_interface(u, tail, s, rear, managerPassword, currentPos);
return;
}
void manager_interface_userInformation(UN* u, UN* tail, TN* s, TN* rear, char* managerPassword,int* currentPos)
{
int h = 0;
while (h < '1' || h > '5')
{
system("cls");
system("color 0A");
nowTime();
printf("\t*********************************\t\n");
printf("\t* 用 户 信 息 界 面 *\t\n");
printf("\t*********************************\t\n");
printf("\t* 1、查看所有用户信息 *\t\n");
printf("\t* 2、按姓名查看用户信息 *\t\n");
printf("\t* 3、按身份证号码查看用户信息 *\t\n");
printf("\t* 4、返回管理界面 *\t\n");
printf("\t* 5、直接退出系统 *\t\n");
printf("\t*********************************\t\n");
printf("\t请输入您的选择:");
clearInputBuffer();
scanf("%d", &h);
if (h == 1)
{
manager_interface_userInformation_functionOne(u, tail, s, rear, managerPassword, currentPos);
return;
}
else if (h == 2)
{
manager_interface_userInformation_functionTwo(u, tail, s, rear, managerPassword, currentPos);
return;
}
else if (h == 3)
{
manager_interface_userInformation_functionThree(u, tail, s, rear, managerPassword, currentPos);
}
else if (h == 4)
{
manager_interface(u, tail, s, rear, managerPassword, currentPos);
return;
}
else if (h == 5)
{
system("cls");
system("color 09");
printf("\t欢迎下次使用!\n");
Sleep(1000);
exit(0);
}
else
{
system("cls");
system("color 0C");
printf("\n\t输入错误,请重新输入!\n");
Sleep(1000);
system("cls");
system("color 0A");
}
}
}
void manager_interface_userInformation_functionOne(UN* u, UN* tail, TN* s, TN* rear, char* managerPassword,int* currentPos)
{
system("cls");
system("color 0A");
printf("\n\t用户信息目录\n\n");
UN* f;
f = u->next;
if (f == NULL)
{
system("color 0A");
printf("\n\t当前暂无用户信息。\n");
Sleep(1000);
printf("\n\t自动返回上一级。\n");
Sleep(2000);
manager_interface_userInformation(u, tail, s, rear, managerPassword, currentPos);
return;
}
while (f != NULL)
{
printf("\n\t*******************************************************************\n");
printf("\n\t姓名:%s", &f->data.Name);
printf("\n\t性别:%s", &f->data.Gender);
printf("\n\t身份证号码:%s", &f->data.ID);
printf("\n\t电话号码:%s", &f->data.PhoneNumber);
printf("\n\t用户名:%s", &f->data.username);
printf("\n\t已购的列车票:");
if (f->data.count == 0)
{
printf("\n\t当前还未购买列车票");
}
else
{
for (int i = f->data.count; i >= 0; i--)
{
printf("%s ", f->data.u_TrainID[i].id);
}
}
printf("\n\t*******************************************************************\n");
f = f->next;
}
printf("\n\t按任意返回用户信息查看界面。\n");
getch();
manager_interface_userInformation(u, tail, s, rear, managerPassword, currentPos);
return;
}
void manager_interface_userInformation_functionTwo(UN* u, UN* tail, TN* s, TN* rear, char* managerPassword,int* currentPos)
{
UN* o;
o = (UN*)malloc(sizeof(UN));
if (o == NULL)
{
system("cls");
system("color 0C");
printf("操作失败,自动返回上一级!");
Sleep(2000);
manager_interface_userInformation(u, tail, s, rear, managerPassword, currentPos);
return;
}
system("cls");
system("color 0A");
printf("\n\t按用户姓名查询用户信息\t\n\n");
UN* f;
f = u->next;
if (f == NULL)
{
system("color 0A");
printf("\n\t当前暂无用户信息。\n");
Sleep(1000);
printf("\n\t自动返回上一级。\n");
Sleep(2000);
manager_interface_userInformation(u, tail, s, rear, managerPassword,currentPos);
return;
}
printf("\n\t请输入用户姓名:");
clearInputBuffer();
scanf("%s", o->data.Name);
for (int i = 0; o->data.Name[i] != '\0'; i++)
{
if (o->data.Name[i] >= 32 && o->data.Name[i] <= 127)
{
printf("\n\t您输入的姓名格式错误,请重新输入。\n");
Sleep(1000);
manager_interface_userInformation_functionTwo(u, tail, s, rear, managerPassword, currentPos);
return;
}
}
while (f != NULL)
{
if (strcmp(o->data.Name, f->data.Name) == 0)
{
printf("\n\t*******************************************************************\n");
printf("\n\t姓名:%s", &f->data.Name);
printf("\n\t性别:%s", &f->data.Gender);
printf("\n\t身份证号码:%s", &f->data.ID);
printf("\n\t电话号码:%s", &f->data.PhoneNumber);
printf("\n\t用户名:%s", &f->data.username);
printf("\n\t已购的列车票:");
if (f->data.count == 0)
{
printf("\n\t当前还未购买列车票");
}
else
{
for (int i = f->data.count; i >= 0; i--)
{
printf("%s ", f->data.u_TrainID[i].id);
}
}
printf("\n\t*******************************************************************\n");
}
f = f->next;
}
printf("\n\t按任意返回用户信息查看界面。\n");
getch();
manager_interface_userInformation(u, tail, s, rear, managerPassword, currentPos);
return;
}
void manager_interface_userInformation_functionThree(UN* u, UN* tail, TN* s, TN* rear, char* managerPassword,int* currentPos)
{
UN* o;
o = (UN*)malloc(sizeof(UN));
if (o == NULL)
{
system("cls");
system("color 0C");
printf("操作失败,自动返回上一级!");
Sleep(2000);
manager_interface_userInformation(u, tail, s, rear, managerPassword, currentPos);
return;
}
system("cls");
system("color 0A");
printf("\n\t按用户身份证号码查询用户信息\t\n\n");
UN* f;
f = u->next;
if (f == NULL)
{
system("color 0A");
printf("\n\t当前暂无用户信息。\n");
Sleep(1000);
printf("\n\t自动返回上一级。\n");
Sleep(2000);
manager_interface_userInformation(u, tail, s, rear, managerPassword, currentPos);
return;
}
printf("\n\t请输入用户身份证号码:");
clearInputBuffer();
scanf("%s", o->data.ID);
int length = 0;
int l = 0;
length = strlen(o->data.ID);
if (length != 18)
{
printf("\n\t您输入的身份证号码长度错误,请重新输入。\n");
Sleep(1000);
manager_interface_userInformation_functionThree(u, tail, s, rear, managerPassword, currentPos);
return;
}
for (int i = 0; i < 17; i++)
{
if (o->data.ID[i] < '0' || o->data.ID[i] > '9')
{
printf("\n\t您输入的身份证号码格式错误,请重新输入。\n");
Sleep(1000);
manager_interface_userInformation_functionThree(u, tail, s, rear, managerPassword, currentPos);
return;
}
}
if (o->data.ID[17] != 'X' && (o->data.ID[17] < '0' || o->data.ID[17] > '9'))
{
printf("\n\t您输入的身份证号码格式错误,请重新输入。\n");
Sleep(1000);
manager_interface_userInformation_functionThree(u, tail, s, rear, managerPassword, currentPos);
return;
}
char province_code[3];
strncpy(province_code, o->data.ID, 2);
province_code[2] = '\0';
int code = atoi(province_code);
if (code < 11 || code > 91)
{
printf("\n\t您输入的身份证号码格式错误,请重新输入。\n");
Sleep(1000);
manager_interface_userInformation_functionThree(u, tail, s, rear, managerPassword, currentPos);
return;
}
char year[5], month[3], day[3];
strncpy(year, o->data.ID + 6, 4);
year[4] = '\0';
strncpy(month, o->data.ID + 10, 2);
month[2] = '\0';
strncpy(day, o->data.ID + 12, 2);
day[2] = '\0';
int y = atoi(year);
int m = atoi(month);
int d = atoi(day);
if (y < 1900 || y > 2021 || m < 1 || m > 12 || d < 1 || d > 31)
{
printf("\n\t您输入的身份证号码格式错误,请重新输入。\n");
Sleep(1000);
manager_interface_userInformation_functionThree(u, tail, s, rear, managerPassword, currentPos);
return;
}
int weights[17] = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };
char checksum[12] = "10X98765432";
int sum = 0;
for (int z = 0; z < 17; z++)
{
sum += (o->data.ID[z] - '0') * weights[z];
}
int remainder = sum % 11;
if (o->data.ID[17] != checksum[remainder])
{
printf("\n\t您输入的身份证号码格式错误,请重新输入。\n");
Sleep(1000);
manager_interface_userInformation_functionThree(u, tail, s, rear, managerPassword, currentPos);
return;
}
while (f != NULL)
{
printf("\n\t*******************************************************************\n");
printf("\n\t姓名:%s", &f->data.Name);
printf("\n\t性别:%s", &f->data.Gender);
printf("\n\t身份证号码:%s", &f->data.ID);
printf("\n\t电话号码:%s", &f->data.PhoneNumber);
printf("\n\t用户名:%s", &f->data.username);
printf("\n\t已购的列车票:");
if (f->data.count == 0)
{
printf("\n\t当前还未购买列车票");
}
else
{
for (int i = f->data.count; i >= 0; i--)
{
printf("%s ", f->data.u_TrainID[i].id);
}
}
printf("\n\t*******************************************************************\n");
f = f->next;
}
printf("\n\t按任意返回用户信息查看界面。\n");
getch();
manager_interface_userInformation(u, tail, s, rear, managerPassword, currentPos);
return;
}
int main()
{
int a = 0;
int currentPos = 0;
TN* s;
TN* rear;
s = (TN*)malloc(sizeof(TN));
if (s == NULL)
{
system("color 0C");
printf("\n\t操作失败,系统异常退出!");
Sleep(2000);
exit(0);
}
s->next = NULL;
rear = s;
UN* u;
UN* tail;
u = (UN*)malloc(sizeof(UN));
if (u == NULL)
{
system("color 0C");
printf("\n\t操作失败,系统异常退出!");
Sleep(2000);
exit(0);
}
u->next = NULL;
tail = u;
system("cls");
system("color 0A");
nowTime();
printf("\t*********************************\t\n");
printf("\t* 欢 迎 使 用 火 车 购 票 系 统 *\t\n");
printf("\t*********************************\t\n");
printf("\t* 1、进入客户端 *\t\n");
printf("\t* 2、进入管理端 *\t\n");
printf("\t* 3、直接退出系统 *\t\n");
printf("\t*********************************\t\n");
printf("\t请输入您的选择:");
while (scanf("%d", &a) != 1)
{
system("cls");
system("color 0C");
printf("\t输入错误,请重新输入!\n");
Sleep(1000);
clearInputBuffer();
goBack(u, tail, s, rear, currentPos);
return;
}
if (a == 1)
{
user(u, tail, s, rear, currentPos);
return;
}
else if (a == 2)
{
manager(u, tail, s, rear, currentPos);
return;
}
else if (a == 3)
{
system("cls");
system("color 09");
printf("\t欢迎下次使用!\n");
Sleep(1000);
exit(0);
}
else
{
system("cls");
system("color 0C");
printf("\t输入错误,请重新输入!\n");
Sleep(1000);
goBack(u, tail, s, rear, currentPos);
return;
}
return 0;
}