大学2年の息子が基本情報技術者試験を受けるということで試験対策と解答のコツを伝授することにしました。過去問を中心に初心者にもわかりやすく解説します。

H20秋午後の解答と解説

通信ネットワークに関する次の記述を読んで,設問1,2に答えよ。

 A社は,本社及び三つの支店から成り,合計4か所の拠点を結ぶ通信ネットワークを構築している。 支店同士は直接通信できず,本社に設置されたルータを経由して通信する。 ネットワーク構成を図1に,支店間の通信経路を図2に示す。

h20au01p-1.JPG

 A社は、通信ネットワーク上に IP 電話による内線網を構築し,拠点間の通話を行っている。 ピーク時における各拠点間の同時通話数は,表のとおりである。

h20au01p-2.JPG


なお,1通話が使用するビット速度(帯域幅)は,データ圧縮をするので送話,受話ともに 20k ビット/秒であり,通話接続の制御に伴う通信量は無視できるものとする。

設問1  次の記述中の( ) に入れる正しい答えを,解答群の中から選べ。

 支店 X,Y 間の通話には,支店 X から支店 Y に向かう音声と,支店 Y から支店 X に向かう音声による通信が発生する。支店間の通信は本社に設置されたルータを必ず経由するので,これらの通信は本社のアクセスポイントとルー夕との間 w を往復する。したがって,支店 X,Y 間の通話について,w のトラフィックは,支店 X とアクセスポイントとの間 x の(a) 倍である。

 IP 電話のピーク時のトラフィックは,W では,上り下りとも 2,400k ビット/秒であり,X では,上り下りとも(b) k ビット/秒である。ただし,拠点からアクセスポイントに向かう通信を上り,アクセスポイントから拠点に向かう通信を下りとする。

a に関する解答群
ア 1/4     イ 1/2     ウ 2     エ 4


b に関する解答群
ア 400     イ 800     ウ 1,200     エ 2,400

設問2  A社は支店間の通信形態を見直して,本社のルータを経由せずに,支店同士が直接通信できるようにする。次の記述中の( ) に入れる正しい答えを,解答群の中から選べ。

 通信形態の見直しによって,想定されるピーク時の IP 電話によるトラフィックは,本社のアクセスポイントとルータとの間 w では,上り下りとも(c) k ビット/秒となる。各支店とアクセスポイントとの間( x,y,z )のトラフィックは,見直し前と比べて(d) である。

c に関する解答群
ア 400      イ 1,200      ウ 1,800      エ 2,400

d に関する解答群
ア 1/4 倍     イ 1/2 倍     ウ 同じ     エ 2倍     オ 4倍

次のプログラムの説明及びプログラムを読んで,設問に答えよ。

〔プログラムの説明〕

 文字型の1次元配列 Str に格納されている文字列を,整形して出力する副プログラム PrintOut である。

(1) 文字列は,英数字,記号及び改行文字で構成される。

(2) 文字列は,文字型の1次元配列の各要素に1文字ずつ格納され,文字列の最後の 要素の次の要素には,システム定数 EOS が格納されている。

(3) PrintOut の仕様は,次のとおりである。出力結果の例を図に,引数の仕様を表1に示す。

① 指定した文字数(引数 Margin )だけ,左側に余白を設ける。

② 指定した1行の最大文字数(引数 MaxC)で改行する。

③ 指定した1ぺージの最大行数(引数 MaxL)で改ページする。 

h20au02p-1.JPG

(4) PrintOut は,次の副プログラム及びシステム関数を用いる。各副プログラム及び システム関数の引数の仕様を表2~4に示す。

① 副プログラム GetPosition :文字列の指定した位置から行末となる文字位置を探索し, その位置を引数 EndP に返す。行末の条件は,EOS が見つかったとき, 改行文字が見つかったとき,又は MaxC+1 文字に達したときのいずれかである。

② 副プログラム PutLine:指定された文字列を出力し,最後に改行を行う。

③ システム関数 PutChr:指定された1文字を出力する。PutChr(NL) で印字位置は 次の行の左端に移動し,PutChr(FF) で印字位置は次ページの左上端に移動する。 ここで,NL は改行文字を,FF は改ページ文字を表すシステム定数である。

(5) 配列の添字は0から始まる。

h20au02p-2.JPG
〔プログラム〕

h20au02p-3.JPG

設問  プログラム中の( ) に入れる正しい答えを,解答群の中から選べ。

a に関する解答群

ア CurrentP: 0, CurrentP < MaxC, 1
イ CurrentP: 0, StartP < EndP, 1
ウ CurrentP: Margin, CurrentP < MaxC, 1
エ CurrentP: Margin, StartP < EndP, 1

b に関する解答群

ア Str[StartP〕= EOS    イ Str[StartP] = NL
ウ Str[StartP] ≠ EOS    エ Str[StartP] ≠ NL

c に関する解答群

ア EndP < (StartP + MaxC)   イ EndP < MaxC
ウ StartP < (EndP + MaxC)    エ StartP < MaxC

d に関する解答群

ア CurrentP: 0, Line[CurrentP] = EOS , 1
イ CurrentP: 0, Line[CurrentP] = NL, 1
ウ CurrentP: 0, Line[CurrentP] ≠ EOS , 1
エ CurrentP: 0, Line[CurrentP] ≠ NL, 1
 関係データベースに関する次の記述を読んで,設問1,2に答えよ。

 B社では,社員に関連する関係データベースを構築し,各部署からの問合せに対応している。 B社の関係データベースの構造の一部を図に示す。

社員表(社員コード,氏名,入社年月日,部署コード,役職コード,退職年月日,生年月日,     住所,電話番) 部署表(部署コード,部署名) 役職表(役職コード,役職名) 研修実施表(年度研修コード,研修名,研修開始年月日,研修終了年月日,研修日数) 受講表(年度研修コード社員コード,受講日数)

注 下線はキー項目を表す。

図 B社の関係データベースの構造(一部)

〔各表の概要〕

(1) 社員表は,社員(退職者を含む)の情報を管理する。在職中の社員の退職年月日 は NULL とする。

(2) 部署表は,B社の部署名を管理する。

(3) 役職表は,B社の役職名を管理する。

(4) 研修実施表は,年度ごとにB社が実施した研修名と研修期間を管理する。

(5) 受講表は,各社員が受講した研修とその日数(受講日数)を管理する。社員は, 本人が必要と思う研修だけに申し込み,受講する。受講予定の社員が受講しなかった場合, その研修の受講日数の値は0となる。

(6) B社で規定する年度は,その年の4月1日から翌年の3月 31 日までである。 2007 年度は,2007 年4月1日から 2008 年3月 31 日までとなる。

設問1  入社2年目の社員が,入社以来1日でも受講した研修にどのようなものがあるかを知りたい。

 次の SQL 文中の( ) に入れる正しい答えを,解答群の中から三つ選べ。ここで,入社2年目の社員とは,入社した年度が 2007 年度で,かつ在職中の社員とする。

SELECT DISTINCT 研修名 FROM 受講表, 研修実施表, 社員表
   WHERE 受講表.社員コード = 社員表.社員コード AND
      ( )AND
      ( )AND
      ( )AND
      退職年月日 IS NULL AND
      入社年月日 BETWEEN '2007-04-01' AND '2008-03-31'

解答群

ア 研修実施表.研修コード = 受講表.研修コード
イ 研修実施表.年度 = '2007'
ウ 研修実施表.年度 = 受講表.年度
エ 研修日数 > 0
オ 受話回数 > 0
カ 受講表.年度 = '2007'

設問2  B社では,研修を受講した社員に対して,本人の受講実績だけが照会できる SQL 文が提供されている。しかし,役職名の中に"部長"という文字列がある社員("部長","副部長","部長代理"など)は,自分の受講実績だけでなく,同じ所属部署にいるすべての社員の受講実績を照会できるようにしたい。この照会ができる社員を選択する SQL 文の説明として( ) に入れる正しい答えを,解答群の中から選べ。

 役職表の役職名に"部長"という文字列を含むすべての役職は(a) として検索する。同じ所属部署の社員を抽出するには,次のとおりにする。

 受講表には(b) という項目があるが,これだけではその社員が同じ所属部署であるかどうか分からない。同じ所属部署であるかどうかを知るためには(c) という項目が必要になる。したがって,受講表の項目(b) を用いて(d) を結合し,(c) の値を取り出せばよい。

a に関する解答群

ア SELECT 役職コード FROM 役職表 WHERE 役職名 = '部長'
イ SELECT 役職コード FROM 役職表
    WHERE 役職名 = '部長' OR 役職名 = '副部長' OR 役職名 = '部長代理'
ウ SELECT 役職コード FROM 役職表
    WHERE 役職名 IN ('部長', '副部長', '部長代理')
エ SELECT 役職コード FROM 役職表 WHERE 役職名 LIKE '%部長%'
オ SELECT 役職コード FROM 役職表 WHERE 役職名 LIKE '部長%'

b~d に関する解答群

ア 研修コード       イ 研修実施表
ウ 社員コード       エ 社員表
オ 部署コード       力 部署表
キ 役職コード       ク 役職表
次のアルゴリズムの説明を読んで,設問1,2に答えよ。

〔アルゴリズムの説明〕

 N 個( N >1)の地点から構成されるグラフにおいて,出発地点からそれ以外の地点までの 最短距離を求めるアルゴリズム ShortestLength である。

(1) 図1に示す地点数 N=6 のグラフを例として,ShortestLength を説明する。 図1において,丸は地点を,矢印の向きは進行方向を,矢印に付けた数字は地点間の距離を表す。

h20au04p-1.JPG

(2) ShortestLength では,次の配列を用いる。要素番号は 1,2,...,N で, 地点と対応している。配列の添字は1から始まる。

Dt[i][j]:地点 i から地点 j までの距離が格納されている N×N 個の要素からなる配列。 地点 i から地点 j までの直接の経路がない場合,進行方向が逆向きの場合及び Dt[i][i] の場合には ∞(最大値を表す定数)が格納されている。図1の例では,Dt[i][j] の一部は次のとおりである。

Dt[1][1]=∞, Dt[1][2]=10,
Dt[1][3]=∞, Dt[2][1]=∞

Sd[i]:出発地である地点1から地点 i までの仮の最短距離(以下,仮最短距離 という)を 格納する配列。初期設定ではすべての要素に∞を格納する。

Pe[i]:最短距離を求める過程で処理済となった地点を識別するための配列。 初期設定ではすべて false に設定する。Pe[i] が true となったとき, Sd[i] には地点1から地点 i までの最短距離が求まっている。すべての 要素が true になると処理は終了する。

(3) 最短距離を求める手を,図1の例を使って示す。

① 出発地は地点1なので,Pe[1] に true を設定し,地点1から直接つながる 地点 2,4,5 までの距離 Dt[1][2], Dt[1][4],Dt[1][5] をそれぞれ Sd[2], Sd[4],Sd[5] に設定する。その結果,Sd[2]=10,Sd[4]=20,Sd[5]=30 となる。 この結果を図2に示す。地点 i の上又は下にある [] 内の数値は, 地点1から地点 i までの仮最短距離 Sd[i] を表し,網掛けの地点は処理済(Pe[i]=true)を表す。

h20au04p-2.JPG

② 未処理の地点のうち,地点1からの仮最短距離が最も短い地点2(2は Pe[k]=false かつ Sd[k] が最小となる添字 k の値)を選択し,Pe[2] を true にする。 この時点で,Sd[2]=10 が地点1から地点2の間の最短距離として確定する。

 次に,地点2から直接行ける地点3と地点5の仮最短距離 Sd[i] を更新する。 ただし,Sd[i] の値が小さくならない場合は置き換えない。

(更新前)  (更新後)
Sd[3]=∞ → Sd[3]=Sd[2]+Dt[2][3]=50
Sd[5]=30 → Sd[5]=Sd[2]+Dt[2][5]=20
 このとき,地点 k( k =2)を経由する地点 i( i =3,5 )の仮最短距離 Sd[i] を 更新するための代入文を擬似言語で書くと,次の〔プログラムの一部〕のとおりになる。 ここで,関数 min は二つの引数のうち,小さい方の値を返すシステム関数である。

〔プログラムの一部〕

・Sd[i] ← min(Sd[i],(a) )

この結果を図3に示す。

h20au04p-3.JPG

③ 未処理の地点のうち,仮最短距離が最も短い地点は,地点4と地点5の二つである。 このように複数ある場合は,要素番号の小さい地点4を選択し,処理済とする。 この時点で,Sd[4] が地点1から地点4の間の最短距離として確定する。

 次に,地点4から直接行ける地点の仮最短距離を更新する。

 Sd[4]+Dt[4][5]=40 となり,現在の Sd[5] の値より大きいので,更新しない。

この結果を図4に示す。 

h20au04p-4.JPG

④ 未処理の地点のうち,仮最短距離が最も短い地点5を選択し,処理済とする。

 この時点で,Sd[5] が地点1から地点5の間の最短距離として確定する。

 次に,地点5から直接行ける地点の仮最短距離を更新する。

Sd[3]=50 → Sd[3]=Sd[5]+Dt[5][3]=30
Sd[6]=∞ → Sd[6]=Sd[5]+Dt[5][6]=50

この結果を図5に示す。

h20au04p-5.JPG

⑤ 未処理の地点のうち,仮最短距離が最も短い地点3を選択し,処理済とする。

 この時点で,Sd[3] が地点1から地点3の間の最短距離として確定する。

 次に,地点3から直接行ける地点6の仮最短距離を更新する。

 手順③と同様に計算し,地点6の仮最短距離 Sd[6] の値は(b) となる。

 この結果を図6に示す。


h20au04p-6.JPG

⑥ 未処理の地点のうち,仮最短距離が最も短い地点6を選択し,処理済とする。

 この時点で,Sd[6] が地点1から地点6の間の最短距離として確定する。

 すべての地点が処理済となったので終了となる。この結果を図7に示す。
h20au04p-7.JPG

設問1  アルゴリズム ShortestLength の説明中の( ) に入れる正しい答えを,解答群の中から選べ。

a に関する解答群

ア Sd[i]+Dt[i][k]      イ Sd[i]+Dt[k][i]
ウ Sd[k]+Dt[i][k]      エ Sd[k]+Dt[k][i]

b に関する解答群

ア 30      イ 40      ウ 50      エ 60

設問2  次の記述中の に入れる正しい答えを,解答群の中から選べ。

 図8のグラフの場合,出発地を地点1としてアルゴリズム ShortestLength を実行したとき,最短距離が確定する順番は,次のとおりになる。

地点1,(c),地点6

 また,配列 Sd の要素 Sd[3],Sd[5] 及び Sd[6] の値は,それぞれ(d) ,(e) 及び(f) となる。

h20au04p-8.JPG
c に関する解答群

ア 地点2,地点4,地点3,地点5
イ 地点2,地点4,地点5,地点3
ウ 地点4,地点2,地点3,地点5
エ 地点4,地点2,地点5,地点3

d~f に関する解答群

ア 30     イ 40     ウ 50     エ 60
オ 70     カ 80     キ 190     ク 100
プログラム設計に関する次の記述を読んで,設問1~3に答えよ。

 C社では,ディジタル化した楽曲を会員がダウンロードできる楽曲ダウンロードシステム(以下, システムという)を提供している。

〔システムの概要〕

(1) 楽曲の情報は,楽曲番号をキーとして楽曲管理ファイルに記録される。楽曲番号は, それぞれの楽曲データに割り当てられる一意な番号である。楽曲管理ファイルのレコード様式を図1に示す。

楽曲番号  曲名  演奏者名  演奏時間   制作会社  ジャンル  楽曲データの
  大きさ 
 楽曲データの
  格納場所

下線はキー項目を表す。

図1 楽曲管理ファイルのレコード様式

(2) 会員の情報は,それぞれの会員に一意になるように割り当てた会員番号をキーとして, 会員ファイルに記録される。会員ファイルには,会員番号とともに,暗号化したパスワード, 氏名,入会日が記録される。会員ファイルのレコード様式を図2に示す。

会員番号  暗号化したパスワード  氏名  入会日

注 下線はキー項目を表す。

      図2 会員ファイルのレコード様式

(3) 会員は,システムにログインするために会員番号とパスワードを入力する。

(4) システムは,(3) で入力された会員番号をキーとして会員ファイルを検索し, 会員番号が一致したレコードの暗号化したパスワードを取り出す。暗号化したパスワードと, 入力されたパスワードを暗号化した結果が一致した場合は,ログインを許可し, 楽曲検索を表示する。一致しない場合は,ログイン不許可のメッセージを表示して終了する。

(5) 楽曲検索画面には,曲名からジャンルまでの楽曲管理ファイルの項目(以下,検索項目という)が 表示される。ログインした会員は,楽曲の検索条件として,一つ以上の検索項目に対する 検索内容を入力する。複数の検索条件が指定されたときは,入力されたすべての 条件を AND で接続した条件による検索が行われる。検索が不要の場合は,ログアウトを選択する。

(6) システムは,(5) で入力された検索内容を基に,楽曲管理ファイルを検索する。 条件に一致したすべてのレコードを抽出し,楽曲番号,曲名,演奏者名を楽曲選択画面に表示する。 条件に一致するレコードがない場合は,楽曲検索画面にその旨のメッセージを表示する。

(7) (6) で表示された楽曲選択画面で会員が曲名を一つ選択すると,その楽曲のダウンロードが すぐに始まる。再検索を選択すると,楽曲検索画面に戻る。

(8) ダウンロードが完了したらダウンロードした日時をダウンロード実績ファイルに格納し, ダウンロード完了のメッセージを表示して (5) に戻る。ダウンロード実績ファイルのレコード様式を図3に示す。

 会員番号  ダウンロード日付  ダウンロード時刻  楽曲番号

注 下線はキー項目を表す。

      図3 ダウンロード実績ファイルのレコード様式

(9) システムの画面遷移を図4に,モジュール構造を図5に示す。

h20au05p-1.JPG

設問1 会員が1日にダウンロードできる楽曲の件数を,システムで定めた許可件数以下に制限する機能を追加する。次に示すログインした会員の当日のダウンロード件数を求める手順に関する記述中の に入れる正しい答えを,解答群の中から選べ。

 現在日付をシステムから取り出す。次にログインした会員の と現在日付の二つをキーとしてダウンロード実績ファイルを検索し,レコードの件数を数える。ログイン後ダウンロード実行前までに日付が変わった場合,新しい日付でダウンロード件数を求める必要がある。したがって,このダウンロード件数を求めるモジュールは, モジュールの直前に実行する必要がある。

a に関する解答群

ア 会員番号        イ 楽曲データの大きさ      ウ 楽曲番号
エ ダウンロード日付    オ 入会日            カ パスワード

b に関する解答群

ア 会員ファイルの検索      イ 楽曲管理ファイルの検索
ウ 楽曲検索画面の表示      エ 楽曲選択画面の表示
オ 楽曲のダウンロード

設問2  楽曲選択画面の表示項目として,その会員が既にダウンロードしたことのある楽曲については,最後のダウンロード日付を追加する。次の記述中の( ) に入れる正しい答えを,解答群の中から選べ。

 会員の入力した検索内容で楽曲管理ファイルを検索し,条件に一致するすべてレコードを抽出する。抽出したレコードの楽曲番号が,その会員が既にダウンロード済の楽曲のものであるかどうかは,ダウンロード実績ファイルを(c) で検索すれば判明する。このダウンロード実績ファイルに対する検索では,楽曲管理ファイルから抽出した1件のレコードに対して,その会員のダウンロード実績の件数は(d) である。

c に関する解答群

ア 会員番号
イ 会員番号と楽曲番号
ウ 会員番号と楽曲番号とダウンロード日付
エ 会員番号とダウンロード日付
オ 楽曲番号
力 楽曲番号とダウンロード日付
キ ダウンロード日付

d に関する解答群

ア 0件        イ 0件以上        ウ 0件又は1件
エ 1件        オ 2件以上

設問3  入会直後の会員のダウンロード状況を把握するために,全会員の入会後1週間におけるジャンル別のダウンロード件数表を作成することにした。ジャンル別ダウンロード件数表の例を図6に示す。また,ジャンル別ダウンロード件数表の作成の流れを図7に,各処理の説明を表に示す。表中の( ) に入れる正しい答えを,解答群の中から選べ。

 なお,ジャンル別ダウンロード件数表には,図6のようにジャンル別のダウンロード件数とその楽曲数が表示されるものとする。

h20au05p-2.JPG
h20au05p-3.JPG
      
 表 各処理の説明
 処理    種類             内容 
 処理1  突合せ ファイル X とファイル Y のレコードを,会員番号をキーとして突き合わせる。 キーが一致した場合,ダウンロード日付がその会員の入会後1週間以内のとき, ファイル X とファイル Y のレコードから必要な項目の値を取り出し,それらを出力する。 この処理をすべての会員に対して実施する。
 処理2  整列  処理1の結果を読み込み,楽曲番号をキーとして並べ替えて出力する。
 処理3  集計  処理2の結果を読み込み,同一の楽曲番号のレコードの件数を集計し,楽曲番号と そのレコードの集計件数を中間ファイルに出力する。
 処理4  突合せ  (e) と中間ファイルのレコードを,楽曲番号をキーとして突き合わせる。 キーが一致した場合,読み込んだ(e) と中間ファイルのレコード から必要な項目の値を取り出し,それらを出力する。この処理をすべての楽曲に対して実施する。
 処理5  整列  処理4の結果を読み込み, (f)をキーとして並べ替えて出力する。
 処理6  集計  処理5の結果を読み込み,ジャンルごとにレコードの件数を集計して楽曲数を求める。 処理3で出力した集計件数を集計してダウンロード件数を求める。ジャンルと ダウンロード件数と楽曲数を出力する。
 処理7  作表  処理6の結果を読み込み,ジャンル別ダウンロード件数表を出力する。


e に関する解答群

ア 会員ファイル       イ 楽曲管理ファイル
ウ ダウンロード実績ファイル

f に関する解答群

ア 会員番号        イ 楽曲データの大きさ      ウ 楽曲番号
エ ジャンル        オ ダウンロード件数
金額を表すときのように,整数を3けた区切り形式の文字列に変換する関数 convert である。

(1) 次のルールに基づいて変換を行う。

① 整数値が負の場合,先頭にマイナス符号を付ける。

② 数値の下位から3けたごとにコンマを挿入する。

 変換例を表に示す。

      表 変換例

 整数  3けた区切り形式の文字列 
 1234567  1,234,567  
 -57482  -57,482  
     63  63  
 -999999  -999,999 

(2) プログラム中で定義されている関数の仕様は,次のとおりである。

   void convert(long num, char str[]);

  引数:整数num, 変換後の文字列 str[]

  返却値:なし

  機能:整数 num を3けた区切り形式の文字列に変換して str[] に先頭から格納する。
      str[] には変換後の文字列を格納するのに十分な領域が確保されているものとする。


h20au06p-1.JPG
 
設問  プログラム中の( ) に入れる正しい答えを,解答群の中から選べ。

a に関する解答群

ア %= 10     イ *= -1
ウ *= -10     エ *= 10
オ /= 10

b に関する解答群

ア (i + 1) % 3      イ (i + 2) % 3
ウ (j + 1) % 3      エ (j + 2) % 3
オ i % 3         カ j % 3

c に関する解答群

ア i != j; i++      イ i != j; i++, j--
ウ i < j; i++      エ i < j; i++, j--
次の C プログラムの説明及びプログラムを読んで,設問1,2に答えよ。

〔プログラムの説明〕

 与えられた平文(ひらぶん)を,換字(かえじ)表を用いて暗号文に変換する関数 encrypt_text である。

(1) 関数 encrypt_text の引数は,次のとおりである。ただし,ファイル名に誤りはないものとする。

 in_filename   平文が格納されているファイル名
 out_filename   暗号文を格納するファイル名
 ctbl       換字表


(2) 平文に含まれるものは,次の 92 種類の文字である。

 ① 英字 A ~ Z,a ~ z

 ② 数字 0 ~ 9

 ③ 記号 ! " # % & ' ( ) * + , - . / : ; < = > ? [ \ ] ^ _ { | } ~

 ④ 空白文字

(3) 換字表は,平文に含まれる 92 種類の文字を格納した4行 23 列の2次元文字型配列である。 換字表のすべての要素には,異なる文字が格納される。

(4) 換字による暗号化は,次のとおりに行う。ただし,換字表の最下行、(行3)の下には 最上行(行0)が,最右列(列 22 )の右には最左列(列0)があるものとして処理を行う。

 ① 平文の先頭から2文字ずつを取り出し,②~⑥の処理を行う。平文の文字数が奇数の場合  は,最後の1文字について,後ろに空白文字1文字を追加して2文字にして処理を行う。 

 ② それぞれの文字について,換字表の中の位置(行と列)を求める。

 ③ 2文字が同じ位置にある(同一の文字である)場合

  それぞれの文字を,換字表の右下(1行下で1列右)にある文字に置き換える。 換字の例を図1中の③に示す。

 ④ 2文字が同じ行にある場合

  それぞれの文字を,換字表の右隣(同じ行の1列右)にある文字に置き換える。 換字の例を図1中の④に示す。

 ⑤ 2文字が同じ列にある場合

  それぞれの文字を,換字表の直下(1行下の同じ列)にある文字に置き換える。 換字の例を図1中の⑤に示す。

 ⑥ それぞれの文字を,換字表の同じ行で,他方の文字と同じ列にある文字に置き換える。 換字の例を図1中の⑥に示す。 

h20au10p-1.JPG

(5) 換字表を用いた暗号化の例を図2に示す。

h20au10p-2.JPG
h20au10p-3.JPG

h20au10p-4.JPG



設問1 プログラム中の( ) に入れる正しい答えを,解答群の中から選べ。

a に関する解答群

ア ch[0] != ' '     イ ch[0] != ch[1]     ウ ch[0] == ' '
エ ch[0] == ch[1]    オ sts != EOF       カ sts == EOF

b,c に関する解答群

ア ch[0] != ch[1]     イ ch[0] == ch[1]
ウ col[0] != col[1]    エ col[0] == col[1]
オ row[0] != row[1]    カ row[0] == row[1]

d に関する解答群

ア ctbl[(col[0]+1) % ROWS][(row[0]+1) % COLS]
イ ctbl[col[0]+1][row[0]+1]
ウ ctbl[col[0]][row[0]]
エ ctbl[(row[0]+1) % ROWS][(col[0]+1) % COLS]
オ ctbl[row[0]+1][col[0]+1]


設問2 次の記述中の( ) に入れる正しい答えを,解答群の中から選べ。

(1) 平文に含まれる文字として改行文字を追加し,換字による暗号化を次のとおりに変更する。

(新しい方法)

 平文から改行文字を除いた文を従来の換字規則で暗号化し,平文と同じ位置に改行文字を挿入したものを暗号文とする。

(2) 図2の換字表を用いた新しい方法での暗号化の例を図3に示す。

h20au10p-5.JPG

(3) これに対応するために,プログラムを表のとおりに変更する。

       表 プログラムの変更内容
     処置       変更内容              
 行番号 14 と 15 の間
 に追加
  int cnt2; 
 行番号 19 を変更
sts = fgetc(ifp);
while((char)sts == '\n') {
fputc('\n', ofp);
sts = fgetc(ifp);
}
 行番号 22 を変更
cnt2 = 0;
sts = fgetc(ifp);
while((char)sts == '\n'){
cnt2++;
sts = fgetc(ifp);
}
( ) の間
 に追加
for( ; cnt2 > 0; cnt2--){
fputc('\n', ofp);
}


解答群

ア 行番号 53 と 54     イ 行番号 54 と 55
ウ 行番号 55 と 56     エ 行番号 56 と 57
オ 行番号 57 と 58

公認情報システム監査人(CISA)
システム監査技術者
趣味:読書、美術鑑賞
キーワード