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

📄 parksimu.cpp

📁 通过自己设计数据结构来自己设计一高级的停车厂的模型并具体实施。
💻 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 + -