エレベーターシミュレータ

#エレベーターシミュレータを作成する

[C++プログラミング〈Vol.1〉 (Computer Science Textbook)](https://www.amazon.co.jp/C-%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%80%88Vol-1%E3%80%89-Computer-Science-Textbook/dp/489471115X)のオブジェクト指向プログラミング課題であるエレベーターシミュレータを作成する。

要件定義は以下の通りです。

> 　①ある会社が2階建てのオフィスビルを建て、それに最新型のエレベータを設置しようとしている。会社はそのエレベータが要求を満たすものかどうかを判定するために、エレベータの動きをモデル化したオブジェクト指向のソフトウェアシミュレータを作ってほしいとあなたに依頼した。

> 　②このエレベータは1人乗りで、エネルギーを節約するために、必要なとき以外は動かないように設計されている。エレベータは毎朝、ドアを閉めた状態でビルの1階で待機している。もちろん、エレベータは上下に行き来できる。

> 　③シミュレータには時計が組み込まれていて、毎日0時にセットされたあとは、1秒単位で時間を刻む。シミュレータにはスケジューラも組み込まれていて、各フロアに最初の乗客が現われる時刻をランダムに選ぶ(ランダムに到着時刻を選ぶ方法は、第3章で学びます)。時計の時刻がランダムに選ばれた最初の到着時刻に等しくなったとき、シミュレータは新しい乗客を「生成」し、指定されたフロアに配置する。乗客はそのフロアの上行きボタンまたは下行きボタンを押す。ただし、行き先はいまいるフロアとは必ず異なるものとする。

> 　④その日の最初の乗客が1階に現われたときは、すぐにエレベータに乗り込む(もちろん、上行きボタンを押して、エレベータのドアが開いたあとで)。最初の乗客が2階に現われたときは、エレベータが着いてから乗り込む。エレベータがフロア間を移動するのに5秒かかるものとする。

> 　⑤エレベータがあるフロアに着くと、そのフロアのドアの上にあるライトが点灯し、ベルが鳴る。そして、そのフロアにある行き先ボタンとエレベータ内の行き先ボタンがリセットされ、ドアが開き、乗客がいるなら降りる。続いて、待っている乗客がいるなら乗り込み、行き先ボタンを押すとドアが閉まる。エレベータは動き出すまえに動く方向を決定する(2階建てビルの場合は簡単!)。問題を単純化するため、エレベータがあるフロアに着いてからドアが開くまでの時間はゼロと仮定する。エレベータは自分がいまどのフロアにいて、次にどのフロアに行かねばならないかをつねに知っているものとする。

> 　⑥各フロアで一度に待てる乗客は高々1人とする。そのため、すでに待っている乗客がいるフロアに新しい乗客(エレベータ内の乗客ではない)が現われたときは、1秒後に到着時刻を選び直すこととする。問題を単純化するため、乗客は一度に1人しか「生成」しないこととする。したがって、次の乗客の到着時刻が重複することは決してない。乗客は5~20秒間隔で各フロアにランダムに現われると仮定する。(第3章で、乱数を生成して到着時刻をランダムに選ぶ方法を学びます)。

> 　あなたの目標は(第2章から第7章までに設けた特別なこの節を通して)、以上の問題仕様に沿って動くエレベータのソフトウェアシミュレータを作ることです。あなたのプログラムはエレベータの動きを数分間シミュレートし、そのエレベータがオフィスビル内の予想される乗客数をさばくのに十分な能力があるかどうかを判定しなければなりません。


##研究課題１

###(1)

- ビル、エレベーター、会社、時計、スケジューラ、乗客、ライト、フロア、ベル、ボタン

###(2)

- シミュレータ
- ビル
    - 2階建て①
- エレベーター
    - 一人乗り②
    - 必要な時以外は動かない②
    - 毎朝、ドアを閉めた状態でビルの1階で待機している②
    - エレベーターがフロア間を移動するのに5秒かかる④
    - フロアに着いてからドアが開くまでの時間はゼロとする⑤
    - エレベータは自分が今どのフロアにいて、次にどのフロアに行かねばならないかを常に知っている⑤
- 時計
    - 毎日0時にセットされた後は、1秒単位で時間を刻む③
- スケジューラ
    - 各フロアに最初の乗客が現れる時刻をランダムに選ぶ③
    - 時計の時刻がランダムに選ばれた最初の到着時刻に等しくなった時、新しい乗客を「生成」し、指定されたフロアに配置する③
    - すでに待っている乗客がいるフロアに新しい乗客(エレベータ内の乗客ではない)が現れた時は、1秒後に到着時刻を選び直す⑥
    - 乗客は一度に一人しか「生成」しない⑥
    - 次の乗客の到着時刻が重複することはない⑥
    - 乗客は5~20秒間隔で各フロアにランダムに現れる⑥
- 乗客
    - 乗客はそのフロアの上行きまたは下行きボタンを押す③
    - ただし、行先はいまいるフロアとは必ず異なるものとする③
    - その日の最初のの乗客が1階に現れた時は、すぐにエレベーターに乗り込む④
    - 最初の乗客が2階に現れた時は、エレベーターが着いてから乗り込む④
    - 目的のフロアに着いたらすぐに降りる⑤
- ライト
    - エレベーターがあるフロアに着くと、ライトは点灯する⑤
- ベル
    - エレベーターがあるフロアに着くと、ベルが鳴る⑤
- ボタン
    - エレベーターがあるフロアに着くと、そのフロアにある行き先ボタンとエレベーター内の行き先ボタンがリセットされる⑤
- ドア
    - 毎朝、ドアを閉めた状態でビルの1階で待機している②
    - エレベーターがあるフロアに着くと、ドアが開く⑤
- フロア
    - 各フロアで一度に待てる乗客は高々1人とする⑥

##研究課題２

###(2)

- シミュレータ
- ビル
    - 属性
        - 2階建て
    - その他の事実
- エレベーター
    - 属性
        - 一人乗り
        - 行き先
        - いまいるフロアがどこか
        - 待機
    - その他の事実
        - 必要な時以外は動かない
        - 毎朝、ドアを閉めた状態でビルの1階で待機している
        - エレベーターがフロア間を移動するのに5秒かかる
        - フロアに着いてからドアが開くまでの時間はゼロ
        - エレベータは自分が今どのフロアにいて、次にどのフロアに行かねばならないかを常に知っている
- 時計
    - 属性
        - 時刻
    - その他の事実
        - 毎日0時にセットされた後は、1秒単位で時間を刻む
- スケジューラ
    - 属性
        - 乗客が現れるフロア
        - 到着時刻
    - その他の事実
        - 各フロアに最初の乗客が現れる時刻をランダムに選ぶ
        - 時計の時刻がランダムに選ばれた最初の到着時刻に等しくなった時、新しい乗客を「生成」する
        - 指定されたフロアに配置する
        - すでに待っている乗客がいるフロアに新しい乗客(エレベータ内の乗客ではない)が現れた時は、1秒後に到着時刻を選び直す
        - 乗客は一度に一人しか「生成」しない
        - 次の乗客の到着時刻が重複することはない
        - 乗客は5~20秒間隔で各フロアにランダムに現れる
- 乗客
    - 属性
        - 行き先
        - 現れたフロア
        - エレベータに乗り込む
        - 待機
        - 最初の乗客か
        - 目的に着いたがどうか
    - その他の事実
        - 乗客はそのフロアの上行きまたは下行きボタンを押す
        - ただし、行先はいまいるフロアとは必ず異なるものとする
        - その日の最初のの乗客が1階に現れた時は、すぐにエレベーターに乗り込む
        - 最初の乗客が2階に現れた時は、エレベーターが着いてから乗り込む
        - 目的のフロアに着いたらすぐに降りる
- ライト
    - 属性
        - 点灯
    - その他の事実
        - エレベーターがあるフロアに着くと、ライトは点灯する
- ベル
    - 属性
        - 鳴る
    - その他の事実
        - エレベーターがあるフロアに着くと、ベルが鳴る
- ボタン
    - 属性
        - エレベーター内の行き先ボタン
        - フロアにある行き先ボタン
        - 行き先
    - その他の事実
        - エレベーターがあるフロアに着くと、そのフロアにある行き先ボタンとエレベーター内の行き先ボタンがリセットされる
- ドア
    - 属性
        - 開閉
    - その他の事実
        - 毎朝、ドアを閉めた状態でビルの1階で待機している
        - エレベーターがあるフロアに着くと、ドアが開く
- フロア
    - 属性
        - 待っている乗客がいる
        - 各フロアで一度に待てる乗客は高々1人
        - フロアにある行き先ボタン
        - エレベータが着いたかどうか
    - その他の事実

##研究課題3

- シミュレータ
- ビル
    - 動作
- エレベーター
    - 動作
        - エレベータ内のボタンからの指示で、行き先のフロアに移動する
        - フロア側のボタンの指示で、行き先のフロアに移動する
        - 時計からの指示で、朝にビルの１階で待機する
        - ドアからの指示で、移動可能かが決まる
- 時計
    - 動作
        - シミュレータからの指示で、毎日0時にセットされる
- スケジューラ
    - 動作
        - 時計からの指示で、乗客の到着時刻になったら乗客を生成する
        - フロアからの指示で、フロアにすでに待っている乗客がいれば1秒後に到着時刻を選び直す
- 乗客
    - 動作
        - スケジューラからの指示で、生成される
        - ドアが開いて入れば(指示で)、エレベータに乗り込むor降りる
- ライト
    - 動作
        - エレベータからの指示で、点灯or消灯
- ベル
    - 動作
        - エレベータからの指示で、ベルが鳴るor止める
- ボタン(エレベータ内)
    - 動作
        - 乗客の指示で、行き先を情報を決定
        - エレベータの指示で、フロアに到着すると行き先情報がリセットされる
- ボタン(フロア側)
    - 動作
        - 乗客の指示で、行き先を情報を決定
        - エレベータの指示で、フロアに到着すると行き先情報がリセットされる
- ドア
    - 動作
        - エレベータの指示で、ドアを開閉
        - 乗客の指示で、ドアを開閉
- フロア
    - 動作
        - スケジューラからの指示で、乗客が到着する