《数据结构与程序设计》队列 case study —— airport 模拟机场调度

3.25 数据结构与算法作业——airport

个人觉得这道题很水没有什么思维难度也没有什么算法思想,只是很麻烦,因为用到的变量实在太多。
(也可能是有别的不麻烦的方法但我没想到orz)
还是记录一下吧,毕竟是第一个自己写的接近两百行的代码♪(・ω・)ノ

代码写的很繁琐,但觉得泊松分布部分写(chao) 的还挺好,蛮有参考价值的。。。
希望对有需要的人有帮助,同时希望看到的大佬能不吝赐教,指点指点怎么简化代码。。。

运行效果

先初始化
《数据结构与程序设计》队列 case study —— airport 模拟机场调度_第1张图片
然后开始模拟
(中间调度过程:)
《数据结构与程序设计》队列 case study —— airport 模拟机场调度_第2张图片
(最后机场调度情况总结:)
《数据结构与程序设计》队列 case study —— airport 模拟机场调度_第3张图片

代码

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <queue>
#include <math.h>
#include <time.h>

using namespace std;

class Random{
	public:
		Random(bool pseudo=true);
		double random_real();
		int poisson(double mean);
	private:
		int reseed();
		int seed,
			multiplier,add_on;
};

int Random::reseed()
{
	seed=seed*multiplier + add_on;
	return seed;
}

Random::Random(bool pseudo)
{
	if(pseudo)
		seed=1;
	else
		seed=time(NULL)%INT_MAX;
	multiplier=2743;
	add_on=5923;
}

double Random::random_real()
{
	double max=INT_MAX + 1.0;
	double temp=reseed();
	if(temp<0)
		temp=temp+max;
	return temp/max;
}

int Random::poisson(double mean)
{
	double limit=exp(-mean);
	double product=random_real();
	int count=0;
	while(product>limit){
		count++;
		product*=random_real();
	}
	return count;
}
	
/*******以上是随机数的生成和泊松分布的实现*******/

struct plane{
    int name;
    int in_queue_time;
} plane;

int main()
{
    int time=0,spare_time=0,
         wait_time=0, come_wait_time=0 , go_wait_time=0;

    int this_time_come=0, this_time_go=0,
         total_come=0, total_go=0;

    double come_rate=0,go_rate=0;

    int total=0,len=0,
         come_accepted=0, go_accepted=0;

    int i=0, counts=0;

    queue <struct plane> q1;        //q1是准备降落的飞机队列
    queue <struct plane> q2;        //q2是准备起飞的飞机队列
    struct plane temp;
    Random variable;

    printf("请输入飞机场运行的时间。\n");
    scanf("%d",&time);
    printf("请输入降落和起飞队列最多容纳的飞机数。\n");
    scanf("%d",&len);
    printf("请输入平均每个单位时间请求降落的飞机数。\n");
    scanf("%lf",&come_rate);
    printf("请输入平均每个单位时间请求起飞的飞机数。\n");
    scanf("%lf",&go_rate);
    for(i=0;i<time;i++)
    {
/**处理已经在队列里的飞机**/
            if(!q1.empty()){
                temp=q1.front();
                wait_time=i-temp.in_queue_time-1;
                come_wait_time+=wait_time;
                printf("\n\n##%d号时间##\n%d号飞机降落了,等了%d个单位时间。\n", i, temp.name , wait_time);
                q1.pop();
            }
            else if(!q2.empty()){
                temp=q2.front();
                wait_time=i-temp.in_queue_time-1;
                go_wait_time+=wait_time;
                printf("\n\n##%d号时间##\n%d号飞机飞走了,等了%d个单位时间。\n", i, temp.name , wait_time);
                q2.pop();
            }
            else {
                printf("\n\n##%d号时间##\n没有飞机降落,也没有飞机起飞,此时跑道为空。\n",i);
                spare_time++;
            }

/**处理请求**/
            if((i+1)!=time)
            {
        /**接受请求**/
                this_time_come = variable.poisson(come_rate);
                this_time_go = variable.poisson(go_rate);

                total+=this_time_come+this_time_go; //截止到这一时刻结束后接触的飞机总数
                total_come += this_time_come;          //截止到这一时刻结束后请求降落的飞机总数
                total_go += this_time_go;                  //截止到这一时刻结束后请求起飞的飞机总数

        /**处理这一时刻请求降落的飞机**/
                while(counts < total - this_time_go)
                {
                    plane.name=counts;
                    if(q1.size()<len){
                        printf("%d号飞机请求降落,并进入降落队伍。\n", plane.name);
                        plane.in_queue_time = i;
                        q1.push(plane);
                        come_accepted++;
                    }
                    else{
                        printf("%d号飞机请求降落但被拒绝了。\n",plane.name);
                    }
                    counts++;
                }
        /**处理这一时刻请求起飞的飞机**/
                while(counts < total)
                {
                    plane.name=counts;
                    if(q2.size()<len){
                        printf("%d号飞机请求起飞,并进入起飞队伍。\n", plane.name);
                        plane.in_queue_time = i;
                        q2.push(plane);
                        go_accepted++;
                    }
                    else{
                        printf("%d号飞机请求起飞但被拒绝了。\n",plane.name);
                    }
                    counts++;
                }
            }
         else{
            printf("历经%d个单位时间,机场停止接收请求。\n",time);
            printf("\n\n一共收到了%d架飞机的请求。\n",total);
            printf("一共有%d架请求降落。其中有%d架被接受了,%d架被拒绝了。\n", total_come , come_accepted , total_come - come_accepted );
            printf("一共有%d架请求起飞。其中有%d架被接受了,%d架被拒绝了。\n\n", total_go, go_accepted , total_go - go_accepted );
            printf("成功降落了%d架,还有%d架在排队等待降落。\n", come_accepted-q1.size(), q1.size());
            printf("成功起飞了%d架,还有%d架在排队等待起飞\n\n", go_accepted-q2.size(),q2.size());
            printf("轨道有%.2f%%的时间是空闲的。\n",(double)(100*spare_time)/time);
            printf("降落平均要等%.2f个单位时间。\n",(double)(come_wait_time)/time);
            printf("起飞平均要等%.2f个单位时间。\n\n",(double)(go_wait_time)/time);
            printf("这个机场平均每个单位时间收到%.2f个降落请求。\n",(double)(total_come)/time);
            printf("这个机场平均每个单位时间收到%.2f个起飞请求。\n\n",(double)(total_go)/time);
        }
    }
    return 0;
}

emm说一下这道题需要用的的知识点:

①队列(两个:待降落和待起飞)
常规操作:
queuename.push(x),
queue_name.front(),
queue_name.pop(),
queue_name.size().

②结构体(记录飞机的编号和入队时间)

③随机数的产生、泊松分布实现(自动产生每个时刻请求降落和起飞的飞机数)

emm最后想说,,本人水平有限,这个代码很烂,期待大佬指点(╥╯^╰╥)

你可能感兴趣的:(大一下,数据结构)