|
|
|
@ -169,8 +169,7 @@
|
|
|
|
|
|
|
|
|
|
# 3. 系统实现
|
|
|
|
|
|
|
|
|
|
该程序使用C++语言,主要用到了STL中的queue队列和cmath库中的exp()函数等。
|
|
|
|
|
开发工具是CodeBlocks和VS Code。
|
|
|
|
|
该程序使用C++语言,主要用到了STL中的queue队列和cmath库中的exp()函数等。开发工具是CodeBlocks和VS Code。
|
|
|
|
|
项目的文件结构如下:
|
|
|
|
|
main.cpp:主程序文件,包含程序的主函数和主要逻辑。
|
|
|
|
|
Random.h和Random.cpp:随机数生成的类,包含生成随机数和泊松分布的函数。
|
|
|
|
@ -189,7 +188,7 @@
|
|
|
|
|
在程序中,定义了两个queue对象,一个用于存储准备降落的飞机,另一个则用于存储准备起飞的飞机。每个队列中存储结构体类型的plane对象,表示每个飞机的编号和进入队列的时间。
|
|
|
|
|
在模拟过程中,程序使用队列的push()函数将新到达的飞机加入队列中,使用队列的pop()函数处理已经降落或起飞的飞机。程序还使用队列的empty()函数和front()函数来检查队列是否为空,并获取队列中的第一个元素。
|
|
|
|
|
|
|
|
|
|
可以配合程序代码加以说明。如:
|
|
|
|
|
如:
|
|
|
|
|
|
|
|
|
|
```cpp
|
|
|
|
|
struct plane{
|
|
|
|
@ -204,26 +203,29 @@ struct plane{
|
|
|
|
|
4.支持入队和出队操作:队列支持入队和出队操作,可以用于实现一些类似于任务派发、消息队列等功能。
|
|
|
|
|
|
|
|
|
|
## 3.2 核心算法的实现
|
|
|
|
|
该程序主要使用了两个算法来实现飞机的降落和起飞。
|
|
|
|
|
其中,降落的算法如下:
|
|
|
|
|
每个单位时间内,生成随机数决定当前有多少架飞机要降落,加入到降落队列中。
|
|
|
|
|
如果降落队列不为空,则处理降落队列中的第一架飞机。
|
|
|
|
|
如果起飞队列也不为空,则等待处理完降落队列中的飞机后,再处理起飞队列中的飞机。
|
|
|
|
|
记录每个飞机在队列中等待的时间,累加到总等待时间中。
|
|
|
|
|
起飞的算法类似于降落的算法,只是要进行一些修改。具体实现如下:
|
|
|
|
|
每个单位时间内,生成随机数决定当前有多少架飞机要起飞,加入到起飞队列中。
|
|
|
|
|
如果起飞队列不为空,则处理起飞队列中的第一架飞机。
|
|
|
|
|
如果降落队列不为空,则等待处理完起飞队列中的飞机后,再处理降落队列中的飞机。
|
|
|
|
|
记录每个飞机在队列中等待的时间,累加到总等待时间中。
|
|
|
|
|
|
|
|
|
|
可以配合程序代码加以说明。如:
|
|
|
|
|
该程序的核心算法主要是实现飞机的降落和起飞过程的模拟。具体来说,可以将核心算法分成以下几个部分:
|
|
|
|
|
1.生成随机数:程序使用泊松分布的随机数生成算法来模拟飞机的到达时间。该算法需要生成一系列随机实数,因此生成随机数的过程可以看作是核心算法的一部分。
|
|
|
|
|
2.处理降落队列:程序在每个单位时间内,会从降落队列中取出第一架等待降落的飞机,并根据降落时间模拟飞机降落的过程。如果降落队列为空,则不进行任何操作。
|
|
|
|
|
3.处理起飞队列:程序在处理完降落队列中的飞机后,会从起飞队列中取出第一架等待起飞的飞机,并根据起飞时间模拟飞机起飞的过程。如果起飞队列为空,则不进行任何操作。
|
|
|
|
|
4.记录等待时间:程序在处理完每个队列中的飞机后,会记录每架飞机在队列中等待的时间,并累加到总等待时间中。
|
|
|
|
|
|
|
|
|
|
如:
|
|
|
|
|
|
|
|
|
|
```cpp
|
|
|
|
|
// 冒泡排序
|
|
|
|
|
void bubble_sort(T a[], int n)
|
|
|
|
|
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;
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
该算法的时间复杂度为O(n),其中n为模拟的时间,即模拟了n个时间单位。在每个时间单位内,程序需要进行一些基本的操作,如生成随机数、检查队列是否为空、取出队列中的第一个元素等。这些操作的时间复杂度都是O(1),因此程序的总时间复杂度为O(n)。
|
|
|
|
@ -241,7 +243,8 @@ void bubble_sort(T a[], int n)
|
|
|
|
|
测试用例1:
|
|
|
|
|
输入: 10 5 1 1
|
|
|
|
|
预期结果: 程序能正常运行,没有任何飞机等待超时。
|
|
|
|
|
运行结果:##0号时间## 1号飞机降落了,等了0个单位时间。
|
|
|
|
|
运行结果:
|
|
|
|
|
##0号时间## 1号飞机降落了,等了0个单位时间。
|
|
|
|
|
##1号时间## 1号飞机降落了,等了0个单位时间。
|
|
|
|
|
##2号时间## 2号飞机降落了,等了0个单位时间。
|
|
|
|
|
##3号时间## 3号飞机降落了,等了0个单位时间。
|
|
|
|
@ -253,11 +256,13 @@ void bubble_sort(T a[], int n)
|
|
|
|
|
##9号时间## 9号飞机降落了,等了0个单位时间。
|
|
|
|
|
运行结果和预期结果一致,为通过测试。
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
测试用例2:
|
|
|
|
|
输入: 5 2 3 2
|
|
|
|
|
预期结果: 程序能正常运行,有一架飞机等待较长时间。
|
|
|
|
|
运行结果:##0号时间## 1号飞机降落了,等了0个单位时间。
|
|
|
|
|
运行结果:
|
|
|
|
|
##0号时间## 1号飞机降落了,等了0个单位时间。
|
|
|
|
|
##1号时间##
|
|
|
|
|
##2号时间## 2号飞机降落了,等了0个单位时间。 1号飞机降落了,等了2个单位时间。
|
|
|
|
|
##3号时间## 3号飞机降落了,等了0个单位时间。
|
|
|
|
@ -265,6 +270,12 @@ void bubble_sort(T a[], int n)
|
|
|
|
|
运行结果和预期结果一致,为通过测试。
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
特殊情况:
|
|
|
|
|
输入的飞机数量为0:如果输入的飞机数量为0,则程序不需要进行任何操作,直接输出所有飞机都已经降落。
|
|
|
|
|
输入的飞机数量超过了队列的最大容量:如果输入的飞机数量超过了队列的最大容量m,则程序只会处理前m架飞机,忽略掉超过m架的飞机。
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
# 5. 总结
|
|
|
|
|
|
|
|
|
|
概况项目和完成情况。
|
|
|
|
|