文部科学省後援
平成28年度後期 情報検定
<実施 平成29年2月12日(日)>
プログラミングスキル
(説明時間 10:00~10:10)
(試験時間 10:10~11:40)
・試験問題は試験開始の合図があるまで開かないでください。
・解答用紙(マークシート)への必要事項の記入は,試験開始の合図と同時 に行いますので,それまで伏せておいてください。
・試験開始の合図の後,次のページを開いてください。<受験上の注意>が 記載されています。必ず目を通してから解答を始めてください。
・試験問題は,すべてマークシート方式です。正解と思われるものを1つ選 び,解答欄の をHBの黒鉛筆でぬりつぶしてください。2つ以上ぬりつ ぶすと,不正解になります。
・辞書,参考書類の使用および筆記用具の貸し借りは一切禁止です。
・電卓の使用が認められます。ただし,下記の機種については使用が認めら れません。
<使用を認めない電卓>
1.電池式(太陽電池を含む)以外..
の電卓
2.文字表示領域が複数行ある電卓(計算状態表示の一行は含まない)
3.プログラムを組み込む機能がある電卓 4.電卓が主たる機能ではないもの
*パ ソ コ ン ( 電 子 メ ー ル 専 用 機 等 を 含 む ), 携 帯 電 話 ( P H S ),
ス マ ー ト フ ォ ン , タ ブ レ ッ ト , 電子手帳,電子メモ,電子辞書,
翻訳機能付き電卓,音声応答のある電卓,電卓付き腕時計,時 計 型 ウ ェ ア ラ ブ ル 端 末 等
5.その他試験監督者が不適切と認めるもの
一般財団法人 職業教育・キャリア教育財団
情報システム試験
<受験上の注意>
1.この試験問題は36ページあります。ページ数を確認してください。
乱丁等がある場合は,手をあげて試験監督者に合図してください。
※問題を読みやすくするために空白ページを設けている場合があります。
2.解答用紙(マークシート)に,受験者氏名・受験番号を記入し,受験番号下欄の数字 をぬりつぶしてください。正しく記入されていない場合は,採点されませんので十分注 意してください。
3.試験問題についての質問には,一切答えられません。自分で判断して解答してくださ い。
4.試験中の筆記用具の貸し借りは一切禁止します。筆記用具が破損等により使用不能と なった場合は,手をあげて試験監督者に合図してください。
5.試験を開始してから30分以内は途中退出できません。30分経過後退出する場合は,も う一度,受験番号・マーク・氏名が記載されているか確認して退出してください。なお,
試験終了5分前の合図以降は退出できません。試験問題は各自お持ち帰りください。
6.試験後にお知らせする合否結果(合否通知),および合格者に交付する「合格証・認定 証」はすべて,Webページ(PC,モバイル)での認証によるデジタル「合否通知」,
デジタル「合格証・認定証」に移行しました。
①団体宛にはこれまでと同様に合否結果一覧ほか,試験結果資料一式を送付します。
②合否等の結果についての電話・手紙等でのお問い合わせには,一切応じられませんの で,ご了承ください。
<問題の構成>
必須問題 全員解答
選択問題 次の問題から1問選択し解答せよ。
(選択した問題は解答用紙「選択欄」に必ずマークすること
...............)
※選択欄にマークがなく,解答のみマークした場合は採点を行いません。
問題1~問題4
2
ページ~19ページ・C言語の問題
21
ページ~26
ページ・表計算の問題
28
ページ~33
ページ・アセンブラの問題
34
ページ~36
ページ必須問題
問題1 次の二分木に関する記述を読み,各設問に答えよ。
二分木とは,1つの親ノードから分岐する子ノードが2つ以下のものを指す。ここ では,ノードの値が必ず「左子ノード<親ノード<右子ノード」となる順序木を扱う ものとする。また,ノードの値に同じものは無いものとする。
図1 二分木
<設問1> 次の順序木へのノードの追加に関する記述中の (1) に入れるべき適 切な字句を解答群から選べ。
図2 追加前の順序木
図2の状態にある順序木に対してノードを追加する。なお,ここではノードの値や 位置を入れ替えることはしないものとする。
「3」をノードに追加する位置は,
(1)
の値を持つノードの右子ノードであり,「9」をノードに追加する位置は,
(2)
の値を持つノードの左子ノードである。(1)
,(2) の解答群ア.2 イ.
4
ウ.6
エ.8 オ.
10
カ.128
2 6
4 10
12 7
3 11
左子ノード 右子ノード 親ノード
<設問2> 次の順序木からのノードの削除に関する記述中の (1) に入れるべき 適切な字句を解答群から選べ。
図3 削除前の順序木
子ノードを持つ親ノードを削除する場合,そのノード以下のノードから,新しく親 になるノードを選択して移動する。例えば,図3の状態で「
9」のノードを削除する
場合,「3」または「12」を「9」の位置に移動する。
「20」のノードを削除する場合,そのノード以下のノードは複数存在するが,順序 木になるようにするためには,
(3)
のノードを「20」の位置に移動する。(3)
の解答群ア.「3」または「28」 イ.「9」または「35」
ウ.「12」または「28」 エ.「12」または「39」
<設問3> 次の順序木からの探索に関する記述中の (1) に入れるべき適切な字 句を解答群から選べ。
頂点から最深部までの距離が同じである二分木を完全二分木という。ノードの値を 探索する回数を考える。
図4 完全二分木の例
図4の場合,ノード数は
15
であり,最深部までの階層数は4
である。この二分木 の一層目から値の大小関係により子ノードを選択しながら値を探索する場合,最大で2 6 10 14 18 22 26 30
4 12 20 28
8 24
16 20
3 12
9
28 39
35
必須問題
一般的にノードの数をnとした場合,最大探索回数は「log2nを超える最小の整数」
で表される。これは,「n<2x」となる最小の
x
を求めることである。図4の場合,n=15 であるから,15 を超える2のべき乗の値で一番小さい整数値 を考えると,16(24)なので
x
=4,つまり,最大探索回数は4
回となる。n=1000とした場合,1000を超える2のべき乗の値で一番小さい整数値は
1024
で ある。よって,最大探索回数は(4)
回となる。なお,ノードの数が2倍になると,最大探索回数は
(5)
。(4)
の解答群ア.9 イ.
10
ウ.11
エ.12
(5)
の解答群ア.1回増える イ.
2
倍になる ウ.変わらない エ.半分になる問題2 整列アルゴリズムである挿入法およびシェルソートの説明を読み,各設問に答え よ。
[挿入法の説明]
1
次元配列t[0]~t[4]に数値データが 5
個格納されている(図1)。このデータを,
挿入法により昇順に整列する。挿入法とは,整列済みのデータに対して,新たなデー タを適切な位置に挿入し,整列済みの範囲を広げていく方法で,次の手順1,手順2 を実行し,未整列部分が無くなったら終了する。
手順
1:最初の段階では,整列されていないため,最初の要素だけを整列済みの要素
と考える。
添字→
0 1 2 3 4
配列t 5 9 7 3 6
図1 配列
t
の初期状態手順2:未整列部分の要素を,先頭から順番に整列済み部分の適切な位置に挿入する。
添字→
0 1 2 3 4
配列t 5 9 7 3 6
添字→
0 1 2 3 4
配列t 5 7 9 3 6
添字→
0 1 2 3 4
配列t 3 5 7 9 6
添字→
0 1 2 3 4
配列t 3 5 6 7 9
整 列 済
み部分 未整列部分
整列済み部分 未整列部分
整列済み部分 未整列部分
整列済み部分
未 整 列 部分
整列済み部分
<設問1> 次の挿入法に関する記述中の
[1]
に入れるべき適切な字句を解答群 から選べ。挿入法における要素の比較回数を考えると,比較回数が最も多くなるのは降順に整 列済みの配列を昇順に整列する場合であり,要素数を
5
個とすると配列内の要素の比 較回数は(1)
回である。(1) の解答群
ア.4 イ.
5
ウ.10
エ.15
[シェルソートの説明]
シェルソートは,配列から一定間隔で抽出された部分配列に対して挿入法を繰り返 す整列アルゴリズムである。挿入法で要素を移動する場合は隣り合う位置で行うが,
シェルソートでは離れた位置へ要素を移動する。要素位置の間隔をいくつに設定する かで効率も変わり,いくつかの値設定が推奨されている。
1
次元配列t[0]~t[9]に数値データが格納されており(図3 ),最初の間隔 d
を4
と し(図4,図5),次に2(図6,図7),最後に 1(図8 )として,それぞれ挿入法を適
用した例を示す。添字→
0 1 2 3 4 5 6 7 8 9
配列t 38 13 25 32 19 21 15 35 27 12
図3 配列
t
の初期状態1
回目 d=4添字→ 0
4 8
挿入法適用 04 8
配列t
138 19 27 19 27 38
添字→ 1
5 9 1 5 9
配列t
213 21 12 12 13 21
添字→ 2
6 2 6
配列
t
325 15 15 25
添字→ 3
7 3 7
配列
t
432 35 32 35
図4 d=4の部分配列
添字→
0 1 2 3 4 5 6 7 8 9
配列t 19 12 15 32 27 13 25 35 38 21
図5
1
回目終了時の配列t
2
回目 d=2添字→ 0
2 4 6 8
挿入法適用 02 4 6 8
配列t
519 15 27 25 38 15 19 25 27 38
添字→ 13 5 7 9 1 3 5 7 9
配列t
612 32 13 35 21 12 13 21 32 35
図6 d=2 の部分配列
添字→
0 1 2 3 4 5 6 7 8 9
配列t 15 12 19 13 25 21 27 32 38 35
図7
2
回目終了時の配列t
3
回目 d=1(全要素を対象とした挿入法)
添字→
0 1 2 3 4 5 6 7 8 9
配列t 12 13 15 19 21 25 27 32 35 38
図8
3
回目終了時の配列t
<設問2> 次のシェルソートの流れ図
(図9)中の [1]
に入れるべき適切な字句 を解答群から選べ。開 始
終 了 シェルループ1
d ← d ÷ 2
q ← p - d
挿入ループ2
q≧0 かつ sw=0
の間繰り返す
wk ← t[p]
挿入ループ1
p<10
の間繰り返す(2)
sw ← 0
挿入ループ2
(3)
p ← p + d
挿入ループ1
t[q+d] ← t[q]
d ← 4
シェルループ1d≧1 の間繰り返す
シェルループ2
s<d の間繰り返す
s ← 0
シェルループ2
(5)
wk : t[q]
sw ← 1
<
≧
(4)
図9 シェルソートの流れ図
(3)
(4)
(5)
s
← s + 1(2)
,(3) の解答群ア.sw ← 0 イ.
sw ← 1
ウ.p ← s - d エ.p ← s + d
(4) の解答群
ア.q ← q - 1 イ.
q ← q + 1
ウ.q ← q - d エ.q ← q + d
(5) の解答群
ア.t[q] ← t[s] イ.
t[q] ← wk
ウ.t[q+d] ← t[s] エ.t[q+d] ← wk
問題3 次のファイル処理に関する各設問に答えよ。
<設問1> 次のファイルの併合(マージ)に関する記述中の (1) に入れるべき適 切な字句を解答群から選べ。
2つの順編成ファイルを1つの順編成ファイルにまとめる処理である。
図1 マージ処理
ここでは,ファイル1およびファイル2は数値の昇順に並んでおり,ファイル3へ の出力も数値の昇順に並ぶようにする。
ファイル1
1 3
ファイル2
2 4
ファイル31 2 3 4
図2 昇順になるマージ処理
この処理は,次のように行う。
1.ファイル1およびファイル2から1件ずつ入力する。
2.以下の処理を2つのファイルに格納されたデータが無くなるまで繰り返す。
・小さい方の値をファイル3へ出力し,出力されたデータが格納されていたファ イルから次のデータを入力する。なお,同じ値の場合は,どちらを先に出力し ても構わない。
ファイル1 ファイル2
マージ処理
ファイル3
ファイルから入力すべきデータがなくなったら(ファイルの終わり),データの代 わりに,9999 を使用する。ただし,ファイル1およびファイル2に
9999
以上のデー タは無いものとする。今,ファイル1およびファイル2の内容が図3のように並んでおり,ファイル1か ら入力したデータは
V1,ファイル2から入力したデータは V2
へ格納するものする。ファイル1
1 2 5
ファイル2
3 4 6
図3 ファイル1とファイル2の内容
最初にファイル1とファイル2を入力するので,V1は
1,V2
は3
となる。以下の表 は,処理をトレースしたものである。表 トレースした表
回数
V1 V2
出力する値 次に入力するファイル1 1 3 1
ファイル12 2 3 2
ファイル13 (1)
4 (2)
5 (3)
6 9999 6 6
ファイル2注意 網掛けの部分は表示していない
6
回目の処理後,ファイル2が終わりになるので,V2 も9999
になる。V1,V2 とも に9999
になることで処理を終える。(1) ~ (3) の解答群
ア.3 イ.
4
ウ.5
エ.6 オ.9999<設問2> 次のマージ処理を行う流れ図中の (1) に入れるべき適切な字句を解 答群から選べ。
[流れ図の説明]
値の昇順に整列済みのファイル1とファイル2をマージし,ファイル3へ値の昇順 に並ぶように出力するものである。
なお,ファイル1から入力したデータは
V1,ファイル2から入力したデータは V2
へ格納される。また,9999以上の値は含まれていない[流れ図]
開 始
ファイルを開く
ファイル1入力
ファイル2入力
マージループ の間繰り返す
マージループ V1を出力
ファイル1入力
V2を出力
ファイル2入力
終 了
ファイル1入力
ファイル1を読む
ファイルの終わり
V1 ← 9999
戻る Yes
No
Yes No
ファイル2入力
ファイル2を読む
ファイルの終わり
V2 ← 9999
戻る Yes
No (5)
(4)
ファイルを閉じる
図4 マージ処理の流れ図
(4)
の解答群ア.V1=9999 または V2=9999 イ.
V1=9999 または V2≠9999
ウ.V1≠9999 または V2=9999 エ.V1≠9999 または V2≠9999
(5)
の解答群ア.V1<V2 イ.V1>V2 ウ.V1=V2 エ.V1≠V2
<設問3> 次の更新処理に関する記述中の (1) に入れるべき適切な字句を解答 群から選べ。
マージの考え方を応用して,マスタファイルの内容をトランザクションファイルの 内容で更新する。
図5 更新処理図
旧マスタファイルのレコードにはキーとなる項目があり,この項目の昇順に整列済 みである。
トランザクションファイルは,マスタファイルの内容を書き換える情報を集めたも ので,マスタファイルと同様にキーとなる項目があり,この項目の昇順に整列済であ る。
図6は,旧マスタファイルの内容にトランザクションファイルの内容を加算し,新 マスタファイルへ出力した例である。
各ファイルのレコード項目は,キー項目と値の項目からなり,旧マスタファイルは
M-KEY
とM-VALUE,トランザクションファイルは T-KEY
とT-VALUE,新マスタファイル
はN-KEY
とN-VALUE
とする。更新内容は,T-KEYと一致するM-KEY
の値(M-VALUE)にT-VALUE
を加え,キーと一緒に新マスタファイルへ出力するものである。なお,各ファイルともレコードキー項目に重複する値は存在しないものとする。
旧マスタファイル
M-KEY M-VALUE
C001 150 C004 120 C005 300 C008 250
トランザクション ファイル
T-KEY T-VALUE
C001 100 C005 200
新マスタファイル
N-KEY N-VALUE
C001 250 C004 120 C005 500 C008 250
図6 更新処理の例旧マスタファイル
更新処理
トランザクションファイル
新マスタファイル
処理手順は,次のようになる。
1.旧マスタファイル,トランザクションファイルから
1
レコードずつ入力する。2.以下の3つの処理のいずれかを2つのファイルともファイルの終わりになるま で繰り返す。なお,ファイルが終わりになった場合,レコードキー項目には最 高値を設定するものとする。
(a) M-KEY
とT-KEY
が等しい場合は,M-KEY と加算した値を新マスタファイルへ 出力し,旧マスタファイルとトランザクションファイルから次のレコードを 入力する。(b) M-KEY
がT-KEY
より小さい場合は,M-KEY とM-VALUE
を新マスタファイルへ 出力し,旧マスタファイルから次のレコードを入力する。(c) M-KEY
がT-KEY
より大きい場合は,新 マ ス タ へ 出 力 は 行 わ ず , ト ラ ン ザ ク シ ョ ン ファイルから次のレコードを入力する。(b)は M-KEY
と同じ値を持つレコードがトランザクションファイル中に存在しない場合である。これは,
(6)
ためであり,そのまま旧マスタファイルの該当レコー ドを新マスタファイルへ出力する。(c)は T-KEY
の値がマスタファイル中に存在しない場合である。これは,(7)
た めであり,エラー表示などを行う。(6) ,(7) の解答群
ア.M-KEY に設定した値に誤りがある イ.T-KEY に設定した値に誤りがある ウ.更新の対象になるレコードである エ.更新の対象とならないレコードである
<設問4> 次の更新処理の流れ図中の (1) に入れるべき適切な字句を解答群か ら選べ。
[流れ図の説明]
旧マスタファイルをトランザクションファイルの内容で更新し,新マスタファイル を作成するものである。各ファイルのレコード形式は,次のようになっている。
旧マスタファイル 商品コード(M-KEY) 数量(M-SURYO) トランザクションファイル 商品コード(T-KEY) 数量(T-SURYO) 新マスタファイル 商品コード(N-KEY) 数量(N-SURYO)
図7 各ファイルのレコード形式
更新処理は,旧マスタファイルの数量(
M-SURYO)にトランザクションファイルの
数量(T-SURYO)を加えるものとする。なお,各ファイル内での商品コードに重複はないものとする。
また,流れ図中で使用する最高値はシステムで表現できる一番大きい値であり,商 品コードとして使用しない。
[流れ図]
開 始
ファイルを開く
MASTER入力
TRAN入力
更新ループ の間繰り返す
M-KEY:T-KEY
< >
=
MASTER入力
TRAN入力
MASTER入力 TRAN入力
マージループ
終 了 ファイルを閉じる (8)
(9) (10) (11)
MASTER入力
ファイルの終わり
M-KEY ← 最高値
戻る Yes
No マスタファイルを読む
TRAN入力
ファイルの終わり
T-KEY ← 最高値
戻る Yes
No トランザクション
ファイルを読む
図8 ファイル更新の流れ図
(8) の解答群
ア.M-KEY=最高値
または T-KEY=最高値
イ.M-KEY=最高値または T-KEY≠最高値
ウ.M-KEY≠最高値または T-KEY=最高値
エ.M-KEY≠最高値または T-KEY≠最高値
(9)
~ (11) の解答群ア.M-KEY を
N-KEY,M-SURYO
をN-SURYO
に設定して新マスタファイルへ出力 イ.M-KEY をN-KEY,M-SURYO+T-SURYO
をN-SURYO
に設定して新マスタファイルへ出力
ウ.M-KEYをエラー表示
エ.T-KEYを
N-KEY,M-SURYO
をN-SURYO
に設定して新マスタファイルへ出力 オ.T-KEYをエラー表示問題4 次のプログラムの説明を読み,プログラム中の
に入れるべき適切な字 句を解答群から選べ。
[プログラムの説明]
1次元配列
text(長さ len_t)に文字列が格納されている。この文字列の先頭から
配列s_text
(長さlen_s)に格納されている文字列を探索し,配列 c_text
(長さlen_c)
に格納されている文字列で置換し,配列
after
に格納するプログラムexchange
であ る。また,各配列の添字は0から始まり,処理に十分な大きさを持っているものとする。
置換の例 置換前
0 1 2 3 4 5 6 7
配列
text A A B C C D E E len_t = 8
0 1 2
配列
s_text A B C len_s = 3
0 1 2 3
配列
c_text Z Z Z Z len_c = 4
置換後
0 1 2 3 4 5 6 7 8
配列after A Z Z Z Z C D E E
[擬似言語の記述形式の説明]
記述形式 説明
○ 手続き,変数などの名前,型などを宣言する
・変数
← 式
変数に式の値を代入する{文}
注釈を記述する▲ 条件式
・処理1
・処理2
▼
選択処理を示す。
条件式が真の時は処理1を実行し,
偽の時は処理2を実行する。
■ 条件式
・処理
■
前判定繰り返し処理を示す。
条件式が真の間,処理を実行する。
[プログラム]
〇プログラム名:
exchange
〇文字型配列:
text, s_text, c_text, after
〇整数型:
len_t, len_s, len_c, k, m, p, flg
・
m
←0
・
p
←0
■ (1)
・
flg
←0
{文字列が含まれているかを探索処理}・
k
←0
■
k < len_s and flg = 0
▲
text[m+k] = s_text[k]
・ (2)
・ flg
←1
▼
■
▲ (3) {文字列が含まれていなかった場合}
・
after[p] ← text[m]
・
m
←m + 1
・
p
←p + 1
・
k
←0
{文字列が含まれていた場合}■
k < len_c
・
after[p]
←c_text[k]
・
k
←k + 1
・
p
←p + 1
■
・
(4)
▼
■
■
m < len_t
{残っている文字を転送}・ (5)
・
m
←m + 1
・
p
←p + 1
■
(1) の解答群
ア.
m < len_t
-len_s
イ.m < len_t
+len_s
ウ.m <= len_t
-len_s
エ.m <= len_t
+len_s
(2), (4)の解答群
ア.
k
←k
+1
イ.k
←k
+len_s
ウ.m
←m
+1
エ.m
←m
+len_s
オ.p
←p
+1
カ.p
←p
+len_s
(3) の解答群
ア.
flg = 0
イ.flg = 1
ウ.
k > len_s
エ.k > len_t
(5)
の解答群ア.
after[m]
←c_text[p]
イ.after[m]
←text[p]
ウ.
after[p]
←c_text[m]
エ.after[p]
←text[m]
< 選 択 問 題 >
選択問題は問題から1つ選択し解答せよ。
選択した問題は必ず,解答用紙「選択欄」にマークすること。
※選択欄にマークがなく,解答のみの場合は採点を行いません。
各構成は以下のとおり。
選択問題
・C言語の問題
21
ページ~26
ページ・表計算の問題
28
ページ~33
ページ・アセンブラの問題
34
ページ~36
ページ選択問題 C言語の問題
次のC言語プログラムの説明を読み,各設問に答えよ。
[プログラムの説明]
日本 語 の符 号化 方 式と して 存 在す るJISコ ー ドとShift-JISコー ド の変 換 を行 う プ ロ グ ラ ム で あ る 。
Jis_to_SJis
はJIS
コ ー ド か らShift-JIS
コ ー ド へ 変 換 し ,SJis_to_Jisは Shift-JIS
コ ー ド か らJISコ ー ド へ 変 換 す る 。 JISコ ー ド と Shift-JIS
コードでは,1バイト文字(以下,半角文字)と2バイト文字(以下,全角文字)を 混在させて使用するための工夫がなされている。[JISコードについて]
日本語が使われる電子メールでは広く使われる符号化方式の一種である。全角文字 列の前にエスケープ文字(
0x1B,以下 ESC)に続けて「$B」を置き,全角文字列の後
にESCに続けて「(B」を置く例)「ABC分析」という文字をJISコードで表す場合(ABCは半角文字)
文字
A B C ESC $ B
分 析ESC ( B
コード41 42 43 1B 24 42 4A 2C 40 4F 1B 28 42
※ コードは16進数で表示してある。網掛け部分はエスケープシーケンスである。
[Shift-JISコードについて]
パソコン用の日本語オペレーティングシステムの符号化方式として用いられてお り,半角文字のコードとして使用する領域で未定義になっている部分(
0x81~0x9Fと 0xE0~0xEF)を使って全角文字を表現することで,エスケープシーケンスを使わずに
半角文字と全角文字の混在を可能にする。例)「ABC分析」という文字をShift-JISコードで表す場合(ABCは半角文字)
文字
A B C
分 析 コード 41 42 43 95 AA 90 CD※ コードは16進数で表示してある。
[JISコードの全角文字を
Shift-JISコードへ変換する手順]
エスケープシーケンスで全角文字を判断する。
① 1バイト目の値が奇数であれば,1バイト目の値に0x01を加えて1ビット右シフ トした結果 に
0x70を加えたものを 新しい1バ イト目の値 とし,2バ イト目の値に 0x1Fを加えたものを新しい2バイト目の値とする。そうでなければ,1バイト目の
値を1ビット右シフトした結果に0x70を加えたものを新しい1バイト目の値とし,
2バイト目の値に0x7Dを加えたものを新しい2バイト目の値とする。
② 新しい1バイト目の値が0xA0以上になった場合は,新しい1バイト目の値に0x40
選択問題 C言語
③ 新しい2バイト目の値が0x7F以上になった場合は,新しい2バイト目の値に0x01 をさらに加える。
図1 「分」をJISコードからShift-JISコードへ変換
[Jis_to_SJis 関数の説明]
引 数:in(JISコードの文字列),out(Shift-JISコードの文字列)
機 能:inに格納されたJISコードの文字列を Shift-JISコードに変換して out に格納する。
戻り値:なし
<設問1> プログラム
Jis_to_SJis
中のに入れるべき適切な字句を解答群 から選べ。
[プログラムJis_to_SJis]
#define ESC_CODE 0x1B
#define ZENKAKU 0x24
void Jis_to_SJis(unsigned char *in, unsigned char *out) { 0000unsigned char w1, w2;
0000int in_p = 0, out_p = 0, zenkaku_flg = 0;
0000while( in[in_p] != '¥0' ) {
00000000/*---
全角文字か半角文字かの判断---*/
00000000if (in[in_p] == ESC_CODE) { 000000000000if (in[in_p+1] == ZENKAKU) { 0000000000000000zenkaku_flg = 1;
000000000000} else {
0000000000000000zenkaku_flg = 0;
0100 1010 (0x4A)
0010 0101 (0x25)
1001 0101 (0x95)
0x4A2C(1
バイト目は偶数)1ビット右シフト
0x70を加算
0010 1100 (0x2C)
1010 1001 (0xA9)
1010 1010 (0xAA)
0x7Dを加算0x7F以上なので0x01を加算 2バイト目
1バイト目
0x954A
000000000000}
000000000000 (1) ; /*---
エスケープシーケンス分ずらす---*/
00000000}
00000000if (zenkaku_flg == 0) { /*--- 半角文字の場合 ---*/
000000000000out[out_p] = in[in_p];
000000000000in_p++;
000000000000out_p++;
00000000} else { /*--- 全角文字の場合 ---*/
000000000000w1 = in[in_p];
000000000000w2 = in[in_p+1];
000000000000if ( (w1 & 0x01) == 0x01) { 0000000000000000 (2)
000000000000} else {
0000000000000000(3) 000000000000}
000000000000if (w1 >= 0xa0) { 0000000000000000w1 += 0x40;
000000000000}
000000000000if (w2 >= 0x7F) { 0000000000000000w2 += 0x01;
000000000000}
000000000000out[out_p] = w1;
000000000000out[out_p + 1] = w2;
000000000000 (4) ; 000000000000out_p += 2;
00000000}
0000}
0000out[out_p] = '¥0';
}
(1)
,(4) の解答群ア.
in_p++
イ.in_p += 2
ウ.
in_p += 3
エ.in_p += 4
(2) ,(3) の解答群
ア.
w1 = (w1 >> 1) + 0x70;
イ.w1 = ((w1 + 0x01) >> 1) + 0x70;
w2 += 0x7D;
w2 += 0x7D;
ウ.
w1 = (w1 >> 1) + 0x70;
エ.w1 = ((w1 + 0x01) >> 1) + 0x70;
w2 += 0x1F;
w2 += 0x1F;
[Shift-JISコードの全角文字をJISコードへ変換する手順]
全角文字かどうかは,1バイト目の値が0x81以上0x9F以下,または,0xE0以上
0xEF
以下であるかにより判断する。全角文字列と 判断した場合には前と後にエスケープ シーケンスを挿入する。① 1バイト目の値が0xE0以上であれば,0x40を引いて新しい1バイト目の値とする。
② 2バイト目の値が0x80以上であれば,0x01を引いて新しい2バイト目の値とする。
③ 2バイト目の値が0x9E以上であれば,1バイト目の値から0x70を引いた結果を1 ビット左シフトした値を新しい1バイト目の値,2バイト目の値から0x7Dを引いた 値を新しい2バイト目の値にする。そうでなければ,1バイト目の値から0x70を引 いた結果を1ビット左シフトして0x01を引いた値を新しい1バイト目の値,2バイ ト目の値から0x1Fを引いた値を新しい2バイト目の値とする。
図2 「分」をShift-JISコードからJISコードへ変換
[SJis_to_Jis 関数の説明]
引 数:in(Shift-JISコードの文字列),out(JISコードの文字列)
機 能:inに格納されたShift-JISコードの文字列をJISコードに変換してout に格納する。
戻り値:なし
[Esc_Set 関数の説明]
引 数:buff(出力領域),p(出力領域の添え字),ch(符号文字)
機 能:
buff[p]から buff[p+2]にエスケープシーケンスを格納する。 buff[p]に 0x1B,
buff [p+1]に ch,buff[p+2]に 0x42
が入る。戻り値:次に出力する値を格納する位置。
<設問2> プログラム
SJis_to_Jis
中のに入れるべき適切な字句を解答群 から選べ。なお,
(4)
は設問1と同じ内容が入る。1001 0101 (0x95)
0x95AA(1
バイト目は0xE0
未満,2バイト目は0x80
以上)2バイト目 1バイト目
1010 1010 (0xAA)
0x70を引く0010 0101 (0x25)
1ビット左シフト0100 1010 (0x4A)
0x01を引く
1010 1001 (0xA9)
0x7Dを引く
0010 1100 (0x2C)
0x4A2C
[プログラムSJis_to_Jis]
#define ESC_CODE 0x1B
#define ZENKAKU 0x24
#define HANKAKU 0x28
#define CHAR_FLAG 0x42
void SJis_to_Jis(unsigned char *in, unsigned char *out) { 0000unsigned char w1, w2;
0000int in_p = 0, out_p = 0, zenkaku_flg = 0;
0000while( in[in_p] != '¥0') {
00000000if ( in[in_p] >=0x81 && in[in_p] <= 0x9F ||
0000000000000in[in_p] >= 0xE0 && in[in_p] <= 0xEF) { /*
全角*/
000000000000w1 = in[in_p];
000000000000w2 = in[in_p+1];
000000000000if (w1 >= 0xE0) { 0000000000000000w1 -= 0x40;
000000000000}
000000000000if (w2 >= 0x80) { 0000000000000000w2 -= 0x01;
000000000000}
000000000000if (w2 >= 0x9E) { 0000000000000000 (5)
000000000000} else { 0000000000000000 (6) 000000000000}
000000000000if (zenkaku_flg == 0) {
0000000000000000out_p = Esc_Set(out, out_p, ZENKAKU);
0000000000000000zenkaku_flg = 1;
000000000000}
000000000000out[out_p] = w1;
000000000000out[out_p + 1] = w2;
000000000000 (4) ; 000000000000out_p += 2;
00000000} else { /* 半角
*/000000000000if (zenkaku_flg == 1) {
0000000000000000out_p = Esc_Set(out, out_p, HANKAKU);
0000000000000000zenkaku_flg = 0;
000000000000}
000000000000out[out_p] = in[in_p];
000000000000in_p++;
000000000000out_p++;
00000000}
0000if ( (7)
) {00000000out_p = Esc_Set(out, out_p, HANKAKU);
0000}
0000out[out_p] = '¥0';
}
/*
エスケープシーケンスを格納する関数 */int Esc_Set(unsigned char *buff, int p, unsigned char ch) { 0000buff[p] = ESC_CODE;
0000buff[p+1] = ch;
0000buff[p+2] = CHAR_FLAG;
0000return (8) ; }
(5)
,(6) の解答群ア.
w1 = (w1 - 0x70) << 1;
イ.w1 = ((w1 - 0x70) << 1) - 1;
w2 -= 0x1F;
w2 -= 0x1F;
ウ.
w1 = (w1 - 0x70) << 1;
エ.w1 = ((w1 - 0x70) << 1) - 1;
w2 -= 0x7D;
w2 -= 0x7D;
(7)
の解答群ア.
in[in_p] == '¥0'
イ.out_p > in_p
ウ.zenkaku_flg == 0
エ.zenkaku_flg == 1
(8)
の解答群ア.
p + 1
イ.p + 2
ウ.
p + 3
エ.p + 4
問題を読みやすくするために,
このページは空白にしてあります。
選択問題 表計算の問題
この問題で使用する表計算ソフトの仕様は下記のとおりである。
COUNT
関数範囲内のセル中に数値が入力されているセルの個数を返す。
書式:COUNT(範囲)
COUNTIF 関数
範囲内のセルの中で条件に一致するセルの数を返す。
書式:COUNTIF(範囲,条件)
IF
関数条件が真のときに真の場合,偽のときに偽の場合の計算結果や値を返す。
書式:IF(条件,真の場合,偽の場合)
RANK 関数
範囲内の数値を並べたときに何番目になるか(順位)を返す。順序は,降順の場
合は
0,昇順の場合は1 を設定する。なお,範囲内の検査値に同じものがあれば
同じ順位を返し,以降の順位に欠番が生じる。
書式:RANK(検査値,範囲,順序
)
SUMIF
関数指定した検索範囲の中で,条件に一致するセルの合計範囲に対応するセルの値の合 計値を返す。
書式:SUMIF(検索範囲,条件,合計範囲)
VLOOKUP
関数検索値を左端に含む行を範囲の中から検索し,指定した列位置の値を返す。検索の 型に
0
を指定すると検索値と完全に一致する値を検索し,1 を指定すると検索値と 一致する値がない場合に,検索値未満で一番大きい値を検索する。書式:VLOOKUP(検索値,範囲,列位置,検索の型)
式
=に続いて計算式や関数などを入力する。
セル番地の絶対参照
セル番地に$を付けることで,絶対番地(絶対参照)を表す。
別シートの参照
ワークシート名に「!」を付けてセル位置を指定することにより別シートを参照で きる。
例:シート名「集計」のセル
A1
を参照する場合は,「集計!A1」と記述する。J社では,会社が推奨する資格の取得を社員に勧めている。その支援として,資格 に対する講習会を実施している。
昨年,資格の改訂があり,内容が一新されるのを機会に,資格取得をポイント制に するとともに,資格取得状況に関する情報を表計算ソフトでまとめることにした。な お,キャリアが
15
年以上の社員は10
ポイント,キャリアが10
年以上の社員は8ポ イント,キャリアが5年以上の社員は5ポイントを目指して資格取得を推奨し,評価 として利用している。5年未満の場合は,評価はしない。ポイント付与処理を行う期間は,毎年
10
月の第1週に1度のみ行う。現在の資格取得状況は図1のようになっている。「資格取得一覧」ワークシートは,
2行目からA列に社員番号,B列に資格名,
C列に資格取得日(試験実施日)が38行まで
入力されている。A B C
1 社員番号 資格名 資格取得日
2 13589 技能2 2015/12/6
3 16372 技能2 2015/12/6
4 17794 情報3 2015/12/6
5 23443 情報2 2015/12/6
6 32098 技能2 2015/12/6
7 41141 技能3 2015/12/6
8 42407 情報3 2015/12/6
9 46953 技能3 2015/12/6
10… 56097… 情報3… 2015/12/6…
36 56201 技能3 2016/8/14
37 59218 技能3 2016/8/14
38 64422 技能3 2016/8/14
図1 「資格取得一覧」ワークシート
次に,社員情報の一部を「社員表」ワークシートに示す。2行目からA列に社員番
号,
B列に氏名,C列に部署コード, D列に性別,E列にキャリアが26行まで入力されて
いる。
選択問題 表計算
A B C D E 1 社員番号 氏名 部署コード 性別 キャリア
2 13589 小田 広之 2004 男 25
3 16372 本山 獅童 2001 男 26
4 17794 藤井 まひる 2001 女 15
5 18575 岩瀬 美月 2003 女 15
6 21594 吉野 獅童 2002 男 12
7 23113 三田 れいな 2002 女 21
8 23443 久保田 慢太郎 2001 男 8
9 26968 森脇 雅彦 2005 男 9
10… 29967… 布施 早紀… 2002… 女… 1…
24 59218 菅野 圭 2004 男 6
25 59305 藤村 朝陽 2002 女 16
26 64422 相原 さやか 2001 女 3
図2 「社員表」ワークシート
なお,全てのワークシートの中でパーセント表示しているセルは,表示形式を小数 点以下第1位までのパーセント表示にしている。
<設問1> 次の「資格取得一覧」ワークシートの拡張に関する記述中の
(1)
に 入れるべき適切な字句を解答群から選べ。「資格取得一覧」ワークシートに,取得ポイント,資格ごとの取得人数と取得割合 を追加する。
A B C D E F G H
1 社員番号 資格名 資格取得日 取得ポイント 資格名 取得人数 取得割合
2 13589 技能2 2015/12/6 8 情報1 1 4%
3 16372 技能2 2015/12/6 8 情報2 9 36%
4 17794 情報3 2015/12/6 4 情報3 10 40%
5 23443 情報2 2015/12/6 7 技能1 3 12%
6 32098 技能2 2015/12/6 8 技能2 5 20%
7 41141 技能3 2015/12/6 5 技能3 9 36%
8 42407 情報3 2015/12/6 4
9 46953 技能3 2015/12/6 5
10… 56097… 情報3… 2015/12/6… 4…
36 56201 技能3 2016/8/14 5
37 59218 技能3 2016/8/14 5
38 64422 技能3 2016/8/14 5
図3 拡張した「資格取得一覧」ワークシート
取得ポイントは,「資格ポイント表」ワークシートを検索して表示する。
A B
1 資格名 ポイント
2 情報1 10
3 情報2 7
4 情報3 4
5 技能1 10
6 技能2 8
7 技能3 5
図4 「資格ポイント表」ワークシート
取得したポイントを表示するため,セル
D2
に次の式を入力し,セルD3~D38
まで 複写した。= (1)
次に,資格取得一覧に入力された資格名から,資格ごとの取得人数を集計するため,
セル
G2
に次の式を入力し,セルG3~G7
まで複写した。= (2)
さらに,社員数における取得割合を求めるため,セル
H2
に次の式を入力し,セルH3~H7
まで複写した。= (3)
(1)
の解答群ア.VLOOKUP(B2,資格ポイント表!A2:B7, 2, 0) イ.VLOOKUP(B2,資格ポイント表!A$2:B$7, 2, 0) ウ.VLOOKUP(B$2,資格ポイント表
!A$2:B$7, 2, 1)
エ.VLOOKUP($B$2,資格ポイント表!$A$2:$B$7, 2, 1)(2)
の解答群ア.COUNTIF(B2:B38, F2) イ.
COUNTIF($B2:$B38, F2)
ウ.COUNTIF(B$2:B$38, F2) エ.COUNTIF($B2:B$38, F2)
(3)
の解答群ア.G2/COUNT(社員表!$A2:A$26) イ.G2/COUNT(社員表!A$2:A$26) ウ.G2/COUNTIF(社員表!$A2:$A26, F2) エ.G2/COUNTIF(社員表!A$2:A$26, F2)
<設問2> 次の「社員表」ワークシートへの取得ポイントと順位,評価の追加に関す る記述中の
に入れるべき適切な字句を解答群から選べ。
A B C D E F G H
1 社員番号 氏名 部署コード 性別 キャリア 取得ポイント 順位 評価
2 13589 小田 広之 2004 男 25 22 2 ○
3 16372 本山 獅童 2001 男 26 8 14 ×
4 17794 藤井 まひる 2001 女 15 16 4 ○
5 18575 岩瀬 美月 2003 女 15 11 8 ○
6 21594 吉野 獅童 2002 男 12 4 20 ×
7 23113 三田 れいな 2002 女 21 7 15 ×
8 23443 久保田 慢太郎 2001 男 8 7 15 ○
9 26968 森脇 雅彦 2005 男 9 10 11 ○
10… 29967… 布施 早紀… 2002… 女… 1… 7… 15… …
24 59218 菅野 圭 2004 男 6 12 7 ○
25 59305 藤村 朝陽 2002 女 16 0 22 ×
26 64422 相原 さやか 2001 女 3 9 12
図5 取得ポイントなどを追加した「社員表」ワークシート
資格取得一覧から,取得したポイントを集計し社員表に追加するため,セル
F2
に 次の式を入力し,セルF3~F26
まで複写した。= (4)
次に,取得ポイントの多い順の順位を追加するため,セル
G2
に次の式を入力し,セル
G3~G26
まで複写した。= (5)
さらに,キャリアと取得ポイントから評価を求めるため,セル
H2
に次の式を入力し,セル
H3~H26
まで複写した。評価は,推奨通りに資格が取得できた場合は“○”,そうでない場合は“×”,該当しない場合は空白とする。
= IF( (6)
,IF(F2>=10,"○","×"),IF( (7)
,IF(F2>=8,"○","×"),IF( (8)
,IF(F2>=5,"○","×"),"")))(4)
の解答群ア.SUMIF(資格取得一覧!A2:A38, A2, 資格取得一覧!D2:D38) イ.SUMIF(資格取得一覧!A$2:A$38, A2, 資格取得一覧!D$2:D$38) ウ.SUMIF(資格取得一覧!A$2:A$38, A$2, 資格取得一覧!D2:D38) エ.SUMIF(資格取得一覧!A$2:A$38, A$2, 資格取得一覧!D$2:D$38)
(5)
の解答群ア.RANK(F2, F2:F26, 0) イ.
RANK(F2, F$2:F$26, 0)
ウ.RANK(F2, F2:F26, 1) エ.RANK(F2, F$2:F$26, 1)
(6)
~ (8) の解答群ア.E2<5 イ.
E2<=5
ウ.E2>=5
エ.E2<10 オ.E2<=10 カ.E2>=10
キ.E2>15
ク.E2>=15選択問題 アセンブラの問題
次のアセンブラ言語CASLⅡプログラムの説明を読み,各設問に答えよ。
[プログラムの説明]
DAT
番地から始まる連続したN
語の領域に格納されたデータに対して,垂直方向に パリティチェックを行い,結果をPARITY
番地に求める副プログラムVPARI
である。VPARI
は,図1のような形式でパラメタが格納された先頭番地をGR1
に設定して呼び出される。
アドレス
(GR1) + 0 DAT
番地から始まる連続した領域の語数(N)+ 1 DAT
番地のアドレス+ 2 PARITY
番地のアドレス図1 パラメタの構造
[パリティチェックの説明]
パリティチェックとは,対象データに含まれる
1
のビットの個数を数えて,偶数個 または奇数個になるように,結果となるパリティビットで調整するビット誤り検出方 式である。このプログラムでは,図2に示すように偶数パリティ方式を採用する。反転部分が
1
回分の対象データとパリティビットであり,他の15
ビットに対しても同様に行う。アドレス