情報処理概論

今日の授業内容(第6回)

情報処理概論(第6回)

 DO構文(続き) 配列
 DO形並び情報基盤センター 井上 仁

DO構文の復習(1)

演習6-1 DO構文の復習(2)n回繰り返す
ある条件を満たす間繰り返す

前回の演習5-1(点数を入力して、成績を出力

DO i = 1, n
………
………
………
END DO

DO i = 1, n, 2
………
………
………
END DODO………
IF (n < 0) EXIT………
END DO

演習6-2 DO構文の復習(3)前回の演習5-1を、0以上の点数の入力に対して成績処理をし、負の数が入力されると処理を終了するよう変更しなさい。
PROGRAM point
INTEGER :: point
WRITE(*,*) '点数を入力してください'
READ(*,*) point
IF (point >= 80) THEN
WRITE(*,*) 'A(優)'ELSE IF (point >= 70) THEN
WRITE(*,*) 'B(良)'ELSE IF (point >= 60) THEN
WRITE(*,*) 'C(可)'ELSEWRITE(*,*) 'D(不可)'END IFSTOP
END PROGRAM point

第6回•繰り返し処理は?
•どの処理を繰り返すか?
•負の数が入力されたときに終了するには?

するプログラム)を、繰り返しの回数(n)を入力して、n回の成績処理ができるよう変更しなさい。
PROGRAM point
INTEGER :: point
WRITE(*,*) '点数を入力してください'
READ(*,*) point
IF (point >= 80) THEN
WRITE(*,*) 'A(優)'ELSE IF (point >= 70) THEN
WRITE(*,*) 'B(良)'ELSE IF (point >= 60) THEN
WRITE(*,*) 'C(可)'ELSEWRITE(*,*) 'D(不可)'END IFSTOP
END PROGRAM point•nの入力は?

•繰り返し処理は?
•どの処理を繰り返すか

DO構文の復習(4)
記述しないDOWRITE(*,*) '点数を入力してください'
READ(*,*) point
IF (point <0) EXIT
IF (point >= 80) THEN
WRITE(*,*) 'A(優)'………………
END IF
END DO1

情報処理概論

成績出力の処理(データがある間)
 点数を入力して成績を出力する処理を繰り返すプロ
グラムを作成する。 入力データが終ると繰り返しを終了する。
85
63
78

→ A(優)→ C(可)→ B(良)→ 終了

無限ループには、DO構文を使用
DO....
END DO 入力データが終わると(Ctrl-Dを入力すると)DO

ループを抜ける(指定された行番号に制御が移る)
READ(*,*,END=10) a....
10 CONTINUECONTINUE文 何もしない実行文

 READ文では、入力待ち状態が続く。
 入力データの終わりはどうやって表すか?
Ctrl-Dを入力

演習6-3

プログラムの一部
DO
WRITE(*,*) '点数を入力してください'
READ(*,*,END=10) point
IF (point >= 80) THEN
WRITE(*,*) 'A(優)'.............................
END IF
END DO
END=10 入力データが終わったら、10 CONTINUE
行番号10 に制御を移す

10進数から2進数への変換(1)6 (10進数) → 110 (2進数)
13(10進数) → 1101 (2進数)
10進数：nk*10k-1+nk-1*10k-2+…+n2*101+n1*100
２進数：nk* 2k-1+nk-1* 2k-2+…+n2* 21+n1* 20

第6回

解法の説明

 点数を入力して成績を出力する処理を繰り返すプログラムを作成して実行しなさい。 ただし、入力データが終ると(ctrl-Dが入力されると)繰り返しを終了する。

2進数への変換プログラム(1)PROGRAM binary
INTEGER :: nWRITE(*,*) ’非負整数を入力してください’

2621323･･･ 026･･･ 121･･･ 123･･･ 0READ(*,*) nDO
WRITE(*,*) mod(n,2)
n = n/2
IF (n == 0) exit
END DOSTOP0･･･ 121･･･ 1END PROGRAM binary0･･･ 1

n=6mod(6,2) → 0 (出力)n ← 6/2 (=3 ≠0)n=3mod(3,2) → １ (出力)n ← 3/2 (=1 ≠0)

DOEXITEND DO

n=1
mod(1,2) → １ (出力)n ← 1/2 (=0 ＝0)2

情報処理概論

2進数への変換プログラムの問題点
逆向き1行に表示されない

配列
一般の変数a非負整数を入力してください60
11b

変数名で指定配列
添字で指定

a出力する値を保存しておいて、逆順に出力

添字

1 2 3a(1) a(2)

110

配列の宣言

n-1 na(n)10進数から2進数への変換(2)一般の変数の宣言

26INTEGER :: a,b23･･･ 00digit(1)配列変数の宣言

21･･･ 10digit(2)0･･･ 10INTEGER :: a(1:20), b(1:20)
INTEGER :: c(20), d(-5:5)
INTEGER, DIMENSION(1:20) :: a, b
※添字の下限は省略してよい(1となる)

place

00になるまで繰り返す

0digitdigit(2) digit(1)12進数への変換プログラム(2)

第6回

DO i = place, 1, -1
WRITE(*,*) a(i)END DO32

1100

DO形並びによる出力

変数の初期化....
INTEGER :: n, i, place = 0, digit(1:32)
WRITE(*,*) ’非負整数を入力してください’
READ(*,*) nDO
0 1 1
place = place + 1
digit(place) = mod(n,2)
n = n/2
1 2
IF (n == 0) exit
END DO
DO i = place, 1, -1
WRITE(*,*) digit(i)END DO....

1110といった出力しかできない

WRITE(*,*)
digit(place),…,digit(2),digit(1)WRITE(*,*) (digit(i), i = place , 1, -1)
1 2 3 という出力が可能

DO形並び

3情報処理概論

演習6-4

DO形並び
(値の並び, 変数 = 始値,限界値,増分値)

結果の出力にDO形並びを使った2進数への変換プログラムを完成させなさい。

前回の9×9の一覧を、DO形並びを使って(digit(i), i = place, 1, -1)(i**2, i = 1, 10)('#' , i = 1, 10)
WRITE(*,*) (i*j, j = 1, 9)

9×9の表を出力するように変更しなさい。

DO i = 1, 9
DO j = 1, 9
WRITE(*,*) i*j
END DOENDO DO

次回予定(第7回)
ベクトル・行列の計算
書式制御
第一回レポートについて

第6回

4