応用情報技術者試験の過去問&キーワードを動画2443本の動画で解説!スキマ時間に動画!※2017年9月11日現在

PR広告

平成28年度秋 応用情報技術者試験 午後問3 プログラミング 設問2 合格率アップ!動画付き解説!

魔方陣に関する次の記述を読んで、設問1~3に答えよ。

 魔方陣とは、正方形のマス目(方陣)に数を配置し、縦・横・対角線のいずれにおいても、その並びの数の合計が同じになるものである。ここでは、N×Nの方陣(Nは3以上の自然数)に1からN2までの数を過不足なく配置したものとする。このとき、縦・横・対角線のN個のマスの合計値は、いずれも(+N)÷2となる。

 Nが3の場合の魔方陣の一つを図1に示す。

4 9 2
3 5 7
8 1 6

図1 3×3の魔法陣の一つ

 Nが奇数の場合、魔方陣の一つを次の手順で作ることができる。N=3のときに、この手順によって1~6の数が配置される様子を図2に示す。

〔魔方陣の作り方〕

 魔方陣の作り方は、次のとおりである。ここで(A)~(E)は図2中の該当箇所を示す。

(1) N×Nの全てのマスは何も入っていない空白の状態とする。

(2) 最下行の中央のマスを現在位置とし、現在位置に数1を配置する(A)。

(3) 現在位置の右下のマスが空白かどうか確認する。このとき、最下行の下は最上行(B)、最右列の右は最左列(C)とする。右下隅の右下は、左上隅(D)である。

(4) (3)で確認したマスが空白の場合は、そこを新しい現在位置とする。(3)で確認したマスが空白でない場合は、現在位置の上のマスを新しい現在位置とする(E)。この際、新しい現在位置が最上行よりも上になることはない。

(5) 数を一つ増やし、現在位置にその数を配置する。

(6) 全てのマスが埋まるまで、 (3)~(5)を繰り返す。

平成28年度秋 応用情報技術者試験午後 午後問3 プログラミング 合格率アップ!動画解説!

〔魔方陣のプログラム〕

 魔方陣の数の配置を記憶する、整数型の2次元配列 houjin を用意する。配列の添字は1から始まる。行y列xのマスは、houjin[y][x] で表現する。例えば、 図1中の1が配置されているマスは、houjin[3][2] である。

 数の配置に関する判定をするために、配列 houjin の領域を(N+1)×(N+1)の大きさで用意し、適切な初期値を設定する。Nが3の場合の例を図3に示す。数が既に配置されているかどうかを判定するために、図3の太枠内の各マスの初期値は0とする。また、現在位置の右下のマスが太枠の外であることを判定するために、 4行目のマスに SOTO_SHITA、 4列目のマスにSOTO_MIGI、行4列4のマスにSOTO_KADOの三つの異なる定数(0からN2までの整数以外の整数)を初期値として設定する。

平成28年度秋 応用情報技術者試験午後 午後問3 プログラミング 合格率アップ!動画解説!

 配列 houjin の初期化をする関数 shokika、及び数を配置する関数 mahoujin のプログラムを図4に示す。引数Nは、正の奇数(N≧3)である。

function shokika(N)
  for( yを1からNまで1ずつ増やす )
    for( xを1からNまで1ずつ増やす )
      houjin[y][x] ← 0
    endfor
     ← SOTO_MIGI
  endfor
  for( xを1からNまで1ずつ増やす )
     ← SOTO_SHITA
  endfor
  houjin[N+1][N+1] ← SOTO_KADO
endfunction

function mahoujin(N)
  y ← N
  
  suuji ← 1
  houjin[y][x] ← suuji
  
  while( suujiが )
    yb ← y
    xb ← x
    
    /* (F) はここから */
    y ← y+1
    x ← x+1
    if( houjin[y][x]がSOTO_SHITAと等しい )
      y ← 1
    elseif( houjin[y][x]がSOTO_MIGIと等しい )
      x ← 1
    elseif( houjin[y][x]がSOTO_KADOと等しい )
      y ← 1
      x ← 1
    endif
    /* (F) はここまで */
    
    if( houjin[y][x]が0と等しくない )
      y ← 
      x ← 
    endif
    
    suuji ← suuji+1
    houjin[y][x] ← suuji
  endwhile
endfunction

図4 魔法陣のプログラム

〔プログラムの判定部分の改変〕

 図4のプログラムによるメモリ使用量の削減のために、配列 houjin の領域をN×Nに縮小し、定数SOTO_SHITA、 SOTO_MIGI及びSOTO_KADOを使わないようにするプログラムの改変を考えた。図4の(F)の部分を改変したプログラムを図5に示す。

y ← y+1
x ← x+1
if( yがよりも大きい )
  y ← 
endif
if( xがよりも大きい )
  x ← 
endif

図5 図4の(F)の部分を改変したプログラム

設問2

〔魔方陣のプログラム〕について、(1)、(2)に答えよ。

(1) 図4中のに入れる適切な字句を答えよ。

(2) 図4の関数 mahoujin を実行した場合、配列 houjin の中で一度も参照も代入もされない要素が二つ存在する。該当する配列 houjin の要素をそれぞれ答えよ。

動画解説

(1)の解説

の解説

function shokika(N)
  for( yを1からNまで1ずつ増やす )
    for( xを1からNまで1ずつ増やす )
      houjin[y][x] ← 0
    endfor
     ← SOTO_MIGI
  endfor
  for( xを1からNまで1ずつ増やす )
     ← SOTO_SHITA
  endfor
  houjin[N+1][N+1] ← SOTO_KADO
endfunction

はSOTO_MIGIが代入される箇所

はSOTO_SHITAが代入される箇所

ポイント:SOTO_MIGI, SOTO_SHITAはどこに代入されるのでしょうか?

〔魔方陣のプログラム〕

 魔方陣の数の配置を記憶する、整数型の2次元配列 houjin を用意する。配列の添字は1から始まる。行y列xのマスは、houjin[y][x] で表現する。例えば、 図1中の1が配置されているマスは、houjin[3][2] である。

 数の配置に関する判定をするために、配列 houjin の領域を(N+1)×(N+1)の大きさで用意し、適切な初期値を設定する。Nが3の場合の例を図3に示す。数が既に配置されているかどうかを判定するために、図3の太枠内の各マスの初期値は0とする。また、現在位置の右下のマスが太枠の外であることを判定するために、 4行目のマスに SOTO_SHITA、 4列目のマスにSOTO_MIGI、行4列4のマスにSOTO_KADOの三つの異なる定数(0からN2までの整数以外の整数)を初期値として設定する。

方陣内部に0を代入し、方陣外にSOTO_MIGI, SOTO_SHITA, SOTO_KADOを代入します。

とあります。

平成28年度秋 応用情報技術者試験午後 午後問3 プログラミング 合格率アップ!動画解説!

このことから、SOTO_MIGIは「右側」の方陣外となるので、N = 3の時

houjin[1][4]

houjin[2][4]

houjin[3][4]

に代入されます。

この時の4はN + 1なので、x = N + 1です。

1, 2, 3の部分はyそのままです。

これを式で表すと

houjin[y][N + 1] ← SOTO_MIGI

となります。

SOTO_SHITAは「下側」の方陣外となるので、N = 3の時

houjin[4][1]

houjin[4][2]

houjin[4][3]

に代入されます。

この時の4はN + 1なので、y = N + 1です。

1, 2, 3の部分はxそのままです。

これを式で表すと

houjin[N + 1][x] ← SOTO_SHITA

となります。

参考:上記の関数をトレース結果(x, y, Nの値を埋めたもの)

houjin[1][1] ← 0

houjin[1][2] ← 0

houjin[1][3] ← 0

イ houjin[1][4] ← SOTO_MIGI

houjin[2][1] ← 0

houjin[2][2] ← 0

houjin[2][3] ← 0

イ houjin[2][4] ← SOTO_MIGI

houjin[3][1] ← 0

houjin[3][2] ← 0

houjin[3][3] ← 0

イ houjin[3][4] ← SOTO_MIGI

ウ houjin[4][1] ← SOTO_SHITA

ウ houjin[4][2] ← SOTO_SHITA

ウ houjin[4][3] ← SOTO_SHITA

houjin[4][4] ← SOTO_KADO

の解説

は関数 mahoujin(N)の初期化の部分です。

y

suuji

houjin[y][x]

は初期化されているのですが、

x

は初期化されていません。

ポイント:xの初期値は何でしょうか?

〔魔方陣の作り方〕

(2) 最下行の中央のマスを現在位置とし、現在位置に数1を配置する(A)。とあります。

平成28年度秋 応用情報技術者試験午後 午後問3 プログラミング 合格率アップ!動画解説!

N = 3の時はx = 2の位置です。奇数から中央値を取得するには

(N + 1) / 2とします。

N = 3の時

(3 + 1) / 2 = 2となります。

の正解は「(N + 1) / 2」です!

の解説

はwhileループの条件が入ります。

ポイント:whileループの条件は?

〔魔方陣の作り方〕を見ると

 魔方陣の作り方は、次のとおりである。ここで(A)~(E)は図2中の該当箇所を示す。

(1) N×Nの全てのマスは何も入っていない空白の状態とする。

(2) 最下行の中央のマスを現在位置とし、現在位置に数1を配置する(A)。

(3) 現在位置の右下のマスが空白かどうか確認する。このとき、最下行の下は最上行(B)、最右列の右は最左列(C)とする。右下隅の右下は、左上隅(D)である。

(4) (3)で確認したマスが空白の場合は、そこを新しい現在位置とする。(3)で確認したマスが空白でない場合は、現在位置の上のマスを新しい現在位置とする(E)。この際、新しい現在位置が最上行よりも上になることはない。

(5) 数を一つ増やし、現在位置にその数を配置する。

(6) 全てのマスが埋まるまで、 (3)~(5)を繰り返す。

N = 3の時、1から9の数字を順番入れます。9をNで表現するとN2となります。

従って正解はN2未満です。

の解説

プログラムは下記の通りです。

    if( houjin[y][x]が0と等しくない )
      y ← 
      x ← 
    endif

ポイント:houjin[y][x]が0と等しくない場合はどのような場合でしょうか

〔魔方陣の作り方〕の下記の部分です。

(3) 現在位置の右下のマスが空白かどうか確認する。このとき、最下行の下は最上行(B)、最右列の右は最左列(C)とする。右下隅の右下は、左上隅(D)である。

(4) (3)で確認したマスが空白の場合は、そこを新しい現在位置とする。(3)で確認したマスが空白でない場合は、現在位置の上のマスを新しい現在位置とする(E)。この際、新しい現在位置が最上行よりも上になることはない。

if( houjin[y][x]が0と等しくない )は「現在位置の右下のマスが空白かどうか確認」しています。0でなければ空白ではありません。

空白でない場合、現在位置の上のマスを新しい現在位置とする(E)。を実行します。

平成28年度秋 応用情報技術者試験午後 午後問3 プログラミング 合格率アップ!動画解説!

プログラムで現在位置は

yb

xb

です。

「現在位置の上のマス」は

yb - 1 // 上に移動するには-1する

xb // xは移動なし

です。これをyとxに代入します。

にはyb - 1

にはxb

が入ります!

(2) の解説

図2のように値が埋まるので、図4を実行すると次のような動きになります。

平成28年度秋 応用情報技術者試験午後 午後問3 プログラミング 合格率アップ!動画解説!

houjin[3][2]を参照し、0なので1を代入

houjin[4][3]を参照し、SOTO_SHITAなので移動(y = 1)

houjin[1][3]を参照し、0なので2を代入

houjin[2][4]を参照し、SOTO_MIGIなので移動(x = 1)

houjin[2][1]を参照し、0なので3を代入

houjin[3][2]を参照し、1なので移動(現在位置houjin[2][1]からhoujin[1][1])

houjin[1][1]を参照し、0なので4を代入

houjin[2][2]を参照し、0なので5を代入

houjin[3][3]を参照し、0なので6を代入

houjin[4][4]を参照し、SOTO_KADOなので移動(x = 1, y = 1)

houjin[1][1]を参照し、4なので移動(現在位置houjin[3][3]からhoujin[2][3])

houjin[2][3]を参照し、0なので7を代入

houjin[3][4]を参照し、SOTO_MIGIなので移動(x = 1)

houjin[3][1]を参照し、0なので8を代入

houjin[4][2]を参照し、SOTO_SHITAなので移動(y = 1)

houjin[1][2]を参照し、0なので9を代入

houjin[1][4]とhoujin[4][1]のみ参照も代入もありません。

従って、houjin[1][N + 1]とhoujin[N + 1][1]が正解です!

平成28年度秋 応用情報技術者試験午後

問1 情報セキュリティ 設問1

問1 情報セキュリティ 設問2

問1 情報セキュリティ 設問3

問2 経営戦略 設問1

問2 経営戦略 設問2

問2 経営戦略 設問3

問2 経営戦略 設問4

問3 プログラミング 設問1

問3 プログラミング 設問2

問3 プログラミング 設問3

問4 システムアーキテクチャ 設問1

問4 システムアーキテクチャ 設問2

問4 システムアーキテクチャ 設問3

問4 システムアーキテクチャ 設問4

問5 ネットワーク 設問1

問5 ネットワーク 設問2

問5 ネットワーク 設問3

問6 データベース 設問1

問6 データベース 設問2

問6 データベース 設問3

問6 データベース 設問4

問8 情報システム開発 設問1

問8 情報システム開発 設問2

問8 情報システム開発 設問3

問8 情報システム開発 設問4

問9 プロジェクトマネジメント 設問1

問9 プロジェクトマネジメント 設問2

問9 プロジェクトマネジメント 設問3

問10 サービスマネジメント 設問1

問10 サービスマネジメント 設問2

問10 サービスマネジメント 設問3

問11 システム監査 設問1

問11 システム監査 設問2

問11 システム監査 設問3

問11 システム監査 設問4

問11 システム監査 設問5

問11 システム監査 設問6


PR広告

フェイスブックコメント

難解な応用情報技術者試験午前で80点中48点を取る優しい方法

平成28年度春 応用情報技術者試験 午後 テキスト・動画解説

平成28年度春 応用情報技術者試験 午後 動画解説再生リスト

平成28年度春 応用情報技術者試験 午前 テキスト・動画解説

平成28年度秋 応用情報技術者試験 午前 動画解説再生リスト

平成27年度秋 応用情報技術者試験 午前 テキスト・動画解説

平成27年度秋 応用情報技術者試験 午前 動画解説再生リスト

平成27年度春 応用情報技術者試験 午後 テキスト・動画解説

平成27年度春 応用情報技術者試験 午後 動画解説再生リスト

平成27年度春 応用情報技術者試験 午前 テキスト・動画解説

平成27年度春 応用情報技術者試験 午前 動画解説再生リスト

平成26年度秋 応用情報技術者試験 午前 テキスト・動画解説

平成26年度秋 応用情報技術者試験 午前 動画解説再生リスト

平成26年度春 応用情報技術者試験 午前 テキスト・動画解説

平成26年度春 応用情報技術者試験 午前 動画解説再生リスト