在Fortran程序中,自定义打印数据列数的三种方法

本文介绍了在Fortran编程中如何控制打印数据的列数,包括三种方法,并提供示例代码,强调了在实际使用中应考虑格式的正确性和出错处理。

实战派 ESP32-S3,双模无线开发板

ESP32-S3 原生支持 ESP-IDF,WiFi + 蓝牙一次搞定

有时候为了便于数据显示和后期的数据处理,我们希望能控制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



实战派 ESP32-S3,双模无线开发板

ESP32-S3 原生支持 ESP-IDF,WiFi + 蓝牙一次搞定

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值