National Institute for Environmental Studies

2024年度前期
情報処理演習第4回

2024/05/01
平山 修久（減災連携研究センター）

データ型，定数，変数
Fortranには5種類の基本データ型
INTEGER：整数
REAL：実数

0，137，-2516，17745

1.234，-0.01536，+56473.，

337.456，3.37456E2
COMPLEX：複素数(a, b),(1.0, 1.0),(-6.0, 7.2)

CHARACTER：文字列，二重引用符またはアポスト
ロフィで囲まなければならず，両端に同じ記号。
名古屋大学減災連携研究センター

Disaster Mitigation Research Center, NAGOYA UNIVERSITY
12

数値関数

Tips

ABS(x) xの絶対値
COS(x) xラジアンのコサイン（余弦）EXP(x) 指数関数
INT(x)

x以下の最大の整数

Integer, RealFRACTION(x) xの小数部分
LOG(x)

Real, Realxの自然対数

MAX(x1, x2, …, xn) x1,,,xnの最大値
MIN(x1, x2, …, xn)

Integer
RealReal

前回の課題では、

x1,,,xnの最小値

MOD(x, y) xをyで割った余り，x - INT(x/y)*y
NINT(x) xの最も近い整数
REAL(x) xを実数型に変換
SIN(x) xラジアンのサイン（正弦）SQRT(x)整数，実数の演算規則について
Integer, Integerxの整数部分FLOOR(x)LOGICAL：論理変数，.TRUE.，.FALSE.

9/5*Celsius+32

9/5は1，1*Celsius

9*Celsius/5+32

9*Celsiusは実数

1.8*Celsius+32.

xの平方根

TAN(x) xラジアンのタンジェント（正接）3SQRT(x)：xは実数（Real）
4本日の目標単純論理式
論理定数（.TRUE.と.FALSE.）
式1関係演算子式2演算子< または .LT.

> または .GT.

条件による分岐を扱える。

.EQ. または<= またはp.LE.

>= または.GE.

/=.NE.

または56

複合論理式

IF構文

.NOT.（否定），.AND.（論理積），.OR.（論理最も単純な選択構造和），.EQV.（等価），.NEQV.（排他的論理和）

IF (論理式) THEN

q==p.NOT. p.TRUE.
.FALSE.

.FALSE.
.TRUE.

意味より小さいより大きい等しい以下
以上等しくない

真文の並び

論理式

END IF

偽文の並び

p .AND. q

p .OR. q

p .EQV. q

p .NEQV. q.TRUE. .TRUE.

.TRUE.

.TRUE.

.FALSE.

.TRUE.

.TRUE. .FALSE.

.FALSE.

.TRUE.

.FALSE.

.TRUE.

.FALSE. .TRUE.

.FALSE.

.TRUE.

.FALSE.

.TURE.

.FALSE. .FALSE.

.FALSE.

.FALSE.
7.TRUE.

.FALSE.

IF (X >= 0) THENY = X * XZ = SQRT(X)
END IFIF (1.5 <= X .AND. x <= 2.5) PRINT *,X
8課題4̲1 判別式を用いて二次方程式の解を求める。

IF構文の汎用形式

� �� + � � + � = �
真IF (論理式) THEN

論理式

偽-� ±

文の並び1ELSE

解の公式を使って解く

文の並び1文の並び2文の並び2

�� - � � ���

アルゴリズム1.A, B, Cを入力する。

2.判別式（Discriminant）を計算する。

END IF

3.Discriminant ≥ 0であれば，2つの根を計算して表示
4.そうでなければ判別式の値と実根なしのメッセージを表示
910IF-ELSE IF構文

IF-ELSE IF構文例
成績（S,A,B,C,F）を評価する。

3つ以上の選択肢が含まれるとき

IF-ELSE IF構文を使うとIF (論理式1) THEN

IF (論理式1) THEN

文の並び1

文の並び1

ELSE

ELSE IF (論理式2) THEN
IF (論理式2) THEN

文の並び2文の並び2ELSE

ELSE IF (論理式3) THEN
文の並び3文の並び3ELSE

END IF
END IF

文の並びn

END IF
11

IF (N >= 90) THEN
PRINT *, “S”
ELSE IF (N >= 80) THEN
PRINT *, “A”
ELSE IF (N >= 70) THEN
PRINT *, “B”
ELSE IF (N >= 60) THEN
PRINT *, “C”
ELSE
PRINT *, “F”
END IF12CASE構文
SELECT CASE (場合式)
CASE (場合値リスト1)
文の並び1
CASE (場合値リスト2)
文の並び2
CASE (場合値リスト3)
文の並び3
END SELECT
場合式は，整数式，文字式，論理式

場合値リストは，場合式が取りうる1つ以上の値を括弧で囲んだリストか，
キーワードDEFAULT(値)【単一の値】，(値1:値2）【値1から値2までの範囲】，(値1:）【値1以上のすべての値の集合】，(:値2）【値2以下のすべての値の集合】

CASE構文例ClassCodeでクラスを表示する。
SELECT CASE (ClassCode)
CASE (1)
PRINT *, “Freshman”
CASE (2)PRINT *, “Sophomore”
CASE (3)PRINT *, “Junior”
CASE (4)PRINT *, “Senior”
CASE (5)PRINT *, “Graduate”
CASE DEFAULTPRINT *, “Illegal class code”, ClassCode
END SELECT

1314IF-ELSE IF構文例とCASE構文例

課題4̲2 水道料金を計算する

SELECT CASE (N)CASE (90:100)

IF (N >= 90) THEN
PRINT *, “S”

PRINT *, “S”
CASE (80:89)
PRINT *, “A”
CASE (70:79)

ELSE IF (N >= 80) THEN
PRINT *, “A”
ELSE IF (N >= 70) THEN
PRINT *, “B”

名古屋市上下水道局の水道料金（一般用口径13ミリ）を計算し，使用水量と水道料金（小数点以下は切り捨て）を表示するプログラムを作成する。

PRINT *, “B”
CASE (60:69)
PRINT *, “C”

ELSE IF (N >= 60) THEN
PRINT *, “C”
ELSE

CASE DEFAULTPRINT *, “F”

PRINT *, “F”
END SELECTEND IF15

名古屋市上下水道局，https://www.water.city.nagoya.jp/category/suidouryoukin/1094.html
16

アルゴリズム
1. 基本料金 1375 を初期値入力する。
2. 前回のメータ指示値 meter_0，今回の指示値 meter_1を入力する
3. 今回の使用水量Amountを計算する。
4. 使用水量で選択実行し料金を計算する（IF文もしくはCASE文）
1. 使用水量が13〜20のとき，基本料金+(使用水量-12)×11.00
2. 使用水量が21〜40のとき，基本料金+11.00×8+(使用水量20)×169.40
3. 使用水量が41〜60のとき，基本料金+11.00×8+169.40×20+(使用水量-40)×233.20
4. 使用水量が12以下のとき，基本料金
5. 使用水量と水道料金（小数点以下は切り捨て，INT関数を用いる）を表示する

17

今日（2024.05.01）の課題（2/2）
2. 名古屋市上下水道局の水道料金を計算する。水道メーターの前回の指示値と今回の指示値を入力し，今回の使用水量ならびに水道料金を計算し，使用水量と水道料金（小数点以下は切り捨て）を表示する。以下の4つのケースで実行する。実行結果のキャプチャー画面（kadai4̲2.png）
1) 前回指示値：102

今回指示値：1182) 前回指示値：138

今回指示値：1493) 前回指示値：187

今回指示値：2294) 前回指示値：253

今回指示値：282

19

今日（2024.05.01）の課題（1/2）
1. 二次方程式 Ax 2 + Bx + C = 0 を根の公式を使って求める。実根がある場合には，2つの実根を表示し，実根がない場合には，判別式の値と実根がないこと（”There are no real roots.”）を表示する。
以下の4つの方程式について実行して，正しい解が得られることを確認する。提出物はプログラム（kadai4̲1.f90）
x 2 − 5x + 6 = 0x2 − 4 = 0x2 + 4 = 0
3.7x 2 + 16.5x + 1.7 = 018