?? queue.cpp
字號:
// Queue.cpp: implementation of the Queue class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "AviationBS.h"
#include <fstream.h>
#include "Queue.h"
#include "UsedLine.h"
#include "SysLine.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
extern UsedLine usedLine;
extern SysLine sysLine;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction of BuildQLink
QLink* BuildQLink::Append(const Queuer &item) //用于讀文件時獨個創建
{
return tail=tail->next=new QLink(item);
}
void BuildQLink::insert(COleDateTime time,CString name,CString id,int FcNum,int TcNum,bool Try)
{
int i;
for(i=0;i<5;i++)
if(qFlight[i].FlyTime==time)break;
if(i==5)return;
else {
Queuer temp;
for(int j=0;j<20;j++)
{
if(j<name.GetLength())temp.name[j]=name.GetAt(j);
else temp.name[j]=' ';
if(j<id.GetLength())temp.ID[j]=id.GetAt(j);
else temp.ID[j]=' ';
}
temp.FCNum=FcNum;
temp.TCNum=TcNum;
temp.isTry=Try;
if(Size==0)
{
tail=tail->next=new QLink(temp,NULL);
qFlight[i].end=qFlight[i].start=tail;
}
else if(qFlight[i].start==NULL)
{
for(j=i;j>=0;j--)
if(qFlight[j].size!=0)break;
if(j>=0){
qFlight[j].end->next=new QLink(temp,qFlight[i].end->next);
qFlight[i].start=qFlight[i].end=qFlight[j].end->next;
}
else {
head->next=new QLink(temp,head->next);
qFlight[i].start=qFlight[i].end=head->next;
}
}
else qFlight[i].end=qFlight[i].end->next=new QLink(temp,qFlight[i].end->next);
if(qFlight[i].end->next==NULL)tail=qFlight[i].end; //在隊伍尾部增加客戶
qFlight[i].size++;
Size++;
}
}
//退票后,處理候票隊伍時,查找航班
int BuildQLink::Find(COleDateTime time)
{
for(int i=0;i<5;i++)
if(time==qFlight[i].FlyTime)
return i;
return -1;
}
//退票后,處理候票隊伍時,刪除已出列的客戶
void BuildQLink::remove(QLink *item,int index)
{
QLink* temp=item;
item=qFlight[index].start;
if(item==temp) //刪除的是第一個結點
{
for(int i=index;i>=0;i--)
if(qFlight[i].size!=0)break;
if(i>=0)qFlight[i].end->next=qFlight[index].start->next;
else head->next=qFlight[index].start->next;
qFlight[index].start=qFlight[index].start->next;
if(qFlight[index].size==1)qFlight[index].end=qFlight[index].start;
}
else{
while(item->next!=temp)item=item->next;
if(qFlight[index].end==temp)qFlight[index].end=item; //更新航班內末結點地址
item->next=item->next->next;
}
if(item->next==NULL)tail=item;
qFlight[index].size--;
Size--;
delete temp;
}
//新增航班時,對應的排隊隊列應調整
void BuildQLink::addFlight(int index,COleDateTime time)
{
for(int i=index;i<4;i++)
qFlight[i+1]=qFlight[i];
qFlight[index].size=0;
qFlight[index].start=qFlight[index].end=NULL;
qFlight[index].FlyTime=time;
}
// Construction/Destruction of Queue
//從文件中讀取
void Queue::readFile(int dayInWeek)
{
COleDateTime Now=COleDateTime::GetCurrentTime();
char FilePath[20]={'D','a','t','a','B','a','s','e','/','Q','u','e','u','e',' ','.','d','a','t','\0'};
FilePath[14]=dayInWeek+48;
fstream file(FilePath,ios::binary | ios::in);
file.seekp(0,ios::beg);
long beg=file.tellp();
file.seekp(0,ios::end);
long end=file.tellp();
if(end!=beg)
{
Queuer temp;
QueueInFile temp1;
file.seekp(sizeof(COleDateTime),ios::beg);
while(file.tellp()!=end)
{
file.read((char*)& temp1,long(sizeof(QueueInFile)));
queueData[dayInWeek].LineLink[temp1.line].Size=temp1.size;
for(int i=0;i<5;i++)
{
if(temp1.FSize[i]==0)continue;
//航班已過期跳過
if(Now>=queueData[dayInWeek].LineLink[temp1.line].qFlight[i].FlyTime)
{
file.seekp(temp1.FSize[i]*sizeof(Queuer),ios::cur);
queueData[dayInWeek].LineLink[temp1.line].Size-=temp1.FSize[i];
continue;
}
queueData[dayInWeek].LineLink[temp1.line].qFlight[i].size=temp1.FSize[i];
file.read((char *)& temp,long(sizeof(Queuer)));
//start標記第i個航班的第一個排隊客戶的地址
queueData[dayInWeek].LineLink[temp1.line].qFlight[i].start=
queueData[dayInWeek].LineLink[temp1.line].Append(temp);
//讀出其他的客戶
for(int j=1;j<temp1.FSize[i]-1;j++)
{
file.read((char *)& temp,long(sizeof(Queuer)));
queueData[dayInWeek].LineLink[temp1.line].Append(temp);
}
//end標記第i個航班的最后一個客戶的地址
if(temp1.FSize[i]==1)
queueData[dayInWeek].LineLink[temp1.line].qFlight[i].end=
queueData[dayInWeek].LineLink[temp1.line].qFlight[i].start;
else{
file.read((char *)& temp,long(sizeof(Queuer)));
queueData[dayInWeek].LineLink[temp1.line].qFlight[i].end=
queueData[dayInWeek].LineLink[temp1.line].Append(temp);
}
}
}
}
file.close();
}
////////////////////////////////////////////////////////////////////
void Queue::OnCreate()
{
COleDateTime Date;
int dayInWeek,i;
for(i=0;i<7;i++)
{
Date=usedLine.GetNextNDay(i);
dayInWeek=Date.GetDayOfWeek()-1;
queueData[dayInWeek].Date=Date;
for(int j=0;j<sysLine.LineSz;j++)
{
for(int k=0;k<sysLine.flightArray[j].flightN;k++) //初始化航班
{
queueData[dayInWeek].LineLink[j].qFlight[k].FlyTime.SetDateTime(
Date.GetYear(),Date.GetMonth(),Date.GetDay(),
sysLine.flightArray[j].flightInfo[k].FlyTime.GetHour(),
sysLine.flightArray[j].flightInfo[k].FlyTime.GetMinute(),
sysLine.flightArray[j].flightInfo[k].FlyTime.GetSecond());
}
}
}
long beg,end;
COleDateTime Time;
for(i=6;i>=0;i--)
{
dayInWeek=usedLine.GetNextNDay(i).GetDayOfWeek()-1;
char FilePath[20]={'D','a','t','a','B','a','s','e','/','Q','u','e','u','e',' ','.','d','a','t','\0'};
FilePath[14]=dayInWeek+48;
fstream file(FilePath,ios::binary | ios::in);
file.seekp(0,ios::beg);
beg=file.tellp();
file.seekp(0,ios::end);
end=file.tellp();
if(beg!=end)
{
file.seekp(0,ios::beg);
file.read((char *)& Time,long(sizeof(COleDateTime)));
if(Time==queueData[dayInWeek].Date){readFile(dayInWeek);file.close();}
else {file.close();DeleteFile(FilePath);} //從當前開始第i天都已過期,清空文件
}
}
}
void Queue::Save()
{
int dayInWeek;
for(int i=0;i<7;i++)
{
dayInWeek=usedLine.GetNextNDay(i).GetDayOfWeek()-1;
if(queueData[dayInWeek].isChange==false)continue;
char FilePath[20]={'D','a','t','a','B','a','s','e','/','Q','u','e','u','e',' ','.','d','a','t','\0'};
FilePath[14]=dayInWeek+48;
fstream file(FilePath,ios::out | ios::binary);
file.seekp(0,ios::beg);
file.write((char *)& queueData[dayInWeek].Date,long(sizeof(COleDateTime)));
QueueInFile temp1;
for(int k=0;k<sysLine.LineSz;k++)
{
temp1.size=queueData[dayInWeek].LineLink[k].Size;
if(temp1.size==0)continue;
temp1.line=k;
for(int j=0;j<5;j++)
temp1.FSize[j]=queueData[dayInWeek].LineLink[k].qFlight[j].size;
file.write((char*)& temp1,long(sizeof(QueueInFile)));
QLink *temp=queueData[dayInWeek].LineLink[k].head->next;
while(temp!=NULL)
{
file.write((char*)& temp->queuer,long(sizeof(Queuer)));
temp=temp->next;
}
}
file.close();
}
}
//刪除航線
void Queue::deleteLine(int index)
{
for(int i=0;i<7;i++)
{
for(int j=index;j<sysLine.LineSz-1;j++)
queueData[i].LineLink[j]=queueData[i].LineLink[j+1];
queueData[i].isChange=true;
}
}
//新增航班時可能導致航班的增加,對應的排隊隊列應調整
void Queue::addLine(int Lindex,int Findex,COleDateTime time)
{
COleDateTime temp; //記錄飛機起飛時間
int size=sysLine.LineSz-1; //新增加航線之前原航線的總數
for(int i=0;i<7;i++)
{
for(int j=size;j>Lindex;j--) //整理出空間存放新增的航線
queueData[i].LineLink[j]=queueData[i].LineLink[j-1];
}
//增加到每一天的對應所在的航線中
addFlight(Lindex,Findex,time);
}
//新增航班時,對應的排隊隊列應調整
void Queue::addFlight(int Lindex,int Findex,COleDateTime time)
{
COleDateTime temp; //記錄飛機起飛時間
for(int i=0;i<7;i++)
{
temp.SetDateTime(queueData[i].Date.GetYear(),queueData[i].Date.GetMonth(),
queueData[i].Date.GetDay(),time.GetHour(),time.GetMinute(),time.GetSecond());
//增加到每一天的對應所在的航線中
queueData[i].LineLink[Lindex].addFlight(Findex,temp);
queueData[i].isChange=true;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -