LoginSignup
2
2

More than 3 years have passed since last update.

自動販売機のフローチャートの代わりに擬似コードで書いてみた

Posted at

昨日以下のように自動販売機はフローチャートでなくて状態遷移図だろうとつぶやいた

実際、基本情報処理技術者の試験に自動販売機の状態遷移図の試験が複数出題されているようだし、自動販売機の処理はイベントドリブン(硬貨投入、商品ボタン押下、返金ボタン押下…)なのでフローチャートでは書きにくいと思うが、敢えてフローチャートを書いてみようと思った…が、チャートを書くのは面倒なので、C言語風の擬似コードで書いてみた。前述のようにイベントドリブンの処理にはなるのだが、擬似コードではイベント待ちのポーリングをしている風に書いた。

在庫 = ...; // 入庫時に設定
残額 = 0;
商品ランプ点灯中 = false;

while (true) {
  if (硬貨投入) {
  if (残額 + 投入金額 > 上限金額) {
      投入金額返金;  // 入れたお金が戻ってくる
    } else {
      残額 += 投入金額;
      if (残額 >= 商品金額 && 在庫 > 0 && ! 商品ランプ点灯中) {
        商品ランプ点灯;
      }
    }
  }
  if (商品ボタン押下) {
    if (残額 >= 商品金額 && 在庫 > 0) {
      商品出荷;
      残額 -= 商品金額;
      --在庫;
      商品ランプ消灯;     // 残金を即返金する仕様
      if (残額 > 0) {
        返金;
        残額 = 0;
      }
    }
  }
  if (返金ボタン押下) {
    if (残額 > 0) {
      返金;
      残額 = 0;
      if (商品ランプ点灯中) {
        商品ランプ消灯;
      }
    }
  }
}

実際のプログラミングでは、個別の処理は上記のように書くしかないとは思うが、せっかく擬似コードを書いたのに、処理の正しさの実感が全然わかない(間違いや抜けがあれば指摘してほしい)。なので、マクロには状態遷移的に考えて、ミクロではフローチャート…ではないにしても手続き的に考えるのがよいだろう。
ちなみに、「自動販売機 フローチャート」で画像検索すると、ヘンテコなフローチャートが大量に見つかるが、それはイベント駆動を意識してないからで、結果としては問題ないかもしれない(例えば、お金が入ってないのに返金ボタンを押すことが考慮されていないが、単に無視すればよいので差し支えない)が、設計内容を検証する上ではそれは良くないと思う。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2