游轮乘票预定
#include<iostream>
#include<cstring>
#include<conio.h>
#include<stdio.h>
#include<windows.h>
using namespace std;
#define MAXNUM_KEY 8
#define RADIX_n 10
#define RADIX_c 26
#define MAX_SPACE 10000
#define HEAD1 "|------------------------------------------Book--Ticket--------------------------------------|\n"
#define HEAD2 "|cruisename|---start---time---|----end---time----|satrt-city|-end-city-|---price--|--Ticket--|\n"
#define HEAD3 "|----------|------------------|------------------|----------|----------|----------|----------|\n"
#define FORMAT "|%-10s|%-18s|%-18s|%-10s|%-10s|%-10.2lf| %-5d |\n"
#define FORMAT1 "%s %s %s %s %s %lf %d\n"
#define DATA1 L->r[L->recnum+1].cruisename,L->r[L->recnum+1].starttime,L->r[L->recnum+1].endtime,L->r[L->recnum+1].startcity,L->r[L->recnum+1].endcity,&L->r[L->recnum+1].price,&L->r[L->recnum+1].ticket
#define DATA L->r[i].cruisename,L->r[i].starttime,L->r[i].endtime,L->r[i].startcity,L->r[i].endcity,L->r[i].price,L->r[i].ticket
#define DATA2 arr[i].cruisename,arr[i].starttime,arr[i].endtime,arr[i].startcity,arr[i].endcity,arr[i].price,arr[i].ticket
#define FORMAT2 "|%-12s|%-10s| %-4d |\n"
#define DATA3 m->data.ID,m->data.name,m->data.ticket
bool saveflag=0;
const char zhanghao[15]="2724391331";
const char mima[15]="123456";
typedef struct cruise
{
char cruisename[MAXNUM_KEY+1];
char starttime[18];
char endtime[18];
char startcity[10];
char endcity[10];
double price;
int ticket;
int next;
} cruise;
typedef struct man
{
char name[10];
char ID[12];
int ticket;
} man;
typedef struct Node1
{
cruise r[MAX_SPACE];
int keynum;
int recnum;
} cruiseNode,*cruiseList;
typedef int ArrType_n[RADIX_n];
typedef int ArrType_c[RADIX_c];
typedef struct Node2
{
man data;
struct Node2 *next;
} ManNode,*ManList;
void Initcruise(cruiseList &L)
{
L=new cruiseNode;
L->recnum=0;
L->keynum=MAXNUM_KEY;
}
void Initman(ManList &M)
{
M =new ManNode;
M->next = NULL;
}
void Distribute_n(cruise *r,int i,ArrType_n &f,ArrType_n &e)
{
int j,p;
for(j=0; j<RADIX_n; j++)
{
f[j]=0;
e[j]=0;
}
for(p=r[0].next; p; p=r[p].next)
{
j=r[p].cruisename[i]%48;
if(!f[j])
f[j]=p;
else
r[e[j]].next=p;
e[j]=p;
}
}
void Collect_n(cruise *r,int i,ArrType_n f,ArrType_n e)
{
int j,p;
for(j=0; !f[j]; j++);
r[0].next=f[j];
int t=e[j];
while(j<RADIX_n)
{
for(j=j+1; j<RADIX_n-1&&!f[j]; j++);
if(f[j])
{
r[t].next=f[j];
t=e[j];
}
r[t].next=0;
}
}
void Distribute_c(cruise *r,int i,ArrType_c &f,ArrType_c &e)
{
int j,p;
for(j=0; j<RADIX_c; j++)
{
f[j]=0;
e[j]=0;
}
for(p=r[0].next; p; p=r[p].next)
{
j=r[p].cruisename[i]%65;
if(!f[j])
f[j]=p;
else
r[e[j]].next=p;
e[j]=p;
}
}
void Collect_c(cruise *r,int i,ArrType_c f,ArrType_c e)
{
int j,p;
for(j=0; !f[j]; j++);
r[0].next=f[j];
int t=e[j];
while(j<RADIX_c)
{
for(j=j+1; j<RADIX_c-1&&!f[j]; j++);
if(f[j])
{
r[t].next=f[j];
t=e[j];
}
r[t].next=0;
}
}
void RADIXsort(cruiseList &L)
{
ArrType_n fn,en;
ArrType_c fc,ec;
for(int i=0; i<=L->recnum; i++)
{
L->r[i].next=i+1;
}
L->r[L->recnum+1].next=0;
for(int i=L->keynum-1; i>=2; i--)
{
Distribute_n(L->r,i,fn,en);
Collect_n(L->r,i,fn,en);
}
for(int i=1; i>=0; i--)
{
Distribute_c(L->r,i,fc,ec);
Collect_c(L->r,i,fc,ec);
}
}
void Arrange(cruiseList &L)
{
int p,q,i;
cruise temp;
p=L->r[0].next;
for(i=1; i<L->recnum; i++)
{
while(p<i)
p=L->r[p].next;
q=L->r[p].next;
if(p!=i)
{
temp=L->r[p];
L->r[p]=L->r[i];
L->r[i]=temp;
L->r[i].next=p;
}
p=q;
}
}
void printhead()
{
printf(HEAD1);
printf(HEAD2);
printf(HEAD3);
}
void printdata (cruiseList L,int i)
{
printf(FORMAT,DATA);
}
void timefind(cruiseList &L)
{
int i=0;
printf("请输入查找游轮的出发时间\n");
char time1[18];
scanf("%s",time1);
getchar();
printf("请输入查找游轮的到达时间\n");
char time2[18];
scanf("%s",time2);
printhead();
for(i=1; i<=L->recnum; i++)
{
if(strcmp(time1,L->r[i].starttime)<=0&&strcmp(time2,L->r[i].endtime)>=0)
{
printdata(L,i);
}
}
if(i>1+L->recnum)
{
printf("很抱歉,不存在当前游轮\n");
system("pause");
}
}
void cityfind(cruiseList &L)
{
int i=0;
printf("请输入查找游轮的起始站\n");
char city1[10]={0},city2[10]={0};
scanf("%s",city1);
printf("请输入查找游轮的终点站\n");
scanf("%s",city2);
printhead();
for( i=1; i<=L->recnum; i++)
{
if(strcmp(city1,L->r[i].startcity)==0&&strcmp(city2,L->r[i].endcity)==0)
{
printdata(L,i);
}
}
if(i>1+L->recnum)
{
printf("很抱歉,不存在当前游轮\n");
system("pause");
}
}
void starttimefind(cruiseList &L)
{
int i=0;
printf("请输入查找游轮的出发时间\n");
char time[18];
scanf("%s",time);
printhead();
for(i=1; i<=L->recnum; i++)
{
if(strcmp(time,L->r[i].starttime)==0)
{
printdata(L,i);
}
}
if(i>1+L->recnum)
{
printf("很抱歉,不存在当前游轮\n");
system("pause");
}
}
void endtimefind(cruiseList &L)
{
int i=0;
printf("请输入查找游轮的到达时间\n");
char time[18];
scanf("%s",time);
printhead();
for( i=1; i<=L->recnum; i++)
{
if(strcmp(time,L->r[i].endtime)==0)
{
printdata(L,i);
}
}
if(i>1+L->recnum)
{
printf("很抱歉,不存在当前游轮\n");
system("pause");
}
}
void startcityfind(cruiseList &L)
{
int i=0;
printf("请输入查找游轮的起始站\n");
char city[10];
scanf("%s",city);
printhead();
for( i=1; i<=L->recnum; i++)
{
if(strcmp(city,L->r[i].startcity)==0)
{
printdata(L,i);
}
}
if(i>1+L->recnum)
{
printf("很抱歉,不存在当前游轮\n");
system("pause");
}
}
void endcityfind(cruiseList &L)
{
int i=0;
printf("请输入查找游轮的终点站\n");
char city[10];
scanf("%s",city);
printhead();
for(int i=1; i<=L->recnum; i++)
{
if(strcmp(city,L->r[i].endcity)==0)
{
printdata(L,i);
}
}
if(i>1+L->recnum)
{
printf("很抱歉,不存在当前游轮\n");
system("pause");
}
}
int cruisenamefind(cruiseList &L,int flag,char *name)
{
int left=1,right=L->recnum,mid;
printf("%d\n",right);
while(left<=right)
{
mid=left+(right-left)/2;
if(strcmp(L->r[mid].cruisename,name)<0)
left=mid+1;
else if(strcmp(L->r[mid].cruisename,name)>0)
right=mid-1;
else if(strcmp(L->r[mid].cruisename,name)==0)
{
if(flag==0)
{
printhead();
printdata(L,mid);
}
if(flag==1)
{
for(int i=mid; i<L->recnum+1; i++)
{
L->r[i]=L->r[i+1];
}
L->recnum--;
saveflag=1;
}
return mid;
}
}
if(left>right&&flag>=0&&flag<2)
{
printf("很抱歉,不存在当前游轮班号\n");
system("pause");
}
return 0;
}
void Deletecruiseinfo(cruiseList &L)
{
if(L->recnum<=0)
{
exit(0);
}
char name[MAXNUM_KEY];
printf("请输入你想要删除游轮的班号\n");
scanf("%s",name);
cruisenamefind(L,1,name);
}
void Insertcruiseiofo(cruiseList &L)
{
if(L->recnum==MAX_SPACE)
{
exit(0);
}
char name[MAXNUM_KEY+1]= {0};
while(1)
{
printf("请输入你想插入的游轮班号(按0退出)\n");
scanf("%s",name);
if(strcmp(name,"0")==0)
break;
if(cruisenamefind(L,2,name))
{
printf("游轮已存在\n");
continue;
}
strcpy(L->r[L->recnum+1].cruisename,name);
printf("请输入游轮的出发时间\n");
scanf("%s",L->r[L->recnum+1].starttime);
printf("请输入游轮的到达时间\n");
scanf("%s",L->r[L->recnum+1].endtime);
printf("请输入游轮的起始站\n");
scanf("%s",L->r[L->recnum+1].startcity);
printf("请输入游轮的终点站\n");
scanf("%s",L->r[L->recnum+1].endcity);
printf("请输入游轮的票价\n");
scanf("%lf",&L->r[L->recnum+1].price);
printf("请输入游轮的票数\n");
scanf("%d",&L->r[L->recnum+1].ticket);
L->recnum++;
}
saveflag=1;
}
void Modefy(cruiseList &L)
{
if(L->recnum==0)
{
printf("没有可修改的数据\n");
return ;
}
else
{
printf("请问你是否确定修改?(y/n)\n");
char YN;
getchar();
scanf("%c",&YN);
if(YN=='y'||YN=='Y')
{
printf("请输入你要修改的游轮班号\n");
char name[10];
scanf("%s",name);
int f=cruisenamefind(L,2,name);
if(f>=0)
{
printf("请输入游轮的班号\n");
scanf("%s",L->r[f].cruisename);
printf("请输入游轮的出发时间\n");
scanf("%s",L->r[f].starttime);
printf("请输入游轮的到达时间\n");
scanf("%s",L->r[f].endtime);
printf("请输入游轮的起始站\n");
scanf("%s",L->r[f].startcity);
printf("请输入游轮的终点站\n");
scanf("%s",L->r[f].endcity);
printf("请输入游轮的票价\n");
scanf("%lf",&L->r[f].price);
printf("请输入游轮的票数\n");
scanf("%d",&L->r[f].ticket);
saveflag=1;
}
}
else
{
printf("已退出\n");
}
}
saveflag=1;
}
void menu1()
{
printf("\n");
printf("\t\t|---------------------------|\n");
printf("\t\t|----欢迎进入管理员系统-----|\n");
printf("\t\t|---------------------------|\n");
printf("\t\t| 1.游轮信息插入功能 |\n");
printf("\t\t| 2.游轮信息删除功能 |\n");
printf("\t\t| 3.游轮信息修改功能 |\n");
printf("\t\t| 4.游轮班号查询功能 |\n");
printf("\t\t| 5.出发时间查询功能 |\n");
printf("\t\t| 6.到达时间查询功能 |\n");
printf("\t\t| 7.起点站查询功能 |\n");
printf("\t\t| 8.终点站查询功能 |\n");
printf("\t\t| 9.显示游轮信息功能 |\n");
printf("\t\t| 10.乘客订票功能 |\n");
printf("\t\t| 11.保存游轮信息功能 |\n");
printf("\t\t| 12.查看乘客信息功能 |\n");
printf("\t\t| 13.按时间段查询功能 |\n");
printf("\t\t| 14.乘客信息增加功能 |\n");
printf("\t\t| 15.乘客信息删除功能 |\n");
printf("\t\t| 16.保存乘客信息功能 |\n");
printf("\t\t| 0.退出界面 |\n");
printf("\t\t|---------------------------|\n");
}
void menu2()
{
printf("\t\t欢迎再次使用本系统\n");
}
int Manfind(ManList &M,char *name,char *ID)
{
ManList p, r;
r = M;
while (r->next != NULL)
{
if(strcmp(r->next->data.ID,ID)==0&&strcmp(r->next->data.name,name)==0)
{
return 1;
}
r = r-> next;
}
return 0;
}
void ModefyMan(ManList & M,int num,char *name,char *ID)
{
ManList p, r;
r = M;
while (r->next != NULL)
{
if(strcmp(r->next->data.ID,ID)==0&&strcmp(r->next->data.name,name)==0)
{
r->next->data.ticket+=num;
}
r = r-> next;
}
}
void BookTicket(cruiseList &L,ManList &M)
{
int k=0;
char name[10]= {0},ID[12]= {0};
char str1[10]= {0},str2[10]= {0};
cruise arr[50];
ManNode *h,*m;
m=M;
printf("欢迎使用订票专栏\n");
printf("请输入你所在的城市:");
scanf("%s",str1);
getchar();
printf("请输入你想去的城市:");
scanf("%s",str2);
for(int i=1; i<=L->recnum; i++)
{
if(strcmp(str1,L->r[i].startcity)==0&&strcmp(str2,L->r[i].endcity)==0)
{
arr[k++]=L->r[i];
}
}
printf("有%d个选择\n",k);
printhead();
for(int i=0; i<k; i++)
printf(FORMAT,DATA2) ;
if(k==0)
printf("非常抱歉,没有可选的游轮!\n");
else
{
printf("请确定是否进行订票(y/n)\n");
char YN;
int i=0;
getchar();
scanf("%c",&YN);
if(YN=='y'||YN=='Y')
{
h=new ManNode;
printf("请输入乘客ID信息:\n");
scanf("%s", ID);
getchar();
printf("请输入姓名:\n");
scanf("%s", name);
getchar();
int f=Manfind(M,name,ID);
if(f==1)
{
printf("请输入你想乘坐的游轮班号\n");
char banhao[10];
scanf("%s",banhao);
for(i=1; i<=L->recnum; i++)
{
if(strcmp(banhao,L->r[i].cruisename)==0)
{
if(L->r[i].ticket<1)
{
printf("不好意思,该游轮余票不足\n");
}
else
{
printf("请输入你想购票的数量\n");
int num;
scanf("%d",&num);
if(num>L->r[i].ticket)
{
printf("不好意思,该游轮余票不足\n");
}
else
{
L->r[i].ticket=L->r[i].ticket-num;
ModefyMan(M,num,name,ID);
printf("很幸运,你抢到票了\n");
saveflag=1;
break;
}
}
}
}
}
if(i>1+L->recnum)
{
printf("输入错误\n");
system("pause");
}
}
}
}
void showcruise(cruiseList L)
{
printhead();
for(int i=2; i<=L->recnum; i++)
{
printdata(L,i);
}
}
void printdata1(ManList m)
{
printf(FORMAT2,DATA3);
}
void printhead1()
{
printf("|----------------------------------|\n");
printf("|------------|----------|----------|\n");
printf("|-----ID-----|---name---|--ticket--|\n");
}
void showman(ManList M)
{
printhead1();
ManList m;
m=M->next;
while(m)
{
printdata1(m);
m=m->next;
}
}
void SaveCruiseinfo(cruiseList &L)
{
FILE *fp;
int cnt=0,flag=1;
fp=fopen("./cruiseinfo.txt","w");
if(fp==NULL)
{
printf("文件打开失败\n");
return ;
}
int i=1;
if(L->recnum==1)
fprintf(fp,FORMAT1,DATA);
else
for(int i=2; i<=L->recnum; i++)
{
fprintf(fp,FORMAT1,DATA);
}
saveflag=1;
fclose(fp);
}
void SaveManinfo(ManList M)
{
FILE* fp;
ManList p;
int cnt = 0, flag = 1;
fp = fopen("./man.txt", "wb");
if (fp == NULL)
{
printf("文件打开失败\n");
return;
}
p = M->next;
while (p)
{
if (fwrite(p, sizeof(ManNode), 1, fp) == 1)
{
p = p->next;
cnt++;
}
else
{
flag = 0;
break;
}
}
if (flag)
{
printf("saved %d record\n", cnt);
saveflag = 1;
}
fclose(fp);
}
void InsertMan(ManList &M)
{
ManList p, r, s;
r = M;
s = M->next;
while (r->next != NULL)
{
r = r-> next;
}
while (1)
{
p = new ManNode;
char ID[12] = { 0 };
printf("请输入乘客ID信息:\n");
scanf("%s", ID);
if (strcmp(ID, "0") == 0)
{
break;
}
while (s)
{
if (strcmp(s->data.ID, ID) == 0)
{
printf("this ID '%s' is existing\n",ID);
return;
}
s = s->next;
}
strcpy(p->data.ID, ID);
printf("请输入姓名:\n");
scanf("%s", p->data.name);
p->data.ticket=0;
p->next = NULL;
r->next = p;
r = p;
s = M->next;
}
saveflag=1;
}
void DeleteMan(ManList &M)
{
ManList p, r;
r = M;
char ID[12] = { 0 },name[10]= {0};
printf("请输入乘客ID信息:\n");
scanf("%s", ID);
printf("请输入姓名:\n");
scanf("%s", name);
while (r->next != NULL)
{
if(strcmp(r->next->data.ID,ID)==0&&strcmp(r->next->data.name,name)==0)
{
r->next=r->next->next;
break;
}
r = r-> next;
}
saveflag=1;
}
void menu3(ManList &M,cruiseList &L)
{
while(1)
{
menu1();
printf("请输入你的选择:");
int choose;
scanf("%d",&choose);
switch(choose)
{
case 1:
Insertcruiseiofo(L);
break;
case 2:
Deletecruiseinfo(L);
break;
case 3:
Modefy(L);
break;
case 4:{
char name[MAXNUM_KEY+1];
printf("请输入游轮的班号\n");
scanf("%s",name);
cruisenamefind(L,0,name);
break;
}
case 5:
starttimefind(L);
break;
case 6:
endtimefind(L);
break;
case 7:
startcityfind(L);
break;
case 8:
endcityfind(L);
break;
case 9:
showcruise(L);
break;
case 10:
BookTicket(L,M);
break;
case 11:
SaveCruiseinfo(L);
break;
case 12:
showman(M);
break;
case 13:
timefind(L);
break;
case 14:
InsertMan(M);
break;
case 15:
DeleteMan(M);
break;
case 16:
SaveManinfo(M);
break;
case 0:
if(saveflag==1)
{
printf("你的文件信息已经改动,已重新保存\n");
RADIXsort(L);
Arrange(L);
SaveManinfo(M);
SaveCruiseinfo(L);
}
menu2();
return ;
default:
break;
}
}
}
void menu4()
{
printf("\n");
printf("\t\t|---------------------------|\n");
printf("\t\t|----欢迎进入乘票预定系统---|\n");
printf("\t\t|---------------------------|\n");
printf("\t\t| 1.游轮班号查询功能 |\n");
printf("\t\t| 2.出发时间查询功能 |\n");
printf("\t\t| 3.到达时间查询功能 |\n");
printf("\t\t| 4.起点站查询功能 |\n");
printf("\t\t| 5.终点站查询功能 |\n");
printf("\t\t| 6.显示游轮信息功能 |\n");
printf("\t\t| 7.乘客订票功能 |\n");
printf("\t\t| 8.按时间段查询功能 |\n");
printf("\t\t| 9.按两站查询功能 |\n");
printf("\t\t| 0.退出界面 |\n");
printf("\t\t|---------------------------|\n");
}
void menu5(ManList &M,cruiseList &L)
{
int choose=1;
do
{
menu4();
printf("请输入你的选择:");
scanf("%d",&choose);
switch(choose)
{
case 1:{
char name[MAXNUM_KEY+1];
printf("请输入游轮的班号\n");
scanf("%s",name);
cruisenamefind(L,0,name);
break;
}
case 2:
starttimefind(L);
break;
case 3:
endtimefind(L);
break;
case 4:
startcityfind(L);
break;
case 5:
endcityfind(L);
break;
case 6:
showcruise(L);
break;
case 7:
BookTicket(L,M);
break;
case 8:
timefind(L);
break;
case 9:
cityfind(L);
break;
case 0:
choose=0;
break;
case 996:{
char name1[15]= {0},mi[15]= {0};
printf("你的管理员账号:\n");
scanf("%s",name1);
printf("请输入的密码:\n");
scanf("%s",mi);
if(strcmp(name1,zhanghao)==0&&strcmp(mi,mima)==0)
{
menu3(M,L);
}
break;
}
default :
break;
}
}
while(choose);
}
int main()
{
cruiseList L;
ManList M,h,t;
Initcruise(L);
Initman(M);
h = M;
system("color e3");
FILE *fp1,*fp2;
fp1=fopen("./cruiseinfo.txt","a+");
if(fp1==NULL)
{
printf("文件打开失败\n");
return 0;
}
rewind(fp1);
char ch;
int cnt1=0,cnt2=0;
while(!feof(fp1))
{
ch=fgetc(fp1);
if(ch=='\n')
cnt1++;
cnt2++;
}
rewind(fp1);
for(int i=1; i<=cnt1&&cnt2>2; i++)
{
fscanf(fp1,FORMAT1,DATA1);
L->recnum++;
}
fclose(fp1);
fp2 = fopen("./man.txt", "ab+");
if ((fp2 == NULL))
{
printf("can't open the file!");
return 0;
}
while (!feof(fp2))
{
t = new ManNode;
if (fread(t, sizeof(ManNode), 1, fp2) == 1)
{
t->next = NULL;
h->next = t;
h = t;
}
}
fclose(fp2);
menu5(M,L);
return 0;
}