例1
2つの分数の足し算
program ex01 implicit none! 構造体 bunsuuの定義 type :: bunsuu integer :: bunsi, bunbo end type bunsuu! bunsuu型の変数a,b,cの宣言 type (bunsuu) :: a,b,c a=bunsuu(1,2) b=bunsuu(1,3) c%bunbo=a%bunbo*b%bunbo c%bunsi=a%bunsi*b%bunbo+b%bunsi*a%bunbo!! 解説!! a=a1/a2, b=b1/b2のとき,!! a1 b1 a1*b2 + b1*a2! c=a+b = -- + -- = -------------! a2 b2 a2*b2!! 結果の出力 write(*,*)a%bunsi,'/',a%bunbo,'+' write(*,*)b%bunsi,'/',b%bunbo,'=' write(*,*)c%bunsi,'/',c%bunbo stopend program ex01実行例
$ ex01 1 / 2 + 1 / 3 = 5 / 6例2
構造体を扱うサブルーチンと関数の例
program ex02!! 構造体を扱うサブルーチンと関数の例! 分数の入出力を行うサブルーチン! 分数の和を計算する関数! implicit none! 構造体 bunsuuの定義 type :: bunsuu integer :: bunsi, bunbo end type bunsuu! bunsuu型の変数a,b,cの宣言 type (bunsuu) :: a,b,c,d,e,f! 分数a,b,cを読み込む call yomu('a=',a) call yomu('b=',b) call yomu('c=',c) d=wa(a,b) e=wa(c,d) f=wa(wa(a,b),c) call kaku('a+b = ',d) call kaku('c+d = ',e) call kaku('a+b+c = ',f) stopcontains !以下では構造体bunsuuが使える!分数の足し算を行う関数 function wa(a,b) implicit none type (bunsuu) :: wa type (bunsuu), intent(in) :: a,b! waの分子の計算 wa%bunsi=a%bunsi*b%bunbo+b%bunsi*a%bunbo! waの分母の計算 wa%bunbo=a%bunbo*b%bunbo return end function wa! 分数の読み込みを行うサブルーチン subroutine yomu(ji,a) implicit none character(*), intent(in) :: ji type (bunsuu), intent(out) :: a write(*,*)ji read(*,*) a%bunsi, a%bunbo return end subroutine yomu! 分数の書き出しを行うサブルーチン subroutine kaku(ji,a) implicit none character(*), intent(in) :: ji type (bunsuu), intent(in) :: a character(14) :: fmt='(1x,a,i3,a,i3)' write(*,fmt)ji,a%bunsi,' /',a%bunbo return end subroutine kakuend program ex02実行例
$ ex02 a=1,2 b=1,3 c=1,6 a+b = 5 / 6 c+d = 36 / 36 a+b+c = 36 / 36配列を構成要素にもつ構造体の例
!! 配列を構成要素にもつ構造体の例!module lorenz private integer, public, parameter :: ndim1=2,ndim2=3! 構造体systemの定義 type, public :: system! 構成要素はx1とx2 real,dimension (ndim1) :: x1 real,dimension (ndim2) :: x2 end type systemend module lorenzprogram ex03 use lorenz implicit none! 派生型の変数aを宣言(構成要素は配列x1とx2) type (system) :: a a%x1(1)=1 a%x1(2)=2 a%x2(1)=11 a%x2(2)=12 a%x2(3)=13 write(*,*)'a%x1' write(*,*)a%x1 write(*,*)'a%x2' write(*,*)a%x2 write(*,*)'a' write(*,*)aend program ex03実行例
$ ex03 a%x1 1.00000000000000 2.00000000000000 a%x2 11.0000000000000 12.0000000000000 13.0000000000000 a 1.00000000000000 2.00000000000000 11.0000000000000 12.0000000000000 13.0000000000000 配列を構成要素にもつ構造体の例
派生型が配列になる例
!! 配列を構成要素にもつ構造体の例! 派生型が配列になる例!module lorenz private integer, public, parameter :: ndim1=2,ndim2=3! 構造体systemの定義 type, public :: system! 構成要素はx1とx2 real,dimension (ndim1) :: x1 real,dimension (ndim2) :: x2 end type systemend module lorenzprogram ex04 use lorenz implicit none! 派生型の配列aを宣言(構成要素は配列x1とx2) type (system) :: a(2) integer i a(1)%x1(1)=1 a(1)%x1(2)=2 a(1)%x2(1)=11 a(1)%x2(2)=12 a(1)%x2(3)=13 a(2)%x1(1)=21 a(2)%x1(2)=22 a(2)%x2(1)=31 a(2)%x2(2)=32 a(2)%x2(3)=33 do i=1,2 write(*,*)'i=',i write(*,*)'a(i)%x1' write(*,*)a(i)%x1 write(*,*)'a(i)%x2' write(*,*)a(i)%x2 write(*,*)'a(i)' write(*,*)a(i) write(*,*) enddo !iend program ex04実行例
$ ex04 i= 1 a(i)%x1 1.00000000000000 2.00000000000000 a(i)%x2 11.0000000000000 12.0000000000000 13.0000000000000 a(i) 1.00000000000000 2.00000000000000 11.0000000000000 12.0000000000000 13.0000000000000 i= 2 a(i)%x1 21.0000000000000 22.0000000000000 a(i)%x2 31.0000000000000 32.0000000000000 33.0000000000000 a(i) 21.0000000000000 22.0000000000000 31.0000000000000 32.0000000000000 33.0000000000000