Elevator
100階建てのビルを想定したエレベーターのプログラムを作成しました。 初期現在階を50階とし、ボタンが押された階(コマンドプロンプトからの入力)へ、停止する順番を表示します。また、現在階を表示し、停止する階の入力時に現在階が入力された場合、文字列を表示してアナウンスします。 入力はEOFまたは-1が入力されるまで繰り返され、1~100以外の数値と数値以外が入力された場合、文字列でerrを表示します。 先に上へ行くか下へ行くかの判断は、現在階からの近さを基準に選択します。そして、全ての処理を終えたら、現在階を更新して入力を待機し、処理を繰り返します。 このプログラムはCtrl+Cで終了させます。 一枚目では、現在階と建物の大きさを設定し、停止する階を入れる配列を用意します。 現在階を表示し、入力してもらった停止する階を記憶しておく用の箱とそのシリアル値を記憶しておく用の箱を用意します。 次に、EOF・文字・数値のそれぞれの入力時処理を行います。また、無限ループの中で処理を行い、EOFまたは-1が入力された際にbreakでループから抜け出し、入力処理を終わらせます。この時、何回入力されたかをカウントしておきます。 二枚目では、上の階へ行く用の配列と下の階へ行く用の配列を用意し、次の処理の為に初期化しておきます。次に、四つの箱と最小値を求める際に比べる材料としてn+1が入った箱をそれぞれ二つ用意します。 現在階に近い方へエレベーターが動くので、入力した階と現在階を比べ、上と下のそれぞれの配列に入力した階を記憶し、差分を上と下のそれぞれ用意した箱に記憶します。この時、上へ行く回数と下へ行く回数をそれぞれ用意した箱に記憶します。 上昇カテゴリ内の最小値と下降カテゴリ内の最小値を求め、それらを比べて上昇するか下降するかを決めます。その判定結果は1か2で新しい箱に記憶させておきます。 最後に、画像三枚目のソート処理関数を用いて、先に上に行く場合の処理と先に下に行くときの処理をして、表示します。さらに、現在階を更新して次の処理を待ちます。 画像四枚目は処理結果です。