平成30年秋午後問8 計算処理


この記事は平成30年秋午後問8 整数式の解析の続きです。

プログラム(計算処理の部分)のトレースです。プログラム中に2カ所「二重ループ」が出て来ますので、この辺りとポイントに解説して行きます。

プログラム(計算処理の部分)実行前の変数の状況は

プログラム(計算処理の部分)実行前。各変数の「概ねの状況」は本文中の図1を使います。

「概ねの状況」とした理由は、図1にはExpression、Value、Operator、PriorityおよびOpCntなどの主要な変数しか記載していないからです。

ただ、プログラム(計算処理の部分)を見ると、変数「ip」、「chr」は2行目や8行目でデータが代入されていますので、事前に状況設定(具体的なデータを自分で用意する)の必要はありません。

なので、プログラム(計算処理の部分)を実行する直前の変数の状況は、問題文中の図1を使い、それ以外の変数「i」や「ip」等は、トレース中に出て来たら、都度、変数表に書き込めばトレースできます。

ちなみに変数「i」は、プログラム(解析処理の部分)実行直後は「15」になっていますが、プログラム(計算処理の部分)の3行目「i:1 i<OpCnt、1」によって「1」に初期化されます。

プログラム(計算処理の部分) 二重ループのトレースはどうやるのか

トレースを実行します。
1行目は最左端の繰返処理(以後、外ループと呼びます)の始端です。OpCntの値は4なので、継続条件式は「真」となり、処理は2行目に移ります。

2行目で変数ipに0が入ります。

3行目は、また繰返処理(以後内ループ1と呼びます)の始端。ここで「二重ループ」に入るのですが、文法的の基本通りにトレースすれば問題ありません。ここでは、変数「i」が1に初期化され、継続条件式との比較(ここでは「真」)を行い、処理は4行目に移ります。

4行目は条件判定文の始端。条件判定式が書かれています。変数の添字がまた変数になっていて読み難いですね(汗)。焦らずしっかりトレースしましょう。ここでは「ip=0、i=1」なので、Priority[0]< Priority[1]で判定結果は真です。処理は5行目に移り、変数「ip」に変数「i」の値(ここでは1)が入ります。

処理は6行目に移ります。6行目は条件判定文の終端になりますので、特に処理はなく、7行目に移ります。

7行目は「内ループ」の終端です。文法の基本通りですが、内ループの終端に来たら、内ループの始端(3行目)に戻ります。3行目で変数「i」に1が加算され、継続条件式と比較されます。ここでは「i=2」なので継続条件式は真。処理は4行目に移ります。

以降「内ループ」が実行されますが、変数「i」の値が4になった時に継続条件式「i<OpCnt」が偽となります。ここで、「内ループ」が終了となり、処理が8行目に移ります。

二重ループの基本 ループ終端に来たら対応する始端を探して戻る

8行目で変数「chr」に条件判定の元となるデータが代入され、9~20行目以降で条件判定が「真」となった部分だけを実行して21行目に移ります。

21行目からは再び「内ループ」が始まりますが、要領は3~7行目と同じです。

ただし、変数「i」の「開始値」が「ip+1」となっているところは要注意!ここでの「開始値」は「3」になります。

そして、外ループの終端(27行目)に来ます。「外ループの1巡目」が終了です。この時点での主な変数の状況が問題文中の図2です。加えて、その他の変数の状況は次の通りとなります。

続いて「外ループの終端」から戻るのは「外ループの始端」ですので、処理は1行目に戻ります。この「外ループ」には「継続条件式」のみが設定されていますので、継続条件の判定(ここでは、変数「OpCnt=3」なので、継続条件は「真」)だけが行われます。

処理が2行目に進み「外ループの2巡目」が始まります。

以降、2~4巡目までのトレース結果は下記の通りです。そして「外ループの4巡目終了」で「プログラム(計算処理の部分)も終了です。

トレースは正しく出来ているのか? 確認するためにココに注目!

ここまでお疲れ様でした。今回のプログラムは、文法的には「分岐」「繰返し」が主体の「基本重視」のプログラムです。なのでトレースの「基礎トレ」には、とてもよい教材です。

ここまで頑張ってトレースを実行した方々。「結果がホントに正しいかどうかは気になるところです。確認するために問題文冒頭に出て来た「プログラム」をもう一度見てください。

実は、ここまでのトレースで見て来たのは、上のプログラムの「7行目」までで、まだ「8行目」が残っています。「return Value[0]」は「Value[0]の値を返す」という意味で、ここでは、「Value[0]の内容を最終的な答えとせよ」という意味になります。

トレースの結果、「Value[0]」には「50」が入っています。

一方、この問題で扱った数式「2 ×(34-(5+67)÷8)」の答えはいくつでしょうか?

「50」ですね!

一連のトレース結果が正しかったかどうかは、計算式の結果が変数「Value[0]」に「50」が入っていればOKです。

このように、トレースした結果がどの変数に保存されるかが読取れれば、正しいトレースが出来ているかどうかの検証が出来るようになります。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です