📄 parksimu.cpp
字号:
// ParkSimu.cpp : Defines the entry point for the console application.
//
// 本程序模拟停车场的车位管理。主要考察队列的应用。
// 刘楚雄创建于2007年4月4日晚23:27
#include "stdafx.h"
#include "common.h"
#include "QueueLnk.h"
#include <windows.h> // Sleep函数用
#define MAXNUMS 100 // 停车场停车位最大数量
#define MAX_PARK_TIME 20000 // 车最多在停车场停留时间(以毫秒为单位)
typedef struct
{
int car_id; // 车号
long tParking; // 开始停车时间
long tLeft; // 车离开停车场时间
}ParkSpace; // 停车位
// 假定以1秒钟算1小时,不足1秒按1秒计算
int price = 1;
// 车在某个时刻到来的概率
double dArriveRate = 0.3;
// space[] --存放停车场车位
// space_num--停车场车位数
// tCur -- 当前时间
// 返回第一个空的车位位置号
int CheckParkingSpace(ParkSpace space[], int space_num, long tCur)
{
int free_space = -1; // 空车位位置
long tSpan; // 停车时长
for(int i=0; i<space_num; ++i)
{ // car_id<0说明该车位空
if(space[i].car_id < 0 && free_space < 0)
free_space = i; // 找到空车位
else if(tCur >= space[i].tLeft && space[i].car_id >= 0)
{// 检查该车位,看该车位的车是否到时间了,需要离开
tSpan = space[i].tLeft - space[i].tParking; // 求停车时长(此时单位为毫秒)
double charge = price*(long)ceil(tSpan/1000.0);// 计算停车费用
// 输出该车的停车信息
printf("第%d号车于%ld时离开,停车时长%d,停车费%6.2lf元.\n",
space[i].car_id, space[i].tLeft, tSpan, charge);
space[i].car_id = -1; // 车离开后,置该位置的车号为-1
}
}
return free_space;
}
// 停车场管理模拟
// tClose--停车场关门时间
void Simulation(int tClose)
{
long tCur, tStart;
tStart = clock(); // 起始时间
tCur = 0; // 当前时间(相对于起始时间)
int car_id = 0;
double dCurRate; // 当前概率值
ParkSpace park_space[MAXNUMS];// 存放所有停车位
// 初始化停车场所有的车位信息
for(int i=0; i<MAXNUMS; i++)
park_space[i].car_id = -1;
// 队列,用于车到停车场,在入位之前排队
LinkQueue q;
InitQueue(&q);
while(tCur < tClose)
{
dCurRate = rand()/(double)RAND_MAX;
// 如果当前的值小于给定的概率值就判定本时刻来一辆车,否则不来
if(dCurRate < dArriveRate)
{// 有车到来, 直接进入队列排队
InQueue(&q, ++car_id);
//////////////////////////////////////////////////////
printf("第%d号车于%d时到达停车场。\n", car_id, tCur);
}
// 检查停车场是否有空位。有的话返回空位位置,并从队列中取出排头的
// 的车进入空位位置。同时检查过程中把要离开的车清除除去,并打印相应
// 的信息
int space_id;
space_id = CheckParkingSpace(park_space, MAXNUMS, tCur);
if(space_id >= 0 && !IsQueueEmpty(&q))
{// 停车场有空位并且有车在排队
park_space[space_id].car_id = GetFront(&q);
park_space[space_id].tParking = tCur;
// 离开时间等于开始停车时间加上随即给定的停车时长
park_space[space_id].tLeft = tCur + (int)(rand()/(double)RAND_MAX*MAX_PARK_TIME);
/////////////////////////////////////////////////////////////
printf("第%d号车于%d时进入停车位%d,计费开始。\n",
park_space[space_id].car_id, tCur, space_id);
OutQueue(&q);
}
// 暂停1秒钟(即1秒钟检查一次)
Sleep(1000);
tCur = clock() - tStart;
}
}
int main(int argc, char* argv[])
{
long tClose;
printf(" 本程序模拟停车场的车位管理\n");
printf(" 版权所有归刘楚雄,2007年4月4日\n\n");
printf("请输入模拟终止时间:");
scanf("%d", &tClose);
printf("\n现在开始模拟...\n\n");
Sleep(1000);
// 初始化随机数序列
srand(clock());
Simulation(tClose);
printf("\n停车场模拟结束。\n");
getch();
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -