平成30年秋期午後問8

午前試験免除制度対応!基本情報技術者試験のeラーニング【独習ゼミ】
ABCさん  
(No.1)
https://www.fe-siken.com/kakomon/30_aki/pm08.html
設問2のCで、エが答えになるのはわかるのですが、ウがなぜダメなのかがわかりません。後ろからipを決めていったときも、同じ優先順位のものは右から計算するようにならないでしょうか?
2021.02.04 15:01
詞音さん 
(No.2)
ウでは、「優先順位の等しい演算子が複数個含まれている場合」、演算は左から実行されます。
例として、2×4×3×5の式がExpressionに入っていたとしてトレースしてみます。
この例では、「(解析処理の部分)」終了時点では下記のようになっています。(配列の記述になれておらず、見づらくて申し訳ないです)
                   0 1 2 3  4 5  6
Expression[] 2 × 4 × 3 × 5
Value[]        2  4 3 5
Operator[]  × × ×
Priority[]      2  2 2
OpCnt:4

この状態で設問2で問われている「(計算処理の部分)」をウのc3に置き換えて実行してみます。
まず、⑤の「ip←0」でipの値が0になります。
次の繰り返しは、⑥をc3で置き換えた「i:Opcnt-1,i>0,-1」なのでiの初期値は4-1=3です。
次の分岐では、Priority[ip]とPriority[i]の比較を行っています。
・繰り返し1回目
 Priority[ip]:Priority[0]=2
 Priority[i]:Priority[3]=2
 この分岐は、「Priority[ip] < Priority[i]」の場合に、ipの値をiの値に書き換えますが、
 ここではこの条件を満たしていないため、ipは0のままです。
・繰り返し2回目
iの値から1を引くため、iの値は2になります。
 Priority[ip]:Priority[0]=2
 Priority[i]:Priority[2]=2
 1回目と同様、分岐を通る条件を満たしていないため、ipは0のままです。
・繰り返し3回目
iの値から1を引くため、iの値は1になります。
 Priority[ip]:Priority[0]=2
 Priority[i]:Priority[1]=2
 1回目と同様、分岐を通る条件を満たしていないため、ipは0のままです。
この後にiの値から1を引くと0になるため繰り返しはここで終了です。
次に、「chr←Operator[ip]」があります。
Operator[ip]:Operator[0]=×なので、chrの値は×になります。
その後4つの分岐がありますが、今回はchrの値が×なので、
「chr = '×'」の分岐を通り、その中の処理を行います。
「Value[ip] ← Value[ip] × Value[ip + 1]」とあるので、Value[ip]の値とValue[ip + 1]の値を掛け算します。
Value[ip] :Value[0]=2
Value[ip + 1]:Value[1]= 4
なので、Value[ip]は2×4=8
これをValue[ip]:Value[0]に入れます。
添え字が0の値から計算しているため、「左から演算を実行している」ことになります。
2021.02.04 17:49
ABCさん  
(No.3)
詞音さん
とても丁寧な説明をありがとうございます。確かに、Priorityが全て同じであればipは0から変わらないので、左からになりますね!ただ、例えば2つだけが同じ優先順位になった場合は、やはり後ろからにならないでしょうか?例えば下のようなPriority[]であれば、
Priority[]0 1 2 
          1 5 5
Priority[ip=0]とPriority[i=2]を比較すると Priority[2]の方が大きいのでip=2となり、Priority[ip=2]とPriority[i=1]を比較すると同じ値のためip=2のまま  となり、右の演算子から計算されるのではないかなと…
また、確かめている中でさらに疑問が出てきてしまったのですが、優先順位が同じ演算子が並ぶ時に、Priority[]の値が同じになることはあるのでしょうか?2×2×2×2の場合には、Priority[]の中身が 2,4,6,8になってしました。
2021.02.05 10:06
詞音さん 
(No.4)
文字数の関係で後半の質問から。
前半の質問は、現段階でですが私もわかりません。
Priorityの中身で1,5,5になるパターンがそもそもあり得るのかを検討する必要があり、
それにはExpressionの中身や解析処理の中身も見ていかなければならないためです。
後半の質問も、全ては入りきらないので分けて記述します。
2021.02.06 09:00
詞音さん 
(No.5)
>優先順位が同じ演算子が並ぶ時に、Priority[]の値が同じになることはあるのでしょうか?2×2×2×2の場合には、Priority[]の中身が 2,4,6,8になってしました。 
2×2×2×2の場合の「(解析処理の部分)」を私がトレースした結果を書きます。ご自身のトレース結果が残っていれば見比べてみてください。
最初の3行で初期入力が行われていますので、各値はこの時点では下記のとおりです。
Expression[] 2 × 2 × 2 × 2
Value[]        0   
Operator[]    
Priority[]      
OpCnt:0
nest:0
繰り返しに入ります。
・繰り返し1回目(i :0)
 chrにExpression[i]:Expression[0]=2を代入
 chrの値が数字0~9に当てはまるので、「('0' <= chr) and (chr <= '9')」の分岐内を通ります。
 分岐内:Value[OpCnt](Value[0])に「10×Value[OpCnt](Value[0])+int(chr)=10×0+2=2」を代入
残りの分岐はここでは当てはまらないので次の繰り返しへ
この時点での各値は
Expression[] 2 × 2 × 2 × 2
Value[]          2
Operator[]    
Priority[]      
OpCnt:0
nest:0
・繰り返し2回目(i :1)
 chrにExpression[i]:Expression[1]=×を代入
 「(chr = ‘+‘)or(chr = ‘-‘)or(chr = ‘+‘)or(chr = ‘-‘)」の分岐内を通ります。
Operator[OpCnt](Operator[0])にchrの値「×」を代入
次の分岐(chr = ‘+‘)or(chr = ‘-‘)は当てはまらないので
Priority[OpCnt](Priority[0])にnest+2=0+2=2を代入
ABCさんのトレースでは「Priority[]の中身が 2,4,6,8に」増えていってしまったという事ですが、そのトレースではここでnestの値自体を更新していないでしょうか?
nestの値を更新するのであれば「nest←nest+2」のような処理を通る事が前提ですが、
この分岐内では見当たりません。
その後の処理は
OpCntに1を足す
Value[OpCnt](Value[1])に0を入れる
この時点での各値は
Expression[] 2 × 2 × 2 × 2
Value[]          2
Operator[]    ×
Priority[]       2
OpCnt:1
nest:0
残りの分岐はここでは当てはまらないので次の繰り返しへ
・繰り返し3回目(i :2)
 chrにExpression[i]:Expression[2]=2を代入
 chrの値が数字0~9に当てはまるので、「('0' <= chr) and (chr <= '9')」の分岐内を通ります。
 分岐内:Value[OpCnt](Value[1])に「10×Value[OpCnt](Value[1])+int(chr)=10×0+2=2」を代入
残りの分岐はここでは当てはまらないので次の繰り返しへ
この時点での各値は
Expression[] 2 × 2 × 2 × 2
Value[]          2 2
Operator[]    ×
Priority[]       2
OpCnt:1
nest:0
・繰り返し4回目(i :3)
 chrにExpression[i]:Expression[3]=×を代入
 「(chr = ‘+‘)or(chr = ‘-‘)or(chr = ‘+‘)or(chr = ‘-‘)」の分岐内を通ります。
Operator[OpCnt](Operator[1])にchrの値「×」を代入
次の分岐(chr = ‘+‘)or(chr = ‘-‘)は当てはまらないので
Priority[OpCnt](Priority[1])にnest+2=0+2=2を代入
その後の処理は
OpCntに1を足す
Value[OpCnt](Value[2])に0を入れる
残りの分岐はここでは当てはまらないので次の繰り返しへ
足りないので次スレッドへ
2021.02.06 09:03
詞音さん 
(No.6)
・繰り返し5回目(i :4)
 chrにExpression[i]:Expression[4]=2を代入
 chrの値が数字0~9に当てはまるので、「('0' <= chr) and (chr <= '9')」の分岐内を通ります。
 分岐内:Value[OpCnt](Value[2])に「10×Value[OpCnt](Value[2])+int(chr)=10×0+2=2」を代入
残りの分岐はここでは当てはまらないので次の繰り返しへ
この時点での各値は
Expression[] 2 × 2 × 2 × 2
Value[]          2 2 2
Operator[]    × ×
Priority[]       2 2
OpCnt:2
nest:0
・繰り返し6回目(i :5)
 chrにExpression[i]:Expression[5]=×を代入
 「(chr = ‘+‘)or(chr = ‘-‘)or(chr = ‘+‘)or(chr = ‘-‘)」の分岐内を通ります。
Operator[OpCnt](Operator[2])にchrの値「×」を代入
次の分岐(chr = ‘+‘)or(chr = ‘-‘)は当てはまらないので
Priority[OpCnt](Priority[2])にnest+2=0+2=2を代入
その後の処理は
OpCntに1を足す
Value[OpCnt](Value[3])に0を入れる
残りの分岐はここでは当てはまらないので次の繰り返しへ
この時点での各値は
Expression[] 2 × 2 × 2 × 2
Value[]          2 2 2 0
Operator[]    × × ×
Priority[]       2 2 2
OpCnt:3
nest:0
・繰り返し7回目(i :6)
 chrにExpression[i]:Expression[6]=2を代入
 chrの値が数字0~9に当てはまるので、「('0' <= chr) and (chr <= '9')」の分岐内を通ります。
 分岐内:Value[OpCnt](Value[3])に「10×Value[OpCnt](Value[3])+int(chr)=10×0+2=2」を代入
残りの分岐は当てはまりません。
この時点での各値は
Expression[] 2 × 2 × 2 × 2
Value[]          2 2 2 2
Operator[]    × × ×
Priority[]       2 2 2
OpCnt:3
nest:0
処理終了です。
2021.02.06 09:07
ABCさん  
(No.7)
詞音さん
詳しい解説ありがとうございます!Priority[]の値が同じになるかどうかについては、詞音さんのご指摘通り、勘違いでnestの値を更新してしまっていました。間違っている部分がわかって、とてもすっきりしました!
もう1つのPriority[]の値が2つだけ同じだった場合については、確かにそもそもそうなることがあるのか確かめないといけないですね。勉強になりました、ありがとうございます!
2021.02.06 10:59

返信投稿用フォーム

スパム防止のためにスレッド作成日から30日経過したスレッドへの書込みはできません。

その他のスレッド


Pagetop