今週の午後問題〔解答〕アルゴリズム 整数式の解析と計算 2018 年度 秋期

今週の午後問題

このコーナーでは毎週月曜に午後の必須選択問題から 1 問ピックアップして出題し、 解答欄 を設け、読者の皆さまにも解答してもらっています!

今週の午後問題は「整数式の解析と計算」でしたが、皆さん、手応えはいかがでしょうか?

金曜になりましたので、出題の 解答 と 矢沢久雄さんによる 解説 に加えて、皆さんの正解率を公開します。

今週の午後問題
2018 年度 秋期 整数式の解析と計算

解答と解説

設問 1a

正解

演算の優先順位を示す Priority[] には、変数 nest の値が格納されます。 nest の初期値を 0 として、加減算なら nest を + 1 し、そうでないなら(乗除算なら) nest を + 2 します。

infoスマートフォンをご覧の際、プログラムは右にスクロールできます

| | ▲ (chr = '+') or (chr = '-')
| | | ・ Priority[OpCnt] ← nest + 1
| |-+-----
| | | ・ Priority[OpCnt] ← nest + 2
| | ▼

3 の部分では、開きカッコなら nest を + 10 し、閉じカッコなら nest を – 10 しています。

| ▲ chr = '('
| | ・ nest ← nest + 10
| ▼
| ▲ chr = ')'
| | ・ nest ← nest – 10
| ▼

これは、カッコで囲まれた演算を優先させるためです。

カッコで囲まれた加減算を乗除算より優先させるためには、 3 以上の優先順位を付ける必要があります。加減算であることで + 1 されるので、さらに + 2 以上にすれば、 3 以上の優先順位になります。

したがって、イの 2 以上が正解です。

設問 1b

正解

priLow は加減算の優先順位を示す値で、 priHigh は乗除算の優先順位を示す値です。

カッコの優先順位の値は、

priLow + カッコの優先順位の値 > priHigh

になればよいので、

カッコの優先順位の値 > priHigh - priLow

です。

priHigh – priLow より大きいのですから、 priHigh – priLow + 1 以上です。

したがって、エが正解です。

設問 2c

正解

codeプログラム(計算処理の部分)56 、および 7 のループは、最も優先順位が高い演算の要素番号を ip に得る処理を行っています。

| ■ i: 1, i < OpCnt, 1
| | ▲ Priority[ip] < Priority[i]
| | | ・ ip ← i
| | ▼
| ■

7 の条件は、 Priority[ip] < Priority[i] なので、同じ優先順位の演算を後で見つけても、前にある演算が優先され左から演算されます。

この部分を Priority[ip] ≦ Priority[i] にすれば、同じ( = )優先順位の演算を後で見つけると、後にある演算が優先され右から演算されます。

したがって、エが正解です。

設問 2d

正解

同じ演算が並んでいる部分を左から演算しても右から演算しても同じ結果になるのは、 + と × です。 + と × だけが並んでいるのは、ケース 1 だけです。

したがって、アが正解です。

設問 3

e正解

f正解

g正解

問題文に示された 2 × (-1) という計算式を codeプログラム(解析処理の部分) で処理した結果は、以下のようになります。 [?] は、配列の要素に値が格納されていないことを示します。

Expression	[2] [×] [(] [-] [1] [)] 
Value[]         [2] [0] [1] [?] [?] [?] 
Operator[]	[×] [-] [?] [?] [?] [?]   OptCnt[2] 
Priority[]	[2] [11] [?] [?] [?] [?]  nest[1]

Value[] の左から 2 つ目の要素は [0] です。したがって、空欄 f の正解はイです。

OptCnt の値は 2 です。したがって、空欄 g の正解はエです。

codeプログラム(解析処理の部分)で処理した結果は、 Priority[] の値の大きい順に、その位置にある演算が行われます。

まず、 0 – 1 という演算が行われ、結果として -1 が得られます。
次に、 2 × -1 という演算が行われ、結果として -2 が得られます。これは、 2 × (-1) という計算式の正しい演算結果です。

したがって、空欄 e の正解はエです。

みんなの解答

ご解答いただいた皆さん、ありがとうございました!

手応えはいかがでしたでしょうか?

 

なお、以下はこの問題の IPA の講評です。今後の参考になれば幸いです。

 問 8 では,整数式を受け取って,その値を返すプログラムを題材に,配列を用いた基本的な文字処理及び数値処理について出題した。
 設問 1 では, a の正答率は平均的で,おおむね理解されていた。 b の正答率は低く,あまり理解されていなかった。括弧内の加減算の優先順位が,括弧外の乗除算の優先順位よりも高ければよいことに着目すれば,正答できた。
 設問 2 の正答率は低く,あまり理解されていなかった。 c では,ウと誤って解答した受験者が見受けられた。ウの場合,行 5 で ip に設定する値が 0 のままでは,正しい処理ができない。 d では,ウと誤って解答した受験者が多く見受けられた。括弧内の減算の結果が変わることを見落としたものと思われる。
 設問 3 では, g の正答率は平均的で,おおむね理解されていた。 e と f の正答率は低く,あまり理解されていなかった。 e ではイと, f ではウと誤って解答した受験者が多く見受けられた。図 3 の式について, codeプログラム(解析処理の部分) の動作を追跡すれば,正答できた。
 プログラム中の定数をより一般的な表現に拡張できる能力,及びプログラムの動作を実際に追跡できる能力は重要なので,身につけておいてほしい。

来週もひきつづき「アルゴリズム問題」を出題します! 多くの方が苦手にしがちなので、これを機会にじっくり挑戦してみてください!

label 関連タグ
Q. 午前試験を
『免除』するには?
A. 独習ゼミで午前免除制度を活用しましょう。
免除試験を受けた 86% の方が、
1 年間の午前免除資格を得ています。
2022 年 下期 試験向け
コース資料公開中!
info_outline
2022 年 下期 試験向け
コース資料公開中!
詳しく見てみるplay_circle_filled
label これまでの『今週の午後問題』の連載一覧 label 著者