平成19年度 秋期 ソフトウェア開発技術者試験 問1−20 解答編




このページは

ソフ開

(ソフトウェア開発技術者試験)

解答と解説のページです。

問題だけで勉強したい方は目次へ戻ってください



問1 xは、0以上65536未満の整数である。xを16ビットの2進数で表現して上位8ビットと下位8ビットを入れ替える。得られたビット列を2進数とみなしたとき、その値をxを用いた式で表したものはどれか。ここで、a div bはaをbで割った商の整数部分を、a mod bはaをbで割った余りを表す。また、式の中の数値は10進法で表している。
(x div 256)+(x mod 256)
(x div 256)+(x mod 256)×256
(x div 256)×256+(x mod 256)
(x div 256)×256+(x mod 256)×256
解答
解説 まず、特定の値を基数のべき乗で割る、余りをとることの意味を考えます。まず、10進数の12345を100(=102)で割ると商の部分は123、100で余りをとると45を取り出すことができます。つまり、基数のべき乗の桁数で割るとそこより上の値を、余りをとると下の値を取り出すことができます。

2進数xを256(=28)で割ると、9桁以上を取り出すことができます。また、2進数xを256で余りをとると、8桁以下をとりだすことができます。
上位8ビットを下位8ビットとして作成することは、単純に256で割ると作ることが出ます。下位8ビットを上位8ビットとして作成するためには、256で余りをとった後に、桁を上げるために、8ビットシフトをする(256倍する)ことで作成することができます。あとは、これを加算すれば、上位8ビットと下位8ビットを入れ替えることができます。

問2 数値を図に示す16ビットの浮動小数点形式で表すとき、10進数0.25を正規化した表現はどれか。ここでの正規化は、仮数部の最上位けたが0にならないように指数部と仮数部を調節する操作とする。

画像(問2)を表示できません
画像(問2ans)を表示できません
解答
解説 まず、0.25を2進数にすると(0.01)2となります。仮数部の最上位が0にならないように正規化するので、0.1×2-1と表現することができます。あとは、これを問題の形式にあわせます。

符号:+なので、0
指数部:−1なので、4ビットの2の補数で表現します。(1)10=(0001)2から補数を求めます。
1の補数:ビット反転=(1110)2
2の補数:1の補数+1=(1111)2
仮数部:0.1の小数点以下の部分なので、1

よって、「0」、「1111」、「10000000000」をつなげた、選択肢ウが正解となります。

問3 コンピュータで連立一次方程式の解を求めるのに、式に含まれる未知数の個数の3乗に比例する時間がかかるとする。あるコンピュータで100元連立一次方程式の解を求めるのに2秒かかったとすると、その4倍の演算速度をもつコンピュータで1,000元連立一次方程式の解を求めるときの計算時間は何秒か。
50
500
5,000
解答
解説 まず、現在の性能で100と1000元方程式の比をもとめると、1004/1003となり、1000倍であることがわかります。つまり、今の性能では、2000秒かかるので、4倍の性能では、500秒となります。

問4 相関係数に関する記述のうち、適切なものはどれか。
すべての標本点が正の傾きをもつ直線上にあるときは、相関係数が+1になる。
変量間の関係が線形のときは、相関係数が0になる。
変量間の関係が非線形のときは、相関係数が負になる。
無相関のときは、相関係数が−1になる。
解答
解説 相関係数とは、相関図などにおいて、二つの関係の強さを表す係数です。係数は−1から+1の間で表されます。以下に相関関係をまとめます。

散布図を表示できません

問5 全体集合S内に部分集合AとBがあるとき、に等しいものはどれか。ここで、A∪BはAとBの和集合、A∩BはAとBの積集合、はSにおけるAの捕集合、A−BはAからBを除いた差集合を表す。
)−(A∩B)
(S−A)∪(S−B)
−B
S−(A∩B)
解答
解説 ベン図や真理値表を用いても良いのですが、ここでは変数の簡約をつかって解を求めます。

問題の式:A∪B
選択肢ア:()−()=(A∩B)−(A∩B)=A∩B
選択肢イ:(S−A)∪(S−B)=A∩B
選択肢ウ:−B=A∪B
選択肢エ:S−(A∩B)=A∩B

よって、選択肢ウが問題の式と同じとなります。

問6 論理式X=・B+A・と同じ結果が得られる論理回路はどれか。

画像(問6q)を表示できません
画像(問6ans)を表示できません
解答
解説 論理式をみると、A・B以外のとき出力が行われています。つまり、A・B(論理積)の否定を出力としていることになるので、否定論理積の出力であるとわかります。

問7 コンピュータの主記憶の誤り制御などに採用されている方式のうち、1ビットの誤りを訂正し、2ビットの誤りを検出することができる方式はどれか。
奇数パリティ方式
水平パリティ方式
チェックディジット方式
ハミング符号方式
解答
解説 代表的な誤り制御方式を下にまとめます。

奇数パリティ:1(あるいは0)の個数が奇数個になるように、1ビットを付加するもの。
奇数パリティ:1(あるいは0)の個数が偶数個になるように、1ビットを付加するもの。
水平パリティ:転送を2次元の配列とみなしたときに、水平方向へのパリティを付加するもの。垂直パリティと合わせて利用されることが多い。
チェックサム:送信データを数値に対応させ、その合計を計算し付加するもの。
チェックディジット:特定の計算から求めた値を付与し、データの入力ミスや誤り検出を行う。 ハミング符号:複数の冗長ビットを付加し2ビットの誤り検出と、1ビットの誤り訂正機能を持つ。
巡回冗長検査(CRC):送信列から生成多項式とよばれる式をつくり、受信側で計算式の余りが0かどうかを調べる。バースト誤り(連続した・固まったあやまり)に強い。

問8 次の有限オートマトンが受理する文全体を正規表現で表したものはどれか。

画像(問8)を表示できません
(010)*
(01|101)*
(0|10)*
(1|01)*
解答
解説 オートマトンをみると、どんな状態であれ2回連続で1が入力されると、一番右の状態に遷移してしまい、戻れなくなってしまいます。つまり、選択肢イでは、01→101の際に1が2回続いてしまいます。選択肢エでは、1→1の際に1が2回続いてしまうため不適切であることがわかります。

 つぎに、いくつかのパターンをあてはめてすべて記述できるかを考えます。受理できるパターンはたとえば以下のような場合です。
1、01、001、0001、101、10101、0101、0100001

選択肢アでは、01、001などを作ることができないので不適切となります。
選択肢ウは、(0|10)の部分を実行すると初期状態へ戻ってくることができ、最後の1で受理状態へ移動するので正しいといえます。

問9 A,B,Cの順序で入力されるデータがある。各データについてスタックへの挿入と取出しを一回ずつ行うことができる場合、データの出力順序は何通りあるか。

画像(問9)を表示できません
解答
解説 まず、A,B,Cのすべての組み合わせは以下の6通りです。これについて順番に出力できるか考えます。

A,B,C:Aを出力、Bを出力、Cを出力 → 可能
A,C,B:Aを出力、Bをスタックに積む、Cを出力、Bを取り出す → 可能
B,A,C:Aをスタックに積む、Bを出力、Aを取り出す、Cを出力 → 可能
B,C,A:Aをスタックに積む、Bを出力、Cを出力、Aを取り出す → 可能
C,A,B:Aをスタックに積む、Bをスタックに積む、Cを出力、Aを先に出力できない → 不可能
C,B,A:Aをスタックに積む、Bをスタックに積む、Cを出力、Bを取り出す、Aを取り出す → 可能

よって、5通りが可能であるといえます。

問10 次の手順はシェルソートによる整列を表している。データ列7,2,8,3,1,9,4,5,6を手順(1)〜(4)に従って整理するとき、手順(3)を何回繰り返して完了するか。ここで、[ ]は小数点以下を切り捨てた結果を返す。

[手順]
(1) [データ数÷3]→Hとする。
(2) データ列を互いにH要素分だけ離れた要素の集まりからなる部分列とし、それぞれの部分列を挿入法を用いて整列する。
(3) [H÷3]→Hとする。
(4) Hが0であればデータ列の整列は完了し、0でなければ(2)に戻る。
解答
解説 シェルソートとは、ある一定間隔おきに取り出した要素から成る部分列をそれぞれ整列し,更に間隔を詰めて同様の操作を行い,間隔が1になるまでこれを繰り返すことで、値を整列させる手法です。

順番に追いかけていきます。
1回目
(1)9÷3=3→H
(2)(7,3,4)(2,1,5)(8,9,6)→(3,4,7)(1,2,5)(6,8,9)
(3)3÷3=1→H
(4)H=0でないので、(2)へ戻る

2回目
(2)(3,4,7,1,2,5,6,8,9)→(1,2,3,4,5,6,7,8,9)
(3)1÷3=0→H
(4)H=0なので、完了

よって、(3)は2回実行されています。

問11 探索表の構成法を例とともにa〜cに示す。探索の平均計算量が最も小さい探索手法の組合せはどれか。ここで、探索表のコードの空欄は表の空きを示す。

画像(問11)を表示できません
画像(問11ans)を表示できません
解答
解説 まず、3つの探索法についてまとめます。データ量をnとしたときのオーダ(検索時間)もあわせてまとめます。

2分探索:ソートされているデータに対して、中間値と目的とを比較することで、大きいグループと小さいグループに分け、1回の検索で探索範囲を半分にしていく。オーダはlog2
線形探索:上から一つずつ比較していく方法。オーダはn
ハッシュ検索:ハッシュ関数を使って、格納場所を決める方法。ハッシュ値が同じになる衝突(シノニム)などがなければ、1度で検索場所が決まります。オーダは1

それでは、それぞれの表に適した検索法を考えます。
表a:コードが順番にならんでいる(ソートされている)ので、線形探索よりも2分探索のほうが高速に検索ができるので、2分探索を利用します。
表b:コードに規則性がないが、使用頻度順にならんでいるということは、上にあるものほど発見しやすいので、線形探索を利用します。
表c:ハッシュにより場所を決めているので、同じ関数を利用して求めるのが一番よいので、ハッシュ表探索を利用します。

問12 自然数をキーとするデータをハッシュ表を用いて管理する。キーxのハッシュ関数h(x)をh(x)=x mod nとする。ここで、nはハッシュ表の大きさであり、x mod nはxをnで割った余りを表す。キーaとbが衝突する条件はどれか。
a+bがnの倍数
a−bがnの倍数
nがa+bの倍数
nがa−bの倍数
解答
解説 まず、実際に値を入れて計算してみたハッシュの例を下に示します。

ハッシュ

ハッシュのイメージがつかめたところで計算に移ります。

上の図からもわかるように、二つの値の差がnの倍数であれば衝突が起こることがわかります。

なお、整数論においては、『mod n』のことを『nを法とする』などといいます。

問13 図の2分木を深さ優先の先行順で探索を行ったときの探索順はどれか。ここで、図中の数字はノードの番号を表す。

画像(問13)を表示できません
1,2,3,4,5,6
1,2,4,5,3,6
4,2,5,1,3,6
4,5,2,6,3,1
解答
解説 木構造を走査する代表的な方法を主にまとめます。

1.行きがけ順(深さ優先):根を調べる → 左の部分木を走査する → 右の部分木を調べる
2.通りがけ順:左の部分木を走査する → 根を調べる → 右の部分木を調べる
3.帰りがけ順:左の部分木を走査する → 右の部分木を調べる → 根を調べる
4.幅優先:根を調べる → 根の子を調べる → その子を調べる・・・

今回は、深さ優先方式なので、以下のようになります。
1.まず根である「1」を調べる
2.左の部分木に移り、根である「2」を調べる
3.更に、左へ移り、「4」を調べる
4.根(2)にもどり右の子である(5)を調べる
5.根(2)にもどり、さらに親(1)にもどる。そして、右の部分木である「3」を調べる
6.最後に「6」を調べる

図にすると以下のようになります。

画像(問13kai)を表示できません

問14 再帰的に定義された手続きprocでproc(5)を実行したとき、印字される数字を順番に並べたものはどれか。

画像(問14)を表示できません
543212345
5432112345
54321012345
543210012345
解答
解説 順番に追いかけていくと以下のようになります。

proc(5)
n=0でないので、5を印字する
 proc(4)をを呼び出す
 n=0でないので、4を印字する
  proc(3)をを呼び出す
   n=0でないので、3を印字する
   proc(2)をを呼び出す
   n=0でないので、2を印字する
    proc(1)をを呼び出す
    n=0ではないので、1を印字する
     proc(0)を呼び出す
     n=0なので、戻る
    proc(1)に戻って1を印字する
   proc(2)に戻って2を印字する
  proc(3)に戻って3を印字する
 proc(4)に戻って4を印字する
proc(5)に戻って5を印字する

よって、5,4,3,2,1、と印字し、1,2,3,4,5と印字するので、選択肢イのようになります。

問15 次の流れ図は、シフト演算と加算の繰返しによって2進数の乗算を行う手順を表したものである。この流れ図中のa,bの処理の組合せとして、正しいものはどれか。ここで、乗数と被乗数は符号なしの16ビットで表される。X,Y,Zは32ビットのレジスタであり、けた送りには論理シフトを用いる。最下位ビットを第0ビットと記す。

画像(問15)を表示できません
画像(問15ans)を表示できません
解答
解説 シフトされたYの最下位ビットが1だった場合は、乗算をする必要があり、0だった場合は、何もする必要がありません。また、被乗数Xを左に1ビットシフトし、乗数を右に1ビットシフトすることで桁をあわせていきます。

235×321を計算するときに、
5×321
3×3210
2×32100のようにしていると考えるとわかりやすいかもしれません。

問16 現在の商用超並列コンピュータの多くが採用しているマルチプロセッサの処理方式の一つで、プロセッサごとに異なる命令を並列に実行させるものはどれか。
CISC
MIMD
RISC
SIMD
解答
解説 まず、フリンの分類と呼ばれる命令とデータの並列性を基にした分類法についてまとめます。

SISD:(単一命令、単一データ)命令にもデータにも並列性のない逐次的なコンピュータ
SIMD:(単一命令、複数データ)ベクトル演算機やGPU等
MISD:(複数命令、単一データ)命令列が複数あり、それを1 つのデータストリームに適用する形態のコンピュータ。あまり一般的ではない
MIMD:(複数命令、複数データ)複数のプロセッサが同時並行的にそれぞれ異なるデータを異なる命令で処理するコンピュータ

つぎに、代表的な2つの命令セットアーキテクチャについてまとめます。

RISC(Reduced Instruction Set Computer:縮小命令セットコンピュータ):時間のかからない単純な命令を利用する実行する方式
CISC(Complex Instruction Set Computer:複合命令セットコンピュータ):時間はかかるが複雑なことができる命令を利用する方式

RISCは、固定長の命令とパイプラインを有効に利用し高速化を実現しています。

問17 コンピュータの命令実行順序として、適切なものはどれか。
オペランド読出し → 命令の解読 → 命令フェッチ → 命令の実行
オペランド読出し → 命令フェッチ → 命令の解読 → 命令の実行
命令フェッチ → オペランド読出し → 命令の解読 → 命令の実行
命令フェッチ → 命令の解読 → オペランド読出し → 命令の実行
解答
解説 一般的に、命令の実行は以下のようになります。

命令のフェッチ:命令をメモリからとりだし、デコーダにセットする
命令の解読:デコーダから命令の意味を解読する
アドレスの計算:必要な値を集めるために、アドレスを計算する
オペランド読み出し:計算された値に格納された値をレジスタに持ってくる
命令の実行:命令を実行する
結果の格納:計算結果を適切な場所に書き込みます。

問18 同じ命令セットをもつコンピュータAとBがある。それぞれのCPUクロック周期と、あるプログラムを実行したときのCPI(Cycles Per Instruction)は、表のとおりである。コンピュータAがこのプログラムを実行したときの処理時間は、コンピュータBの何倍になるか。

画像(問18)を表示できません
1/32
1/2
解答
解説 CPIとは、その名の通り、1命令あたりに必要なクロック数を表します。

コンピュータAでは、1命令当たり4クロック必要で、1クロックが1ナノ秒なので、1命令は平均4ナノ秒かかります。
コンピュータBでは、1命令当たり0.5クロック必要で、1クロックが4ナノ秒なので、1命令は平均2ナノ秒かかります。

よって、よって同じ命令数のプログラムを実行した場合、プログラムAはプログラムBの2倍の時間がかかるといえます。

問19 図のアーキテクチャのシステムにおいて、CPUからみた、主記憶とキャッシュメモリを合わせた平均読込み時間を表す式はどれか。ここで、読み込みたいデータがキャッシュメモリに存在しない確率をrとし、キャッシュメモリ管理に関するオーバヘッドは無視できるものとする。

画像(問19)を表示できません
画像(問19ans)を表示できません
解答
解説 キャッシュメモリは、主記憶装置(=メインメモリ)とCPUとの処理能力の速度の差を埋めるために用いられるメモリです。メインメモリはまず、キャッシュメモリにデータを探しに行き、そのデータがある場合は、キャッシュメモリから、ない場合はメインメモリからデータを読み出します。よって、存在しない確率 ×メインメモリの読み込み速度+存在する確率×キャッシュメモリの読み込み速度となります。両者の容量はアクセス速度には関係がありません。

問20 CPUと主記憶の間に置かれるキャッシュメモリにおいて、主記憶のあるブロックを、キャッシュメモリの複数の特定ブロックと対応付ける方式はどれか。
セットアソシアティブ方式
ダイレクトマッピング方式
フルアソシアティブ方式
ライトスルー方式
解答
解説 キャッシュメモリはデータをライン(あるいはブロック)と呼ぶある程度まとまった単位で管理します。
例えば4ビットを1つのラインとしてまとめて管理する場合は、その上位ビットを保存しておきます。この上位のアドレスをフレームアドレス、下位のアドレスをエントリアドレスといいます。これによりフレームアドレスをまず検索し、その後エントリアドレスを検索することで、高速化できます。
(例:10100000〜10101111は、1010を上位ビットとして保存しておきます。)

このフレームアドレスバッファが複数ある場合は、複数のデータを格納できます。このときのバッファの個数をセット数(ウェイ)と呼びます。このような構造により、局所的に連続したデータにアクセスする場合に高速に処理できます。

これを踏まえて、キャッシュメモリの方式を下にまとめます。

ダイレクトマッピング方式:メモリ空間と1対1で割り当てる方式。すべてのメモリ領域を1対1でカバーするのでヒット率が低い
フルアソシアティブ方式:任意のメモリ空間と対応付ける方法。使用率が高いところを自由に持ってこれるので、ヒット率が高い反面オーバヘッドが大きい
セットアソシアティブ方式:上の二つの間のような方法。ある程度区切った空間を自由に対応付けることができる。通常セット数nに対して、nウェイセットアソシアティブという

ライトスルー方式は、キャッシュメモリのアクセス方式の一種です。