有时候为了便于数据显示和后期的数据处理,我们希望能控制Fortran程序打印的数据列数,但是write语句不允许在格式控制符中加入变量。其实通过一些技巧,这是可以实现的。
示例代码如下:
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。这里利用了Fortran90引入的一个wreite选项advance='no',表示打印之后不换行。注意此选项对Fortran 77编译器(例如pgf77,g77)无效。每次只打印一个数组的元素,当数据编号能被列数整除时,执行一个空的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改后成为( 3f11.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(*,"(<ncol>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
本文介绍了在Fortran编程中如何控制打印数据的列数,包括三种方法,并提供示例代码,强调了在实际使用中应考虑格式的正确性和出错处理。

2419

被折叠的 条评论
为什么被折叠?



