1. 程式人生 > >[C++]課題設計:電梯問題(第三版,本人最終版)

[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