この状態を変数で受け渡す、という考え方をさらに進めると、 現在の状態をより詳細に伝える変数を用意することで、 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 |
「ア」{ (リセットして保存) ; 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 }