Help us understand the problem. What is going on with this article?

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

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

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

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

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

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

ockeghem
徳丸本の中の人です
https://twitter.com/ockeghem/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away