平成7年度 春期 第二種 午後 問7〜問10

                        [更新日]1995.05.22
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃次の問7から問10までの4問については、この中から1問を選択し、答案用紙の┃ ┃選択欄の「選」を黒くマークして解答してください。             ┃ ┃ なお、2問以上選択した場合には、はじめの1問について採点します。    ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ 問7 次のCプログラムの説明及びプログラムを読んで、設問に答えよ。 [プログラムの説明]    最近、電子メールの利用者が増えている。電子メールで実行形式( バイナリデータ)のファイルを送る場合には、送信前にその内容をテ キスト(テキストデータ)に変換し、受信後に復元するという処理を 行う。このプログラムは、テキストに変換されている実行形式のファ イルの内容を、元の実行形式ファイル(prg_file)に復元するもの である。 (1) テキストに変換された実行形式のファイルの内容は、テキスト形式 ファイル(txt_file)に格納されている。テキスト形式ファイルの 様式は、次のとおりである。 1. 先頭行には、実行形式のファイルのサイズ(バイト数)が入っ ている。 2. 2行目以降が変換された内容である。 3. テキスト行の最大文字数(LLENG)は、プログラム中で定義さ れている。 ┌──────────────────────────────────────┐ │ 188 │ │ ghjUGTUbgvkljhgYFGHKPHFFhkhgyfdhgjlJBDFRUJLOJBfdtg5689h6rb7U│ │ ghh67YGdtyuIjgfT9ikjghYghgfjhfcvnm.pigfj78jgTGIKjfhgKJgffHgh│ │ fyJHjgv,f.vkhbbikol...,jgfgfuiIHfghkHBRFNLHGFBN578632370ohDF│ │ hfgehlHNyJL │ └──────────────────────────────────────┘ 図1 テキスト形式ファイルの例 (2) テキスト形式ファイルで利用される文字は、プログラム中の変換文 字列テーブル(chtbl)に格納されている64種類である。 (3) 変換されたテキストからの復元処理は、次のように行う。 1. テキスト形式ファイルから、1行分のテキストデータを読み 込む。 2. 読み込んだテキストデータは、先頭から4文字単位に3バイ トのバイナリデータに復元し(図2参照)、実行形式ファイル に出力する。 (a) 各文字について、変換文字列テーブル上の格納位置(0〜 63のオフセット)を調べ、オフセットの値をコードとする。 (b) 各コードの下位6ビットを連結し、1バイト(8ビット)ご とに実行形式ファイルに出力する。 [プログラム] #include <stdio.h> #include <string.h> #define LLENG 60 char chtbl[] = { "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz" "0123456789,." }; main() { FILE *ifp, *ofp; long psiz; int p, s; char pch, tch, tbuf[LLENG+2]; ifp = fopen("txt_file", "r"); ofp = fopen("prg_file", "wb"); fscanf(ifp, "%ld\n", [ a ]); while([ b ]){ fgets(tbuf, sizeof(tbuf), ifp); p = 0; while(p < LLENG && [ b ]){ tch = strchr(chtbl, tbuf[[ c ]]) - chtbl; pch = tch << 2; for (s = 4; s < 9 && [ b ]; s += 2){ tch = strchr(chtbl, tbuf[[ c ]]) - chtbl; pch [ d ] tch >> (8 - s); fputc(pch, ofp); psiz--; pch = tch << s; } } } fclose(ifp); fclose(ofp); } 設問 プログラム中の[ ]に入れる正しい答えを、解答群の中から 選べ。 aに関する解答群 ア psiz イ &psiz ウ /psiz エ *psiz bに関する解答群 ア psiz < 0 イ psiz <= 0 ウ psiz == 0 エ psiz >= 0 オ psiz >0 cに関する解答群 ア ++p イ p++ ウ --p エ p-- dに関する解答群 ア = イ &= ウ |= エ !=
問8 次のCOBOLプログラムの説明及びプログラムを読んで、設問に答えよ。 [プログラムの説明] 支店別月別売上ファイルを読み、昨年の各月の支店別売上高の対 前年(一昨年)同月比を百分率で印字する。 (1) 売上ファイルのレコード様式は、次のとおりである。 ┌───────┬───┬───┬────────┐ │  支店名  │ 年 │ 月 │  売上高   │ │  20けた │2けた│2けた│  10けた  │ └───────┴───┴───┴────────┘ (2) 売上ファイルは、支店名、年及び月で昇順に整列されている。 (3) 印字方法は、次のとおりとする。 ┌────────────────────────────────────┐ │shiten  Jan.Feb.Mar.Apr.May…………………………… Nov.Dec. │ │xxxxxx…x zz9 zz9 zz9 zz9 zz9…………………………… zz9 zz9  │ │xxxxxx…x zz9 zz9 zz9 zz9 zz9…………………………… zz9 zz9  │ │ : : : : : :             : :   │ │ : : : : : :             : :   │ │xxxxxx…x zz9 zz9 zz9 zz9 zz9…………………………… zz9 zz9  │ └────────────────────────────────────┘ その月の売上高又は前年同月の売上高が存在しないか0円の場 合には、前年同月比に“---”を印字する。前年同月の売上高に 比べて10倍以上の売上高の場合には、前年同月比に“***”を印 字する。 (4) プログラムの実行日(今日)の年を求め、それから1を引いた 年が昨年となる。 ただし、このプログラムでは年は西暦下2けたで扱っているので、 00年の1年前は99年になることに注意する。 [プログラム] data division. file section. fd u-file. 01 u-rec. 05 u-shiten pic x(20). 05 u-yy pic 9(2). 05 u-mm pic 9(2). 05 u-daka pic s9(10). fd p-file. 01 p-rec pic x(68). working-storage section. 01 header. 05 pic x(20) value "shiten". 05 pic x(48) value "Jan.Feb.Mar.Apr.May Jun.Jul.Aug.Sep.Oct.Nov.Dec.". 01 meisai. 05 m-shiten pic x(20). 05 occurs 12. 10 pic x. 10 m-hiritsu pic zz9. 10 m-hiritsu-x redefines m-hiritsu pic x(3). 01 uriage-rec. 05 w-daka pic s9(10) occurs 24. 01 w-hiritsu pic 9v99. 01 w-shiten pic x(20). 01 eof-ind pic x value low-value. 01 today. 05 t-yy pic 99. 05 t-mm pic 99. 05 t-dd pic 99. 01 sakunen pic 99. 01 issakunen pic 99. 01 j pic 99. procedure division. m1. open input u-file output p-file. initialize uriage-rec. write p-rec from header after page. read u-file at end move high-value to eof-ind end-read. [ a ] evaluate t-yy when 0 [ b ] move 98 to issakunen when 1 move 0 to sakunen move 99 to issakunen when other compute sakunen = t-yy - 1 compute issakunen = t-yy - 2 end-evaluate. perform until eof-ind = high-value move u-shiten to w-shiten if u-yy = sakunen [ c ] else if u-yy = issakunen move u-daka to w-daka (u-mm) end-if end-if read u-file at end perform s2 move high-value to eof-ind not at end if u-shiten not = w-shiten perform s2 [ d ] end-if end-read end-perform. close u-file p-file. stop run. s2. move space to meisai. move w-shiten to m-shiten. perform varying j from 1 by 1 until j > 12 if w-daka (j) <= 0 or w-daka (j + 12) <= 0 move "---" to m-hiritsu-x (j) else [ e ] on size error move "***" to m-hiritsu-x (j) not on size error compute m-hiritsu (j) = w-hiritsu * 100 end-compute end-if end-perform. write p-rec from meisai after 1. 設問 プログラム中の[ ]に入れる正しい答えを、解答群の中から 選べ。 aに関する解答群 ア accept today from date イ accept today from time ウ initialize meisai エ move space to p-rec オ move zero to uriage-rec bに関する解答群 ア compute sakunen = t-yy - 1 イ compute sakunen = t-yy + 1 ウ move -1 to sakunen エ move 99 to sakunen オ move t-yy to sakunen cに関する解答群 ア move u-daka to m-hiritsu (u-mm) イ move u-daka to w-daka (j) ウ move u-daka to w-daka (j + 12) エ move u-daka to w-daka (u-mm) オ move u-daka to w-daka (u-mm + 12) dに関する解答群 ア initialize uriage-rec イ move high-value to eof-ind ウ move low-value to eof-ind エ move u-shiten to w-shiten オ move w-shiten to u-shiten eに関する解答群 ア compute m-hiritsu (j) = w-daka (j) / w-daka (j + 12) * 100 イ compute m-hiritsu (j) = w-daka (j + 12) / w-daka (j) ウ compute w-hiritsu = w-daka (j) / w-daka (j + 12) エ compute w-hiritsu = w-daka (j + 12) / w-daka (j) オ compute w-hiritsu = w-daka (j + 12) / w-daka (j) * 100 問9 次のFORTRANプログラムの説明及びプログラムを読んで、設問1、2 に答えよ。 [プログラムの説明] バクテリアが分裂・死亡を繰り返して、個体数を増減させていく過 程をシミュレーションする。この過程では、次のような条件を前提と している。 [条件] 1分経過するごとに、各バクテリアは、互いに関連をもつこ となく、次のいずれかの状態になる。 ・死亡する ・分裂しないでそのまま(1個のまま) ・複数に分裂する(2〜4個になる) 1個の個体は0〜4個になるが、1分経過後にそれぞれの個 数になる確率Pは、表のように与えられている。 表 各個数になる確率 ┌────┬──┬────┐ │状  態│個数│ 確率 │ ├────┼──┼────┤ │死  亡│ 0│ 0.3│ ├────┼──┼────┤ │そのまま│ 1│0.25│ ├────┼──┼────┤ │    │ 2│ 0.2│ │    ├──┼────┤ │分  裂│ 3│0.15│ │    ├──┼────┤ │    │ 4│ 0.1│ └────┴──┴────┘ 以上の過程を0≦x<1の値をとる一様乱数xを用いてシミュレーショ ンする。 1分後の個数を区間[0,1)の一様乱数から決めるために、この区間を 図1のように分ける。乱数が区間1に入れば0個、区間2に入れば1個、 …とみなすことによって、表の確率でバクテリアの分裂のシミュレー ションが行える。 最初の10分間のシミュレーションの結果を、図2のように1分ごと (T=1〜10)の値でグラフに描く。*の1個はバクテリア10個(端数切 捨て)を表し、左側の数値は、経過時間(分)とバクテリアの個数を 表す。なお、最初(T=0)にバクテリアは10個いるものとする。 また、状態の出現確率を確かめるために、図3に示すようなヒストグ ラムを描く。左側の数値は1分後の個数とその個数になった回数の合計 を示す。 バクテリア ノ ソウスウ +---------+---------+---------+---------+---------+ 1 20 ** 2 25 ** 3 37 *** 4 48 **** 5 85 ******** 6 112 *********** 7 183 ****************** 9 293 ***************************** 10 689 ************************************************** +---------+---------+---------+---------+---------+ 0 100 200 300 400 500 図2 バクテリアの総個数の変化例 また、状態の出現確率を確かめるに、図3に示すようなヒストグラム を描く シュツゲン カイスウ ヒストグラム +---------+---------+---------+---------+---------+ 0 378 ############################## 1 307 ######################## 2 263 ##################### 3 193 ############### 4 136 ########### +---------+---------+---------+---------+---------+ 0 10 20 30 40 50 % 図3 一分後の個数のヒストグラム例 プログラム中のサブルーチン副プログラムSEEDは乱数発生の初期値 を設定し、RANDOMは区間[0,1)の一様乱数を引数で返すものとする。 [プログラム] REAL D(5) INTEGER T,NT,NB(5),NBT [ a ] N=10 CALL SEED(197) DO J=1,5 NB(J)=0 END DO WRITE (*,*) 'バクテリア ノ ソウコスウ ' WRITE (*,10) DO T=1,10 NT=0 DO K=1,N CALL RANDOM(X) J=1 DO WHITE ([ b ]) J=J+1 END DO NB(J)=NB(J)+1 NT=[ c ] END DO N=NT WRITE(*,20) T,N,[ d ] END DO WRITE (*,10) WRITE (*,30) (J,J=0,500,100) WRITE (*,*) 'シュツゲンカイスウ ヒストグラム' WRITE (*,10) NBT=0 DO J=1,5 NBT=NBT+NB(J) END DO DO J=1,5 WRITE (*,20) J-1,NB(J),('#',L=1,NINT((100.0*NB(J))/NBT)) END DO WRITE (*,10) WRITE (*,40)(J,J=0,50,10) 10 FORMAT(11X,'+',5('---------+')) 20 FORMAT(I5,1X,I5,1X,50A1) 30 FORMAT(2X,6I10) 40 FORMAT(2X,6I10,'%') END 設問1 プログラム中の[ a ]〜[ c ]に入れる正しい答えを、解 答群の中から選べ。 aに関する解答群 ア DATA D/0.3,0.55,0.75,0.9,1.0/ イ DATA D/1.0,0.9,0.75,0.55,0.3/ ウ DATA D/0.0,0.3,0.55,0.75,0.9/ エ DATA D/0.3,0.25,0.2,0.15,0.1/ オ DATA D/0.9,0.75,0.55,0.3,0.0/ bに関する解答群 ア D(J).LE.X.AND.X.LT.D(J+1) イ X.GE.D(J) ウ D(J-1).LT.X.AND.X.LE.D(J) エ D(J).GT.X オ D(J-1).LE.X.AND.X.LT.D(J) cに関する解答群 ア NT+J イ NT+J-1 ウ NT+J+1 エ J オ J+1 設問2 バクテリアの総個数をグラフで表示するのに、10個分を1個の*で表 したい。また、横の長さが限られているので、*が50個を越えたときで も50個までしか印字しないようにする。プログラム中の[ d ]に 入れるものとして、間違っている答えを、解答群の中から選べ。 解答群 ア ('*',L=1,MIN(500,N)/10) イ ('*',L=1,MIN(50,N)/10) ウ ('*',L=1,MAX(N/10,50)) エ ('*',L=1,(N/10-DIM(N/10,50)))
問10 次のアセンブラプログラムの説明及びプログラムを読んで、設問 に答えよ。 [プログラムの説明] 長さ1以上4以下の数字の列を受け取り、その数値を2進数に変換する 副プログラムCONVRTである。 (1) 数字の列は、連続するn語の領域に入れられ、その先頭アドレスが GR1に格納されて主プログラムから渡される。 各数字は各語の下位8ビットに格納され、上位8ビットにはすべて0 が入っている。 (2) 数字の列の直後の語(n+1語目)は、すべてのビットに0が入ってい る。 (3) 数字の列を10進数とみなし、それを2進数に変換してGR0に格納し、 主プログラムに返す。 例えば、数字の列”1234”が与えられた場合の変換は図のようにな る。 図では、領域の内容及びGR0の内容は16進数で表示してある。 GR1 ↓ CONVRT実行後 ┌────┬────┬────┬────┬────┐       ┌───┐ │0031│0032│0033│0034│0000│─→R0の内容│4D2│ └────┴────┴────┴────┴────┘       └───┘ 図 変換の例 (4) 次の場合、GR0に-1を格納して、主プログラムに返す。 1, 数字以外の文字が現れた。 2, 数字の列の長さが0であった。 3, 数字の列の長さが4を越えた。 (5) この副プログラムから戻るとき、汎用レジスタGR1〜GR3を、呼び出 される前の内容に復元する。 設問 プログラム中の[ ]に入れる正しい答えを、解答群の中から選べ。 解答群 ア CPA GR2,ZERO イ JMI ERROR ウ JNZ ERROR エ JPZ FIN オ JPZ ERROR カ JZE ERROR キ LEA GR2,0,GR2 ク SLL GR0,2 ケ SLL GR0,3 コ SRL GR0,2 [プログラム] CONVRT START ; PUSH 0,GR1 ;レジスタの退避 PUSH 0,GR2 ;レジスタの退避 PUSH 0,GR3 ;レジスタの退避 LD GR2,0,GR1 ; LEA GR2,0,GR2 ;文字列の長さ0? JZE ERROR ; LEA GR3,4 ;文字列長チェック用カウンタ LEA GR0,0 ; LOOP CPL GR2,ZERO ;≧ '0'? [ a ] ; CPL GR2,OVER ;≦ '9'? [ b ] ; AND GR2,MASK ; SLL GR0,1 ;処理済みの数値X10 ST GR0,WORK ;処理済みの数値X10 [ c ] ;処理済みの数値X10 ADD GR0,WORK ;処理済みの数値X10 ST GR2,WORK ;現在の数値を加算 ADD GR0,WORK ;現在の数値を加算 LEA GR1,1,GR1 ; LD GR2,0,GR1 ; [ d ] ;文字列の終り? JZE FIN ; LEA GR3,-1,GR3 ; JNZ LOOP ; ERROR LEA GR0,-1 ; FIN POP GR3 ;レジスタの復元 POP GR2 ;レジスタの復元 POP GR1 ;レジスタの復元 RET ; ZERO DC #0030 ; '0' OVER DC #003A ; '9'+1 MASK DC #000F WORK DS 1 END
戻る 次頁:問11