[C++]課題設計:電梯問題(第三版,本人最終版)
//Bell.h
#ifndef BELL_H
#define BELL_H
class Bell{
public:
void Ring()
{
cout << "電梯鈴發出:叮!" << endl;
}
};
#endif //BELL_H
//Building.h
#ifndef BUILDING_H
#define BUILDING_H
#include "Elevator.h"
#include "Floor.h"
#include "ElevatorDoor.h"
class Building {
public:
void PressOutsideButton1(vector<Person>::iterator);
void PressOutsideButton2(vector<Person>::iterator);
protected:
Floor F1;
Floor F2;
Elevator Ele;
ElevatorDoor EleDoor1;
ElevatorDoor EleDoor2;
Button OutsideButton1;
Button OutsideButton2;
void CheckElevatorOutsideButton();
};
inline void Building::PressOutsideButton1(vector<Person>::iterator iter)
{
(*iter).PrintPersonNum();
cout << "按下大樓第1層的電梯外開關,";
if (Ele.State==1) EleDoor1.Open();
else if (Ele.State==2)
{
Ele.Down2to1();
OutsideButton1.LightOn();
}
else OutsideButton1.LightOn();
}
inline void Building::PressOutsideButton2(vector<Person>::iterator iter)
{
(*iter).PrintPersonNum();
cout << "按下大樓第2層的電梯外開關,";
if (Ele.State==2) EleDoor2.Open();
else if (Ele.State==1)
{
Ele.Up1to2();
OutsideButton2.LightOn();
}
else OutsideButton2.LightOn();
}
inline void Building::CheckElevatorOutsideButton()
{
EleDoor1.Close(); //執行電梯關門造作。
EleDoor2.Close();
if (Ele.State==1 ||Ele.State==2)//電梯狀態靜止
{
if (OutsideButton1.LightState()) //如果1層外的燈還亮著
Ele.Down2to1(); //讓電梯從2層去1層
if (OutsideButton2.LightState()) //如果2層外的燈還亮著
Ele.Up1to2(); //讓電梯從1層去2層
}
}
#endif // BUILDING_H
//Button.h
#ifndef BUTTON_H
#define BUTTON_H
#include <iostream>
using namespace std;
class Button{
public:
Button():State(0){}
void LightOn();
void LightOff();
bool LightState() {return State;}
private:
bool State; // 0:滅 1:亮
};
inline void Button::LightOn()
{
if (!State)
{
State = 1;
cout << "開關的燈亮了。"<<endl;
}
}
inline void Button::LightOff()
{
if (State)
{
State = 0;
cout << "開關的燈滅了。"<<endl;
}
}
#endif //BUTTON_H
//Elevator.cpp
#include "Elevator.h"
void Elevator::Next()
{
if (LeftTime==0)
{
if (State==12) //到達了2層
{
State=2;
Stop();
if (InsideButton2.LightState())
{
cout << "電梯內";
InsideButton2.LightOff();
}
ElevatorBell.Ring();
}
if (State==21) //到達了1層
{
State=1;
Stop();
if (InsideButton1.LightState())
{
cout << "電梯內";
InsideButton1.LightOff();
}
ElevatorBell.Ring();
}
}
else
{
LeftTime--;
if (State==12) //正在升至2層
Up();
if (State==21) //正在將至1層
Down();
}
}
void Elevator::PressInsideButton1(vector<Person>::iterator iter) //去1樓
{
(*iter).PrintPersonNum();
cout <<"按下了電梯內去1層的開關," ;
InsideButton1.LightOn();
Down2to1();
}
void Elevator::PressInsideButton2(vector<Person>::iterator iter) //去2樓
{
(*iter).PrintPersonNum();
cout <<"按下了電梯內去2層的開關," ;
InsideButton2.LightOn();
Up1to2();
}
inline void Elevator::Down2to1()
{
LeftTime = 5 - 1; //電梯從2層移至1層需要5秒鐘。
State = 21;
}
inline void Elevator::Up1to2()
{
LeftTime = 5 - 1; //電梯從1層移至2層需要5秒鐘。
State = 12;
}
inline void Elevator::Down()
{
cout << "電梯正在下降..."<<endl;
}
inline void Elevator::Up()
{
cout << "電梯正在上升..."<<endl;
}
inline void Elevator::Stop()
{
cout << "電梯停止升降。"<<endl;
}
//Elevator.h
#ifndef ELEVATOR_H
#define ELEVATOR_H
#include "Button.h"
#include "Person.h"
#include <vector>
#include "Bell.h"
class Elevator{
public:
Elevator():State(1),LeftTime(0){} //開始時,電梯停在1樓
void Next();
void Up1to2();
void Down2to1();
void Up();
void Down();
void Stop();
void PressInsideButton1(vector<Person>::iterator);
void PressInsideButton2(vector<Person>::iterator);
int State;// 1:停在一樓 2:停在二樓 12:從一到二樓 21:從二到一樓
private:
int LeftTime; // 剩餘到達時間
Button InsideButton1; //內按鈕1
Button InsideButton2; //內按鈕1
Bell ElevatorBell; //電梯鈴
};
#endif //ELEVATOR_H
//ElevatorDoor.h
#ifndef ELEVATORDOOR_H
#define ELEVATORDOOR_H
class ElevatorDoor{
public:
ElevatorDoor():State(0) {}
void Open();
void Close();
bool EleDoorState() {return State;}
private:
bool State; // 1:開 0:關
};
inline void ElevatorDoor::Close()
{
if (State==1)
{
State = 0;
cout << "電梯門自動關閉。"<<endl;
}
}
inline void ElevatorDoor::Open()
{
if (State==0)
{
State = 1;
cout << "電梯門自動開啟。"<<endl;
}
}
#endif //ELEVATORDOOR_H
//ElevatorEvent.cpp
/*
電梯問題(第三版)
06030706 毛佳茗
2005年12月13日
*/
#include "windows.h"
#include "Event.h"
int TimeLeft;
Event ElevatorEvent;
//SetTimer,用法參考自MSDN
VOID CALLBACK OnTimer(
HWND hwnd, // handle of window for timer messages
UINT uMsg, // WM_TIMER message
UINT idEvent, // timer identifier
DWORD dwTime // current system time
)
{
ElevatorEvent.NextEvent(); //電梯事件
TimeLeft--;
}
int main()
{
int sec=0;
cout << "請輸入需要演示多少時間?(單位:秒)";
cin >> TimeLeft;
ElevatorEvent.Begin();//開始演示
MSG msg;
UINT_PTR send=SetTimer(NULL,0, 1000, (TIMERPROC)OnTimer);
while (GetMessage (&msg, NULL, 0, 0))
{
if (TimeLeft==-1) break;
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
KillTimer(NULL,send);
ElevatorEvent.End(); //結束演示
}
//Event.cpp
#include "Event.h"
#include <algorithm>
#include <cstdlib>
// 比較使用者優先順序函式
bool GreaterPersonStatus(const Person& p1, const Person& p2)
{
return p1.Status > p2.Status;
}
// 下一個事件函式
void Event::NextEvent()
{
cout << "/n現在時間:" << timing(1) << "秒" << endl; //列印並增加時間
NextProducePerson(); //是否產生人?
Ele.Next(); //下一個電梯事件
//按人的狀態3,2,1對使用者組排序
stable_sort(_Person.begin(),_Person.end(),GreaterPersonStatus);
//根據使用者情況,判斷下一步動作
for (PersonIterVec iter = _Person.begin() ; iter!= _Person.end(); ++iter)
{
switch( (*iter).WhichStatus() )
{
case 1: //等待進入樓層
WaitforFloor(iter);
WaitforElevator(iter);
break;
case 2: //等待進入電梯
WaitforElevator(iter);
break;
case 3: //正在電梯中
if ( Ele.State == (*iter).WhichGoStorey() ) PersonLeave(iter);
break;
default:
break;
}
}
CheckElevatorOutsideButton();//檢查是否亮燈,並關門
}
//等待進入樓層
void Event::WaitforFloor(PersonIterVec iter)
{
(*iter).PrintPersonNum();
if ((*iter).WhichOnStorey()==1) //在1層
if (F1.OneCome()) (*iter).ChangeStatus(2); // 狀態改變為等待進入電梯
else cout << "由於樓層被他人佔用,需等待。"<< endl;
if ((*iter).WhichOnStorey()==2)
if (F2.OneCome()) (*iter).ChangeStatus(2); // 狀態改變為等待進入電梯
else cout << "由於樓層被他人佔用,需等待。"<< endl;
}
//等待進入電梯
void Event::WaitforElevator(PersonIterVec iter)
{
if ((*iter).WhichStatus() ==2) //確定狀態已經為等待進入電梯
{ //在1層
if ((*iter).WhichOnStorey()==1) WaitforElevatorOnF1(iter);
//在2層
if ((*iter).WhichOnStorey()==2) WaitforElevatorOnF2(iter);
}
}
void Event::WaitforElevatorOnF1(PersonIterVec iter) //等待進入電梯,在1層
{
if (Ele.State == 1) //電梯所在層與使用者所在層相同
{
if (OutsideButton1.LightState()) //如果燈亮著,則自動開啟門,並熄滅燈
{
cout << "大樓第1層外電梯";
OutsideButton1.LightOff();
EleDoor1.Open();
}
if (!EleDoor1.EleDoorState()) PressOutsideButton1(iter); //如果門關著,則需按下按鈕
(*iter).ChangeStatus(3); //狀態變為已近進入電梯
F1.OneGo();//離開該層
Ele.PressInsideButton2(iter);//按下電梯內去2層的按鈕
EleDoor1.Close();
}
//如果電梯不在該層,則
else
if (!OutsideButton1.LightState()) PressOutsideButton1(iter); //使用者還沒有去按,則
else PersonWait(iter);
}
void Event::WaitforElevatorOnF2(PersonIterVec iter) //等待進入電梯,在2層
{
if (Ele.State == 2) //電梯所在層與使用者所在層相同
{
if (OutsideButton2.LightState()) //如果燈亮著,則自動開啟門,並熄滅燈
{
cout << "大樓第2層外電梯";
OutsideButton2.LightOff();
EleDoor2.Open();
}
if (!EleDoor2.EleDoorState()) PressOutsideButton2(iter); //如果門關著,則需按下按鈕
(*iter).ChangeStatus(3); //狀態變為已近進入電梯
F2.OneGo();//離開該層
Ele.PressInsideButton1(iter);//按下電梯內去1層的按鈕
EleDoor2.Close();
}
//如果電梯不在該層,則
else
if (!OutsideButton2.LightState()) PressOutsideButton2(iter); //使用者還沒有去按,則
else PersonWait(iter);
}
inline void Event::PersonWait(PersonIterVec iter)
{
(*iter).PrintPersonNum();
cout << "繼續等待電梯。"<<endl;
}
void Event::PersonLeave(PersonIterVec iter)
{
if ((*iter).WhichGoStorey() == 1) EleDoor1.Open();
if ((*iter).WhichGoStorey() == 2) EleDoor2.Open();
(*iter).ChangeStatus(4);
}
void Event::ProducePerson()
{
Person NewPerson;
_Person.push_back (NewPerson);
}
void Event::NextProducePerson()
{
if (NextProducePersonTime == WhatNowTime())
{
ProducePerson();
srand( (unsigned)time( NULL ) );
NextProducePersonTime = WhatNowTime() + rand() % 16 + 5; //假設每隔5到20 秒人們隨機到達每層。
cout << "下一個人,將會在第" << NextProducePersonTime << "秒出現。" << endl;
}
}
//Event.h
#ifndef EVENT_H
#define EVENT_H
#include "Time.h"
#include "Person.h"
#include "Building.h"
#include <vector>
typedef vector<Person>::iterator PersonIterVec;
class Event : private Building, private Time { // 繼承 Building類 和 Time類
public:
Event():NextProducePersonTime(0){};
void Begin();
void End();
void NextEvent();
private:
void NextProducePerson();
void ProducePerson();
void PersonWait(PersonIterVec);
void PersonLeave(PersonIterVec);
void WaitforFloor(PersonIterVec);
void WaitforElevator(PersonIterVec);
void WaitforElevatorOnF1(PersonIterVec);
void WaitforElevatorOnF2(PersonIterVec);
int NextProducePersonTime;
vector <Person> _Person;
};
inline void Event::Begin()
{
cout << "/n開始演示電梯事件:" << endl ;
}
inline void Event::End()
{
cout << "/n電梯事件演示結束。" << endl;
}
#endif //EVENT_H
//Floor.h
#ifndef FLOOR_H
#define FLOOR_H
class Floor {
public:
Floor():State(0){}
bool OneCome(); // 要來一個人
void OneGo() {State = 0;} // 走了一個人
private:
bool State; // 0:沒有人 1:有人了
};
inline bool Floor::OneCome()
{
if (State==0)
{
cout << "來到電梯門外,等候電梯。" << endl;
State=1;
return 1;
}
else return 0;
}
#endif //FLOOR_H
//Person.cpp
#include "Person.h"
int Person::Num = 0;
void Person::ChangeStatus(int i)
{
switch(i)
{
case 1:
Status = 1;
cout << "使用者" << PersonNum << "的狀態轉變為:" << "等待進入樓層。" << endl;
break;
case 2:
Status =2;
cout << "使用者" << PersonNum << "的狀態轉變為:" << "等待進入電梯。" << endl;
break;
case 3:
Status = 3;
cout << "使用者" << PersonNum << "的狀態轉變為:" << "已經進入電梯。" << endl;
break;
case 4:
Status = 4;
cout << "使用者" << PersonNum << "的狀態轉變為:" << "走出電梯,去做其它事情。" << endl;
break;
}
}
//Person.h
#ifndef PERSON_H
#define PERSON_H
#include <cstdlib>
#include <iostream>
#include <time.h>
using namespace std;
class Person {
public:
Person():Status(1)
{
srand( (unsigned)time( NULL ) );
OnStorey = rand() % 2 + 1;
if (OnStorey==1) GoStorey = 2;
else GoStorey = 1;
PersonNum = ++Num;
cout << "一個人到來,編號:" << PersonNum << ",他將會在" << OnStorey << "層守候電梯,然後去" << GoStorey << "層。" <<endl;
}
friend bool GreaterPersonStatus(const Person&, const Person&);
void ChangeStatus(int);
void PrintPersonNum(){ cout << "使用者" << PersonNum; };
int WhichOnStorey() {return OnStorey;};
int WhichGoStorey() {return GoStorey;};
int WhichStatus() {return Status;};
private:
int OnStorey; // 所在層
int GoStorey; // 要去的層
int Status; // 1,等待進入樓層 2,等待進入電梯 3,在電梯中 4,已近離開電梯
int PersonNum; // 編號
static int Num; // 已經產生的總人數
};
#endif //PERSON_H
//Time.h
#ifndef TIME_H
#define TIME_H
class Time {
public:
Time():NowTime(-1){} //初始時間為-1
int WhatNowTime() { return NowTime; }; //返回現在的時間
int timing (int) ; //時間增加
private:
int NowTime;
};
inline int Time::timing(int AddTime)
{
NowTime += AddTime;
return NowTime;
}
#endif //TIME_H
相關推薦
[C++]課題設計:電梯問題(第三版,本人最終版)
//Bell.h #ifndef BELL_H#define BELL_H class Bell{public: void Ring() { cout << "電梯鈴發出:叮!" << endl; }}; #endif //BELL_H //Bui
第七章:JavaScript(第三話)
文章目錄 第一節:函式 ==函式的定義== 函式不同定義方法的區別 ==函式的執行與常用事件== 內建函式 函式
C語言——反彈球遊戲(第三階段
char tst sys pre 初始 數組 元素 clas main 遇到了一些問題,有些地方不能運行 #include<stdio.h> #include<stdlib.h> #include<windows.h> #inclu
C++ Primer Plus:中文版(第六版)PDF下載
邏輯操作符 使用 wid site ive 友元 rime blank 虛函數 網盤下載地址:C++ Primer Plus:中文版(第六版)PDF下載 – 易分享電子書PDF資源網 作者: Stephen Prata 出版社: 人民郵電
Python學習筆記(第三天,文件操作、函數)
input 釋放空間 打開方式 只需要 不能 解決 信息 無法查看 一個 一、文件處理 1、文件打開模式 打開文本的模式,默認添加t,需根據寫入或讀取編碼情況添加encoding參數。 r 只讀模式,默認模式,文件必須存在,不能存在則報異常。 w
《Oracle PL/SQL開發指南》學習筆記31——原始碼除錯——函式和過程(第三部分,並行查詢及管道函式)
1. PARALLEL_ENABLE子句(啟用並行查詢以提高效能) 首次接觸,學習一下: PARALLEL_ENABLE lets you designate a function to support parallel query capabilities. This
OpenCV 3 pyton(第三章,二值化和尋找輪廓線)
retval, dst = cv.threshold( src, thresh, maxval, type[, dst] ) 這是個閾值化操作 src是input array (多通道, 8-bit or 32-bit floating point). d
co_routine.cpp/.h/inner.h(第三部分 : 協程的執行)—— libco原始碼分析、學習筆記
由於本原始碼蠻長的,所以按照功能劃分模組來分析,分為若干部分,詳見二級目錄↑ 三、協程的執行 void co_yield_env( stCoRoutineEnv_t *env );//將當前執行的env從協程棧中出棧並將執行權交給父協程。 void co_y
Spring 實戰學習筆記(第三章 Bean的高階裝配)
一、開發環境、測試環境與生產環境載入不同資料的配置方式 [email protected]註解應用 @Profile註解配置方式, 1)配置在類上(只有prod或者dev profile啟用時,才會建立對應的bean) package com.myapp; i
Redis從入門到熟練使用之Sentine哨兵(詳解,第三篇,共五篇)
配置Sentinel哨兵 Redis 的 Sentinel 系統用於管理多個 Redis 伺服器(instance), 該系統執行以下三個任務: 監控(Monitoring): Sentinel 會不斷地檢查你的主伺服器和從伺服器是否運作正常。 提醒(Notificat
資料結構 c語言實現順序佇列(輸數字入隊,字元出隊)
一.標頭檔案seqqueue.h實現 #ifndef __SEQQUEUE_H__ #define __SEQQUEUE_H__ #include<stdio.h> #include<stdlib.h> #include<stdbool.h&g
關於Oracle中查詢的數字值的顯示格式需要保留小數點後兩位(或者三位,及其他位數)
方法一:使用to_char的fm格式,即: to_char(round(data.amount,2),'FM9999999999999999.00') as amount 不足之處是,如果數值是0的話,會顯示為.00而不是0.00。 另一需要注意的是,格式中小數點左邊9的個數要夠多,否則查詢的數字會顯示為n
一起talk C栗子吧(第三十四回:C語言實例--巧用溢出計算最值)
gcc 空間 代碼 讓我 計算 max value 其他 存儲 點擊 各位看官們。大家好,上一回中咱們說的是巧用移位的樣例,這一回咱們說的樣例是:巧用溢出計算最值。 閑話休提,言歸正轉。讓我們一起talk C栗子吧! 大家都知
c語言學習之選擇結構程序設計(第三天)
c語言 選擇結構為了增加理解,寫的幾個小程序1:判斷三角形的成立以及輸出最大邊 練習前三種語句#include <stdio.h> int main() { int a,b,c; printf("請輸入三角形三邊長(邊為整數,不能輸入負數):"); scanf("%d%d%d", &a ,
1014 C語言程序設計教程(第三版)課後習題6.4
content += 教程 print ons ont c語言程序設計 lld cnblogs 題目描述 求Sn=1!+2!+3!+4!+5!+…+n!之值,其中n是一個數字。 輸入 n 輸出 和 樣例輸入 5 樣例輸出 153 1 #include "stdio.h"
1013: C語言程序設計教程(第三版)課後習題6.3
其中a是一個數字 blog += color turn sam c語言程序 [] c語言 題目描述 求Sn=a+aa+aaa+…+aa…aaa(有n個a)之值,其中a是一個數字。 例如:2+22+222+2222+22222(n=5),n由鍵盤輸入。 輸入 a 輸出 和 樣
1024: C語言程序設計教程(第三版)課後習題7.3
c語言程序 print clas 程序 scanf col class pri printf 題目描述 求一個3×3矩陣對角線元素之和。 輸入 矩陣 輸出 主對角線 副對角線 元素和 樣例輸入 1 2 3 1 1 1 3 2 1 樣例輸出 3 7 1 #include
1046: C語言程序設計教程(第三版)課後習題10.4
con n) 順序 調整 style char ++ 輸入數據 include 題目描述 有n個整數,使前面各數順序向後移m個位置,最後m個數變成前面m個數,見圖。寫一函數:實現以上功能,在主函數中輸入n個數和輸出調整後的n個數。 輸入 輸入數據的個數n n個整數 移動的位
初夏小談:斐波那契三種實現方法(C語言版)(第三種相信你沒見過)
斐波那契數列(Fibonaccisequnce),又稱黃金分割數列。研究斐波那契數列有相當重要的價值,例在現代物理、準晶體結構、化學等領域都有直接的應用。因此研究斐波那契數列也是很有必要的。 今天初夏將為大家帶來計算斐波那契數列第n位的三種方法 第一種利用遞迴的方法計算,程式碼相當簡單,但其
Effective Objective-C 2.0 總結與筆記(第三章)—— 介面與API設計
第三章:介面與API設計 在開發應用程式的時候,總是不可避免的會用到他人的程式碼,或者自己的程式碼被他人所利用,所以要把程式碼寫的更清晰一點,方便其他開發者能夠迅速而方便地將其整合到他們的專案裡。 第15條:用字首避免名稱空間衝突 Objective-C