?? 1.cpp
字號:
#include<iostream>
#include<fstream>
#include<string>
#include<vector>
#include<time.h>
#include<stdio.h>
#define N 20
using namespace std;
typedef struct Orderbill{
int number; //座位號
int seatdegree; //艙位等級
struct Orderbill *next;
}Orderbill; //已訂票客戶的票結點
typedef struct orderman{
string name; //姓名
Orderbill *billhead; //票鏈表的頭指針
struct orderman *next;
}orderman; //已訂票客戶的結點
typedef struct replaceman{
string name;
int bill[4]; //bill[i]表示第i等艙位的需求量
struct replaceman *next;
}replaceman; //等候替補的客戶的結點
typedef struct replacequeue{
replaceman *front;
replaceman *rear;
}replacequeue; //等候替補客戶隊列
typedef struct {
string end; //終點站名
string flightnumber; //航班號
string aircraftnumber; //飛機號
int week; //飛行周日(星期幾)
int ordernumber[4]; //乘員定額,ordernumber[0]總定票量,ordernumber[i]表示i等艙的定票量
int remainnumber[4]; //余票量,remainnumber[0]總余票量,remainnumber[i]表示i等艙的余票量
orderman *orderhead; //已訂票的客戶鏈表頭指針
replacequeue *replacehead; //等候替補的客戶隊列指針
int seat[20]; //座位號是否被訂標簽1~5為1等艙位6~10為2等艙位11~20為3等艙位
}airline; //每條航線所涉及的信息
void show(airline T) //顯示航線信息
{
struct tm *local;
time_t t;
int n,day; //最近一天航班日期的日號
int year; //最近一天航班日期的年號
t=time(NULL);
local=localtime(&t);
n=T.week-local->tm_wday; //本日與航班當天所差的天數
if(n<0)
n=n+7;
day=local->tm_mday+n;
year=local->tm_year+1900;
cout<<" "<<"終點站名"<<" "<<"航班號"<<" "<<"飛機號"<<" "<<"星期幾飛行"<<" "<<"最近一天航班的日期"<<" "<<"余票額"<<endl;
cout<<" "<<T.end<<" "<<T.flightnumber<<" "<<T.aircraftnumber<<" "<<T.week<<" "<<year<<'.'<<local->tm_mon+1<<'.'<<day<<" "<<T.remainnumber[0]<<endl;
}
char readchar()
{
char ch,c;
int n=0;
do
{
n=0;
do
{
cin.get(ch);
if(ch==' ')
n--;
else if(ch!='\n')
c=ch;
n++;
}while(ch!='\n');
if(n!=2)
cout<<"輸入有誤,請按正確格式輸入:";
}while(n!=2);
return c;
}
int judgeint() //判斷輸入的是否是整形數
{
string str; //吸收輸入的數據
char ch; //吸收回車
char c[10]="0"; //保存數字
int flag; //標示是否是整形數
int i;
do
{
flag=0;
cin>>str;
cin.get(ch);
for(i=0;i<str.length();i++)
if(!isdigit(str[i]))
flag=1;
if(flag==1)
cout<<"輸入有誤,請重新輸入:\n";
}while(flag==1);
for(i=0;i<str.length();i++)
c[i]=str[i];
return atoi(c);
}
void searchairline(vector<airline> lines,int n) //查詢航線信息n為航線條數
{
string endname;
int m=0;
int flag=0;
cout<<"請輸入終點站名:\n";
cin>>endname;
while(m<n)
{
if(lines[m].end==endname)
{
show(lines[m]);
flag=1;
}
m++;
}
if(flag==0)
cout<<"對不起,暫時沒有到此地的航班。。。。\n";
}
void orderbill(vector<airline> &lines)
{
string flightn; //要訂票的航班號
int billnumber[3]; //1,2,3等艙要訂的票數
int i=0,j,k,m;
int degree[3]={5,10,20}; //1,2,3等艙最大的座號
char ch;
int flag=0; //標示是否找到要訂的航班號
string name; //客戶名
orderman *orderp;
orderman *addorderp; //本客戶的信息指針
Orderbill *billp;
Orderbill *addbillp; //本客戶訂到的票信息
replaceman *replacep;
cout<<"請輸入航班號:";
cin>>flightn;
cout<<"請輸入1等艙的訂票數額:";
billnumber[0]=judgeint();
while(billnumber[0]<0||billnumber[0]>5)
{
cout<<"1等艙只有5個座位請重新輸入的訂票數額:";
billnumber[0]=judgeint();
}
cout<<"2等艙的訂票數額:";
billnumber[1]=judgeint();;
while(billnumber[1]<0||billnumber[1]>5)
{
cout<<"2等艙只有5個座位請重新輸入的訂票數額:";
billnumber[1]=judgeint();;
}
cout<<"3等艙的訂票數額:";
billnumber[2]=judgeint();;
while(billnumber[2]<0||billnumber[0]>10)
{
cout<<"3等艙只有10個座位請重新輸入的訂票數額:";
billnumber[2]=judgeint();;
}
while(i<lines.size())
{
if(lines[i].flightnumber==flightn)
{
if(lines[i].remainnumber[1]>=billnumber[0]&&
lines[i].remainnumber[2]>=billnumber[1]&&lines[i].remainnumber[3]>=billnumber[2])
{
cout<<"有你所要的票,請輸入你的姓名:";
cin>>name;
if(lines[i].orderhead==NULL)
{
orderp=new orderman;
orderp->name=name;
orderp->next=NULL;
lines[i].orderhead=orderp;
}
else
{
orderp=lines[i].orderhead;
while(orderp->next!=NULL)
orderp=orderp->next;
addorderp=new orderman;
addorderp->name=name;
addorderp->next=NULL;
orderp->next=addorderp;
orderp=addorderp;
}
orderp->billhead=new Orderbill;
billp=orderp->billhead;
cout<<"你訂得的票座位號為:";
j=k=m=0;
while(k<(billnumber[0]+billnumber[1]+billnumber[2]))
{
if(k==billnumber[0]&&j<6)
{
j=5;
m=1;
}
if((k==(billnumber[1]+billnumber[0]))&&j<11)
{
j=10;
m=2;
}
if(lines[i].seat[j]==0)
{
if(k==0)
{
cout<<j+1<<" ";
lines[i].seat[j]=1;
billp->seatdegree=m+1;
billp->number=j+1;
billp->next=NULL;
k++;
}
else
{
cout<<j+1<<" ";
lines[i].seat[j]=1;
addbillp=new Orderbill;
addbillp->seatdegree=m+1;
addbillp->number=j+1;
addbillp->next=NULL;
billp->next=addbillp;
billp=addbillp;
k++;
}
}
j++;
}
lines[i].ordernumber[0]+=billnumber[0]+billnumber[1]+billnumber[2];
lines[i].ordernumber[1]+=billnumber[0];
lines[i].ordernumber[2]+=billnumber[1];
lines[i].ordernumber[3]+=billnumber[2];
lines[i].remainnumber[0]-=(billnumber[0]+billnumber[1]+billnumber[2]);
lines[i].remainnumber[1]-=billnumber[0];
lines[i].remainnumber[2]-=billnumber[1];
lines[i].remainnumber[3]-=billnumber[2];
cout<<"此航班還剩下的票數為:"<<lines[i].remainnumber[0]<<endl;
}
else
{
cout<<"對不起,沒有附合你要求的票.是否要排隊候補(Y/N):";
do{
ch=readchar();
cin.putback('\n');
if(ch!='y'&&ch!='Y'&&ch!='n'&&ch!='N')
{
cout<<"請輸入y/n表示是或否:";
ch=readchar();
}
}while(ch!='y'&&ch!='Y'&&ch!='n'&&ch!='N');
if(ch=='y'||ch=='Y')
{
cout<<"請輸入你的姓名:";
cin>>name;
replacep=new replaceman;
replacep->name=name;
replacep->bill[1]=billnumber[0];
replacep->bill[2]=billnumber[1];
replacep->bill[3]=billnumber[2];
replacep->next=NULL;
if(lines[i].replacehead->rear!=NULL)
{
lines[i].replacehead->rear->next=replacep;
lines[i].replacehead->rear=replacep;
}
else
{
lines[i].replacehead->front=replacep;
lines[i].replacehead->rear=replacep;
}
}
}
flag=1;
}
i++;
}
if(flag==0)
cout<<"沒有你輸入的航班,請檢查好是否輸錯.";
}
void readfile(vector<airline> &lines)
{
ifstream f;
orderman *orderp;
orderman *inorderp;
Orderbill *billp;
Orderbill *addbill;
replaceman *replacep;
int n;
int i;
int j=0;
char ch;
airline line;
string file[]={"011.txt","012.txt","021.txt","022.txt","031.txt","032.txt","041.txt","042.txt","051.txt","052.txt"}; //儲存已訂票及等候替補客戶信息的文件的文件名數組
f.open("airline.txt"); //讀取航線信息的文件
if(f.fail())
{
cout<<"讀取文件失敗\n";
exit(1);
}
f.get(ch);
f.putback(ch);
while(ch!='#')
{
f>>line.end>>line.flightnumber>>line.aircraftnumber>>line.week;
f>>line.ordernumber[1]>>line.ordernumber[2]>>line.ordernumber[3];
f>>line.remainnumber[1]>>line.remainnumber[2]>>line.remainnumber[3];
line.ordernumber[0]=line.ordernumber[1]+line.ordernumber[2]+line.ordernumber[3];
line.remainnumber[0]=line.remainnumber[1]+line.remainnumber[2]+line.remainnumber[3];
for(i=0;i<20;i++)
{
f>>line.seat[i];
}
lines.push_back(line);
f.get(ch);
j++;
}
f.close();
i=0;n=0;
for(n=0;n<2*j;n++)
{
f.open(file[n].c_str()); //讀取已訂票客戶的信息
if(f.fail())
{
cout<<"讀取文件失敗\n";
exit(1);
}
f.get(ch);
f.putback(ch);
if(ch!='#')
{
lines[i].orderhead=new orderman;
orderp=lines[i].orderhead;
orderp->next=NULL;
}
else
lines[i].orderhead=NULL;
while(ch!='#')
{
f>>orderp->name; //已訂票客戶的名字
orderp->billhead=new Orderbill; //此客戶票的頭指針
billp=orderp->billhead;
billp->next=NULL;
f>>billp->seatdegree>>billp->number;
f.get(ch);
while(ch!='$')
{
addbill=new Orderbill;
addbill->next=NULL;
f>>addbill->seatdegree>>addbill->number;
billp->next=addbill;
billp=addbill;
f.get(ch);
}
f.get(ch);
if(ch!='#')
{
inorderp=new orderman;
orderp->next=inorderp;
inorderp->next=NULL;
orderp=inorderp;
}
}
f.close();
n++;
f.open(file[n].c_str()); //讀取等候替補客戶的信息
if(f.fail())
{
cout<<"讀取文件失敗\n";
exit(1);
}
lines[i].replacehead=new replacequeue;
f.get(ch);
f.putback(ch);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -