平成
29年度
情報基礎演習
Ⅰ
第
6回 演習
担当 光武 雄一 授業のWebsite: http://web.me.saga-u.ac.jp/~mitutake/info1/info1.html メールアドレス: [email protected]先週のレポート課題についてのコメント
データの入出力および計算式の記述について 実数計算式中の定数は,すべて小数点をつけた実数型とする READ文によるデータ入力を行なうときは,入力のメッセージにより何を 入力すればよいのか分かるように工夫する. WRITE文で計算結果を出力するときは,単に数値だけを出力するので はなく,記号などを使って分かり易くする. 良くできたプログラムとは,正しい処理を行って結果を返すだけでなく, ユーザーが関わる入力および出力において,プログラムの内部処理を 知らない人でも正しく使いこなせるユーザーフレンドリーなインターフェー ス設計を施されたプログラムである. 物理量の入力・出力においては,単位の指定が必須となる. 何も指示がなければ,,k,Mを混在して入力される恐れもある. レポートの提出について 指示が守られていないレポート(メールの件名無記入,実行プログラム の送付など)については,今後コメントなしに減点する.REPORT0509の解答例
PROGRAM PROBLEM2_4 ! 並列接続した抵抗R1,R2の合成抵抗Rの計算
IMPLICIT NONE REAL :: R1, R2, R
WRITE(*,*) ‘Input R1(ohm), R2(ohm)=>‘ READ(*,*) R1, R2
R = 1.0/(1.0/R1+1.0/R2)
WRITE(*,*) 'R = ', R, ‘ (ohm)‘ STOP
END PROGRAM PROBLEM2_4
文字列のメッセージは,その前後を‘(Single quotation)で囲む.
文字列中で‘を出力したいときは, ‘を二つ並べるか“(Double quotation)をタイプする WRITE文で,文字列,変数を並べて出力するときは,その間を” ,”(Comma)で区切る.
第
7回目 演習内容
簡単な計算と入出力 総合演習 (教科書p.30~35) 整数型と整数型の混合演算 多項式の計算(30ページ) 関数の使い方(32ページ) 角度の単位変換(34ページ)実数と整数の混合計算について
P.27参照
代入文では,代入される(左辺の)変数の型に自動的に変換される 整数と実数の混合計算・・・自動的に実数型として計算 同じ型同士の計算では,型の自動変換は生じない REAL::X, Y, Z INTEGER::A, B, C X = A/2 +1 ! 整数の計算結果を実数型に変換して代入 X = REAL(A)/2.0+1.0 ! 整数型変数Aを実数型に強制的に変換して,実数演算の結果を代入 B = Y+3.14 ! 実数が整数型に変換して代入 B = INT(Y)+3 ! 実数型変数Yを整数型に強制的に変換して,整数演算結果を代入 Z = 1.2*C ! 整数型変数Cを実数型に変換して,実数演算の結果を代入 変数の型を強制的に変換する関数 INT(X) 整数型への変換(小数切り捨て) Xは実数型変数 NINT(X) 整数型への変換(小数四捨五入) Xは実数型変数 REAL(I) 実数型への変換 Iは整数型変数 括弧の中のXやI(引数と呼ぶ)に型の変換を行う変数(数式も可)を記述する.計算の優先順位
算術演算子(+, -, *, /, **)の計算順序は, 累乗(べき乗) ** ← 今週新たに説明する演算子 乗算*,除算 / 加算+,減算- の順に行われるが,丸括弧( )があれば,括弧内の演算が優先 される. 優先順位が同じ場合,左から右へ実行される. ただし,累乗計算同士の場合は,右から左に実行 例) 4**3**2 ⇒ 49 括弧が重なっている場合には,一番内側の括弧の中の 計算が優先される.Fortranに標準で組み込まれている
関数 (テキスト
P.32)
X**Y XのY乗(累乗,べき乗)
ABS(X) Xの絶対値(ABSolute)
SQRT(X) Xの平方根(SQuare RooT)
MOD(M, N) MをNで割った余り(整数)(MODulus) MAX(A,B,C,…) A,B,C,・・・・・の最大値(MAXimum)
MIN(A,B,C,…) A,B,C,・・・・・の最小値(MINimum)
注)べき乗計算においてY乗のYが整数の場合,整数型定数の記述が許される が,本演習では実数計算でのべき乗について,常に実数型定数での記述とする.
Fortranの関数 (テキストP.33)
LOG(X) Xの自然対数 logeX
LOG10(X) Xの常用対数 log10X
EXP(X) Xの指数関数 eX
SIN(X), COS(X), TAN(X) Xの三角関数 ASIN(X), ACOS(X), ATAN(X) Xの逆三角関数 SINH(X), COSH(X), TANH(X) Xの双曲線関数
注意)
• 三角関数の引数Xの単位は,rad
角度degからradへの換算は,次式のように行なう.
RAD = DEG*4.0*ATAN(1.0)/180.0 または RAD = DEG*3.141593/180.0
• 逆三角関数のXの定義域は,主値の範囲
• 関数の引数Xには,変数名だけでなく,計算式の記述も可
三角関数の引数の単位について
教科書
p.34
Fortranで利用できる三角関数(sin,cos,tan)の引数および逆三角関 数(asin,acos,atan)の単位は,全てラジアンである. 度とラジアンとの間の単位換算は,以下の通り. 180 [deg] = [rad] 1 [deg] = /180 [rad] 1[rad] = 180/ [deg] 単位換算に用いるの値は,なるべく高い精度(実数計算の有効桁 数は,6桁程度)で与えないと,換算誤差が大きくなる, PI = 3.1416(5桁)△または PI=3.141593(7桁)◎を用いるか 逆正接関数atanを用いて, PI=4.0*atan(1.0)の計算式◎で与える.例題
2.4 多項式の計算の解説
p.30
多項式y=2x3+5x2+3x+1の値を計算するとき, Fortranプログラムでは,数式通りに a) Y = 2.0*X**3 + 5.0*X**2 + 3.0*X + 1.0 と書くことができるが,累乗演算子’**’を使わず, 積の形に展開した b) Y = ((2.0*X+5.0)*X+3.0)*X + 1.0 を用いて計算するのが定石である. 理由:累乗計算に伴う計算精度の低下を避けるため 例えば累乗計算x**3は,積の演算が3回行われる. a)の計算式では,8回の掛け算を実行 b)の計算式では,3回の掛け算を実行 演算回数が少ないほど,実数の演算に伴う桁落ち誤差が小さい 計算機における実数演算は,近似計算であるため,条件が悪い場合には,大きな 誤差を生じる場合があることに注意しなければならない計算式中の定数の型について
Y = ((2.0*X+5.0)*X+3.0)*X + 1.0 の定数に注目 ‘2.0’,’5.0’,’3.0’,’1.0’は実数型の定数 この計算では,XとYが実数型変数なので Y = ((2*X+5)*X+3)*X + 1 と書いても,整数型の定数が実数型へ自動的に変換して計算されるた め,場合は正しい結果が得られる. しかし,いつも正しい結果が得られるとは限らない.特に,整数の割り算に注意せよ.
X = 3/10は,0.3でなく 0.0となる → 実数の計算式中の定数には,無条件に小数点をつける癖をつけよう. レポートのプログラムで実数型定数とすべき所を整数型定数としたもの は減点とする.演習1(数式の計算)
p.30
教科書P.30の例題2.4を参考にして,問5のプログラ ムを作成し,実行せよ. ただし,プログラム名は,problem2_5,ソースファイル 名をprobem2_5.f95とせよ. 注意点) 多項式のべき乗は,積の形に分ける 式中の定数は,すべて実数型定数とする演習2(ヘロンの公式)
p.32
教科書P.32,問6 三角形の3辺の長さA,B,Cを入力し,三角形の面積Sを 求めるプログラムを作成し,実行せよ. ただし,プログラム名は,problem2_6,ソースファイル 名をprobem2_6.f95とせよ. 注意) データの入力・出力において,適切なメッセージをつける 実行結果は正三角形に対して確認して見よ.書式付き出力 (P.37)
例題2.8の計算結果を時分秒の出力をWRITE(*,*)で行うと, その表示は以下のようになる. しかし, 例題3.2と同様にWRITE(*,’(1X, I3, 3F9.6)’) で出力すると,各数値 の表示位置と桁数が揃えられて出力されている. このように,数値や文字列を出力する場合,WRITE文の(*,*)の2つ目の *の代わりに書式制御を指示するFORMAT文の行番号を記述する. WRITE(*, 601) H2, ‘JI ‘, ・・・・・・ FORMAT文内に記述した書式制御文字列をWRITE文の行番号の記述欄に 直接記述することもできる. WRITE(*,’(1X, I3, 3F9.6)’) N, X, Y, Z12JI 34HUN 56BYOU 7JI 31HUN 31BYOU
---5JIKAN 3HUN 25BYOU
時分秒の数値の表示が揃って いないので見にくい
時分秒の数値の表示が揃って いるので非常に見易くなる
12JI 34HUN 56BYOU 7JI 31HUN 31BYOU
書式付き出力
(P.37~39)
編集記述子 (各編集記述子の文字列は,カンマ“,”で区切る) nX n文字進める(指定した数だけスペースを入れるときに使う) In 整数型変数を±****の形式で表示.負号を含め全部でn桁 Fn.m 実数型変数を±**.******の固定小数点形式で表示 小数点,負号を含め表示が全n桁,小数点以下m桁 En.m 実数型変数を±**.*****E±**の指数部付き形式で表示 負号,小数点,指数部(4桁)を含め表示が全n桁,小数点以下m桁 Gn.m 実数型変数をF型とE型のいずれか自動選択して表示 An 文字型変数をn文字*****の形式で表示. 反復指定 kFn.m 編集記述子(Fn.m ) の書式指定をk回続ける(‘Fn.m, Fn.m, ・・・, Fn.m’と同じ) 行送り制御 書式制御文字列の最初の1字は,行送り制御コードと解釈(Fortranの処理系によって違う) 空白:シングルスペース(一行改行後出力) 0:ダブルスペース(二行改行後出力) 1:改ページして一行目より出力 最初の‘1X’は,改行して新しい行から表示 書式付きWRITE文の一例WRITE(*, ’(1X, I3, 3F9.6)’) DEG, S, C, T WRITE(*, '(1X, 2F15.7)’) X1, X2