汽⻋站⻋票管理系统
系统概述
1.1项⽬来源
随着时代的进步,社会的发展,⼈们的⽣活形式与习惯也越来越多样化,出
⾏成为了⼈们⽣活中的⼀个重要组成部分,⽽汽⻋成为许多⼈出⾏选择的交
通⼯具。⾯对巨⼤数量的乘客的购票需要,汽⻋站就要选择使⽤先进的管理
⽅法来实现⽅便、快捷的售票、退票等⽅⾯的票务管理。随着计算机的普
及,信息处理量的逐渐扩⼤,⼿⼯处理⽅式远远不能满⾜⼈们管理活动的需
要,各种⼯作都逐渐由⼿⼯转为⾃动化,使许多复杂、繁琐、且需要很多⼈
⼒的⼯作变得简单。汽⻋站每天产⽣售票、退票等⾏为数量多,使得汽⻋站
售票管理的数据量⼤,⽽且速度要求要快,传统的⼈⼒⾏为适应,计算机应
⽤软件的使⽤则能很好地满⾜汽⻋站的这⼀需要,提⾼售票⼈员的⼯作效
率,节约相关管理成本。
1.2项⽬⽬标
本系统的任务⽬标是:实现⽅便、快速售票;是⽤⼾准确了解售票情况,提
供多种查询和统计功能;实现系统的安全性设置,使系统本⾝具备⼀定的维
护功能。
1.3项⽬价值
通过本系统的应⽤来提⾼售票⼈员的⼯作频率,节省售票所需时间。系统可
利⽤数据库⾃⾝的数据连接等功能使⽤⼾能够实现不同条件的查询,避免过
多的⼈⼒资源的利⽤⽽且可靠⾏⾼、成本低。
功能讲解
项⽬主窗⼝与次窗⼝如下所⽰:
⻋票的数据如下图所⽰:
本系统分别为管理员提供如下功能:
- 增加⻋次信息
- 查看所有⻋次信息
- ⻋辆信息查询
- 注销⻋次
同时针对管理员⾝份的特殊性, 为管理员添加了⾝份认证模块, 需要输⼊
正确的账号密码才能进⼊管理员窗⼝
本系统分别为顾客提供了如下功能:
- ⻋辆信息查询 (可以通过⻋次, 或者终点站查询)
- 购买⻋票(只有系统距发⻋时间⼤于10分钟才可购票)
- 退票(只有系统距发⻋时间⼤于10分钟才可退票)
同时在购票时会判断剩余⻋票是否⾜够, 如果不够, ⽆法进⾏购票, 在
买票后, 会将当⽇⽇志写⼊⽇志⽂件中
数据结构
本系统采⽤结构体存储⻋票信息, 如下所⽰:
typedef struct
{
char no[10] = { '\0' }; / * 班次
int hour; / * 发⻋时间*⼩时
int minute; / * 发⻋时间 * 分钟
char Starting_station[10] = { '\0' }; / * 始发站
char Last_station[10] = { '\0' }; / * 终点站
float time; / * ⾏⻋时⻓
int fare; / * 票价
int max_number; / * 最⼤载客量
int sold_number; / * 以售票数
}Timetable;
调用关系图
程序源码
头⽂件:
head.h
#pragma once
#pragma warning (disable:4996)
#pragma warning (disable:5208)
#include<iostream>
#include<fstream>
#include<iomanip>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#include <windows.h>
#include <ctime>
#define LEN sizeof(Timetable)
using namespace std;
function.h
#pragma once
/ * 定义结构体
typedef struct
{
char no[10] = { '\0' }; / * 班次
int hour; / * 发⻋时间*⼩时
int minute; / * 发⻋时间 * 分钟
char Starting_station[10] = { '\0' }; / * 始发站
char Last_station[10] = { '\0' }; / * 终点站
float time; / * ⾏⻋时⻓
int fare; / * 票价
int max_number; / * 最⼤载客量
int sold_number; / * 以售票数
}Timetable;
//====================================================
======================================
/ * 主函数之间的函数声明
void AdminMode(Timetable* timetables, char* filename);
void PassagerMode(Timetable* timetables, char*
filename);
//====================================================
===========================================
/ * 窗⼝函数的声明
int MainWindowSelect();
int AdminWindowSelect();
int PassagerWindowSelect();
//====================================================
======================================================
=======
/ * 预处理和结束后处理的函数声明
void Signin(); / * 登录
int ReadFromFile(Timetable* timetables, int n, char*
filename); / * 从⽂件中读⼊
int WritetoFile(Timetable* timetables, int n, char*
filename); / * 将数据保存到⽂件中
void GenerateLogFileName(char* LogFileName); / * 根据当
天⽇期⽣成⽇志名
int InitializationPassagerMode(Timetable* timetables,
char* LogFileName,
char* filename); / * 初始化乘客模式,如果有⽇志,就读⽇
志,如果没有,就读取⻋次⽂件
void SortbyTime(Timetable* timetables, int n); / * 将
timetable⾥⾯的元素按照发⻋的时间进⾏排序
int Quit(); / * 退出程序
/ * 传⼊相应的⻋次号,判断是否停⽌售票和退票
int StopSevice(Timetable* timetables, int n, char*
no);
//====================================================
======================================================
===========
/ * 管理员的函数
int AddBus(Timetable* timetables, int n); / * 添加⻋次
void ShowTimeTable(Timetable* timetables, int n); / *
列出所有⻋次
void Query(Timetable* timetables, int n); / * 查询⻋次
int DelBus(Timetable* timetables, int n); / * 删除⻋次
//====================================================
===================================
/ * 乘客的函数
void TicketOrder(Timetable* timetables, int n); / * 订
票
void TicketDelete(Timetable* timetables, int n); / *
退票
/
======================================================
===================================
/ * 辅助的界⾯设计的函数
void Enter(); /输⼊回⻋
void Space(); /输⼊20个空格
void Star(); /输⼊星形
/
======================================================
=======================================
/ * 主要功能函数中间的辅助函数
/ * 选择查询的⽅式
int QueryChioce();
/ * 输出下标为i的timetables结构体⾥⾯的所有值
void OutPutBus(Timetable* timetables, int i);
/ * 输⼊⻋次号,返回下标
int find(Timetable* timetables, int n, char* no);
/ * 按终点站进⾏查询,返回终点站的数⽬,数组b[]返回终点站的下
标
int find(Timetable* timetables, int n, char*
Last_station, int* b);
/ * ⽣成⽇志⽂件
void BuildLogFile(char* LogFileName);
/ * 在每列前⾯显⽰每列信息名字
void BeforeOutPutBus();
/ * 输出下标为i的timetables结构体⾥⾯的所有值(管理员版本)
void OutPutBus_2(Timetable* timetables, int i);
/ * 在每列前⾯显⽰每列信息名字(管理员版本)
void BeforeOutPutBus_2();
BusStation.cpp
#include"head.h"
#include"function.h"
int main()
{
char filename[20];
strcpy(filename, "C:\\Users\\He\\Desktop\\bus.txt");
int UserChoice;// * 用户的选择
Timetable timetables[100];
while (1)
{
switch (UserChoice = MainWindowSelect())
{
case 1: AdminMode(timetables, filename); break;
case 2: PassagerMode(timetables, filename); break;
case 3: if (Quit() != 1)
continue;
}
if (UserChoice == 3)
break;
}
return 0;
}
void AdminMode(Timetable* timetables, char* filename)// * 这里可能要改
{
Signin();// * 登录,到时候要加回来
int n = ReadFromFile(timetables, 0, filename);
while (1)
{
system("cls");
int AdminChoice = AdminWindowSelect();
switch (AdminChoice)
{
case 1: n = AddBus(timetables, n); // * 添加车次信息
WritetoFile(timetables, n, filename);
system("pause");
break;
case 2: ShowTimeTable(timetables, n); // * 浏览时刻表
system("pause");
break;
case 3: Query(timetables, n); // * 车辆信息查询
system("pause");
break;
case 4: n = DelBus(timetables, n); // * 删除车辆信息
system("pause");
WritetoFile(timetables, n, filename);
break;
case 5: WritetoFile(timetables, n, filename); // * 返回上级菜单
return;
}
}
}
void PassagerMode(Timetable* timetables, char* filename)
{
char LogFileName[200];
GenerateLogFileName(LogFileName);// * 根据当天的日期生成日志名称
int n = InitializationPassagerMode(timetables, LogFileName, filename);
int PassagerChoice;
while (1)
{
system("cls");
switch (PassagerChoice = PassagerWindowSelect())
{
case 1: Query(timetables, n); // * 查找车辆信息
system("pause");
break;
case 2: TicketOrder(timetables, n); // * 购买车票
WritetoFile(timetables, n, LogFileName);
system("pause");
break;
case 3: TicketDelete(timetables, n); // * 退回车票
WritetoFile(timetables, n, LogFileName);
system("pause");
break;
case 4: WritetoFile(timetables, n, LogFileName);
return;
}
}
}
passage.cpp
#include"head.h"
#include"function.h"
// * 初始化乘客模式,如果有日志,就读日志,如果没有,就读取车次文件
int InitializationPassagerMode(Timetable* timetables, char* LogFileName, char* filename)
{
int n;// * 统计车次数量
int i; // * 将车次的售票量初始化为0的循环变量
fstream file_log;// * 定义日志文件操作
fstream file;// * 定义bus.txt的操作
file_log.open(LogFileName, ios::in);
if (file_log.fail())
{
// BuildLogFile(LogFileName);// * 这个函数有点没用了
n = ReadFromFile(timetables, 0, filename);
for (i = 0; i < n; i++)
{
timetables[i].sold_number = 0;
}
WritetoFile(timetables, n, LogFileName);
return n;
}
file_log.close();
n = ReadFromFile(timetables, 0, LogFileName);
return n;
}
// * 订票
void TicketOrder(Timetable* timetables, int n)
{
char find_no[20];// * 要购买的车次
int num;
cout << "\n\n\n";
Space();
Space();
cout << "请输入要购买的车次:";
cin >> find_no;// * 输入要购买的车次
// * 判断车次是否存在
if (find(timetables, n, find_no) == -1)
{
Space();
Space();
cout << "车次不存在" << endl;
return;
}
// * 判断无法购票的条件
if (StopSevice(timetables, n, find_no))
{
Space();
Space();
cout << "无法购票!(即将发车或已经发车)" << endl;
return;
}
Space();
Space();
cout << "请输入要购买数目:";
cin >> num;// * 输入要购买数目
if ((timetables[find(timetables, n, find_no)].max_number
- timetables[find(timetables, n, find_no)].sold_number) < num)
{
Space();
Space();
cout << "余票不足!" << endl;
return;
}
timetables[find(timetables, n, find_no)].sold_number += num;
}
// * 退票
void TicketDelete(Timetable* timetables, int n)
{
char find_no[20];// * 要退票的车次
int num;// * 退票数量
cout << "\n\n\n";
Space();
Space();
cout << "请输入要退票的车次:";
cin >> find_no;// * 输入要退票的车次
// * 判断车次是否存在
if (find(timetables, n, find_no) == -1)
{
Space();
Space();
cout << "车次不存在" << endl;
return;
}
// * 判断无法退票的条件
if (StopSevice(timetables, n, find_no))
{
Space();
Space();
cout << "无法退票!(即将发车或已经发车)" << endl;
return;
}
Space();
Space();
cout << "请输入要退票数目:";
cin >> num;// * 输入要退票数目
if (timetables[find(timetables, n, find_no)].sold_number < num)
{
Space();
Space();
cout << "输入退票数目有误!" << endl;
return;
}
timetables[find(timetables, n, find_no)].sold_number -= num;
}
运行截图