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

自定义类型

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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

stop
end program main

字符/字符串

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

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

1
2
3
4
5
character :: c

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

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

1
2
3
c = ‘H'
str1 = "hello,world"
str2 = "I''m fenglielie"

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

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

对于两个字符串常量或变量,可以使用//进行直接的拼接。对于中间存在空格的字符串,默认 write(*,*)输出可能出现问题,因为对字符串的输出遇到空格就结束了;默认 read(*,*)输入字符串也会存在问题,因为空格会被视作多个字符串的分隔。

格式化 IO

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

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

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

整数格式化

1
2
3
4
5
6
7
8
9
10
11
12
Iw[.m]
! 以w个字符的固定宽度输出整数,如果不足补空格,如果超过则输出全变成*。(离谱)
! 至少显示m个字符,不足会在首位补0

write(*,"(I5)") 100
__100

write(*,"(I3)") 10000
***

write(*,"(I5,3)") 10
__010

实数格式化(浮点数)

1
2
3
4
5
6
Fw.d
! 以w个字符的固定宽度输出浮点数,小数部分占d个字符。
! 小数点也占一位,超过宽度会全部变成*

write(*,"(F9.3)") 123.45
__123.450

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

1
2
3
4
5
6
7
8
9
Ew.d[Ee]
! 以w个字符的固定宽度输出科学计数法,小数部分占d个字符,指数部分占e个字符。
! E也占一位,超过宽度会全部变成*

write(*,"(E15.7)") 123.45
__0.1234500E+03

write(*,"(E9.2E3") 12.34
_0.12E002

字符串格式化

1
2
3
4
5
6
7
8
Aw
! 以w个字符的固定宽度输出字符串,不足补充空格,多了会直接省略

write(*,"(A10)") "hello"
_____hello

write(*,"(A3)") "hello"
hel

其他

1
2
3
4
nX
! 输出位置右移n格, 或者说输出n个空格
/
! 换行

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

文件读写

最基本的文件写入例子

1
2
3
4
5
6
7
8
9
10
11
12
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)
end program main

首先通过 open 命令打开一个 hello.txt 文件,并且编号记录为 10,运行时会在当前目录下的 hello.txt 文件中写入如下内容

1
2
a/b=           0
a*1.0/b= 0.666666687

文件读写和 c 语言类似,有非常多的选项,包括打开方式,二进制文件或文本文件等,略。