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




このページは

ソフ開

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

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

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



問1 次の10進小数のうち、8進数に変換したときに有限小数になるものはどれか。
0.3
0.4
0.5
0.8
解答
解説 まず、2進数3桁を1桁にまとめたものが8進数で、2進数4桁を1桁にまとめたものが16進数です。よって、2進数で表現できるものは、必ず8進数、16進数でも表現できます。逆に8進数、16進数で表現で表現できるものは、必ず2進数で表現できます。

次に、10進数との関係を考えます。
2進数を10進数に変換することを考えると、2-1、2-2・・・2-nのようになっているので、これらの和で表現できます。よって、2進数で表現できることは10進数で表現できます。

しかし、10進数の0.3のようなものは、2-1=0.5と2-2=0.25の間にあるので、厳密な表現はできないということがわかります。

問2 負の整数を表現する代表的な方法として、次の3種類がある。

a 1の補数による表現
b 2の補数による表現
c 絶対値に符号を付けた表現(左端ビットが0の場合は正、1の場合は負)

4ビットのパターン1101をa〜cの方法で表現したものと解釈したとき、値が小さい順になるように三つの方法を並べたものはどれか。

a、c、b
b、a、c
b、c、a
c、b、a
解答
解説 それぞれのを並べてみます。

補数とは、A+B=0となるようなAとBの関係です。つまり、2回補数をとると元の値にもどります。

a:1101のビット反転0010なので、−2
b:1101のビット反転をして1を加えると0011なので、−3
c:1は負数で101は5なので、−5

よって、c、b、aとなります。

問3 XとYの否定論理積X NAND Yは、NOT(X AND Y)として定義される。X OR YをNANDだけを使って表した論理式はどれか。
((X NAND Y)NAND X)NAND Y
(X NAND X)NAND(Y NAND Y)
(X NAND Y)NAND(X NAND Y)
X NAND(Y NAND(X NAND Y))
解答
解説 この問題はド・モルガンの定理と呼ばれる以下のような変換法則を利用します。

(A+B)
(A・B)

次に、A NAND Aのように、同じ入力をNANDに入れるとAの否定を作ることができます。

1.X OR Y = (X OR Y)の二重否定
2.(X OR Y)の二重否定 = NAND の否定 (ド・モルガンの定理)
よって、(X NAND X)NAND(Y NAND Y)はX OR Yと等価であることがわかります。

最後に、XORやXANDはそれだけですべての演算子を作れるため、最小万能演算系と呼ばれます。

問4 集合Sの部分集合AとBがあるとき、に等しいものはどれか。ここで、はそれぞれのA,BのSに対する補集合、X−Yは集合Xと集合Yの差集合を表す。
)−(A∩B)
(S−A)∪(S−B)
−B
S−(A∩B)
解答
解説 まず、差集合とはA−Bのとき、AであってBでないものということを表します。よって、A∩と変換できます。これを使って式を変形していきます。

次に、論理命題で重要なド・モルガンの定理をまとめます。
(A+B)
(A・B)

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

よって、選択肢ウが正解となります。このような問題は真理値表やベン図を利用するもよいかと思います。

問5 論理式P,Qがいずれも真のとき、論理式Rの真偽にかかわらず真になる式はどれか。ここで、“ ”は否定、“∨”は論理和、“∧”は論理積、“→”は合意(真 → 偽となるときに限り結果が偽となる2項ブール演算)を表す。
画像(問5ans)を表示できません
解答
解説 まず、問題文にも定義されていますが、含意記号を真理値表で以下に示します。

P→Q


P,Qに真を代入した式を選択肢に当てはめていきます。

選択肢ア:((真→真)∩(真→真))→R=真→R
Rが真ならば、真→真で真。Rが偽ならば、真→偽で偽となります。

選択肢イ:((真→偽)∪(真→真))→(R→偽)=(真∪真)→(R→偽)=真→(R→偽)
Rが真ならば、真→(真→偽)で偽。Rが偽ならば、真→(偽→偽)で真となります。

選択肢ウ:((真→偽)∪(真→偽))→(真→R)=(偽∪偽)→(真→R)=偽→(真→R)
Rが真ならば、偽→真で真。Rが偽ならば、偽→偽で真となります。

選択肢エ:((真→真)∩(真→偽))→R=(真∩)→R=真→R
Rが真ならば、真→真で真。Rが偽ならば、真→偽で偽となります。

よって、選択肢ウの場合のみRの真偽が影響しません。
なお、A→Aのように、常に真になるような論理式を恒真式(トートロジー)といいます。

問6 7ビットのコードと1ビットのパリティビットからなる8ビットのデータで、データ誤りが発生したときの記述として、適切なものはどれか。
1ビットが誤っているときだけ、誤りを復元できる。
誤りを復元することは、不可能である。
誤りを復元できるかどうかは、不明である。
奇数個のビットが誤っているときだけ、誤りを復元できる。
解答
解説 一般的に、1ビットのパリティを持たせている場合は、1の個数を奇数個や偶数個にあらかじめ決めておきます。

偶数個の例を考えると、1000000とパリティが1で10000001で偶数個となります。しかし、10110001のように、偶数個誤っている場合には検出ができないという欠点があります。また、誤りがあるかどうかはわかっても訂正(誤りが起こったビットを特定できない)という欠点があります。

問7 後置表記法(逆ポーランド表記法)では、例えば、式Y=(A−B)×CをYAB−C×=と表現する。次の式を後置表記法で表現したものはどれか。

Y=(A+B)×(C−(D÷E))

YAB+CDE÷−×=
YAB+C−DE÷×=
YAB+EDC÷−×=
YAB+CD−E÷×=
解答
解説 逆ポーランド記法とは、後置表記法とも呼ばれ、演算子を対象の後ろに記述する手法です。スタックを使うことで実現でき、括弧が不要なのでコンパイラなどで利用されています。

優先度の高い部分から順に逆ポーランド記法に変換して行きます。

@A+BとD÷Eを変換する
Y=(AB+)×(C−DE÷)
AC−DE÷を変換する
Y=(AB+)×(CDE÷−)
BAB+とCDE÷−を変換する
Y=AB+CDE÷−×
C『=』を変換する
YAB+CDE÷−×=

なお他の選択肢は以下のようになります。
選択肢イ:Y=((A+B)−C)×(D÷E)
選択肢ウ:Y=(A+B)×(E−(D÷C))
選択肢エ:Y=(A+B)×(C−D)÷E)

問8 大きさnの問題をT(n)秒で解くプログラムがある。プログラムを用いて104以内で解ける最大の問題の大きさは、103秒以内で解ける最大の問題の大きさの約3.2倍になる。T(n)を表す式はどれか。
100n
5n2
3/2
n
解答
解説 問題文から大きさが3.2倍になると時間が10倍になることが分かります。T(n)にnと3.2nを代入して値が10倍になるものを選びます。

選択肢ア:100nと100×3.2n=320n
320n/100n=3.2倍

選択肢イ:5n2と5×(3.2n)2=5×10.24n2≒50n2
50n2/5n2=約10倍

選択肢ウ:n3/2と(3.2n)3/2=32.768n3/2≒333/2
33n3/n3=約33倍
選択肢エ:2nと23.2n
3.2n/2n=22.2

よって、選択肢イが正解となります。

問9 根付き木とは、根と呼ばれる特別な節点から木の枝が分かれるように、幾つかの辺が伸び、その先の節点から更に辺が伸びるということが繰り返されてできた構造である。根付き木の各節点vは、それぞれ3種類のポインタをもつ。

Parent[v]:節点vの親を指すポインタ
FirstChild[v]:節点vの第1子を指すポインタ
NextBrother[v]:節点vの次の兄弟を示すポインタ

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


ポインタが指す相手がいないときには、NILという記号で表される値がポインタに設定される。節点vも含めて、その兄弟をすべて出力するとき[  ]の部分に入れる手続きはどれか。ここで、節点vは根ではなく、report xは節点xを出力する手続きである。


[  ]
while x ≠ NIL do
  report x
  x ← NextBrother[x]
x ← FirstChidl[v]
x ← FirstChild[Parent[v]]
x ← NextBrother[v]
x ← NextBrother[Parent[v]]
解答
解説 問題文中にもありますが、木構造について図示をして確認をしておきます。

木構造を表示できません

問題文中のループは、自分を表示して次の兄弟を表示するという内容になっています。そのため、[  ]部分には、一番最初の兄弟をセットする必要があります。

例を挙げると、今自分が3番目の兄弟だったとすると、一度親に戻って、1番目の兄弟をセットする必要があります。これを定式化すると選択肢イとなります。

問10 キューとスタックの二つのデータ構造がある。次の手続きを順に実行した場合、変数xに代入されるデータはどれか。ここで、

データyをスタックに挿入することをpush(y),
スタックからデータを取り出すことをpop(),
データyをキューに挿入することをenq(y),
キューからデータを取り出すことをdeq(),
とそれぞれ表す。

push(a)
push(b)
enq(pop())
enq(c)
push(d)
push(deq())
x←pop()
解答
解説 まず、二つのデータ構造を図示すると以下のようになります。

スタックとキューを表示できません

@push(a)    スタック:a     キュー:
Apush(b)    スタック:a,b   キュー:
Benq(pop()) スタック:a     キュー:b
Cenq(c)     スタック:a     キュー:b,c
Dpush(d)    スタック:a,d   キュー:b,c
Epush(deq())スタック:a,d,b キュー:c
Fx=pop()    スタック:a,d   キュー:c

ということで、pop()でとりだされるのは、bとなります。

問11 次の手順はシェルソートによる整列を示している。データ列“7, 3, 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回実行されています。

問12 与えられた1〜8の整数の列をヒープソートによって降順に並び替えるため、列の全体をヒープに構成したところ

1,4,2,5,8,3,6,7


となった。ここで先頭の要素と最後の要素を交換して

7,4,2,5,8,3,6,1


とし、次に下線の部分をヒープに構成する手続きを実行する。このとき、実行直後の列はどうなるか。ここで、ヒープは列の1番目(左端)の要素が根、列のi番目の要素の子が2i番目と2i+1番目の要素とみなした完全2分木上に構成されるものとする。

2,4,3,5,8,7,6,1
4,2,5,8,3,6,7,1
7,4,5,8,3,6,2,1
8,7,6,5,4,3,2,1
解答
解説 ヒープソートとは未整列の部分を順序木に構成し、そこから最大値又は最小値を取り除いて既整列の部分に移す。これらの操作を繰り返して、未整列部分を縮めていくものです。まずは、ヒープソートと配列の関係を以下に図示します。

ヒープと配列を表示できません

ヒープは、親より子の値が小さいという制限があるので、根(添え字の先頭)が最小値になることになります。よって、選択肢アが正解となります。

問13 自然数をキーとするデータを、ハッシュ表を用いて管理する。キー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を法とする』などといいます。

問14 整数x、y(x>y≧0)に対して、次のように定義された関数F(x、y)がある。F(231、15)の値は幾らか。ここで、xmodyはxをyで割った余りである。

画像(問14)を表示できません
解答
解説 値を順番にトレースしていきます。

F(231,15)=F(15,231 mod 15)=F(15,6)
F(15,6=F(6,15 mod 6)=F(6,3)
F(6,3)=F(3,6 mod 3)=F(3,0)
F(3,0)=3

よって、F(231,15)=3となります。

問15 正の整数Mに対して次の二つの流れ図に示されるアルゴリズムを実行したとき、結果のxの値が等しくなるようにしたい。aに入れる条件として、正しいものはどれか。

画像(問15)を表示できません
n>M
n>M+1
n>M−1
n<M
解答
解説 まず、左の流れ図をみると、xに1を入れた後、nをMから1まで動かし、Mの階乗を計算しています。これと同じものを右の流れ図で行うためには、x×Mとなるまでnを増やす必要があります。右の流れ図は階乗を計算した後に、終了の判定が行われるのでn=n+1が行われてからMとの比較が行われます。つまり、M+1のときにループを抜けるようにする必要があります。よって、正解はアとなります。

分かりにくい方は、実際に値を入れて計算してみるといいと思います。
今『M=3』として計算してみましょう。

1回目
1→x
1→n
1×1→x
n=n+1=2
続ける(n=2)

2回目
1×2→x
n=n+1=3
続ける(n=3)

3回目
2×3→x
n=n+1=4
終わる(n=4)

選択肢ア:4>3で確かにYESとなり、ループをぬけることができます。
選択肢イ:4>3+1ではNOでまだループは続きます。
選択肢ウ:4>3−1では、その前にループを抜けてしまいます。
選択肢エ:n<3では、一番最初のループで抜けてしまいます。

問16 コンピュータの命令実行順序として、適切なものはどれか。
オペランド読出し → 命令の解読 → 命令フェッチ → 命令の実行
オペランド読出し → 命令フェッチ → 命令の解読 → 命令の実行
命令の解読 → 命令フェッチ → オペランド読出し → 命令の実行
命令フェッチ → 命令の解読 → オペランド読出し → 命令の実行
解答
解説 プログラム内蔵方式での命令の実行は、まず大きく分けて、フェッチ(取り出し)とエグゼキューション(実行)に分けられます。大まかに流れをまとめると、命令読み出し、命令解読、実行アドレス計算、オペランド読み出し、演算、結果の格納というようになります。

オペランドとは、演算対象となる値や変数をいいます。

つまり、命令をメモリ上からもってきて、どんな命令かを解読し、必要な値を読み込み、実行するということです。

問17 内部割込みに分類されるものはどれか。
商用電源の瞬時停電などの電源異常による割込み
ゼロによる除算を実行したことによる割込み
入出力が完了したことによる割込み
メモリパリティエラーが発生したことによる割込み
解答
解説 まず、割り込には大きく分けて内部割りこみと外部割り込みがあります。内部割り込はゼロによる除算に代表されるソフトウェア的な原因。外部割り込みは、入出力の完了や電圧異常などに代表されるハードウェア的な原因です。

また、割り込みを受け付けるとCPUはレジスタのデータを主記憶等に退避させ、割り込みの処理を実行します。さらに、複数の割り込みに優先順位をつけ、順位の低いものが、順位の高いものに割り込みを行わないようにマスク処理をする場合もあります。

問18 メモリアクセスの信頼性を高めるための方式で、自動訂正が可能なものはどれか。
CRC
ECC
チェックサム
パリティ
解答
解説 ECC(error check and correct:エラー訂正機能)メモリとは、その名の通り、ビット誤りを自動訂正する機能をもったメモリのことで、主にハミング符号を利用しています。

代表的な誤り制御方式を下にまとめます。

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

問19 すべての命令が5命令で完了するように設計されたコンピュータがある。パイプライン制御の下で、20命令を実行するには何サイクル必要となるか。ここで、すべての命令は途中で停止することなく実行できるものとする。
20
21
24
25
解答
解説 パイプラインとは、下の図のように命令の段階を少しずつずらして行う方式です。なお各段を多重化したスーパースケーラ(スーパスカラ)方式というのもあります。

パイプラインを表示できません

1つ目の命令は5サイクルで終了します。
2つ目の命令は6サイクルで終了します。
3つ目の命令は7サイクルで終了します。
・ ・ ・ 18つ目の命令22サイクルで終了します。
19つ目の命令23サイクルで終了します。
20つ目の命令24サイクルで終了します。

よって、24サイクルで終了することが分かります。

なお、問題文中にあるような依存関係や分岐命令などによってパイプラインの順番どおりに処理されないような状況をパイプラインハザードといいます。

問20 大量の画像データの高速転送を可能にする専用インタフェースはどれか。
AGP
ATA
ISA
PCI
解答
解説 AGP(Accelerated Graphics Port)はマザーボード上に設備され、グラフィックボードを接続するインタフェースです。また、ATAはHDDを接続するインタフェースで、PCIは一般の拡張ボードを接続するインタフェースです。ISAはPCIの前身でいまはほとんど使われていません。