添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
含蓄的红薯  ·  SQL Server ...·  1 年前    · 
慷慨的熊猫  ·  java - Flutter Error ...·  1 年前    · 

Fortran学习笔记——5.其他

一些琐碎的小部分,放在最后。

自定义类型

Fortran 90支持自定义类型,相当于c语言的结构体。

program main
    implicit none
    type :: person
        integer :: age
        integer :: height
        integer :: weight
    end type person
    type(person) :: a ! 声明a是一个person类型的变量
    ! %用于提取结构体的分量
    read(*,*) a%age, a%height, a%weight
    write(*,*) a%age, a%height, a%weight
end program main

字符/字符串

在前面的基本数据类型的笔记中,我们特意完全忽略了字符和字符串的部分,只是在write语句中使用了字符串常量。 注:Fortran对于字符串的处理效率比较慢,谨慎使用——数值计算其实也没什么字符串处理的需求。

与c语言不同,Fortran的字符串不是定义为字符的一维数组,而是进行了单独的实现 (可能这就是低效率的原因?)

character :: c
character(len=20) :: str1
character(20) :: str2
character*20 :: str3

Fortran只有在字符和字符串的字面值常量中,会区分大小写。可以基于字面值常量进行赋值。

c = ‘H'
str1 = "hello,world"
str2 = "I''m fortran"

虽然和数组不同,但是字符串也支持类似于数组的切片操作。

str1(2) = 'o'
str2(1:1) = "Y"

对于两个字符串常量或变量,可以使用//进行直接的拼接。

对于中间存在空格的字符串,默认write(*,*)输出可能出现问题,因为对字符串的输出遇到空格就结束了;默认read(*,*)输入字符串也会存在问题,因为空格会被视作多个字符串的分隔。

格式化 IO

输入read(*,*)的形式为

read(unit=5,fmt=*)
! unit 代表输入设备, 键盘的编号为5, 通常键盘为默认输入设备
! unit=5 等价于 unit=* 为默认输入设备
! fmt 代表输入格式, fmt=* 为默认格式

输出write(*,*)的第一个参数指代屏幕输出,第二个参数可以替换为具体格式。下面的部分使用下划线代替空格。

整数格式化

Iw[.m]
! 以w个字符的固定宽度输出整数,如果不足补空格,如果超过则输出全变成*。(离谱)
! 至少显示m个字符,不足会在首位补0
write(*,"(I5)") 100
__100
write(*,"(I3)") 10000
write(*,"(I5,3)") 10
__010

实数格式化(浮点数)

Fw.d
! 以w个字符的固定宽度输出浮点数,小数部分占d个字符。
! 小数点也占一位,超过宽度会全部变成*
write(*,"(F9.3)") 123.45
__123.450

实数格式化(科学计数法)

Ew.d[Ee]
! 以w个字符的固定宽度输出科学计数法,小数部分占d个字符,指数部分占e个字符。
! E也占一位,超过宽度会全部变成*
write(*,"(E15.7)") 123.45
__0.1234500E+03
write(*,"(E9.2E3") 12.34
_0.12E002

字符串格式化

Aw
! 以w个字符的固定宽度输出字符串,不足补充空格,多了会直接省略
write(*,"(A10)") "hello"
_____hello
write(*,"(A3)") "hello"

其他

nX
! 输出位置右移n格, 或者说输出n个空格

倾向于不使用格式化输入输出,不然有可能输出全是星号。(真是太离谱了) 了解一下即可。

文件读写

最基本的文件写入例子

program main
    implicit none
    integer :: a=2
    integer :: b=3
    open(unit=10,file='hello.txt')
    write(10,*) "a/b=", a/b
    write(10,*) "a*1.0/b=", a*1.0/b
    close(file)