情報処理 (第7回) (2014/5/26・茂木) 1 先週の演習の解答例

情報処理 (第 7 回)
(2014/5/26・茂木)
✓
本日のテーマ
✒
✏
• IF 文と GOTO 文を組み合わせたループ
✑
1 先週の演習の解答例
✓
Q1 階乗の計算
✏
c23456
program factorial
implicit none
integer n, i, kaijo
n=10
! 10 の階乗を求める
kaijo=1
! kaijo を 1 で初期化
i=2
! i の初期値は 2(1 でもよい)
1000 kaijo=kaijo*i
if(i.eq.n) goto 2000
! i が 10 になったら足し合わせを終了
i=i+1
! i を 1 増やす
goto 1000
2000 write(6,*)’1 から’,n,’ までかけると’,kaijo,’ になります.’
end
✒
✓
✑
Q2 平方根の計算
✏
c23456
program square_root
implicit none
real a, a_new, b
write(6,*)’b を入力してください.’
read(5,*)b
a=1.0
1000 a_new=(b/a+a)/2.0
if( ABS(a_new-a) .lt. 1.0E-6 ) goto 2000
a=a_new
goto 1000
2000 write(6,*)a_new
end
✒
1
✑
✓
Q3 log x の計算
c23456
✏
program logx_no_keisan
implicit none
real x, ans, a
integer i
write(6,*)’x の値を入力 (x>0)’
read(5,*)x
ans=0.0
i=1
1000 a=((x-1.0)/(x+1))**(2*i-1)/(2*i-1)*2.0
ans=ans+a
if(abs(a).lt.1.0E-7) goto 2000
i=i+1
goto 1000
2000 write(6,*) ans
end
✒
✓
✑
Q4 コラッツの予想
✏
c23456
program co
integer m, i, mmax/1/
! プログラムの開始時に mmax を 1 に初期化
write(6,*)’ 数値を入力して下さい.’
read(5,*)m
i=0
1000 if( m .eq. 1 ) goto 2000
if( m .eq. m/2*2 ) then
m=m/2
else
m=m*3+1
endif
write(6,*)i, m
if(mmax .lt. m) mmax=m
i=i+1
goto 1000
! m=1 なら計算終了(ループの脱出条件)
! m は偶数?
! 偶数のとき
! 奇数のとき
! 最大値をとっておく
2000 write(6,*)’m が 1 になるまで’,i,’ 回ループしました.’
write(6,*)’m の最大値は’,mmax,’ でした.’
end
✒
2 IF 文
2.1 論理 IF 文
if (論理式) 文 1
論理式の値が真のとき文 1(文一つのみ)を実行し,偽のとき何もせずに次の行へ移ります.(論理式) の
部分は次のブロック IF 文と同じです.ブロック IF 文と比べてシンプルで読みやすいので,可能ならばこ
ちらを使いましょう(then が付かないことに注意).
2
✑
2.2 ブロック IF 文
if (論理式) then
ブロック 1 (論理式が真のとき実行される.複数の文を書くことができる)
else
ブロック 2 (論理式が偽のとき実行される.複数の文を書くことができる)
endif
ブロック 2 が不要のときには次のように書きます.
if (論理式) then
ブロック 1 (複数の文)
endif
また,else ブロックにさらに条件判定を加えることもできます.ただし,複雑にするとプログラムの可
読性(読みやすさ)が損なわれるので,なるべく単純な条件判定を用いるようにします.
if (論理式 1) then
ブロック 1 (論理式 1 が真のとき実行される.
)
else if(論理式 2) then
ブロック 2 (論理式 1 が偽,論理式 2 が真のとき実行される.
)
else
ブロック 3
endif
2.3 論理式
(論理式) となっているところには次の関係式が入ります.
書き方
a.eq.b
a.ne.b
a.lt.b
a.gt.b
a.le.b
a.ge.b
意味
a = b(a と b の値が同じなら真)
a = b(a と b が値が違うなら真)
a < b(a の値が b より小さいなら真)
a > b(a の値が b より大きいなら真)
a ≤ b(a の値が b より小さいか同じなら真)
a ≥ b(a の値が b より大きいか同じなら真)
記号の由来
equal to
not equal to
less than
greater than
less than or equal to
greater than or equal to
.and.(かつ)と.or.(あるいは)を組み合わせて,複数の条件を扱うことができます.
3 GOTO 文
goto 文が実行されると,goto 文に付けられた文番号 (statement label・下のプログラム例では 1000 あ
るいは 2000) の文に無条件に制御が移されます(ジャンプする という).文番号は,1∼5 カラム目に書い
ておく任意の番号で,プログラムに同じ番号が他にあってはいけません.
通常,プログラムは上の行から順に実行されていきますが,goto 文を使うとプログラムの流れを変える
ことができます.このような文を制御文と呼びます.
3
練習・宿題
1. 次の漸化式で与えられる数列 xi , (i = 1, 2, . . .) は a の三乗根に収束する.
xi+1 =
2xi +
a
x2i
/3,
x1 = 1
この漸化式を用いて 3.0 の三乗根を求めよ.なお,収束の判定は |xi+1 − xi | < 1.0 × 10−6 とする.
2. exp(x)(ex )のマクローリン展開は次式で与えられる.
x2 x3
xn
x
+
+···+
+···
exp(x) = 1 + +
1! 2!
3!
n!
この展開式に基づいて,e の値を求めよ(exp(1) を求めればよい).なお,計算は
となったときに打ち切るものとする.
xn
< 1.0 × 10−6
n!
3. 整数値 m を入力させ,m が素数かどうか出力するプログラムを作成せよ.素数の判定は m を 2
∼m/2 で順に割っていき,割り切れる(余りが 0)かどうか確かめればよい.
(検算はこちらで:
http://homepage2.nifty.com/hiranouchi/prime/index.html)
4. 二分法(bisection method)は,解を含む区間の中間点を求める操作を繰り返すことによって方程式
f (t) = 0 を解くアルゴリズムの一つである.ニュートン法が収束が速く有名であるが,二分法はア
ルゴリズムが簡単でプログラムが容易,かつ,微係数を使わないので計算が安定しており,使いや
すい.
1. 解は f (t0 ) × f (t1 ) ≤ 0 となる t0 ,t1(t0 < t1 )の間にある.まず,初期値として t0 ,t1 の値を適
当に定める.
2. t0 ,t1 の中点を t とする(すなわち t = (t0 + t1 )/2).もし,f (t0 ) × f (t) ≤ 0 であれば,解は t0
と t の間にあるので,この t を新たな t1 とする.また,f (t0 ) × f (t) > 0 であれば,解は t と t1
の間にあるので,t を新たな t0 とする.
3. t0 と t1 の差が十分小さくなるまで 2. を繰り返す.
上記の方法を用いて,
t − cos t = 0
の解を求めよ.2 つの初期値は t0 = 0.0,t1 = 1.1,収束判定は t1 − t0 < 1.0 × 10−6 とする.
4