⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 queue.cpp

📁 航空订票系统 学校大作业开发的
💻 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 + -