平成6年度 秋期 第二種 午後 問13

                        [更新日]1995.06.29
問13 次のFORTRANプログラムの説明及びプログラムを読んで、設問に答えよ。 [プログラムの説明] 二つの分数の四則演算を実行するサブルーチン副プログラムである。ただし、この プログラムには、1ヶ所誤りがある。 (1) サブルーチン副プログラムは二つの分数 x1 y1 ── , ── x2 y2 を定義する四つの整数x1、x2、y1、y2と、実行する四則演算を定義する記号+、−、 *、/の一つ、合計五つを引数として受け取る。ここで、x1、x2、y1、y2は0で なく、また、すべての演算でけたあふれは起きないものとする。 (2) 指示された四則演算を実行、かつ演算結果を約分する。約分した結果 z1 ── z2 は、二つの引数z1、z2によって主プログラムに返す。このとき、分数はz1 の符号によって表す。 (3) (2)における約分の計算には、ユークリッドの互除法を適用する。すなわち、分数 a1 ── a2 を約分するために、まず、a1とa2の最大公約数bを求める。次に、最大公約数b を用いて分子、分母を約分する。互除法による計算手順、次の1〜4に示す。 1 A=a1 , B=a2 とおく。 2 A を B で割った余り C とおく。 3 C が 0 ならば、B が a1 と a2 の最大公約数である。 4 C が 0 でないならば、A を B で、B を C で置き換えて 2 にもどる。 設問 次の記述の[ ]に入れる正しい答えを、解答群の中から選べ。 (1) このサブルーチン副プログラムには1か所誤りがあり、必ずしも正しい計算 結果を Z1, Z2 に返すとは限らない。主プログラムで CALL BUNSU(-5, 6,'+', 3, 5, Z1, Z2) を実行したとき、Z1, Z2 の値は [ a ]になり、 CALL BUNSU(-5, 6,'*', 3, 5, Z1, Z2) を実行したとき、Z1, Z2 の値は [ b ]になる。 a ,b に関する解答群。 ア Z1 = -7 , Z2 = 30 イ Z1 = -4 , Z2 = 15 ウ Z1 = -3 , Z2 = 15 エ Z1 = -25, Z2 = 18 オ Z1 = -10, Z2 = 7 カ Z1 = -1 , Z2 = 2 キ Z1 = -43, Z2 = 30 ク Z1 =-8 , Z2 = 6 ケ Z1 = -9 , Z2 = 6 (2) プログラムの誤りは行番号[ c ]にあり、その正しい内容は[ d ] である。 c に関する解答群 ア 6 イ 7 ウ 9 エ 10 オ 12 カ 13 キ 15 ク 16 ケ 23 d に関する解答群 ア DO WHILE(C .GE. 0) イ DO WHILE (C .GT. 0) ウ DO WHILE(C .LT. 1) エ Z1 = X1 * X2 オ Z1 = X1 * Y1 カ Z1 = X1 * Y2 - X2 * Y1 キ Z1 = X2 * Y1 - X1 * X2 ク Z2 = X1 * X2 ケ Z2 = X1 * Y2 - X2 * Y1 コ Z2 = X2 * Y2 [プログラム] (行番号) 1 SUBROUTINE BUNSU(X1,X2,OP,Y1,Y2,Z1,Z2) 2 INTEGER X1,X2,Y1,Y2,Z1,Z2,ZZ,A,B,C 3 CHARACTER OP 4 SELECT CASE(OP) 5 CASE('+') ! 加算 6 Z1=X1*Y2+X2*Y1 7 Z2=X2*Y2 8 CASE('-') ! 減算 9 Z1=X1*Y2-X2*Y1 10 Z2=X2*Y2 11 CASE('*') ! 乗算 12 Z1=X1*Y1 13 Z2=X2*Y2 14 CASE('/') ! 除算 15 Z1=X1*Y2 16 Z2=X2*Y1 17 END SELECT 18 ZZ=Z1*Z2 19 Z1=ABS(Z1) 20 Z2=ABS(Z2) 21 B=Z1 22 C=Z2 23 DO WHILE(C.GT.1) ! 互除法のループ 24 A=B 25 B=C 26 C=MOD(A,B) 27 END DO ! ループの終端 28 Z1=Z1/B 29 Z2=Z2/B 30 Z1=SIGN(Z1,ZZ) 31 END
戻る 次頁:問14