試験問題解答編

試験問題の解答。
プログラム問題に関してはこれじゃないと正解にはならないってことはないので。
いろんな書き方がありますからね。

1.
以下の(ア)~(コ)はFortranプログラムの一部である。この部分を実行すると、各変数の値は最後に何になるか。ただし、(ア)~(ケ)の変数はすべて整数型、(コ)の変数はすべて実数型とする。(小数点付きか、そうでないかに注意して答えること。)

(ア)
s = 0
do k = 1, 10
    s = s + k
end do

sの値(            )
 

(イ)
s = 0
do k = 1, 20, 3
    s = s + k
end do

sの値(            )
 

(ウ)
s = 0
do k = 10, 1, -1
    s = s + k
end do

sの値(            )
 

(エ)
s = 0
do k = 1, 10
    s = k
end do

sの値(            )
                  

(オ)
m = 0
c = 0
if(m. lt. 0) c = c + 1
m = m + 1
if(m. gt. 0) c = c + 1

cの値(            )
 

(カ)
n = 0
if(n. le. 0) n = n + 1
if(n. gt. 0) n = n + 2
if(n. eq. 1) n = n + 3
n = n + 4

nの値(            )
 

(キ)
n = 1
if(n. ne. 0) then
    n = n * 2
else
    n = n * 3
end if

nの値(            )
 

(ク)
c = 0
do k = 1, 20
    r = k – k / 3 * 3
    if(r. eq. 0) c = c + 1
end do

cの値(            )
 

(ケ)
read(*,*) n
do
    if(n. lt. 10) exit
    n = n / 10
end do

自分の学生番号 abc-defからdefabcという6桁の
整数を作り、これをキーボードから入力したとき
nの値(            )

(コ)
x = 1.0
if(x. lt. -1.0) then
    y = -1.0
else if(x. lt. 1.0) then
    y = 0.0
else
    y = 1.0
end if

yの値(            )

 
1.解答======================================================================================================================
(ア) s = 55
(イ) s = 70
(ウ) s = 55
(エ) s = 10
(オ) c = 1
(カ) n = 7
(キ) n = 2
(ク) c = 6
(ケ) 下記参照
(コ) y = 1.0
 
 
(ケ)は、人によって違う。
例えば学生番号が123-456だった場合、問題に従うと456123となる。
この問題のプログラムは、最上位の数値だけを出力するプログラムとなっているため、先ほどの数値を入力した場合、その数値の最上位、つまりこの場合は4が答えとなる。
 
 ============================================================================================================================

2.
1 / 12 + 1 / 22 + 1 / 33 + … + 1 / 1002の値を計算するプログラムを書け。
(do文を使って記述すること。また、変数の型に注意せよ。)

2.解答==================================================================================================

C—+—-+—-+—-+
      integer i
      real s
      i = 0
      s = 0.0
      do i = 1, 100
          s = s + ( 1.0 / (real(i ** 2))
      end do
      write(*,*) ‘s = ‘,s
      stop
      end

======================================================================================

 

3.
キーボードから1より大きい整数を変数nに代入し、nが1でない限り、nが偶数ならば2で割り、nが奇数ならば3倍して1を足して、nの値を次々に書き換えていく(nが1になったら終了)。この操作はどんな整数でも有限回で終了するだろうという予想が有名なコラッツ予想である。この操作を実行しようと次のプログラムを作った。(stepは操作の回数、maxは整数nの最大値を求めるための変数である。)

00
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16

c—+—-+—-+—-+
      integer n, step, max
      read(*,*) n
      if(n. le. 1) stop
      step = 0
      max = n
      do
          write(*,*) n
          if(n. eq. 1) exit
          if(n – n / 2 * 2. eq 0) n = n / 2
          if(n – n / 2 * 2. eq 0) n = 3 * n + 1
          step = step + 1
          if(n. gt. max) max = n
      end do
      write(*,*) ‘step = ‘,step,’    max = ‘,max
      stop
      end

(1) 3行目と8行目のif文は何のためにあるか?それぞれの理由を答えよ。
(2) 9行目と10行目の論理if文において整数nへの操作を実行しているが、このプログラムは思ったとおりに動作しない。どのような問題点がある
   か?考えられる点をすべて挙げよ。
(3) 正しく動作させるにはどう書き直したらよいか?正しいプログラムを書け。 

3.解答=======================================================================================================================
(1)
コラッツ予想は1より大きい整数を処理することを前提としているため、1以下の数値は意味をなさない。
3行目は1以下の数値が入力された場合、プログラムを止めるようにするため。
また8行目はnの値が1になったらループ処理を終了させるため。
 
(2)
9行目と10行目はブロックif文でなければならないが、論理if文化している。
これでは9行目の処理のあと、10行目の処理も行ってしまう。
9行目の式はnを奇数に、10行目の式は偶数にするものであるため、無限ループに陥ることになる。
 
(3)

00
01
02
03
04
05
06
07
08
09
10
11
12
13

14
15
16
17
18
19

c—+—-+—-+—-+
      integer n, step, max
      read(*,*) n
      if(n. le. 1) stop
      step = 0
      max = n
      do
          write(*,*) n
          if(n. eq. 1) exit
          if(n – n / 2 * 2. eq 0) then
              n = n / 2
          else
              n = 3 * n + 1
          end if
          step = step + 1
          if(n. gt. max) max = n
      end do
      write(*,*) ‘step = ‘,step,’    max = ‘,max
      stop
      end

===========================================================================================================================

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中