要求:
火车订票系统
要求:
1、用户注册功能
注册新用户,输入用户名密码。
2、用户名检测,用户名重复,重新注册。
3、用户注册成功。
用户登录
检测用户名和密码是否正确,正确,登录成功,否则失败。
后台管理
列车信息录入
4、列车时刻表查询
车次查询
输入车次,列出本次车所有到站及价格
发到站查询
输入发站
输入到站
列出所有车次及价格
订票功能
输入发车站
输入到站
列出所有车次,同时显示车上是否有票
订票,显示座位号
订票成功
订票信息记入个人账户
// main.c
// TrainTicketSystem
//
// Created by xiaobai on 15/7/21.
// Copyright (c) 2015年 xiaobaiyige. All rights reserved.
//
#include "ticket_data.h"
int main(int argc, const char * argv[])
{
int m_s;
int n_s;
int k_s=0;
system_init();
while (1)
{
m_s=show_main_menu(k_s);
k_s=m_s;
getchar();
switch (m_s)
{
case 1:
usr_regester();
break;
case 2:
if(usr_load()==1)
{
int cc;
printf("请选择你要的服务选项:n");
printf("1.去订票.n");
printf("2.查看自己的订票信息.n");
scanf("%d",&cc);
switch (cc) {
case 1:
k_s=m_s=5;
break;
case 2:
show_booked();
break;
default:
break;
}
}
break;
case 3:
back_manage();
break;
case 4:
printf("请选择查询方式:n");
printf("1.查区间.n");
printf("2.查车次.n");
printf("3.看所有车次.n");
scanf("%d",&n_s);
switch (n_s)
{
case 1:
find_t();
break;
case 2:
find_t2();
break;
case 3:
show_train();
break;
default:
break;
}
break;
case 5:
book_ticket();
break;
case 6:
exit(0);
default:
break;
}
}
}
// ticket_data.c
// TrainTicketSystem
//
// Created by xiaobai on 15/7/22.
// Copyright (c) 2015年 xiaobaiyige. All rights reserved.
//
#include "ticket_data.h"
LOAD_FLAG L_F;
usr uu;//保存读取的信息;
int my_fwrite(char *filename,char *write_str,char *model)//进行一次讲 write_str以model模式写入到filename里面
{
FILE*fp=NULL;
if((fp=fopen(filename, model))!=NULL)
{
fwrite(write_str,sizeof(write_str),1,fp);
fclose(fp);
return 0;//写入成功
}
else
return -1;
}
int my_fread(char *filename,char *read,char *model)//进行一次读取filename里面的内容到 read里面,模式是model
{
FILE *fp=NULL;
if ((fp=fopen(filename, model))!=NULL)
{
fread(read,sizeof(read),1, fp);
fclose(fp);
return 0;
}
else return -1;
}
int check_account(char *str_name)
{
FILE *fp=NULL;
if ((fp=fopen(str_name, "r"))==NULL) {
return 1;//文件不存在,代表用户名可以注册
}
else
{
fclose(fp);
return 0;//表示文件已经存在用户名不可注册
}
}
void usr_regester()//新用户注册函数
{
usr new_user;
FILE *fp=NULL;
printf("请输入需要注册的用户名:n");
scanf("%s",new_user.name);
if (check_account(new_user.name))
{
printf("恭喜你,账号可以使用,请输入密码:n");
scanf("%s",new_user.pass);
new_user.has_booked=0;
if((fp=fopen(new_user.name, "wb"))!=NULL)
{
fwrite(&new_user, sizeof(usr), 1, fp);
fclose(fp);
printf("注册新用户成功:n");
printf("你的用户名是:%s,请牢记n",new_user.name);
return ;
}
else
{
printf("创建新用户失败.文件写入错误.");
return ;
}
}
else
{
printf("注册的用户名已经存在请重新注册:n");
return ;
}
}
int show_main_menu(int last)
{
int n=0;
static int p_s=0;
if (p_s==last) {
while (1)
{
printf("请输入你所需要的服务编号n");
printf("1:注册新的用户.n");
printf("2:用户登录.n");
printf("3:后台管理.n");
printf("4:车次时刻表查询.n");
printf("5:预定车票.n");
printf("6:退出.n");
scanf("%d",&n);
if (n>=1&&n<=6)
{
p_s=n;
return n;
}
else
{
printf("请重新输入n");
}
}
}
else{
return last;
}
}
int usr_load()
{
usr u;
FILE*fp=NULL;
printf("请输入用户名:n");
scanf("%s",u.name);
int times=0;//用来计算密码剩余输入次数
if (check_account(u.name)==0)//用户名存在
{
fp=fopen(u.name, "rb");
fread(&uu, sizeof(usr), 1, fp);
fclose(fp);
while(times<3)//3次密码输入错误后退出
{
printf("请输入密码:n");
scanf("%s",u.pass);
if (strcmp(u.pass, uu.pass)==0)
{
printf("密码输入正确,登录成功:n");
L_F.flag=1;//给系统用户标志位赋值为1
L_F.load_usr=&uu;//
return 1;
}
else
{
times++;
printf("密码输入错误,请重新输入,还有%d次机会:n",3-times);
}
}
return 0;
}
else//用户名不存在
{
printf("你输入的用户不存在.n");
return -1;
}
}
void system_init()
{
char r_p[10];
FILE *fp=NULL;
if((fp=fopen("root", "rb"))==NULL)
{
printf("这是本系统第一次使用,请输入root密码,用来管理车次信息n");
scanf("%s",r_p);
getchar();//获取自己刚刚输入的回车
fp=fopen("root", "wb");
fwrite(r_p, sizeof(r_p), 1, fp);
fclose(fp);
printf("系统初始化成功,请牢记密码.n");
}
}
void back_manage()
{
char s[10];
int i=0;
int j;
int n;//输入车次的总数
char s2[10];//密码的保留
int times=0;//密码输入次数统计
TRAINS tt,t2;//保存和车次处理相关的问题
FILE *fp,*fp2;
int t_sum;
printf("请输入root密码n");
if (my_fread("root", s2, "rb")==0)
{
scanf("%s",s);
while (times<3)
{
if (strcmp(s2, s)==0)
{
printf("密码输入正确,请输入车次信息:n");
printf("请输入要输入的车次的个数:n");
scanf("%d",&n);
tt.all_sum=n;//所有的车的数目
getchar();
for(i=1;i<=n;i++)
{
printf("请输入第%d次列车中途站的数目和车次的名称:n",i);
scanf("%d %s",&tt.all_t[i].sum,tt.all_t[i].name);
getchar();
printf("下面请依次输入%s车次的%d个站的时间,价格和名称n",tt.all_t[i].name,tt.all_t[i].sum);
for (j=1; j<=tt.all_t[i].sum; j++)
{
scanf("%s %lf %s",tt.all_t[i].t[j].time,&tt.all_t[i].t[j].price,tt.all_t[i].t[j].name);
getchar();
}
init_pos(tt.all_t[i].pos);//初始化车票信息
}
fp=fopen("trains.txt", "wb");
fwrite(&tt, sizeof(TRAINS), 1, fp);
fclose(fp);
printf("信息已经记录.n");
fp2=fopen("trains.txt", "rb");
fread(&t2, sizeof(TRAINS), 1, fp);
fclose(fp2);
for (i=1; i<=t2.all_sum; i++)
{
t_sum=tt.all_t[i].sum;
printf("%d %s %s %s %sn",
i,
t2.all_t[i].name,
t2.all_t[i].t[1].name,
t2.all_t[i].t[t_sum].name,
t2.all_t[i].t[1].time);
}
break;
}
else
{
times++;
printf("密码输入错误,还有%d次机会n",3-times);
}
}
}else
{
printf("root文件损坏n");
}
}
void show_train()
{
TRAINS t2;
FILE *fp;
fp=fopen("trains.txt","rb");
fread(&t2,sizeof(TRAINS),1,fp);
fclose(fp);
int i=0;
int t_sum;//临时保存一个车次的站数
printf("******下面是车次信息*********n");
printf("序号: 车次 始发站 终点站 发车时间n");
for (i=1; i<=t2.all_sum; i++)
{
t_sum=t2.all_t[i].sum;
printf("%2d %5s %-12s%-12s %sn",
i,
t2.all_t[i].name,
t2.all_t[i].t[1].name,
t2.all_t[i].t[t_sum].name,
t2.all_t[i].t[1].time);
}
}
void find_t()
{
char s[10];
char e[10];
printf("请输入出发站和终点站:n");
scanf("%s %s",s,e);
TRAINS t_t;
int i,j;
int s_i=0;
int s_j=0;
FILE *fp;
int count=1;
fp=fopen("trains.txt", "rb");
printf("序号 车次 上车时间 下车时间 余票 价格n");
if(fp!=NULL)
{
fread(&t_t, sizeof(TRAINS), 1, fp);
fclose(fp);
}
for (i=1; i<=t_t.all_sum; i++)//列车车次
{
for (j=1; j<=t_t.all_t[i].sum; j++)//列车的站
{
if(strcmp(s,t_t.all_t[i].t[j].name)==0)//始发站
{
s_i=j;
}
if (strcmp(e,t_t.all_t[i].t[j].name)==0) {//终点站
s_j=j;
}
if (s_i
{
printf("%-2d %-6s %-6s %-6s %-4d %.2fn",
count,//序号
t_t.all_t[i].name,//车次
t_t.all_t[i].t[s_i].time,//上车时间
t_t.all_t[i].t[s_j].time,//下车时间
t_t.all_t[i].pos[s_i][s_j],
t_t.all_t[i].t[s_j].price-t_t.all_t[i].t[s_i].price);//价格
s_i=s_j=0;
break;
}
}
count++;
}
if (count==1) {
printf("该区间内没有满足条件的车次n");
}
}
void find_t2()
{
TRAINS t_t;
char train_name[10];
printf("请输入车次:n");
scanf("%s",train_name);
int i,j=0;
int flag=0;
FILE *fp;
fp=fopen("trains.txt", "rb");
fread(&t_t, sizeof(TRAINS), 1, fp);
fclose(fp);
for (i=1; i<=t_t.all_sum; i++) {
if (strcmp(train_name,t_t.all_t[i].name)==0)
{
flag=1;
printf("列车次%s信息如下:n",t_t.all_t[i].name);
printf("序号 站名 时间 价钱n");
for (j=1; jt_sum[L_F.load_usr->has_booked].t_name);
fp=fopen("trains.txt", "rb");
if (fp==NULL) {
printf("文件打开错误.n");
exit(0);
}
fread(&t_t, sizeof(TRAINS), 1, fp);
fclose(fp);
for (i=1; it_sum[L_F.load_usr->has_booked].t_name,t_t.all_t[i].name)==0)
{
printf("请输入你的乘车区间起始站和终点站:n");
scanf("%s %s",L_F.load_usr->t_sum[L_F.load_usr->has_booked].s_to_e.s_station,
L_F.load_usr->t_sum[L_F.load_usr->has_booked].s_to_e.e_station);
for (j=1; jt_sum[L_F.load_usr->has_booked].s_to_e.s_station,t_t.all_t[i].t[j].name)==0)//始发站
{
s_i=j;
}
if (strcmp(L_F.load_usr->t_sum[L_F.load_usr->has_booked].s_to_e.e_station,t_t.all_t[i].t[j].name)==0) {//终点站
s_j=j;
}
if (s_i
{
if (t_t.all_t[i].pos[s_i][s_j]t_sum[L_F.load_usr->has_booked].price=
t_t.all_t[i].t[s_j].price-t_t.all_t[i].t[s_i].price;
pos_num=rand()%100+1;
srand((unsigned)time(NULL));
while (!(check_if_sell(t_t.all_t[i].pos_num,pos_num,100-t_t.all_t[i].pos[s_i][s_j]))) {
pos_num=rand()%100+1;
}
L_F.load_usr->t_sum[L_F.load_usr->has_booked].p_pos=pos_num;
//随机生成一个不重复的座位号
update_ticket(t_t.all_t[i].pos,s_i,s_j);//更新余票的信息
if((fp=fopen("trains.txt", "wb"))!=NULL)
{
fwrite(&t_t, sizeof(TRAINS), 1, fp);
fclose(fp);
}
printf("你已经订票成功,信息如下:n");
printf("车次 上车时间 下车时间 上车站 下车站 价格 座位号:n");
printf("%-4s %-8s %-8s %-8s %-8s %.2f %dn",
t_t.all_t[i].name,//车次
t_t.all_t[i].t[s_i].time,//上车时间
t_t.all_t[i].t[s_j].time,//下车时间
t_t.all_t[i].t[s_i].name,
t_t.all_t[i].t[s_j].name,
t_t.all_t[i].t[s_j].price-t_t.all_t[i].t[s_i].price,
L_F.load_usr->t_sum[L_F.load_usr->has_booked].p_pos);//价格
L_F.load_usr->has_booked++;
fp=fopen(L_F.load_usr->name, "wb");
fwrite(L_F.load_usr, sizeof(usr), 1, fp);
fclose(fp);
return;
}
}
}
}
printf("你输入的车次不存在n.");
}
}
void show_booked()
{
int i=0;
usr *t_t=L_F.load_usr;
FILE *fp=NULL;
if((fp=fopen(t_t->name, "rb"))!=NULL)
{
fread(t_t,sizeof(usr), 1, fp);
fclose(fp);
printf("你已经订票成功,信息如下:n");
printf("车次 上车站 下车站 价格 座位号:n");
for (i=0; ihas_booked; i++) {
printf("%-4s %-12s %-12s %.2f %dn",
t_t->t_sum[i].t_name,//车次
t_t->t_sum[i].s_to_e.s_station, //上车站
t_t->t_sum[i].s_to_e.e_station,//下车站
t_t->t_sum[i].price,
t_t->t_sum[i].p_pos);
}
}
}
void init_pos(int a[][13])//初始化列车的座位
{
int i,j=1;
for (i=1; i<=12; i++) {
for (j=i+1; j<=12; j++) {
a[i][j]=100;
}
}
}
//用一个二维数组表示各个站点间票数,a[i][j]表示i站到j站所在的票数还有a[i][j]张
void update_ticket(int a[][13],int index_i,int index_j)
{
int i,j=1;
for (i=1; i<=12; i++) {
for (j=i+1; j<=12; j++) {//除了车的出发站到订票的起始站或者下车站到终点站的车站票数都要-1
if (!(j=index_j)) {
a[i][j]--;
}
}
}
}
int check_if_sell(int *a,int b,int has_sell)
{
int i=0;
for (i=1; i<=has_sell; i++) {
if (a[i]==b) {
return 0;
}
}
return 1;
}
// ticket_data.h
// TrainTicketSystem
//
// Created by xiaobai on 15/7/22.
// Copyright (c) 2015年 xiaobaiyige. All rights reserved.
//
#ifndef __TrainTicketSystem__ticket_data__
#define __TrainTicketSystem__ticket_data__
#include#include#include#includetypedef struct
{
char s_station[15];//起始站
char e_station[15];//终点站
}s_e;
typedef struct
{
char t_name[10];
double price;//车票价格
int p_pos;//座位号
s_e s_to_e;//始发站和终点站
}ticket;//车票结构体
typedef struct
{
char time[10];//到本站的时间
double price;//始发站到本站的价格
char name[18];//本站的名字
}station_one;
typedef struct
{
int sum;//车站的数目
char name[10];//车次的名字
station_one t[12];
int pos[13][13];
int pos_num[100];//保存座位的编号
}TRAIN;
typedef struct
{
TRAIN all_t[10];
int all_sum;
}TRAINS;
typedef struct
{
char name[20];//账号
char pass[20];//密码
ticket t_sum[10];//车票相关的
int has_booked;
}usr;//用户结构体
typedef struct
{
int flag;
usr*load_usr;
}LOAD_FLAG;
int check_account(char *str_name);
void usr_regester();//新用户注册函数
int show_main_menu(int last);//主菜单
int usr_load();//用户登录
void system_init();//系统初始化
void back_manage();//后台管理
void show_train();//查看所有的列车车次
void book_ticket();//订票
void find_t2();//查找某一个车次的乘车信息
void find_t();//根据区间查找车次
void show_booked();//显示已经订购的车次信息
void update_ticket(int a[][13],int index_i,int index_j);//更新车票信息
void init_pos(int a[][13]);//初始化列车的座位
int check_if_sell(int *a,int b,int has_sell);//检查b号座位是否已经卖出
#endif /* defined(__TrainTicketSystem__ticket_data__) */