2. 簡単な計算 目次へ 2.1. 算術演算 2.1.1. 基本的な文 2.1.2. 文字列の出力 2.1. 算術演算 2.1.1. 基本的な文 例題 2_1「2つの正の数値を読み込んで,その算術平均,幾何平均,調和平均を 求める。」[ex2_1.f90] ←クリックすると「ex1_1.f90」が表示されますが, 中身は同じです。Download して実行できます。 ! --- 3種類の平均値 --- PROGRAM Example_2_1 REAL :: a, b, av1, av2, av3 READ *, a, b av1 = (a + b)/2.0 av2 = (a*b)**0.5 av3 = 2.0/(1.0/a + 1.0/b) PRINT*, av1, av2, av3 END
[実行例] 1.0 2.0 ←キーボードから入力(a,bの値) 1.500000 1.414214 1.333333 ←結果を画面へ出力 =============================================================================== a + b a-1 + b-1 -1 算術平均 = ----- 幾何平均 = (ab)1/2 調和平均 = (---------) 2 2 =============================================================================== (プログラムの説明) PROGRAM文 プログラムの開始を宣言する文で,省略可能。 REAL文 変数a,b,...を実数型データを表す変数として用いることを宣言(予約)す る。整数型データとして扱う場合には,INTEGER と宣言する。 変数名 a,bのように意味の無いものでもよいし,av1,av2,av3 のように意味らしき ものを持ったものでもよい。数学で使う変数との違いは,xyのように2文字で書いても x×y ではなく,あくまでも一つの変数であることである。約束は,一つの変数は 「先頭が英字で,英字,数字,下線の組み合わせで長さ31字以内」 である。 入出力文(デフォルト仕様) READ *, データを表す変数のリスト READ(*,*) データを表す変数のリスト PRINT *, 変数や定数,式などのリスト WRITE(*,*) 変数や定数,式などのリスト 入出力ともに,どちらの形でもよい。*印はこのとおりに書くこと。「,」に注意。 データの入力 READ*文が実行されるとデータ入力待ちの状態になる。複数のデー タを入力するときは,コンマ(,) 空白 または 改行 で区切り,一つのデータの途中に 空白があってはならない。 代入文: 右辺の値を評価して左辺の変数の値として代入する実行文 変数 = 変数,定数,式 など 例 sum = sum + x 算術演算(加減乗除およびベキ) 2項演算: 和(+),差(-),積(*),商(/),ベキ(**) 単項演算: + - (例 -a) 演算の優先順:かっこ( )でくくられていない限り 和,差 < 積,商 < ベキ の順位で行われ,同順位ならベキ演算は右から,それ以外は左から処理される: 例 x + y*z は x + (y*z) x*y**2 は x*(y**2) x/y/z は (x/y)/z x**y**z は x**(y**z) 間違いやすい例:「4b分のa」は a/(4*b) または a/4/b 間違い: a/4*b , a/4b 確信がないときには( )を使うこと。処理時間には殆ど影響しない。 END文 プログラムの終りを表すもので必須。これに対して PROGRAM文は任意。 (数値データの型)数値データには1章で定数について説明したように整数,実数, 複素数,および各々について高精度のデータがある。この章ではすべて標準精度の実数 データを想定している。異なる型のデータの間の演算規則については,4章4.5.で扱う。 2.1.2. 文字列の出力 例題2_1では,READ文の実行でデータa,bの入力待ちの状態となるが,コンピュータは 沈黙したままであり,いったい何が要求されているのか,プログラムの作成者以外には わからない。作成者でも少し時間がたつと忘れてしまう。また,PRINT文で出力された データも,それが何を意味するのか分からない。これでは困るので,「何を要求されて いるのか」「何が出力されたのか」が分かるような工夫が必要である。 文字列の出力 PRINT *, 文字列データ WRITE(*,*) 文字列データ 文字列データ 文字列を ' ' または " " で囲んだもの 例題 2_2「直円錐の底面の半径rと高さhを入力して体積と表面積を求める。」[ex2_2.f90] ! --- 直円錐の体積と表面積 --- REAL :: pi, r, h, v, s pi = 3.141593 PRINT*,'Hankei r and Takasa h ?' READ*, r, h v = pi*h*r**2/3.0 s = pi*r*(r + (r**2 + h**2)**0.5 ) PRINT*,'Taiseki =', v PRINT*,'Hyomenseki =', s END
[実行] Hankei r and Takasa h? ← 何を入力待ちになるかが画面で明確に分かる。 3.0 5.2 Taiseki = 49.00885 ← 何の値かが分かる。 Hyomenseki = 84.85442 ← 〃 例題 2_3 「与えられた整数の2乗から5乗までのベキ乗を順に求める。」[ex2_3.f90] !----- 累乗 --- INTEGER :: m, n PRINT*, "Input an integer:" READ*, n m = n m = m*n ; PRINT*, m m = m*n ; PRINT*, m m = m*n ; PRINT*, m m = m*n ; PRINT*, m END
例題 2_4 「関数の値の計算」(文関数→8章)[ex2_4.f90] ! --- 関数の値の計算 --- REAL :: f, x, a f(x) = x**5 + 6.0*x**4 + 2.0*x**3 + x**2 + 4.0 ! 簡単な関数の定義 READ*, a PRINT*, ' f(', a, ')=', f(a) END
⇒2章先頭へ ⇒3章へ