转载声明出处:http://blog.csdn.net/why850901938/article/details/51702916
程序设计题七: 票务管理系统
【问题描述】
一火车站每天有n个发车班次,每个班次都有一班次号,固定的发车时间,固定的路线(起始站、终点站),大致的行车时间,固定的额定载客量,如:
车次 发车时间 起点站 终点站 行车时间 额定载量 余票数量
K234 8:00 南京 广州 12 1100 30
K211 6:30 南京西 成都 18 1500 40
T25 7:00 北京 广州 24 1700 20
T58 10:00 南京 上海 2 800 2
该系统要求对一个文件中所存储的票务信息进行各种常规操作,如:查询、计算、显示等功能。通过此课题,熟练掌握文件、数组、指针的各种操作,以及一些算法思想的应用,实现一个简单的票务管理系统。
【功能要求】
(1)录入班次信息(信息用文件保存number.dat),可随时增加新车次数据
(2)浏览班次信息,可显示出所有车次当前状况(如果当前系统时间超过了某班次的发车时间,则显示“此车已发出”的提示信息)。
(3)查询路线:可按班次号、终点站查询售票情况。
(4)根据发车时间给出顺序的发车时间表(排序方法自选),存入文件保存(sort.dat)。
(5)售票和退票功能
当查询出已定票人数小于额定载量且当前系统时间小于发车时间时才能售票,自动更新余票数量。
退票时,输入退票的班次,当本车次发出前半小时才可以退票,自动更新已售票人数
【程序设计的具体说明】
数据结构:
依据给定的学生信息和数据格式,结构数组的分量必须用结构实现; 结构类型的层次结构:
class ticket
车次 字符串 char no[9]
起点站 字符串 char name_b[10] (尽量用汉字)
终点站 字符串 char name_e[10] (尽量用汉字)
发车时间与行车时间
class Time
int hour
int minute
额定载量 int load
余票数量 int remainder
【程序设计的开发环境】
VC++6.0,在内存中的各种存储可以采用数组方式。
仅能实现上述的简单功能,还有很多想法没有时间弄了,以后补锅吧;
提2点自己的想法,比如:
1.登录系统,包括管理员的登录系统和用户的登录,还有使用权限。
2.文件的删减,修改功能。目前只能添加,不能删减。
代码如下:
#include<stdio.h>
#include<string.h>
#include<time.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
const int MAX = 100;
const int MIN = 20;
const int TRUE = 1;
const int FALSE = 0;
struct time
{
int hour;
int minutes;
};
struct ticket
{
char SerialNumber[10]; //车次
struct time SetOut; //发车时间
char DeparturePoint[MAX]; //离站
char TerminalPoint[MAX]; //终点站
float LastTime; //持续时间
int Edingzailiang; //额定载亮
int Yidingpiaorenshu; //已订票人数
};
struct ticket train[100];
struct ticket trainBySort[100];
int FLAG = FALSE;
int RecordNumber; //宏定义的当前记录位置
void ShowMessage(void); /*载入原始数据 */
void MainMenu(void); /*主菜单 */
void InputMessage(void); /*录入班次信息 */
void SearchMenu(void); /*查询路线子菜单 */
void SearchByNumber(void); /*按班次号查询 */
void SearchByAddress(void); /*按终点站查询 */
void TicketManagement(void); /*车票售出与退回 */
void TicketOrder(void); /*售票 */
void TicketDelete(void); /*退票 */
void exit(void); /*退出该系统 */
void SaveRecordBySort(ticket x); /*储存信息到文件中*/
void Read(void); /*展示车次文件信息*/
//int Login();
void SortBySetOut(void);
bool cmp1(ticket X, ticket Y);
bool cmp2(ticket X, ticket Y);
void ReadBySort(void);
void ShowMessageBySort(void);
int main(void)
{
while (FLAG == FALSE)
{
MainMenu();
}
return 0;
}
void MainMenu(void)
{
system("title 车票管理系统");//设置cmd窗口标题
system("color 0A");
system("mode con: cols=75 lines=30"); /*对运行是的界面大小做出规定*/
char functionNumber;
printf(" 车票管理系统\n\n");
printf(" By:南邮计软院程序设计组\n");
time_t rawtime;
struct tm *timeinfo;
time(&rawtime);
timeinfo = localtime(&rawtime);
printf(" 当前时间:%d点%d分", timeinfo->tm_hour, timeinfo->tm_min);
printf("\n");
printf(" ┏━━━━━━━━━━━━━━━━━━┓\n");
printf(" ┃ 1.录入班次信息 ┃\t\n");
printf(" ┃ 2.浏览班次信息 ┃\t\n");
printf(" ┃ 3.查询行车路线 ┃\t\n");
printf(" ┃ 4.根据发车时间的发车时间表 ┃\t\n");
printf(" ┃ 5.售票与退票系统 ┃\t\n");
printf(" ┃ 6.退出该系统 ┃\t\n");
printf(" ┗━━━━━━━━━━━━━━━━━━┛\n");
printf("\n");
/*功能导入*/
printf(" 请选择你所需要的功能:");
Read(); /*读入文件的已经有的部分*/
scanf("%c", &functionNumber);
switch (functionNumber)
{
case ‘1‘:
{
InputMessage(); /*进入信息录入*/
printf("\n按任意键回主菜单......\n");
getchar();
getchar();
}
break;
case ‘2‘:
{
//RecordNumber=ShowMessage(); /*进入浏览信息*/
ShowMessage();
printf("\n按任意键回主菜单......\n");
getchar();
getchar();
}
break;
case ‘3‘:
{
SearchMenu(); /*进入查询子菜单*/
printf("\n按任意键回主菜单......\n");
getchar();
getchar();
}
break;
case ‘4‘:
{
SortBySetOut();
ReadBySort();
ShowMessageBySort();
getchar();
getchar();
}
break;
case ‘5‘:
{
TicketManagement(); /*进入票务管理*/
getchar();
getchar();
}
break;
case ‘6‘:
{
FLAG = TRUE;
exit();
}
break;
default:
{
printf("输入错误,请确保你的输入为1--5.\n"); /*输入操作失误,返回重新输入*/
printf("按任意键回主菜单......\n");
getchar();
getchar();
}
}
FLAG = FALSE;
}
void InputMessage(void)
{
char yn;
FILE *fp;/*再此通过文件指针添加引用文件*/
int i = RecordNumber;
if ((fp = fopen("number.dat","a")) == NULL) /*如果文件为空,则文件打不开*/
{
printf("不能打开文件\n");
return;
}
do
{ /*信息录入的“do-while”循环函数*/
printf("车次:\n");
scanf("%s", train[i].SerialNumber);
printf("发车时间:(输入格式:12:30)\n");
scanf("%d:%d", &train[i].SetOut.hour, &train[i].SetOut.minutes);
if (train[i].SetOut.hour>23 || train[i].SetOut.minutes>59) /*判断当前输入的列车时间是否有误*/
{
printf("输入时间有误,请重新输入\n"); /*输入有误则进行重新输入*/
getchar();
}
printf("始发站:\n");
scanf("%s", &train[i].DeparturePoint);
printf("终点站:\n");
scanf("%s", &train[i].TerminalPoint);
printf("行车时间:(输入格式:5或5.5)\n");
scanf("%f", &train[i].LastTime);
printf("额定载量:\n");
scanf("%d", &train[i].Edingzailiang);
printf("已定票人数:\n");
scanf("%d", &train[i].Yidingpiaorenshu);
while (train[i].Yidingpiaorenshu > train[i].Edingzailiang) /*判断此车票是否售完*/
{
printf("输入数据有误,请重新输入\n");
printf("已定票人数:\n");
scanf("%d", &train[i].Yidingpiaorenshu);
}
fprintf(fp, "\n%s\t%d\t%d\t\t", train[i].SerialNumber, train[i].SetOut.hour, train[i].SetOut.minutes);
fprintf(fp, "%s\t%s\t\t%.1f\t %d\t\t%d", train[i].DeparturePoint, train[i].TerminalPoint, train[i].LastTime, train[i].Edingzailiang, train[i].Yidingpiaorenshu);
i++;
getchar();
printf("是否继续录入?y/n\n");
yn = getchar();
} while (yn == ‘Y‘ || yn == ‘y‘); /*对是否继续进行循环进行判断*/
RecordNumber = i;
fclose(fp); /*运行完毕关闭文件*/
return;
}
void ShowMessage(void)
{
int i = 0;
FILE *fp;
if ((fp = fopen("number.dat", "r")) == NULL)
{
printf("读取数据失败,请检查文件number.dat是否存在.\n");
exit(-1);
}
printf("班次\t发车时间\t起点\t终点\t行车时间(小时)\t额定载量\t已定票人数\n");
for (i = 0; i < RecordNumber; i++)
{
printf("%s\t%d:%d\t\t", train[i].SerialNumber, train[i].SetOut.hour, train[i].SetOut.minutes);
printf("%s\t%s\t\t%.1f\t %d\t\t%d\t", train[i].DeparturePoint, train[i].TerminalPoint, train[i].LastTime, train[i].Edingzailiang, train[i].Yidingpiaorenshu);/******* 调用系统时间实现的功能:如果车已发出,则打出提示"此车已发出"******/
time_t rawtime; /*在此处引用能够调用系统时间的“time”结构体,调用系统时间*/
struct tm * timeinfo;
time(&rawtime);
timeinfo = localtime(&rawtime);
if ((timeinfo->tm_hour == train[i].SetOut.hour && timeinfo->tm_min >= train[i].SetOut.minutes) || (timeinfo->tm_hour > train[i].SetOut.hour)) /*将发车时间与此时系统时间作比较,判断此车是否发出*/
printf("此车已发出!\n");
else
printf("此车尚未发出!\n");
}
fclose(fp); /*运行完毕关闭文件*/
return;
}
void SearchMenu(void)
{
system("mode con: cols=140 lines=130"); /*对运行是的界面大小做出规定*/
char functionNumber;
printf(" 当前为查询菜单\n");
printf(" ┏━━━━━━━━━━━━━━━━━━┓\t\n");
printf(" ┃ 1.按班次号查询 ┃\t\n");
printf(" ┃ 2.按终点站查询 ┃\t\n");
printf(" ┃ 3.返回主菜单 ┃\t\n");
printf(" ┗━━━━━━━━━━━━━━━━━━┛\n");
printf("请选择你所需要的功能:");
scanf("%*c%c", &functionNumber);
//printf("functionNumber\n");//问题
switch (functionNumber)
{
case ‘1‘:
SearchByNumber(); break; /*进入按班次查询 */
case ‘2‘:
SearchByAddress(); break; /*进入按终点查询 */
case ‘3‘: /*返回主菜单 */
getchar();
MainMenu();
break;
default:
printf("输入错误,请确保你的输入为1--3.\n"); /*输入操作有误提示*/
printf("按任意键回查询子菜单......\n"); /*返回并重新输入 */
getchar();
SearchMenu();
}
}
void SearchByNumber(void)
{
int i;
char SearchNumber[10];
printf("请输入要查询的班次号:");
scanf("%s", SearchNumber);
for (i = 0; i < RecordNumber; i++)
{
if ((strcmp(SearchNumber, train[i].SerialNumber)) == 0)
{
printf("班次\t发车时间\t起点\t终点\t行车时间(小时)\t额定载量\t已定票人数\n");
printf("%s\t%d:%d\t\t", train[i].SerialNumber, train[i].SetOut.hour, train[i].SetOut.minutes);
printf("%s\t%s\t\t%.1f\t %d\t\t%d\n", train[i].DeparturePoint, train[i].TerminalPoint, train[i].LastTime, train[i].Edingzailiang, train[i].Yidingpiaorenshu);
}
}
// printf("班次\t发车时间\t起点\t终点\t行车时间(小时)\t额定载量\t已定票人数\n");
// printf("%d\t%d:%d\t\t",train[SearchNumber-1].SerialNumber,train[SearchNumber-1].SetOut.hour,train[SearchNumber-1].SetOut.minutes);
// printf("%s\t%s\t\t%.1f\t %d\t\t%d\n",train[SearchNumber-1].DeparturePoint,train[SearchNumber-1].TerminalPoint,train[SearchNumber-1].LastTime,train[SearchNumber-1].Edingzailiang,train[SearchNumber-1].Yidingpiaorenshu);
}
void SearchByAddress(void)
{
int i;
char Address[MAX];
printf("请输入终点站的名称:");
scanf("%s", &Address);
printf("班次\t发车时间\t起点\t终点\t行车时间(小时)\t额定载量\t已定票人数\n");
for (i = 0; i < RecordNumber; i++)
{
if ((strcmp(Address, train[i].TerminalPoint)) == 0)
{
printf("%s\t%d:%d\t\t", train[i].SerialNumber, train[i].SetOut.hour, train[i].SetOut.minutes);
printf("%s\t%s\t\t%.1f\t %d\t\t%d\n", train[i].DeparturePoint, train[i].TerminalPoint, train[i].LastTime, train[i].Edingzailiang, train[i].Yidingpiaorenshu);
}
}
}
void TicketManagement(void)
{
char functionNumber;
system("mode con: cols=140 lines=130");
printf(" 订票与退票菜单\n");
printf(" ┏━━━━━━━━━━━━━━━━━━┓\n");
printf(" ┃ 1.订票 ┃ \t\n");
printf(" ┃ 2.退票 ┃\t\n");
printf(" ┃ 3.返回主菜单 ┃\t\n");
printf(" ┗━━━━━━━━━━━━━━━━━━┛\n");
printf("选择你需要的功能:");
scanf("%*c%c", &functionNumber);
switch (functionNumber)
{
case ‘1‘:TicketOrder(); break;
case ‘2‘:TicketDelete(); break;
case ‘3‘:
{
getchar();
MainMenu();
}
break;
default:
{
printf("输入错误,请确保你的输入为1--3.\n");
printf("按任意键返回管理界面\n");
getchar();
TicketManagement();
}
}
}
void TicketOrder(void)
{
int i;
time_t rawtime;
struct tm * timeinfo;
printf("请输入要订购的车票的班次:");
scanf("%d", &i);
printf("i=%d\n", i);
if (i < 1 || i > RecordNumber + 1)
{
printf("对不起,今天没有这趟车,请明天再来,谢谢使用!\n");
printf("按任意键回主菜单......\n");
getchar();
MainMenu();
}
time(&rawtime);
timeinfo = localtime(&rawtime);
printf("ff=%d\n", timeinfo->tm_hour);
if ((timeinfo->tm_hour == train[i - 1].SetOut.hour&&timeinfo->tm_min < train[i - 1].SetOut.minutes) || (timeinfo->tm_hour < train[i - 1].SetOut.hour))
{
if (train[i - 1].Yidingpiaorenshu < train[i - 1].Edingzailiang)
{
(train[i - 1].Yidingpiaorenshu)++;
printf("你的订票成功,请按时上车,谢谢使用!\n");
}
else printf("对不起,今天的这趟车的票已卖完,请明天再来,谢谢合作!\n");
}
else
printf("对不起,今天的这趟车已发出,请明天再来,谢谢合作!\n");
printf("班次\t发车时间\t起点\t终点\t行车时间(小时)\t额定载量\t已定票人数\n");
printf("%s\t%d:%d\t\t", train[i - 1].SerialNumber, train[i - 1].SetOut.hour, train[i - 1].SetOut.minutes);
printf("%s\t%s\t\t%.1f\t%d\t\t%d\n", train[i - 1].DeparturePoint, train[i - 1].TerminalPoint, train[i - 1].LastTime, train[i - 1].Edingzailiang, train[i - 1].Yidingpiaorenshu);
printf("按任意键回主菜单......\n");
getchar(); //问题2
getchar();
MainMenu();
}
void TicketDelete(void)
{
int i;
printf("请输入要退购的车票的班次:");
scanf("%d", &i);
if (i < 1 || i > RecordNumber + 1)
{
printf("对不起,今天没有这趟车,无法完成退票.谢谢使用!\n");
getchar();
getchar();
TicketManagement();
}
time_t rawtime;
struct tm * timeinfo;
time(&rawtime);
timeinfo = localtime(&rawtime);
if ((timeinfo->tm_hour == train[i - 1].SetOut.hour && timeinfo->tm_min < train[i - 1].SetOut.minutes) || (timeinfo->tm_hour < train[i - 1].SetOut.hour))
{
if (train[i - 1].Yidingpiaorenshu >= 1)
{
train[i - 1].Yidingpiaorenshu -= 1;
printf("退订车票成功,谢谢使用!\n");
}
else
printf("对不起,今天的这趟车的票尚未卖出,无法完成退票!\n");
}
else
printf("对不起,今天的这趟车已发出,无法完成退票!\n");
printf("班次\t发车时间\t起点\t终点\t行车时间(小时)\t额定载量\t已定票人数\n");
printf("%s\t%d:%d\t\t", train[i - 1].SerialNumber, train[i - 1].SetOut.hour, train[i - 1].SetOut.minutes);
printf("%s\t%s\t\t%.1f\t%d\t\t%d\n", train[i - 1].DeparturePoint, train[i - 1].TerminalPoint, train[i - 1].LastTime, train[i - 1].Edingzailiang, train[i - 1].Yidingpiaorenshu);
printf("按任意键回主菜单......\n");
getchar();
getchar();
MainMenu();
}
void exit(void)
{
printf("\n\n*********************谢谢使用本系统,欢迎下次继续使用***********************\n");
exit(0);
}
void SaveRecordBySort(ticket x) //问题3
{
FILE *fp2;
fp2 = fopen("sort.dat", "a");
if (fp2 == NULL)
{
printf("打开文件sort.dat失败\n");
exit(0);
}
fprintf(fp2, "\n%s\t%d\t%d\t\t", x.SerialNumber, x.SetOut.hour, x.SetOut.minutes);
fprintf(fp2, "%s\t%s\t\t%.1f\t%d\t\t%d", x.DeparturePoint, x.TerminalPoint, x.LastTime, x.Edingzailiang, x.Yidingpiaorenshu);
fclose(fp2);
return ;
}
void Read(void) //问题4
{
int i;
FILE *fp;
if ((fp = fopen("number.dat", "r")) == NULL)
{
exit(-1);
}
for (i = 0; !feof(fp); i++)
{
fscanf(fp, "%s%d%d", train[i].SerialNumber, &train[i].SetOut.hour, &train[i].SetOut.minutes);
fscanf(fp, "%s%s%f%d%d", train[i].DeparturePoint, train[i].TerminalPoint, &train[i].LastTime, &train[i].Edingzailiang, &train[i].Yidingpiaorenshu);
}
RecordNumber = i;
fclose(fp);
return;
}
// int Login()/*超级随意的登录*/
// {
// char a[16]="Admin";
// char b[16]="Admin";
// char username[16],password[16];
// do
// {
// printf("请输入您的用户名:\n");
// scanf("%s",&username);
// printf("请输入您的密码:\n");
// scanf("%s",&password);
// if((strcmp(a,username)&&strcmp(b,password))==0)
// {
// printf("恭喜您!登陆成功\n");
// return 1;
// }
// else
// printf("您用户名和密码不一致,请重新输入");
// }while((strcmp(a,username)&&strcmp(b,password))!=0);
// return 0;
// }
void SortBySetOut(void)
{
getchar();
int n = RecordNumber;
sort(train, train + n, cmp2);
sort(train, train + n, cmp1);
for (int i = 0; i<RecordNumber; i++)
{
SaveRecordBySort(train[i]);
}
}
bool cmp1(ticket X, ticket Y)
{
return X.SetOut.hour<Y.SetOut.hour;
}
bool cmp2(ticket X, ticket Y)
{
return X.SetOut.minutes<Y.SetOut.minutes;
}
void ShowMessageBySort(void)
{
int i = 0;
printf("班次\t发车时间\t起点\t终点\t行车时间(小时)\t额定载量\t已定票人数\n");
for (i = 0; i <= RecordNumber; i++)
{
printf("%s\t%d:%d\t\t", trainBySort[i].SerialNumber, trainBySort[i].SetOut.hour, trainBySort[i].SetOut.minutes);
printf("%s\t%s\t\t%.1f\t %d\t\t%d\t", trainBySort[i].DeparturePoint, trainBySort[i].TerminalPoint, trainBySort[i].LastTime, trainBySort[i].Edingzailiang, trainBySort[i].Yidingpiaorenshu);/******* 调用系统时间实现的功能:如果车已发出,则打出提示"此车已发出"******/
time_t rawtime; /*在此处引用能够调用系统时间的“time”结构体,调用系统时间*/
struct tm * timeinfo;
time(&rawtime);
timeinfo = localtime(&rawtime);
if ((timeinfo->tm_hour == trainBySort[i].SetOut.hour && timeinfo->tm_min >= trainBySort[i].SetOut.minutes) || (timeinfo->tm_hour > trainBySort[i].SetOut.hour)) /*将发车时间与此时系统时间作比较,判断此车是否发出*/
printf("此车已发出!\n");
else
printf("此车尚未发出!\n");
}
printf("按任意键回主菜单......\n");
getchar();
getchar();
MainMenu();
}
void ReadBySort(void) //问题4
{
int i;
FILE *fp1;
if ((fp1 = fopen("sort.dat", "r")) == NULL)
{
exit(-1);
}
for (i = 0; !feof(fp1); i++)
{
fscanf(fp1, "%s%d%d", trainBySort[i].SerialNumber, &trainBySort[i].SetOut.hour, &trainBySort[i].SetOut.minutes);
fscanf(fp1, "%s%s%f%d%d", trainBySort[i].DeparturePoint, trainBySort[i].TerminalPoint, &trainBySort[i].LastTime, &trainBySort[i].Edingzailiang, &trainBySort[i].Yidingpiaorenshu);
}
i--;
RecordNumber = i;
fclose(fp1);
return;
}
记得自己添加number.dat文件和sort.dat文件。
并在number.dat文件里添加起始数据。
I501 10 20 南京 上海 6.0 15 10
K301 20 10 南京 上海 2.0 15 10
J450 10 50 南京 上海 2.0 15 10
仅代表个人观点,欢迎交流探讨,勿喷~~~