東京理科大学 infoserv[更新日]1999.11.10


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

〔プログラムの説明〕

食品の好みの度合いについてのアンケートを実施した。その結果から食品間の 好みの相関係数を求め,印字するプログラムである。

(1) 回答者数は,2 人以上 100 人以下である。

(2) アンケートは,9 食品の好みの度合いをそれぞれ 10 点満点で回答するものである。

(3) アンケートの結果の例を表 1 に示す。アンケートの結果ファイルには, 回答者番号及び 9 食品の好みの得点が格納されている。

表1 アンケートの結果

(4) 食品間の好みの相関係数は,次のとおりに計算する。

 食品 s の得点の平均値を Hs , 回答者 n の食品 j と食品 k の得点を Pnj,Pnk,回答者の 人数を M として,次の Cjk を計算する。

 食品 j と食品 k の相関係数 Rjk は,次の式で計算する。ここで,Cjj,Ckk の値は,0 にならないものとする。

(5) 出力結果の例を次に示す。

        Kimuti Gyunyu Konbu  Suika  Tamago Tohu   Tomato Natto  Pizza
Kimuti  1.00   0.09   0.09   0.24   0.37  -0.11   0.05   0.42  -0.42
Gyunyu  0.09   1.00   0.55   0.30  -0.57  -0.16   0.06  -0.24   0.23
Konbu   0.09   0.55   1.00   0.23   0.09   0.26   0.35  -0.31   0.43
Suika   0.24   0.30   0.23   1.00  -0.19  -0.67  -0.40   0.26   0.01
Tamago  0.37  -0.57   0.09  -0.19   1.00   0.32   0.31  -0.11   0.20
Tohu   -0.11  -0.16   0.26  -0.67   0.32   1.00   0.58  -0.29   0.33
Tomato  0.05   0.06   0.35  -0.40   0.31   0.58   1.00   0.07   0.34
Natto   0.42  -0.24  -0.31   0.26  -0.11  -0.29   0.07   1.00  -0.69
Pizza  -0.42   0.23   0.43   0.01   0.20   0.33   0.34  -0.69   1.00
〔プログラム〕
(行番号)
01    program konomi_no_sokan
02    integer,parameter :: msaidai=100,ssaidai=9
03    real,dimension(ssaidai,ssaidai) :: r
04    integer,dimension(msaidai,ssaidai) :: t
05    integer :: bango,k,n,ninzu,s
06    character(len=7),dimension(ssaidai) :: shokuhin    &
07       &          =  (/'Kimuti ','Gyunyu ','Konbu  ',  &
08       &               'Suika  ','Tamago ','Tohu   ',  &
09       &               'Tomato ','Natto  ','Pizza  '/) 
10    do n=1,msaidai
11       read(*,*,end=10) bango,(t(n,s),s=1,ssaidai)
12    end do
13 10 ninzu = n - 1
14    call sokan(t,ninzu,r)
15    write(*,'(t10,9a7)') (shokuhin(s),s=1,ssaidai)
16    do k=1,ssaidai
17       write(*,'(t2,a7,9(f5.2,tr2))')                     &
18       &        shokuhin(k),(r(k,s),s=1,ssaidai)
19    end do
20    contains
21
22    subroutine sokan(shiryo,shiryosu,r)
23    integer :: shiryo(:,:),shiryosu,j,k,n,m
24    real :: r(:,:),c(ssaidai,ssaidai),h(ssaidai),wrk,wrkj,wrkk
25     ! 食品ごとの平均値を求める
26    h = real(sum(shiryo(1:shiryosu,1:ssaidai),dim=1)) / real(shiryosu)
27    do j=1,ssaidai
28       do k=1,ssaidai
29          c(j,k) = sum((real(shiryo(1:shiryosu,j)) - h(j)) *   &
30        &           (real(shiryo(1:shiryosu,k)) - h(k))) / real(shiryosu)
31       end do
32    end do
33    do j=1,ssaidai
34       do k=1,ssaidai
35          r(j,k) = c(j,k) / sqrt(c(j,j) * c(k,k))
36       end do
37    end do
38    end subroutine sokan
39    end program konomi_no_sokan

設問1 このプログラムに 101 人以上のデータを与えるとどうなるか, 正しい答えを解答群の中から選べ。

解答群

 ア 101 人目以降のデータが入力されたとき,どのデータが読み捨てられるかは 不定である。したがって,計算された相関係数も,どの 100 人のデータであるか 分からない。

 イ 101 人目以降のデータも含めた相関係数を計算する。

 ウ 101 人目以降のデータを配列として確保した領域外に格納するので,結果は 予想できない。

 エ 最後の 100 人のデータについて相関係数を計算する。

 オ 最初の 100 人のデータについて相関係数を計算する。

設問2 プログラム中の 27 行目から 32 行目までと同等な結果が得られる答えを,解答群の中から選べ。

解答群

ア   do j=1,ssaidai
        do k=1,ssaidai
           wrkj = 0.0
           wrkk = 0.0
           do n=1,shiryosu
              wrkj = wrkj + real(shiryo(n,j))  
              wrkk = wrkk + real(shiryo(n,k))
           end do
           c(j,k) = (wrkj - h(j)) * (wrkk - h(k)) / real(shiryosu) 
        end do
     end do
 
イ   do j=1,ssaidai
        do k=1,ssaidai
           wrkj = 0.0
           wrkk = 0.0
           do n=1,shiryosu
              wrkj = wrkj + (real(shiryo(n,j)) - h(j))  
              wrkk = wrkk + (real(shiryo(n,k)) - h(k))
           end do
           c(j,k) = wrkj * wrkk / real(shiryosu) 
        end do
     end do
 
ウ   do j=1,ssaidai
        do k=1,ssaidai
           wrk = 0.0
           do n=1,shiryosu
              wrk = wrk + (real(shiryo(n,j)) - h(j))  &
              &         * (real(shiryo(n,k)) - h(k))
           end do
           c(j,k) = wrk / real(shiryosu) 
        end do
     end do
 
エ   do j=1,ssaidai
        do k=1,ssaidai
           wrk = 0.0
           do n=1,shiryosu
              do m=1,shiryosu
                 wrk = (real(shiryo(n,j)) - h(j))  &
                 &   * (real(shiryo(m,k)) - h(k))  
              end do
           end do
           c(j,k) = wrk / real(shiryosu) 
        end do
     end do

設問3 次の 2 点について,プログラムを変更する。表 2 中の に入れる正しい答えを, 解答群の中から選べ。

(1) 同じ食品同士の相関係数は,計算しないで 1.0 とする。

(2) 結果の行列の対称性を利用して,食品の逆の組合せについては計算しないで, 対応する値を代入する。

表2 プログラムの変更箇所

位置

変更後

28 行目

do k=1,j

32〜36 行目

解答群

ア     r(j,j) = 1.0 
           do k=1,j-1
              r(k,j) = r(j,k)                   
              r(j,k) = c(j,k) / sqrt(c(j,j) * c(k,k))    
           end do

イ     r(j,j) = 1.0 
           do k=1,j-1
              r(j,k) = c(j,k) / sqrt(c(j,j) * c(k,k))    
              r(k,j) = r(j,k)                   
           end do

ウ     r(j,j) = 1.0 
           do k=1,j-1
              r(k,j) = r(ssaidai-j+1,ssaidai-k+1)   
              r(j,k) = c(j,k) / sqrt(c(j,j) * c(k,k))   
           end do

エ     r(j,j) = 1.0
           do k=1,j-1
              r(j,k) = c(j,k) / sqrt(c(j,j) * c(k,k))   
              r(k,j) = r(ssaidai-j+1,ssaidai-k+1)   
           end do

東京理科大学 infoserv 戻る 次頁:問14