输入输出是我们平常说的I/O即INPUT/OUTPUT。输入输出的设计是“打印”和“读取”,也是设计程序和外部世界之间的数据流,一般称之为交互。
本文代码
program basicInputAndOutputDemo
implicit none
real :: length ! real类型,矩形长度
real :: width ! real类型,矩形宽度
real :: areaSquare ! real类型,矩形面积
print *,"输入矩形长度和宽度,两数间使用用空格分隔"
read *,length,width
areaSquare=length*width
print *,"输入结果:"
print *,"矩形长度=",length
print *,"矩形宽度=",width
print *,"矩形面积=",areaSquare
end program basicInputAndOutputDemo
编译运行
(base) hong@hongdeMacBook-Pro 015.basicInputAndOutput % gfortran exampleBasicInputAndOutput.f90
(base) hong@hongdeMacBook-Pro 015.basicInputAndOutput % ./a.out
输入矩形长度和宽度,两数间使用空格、换行、或逗号分隔
10,20
输入结果:
矩形长度= 10.0000000
矩形宽度= 20.0000000
矩形面积= 200.000000
(base) hong@hongdeMacBook-Pro 015.basicInputAndOutput % ./a.out
输入矩形长度和宽度,两数间使用空格、换行、或逗号分隔
10 25
输入结果:
矩形长度= 10.0000000
矩形宽度= 25.0000000
矩形面积= 250.000000
(base) hong@hongdeMacBook-Pro 015.basicInputAndOutput % ./a.out
输入矩形长度和宽度,两数间使用空格、换行、或逗号分隔
10
30.5
输入结果:
矩形长度= 10.0000000
矩形宽度= 30.5000000
矩形面积= 305.000000
(base) hong@hongdeMacBook-Pro 015.basicInputAndOutput %
结果分析
本例中我输入了三组不同的算例,这里print *与read *都是列表导向I/O。使用方便,输出格式由编译器自动决定,因此小数位和空格不完全由开发者控制。
- 10,20
- 程序按顺序先执行read *,lengthMeter,widthMeter,通过终端交互输入得到矩形长宽10,20。
- 再执行areaSquareMeter=lengthMeter*widthMeter,得到areaSquareMeter=10*20=200。
- 最终执行print *,”矩形面积=”,areaSquare,输出面积areaSquareMeter的值即200,结果正确。
- 10 25 同上,使用空格间隔,结果正确。
- 10
30.5 同上,使用换行间隔,结果正确。
I/O结构内较简流程:提示信息(类型、范围、格式、数量等)->输入数据->合法判断->计算语句->输出语句。简单说输入使数据进入程序参与计算,输出使数据离开计算交给使用者。
| 序号 | 对应流程 | 本例语句 |
| 1 | 提示信息 | print *,”输入矩形长度和宽度,两数间使用用空格分隔” |
| 2 | 输入数据 | read *,lengthMeter,widthMeter |
| 3 | 合法判断 | 无 |
| 4 | 计算语句 | areaSquareMeter=lengthMeter*widthMeter |
| 5 | 输出语句 | print *,”矩形面积=”,areaSquare |
由于暂未介绍ifelse分支,我在本例中就未作输入合法判断。如某程序运行时提示“输入该金属常温密度,单位为g/cm3”,我若输入22.63会超出金属锇的常温密度,程序就进入一个判断分支,该分支中可能有一个输出语句告诉我该值不合法须重新输入,并返回到read语句中读取我接下来的输入,当判断输入数据合法后再分支执行合法有效的后续语句。
错误示范
(base) hong@hongdeMacBook-Pro 015.basicInputAndOutput % ./a.out
输入矩形长度和宽度,两数间使用空格、换行、或逗号分隔
你 我
At line 7 of file exampleBasicInputAndOutput.f90 (unit = 5, file = 'stdin')
Fortran runtime error: Bad real number in item 1 of list input
Error termination. Backtrace:
#0 0x100a96103
#1 0x100a96cd7
#2 0x100a975a7
#3 0x100baff8b
#4 0x100bb0b4f
#5 0x100bb19eb
#6 0x1007246fb
#7 0x1007248c3
(base) hong@hongdeMacBook-Pro 015.basicInputAndOutput % ./a.out
输入矩形长度和宽度,两数间使用空格、换行、或逗号分隔
3 2*3
输入结果:
矩形长度= 3.00000000
矩形宽度= 3.00000000
矩形面积= 9.00000000
(base) hong@hongdeMacBook-Pro 015.basicInputAndOutput % ./a.out
输入矩形长度和宽度,两数间使用空格、换行、或逗号分隔
3*4 5*6
输入结果:
矩形长度= 4.00000000
矩形宽度= 4.00000000
矩形面积= 16.0000000
(base) hong@hongdeMacBook-Pro 015.basicInputAndOutput % ./a.out
输入矩形长度和宽度,两数间使用空格、换行、或逗号分隔
6*8.2 3.14*1e-1
输入结果:
矩形长度= 8.19999981
矩形宽度= 8.19999981
矩形面积= 67.2399979
(base) hong@hongdeMacBook-Pro 015.basicInputAndOutput %
输入的数据要与变量类型匹配,length与width是real类型,所以可以输入整数值、小数值、科学计数法即表达实数的值。不能输入逻辑型、字符串型数据。也不能在本例中输入算式例如2*3,这并非不合法:
| 序号 | 输入 | fortran理解为 | 本例只读取前两个变量 |
| 1 | 3 2*3 | 3,3,3 | 3,3 |
| 2 | 3*4 5*6 | 4,4,4,6,6,6,6,6 | 4,4 |
| 3 | 6*8.2 3.14*1e-1 | 8.2,8.2,8.2,8.2,8.2,8.2,后面的3.14*1e-1无意义,真将6个8.2读完接着读3.14*1e-1就会报错。 | 8.2,8.2 |
(base) hong@hongdeMacBook-Pro 015.basicInputAndOutput % ./a.out
输入矩形长度和宽度,两数间使用空格、换行、或逗号分隔
1.1e2 1.2e3
输入结果:
矩形长度= 110.000000
矩形宽度= 1200.00000
矩形面积= 132000.000
(base) hong@hongdeMacBook-Pro 015.basicInputAndOutput %