Fortranプログラムで、印刷データ列数をカスタマイズする3つの方法
3460 ワード
データ表示や後期のデータ処理を容易にするために、Fortranプログラムで印刷されるデータ列数を制御したい場合がありますが、write文ではフォーマットコントローラに変数を追加することはできません.実はいくつかのテクニックを通じて、これは実現することができます.
サンプルコードは次のとおりです.
まず、ユーザーによって出力される列の数を定義します.
例1では、配列aを印刷する.ここでは、Fortran 90が導入したwreiteオプションadvance='no'を用いて、印刷後に改行しないことを示す.このオプションは、Fortran 77コンパイラ(pgf 77、g 77など)には無効です.配列の要素が1つしか印刷されないたびに、データ番号が列数で割り切れる場合は、空のwriteコマンドを実行して改行します.出力は次のとおりです.
例2、配列bを印刷する.ここでは文字列frmtを用いて出力フォーマットを格納し,write文を用いてカスタムの整数列数を文字としてfrmtに印刷し,frmtが予め残した2番目から5番目の文字位置をユーザ定義の列数に変更する.上記の例ではfrmtを(3 f 1.3)に変更した.私たちは一般的に数列から数十列しか出力しないので、4文字の位置を予約するのは一般的に十分です.出力:
例3では、配列cを印刷する.この例は例2の拡張と見なすことができ,出力がより柔軟である.列数だけでなく、各要素の出力フォーマットもユーザーがFortranのフォーマットに従って定義します.例:
それからFortran形式によって、前後のかっこをつけます.出力は次のとおりです.
ユーザがカスタマイズしたフォーマットが必ずしも文法に合致するとは限らない.正式なプログラムである場合は、writeにエラー判断を加えたほうがいいです.与えられたフォーマットの出力が実行できない場合は、デフォルトのフォーマットで出力します.
補足:CVFおよびIntelコンパイラでは、列の数を大きい番号と小さい番号で指定できます.例:
出力:
サンプルコードは次のとおりです.
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
dimension a(20),b(20),c(20)
character*100 frmt
a=1.d0
b=2.d0
c=3.d0
write(*,*)"Please specify the number of columns (default: 5):"
read(*,*) ncol
if(ncol .lt. 1) ncol=5
write(*,"(/,'a=')")
do i=1,20
write(*,"(f20.12)",advance='no')a(i)
if(mod(i,ncol) .eq. 0) write(*,*)
end do
write(*,*)
frmt='( f11.3)'
write(frmt(2:5),"(i4)")ncol
write(*,"(/,'b=')")
write(*,trim(frmt))b
write(*,*)
write(*,*)"Please specify the format (for example, 5f12.6):"
read(*,*)frmt
frmt="(" // trim(frmt) // ")"
write(*,"(/,'c=')")
write(*,trim(frmt))c
end
まず、ユーザーによって出力される列の数を定義します.
Please specify the number of columns (default: 5):
3
例1では、配列aを印刷する.ここでは、Fortran 90が導入したwreiteオプションadvance='no'を用いて、印刷後に改行しないことを示す.このオプションは、Fortran 77コンパイラ(pgf 77、g 77など)には無効です.配列の要素が1つしか印刷されないたびに、データ番号が列数で割り切れる場合は、空のwriteコマンドを実行して改行します.出力は次のとおりです.
a=
1.000000000000 1.000000000000 1.000000000000
1.000000000000 1.000000000000 1.000000000000
1.000000000000 1.000000000000 1.000000000000
1.000000000000 1.000000000000 1.000000000000
1.000000000000 1.000000000000 1.000000000000
1.000000000000 1.000000000000 1.000000000000
1.000000000000 1.000000000000
例2、配列bを印刷する.ここでは文字列frmtを用いて出力フォーマットを格納し,write文を用いてカスタムの整数列数を文字としてfrmtに印刷し,frmtが予め残した2番目から5番目の文字位置をユーザ定義の列数に変更する.上記の例ではfrmtを(3 f 1.3)に変更した.私たちは一般的に数列から数十列しか出力しないので、4文字の位置を予約するのは一般的に十分です.出力:
b=
2.000 2.000 2.000
2.000 2.000 2.000
2.000 2.000 2.000
2.000 2.000 2.000
2.000 2.000 2.000
2.000 2.000 2.000
2.000 2.000
例3では、配列cを印刷する.この例は例2の拡張と見なすことができ,出力がより柔軟である.列数だけでなく、各要素の出力フォーマットもユーザーがFortranのフォーマットに従って定義します.例:
Please specify the format (for example, 5f12.6):
4d16.6
それからFortran形式によって、前後のかっこをつけます.出力は次のとおりです.
c=
0.300000D+01 0.300000D+01 0.300000D+01 0.300000D+01
0.300000D+01 0.300000D+01 0.300000D+01 0.300000D+01
0.300000D+01 0.300000D+01 0.300000D+01 0.300000D+01
0.300000D+01 0.300000D+01 0.300000D+01 0.300000D+01
0.300000D+01 0.300000D+01 0.300000D+01 0.300000D+01
ユーザがカスタマイズしたフォーマットが必ずしも文法に合致するとは限らない.正式なプログラムである場合は、writeにエラー判断を加えたほうがいいです.与えられたフォーマットの出力が実行できない場合は、デフォルトのフォーマットで出力します.
補足:CVFおよびIntelコンパイラでは、列の数を大きい番号と小さい番号で指定できます.例:
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
dimension a(20)
ncol=5
a=1.d0
write(*,"(f12.6)")a
end
出力:
1.000000 1.000000 1.000000 1.000000 1.000000
1.000000 1.000000 1.000000 1.000000 1.000000
1.000000 1.000000 1.000000 1.000000 1.000000
1.000000 1.000000 1.000000 1.000000 1.000000