見出し画像

!T-29- (基本情報技術者対策5問)

1日5問はやりたい。

▶️問題6

配列Aが図2の状態のとき,図1の流れ図を実行すると,配列Bが図3の状態になった。図1のaに入れる操作はどれか。ここで,配列A,Bの要素をそれぞれ A(i,j),B(i,j) とする。

▶️回答

  • アB(7-i,7-j) ← A(i,j)

  • イB(7-j,i) ← A(i,j)

  • ウB(i,7-j) ← A(i,j)

  • エB(j,7-i) ← A(i,j)

例えば、(0,6)の※が結果的に(6,7)へ移動しているので、
(i,j)→(j, 7-i)と考えると辻褄があう。

配列Aの値が配列Bのどの位置に移動しているかを、配列中の適当な場所でサンプルを取ってみるとわかりやすいです。ここでは赤丸で印をつけた一点について考えてみます。

位置を配列の添え字[i,j]を使って表すと、配列Aが[3,1]、配列Bが[1,4]となります。

選択肢を見ると、配列A[i,j]を配列Bのどこに移動するかを問われているので、iが3、jが1の場合に、配列Bの位置が[1,4]となる選択肢を探すことになります。

すべての選択肢に「i=3,j=1」を代入してみると、

  • B(7-i,7-j) ← A(i,j)
    B(7-3,7-1)=B(4,6)となるので誤りです。

  • B(7-j,i) ← A(i,j)
    B(7-1,3)=B(6,3)となるので誤りです。

  • B(i,7-j) ← A(i,j)
    B(3,7-1)=B(3,6)となるので誤りです。

  • B(j,7-i) ← A(i,j)
    B(1,7-3)=B(1,4)となり適切な位置に値を移動することができます。したがってこれが正解です。

▶️問題7

10進法で5桁の数 a1a2a3a4a5 をハッシュ法を用いて配列に格納したい。ハッシュ関数を mod(a1+a2+a3+a4+a5,13) とし,求めたハッシュ値に対応する位置の配列要素に格納する場合,54321は配列のどの位置に入るか。ここで,mod(x,13) は,xを13で割った余りとする。

▶️回答

a1a2a3a4a5=54321とすると、5+4+3+2+1=15よって、mod(15, 13)となる。よって、15/13=2となる。

  • ア1

  • イ2

  • ウ7

  • エ11

よってイ

ハッシュ法とは、
ハッシュ関数(引数を一定の規則で変換した値を返す関数)を用いて、
探索するデータのキー値からデータの格納アドレスを直接計算する方法です。
データの格納場所が一意に決まるので挿入、検索、削除が高速に行える反面、格納に必要なデータ領域が多く必要であるという特徴があります。

この設問ではハッシュ関数が mod(a1+a2+a3+a4+a5,13) であり、
a1=5、a2=4、…、a5=1というように54321の各桁が対応するので、式に代入して得られる結果を計算します。
mod()は、第1引数を第2引数で割った余りを返します。

 mod(5+4+3+2+1,13)=mod(15,13)=2

したがって、データ 54321 が格納されるのは配列中の2の位置となります。

▶️問題8

自然数nに対して,次のとおり再帰的に定義される関数ƒ(n)を考える。
ƒ(5)の値はどれか。

 ƒ(n):if n≦1 then return 1 else return n+ƒ(n-1)

  • ア6

  • イ9

  • ウ15

  • エ25

▶️回答

ƒ(n):if n≦1 then return 1 else return n+ƒ(n-1)より、
f(5):if 5≦1 then return 1 else return 5+ƒ(4)
f(4) :if 4≦1 then return 1 else return 4+ƒ(3)
f(3):if 3≦1 then return 1 else return 3+ƒ(2)
f(2):if 2≦1 then return 1 else return 2+ƒ(1)
f(1):if 1≦1 then return 1 else return 1+ƒ(0)
n=1の時、戻り値として1を返すので、f(1)=1
よって、f(2)= 2+1 = 3
f(3)= 3+3 = 6
f(4)= 4+6 = 10
f(5)= 5+10 = 15よって、ウとなる。

再帰関数は、関数内で自分自身を読み出す構造になっている関数です。
設問の再帰関数 ƒ(n) は以下のような処理を行います。

引数nが1以下のとき1を返すそれ以外の場合n+ƒ(n-1)を返す。

ƒ(n)の部分を展開しながら地道に計算していくと次のようになります。
 ƒ(5)
=5+ƒ(4) //ƒ(5)=5+ƒ(4)
=5+4+ƒ(3) //ƒ(4)=4+ƒ(3)
=5+4+3+ƒ(2) //ƒ(3)=3+ƒ(2)
=5+4+3+2+ƒ(1) //ƒ(2)=2+ƒ(1)
=5+4+3+2+1 //ƒ(1)=1
=15
したがって、ƒ(5)の値は15です。

▶️問題9

プログラムのコーディング規約に規定する事項のうち,
適切なものはどれか。

  • ア局所変数は,用途が異なる場合でもデータ型が同じならば,できるだけ同一の変数を使うようにする。

  • イ処理性能を向上させるために,ループの制御変数には浮動小数点型変数を使用する。

  • ウ同様の計算を何度も繰り返すときは,関数の再帰呼出しを用いる。

  • エ領域割付け関数を使用するときは,割付けができなかったときの処理を記述する。

▶️回答

局所変数は,用途が異なる場合でもデータ型が同じならば,できるだけ同一の変数を使うようにする。
1つの変数の役割は1つにするのが原則です。
用途が異なる場合には別々の変数として定義し、
用途がわかるように適切な命名を行うべきです。

処理性能を向上させるために,
ループの制御変数には浮動小数点型変数を使用する。
ループの制御変数には整数型(int型)を用いるのが原則です。
ループの制御変数に浮動小数点型変数(float等)を用いると、
インクリメントやデクリメントの際の誤差が積み重なり
期待した結果を得られないことがあります。
このためループの制御変数には整数型を使用するべきです。
また、浮動小数点型は整数型よりも演算が遅いので、
わずかですが処理性能も低下します。

同様の計算を何度も繰り返すときは,関数の再帰呼出しを用いる。
同様の処理を繰り返すときには、その処理をサブルーチン化して独立した関数にすることを検討すべきです。
再帰関数は、処理がわかりにくくなることや実行時のスタックサイズが
予測できずオーバフローを起こす可能性があるので、
コーディング規約で使用を禁止されることもあります。

領域割付け関数を使用するときは,割付けができなかったときの処理を記述する。
正しい
領域割付け関数は必ず成功するとは限りません。
もしメモリブロックを確保できないまま後続の処理に進むとそこでエラーになってしまうので、領域割付け関数の戻り値をチェックするなどして割付け失敗時の分岐処理を記述するべきです。

▶️問題10

外部割込みの原因となるものはどれか。

  • ア ゼロによる除算命令の実行

  • イ 存在しない命令コードの実行

  • ウ タイマによる時間経過の通知

  • エ ページフォールトの発生

▶️回答

割込みは、システムにすぐに対処しなくてはならない問題などが生じたときに、実行中のプログラムの処理を強制的に停止し、優先的に事象の解決を図ることを可能にする仕組みです。

割込みは、
実行中のプログラムが原因でCPU内部で発生する内部割込みと、
それ以外の(CPU外部で発生する)外部割込みに分類することができます。

内部割込み実行中のプログラムが原因で起こる割込み
・プログラム割込み
・スーパーバイザコール割込み(プログラムからOSへの処理依頼)
・ページフォールト割込み

外部割込み
・内部割込み以外の原因で起こる割込み
・機械チェック割込み
・タイマ割込み
・入出力割込み

ゼロによる除算命令の実行
ゼロによる除算は、解が無限になるため不正な処理として扱われます。
ゼロによる除算は、処理中のプログラムによって引き起こされる割込み
(プログラム割込み)なので、内部割込みに分類されます。

存在しない命令コードの実行
実行中のプログラムが原因で発生する割込みなので、内部割込みに分類されます。

タイマによる時間経過の通知
正しい。タイマ割込みは、システムに設定されたタイマが所定時間を経過したときに発生する割込みで、外部割込みに分類されます。

ページフォールトの発生
ページフォールト割込みは、プログラムが主記憶上に存在しないデータにアクセスしようとしたときに発生する割込みで、内部割込みに分類されます。

今日はここまで!


少しずつですが、投稿をしております。 noteで誰かのためになる記事を書いています。 よろしくおねがいします。