平成9年度 春期 第二種 午後 問13

                        [更新日]1997.05.30
問13 次のFortranプログラムの説明及びプログラムを読んで,設問1〜4に答えよ。 〔プログラムの説明〕 6チームによる野球の総当たり戦(リーグ戦)において,各チームの対戦成績を集 計するプログラムである。 (l) チームは,A〜Fとする。 (2) 各チームは,他の5チームと26試合ずつ対戦する。 (3) 各試合の結果は,対戦成績ファイルから入力する。対戦成績ファイルの例を図1 に示す。 ┌─────┐ │ A 4-3 C │ │ F 0-2 D │ │ : │ └─────┘ 図1 対戦成績ファイルの例 (4) 各チームの勝ち数,負け数,引き分け数を集計し,各チームの対戦相手ごとの 成績及び通算成績を1行に出力する。出力例を図2に示す。 ┌────────────────────────────────────┐ │ A B C D E F 通算成績 │ │ │ │ 勝,負,分 勝,負,分 勝,負,分 勝,負,分 勝,負,分 勝,負,分 勝,負,分 │ │ │ │ A 12,13, 1 17, 5, 4 18, 6, 2 10,13, 3 12,12, 2 69,49,12 │ │ B 13,12, 1 10,14, 2 16,10, 0 13,12, 1 6,17, 3 58,65, 7 │ │ C 5,17, 4 14,10, 2 11,14, 1 13,13, 0 15,10, 1 58,64, 8 │ │ D 6,18, 2 10,16, 0 14,11, 1 9,l5, 2 11,15, 0 50,75, 5 │ │ E 13,10, 3 12,13, 1 13,13, 0 15, 9, 2 17, 7, 2 70,52, 8 │ │ F 12,12, 2 17, 6, 3 10,15, 1 15,11, 0 7,17, 2 61,61, 8 │ └────────────────────────────────────┘ 図2 出カ例 〔プログラム〕 (行番号) 01 program main 02 integer, parameter :: kazu = 6 03 character(len=2),parameter :: & 04 & namae(kazu) = (/"A ","B ","C ","D ","E ","F "/) 05 character(len=2) :: namael, namae2 06 character(len=1) :: x_moji 07 integer,dimension(kazu,kazu) :: kachi=0, make=0, hikiwake=O 08 integer :: m, n, kl, k2, ten1, ten2, tensa, g_hikiwake, g_kachi, g_make 09 do ! 対戦成績ファイルの読込み 10 read(*,*,end = 100) namae1,ten1,x_moji,ten2,namae2 11 k1 = namae_bangou(namae1,namae) 12 k2 = namae_bangou(namae2,namae) 13 tensa = ten1 - ten2 ! 試合ごとの得点差 14 if(tensa >= 1) then 15 kachi(k1,k2) = kachi(k1,k2) + 1 16 make(k2,k1) = make(k2,k1) + 1 17 else if(tensa == O) then 18 hikiwake(k1,k2) = hikiwake(k1,k2) + 1 19 hikiwake(k2,k1) = hikiwake(k2,k1) + 1 20 else if(tensa <= -1) then 21 make(k1,k2) = make(k1,k2) + 1 22 kachi(k2,k1) = kachi(k2,k1) + 1 23 end if 24 end do 25 100 continue 26 print *, & ! 見出しの印刷 27 & " A B C D E F 通算成績" 28 print *, & ! 見出しの印刷 29 & " 勝,負,分 勝,負,分 勝,負,分 勝,負,分 勝,負,分 勝 ,負,分 勝,負,分" 30 do n = 1, kazu 31 g_kachi = 0 ! 勝ち試合数の初期化 32 g_make = 0 ! 負け試合数の初期化 33 g_hikiwake = 0 ! 引き分け試合数の初期化 34 write(*, lOOO,advance="no") namae (n) 35 do m = 1, kazu 36 if(n == m) then 37 write(*,1010,advance="no") 38 else 39 g_kachi = g_kachi + kachi(n,m) ! 勝ち試合数の累計計算 40 g_make = g_make + make(n,m) ! 負け試合数の累計計算 41 g_hikiwake = g_hikiwake +hikiwake(n,m) ! 引き分け試合数の累計計算 42 write(*,1020,advance="no") kachi(n,m),make(n,m),hikiwake(n,m) 43 end if 44 end do 45 write(*,1030) g_kachi, g_make, g_hikiwake 46 end do 47 1000 format(' ',a2) 48 1010 format(9x,' ') 49 1020 format(2x,i2,",",i2,",",i2) 50 1030 format(2x,i3,",",i3,",",i3) 51 contains 52 function namae_bangou(moji,namae) 53 character(len=2),dimension(:) :: namae ! 6チームの名前の配列 54 character(len=2) :: moji ! 入力されたチーム名 55 integer kazu, n, namae_bangou 56 kazu = size(namae) ! 配列 namae の上限(6)を求める 57 do n = l, kazu 58 if(namae(n) == moji) then 59 namae_bangou = n 60 end if 61 end do 62 end function 63 end program 設問1 対戦成績ファイルの1件目の記録(図1の1行目のデータ)を読み込むと,配列 kachi と配列 make の該当する要素にその対戦成績が加算される。このとき加 算される配列要素として正しい答えを,解答群の中から選ベ。 解答群 ア kachi(1,3) と make(3,1) イ kachi(3,1) と make(l,3) ウ kachi(3,4) と make(4,3) エ kachi(4,3) と make(3,4) 設問2 行番号l4から23までのif構文を,次のcase構文に置き換えても同じ動作を する。 プログラム中の[ ]に入れる正しい答えを,解答群の中から選ベ。 select case(tensa) case(1:) kachi(k1,k2) = kachi(k1,k2) + 1 make(k2,k1) = make(k2,k1) + 1 case(0) hikiwake(k1,k2) = hikiwake(k1,k2) + 1 hikiwake(k2,k1) = hikiwake(k2,k1) + 1 case(:-1) [ ] [ ] end select 解答群 ア make(k1,k2) = make(k1,k2) + 1 kachi(k1,k2) = kachi(k1,k2) + 1 イ make(k1,k2) = kachi(k1,k2) + 1 kachi(k1,k2) = make(k1,k2) + 1 ウ make(k1,k2) = make(k1,k2) + 1 kachi(k2,k1) = kachi(k2,k1) + 1 エ make(k1,k2) = kachi(k1,k2) + 1 kachi(k2,k1) = make(k2,k1) + 1 設問3 関数副プログラム namae_bangou は,引数 moji によって指定されたチーム名 が6チームの名前の配列 namae の中の何番目にあるかを探し出すものである。あ る文を一つ追加することによって,この関数の実行時間を少し短縮できる。どの 文をどこに追加すればよいか,正しい答えを解答群の中から選ベ。 解答群 ア 行番号55の直後に n = 0 イ 行番号56の直後に if(namae(kazu) == moji) namae_bangou = kazu ウ 行番号59の直後に else 工 行番号59の直後に exit 設問4 各チームごとの対戦試合数が26であることを確認し,26でない場合はサブルー チン ayamari_shori を呼ぶようにしたい。それには,行番号25の直後に, ある文を一つ追加すればよい。どの文を追加すればよいか,正しい答えを解答群 の中から選ベ。ここで,dummy は,次のような2次元配列として新しく用意する。 配列 dummy の内容 ┌ 26 0 0 0 0 0 ┐ │ 0 26 0 0 0 0 │ │ 0 0 26 0 0 0 │ │ 0 0 0 26 0 0 │ │ 0 0 0 0 26 0 │ └ 0 0 0 0 0 26 ┘ 解答群 ア if(any(kachi + make + hikiwake + dummy == 0 )) call ayamari_shori イ if(any(kachi + make + hikiwake + dummy == 26)) call ayamari_shori ウ if(any(kachi + make + hikiwake + dummy /= 0 )) call ayamari_shori エ if(any(kachi + make + hikiwake + dummy /= 26)) call ayamari_shori

戻る  前頁:問12  次頁:問14