次へ: 9 ソースコード全体 上へ: C のソースからプロトタイプ宣言を作成 前へ: 7 パターンマッチ中心のアルゴリズム (PDF ファイル: awktg.pdf)


8 状況を保存するアルゴリズム

7 節のプログラムの構造は行単位の処理形式になっていて、 行の性質毎にその処理を分けて書き、現在、あるいは直前の状態は、 2 つのフラグによって受け渡しをする、という形になっていました。

この状態を変数で受け渡す、という考え方をさらに進めると、 現在の状態をより詳細に伝える変数を用意することで、 6 節と 7 節のプログラムの 中間のようなコードを書く、つまり、行単位の処理形式なんだけれども、 処理の流れは単純なアルゴリズムに近い、というものを作ることができます。

ここでは、その状態を表す変数を mode と書くことにします。ここでは mode は 0,1,2,3 の値を取るとして、その意味は以下の通りであるとします。

この場合は、mode が 0 であることによりリセットされていることがわかるの で、リセットという作業もほとんどいりません。

これを使えば、以下のようにすればできることになります。
(1) 1 行入力 (暗黙の getline)
(2) 「ア」ならばリセットして保存して mode=1
(3) mode の値をチェック
  (4) mode が 1 か 2 ならば、「ウ」であるかチェック
    (5) 「ウ」ならば、その行を保存する
    (6) 「ウ」でなければ mode が 1 でなければ mode=0 にして next
    (7) (5),(6) の後「イ」ならば mode=3 として next
    (8) 「イ」でなくて「オ」ならば mode=0、
      「オ」でなければ mode=2 として next
  (9) (3) の mode が 3 でなければ (i.e. mode=0) next
  (10) 「エ」ならば出力
  (11) mode=0 として next
フローチャートは、図 4 のようになります。

図 4: 状況保存パラメータ利用の場合
\includegraphics[width=0.4\textwidth]{flow4.eps}
疑似コードは、例えば以下の通りです。

  「ア」{ (リセットして保存) ; mode=1 }
  (mode==1 || mode==2){
      if(「ウ」){ (保存) }
      else if(mode!=1){ mode=0; next }
      if(「イ」) mode=3
      else if(「オ」) mode=0
      else mode=2
      next
  }
  (mode==3){
      if(「エ」){ (出力) }
      mode=0
  }

例外的なものを先に処理する、という考え方であれば次のようにも書いてもい いでしょう。

  「ア」{ (リセットして保存) ; mode=1 }
  (mode==0){ next }
  (mode==3){
      if(「エ」){ (出力) }
      mode=0
      next
  }
  {
      if(「ウ」){ (保存) }
      else if(mode!=1){ mode=0; next }
      if(「イ」) mode=3
      else if(「オ」) mode=0
      else mode=2
  }


次へ: 9 ソースコード全体 上へ: C のソースからプロトタイプ宣言を作成 前へ: 7 パターンマッチ中心のアルゴリズム
竹野茂治@新潟工科大学
2006年6月22日