この状態を変数で受け渡す、という考え方をさらに進めると、 現在の状態をより詳細に伝える変数を用意することで、 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
}