第14回 7/21

平成27年度
情報基礎演習Ⅰ
第14回 演習
担当 光武 雄一
授業のWebsite: http://web.me.saga-u.ac.jp/~mitutake/info1/info1.html
メールアドレス: [email protected]
第14回 演習内容






先週の課題の解答例と解説
復習 IF文の構文
バブルソート法を用いたデータの並び替え
折れ線関数の表作成
閏年の計算
BMIの計算
REPORT0714 課題1 解答例
(1)二次方程式ax2+bx+c = 0の係数a,b,cを入力
(2)解の判別式D=b2-4acを計算
(3)Dが正のとき、以下の処理を行う。
(3-1) 実数解X1=(-b+D1/2)/(2a)を計算
(3-2) 実数解X2=(-b-D1/2)/(2a)を計算
(3-3) 異なる2実数根x1, x2を出力
(4)Dが0のとき、以下の処理を行う。
(4-1) 重複解X = -b/(2a)を計算
(4-2) 重根Xを出力
(5)さもなければ、以下の処理を行う。
(5-1) 実数部T=-b/(2a)を計算
(5-2) 虚数部S=(-D)1/2/(2a)を計算
(5-3) 異なる2虚数根をT+Si、T-Siの形式で出力
REPORT0714 課題2 解答例
integer:: i, imax, n
real, dimension(100):: a
real:: saidai
read(*,*) n
! データー個数
read(*,*) a(1:n) ! read(*,*) (a(i), i=1,n) と同じ
saidai = abs(a(1)) ! 絶対値最大の暫定初期値を設定
imax = 1
! 絶対値最大の配列番号の暫定初期値を設定
do i =2, n
! i = 2からnまで,順番にa(i)とsaidaiを比較する
if (saidai<abs(a(i))) then ! |a(i)|が絶対値最大を超えるデータのとき
imax = i
! saidaiとimaxの値を更新する.
saidai = abs(a(i))
end if
end do
write(*,*) ‘index No. of absolute maximum : ’, imax
write(*,*) ‘absolute maximum : ’, a(imax)
IF文を用いた判断・分岐処理の
プログラム記述法1
[基本形IF文(IF THEN ELSE)の記述]
IF (条件式) THEN
処理内容1
ELSE
処理内容2
END IF
!
!
!
!
!
もし 条件式が成立する時には(必須)
処理内容1を実行しなさい.(必須)
さもなければ(条件式が不成立の場合)(省略可)
処理内容2を実行しなさい. (省略可)
IF文の終わり (必須)
注)処理内容1,2は,それぞれIF・・・THENとELSEおよびELSEとEND IF文の間に記述し,何行でも書くことがで
きる.処理内容2が不要の場合,ELSEと処理内容2を省略できる.処理内容の中でIF文を記述した入れ子のIF
文も記述できるが,必ずその中にEND IF文を記述してIF文の構造を閉じなければならない.
[ブロック構造による基本形IF文のアルゴリズム記述法]
(1) ○○○(条件式)が成立するならば,以下の処理を実行する.
(1-1) 処理内容1 (1)
(1-2) 処理内容1 (2)
:
(2) そうでなければ,以下の処理を実行する.
(2-1) 処理内容2 (1)
(2-2) 処理内容2 (2)
:
IF文を用いた判断・分岐処理の
プログラム記述法2
IF THEN・・・ELSE・・・END IFの基本形において,1)条件成立時の処理内容が1
つ,かつ,2) 条件不成立時の処理内容2がない場合には,以下の単純IF文を用
いることができる.
[単純IF文の記述]
IF (条件式) 処理内容 ! 条件式が成立時に1つの処理内容を実行.
[ブロック構造による単純IF文のアルゴリズム記述法]
(1) ○○○(条件式)が成立するならば, △ △ △ (処理内容)を実行する.
注)単純IF文では,処理内容は1つ,つまり1行しか記述できないことに注意.
THEN,END IF文は不要であり,書くと文法エラーとなる.
IF文を用いた判断・分岐処理の
プログラム記述法3
条件式に応じて処理内容1~Xまでの
[拡張形IF文(IF THEN・・・ELSE IF)の記述] いずれか1つの処理内容が実行される
IF (条件式1) THEN
! もし 条件式1が成立する時には, (必須)
処理内容1
! 処理内容1を実行. (必須)
ELSE IF (条件式2) THEN ! さもなければ,条件式2が成立時には, (必須)
処理内容2
! 処理内容2を実行. (必須)
ELSE IF (条件式3) THEN ! さもなければ,条件式3が成立時には,
処理内容3
! 処理内容3を実行
:
:
ELSE
! 全ての条件式が成立しないとき,(省略可)
処理内容X
! 処理内容Xを実行(省略可)
END IF
! IF文の終わり(必須)
注)ELSE IF(条件式3)~ELSE文の間には,必要なだけELSE IF文とその条件成立時の
処理内容を繰り返し書くことができる.また,各処理内容は何行にも渡って記述可.
条件式の記述方法1 p.96
条件式とは,等号・不等号を用いて記述された論理式である.
論理式の計算結果は,真(条件成立)か偽(条件不成立)の値で評価される.条件
式が真の場合THEN以下の処理内容が実行され,偽の場合ELSE以下の処理内容
が実行される.
(記述例)

IF (P = = Q) THEN
!P=Q

IF ((A-B) < 0.01*C) THEN
! A-B < 0.01C

IF ((P > 5.0).AND.(P < 15.0)) THEN
! P > 5.0かつP < 15.0
注意:(5.0 < P < 15.0)と書けない
等式・不等式の記述方法
数学での表現
P<Q
P≦Q
P=Q
P≧Q
P>Q
P≠Q
条件式での記述
P<Q
P <= Q
P == Q (注:イコール2つ)
P >= Q
P>Q
P /= Q
条件式の記述方法2 p.96
[論理演算子]
AとBを(P==Q)のような等号・不等号で示される論理式とするとき,A,Bの論理和,
論理積およびAの否定は,以下の論理演算子を用いて記述する.論理演算子に
よってより複雑な論理式を作ることができる.
例えば,FORTRANでは,数学で用いるA< B <Cの条件式をそのまま記述した
IF (A<B<C) THEN の記述が許されていない.
(A < B)と(B < C)の論理積を取り,IF ((A<B).AND.(B<C)) THEN と記述しなけ
ればならない.
論理演算子の種類とその記述方法
数学での記述
条件式での記述
論理積(かつ)
A⋂B
A .AND. B
論理和(または)
A⋃B
A .OR. B
否定(ではない)
A
.NOT. A
演習1 例題5.4データの並び替え
バブルソート法のアルゴリズム
一組のデータ(x1,x2,x3,・・・,xN )を大きさの順
昇順(小さい方から大きい方への順) 或いは
降順(大きい方から小さい方への順)に並び替える(Sorting)
ためのアルゴリズムの1つにバブルソート(Bubble Sort)と呼
ばれるものがある.その手順は以下の通りである.
1)隣り合う2つのデータを比較し,
正順(望ましい順番)になっていれば何もしない
逆順になっていれば,データを入れ替える
という処理を列の最初から最後まで行う
2)上記処理を何回も反復する.何回繰り返せば良いか考えよ.
バブルソート法による昇順の並び替え1
データ個数N=4の場合
初期状態の
カードの並び
1
2
3
4
6
3
5
1
★1回目の並び替え
大小比較して正順ならそのまま,逆順なら入れ換える
1)1番目と2番目
を比較
6
3
5
1
2)2番目と3番目
を比較
3
6
5
1
3)3番目と4番目
を比較
3
5
6
1
1
6
1回目の並べ替え
の終了時の状態
3
5
最も大きい数値が1番右に来ているので,次
回は,1から3番目まで大小の比較を行うと
よいことが分かる
バブルソート法による昇順の並び替え2
データ個数N=4の場合
1
初期状態
3
2
3
4
5
1
6
比較して正順ならそのまま,逆順なら入れ換える
★2回目の並び替え
1)1番目と2番目
を比較
3
5
1
6
2)2番目と3番目
を比較
3
5
1
6
3
1
5
6
2回目の並べ替え
の終了時の状態
2番目に大きな数値が右から2番目
に来る
バブルソート法による昇順の並び替え3
データ個数N=4の場合
1
初期状態
3
★3回目の並び替え
1)1番目と2番目
を比較
3回目の並べ替え
の終了時の状態
2
3
4
1
5
6
比較して正順ならそのまま,逆順なら入れ換える
3
1
5
6
1
3
5
6
並び替え終了!
3番目に大きな数値が右から3番目
に来る
バブルソート法のアルゴリズムのまとめ
1)以下に示す2)のデータの並び替え処理を最大N-1回反復すれ
ば並び替えの結果を得ることができる
2)第i回目の並び替えでは,となり合うデータ同士の大小比較を
1~N - i 列目までのデータについて行えば十分である.
(N-i+1列目からN列目までは並び替えが終了しているので不要)
ブロック構造によるバブルソート
法のアルゴリズム
ブロック構造のアルゴリズム記述法でバブルソートのアルゴリズムを
示すと以下の通りとなる.なるべく教科書の例題プログラムを見ずに
アルゴリズムに従って,昇順に並び替えるプログラムを作成せよ.
プログラム名は,reidai5_4とする.
(1) I =1から N-1まで、以下の処理を繰り返す。
(1-1) J=1 から N – I まで以下の処理を繰り返す.
(1-1-1) 隣り合うa(J)とa(J+1)を比較して,逆順ならば,
a(j)とa(j+1)のデータを入れ換える.
(2) 並び替えがすんだ配列変数aの値を出力する.
注意)データの入れ換えについては,次ページの解説を読んで下さい.
部分行列 教科書p.82,83
これまで配列変数の入出力,代入文などのプログラムでは,配列変数への
アクセスをDO文やDO型並びを用いて行っていた.部分行列の記法を用いる
と同等のプログラムが簡単に記述できる.
部分行列の記法
一次元配列:A(配列番号の範囲)
二次元配列:A(行番号の範囲,列番号の範囲)



番号の範囲指定は,何番から:何番まで:増分で記述する.
何番から,何番までを省略したときは,配列の宣言サイズの範囲と一致.
増分を省略したときは,増分は1と見なす.
部分行列のプログラム例
例1) 一次元配列
real, dimension(10)::a
read(*,*) a(:)
read(*,*) a(1:3)
read(*,*) a(1:5:2)
⇒ read(*,*) (a(i), i = 1, 10) ! a(1)~a(10)
⇒ read(*,*) (a(i), i = 1, 3) ) ! a(1),a(2),a(3)
⇒ read(*,*) (a(i), i =1, 5, 2) ! a(1), a(3), a(5)
例2)二次元配列
real, dimension(10,10) :: a
real, dimension(10) :: b, c
b(:) = a(i, :)
c(:) = a(:, j)
do j=1,10
b(j) = a(i, j) ! ベクトルbは行列aのi行の行ベクトル
end do
do i=1, 10
c(i) = a(i, j)
end do
! ベクトルcは行列aのj列の列ベクトル
変数の値の入れ替え
A(J)とA(J+1)の値を入れ替える場合,単純に以下の処理を実行しても,
処理後のA(J)とA(J+1)の値は,いずれも処理前のA(J+1)の値となる.
A(J) = A(J+1)
A(J+1) = A(J)
何故なら,FORTRANで記述する数式の“=”は,右辺から左辺の変数
への代入を行う処理なので,2行目でA(J+1)に代入するA(J)の値は,1
行目の代入式でA(J+1)の値に書き換えられているからである.
正しくデータの入れ替えを行うには,1番目の式で変更される変数の値
を中間変数Wに代入して保存しておき,この変数の値を2番目の式の代
入で用いる必要がある.
W =A(J)
W = A(J+1)
A(J) = A(J+1)
或いは.
A(J+1) = A(J)
A(J+1) = W
A(J) = W
配列変数への値の設定1
一次元配列の場合 教科書p.79
配列変数への値設定方法として、DO文を用いた繰り返し処理での要素への代入の他
に、配列構成子を用いた 1) 配列宣言文での初期値代入
2) 配列要素への一括代入
の方法がある
書式
1) 変数型名, DIMENSION(寸法) :: 配列変数名 = 配列構成子
2) 配列変数名 = 配列構成子
配列構成子のデータの並びの順番
配列構成子
(/値,値,値,・・・・,値/)
(数式、変数名=始値, 終値, 増分)
:配列要素の応じて値を直接指定
:DO文に準じた数式による値指定
□
□ □ □
記述例
INTEGER,DIMENSION(5)::A=(/1, 0, 1, 3, 4/)
⇒ A(1)=1、A(2)=0, A(3)=1, A(4)=3, A(5)=4
A=(2*I, I=0, 5)
← DO型並びの指定と同じ
⇒ A(1)=0.0, A(2) =2.0, A(3)=4.0, A(4)=6.0, A(5)=8.0
配列変数への初期値設定2
二次元配列の場合 p.79
配列構成子1のデータ並びの順番
書式
1) 型名, DIMENSION(行数, 列数) :: 配列変数名 &
= RESHAPE(配列構成子1,配列構成子2)
□
□

□

□
□ □ □
□ □ □
□ □ □

□ □ □
2) 配列変数名 = RESHAPE(配列構成子1,配列構成子2)
配列構成子1:一次元配列と同じ,ただし,1列目の列ベクトルから順に2列目,・・・・
(/値,値,値,・・・・,値/)
:配列要素の応じて値を直接指定
(数式、変数名=始値, 終値, 増分)
:DO文に準じた数式による指定
配列構成子2:一元配列のデータ並びを二次元配列の並びへ整形指示するためデータ
(/行数, 列数/)
:2次元配列の行数と列数を指定
記述例
INTEGER,DIMENSION(2,3)::A = RESHAPE((/1, 0, 1, 3, 4, 5/), (/2, 3/))
⇒ A(1,1)=1, A(2,1)=0, A(1, 2)=1, A(2, 2)=3, A(1,3)=4, A(2,3) = 5
1 1 4 
A

0
3
5


配列構成子1のデータ並びの順番は,
2次元配列の1列目の1行目,・・・・
1列目の2行目,・・・・
2列目の1行目,・・・・ となります.
例題5.4A
プログラム中のパラメータNN=5,N=NNに変更し,配列変数
Xへのデータの読み込み処理を配列構成子を用いた代入文
に書き直せ.ただし,プログラム名はreidai5_4aとする.
演習2 折れ線関数の計算
実数xが-1.0から2.0まで0.2刻みで変化するとき,以下に定義さ
れる関数f(x)の値(実数)を拡張形IF文を用いて計算し,xとf(x)
の値を数表として出力するプログラムを作成し,実行結果とともに
送付せよ.プログラム名はprogram0721_2とする.
f(x)
=
=
=
=
0
x
-x + 1
0
(x < 0)
(0 ≦ x < 0.5)
(0.5 ≦ x < 1)
( x ≧ 1)
演習3 閏(うるう)年の計算
西暦年Nを入力し,N年が平年か閏年かの判定結果を出力す
るプログラムを作成せよ.
ただし,閏年とは
「Nが400で割り切れる年」
または
「Nが4で割り切れるが100では割り切れない年」
である.
割り切れるかどうかを調べるには,整数の割り算の余りを与
えるMOD関数(教科書P.32)を用いよ.
2000,2012年は閏年,2015,2100,2200年は平年である.
プログラム名は,program721_3とする
演習4 BMI(Body Mass Index)
体重M[kg], 身長L[m]のヒトの体格係数であるBMIは次式で定義される.
BMI = M/L2
BMIによる体型分類は,以下の通り.
18.5未満
やせ型(Underweight)
18.5以上,25未満
標準体型(Normal range)
25以上
肥満型(Overweight)
MとLの値を読み込み,BMIと体型分類結果を出力するプログラムを作成せ
よ.ただし,プログラム名はprogram0721_4
とし,以下の入力データの結果で確認すること.



M=70kg,L=1.65m (Overweight)
M=51kg,L=1.65m (Normal range)
M=49kg,L=1.65m (Underweight)
今週の課題〆切7月27日19時
(Subject: report0721)
演習課題2,3,4のソースプログラムと実行結果をメールで送付
せよ.ただし,実行結果の確認は各問題のデータに対しておこな
うこと. (4点X3)