?? parksimu.cpp
字號:
// ParkSimu.cpp : Defines the entry point for the console application.
//
// 本程序模擬停車場的車位管理。主要考察隊(duì)列的應(yīng)用。
// 劉楚雄創(chuàng)建于2007年4月4日晚23:27
#include "stdafx.h"
#include "common.h"
#include "QueueLnk.h"
#include <windows.h> // Sleep函數(shù)用
#define MAXNUMS 100 // 停車場停車位最大數(shù)量
#define MAX_PARK_TIME 20000 // 車最多在停車場停留時(shí)間(以毫秒為單位)
typedef struct
{
int car_id; // 車號
long tParking; // 開始停車時(shí)間
long tLeft; // 車離開停車場時(shí)間
}ParkSpace; // 停車位
// 假定以1秒鐘算1小時(shí),不足1秒按1秒計(jì)算
int price = 1;
// 車在某個(gè)時(shí)刻到來的概率
double dArriveRate = 0.3;
// space[] --存放停車場車位
// space_num--停車場車位數(shù)
// tCur -- 當(dāng)前時(shí)間
// 返回第一個(gè)空的車位位置號
int CheckParkingSpace(ParkSpace space[], int space_num, long tCur)
{
int free_space = -1; // 空車位位置
long tSpan; // 停車時(shí)長
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)
{// 檢查該車位,看該車位的車是否到時(shí)間了,需要離開
tSpan = space[i].tLeft - space[i].tParking; // 求停車時(shí)長(此時(shí)單位為毫秒)
double charge = price*(long)ceil(tSpan/1000.0);// 計(jì)算停車費(fèi)用
// 輸出該車的停車信息
printf("第%d號車于%ld時(shí)離開,停車時(shí)長%d,停車費(fèi)%6.2lf元.\n",
space[i].car_id, space[i].tLeft, tSpan, charge);
space[i].car_id = -1; // 車離開后,置該位置的車號為-1
}
}
return free_space;
}
// 停車場管理模擬
// tClose--停車場關(guān)門時(shí)間
void Simulation(int tClose)
{
long tCur, tStart;
tStart = clock(); // 起始時(shí)間
tCur = 0; // 當(dāng)前時(shí)間(相對于起始時(shí)間)
int car_id = 0;
double dCurRate; // 當(dāng)前概率值
ParkSpace park_space[MAXNUMS];// 存放所有停車位
// 初始化停車場所有的車位信息
for(int i=0; i<MAXNUMS; i++)
park_space[i].car_id = -1;
// 隊(duì)列,用于車到停車場,在入位之前排隊(duì)
LinkQueue q;
InitQueue(&q);
while(tCur < tClose)
{
dCurRate = rand()/(double)RAND_MAX;
// 如果當(dāng)前的值小于給定的概率值就判定本時(shí)刻來一輛車,否則不來
if(dCurRate < dArriveRate)
{// 有車到來, 直接進(jìn)入隊(duì)列排隊(duì)
InQueue(&q, ++car_id);
//////////////////////////////////////////////////////
printf("第%d號車于%d時(shí)到達(dá)停車場。\n", car_id, tCur);
}
// 檢查停車場是否有空位。有的話返回空位位置,并從隊(duì)列中取出排頭的
// 的車進(jìn)入空位位置。同時(shí)檢查過程中把要離開的車清除除去,并打印相應(yīng)
// 的信息
int space_id;
space_id = CheckParkingSpace(park_space, MAXNUMS, tCur);
if(space_id >= 0 && !IsQueueEmpty(&q))
{// 停車場有空位并且有車在排隊(duì)
park_space[space_id].car_id = GetFront(&q);
park_space[space_id].tParking = tCur;
// 離開時(shí)間等于開始停車時(shí)間加上隨即給定的停車時(shí)長
park_space[space_id].tLeft = tCur + (int)(rand()/(double)RAND_MAX*MAX_PARK_TIME);
/////////////////////////////////////////////////////////////
printf("第%d號車于%d時(shí)進(jìn)入停車位%d,計(jì)費(fèi)開始。\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(" 版權(quán)所有歸劉楚雄,2007年4月4日\n\n");
printf("請輸入模擬終止時(shí)間:");
scanf("%d", &tClose);
printf("\n現(xiàn)在開始模擬...\n\n");
Sleep(1000);
// 初始化隨機(jī)數(shù)序列
srand(clock());
Simulation(tClose);
printf("\n停車場模擬結(jié)束。\n");
getch();
return 0;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -