Demo entry 6360184

lyc

   

Submitted by anonymous on May 01, 2017 at 06:16
Language: C. Code size: 5.4 kB.

#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<stdbool.h>
#define INTERVAL 100
#define TAKEOFF 42
#define LAND 46
#define GOTORWY 97
const int TFly[4]={0,2,4,5};
const int TLAD=200;
const int TSlide[4]={0,59,139,151};
/*******************************
自定义定义数据类型说明
Flt:航班信息
Block:以规划的航班占用跑道的时间区间
*******************************/
typedef struct tagFlt{
        int h,min; //计划起飞或降落时间
        int s;
        char fNum[10]; //航班号
        int ter;            //航站楼
        char TER[10];   // 航站楼
        int sta; // 0代表降落,1代表起飞
    }Flt;

typedef struct tagBlc{
    int a,b;
}Block;
/*fbd代表已规划的起飞航班占用时间的区间
fbd2代表已规划的降落航班占用时间的区间*/
Block fbd[100],fbd2[100];
/************************
Function:       BSort
Description:    对数组f中0到n的元素进行排序
Calls:          NULL
Called by:      main
Input:          *f,n
Return:         void
************************/
void BSort(Flt *f,int n)
{
    Flt tmp;
    int i,j;
    for(i=0;i<n;i++){
        for(j=0;j<n-i;j++){
            if(f[j+1].h*100+f[j+1].min<f[j].h*100+f[j].min){
                tmp=f[j+1];
                f[j+1]=f[j];
                f[j]=tmp;
            }
        }
    }
}
/************************
Function:       isspare
Description:    判断时刻s起飞跑道是否空闲
                若跑道被占用,用e返回fbd区间的下标
Calls:          NULL
Called by:      main
Input:          n,s,approachTime,*e,fbd
Return:         bool
************************/
bool isspare(int n,int s,int approchTime,int *e)
{
    bool ret=true;
    int i;
    for(i=0;i<n;i++){
        if(s<=(fbd[i].b-approchTime)&&s>=fbd[i].a){
            ret=false;
            *e=i;
            break;
        }
    }
    return ret;
}
/************************
Function:       isspare2
Description:    判断时刻s降落跑道是否空闲
                若跑道被占用,用e返回fbd区间的下标
Calls:          NULL
Called by:      main
Input:          n,s,approachTime,*e,fbd2
Return:         bool
************************/
bool isspare2(int n,int s,int approchTime,int *e)
{
    bool ret=true;
    int i;
    for(i=0;i<n;i++){
        if(s<=(fbd2[i].b-approchTime)&&s>=fbd2[i].a){
            ret=false;
            *e=i;
            break;
        }
    }
    return ret;
}
int main()
{
    FILE *fp;
    Flt f[100];
    char tmp[10];
    int j,i=0,cnt=0,cnt2=0,e=0;
    /*从文件skb.txt中读取所有航班信息*/
    fp=fopen("skb.txt","r");
    assert(fp!=NULL);
    while(!feof(fp)){
        fscanf(fp,"%d:%d PM %s%s%s",&f[i].h,&f[i].min,f[i].fNum,f[i].TER,tmp);
        if(strcmp(f[i].TER,"T1")) f[i].ter=2;
        else f[i].ter=1;
        if(strcmp(tmp,"起飞")) f[i].sta=0;
        else f[i].sta=1;
        f[i].s=0;
        i++;
    }
    /*读取结束,关闭文件,并对所读取航班按时间排序*/
    fclose(fp);
    BSort(f,i-1);
    /*对航班逐个遍历判断*/
    for(j=0;j<i;j++){
        int second=3600*(f[j].h-f[0].h)+60*(f[j].min-f[0].min)+f[j].s;
        if(f[j].sta&&f[j].ter==2){          /*起飞且不需穿越跑道的航班*/
            /*寻找跑道空闲时间安排起飞*/
            while(!isspare(cnt,second,0,&e)){
                f[j].s+=INTERVAL;
                second+=INTERVAL;
            }
            /*将起飞时间存入fbd数组中,禁止其他航班穿越*/
            fbd[cnt].a=second;
            fbd[cnt++].b=second+TAKEOFF;
            printf("%d:%02d %s\t起飞\t",f[j].h,f[j].min,f[j].fNum);
            f[j].min+=f[j].s/60;
            f[j].s=f[j].s%60;
            printf("%d:%02d:%02d\t\t",f[j].h,f[j].min,f[j].s);
            printf("%s -> H7\n",f[j].TER);
        }else if(!f[j].sta&&f[j].ter==1){   /*降落且不需穿越跑道的航班*/
            /*寻找跑道空闲时间安排降落*/
            while(!isspare2(cnt2,second,0,&e)){
                f[j].s+=INTERVAL;
                second+=INTERVAL;
            }
            /*将降落时间存入fbd2数组中,禁止其他航班穿越*/
            fbd2[cnt2].a=second;
            fbd2[cnt2++].b=second+LAND;
            printf("%d:%02d %s\t降落\t",f[j].h,f[j].min,f[j].fNum);
            f[j].min+=f[j].s/60;
            f[j].s=f[j].s%60;
            printf("%d:%02d:%02d\t\t",f[j].h,f[j].min,f[j].s);
            printf("H1 -> T1\n");
        }else if(f[j].sta&&f[j].ter==1){    /*起飞且需穿越降落跑道的航班*/
            /*寻找跑道空闲时间安排起飞*/
            while(!isspare(cnt,second,0,&e)){
                f[j].s+=INTERVAL;
                second+=INTERVAL;
            }
            /*将起飞时间存入fbd数组中,禁止其他航班穿越*/
            fbd[cnt].a=second;
            fbd[cnt++].b=second+TAKEOFF;
            printf("%d:%02d %s\t起飞\t",f[j].h,f[j].min,f[j].fNum);
            f[j].min+=f[j].s/60;
            f[j].s=f[j].s%60;
            printf("%d:%02d:%02d\t\t",f[j].h,f[j].min,f[j].s);
            printf("T1 -> H7\n");
        }else if(!f[j].sta&&f[j].ter==2){   /*降落且需穿越起飞跑道的航班*/
            int k=0;
            /*寻找跑道空闲时间安排降落*/
            while(!isspare2(cnt2,second,0,&e)){
                f[j].s+=INTERVAL;
                second+=INTERVAL;
            }
            /*将降落时间存入fbd2数组中,禁止其他航班穿越*/
            fbd2[cnt2].a=second;
            fbd2[cnt2++].b=second+LAND;
            f[j].min+=f[j].s/60;
            f[j].s=f[j].s%60;
            /*寻找空闲时间穿越起飞跑道*/
            second+=GOTORWY;
            while(!isspare(cnt,second,TFly[k],&e)&&k<4){
                i++;
                second+=TSlide[k];
            }
            printf("%d:%02d %s\t降落\t",f[j].h,f[j].min,f[j].fNum);
            printf("%d:%02d:%02d\t\t",f[j].h,f[j].min,f[j].s);
            printf("H1 -> B -> H%d -> %s\n",k+1,f[j].TER);
        }
    }
    return 0;
}

This snippet took 0.02 seconds to highlight.

Back to the Entry List or Home.

Delete this entry (admin only).