平成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)
© Copyright 2024 ExpyDoc