HOME»基本情報技術者試験掲示板»平成26年春期試験午前問題 午後問8
投稿する
平成26年春期試験午前問題 午後問8 [2624]
なおさん(No.1)
平成26年春期試験午前問題 午後問8の
eがいまいち理解できていません。
Lが何を指しているのか、
何をコピーして後ろに動かしてるのか…(なんでずらすのか?)
=になる瞬間何が起きてるのか…
{-∞,1},{5,9}{13,+∞}に
Alloc(6,7)を施したら
{5,9}の部分が{5},{8,9}になるんですよね?
この仕組みはわかってます
こんな感じの具体例でわかりやすく教えていただけると助かります。
eがいまいち理解できていません。
Lが何を指しているのか、
何をコピーして後ろに動かしてるのか…(なんでずらすのか?)
=になる瞬間何が起きてるのか…
{-∞,1},{5,9}{13,+∞}に
Alloc(6,7)を施したら
{5,9}の部分が{5},{8,9}になるんですよね?
この仕組みはわかってます
こんな感じの具体例でわかりやすく教えていただけると助かります。
2021.01.08 21:16
翔太さん(No.2)
・Lは何を指すか?/なぜ後ろにずらすのか?
挙げて頂いている{-∞,1},{5,9}{13,+∞}にAlloc(6,7)を施した場合で考えます。
ご認識の通り、{5,9}が{5},{8,9}になります。この時「空き領域の組」が一組増えます。
ループに入る前では{5,9}のすぐ次に{13,+∞}があり、ここのループでずらさなかった場合、
ループ後の処理で{13,+∞}が{8,9}で上書きされてしまいます。
前にずらした場合も既にある空き領域の組み合わせに上書きしてしまいます。
{-∞,1},{5,9},{8,9},{13,+∞}になるのが正常ですが、これでは正常に処理が行われません。
・=になった瞬間何が起きているのか?
この質問は「L=I+1」になった時の動きが理解できない、という事でよろしいでしょうか?
現時点では的外れな事を書いてしまいそうなので今回は控えさせて頂きます。申し訳ございません。
挙げて頂いている{-∞,1},{5,9}{13,+∞}にAlloc(6,7)を施した場合で考えます。
ご認識の通り、{5,9}が{5},{8,9}になります。この時「空き領域の組」が一組増えます。
ループに入る前では{5,9}のすぐ次に{13,+∞}があり、ここのループでずらさなかった場合、
ループ後の処理で{13,+∞}が{8,9}で上書きされてしまいます。
前にずらした場合も既にある空き領域の組み合わせに上書きしてしまいます。
{-∞,1},{5,9},{8,9},{13,+∞}になるのが正常ですが、これでは正常に処理が行われません。
・=になった瞬間何が起きているのか?
この質問は「L=I+1」になった時の動きが理解できない、という事でよろしいでしょうか?
現時点では的外れな事を書いてしまいそうなので今回は控えさせて頂きます。申し訳ございません。
2021.01.09 09:50
なおさん(No.3)
ご回答ありがとうございます!
→何をどこにどうずらしているのでしょうか?ここの動きが把握できてません。
その認識で大丈夫です、上記もわかってないので
「L=I+1」になった時の動きも理解していません。
よろしくおねがいいたします><
>ここのループでずらさなかった場合
→何をどこにどうずらしているのでしょうか?ここの動きが把握できてません。
>=になったとき
その認識で大丈夫です、上記もわかってないので
「L=I+1」になった時の動きも理解していません。
よろしくおねがいいたします><
2021.01.09 14:18
なおさん(No.4)
↑顔アイコン間違えてますがスレ主です。
2021.01.09 14:19
翔太さん(No.5)
>何をどこにどうずらしているのでしょうか?
このループで何をずらしているのか理解するためには、
ループ開始時点での始点[I]と終点[I]の内容、I、Nの値を把握する必要があります。
設問2のプログラム説明文では「始点[i] 、終点[i]」と表現されていますが、
プログラム上では「始点[I]、終点[I]」と表現されているので、ここでは後者で統一します。
Iの値はプログラムの最初のループで条件により加算されるため、
前のスレッドでも使った例を使ってここからトレースしていきます。
まず、プログラム開始時点では、Nは「空き領域の個数」なので3、
始点[I]と終点[I]の値は以下の通りです。
(左からIの値が1,2,3の時の始点[I]と終点[I]の値です)
始点[I] : -∞ 5 13
終点[I] :1 9 +∞
関数Alloc(6,7)を実行した場合、始点P:6,終点P:7です。
最初の行でIの値を1にした後、最初のループで「終点Pが終点[I]より大きい場合、処理を継続」
します。
・1回目(I:1,終点[I]:1,終点P:7)
終点Pが終点[I]より大きいのでループを通る
Iに1を足す→I:2になる
・2回目(I:2,終点[I]:9,終点P:7)
終点Pが終点[I]より小さいのでループを抜け、次の始点[I]と始点Pの比較
(始点[I]<= 始点Pの箇所)に進む
この時点でI:2なので、始点[I]:5,始点P:6,終点[I]:9,終点P:7です。
「始点[I]<= 始点P」が成立するため、次の比較条件を見ていきます。
・(始点[I]= 始点P)and(終点P = 終点[I])
・(始点[I]= 始点P)and(終点P < 終点[I])
・(始点[I]< 始点P)and(終点P = 終点[I])
上記三つはいずれも成立しないため、その中に書かれている処理は何もしません。
一方で、下記は成立するので、質問のループ処理を通る事になります。
・(始点[I]< 始点P)and(終点P < 終点[I])
ループの条件が空欄eとして問題になっていますので、
ここでは選択肢を1つずつ当てはめてトレースしてみます。
①ア:I+1,L < N,1
・1回目(L:I+1=2+1=3,N:3)
ここの繰り返し条件は「LがNより小さい間繰り返す」なので、
1度もループ処理を行わないことになります。よってこの選択肢は正しくありません。
前のスレッドで書いた内容と被りますが、この例でループ処理を通らなかった場合、
始点[I]、終点[I]の内容を上書きしてしまいます。
②イ:I+1,L ≦ N,1
・1回目(L:I+1=2+1=3,N:3)
ここの繰り返し条件は「LがN以下の間繰り返す」なので、処理を行います。
「始点[L+1]←始点[L]」
始点[L+1]:始点[3+1]=始点[4]に始点[L]:始点[3]の値13を入れる
「終点[L+1]←終点[L]」
終点[L+1]:終点[3+1]=終点[4]に終点[L]:終点[3]の値+∞を入れる
・2回目(L:4,N:3)
ここの繰り返し条件は「LがN以下の間繰り返す」なので、処理を抜けます。
③ウ:N,L ≧ I+1,-1
・1回目(L:N=3,I+1:3)
ここの繰り返し条件は「LがI+1以上の間繰り返す」なので、処理を行います。
「始点[L+1]←始点[L]」
始点[L+1]:始点[3+1]=始点[4]に始点[L]:始点[3]の値13を入れる
「終点[L+1]←終点[L]」
終点[L+1]:終点[3+1]=終点[4]に終点[L]:終点[3]の値+∞を入れる
・2回目(L:2,I+1:3)
ここの繰り返し条件は「LがI+1以上の間繰り返す」なので、処理を抜けます。
④エ:N,L > I+1,-1
・1回目(L:N=3,I+1:3)
ここの繰り返し条件は「LがI+1より大きい間繰り返す」なので、
1度もループ処理を行わないことになります。よってこの選択肢は正しくありません。
イとウの処理結果が偶然同じになってしまいましたが、
「『L=I+1』になった時の動き」と「何をどこにどうずらしている」の部分は解説を試みたつもりでおります。
イが正しくなくてウが正しい理由は解説にあるといえばそれまでですが、別の例でのトレースが必要でしたらこちらでも考えてみます。
このループで何をずらしているのか理解するためには、
ループ開始時点での始点[I]と終点[I]の内容、I、Nの値を把握する必要があります。
設問2のプログラム説明文では「始点[i] 、終点[i]」と表現されていますが、
プログラム上では「始点[I]、終点[I]」と表現されているので、ここでは後者で統一します。
Iの値はプログラムの最初のループで条件により加算されるため、
前のスレッドでも使った例を使ってここからトレースしていきます。
まず、プログラム開始時点では、Nは「空き領域の個数」なので3、
始点[I]と終点[I]の値は以下の通りです。
(左からIの値が1,2,3の時の始点[I]と終点[I]の値です)
始点[I] : -∞ 5 13
終点[I] :1 9 +∞
関数Alloc(6,7)を実行した場合、始点P:6,終点P:7です。
最初の行でIの値を1にした後、最初のループで「終点Pが終点[I]より大きい場合、処理を継続」
します。
・1回目(I:1,終点[I]:1,終点P:7)
終点Pが終点[I]より大きいのでループを通る
Iに1を足す→I:2になる
・2回目(I:2,終点[I]:9,終点P:7)
終点Pが終点[I]より小さいのでループを抜け、次の始点[I]と始点Pの比較
(始点[I]<= 始点Pの箇所)に進む
この時点でI:2なので、始点[I]:5,始点P:6,終点[I]:9,終点P:7です。
「始点[I]<= 始点P」が成立するため、次の比較条件を見ていきます。
・(始点[I]= 始点P)and(終点P = 終点[I])
・(始点[I]= 始点P)and(終点P < 終点[I])
・(始点[I]< 始点P)and(終点P = 終点[I])
上記三つはいずれも成立しないため、その中に書かれている処理は何もしません。
一方で、下記は成立するので、質問のループ処理を通る事になります。
・(始点[I]< 始点P)and(終点P < 終点[I])
ループの条件が空欄eとして問題になっていますので、
ここでは選択肢を1つずつ当てはめてトレースしてみます。
①ア:I+1,L < N,1
・1回目(L:I+1=2+1=3,N:3)
ここの繰り返し条件は「LがNより小さい間繰り返す」なので、
1度もループ処理を行わないことになります。よってこの選択肢は正しくありません。
前のスレッドで書いた内容と被りますが、この例でループ処理を通らなかった場合、
始点[I]、終点[I]の内容を上書きしてしまいます。
②イ:I+1,L ≦ N,1
・1回目(L:I+1=2+1=3,N:3)
ここの繰り返し条件は「LがN以下の間繰り返す」なので、処理を行います。
「始点[L+1]←始点[L]」
始点[L+1]:始点[3+1]=始点[4]に始点[L]:始点[3]の値13を入れる
「終点[L+1]←終点[L]」
終点[L+1]:終点[3+1]=終点[4]に終点[L]:終点[3]の値+∞を入れる
・2回目(L:4,N:3)
ここの繰り返し条件は「LがN以下の間繰り返す」なので、処理を抜けます。
③ウ:N,L ≧ I+1,-1
・1回目(L:N=3,I+1:3)
ここの繰り返し条件は「LがI+1以上の間繰り返す」なので、処理を行います。
「始点[L+1]←始点[L]」
始点[L+1]:始点[3+1]=始点[4]に始点[L]:始点[3]の値13を入れる
「終点[L+1]←終点[L]」
終点[L+1]:終点[3+1]=終点[4]に終点[L]:終点[3]の値+∞を入れる
・2回目(L:2,I+1:3)
ここの繰り返し条件は「LがI+1以上の間繰り返す」なので、処理を抜けます。
④エ:N,L > I+1,-1
・1回目(L:N=3,I+1:3)
ここの繰り返し条件は「LがI+1より大きい間繰り返す」なので、
1度もループ処理を行わないことになります。よってこの選択肢は正しくありません。
イとウの処理結果が偶然同じになってしまいましたが、
「『L=I+1』になった時の動き」と「何をどこにどうずらしている」の部分は解説を試みたつもりでおります。
イが正しくなくてウが正しい理由は解説にあるといえばそれまでですが、別の例でのトレースが必要でしたらこちらでも考えてみます。
2021.01.10 10:14
翔太さん(No.6)
{-∞,1},{5,9},{13},{15,+∞}で選択肢イとウの違いを考えます。
まず、プログラム開始時点では、Nは「空き領域の個数」なので4、
始点[I]と終点[I]の値は以下の通りです。
(左からIの値が1,2,3,4の時の始点[I]と終点[I]の値です)
始点[I] : -∞ 5 13 15
終点[I] : 1 9 13 +∞
関数Alloc(6,7)を実行した場合、始点P:6,終点P:7です。
{-∞,1},{5},{8,9},{13},{15,+∞}になるのが想定通りです。
質問のループまでの処理結果はスレッドNo.7の解説と同じになります。
①イ:I+1,L ≦ N,1
・1回目(L:I+1=2+1=3,N:4)
ここの繰り返し条件は「LがN以下の間繰り返す」なので、処理を行います。
「始点[L+1]←始点[L]」
始点[L+1]:始点[3+1]=始点[4]に始点[L]:始点[3]の値13を入れる
この時、始点[4]の値15は上書きされて消えてしまいます。
「終点[L+1]←終点[L]」
終点[L+1]:終点[3+1]=終点[4]に終点[L]:終点[3]の値13を入れる
この時、始点[4]の値+∞は上書きされて消えてしまいます。
ループ1回目終了時点の始点[I]と終点[I]の値は以下の通りです。
(左からIの値が1,2,3,4の時の始点[I]と終点[I]の値です)
始点[I] : -∞ 5 13 13
終点[I] : 1 9 13 13
始点[I]、終点[I]で上書きされてしまう箇所があるため、この選択肢は正しくありません。
②ウ:N,L ≧ I+1,-1
・1回目(L:N=4,I+1:3)
ここの繰り返し条件は「LがI+1以上の間繰り返す」なので、処理を行います。
「始点[L+1]←始点[L]」
始点[L+1]:始点[4+1]=始点[5]に始点[L]:始点[4]の値15を入れる
「終点[L+1]←終点[L]」
終点[L+1]:終点[4+1]=終点[5]に終点[L]:終点[4]の値+∞を入れる
ループ1回目終了時点の始点[I]と終点[I]の値は以下の通りです。
(左からIの値が1,2,3,4,5の時の始点[I]と終点[I]の値です)
始点[I] : -∞ 5 13 15 15
終点[I] : 1 9 13 +∞ +∞
・2回目(L:3,I+1:3)
ここの繰り返し条件は「LがI+1以上の間繰り返す」なので、処理を行います。
「始点[L+1]←始点[L]」
始点[L+1]:始点[3+1]=始点[4]に始点[L]:始点[3]の値13を入れる
「終点[L+1]←終点[L]」
終点[L+1]:終点[3+1]=終点[4]に終点[L]:終点[3]の値+∞を入れる
ループ1回目終了時点の始点[I]と終点[I]の値は以下の通りです。
(左からIの値が1,2,3,4,5の時の始点[I]と終点[I]の値です)
始点[I] : -∞ 5 13 13 15
終点[I] : 1 9 13 13 +∞
・3回目(L:2,I+1:3)
ここの繰り返し条件は「LがI+1以上の間繰り返す」なので、処理を抜けます。
よって選択肢ウが正解です。
ループを抜けた後も念のため書いておくと、
「始点[I+1]←終点P+1」
始点[I+1]:始点[2+1]=始点[3]に終点P+1:7+1=8を入れる
「終点[I+1]←終点[I]」
終点[I+1]:終点[2+1]=終点[3]に終点[I]:9を入れる
「終点[I]←始点P-1」
終点[I]:終点[2]に始点P-1:6-1=5を入れる
以上の処理終了後、始点[I]と終点[I]の値は以下の通りです。
(左からIの値が1,2,3,4,5の時の始点[I]と終点[I]の値です)
始点[I] : -∞ 5 8 13 15
終点[I] : 1 5 9 13 +∞
上記空き領域を今までの書き方に変えると{-∞,1},{5},{8,9},{13},{15,+∞}になります。
まず、プログラム開始時点では、Nは「空き領域の個数」なので4、
始点[I]と終点[I]の値は以下の通りです。
(左からIの値が1,2,3,4の時の始点[I]と終点[I]の値です)
始点[I] : -∞ 5 13 15
終点[I] : 1 9 13 +∞
関数Alloc(6,7)を実行した場合、始点P:6,終点P:7です。
{-∞,1},{5},{8,9},{13},{15,+∞}になるのが想定通りです。
質問のループまでの処理結果はスレッドNo.7の解説と同じになります。
①イ:I+1,L ≦ N,1
・1回目(L:I+1=2+1=3,N:4)
ここの繰り返し条件は「LがN以下の間繰り返す」なので、処理を行います。
「始点[L+1]←始点[L]」
始点[L+1]:始点[3+1]=始点[4]に始点[L]:始点[3]の値13を入れる
この時、始点[4]の値15は上書きされて消えてしまいます。
「終点[L+1]←終点[L]」
終点[L+1]:終点[3+1]=終点[4]に終点[L]:終点[3]の値13を入れる
この時、始点[4]の値+∞は上書きされて消えてしまいます。
ループ1回目終了時点の始点[I]と終点[I]の値は以下の通りです。
(左からIの値が1,2,3,4の時の始点[I]と終点[I]の値です)
始点[I] : -∞ 5 13 13
終点[I] : 1 9 13 13
始点[I]、終点[I]で上書きされてしまう箇所があるため、この選択肢は正しくありません。
②ウ:N,L ≧ I+1,-1
・1回目(L:N=4,I+1:3)
ここの繰り返し条件は「LがI+1以上の間繰り返す」なので、処理を行います。
「始点[L+1]←始点[L]」
始点[L+1]:始点[4+1]=始点[5]に始点[L]:始点[4]の値15を入れる
「終点[L+1]←終点[L]」
終点[L+1]:終点[4+1]=終点[5]に終点[L]:終点[4]の値+∞を入れる
ループ1回目終了時点の始点[I]と終点[I]の値は以下の通りです。
(左からIの値が1,2,3,4,5の時の始点[I]と終点[I]の値です)
始点[I] : -∞ 5 13 15 15
終点[I] : 1 9 13 +∞ +∞
・2回目(L:3,I+1:3)
ここの繰り返し条件は「LがI+1以上の間繰り返す」なので、処理を行います。
「始点[L+1]←始点[L]」
始点[L+1]:始点[3+1]=始点[4]に始点[L]:始点[3]の値13を入れる
「終点[L+1]←終点[L]」
終点[L+1]:終点[3+1]=終点[4]に終点[L]:終点[3]の値+∞を入れる
ループ1回目終了時点の始点[I]と終点[I]の値は以下の通りです。
(左からIの値が1,2,3,4,5の時の始点[I]と終点[I]の値です)
始点[I] : -∞ 5 13 13 15
終点[I] : 1 9 13 13 +∞
・3回目(L:2,I+1:3)
ここの繰り返し条件は「LがI+1以上の間繰り返す」なので、処理を抜けます。
よって選択肢ウが正解です。
ループを抜けた後も念のため書いておくと、
「始点[I+1]←終点P+1」
始点[I+1]:始点[2+1]=始点[3]に終点P+1:7+1=8を入れる
「終点[I+1]←終点[I]」
終点[I+1]:終点[2+1]=終点[3]に終点[I]:9を入れる
「終点[I]←始点P-1」
終点[I]:終点[2]に始点P-1:6-1=5を入れる
以上の処理終了後、始点[I]と終点[I]の値は以下の通りです。
(左からIの値が1,2,3,4,5の時の始点[I]と終点[I]の値です)
始点[I] : -∞ 5 8 13 15
終点[I] : 1 5 9 13 +∞
上記空き領域を今までの書き方に変えると{-∞,1},{5},{8,9},{13},{15,+∞}になります。
2021.01.10 10:47
なおさん(No.7)
詳しくご回答ありがとうございました!やっとここの動きが理解できました。
ありがとうございます><
ありがとうございます><
2021.01.10 14:35