[更新日]1998.11.06


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

〔プログラムの説明〕

手持ちのくじ番号を記録したファイルと発表された当選番号を記録したファイルの 二つを比較し,当たりくじを選び出して出力する。

(1) ファイル temochi.dat には手持ちのくじ番号(図 1 )が, ファイル atari.datには発表された当選番号(図 2 )が,1 レコードに一つずつ左詰めで 書き込まれている。両ファイルとも最初のレコードには,データの個数が書き込まれている。この二つのファイルから手持ちのくじ番号を配列 p に,当選番号を配列 q に読み込む。

(2) くじ番号は 6 けたであって先頭の 1 けたが英字,その後の 5 けたが数字で ある。当選番号は 6 けた以下の x けたであり,くじ番号の下 x けたが 一致した場合に当選と判断する。当選番号が 6 けたの場合は 1 等賞,5 けたの場合は 2 等賞というように,6 等賞まである。重複して当選 (例えば,下 2 けた“15”の 5 等と下 3 けた“315”の4等の両方が当選) した場合は、けた数の多い方(この場合は4等)だけを当選とする。

(3) 当選番号のけた数を調べるために組込み関数 len_trim(s) を用いる。
len_trim(s) は,文字列 s から右端の空白文字を取り除いた文字長を返す。

(4) 当たりくじのそれぞれについて,それが何枚目で何等賞かを出力する。最後に各賞ごとに当たりが何枚であったかを出力する(図 3 )。

20
D34712
W49229
R11058
A72848
K27958
E86700
P39267
T17315
C11727
S36155
T05045
N72160
M72564
N70160
E62440
F67543
I47613
U57570
B25505
Z68715
14
T30416
S50303
00929
20103
71205
2605
3527
5243
315
047
146
15
48
3
図1 手持ちのくじ番号の例
 (ファイル temochi.dat)
 図2 発表された当選番号の例
 (ファイル atari.dat)

   4 枚目の A72848 は 48 と合致して 5 等賞です  
   8 枚目の T17315 は 315 と合致して 4 等賞です  
   16 枚目の F67543 は 3 と合致して 6 等賞です  
   17 枚目の I47613 は 3 と合致して 6 等賞です  
   20 枚目の Z68715 は 15 と合致して 5 等賞です  
   1 等賞の当たりくじは 0 枚です  
   2 等賞の当たりくじは 0 枚です  
   3 等賞の当たりくじは 0 枚です  
   4 等賞の当たりくじは 1 枚です  
   5 等賞の当たりくじは 2 枚です  
   6 等賞の当たりくじは 2 枚です  

図3 出力例

〔プログラム〕

program main
  integer, parameter :: KETA=6
  character(len=KETA), dimension(100) ::  p, q
  character(len=KETA) :: s1, s2, s3
  character(len=12), parameter :: fname1 = 'temochi.dat'
  character(len=12), parameter :: fname2 = 'atari.dat'
  integer, dimension(KETA) :: atari=0
  integer i, j, n, m, n1, n2, match, prize
  open(7, file=fname1) ! ファイル 'temochi.dat' の読込み
  read(7, *) n
  read(7, '(a)') (p(i), i=1,n)
  close(7)
  open(8, file=fname2) ! ファイル 'atari.dat' の読込み
  read(8, *) m
  read(8, '(a)') (q(i), i=1,m)
  close(8)
  n1=KETA
  do i=1, n
    match=0
    do j=1, m
      n2=len_trim(q(j))
      s1=p(i)()
      s2=q(j)
      if(s1==s2 .and. ) then
        match=n2
        s3=s2
      end if
    end do
    if(match > 0) then
      prize= 
      write(*,100) i, trim(p(i)), trim(s3), prize
100   format(' ',i3,' 枚目の ',a,' は ',a,' と合致して ', &
     & i2, ' 等賞です ')
      atari(prize) = atari(prize) + 1
    end if
  end do
  write(*,110) (i, atari(i), i=1, )
110 format(' ',i2,' 等賞の当たりくじは ',i3,' 枚です ')
end program main
設問 プログラム中の に入れる 正しい答えを,解答群の中から選べ。

a に関する解答群

ア 1:match     イ 1:n1     ウ 1:n2

エ n1:n1-n2+1    オ n1-n2+1:n1   カ n2:1

b に関する解答群

ア n2 == match    イ n2 < match    ウ n2 > match

エ n2 == n1      オ n2 < n1     カ n2 > n1

c に関する解答群

ア KETA+1-match   イ KETA+1-n2   ウ KETA-match

エ KETA-n2      オ match     カ n2

d に関する解答群

ア KETA    イ m     ウ match

エ n      オ prize


戻る 次頁:問10