問9 次の Fortran プログラムの説明及びプログラムを読んで,設問に答えよ。
〔プログラムの説明〕
ある 2 種類の金属を組み合わせて熱を加えると起電力が生じる。基準温度を 0 ℃に設定し, 測定温度を 0 ℃から 1,760 ℃まで 10 ℃刻みに変化させて発生した電圧を測定したところ, 温度に対する電圧は 0 ℃のとき 0 ボルトで,常に単調に増加することが分かった。 この実験結果を基にして,10 ℃刻みの温度から電圧を求める表と,0.1 ボルト刻みの 電圧から温度を求める表を作成するプログラムである。
(1) 入力データは,温度 0 ℃から 1,760 ℃まで 10 ℃刻みの温度と電圧を示す 177 対のデータである(図 1)。
(2) 温度から電圧を求める表は,図 2 のように温度を 10 ℃刻みで出力する。
(3) 電圧から温度を求める表は,0.0 ボルトから 0.1 ボルト刻みで 18.6 ボルトまでの 電圧について,対応する 187 個の温度値を 0.1 ボルト刻みで図 3 のように出力する。
(4) ある電圧 v が,実験結果のうち u 番目と(u−1)番目の温度に対応する電圧の間に あるとき,電圧 v に対応する温度の近似値 t は次の式で求める。
(u 番目の電圧 − v)×(実験時の温度刻み) t = u 番目の温度 − --------------------------------------------- u 番目の電圧 −(u−1)番目の電圧
〔プログラム〕
program netsu_kiden_ryoku real :: gyaku_den(0:200), gyaku_on(0:200), & & sokutei_den(0:200), sokutei_on(0:200) real,parameter :: gyaku_den_kizami = 0.1, & & sokutei_on_kizami = 10.0, saidai_on = 1760.0 integer :: m, m_saidai, k, n, n_saidai n_saidai = do n = 0, n_saidai read(*,*) sokutei_on(n), sokutei_den(n) end do m_saidai = int(sokutei_den(n_saidai) / gyaku_den_kizami) write(*,'(t13,10(i3,tr4))') & & (nint(n * sokutei_on_kizami), n=0,9) do n = 0, n_saidai, 10 write(*,'(t2,i5,tr2,10f7.3)') end do call gyakubiki(sokutei_on, sokutei_den, gyaku_on, gyaku_den) write(*,'(////)') write(*,'(t9,10f7.1)') & & (real(n * gyaku_den_kizami), n=0,9) do m = 0, m_saidai, 10 write(*,'(t2,i5,tr2,10f7.1)') & & nint(gyaku_den(m)), (gyaku_on(k), k=m,min(m+9,m_saidai)) end do contains subroutine gyakubiki(x1, y1, x2, y2) integer :: k, m, u real :: v, x1(0:200), x2(0:200), y1(0:200), y2(0:200) x2(0) = 0.0 y2(0) = 0.0 u = 1 do m = 1, m_saidai v = m * gyaku_den_kizami y2(m) = v do k = u, n_saidai if(v <= y1(k)) then exit endif end do end do end subroutine gyakubiki end program netsu_kiden_ryoku
設問 プログラム中の に入れる正しい答えを,解答群の中から選べ。
a に関する解答群
ア int(saidai_on)
イ int(saidai_on) + 1
ウ int(saidai_on/sokutei_on_kizami)
エ int(saidai_on/sokutei_on_kizami) + 1
b に関する解答群
ア n,(sokutei_den(k), k=n, min(n+9,n_saidai))
イ n,(sokutei_den(k), k=n*10, min(n*10+9,n_saidai))
ウ nint(sokutei_on(n)),(sokutei_den(k), k=n, min(n+9,n_saidai))
エ nint(sokutei_on(n)),(sokutei_den(k), k=n*10, min(n*10+9,n_saidai))
c に関する解答群
ア u = k イ u = k + 1
ウ u = k * 10 エ u = (k + 1) * 10
d に関する解答群
ア x2(m) = u - (u-v)*sokutei_on_kizami
イ x2(m) = x1(u) - (y1(u)-v)*sokutei_on_kizami/(y1(u)-y1(u-1))
ウ x2(m) = y1(u) - (x1(u)-v)*sokutei_on_kizami/(x1(u)-x1(u-1))
エ y2(m) = u - (u-v)*sokutei_on_kizami
オ y2(m) = x1(u) - (y1(u)-v)*sokutei_on_kizami/(y1(u)-y1(u-1))
カ y2(m) = y1(u) - (x1(u)-v)*sokutei_on_kizami/(x1(u)-x1(u-1))