[更新日]1998.05.15
問9 次の Fortran プログラムの説明及びプログラムを読んで, 設問に答えよ。
〔プログラムの説明〕
ある学校で行われた体力測定の走り幅跳びの結果について,記録の良い順に 順位をつけて出力するプログラムである。
(1) 生徒数は 1 〜 100 人である。
(2) 各生徒は走り幅跳びを 6 回行い,そのうちの最良の記録を基にして 順位を決める。プログラムでは,図 1 の例に示す形式の入力データを読み込む ごとに,学籍番号を配列 gakuseki に,最良の記録を配列 kiroku に格納する。 入力データ中の値 0.0 は,ファールを表す。
図1 入力データ例
(3) 学籍番号と記録の配列 gakuseki,kiroku の要素を,次のようにして 並べ替える。
(4) 並べ替えた配列 kiroku を基にして順位を求め,配列 jun_i に 格納する。同じ記録であれば,同じ順位にする。図 2 に示す出力例のように, 第 2 位が二人いれば次は第 4 位になる。
図2 出力例
〔プログラム〕 program main integer,dimension(100) :: gakuseki,jun_i integer :: k,m,n,ninzu,wgakuseki integer,parameter :: no_6 = 6 real :: kiroku(100),kyori(no_6),wkiroku do n = 1,100 read(*,*,end=10) gakuseki(n),(kyori(k),k=1,no_6) kiroku(n) = end do 10 ninzu = do n = 1,ninzu-1 k = n do m = if(kiroku(m) > kiroku(k)) then k = m endif end do wkiroku = kiroku(k) wgakuseki = gakuseki(k) kiroku(k) = kiroku(n) gakuseki(k) = gakuseki(n) kiroku(n) = wkiroku gakuseki(n) = wgakuseki end do wkiroku = kiroku(1) jun_i(1) = 1 do n = 2,ninzu if(wkiroku == kiroku(n)) then jun_i(n) = else jun_i(n) = n wkiroku = kiroku(n) endif end do write(*,*) "順位 学籍番号 記録" do n = 1,ninzu write(*,'(i5,3x,i5,f10.2)') jun_i(n),gakuseki(n),kiroku(n) end do end
設問 プログラム中の に入れる正しい答えを,解答群の中から選べ。
a に関する解答群
ア maxval(kyori) イ minval(kyori) ウ product(kyori)
エ sum(kyori)
b に関する解答群
ア n イ n - 1 ウ n + 1
エ max(n,100) オ min(n,100)
c に関する解答群
ア 1 , n - 1 イ 1 , n ウ 1 , n + 1
エ n - 1 , ninzu オ n + 1 , ninzu
d に関する解答群
ア n - 1 イ n + 1 ウ jun_i(n) - 1
エ jun_i(n) + 1 オ jun_i(n-1) カ jun_i(n+1)