問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