1、1. Fortran 数据结构2. 数组 3. 数据有格式输入输出概述4. 格式说明与格式编辑符5. 整数有格式输入输出6. 实数有格式输入输出7. 复数有格式输入输出8. 字符串有格式输入输出9. 逻辑值有格式输入输出10.二、八、十六进制数据有格式输入输出11.任意类型数据有格式输入输出12.不可重复编辑符13.纵向走纸控制14.有格式输入输出应用举例15.作业,第六讲 Fortran数据结构及输入、输出,第六讲 Fortran数据结构及输入、输出,6.1 Fortran 数据结构,FORTRAN 90具有丰富的数据类型,有内部数据类型、派生数据类型、数组和指针类型等。利用丰富的数据类型可
2、设计和编写出功能强大的FORTRAN 90程序。,类型复数运算字符型,6.1 Fortran 数据结构,第六讲 Fortran数据结构及输入、输出,6.1 复数型数据运算及内部函数,与实数的运算一样。 有,-,/,*。 并与实数一样有相应的内部函数。 FORTRAN 90提供了针对复数型数据的内部函数。 CMPLX(x,y,kind) 将参数转换为复数型。结果:C(kind)。 DCMPLX(x,y) 将参数转换为复数型。结果:C(8)。 REAL(x) 求x的实部。 AIMAG(x) 求x的虚部。 IMAG(x) 同AIMAG(x)。 CONJG(x) 求x的共轭复数。,复数型数据,类型复数
3、型字符型,第六讲 Fortran数据结构及输入、输出,6.1 字符型数据/子字符串,表示形式:字符变量名(开始位置:终止位置) 例子:有字符变量A,其取值为ABCDE12345FGH,则下面的子串取值为: A(3:11) - CDE12345F, A(I+4:9) - E1234(I=1),1234(I=2) A(:5) - ABCDE A(11:) - FGH A(:) - ABCDE12345FGH A(3:3) - C,字符型数据,子字符串运算符 内部函数,第六讲 Fortran数据结构及输入、输出,6.1 字符型数据/运算符,字符运算符:/ 例子 关系表达式:对每种机器,系统都把本机上
4、可以使用的各种字符按先后排列成某种次序,每个字符在排序中有确定的位置,称为排序号。有了排序号,字符之间就可以比较大小及相等与否,组成关系表达式。字符作比较实际上是比较它们的序号大小。字符比较的一般形式是两端为字符表达式的关系表达式:字符表达式关系操作符字符表达式。例如:A=(XY/C2)/C3 式当C1、C2、C3是字符型变量名时是合法的,要先计算两端字符表达式的值,而后比较它们是否满足关系。,program ex060202character(len= 6) firstcharacter(len=10) secondcharacter(len=20) addfirst=“Happy “sec
5、ond=“Birthday“add = first/second ! 经由两个连续的除号 !可以连接两个字符串write(*,*) add end,字符型数据,子字符串运算符 内部函数,第六讲 Fortran数据结构及输入、输出,6.1 字符型数据/内部函数,函数名 说明 ACHAR(n) 将ASCII码n转换为对应字符。 ADJUSTL(string)* 将字符串string左对齐,即去掉左端空格 ADJUSTR(string)* 将字符串string右对齐,即去掉右端空格。string:CH(*),结果类型同string CHAR(n)* 将ASCII码n转换为对应字符。 IACHAR(c
6、)* 将字符c转换为对应的ASCII码。 ICHAR(c)* 将字符c转换为对应的ASCII码。 INDEX(s,ss,b)* 求子串ss在串s中起始位置。b为真从右起 LEN(s)* 求字符串s的长度。 LEN_TRIM(s)* 求字符串s去掉尾部空格后的字符数。,LGE(s1,s2)* 按ASCII码值判定字符串s1大于等于字符串s2。 LGT(s1,s2)* 按ASCII码值判定字符串s1大于字符串s2。 LLE(s1,s2)* 按ASCII码值判定字符串s1小于等于字符串s2。 LLT(s1,s2)* 按ASCII码值判定字符串s1小于字符串s2。 REPEAT(s,n)* 求字符串s
7、重复n次的新字符串。 SCAN(s,st,b)求串st中任一字符在串s中的位置。 TRIM(s)* 求字符串s去掉首尾部空格后的字符数。 VERIFY(s,st,b) 求不在串st中字符在s中位置。b为真右起,字符型数据,子字符串运算符 内部函数,第六讲 Fortran数据结构及输入、输出,6.2 数组/定义,6.2 数组,数组是类型相同的组变量的有序集合。任何一组类型相同且有序的数据都可使用数组存储。如:保存30名学生成绩数据的一组变量:s1,s2,s3,s30REAL s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13,s14,s15这组变量可用数组s取代
8、,数组元素s(1),s(2),s(15),分别取代s1,s2,s15。REAL s(15) 数组分静态数组和动态数组 静态数组:在编译时分配存储单元,运行时数组大小不能改变。INTEGER num(5) !在编译时分配5个数组元素存储单元(20字节) 动态数组:在程序运行时分配存储单元,运行时数组大小可改变。INTEGER,ALLOCATABLE : num(:) !在编译时不分配存储单元ALLOCATE(num(5) !在运行时分配5个数组元素存储单元(20字节) 数组大小为数组元素个数。 数组声明有3种方式:类型声明语句、DIMENSION语句、DIMENSION属性,定义声明1声明2声明
9、3说明,第六讲 Fortran数据结构及输入、输出,6.2 数组/声明1,使用类型声明语句进行数组声明。一般格式: : INTEGERREALCOMPLEXCHARACTERLOGICAL ()=,()= , : (/,/) 声明下界为1的数组。例 声明数组下界不为1的数组。例 声明赋初值的数组及动态数组。例 数组元素个数计算。 REAL a(L1:U1,L2:U2,Ln:Un) !数组元素个数m按以下公式计算: m=(U1-L1+1)(U2-L2+1)(Un-Ln+1) 如:REAL arr(2:5,-1:2,4),M=(5-2+1)(2-(-1)+1)(4-1+1)=64。,6.2 数组,
10、定义声明1声明2声明3说明,第六讲 Fortran数据结构及输入、输出,6.2 数组/声明2,使用DIMENSION语句进行数组声明。一般格式: DIMENSION 例:INTEGER day,countCHARACTER*10 countryLOGICAL LDIMENSION num(3),day(12),ihour(5:7),count(-3:3)DIMENSION sc(-5:-1,5:9),ar(2:5,-1:2,4)DIMENSION country(15),L(5) DIMENSION语句中不能出现:,不能给数组赋初值。,6.2 数组,定义声明1声明2声明3说明,第六讲 Fort
11、ran数据结构及输入、输出,6.2 数组/声明3,使用类型声明语句和DIMENSION属性进行数组声明。一般格式: ,DIMENSION() : 例:INTEGER,DIMENSION(2):num,total,score(10:15),price(4,5)REAL,DIMENSION(-5:-1,5:9) : sc,jpCHARACTER*10,DIMENSION(15) : country,name(10)INTEGER,DIMENSION(5) : S=(/45,78,85,55,95/) 必须出现:,可给数组赋初值。,6.2 数组,定义声明1声明2声明3说明,第六讲 Fortran数据
12、结构及输入、输出,6.2 数组/说明,数组声明中,维下界可以为1,维下界为1可缺省。 数组声明中,维下界和维上界可以为任意整数,且维下界维上界。 数组声明中,出现:,才能在声明语句中给数组赋初值。 数组声明中,允许维下界维上界,且数组大小为0。 使用类型声明语句声明数组时,可使数组与普通变量混合声明。 使用DIMENSION语句声明数组时,可用类型声明语句在前面声明类型。声明中不能有:。 使用DIMENSION属性声明数组时,声明中必须有:。,6.2 数组,定义声明1声明2声明3说明,第六讲 Fortran数据结构及输入、输出,6.2 数组/声明1/例1,使用类型声明语句进行数组声明。一般格式
13、: : INTEGERREALCOMPLEXCHARACTERLOGICAL ()=,()= , : (/,/) 声明下界为1的数组。例 声明数组下界不为1的数组。例 声明赋初值的数组及动态数组。例 数组元素个数计算。 REAL a(L1:U1,L2:U2,Ln:Un) !数组元素个数m按以下公式计算: m=(U1-L1+1)(U2-L2+1)(Un-Ln+1) 如:REAL arr(2:5,-1:2,4),M=(5-2+1)(2-(-1)+1)(4-1+1)=64。,INTEGER(1)num(3),day(12) !声明KIND值为1的二个整型数组 INTEGER N(4),M(5,8)
14、!声明KIND值为4的二个整型数组 REAL score(4),prices(15) !声明二个单精度实型数组 REAL(8) dr(5) !声明一个双精度实型数组 COMPLEX comp(3) !声明一个单精度复型数组 CHARACTER*10 country(15) !声明一个长度为10的字符型数组 LOGICAL L(5) !声明一个KIND值为4的逻辑型数组,6.2 数组,定义声明1声明2声明3说明,第六讲 Fortran数据结构及输入、输出,6.2 数组/声明1/例2,使用类型声明语句进行数组声明。一般格式: : INTEGERREALCOMPLEXCHARACTERLOGICAL
15、 ()=,()= , : (/,/) 声明下界为1的数组。例 声明数组下界不为1的数组。例 声明赋初值的数组及动态数组。例 数组元素个数计算。 REAL a(L1:U1,L2:U2,Ln:Un) !数组元素个数m按以下公式计算: m=(U1-L1+1)(U2-L2+1)(Un-Ln+1) 如:REAL arr(2:5,-1:2,4),M=(5-2+1)(2-(-1)+1)(4-1+1)=64。,INTEGER count(-3:3) !声明一个一维整型数组,有7个数组元素 INTEGER week(0:6) !声明一个一维整型数组,有7个数组元素 REAL sc(-5:-1,5:9) !声明一
16、个二维实型数组,有25个数组元素 REAL ar(2:5,-1:2,4) !声明一个三维实型数组,有64个数组元素,6.2 数组,定义声明1声明2声明3说明,第六讲 Fortran数据结构及输入、输出,6.2 数组/声明1/例3,使用类型声明语句进行数组声明。一般格式: : INTEGERREALCOMPLEXCHARACTERLOGICAL ()=,()= , : (/,/) 声明下界为1的数组。例 声明数组下界不为1的数组。例 声明赋初值的数组及动态数组。例 数组元素个数计算。 REAL a(L1:U1,L2:U2,Ln:Un) !数组元素个数m按以下公式计算: m=(U1-L1+1)(U
17、2-L2+1)(Un-Ln+1) 如:REAL arr(2:5,-1:2,4),M=(5-2+1)(2-(-1)+1)(4-1+1)=64。,INTEGER : num(3)=(/12,23,34/),day(12) REAL : a(-1:3)=(/1.5,2.5,3.5,4.5,5.5/) INTEGER : X(3,4)=(/1,2,3,4,5,6,7,8,9,10,11,12/) REAL,ALLOCATABLE:SUM(:),AVER(:,:),B(:) READ(*,*) M,N ALLOCATE(SUM(0:N),AVER(M,N),B(-1:M) DEALLOCATE,6.2
18、数组,定义声明1声明2声明3说明,第六讲 Fortran数据结构及输入、输出,6.3 数据有格式输入输出概述,6.3 数据有格式输入输出概述,第六讲 Fortran数据结构及输入、输出,6.4 格式说明与格式编辑符, READ(*,100) m,nWRITE(*,200) m+n,m-n100 FORMAT(I3,I3)200 FORMAT(1X, m+n=,I4, m-n=,I4)END READ(*,“(I3,I3)“) m,nWRITE(*,“(1X, m+n=,I4, m-n=,I4)“) m+n,m-nEND 输入:987432。输出:m+n=1419m-n=555。,示例格式说明编
19、辑符,6.4 格式说明与格式编辑符, READ(*,100)m,n WRITE(*,200)m+n,m-n100 FORMAT(I3,I3)200 FORMAT(1X,m+n=,I4, m-n=,I4)END READ(*,“(I3,I3)“)m,nWRITE(*,“(1X, m+n=,I4, m-n=,I4)“)m+n,m-nEND,第六讲 Fortran数据结构及输入、输出,6.4格式说明与格式编辑符/格式说明,数据有格式输入输出需要给出相关的格式说明。 FORMAT语句提供输入输出数据的格式说明信息。 FORMAT语句既不是执行语句,也不是说明语句。 FORMAT语句可出现在说明语句之后
20、,END语句之前任何位置。 格式说明表是关键字FORMAT之后的括号部分。 格式说明表由若干格式编辑符组成,编辑符由“,”分隔。 格式说明表可嵌入到输入输出语句中,取代FORMAT语句。 格式说明一般使用FORMAT语句,简单格式使用嵌入方式。 FORMAT语句语法描述: FORMAT (,/),6.4 格式说明与格式编辑符,示例格式说明编辑符,第六讲 Fortran数据结构及输入、输出,6.4格式说明与格式编辑符/编辑符,FORTRAN 90提供了24个格式编辑符,如:I、F、E、A等。 格式编辑符分为两类:可重复编辑符、不可重复编辑符。 可重复编辑符可指定重复系数,与I/O表中的一个I/O
21、项对应。 不可重复编辑符不可指定重复系数,不与输入输出项相对应。如:I、F、E、A等编辑符为可重复编辑符。如:X、Q、/、等编辑符为不可重复编辑符。READ(*,100) num1, num2, price1, price2100 FORMAT(2I3, F7.1, E8.2)WRITE(*,200) num1*price1+num2*price2200 FORMAT(1X,total prices=,E14.7)END输入:1252195234.57.52E+04。输出:total prices=1.3483512E+07。,6.4 格式说明与格式编辑符,示例格式说明编辑符,第六讲 Fort
22、ran数据结构及输入、输出,表6-1 可重复编辑符,第六讲 Fortran数据结构及输入、输出,表6-2 不可重复编辑符,第六讲 Fortran数据结构及输入、输出,6.5 整数有格式输入输出,I 编辑符可用于整数的有格式输入输出,一般格式是:rIw.m 其中:r为I编辑符重复次数。 即:rIw.m等价于Iw.m,Iw.m,Iw.m。w为整数输入输出域宽,即整数占连续字符个数。m为输出最少位数。.m项只对整数输出有效,对输入无效。程序示例:INTEGER(2) i,j,kREAD(*,10) i,j,k10 FORMAT(I4,2I5) !等价于FORMAT(I4,I5,I5)WRITE(*,
23、“(1X, i+j+k=,I5)“) i+j+kEND,格式输入输出,6.5 整数有格式输入输出,第六讲 Fortran数据结构及输入、输出,6.5 整数有格式输入输出/输入,输入数据间可按规定域宽紧密输入,也可用逗号间隔输入,不用空格。 在域宽内,数字前后,数字之间可出现空格,这些空格一般被视为空。 在域宽内,全为空格,输入整数为0。 在域宽内,输入数据不能超出范围,不能是非十进制整数。 I编辑符要求输入表中对应变量的类型一般是整型,否则会产生错误。 示例:INTEGER(2) i,j,kREAD(*,10) i,j,k10 FORMAT(I4,2I5) !等价于FORMAT(I4,I5,I
24、5)WRITE(*,“(1X, i+j+k=,I5)“) i+j+kEND,格式输入输出,6.5 整数有格式输入输出,第六讲 Fortran数据结构及输入、输出,6.5 整数有格式输入输出/输出,若域宽等于整数位数,则在域宽内输出该整数,与后一数据无空格间隔。 若域宽大于整数位数,则在域宽内按右对齐输出该整数,前补空格。 若域宽小于整数位数,则表明域宽不足,无法输出数据,域宽内填充“*”。 对于Iw.m格式,m表示输出最小位数。位数小于m,补前导0至m位。 示例:READ(*,*) i,j,k10 FORMAT(1X, i=,I4, j=,I4, k=,I4) WRITE(*,10) i,j,
25、kEND,6.5 整数有格式输入输出,格式输入输出,第六讲 Fortran数据结构及输入、输出,6.5 整数有格式输入输出/输入/示例,输入数据间可按规定域宽紧密输入,也可用逗号间隔输入,不用空格。 在域宽内,数字前后,数字之间可出现空格,这些空格一般被视为空。 在域宽内,全为空格,输入整数为0。 在域宽内,输入数据不能超出范围,不能是非十进制整数。 I编辑符要求输入表中对应变量的类型一般是整型,否则会产生错误。 示例:INTEGER(2) i,j,kREAD 10,i,j,k10 FORMAT(I4,2I5) !等价于FORMAT(I4,I5,I5)PRINT “(1X, i+j+k=,I5
26、)“,i+j+kEND,格式输入输出,6.5 整数有格式输入输出,第六讲 Fortran数据结构及输入、输出,6.6 实数有格式输入输出,F 编辑符可用于小数型实数的有格式输入输出,一般格式是:rFw.d 其中:r为F编辑符重复次数。 即:rFw.d 等价于Fw.d,Fw.d,Fw.d。w为小数型实数输入输出域宽,即实数占连续字符个数。d为小数位数。对于输入,无小数点,小数点由d确定,有小数点,小数点由域宽内实际位置确定。对于输出,输出数据域宽包括一个小数点。程序示例:READ(*,*) a,bWRITE(*,10) a,b10 FORMAT(1X,a=,F7.3,b=,F7.3)END,6.
27、6 实数有格式输入输出,格式F输出F格式E输入E输出E 格式D格式EN 格式ES,第六讲 Fortran数据结构及输入、输出,6.6 实数有格式输入输出/输出F,6.6 实数有格式输入输出,对正数,若w=t+d+1,对负数,若w=t+d+2,且d=s,则在域宽内输出该实数。 对正数,若w=t+d+1,对负数,若w=t+d+2,且ds,则在域宽内左对齐输出该实数,小数部分后续补d-s个0。 对正数,若w=t+d+1,对负数,若w=t+d+2,且dt+d+1,对负数,若wt+d+2,则在域宽内右对齐输出该实数,整数前补w-(t+d+1)或w-(t+d+2)个空格,小数部分按前面3种情况处理,占d位
28、 。 对正数,若wt+d+1,对负数,若wt+d+2,则域宽不足,在域宽内填充“*”。 示例:READ(*,*) a,bWRITE(*,10) a,b10 FORMAT(1X,a=,F7.3,b=,F7.3)END设:输出数据的整数部分位数为t,小数部分位数为s。,格式F输出F格式E输入E输出E 格式D格式EN 格式ES,第六讲 Fortran数据结构及输入、输出,6.6 实数有格式输入输出/格式E,E 编辑符可用于指数型实数的有格式输入输出,一般格式是:rEw.dEe 其中:r为F编辑符重复次数。 即:rEw.dEe 等价于Ew.dEe,Ew.dEe,Ew.dEe。w为指数型实数输入输出域宽
29、,即实数占连续字符个数。d为小数位数,其含义同F编辑符。e为指数位数,缺省为2,不包括E和符号,指数域宽e+2。程序示例:READ(*,*) a,bWRITE(*,10) a,b10 FORMAT(1X,a=,E10.5,b=,E11.5)END,6.6 实数有格式输入输出,格式F输出F格式E输入E输出E 格式D格式EN 格式ES,第六讲 Fortran数据结构及输入、输出,格式F输出F格式E输入E输出E 格式D格式EN 格式ES,6.6 实数有格式输入输出/输入E,6.6 实数有格式输入输出,对于输入,E编辑符功能类似F编辑符。 在规定域宽内,可按小数型实数输入,也可按指数型实数输入。 示例
30、:READ(*,*) a, b, c11 FORMAT(E5.2,E8.3,E8.3E3)WRITE(*,“(1X,a+b+c=,E12.3)“) a+b+cEND,第六讲 Fortran数据结构及输入、输出,格式F输出F格式E输入E输出E 格式D格式EN 格式ES,6.6 实数有格式输入输出/输出E,6.6 实数有格式输入输出,对正数,若w=d+5,对负数,若w=d+6,且d=t,则在域宽内输出该实数。 对正数,若w=d+5,对负数,若w=d+6,且dt,则在域宽内左对齐输出该实数,小数部分后续补d-t个0。 对正数,若w=d+5,对负数,若w=d+6,且dd+5,对负数,若wd+6,则在域
31、宽内右对齐输出该实数,整数前补w-(d+5)-1或w-(d+6)-1个空格,小数部分按前面3种情况处理。 对正数,若wd+5,对负数,若wd+6,则域宽不足,在域宽内填充“*”。 对双精度实数,指数有3位,指数部分的E字母省略,保持3位指数。 示例:READ(*,*) a,bWRITE(*,10) a,b10 FORMAT(1X,a=,E10.5,b=,E11.5)END设:输出实数的有效位数为t。,第六讲 Fortran数据结构及输入、输出,6.6 实数有格式输入输出/格式D,D编辑符用于双精度数据的输出。其一般形式为:rDw.d 其中:r为F编辑符重复次数。 使用方法与E编辑符相仿,只是把
32、字母“E”换成“D”。 程序示例:real(8) a,bREAD(*,*) a,bWRITE(*,10) a,b10 FORMAT(1X,a=,D10.5,b=,D11.5)END,6.6 实数有格式输入输出,格式F输出F格式E输入E输出E 格式D 格式EN 格式ES,第六讲 Fortran数据结构及输入、输出,格式F输出F格式E输入E输出E 格式D 格式EN 格式ES,6.6 实数有格式输入输出/格式EN/ES,工程计数法(EN)和科学计数法(ES)也是F90新增的编辑描述符。EN的一般形式为:ENw.dEe。EN和E编辑描述符基本类似,区别在于EN输出数据的非指数部分的绝对值强制在1到10
33、00的范围内,且指数可以被3整除。包括指数的区域的宽度是w个字符,小数点后d个字符,指数宽度e是可选的。ES的一般形式为:ESw.dEe。它和E编辑描述符也基本类似,区别在于ES输出数据的非指数部分的绝对值强制在l到10的范围内,而非E的0到1的范围。,6.6 实数有格式输入输出,x=-12345.6789 y=0.456789 z=7.89123e23write(*,“(3(1x,en13.5 )“) x,y,z write(*,“(3(1x,en13.2e4)“) x,y,z write(*,“(3(1x,es13.5 )“) x,y,z write(*,“(3(1x,es13.2e4)“
34、) x,y,z end 输出结果如下:-12.34568E+03 456.78899E-03 789.12303E+21-12.35E+0003 456.79E-0003 789.12E+0021-1.23457E+04 4.56789E-01 7.89123E+23-1.23E+0004 4.57E-0001 7.89E+0023,第六讲 Fortran数据结构及输入、输出,6.7 复数有格式输入输出,复数编辑符是通过两个实型编辑符实现的,第一个对应实部,第二个对应虚部。程序示例: COMPLEX c1,c2READ(*,23) c1,c223 FORMAT(F5.2,E5.2,F8.3,E
35、8.3)WRITE(*,*) C1WRITE(*,*) C2WRITE(*,“(1X,c1+c2=, F7.2,E10.3)“) c1+c2END,概述,6.7 复数有格式输入输出,输入:12345123E24321.5,1234E-1。 c1和c2值:c1=(123.45,123.0),c2=(4321.5,1.23410-1)。 输出: (123.4500,123.0000)(4321.500,0.1234000)c1+c2=4444.950.123E+03。 c1+c2输出首尾无括号,中间无逗号,第六讲 Fortran数据结构及输入、输出,6.8 字符串有格式输入输出,6.8 字符串有格
36、式输入输出,格式输入输出,A 编辑符可用于字符串的有格式输入输出,一般格式是:rAw 其中:r为A编辑符重复次数。 即:rAw等价于Aw,Aw,Aw。w为字符串输入输出域宽,即字符串占连续字符个数。缺省w,域宽为输入和输出表中对应字符型变量的长度。程序示例:CHARACTER str1*5,str2*4,str3*3,str4*3READ(*,24) str1,str2,str3,str424 FORMAT(A5,A4,2A3)WRITE(*,*) str1/str2/str3/str4END,第六讲 Fortran数据结构及输入、输出,6.8 字符串有格式输入输出/输入,6.8 字符串有格式
37、输入输出,域宽等于变量长度,按域宽依次截取字符串,赋予变量,不足补空格。 域宽小于变量长度,按域宽依次截取字符串,补足空格后赋于变量。 域宽大于变量长度,按域宽依次截取字符串,取后部字符赋于变量。 缺省域宽,域宽默认取输入表对应字符型变量长度。 输入字符串不能加引号。引号、逗号和空格按一般字符对待。 示例:CHARACTER s1*5,s2*4,s3*3,s4*3READ(*,24) s1,s2,s3,s424 FORMAT(A5,A4,2A3)WRITE(*,*) s1/s2/s3/s4END,格式输入输出,第六讲 Fortran数据结构及输入、输出,6.8 字符串有格式输入输出/输出,6.
38、8 字符串有格式输入输出,域宽等于表达式值长度,则按域宽输出字符串,字符串中空格有效。WRITE(*,“(1X,#,A15,#)“) ABC/DEFG/HI/JK输出:#ABCDEFGHIJK# 域宽小于表达式值长度,则按域宽截取左侧子字符串输出。 WRITE(*, “(1X,#,A10,#)“) ABC/DEFG/HI/JK输出:#ABCDEFG# 域宽大于表达式值长度,则将表达式值左补空格至域宽输出。WRITE(*, “(1X,#,A18,#)“)ABC/DEFG/HI/JK输出:#ABCDEFGHIJK# 缺省域宽,以表达式值长度为域宽输出。WRITE(*,“(1X,#,A,#)“) A
39、BC/DEFG/HI/JK 输出:#ABCDEFGHIJK#,格式输入输出,第六讲 Fortran数据结构及输入、输出,6.9 逻辑值有格式输入输出,6.9 逻辑值有格式输入输出,格式输入输出,L 编辑符可用于逻辑值的有格式输入输出,一般格式是:rLw 其中:r为L编辑符重复次数。 即:rLw等价于Lw,Lw,Lw。w为逻辑值输入输出域宽,即逻辑值占连续字符个数。缺省w,域宽为2。程序示例:LOGICAL log1,log2,log3,log4READ(*,26) log1,log2,log3,log4WRITE(*,27) log1,log2,log3,log426 FORMAT(L,L1,
40、L2,L3)27 FORMAT(1X,L,L1,L2,L3)END,第六讲 Fortran数据结构及输入、输出,6.9 逻辑值有格式输入输出/输入,6.9 逻辑值有格式输入输出,格式输入输出,域宽内首个非空格或非小数点“.”字符是“T”或“t”,则输入为.TRUE.。 域宽内首个非空格或非小数点“.”字符是“F”或“f”,则输入为.FASLE.。 在域宽内,字母T、t、F、f后可跟任意字符,不影响逻辑值输入。 逻辑值间可用逗号分隔,不用空格。 输入逻辑值.TRUE.,域宽必须大于5。输入.FASLE.,域宽必须大于6。 示例: LOGICAL log1,log2,log3,log4READ(*
41、,26) log1,log2,log3,log4 WRITE(*,27) log1,log2,log3,log426 FORMAT(L,L1,L2,L3)27 FORMAT(1X,L,L1,L2,L3)END 输入:TFTAFB 值:log1= .TRUE.,log2=.FASLE.,log3=.TRUE.,log4=.FASLE.,第六讲 Fortran数据结构及输入、输出,6.9 逻辑值有格式输入输出/输出,6.9 逻辑值有格式输入输出,格式输入输出,在指定域宽内右对齐输出T(.TRUE.)或F(.FALSE.)。 示例: LOGICAL log1,log2,log3,log4Log1=.
42、TRUE.;log2=.TRUE.;log3=.FALSE.;log4=.FALSE.WRITE(*,27) log1,log2,log3,log427 FORMAT(L,L1,L2,L3)END输出:TTFF,第六讲 Fortran数据结构及输入、输出,6.10二、八、十六进制数据有格式输入输出,二进制(B)、八进制(O)和十六进制(Z)是F90新增的编辑描述符,用于整数、实数和逻辑量的输出。其一般形式为:Bw.m,Ow.m,Zw.m。w为字段宽度。m表示需要输出的最少数字位数,缺省值为1。如果输出少于指定的宽度,则左边补空格。但对于二进制数,如果以0填补可读性会更好一些,例如O001010
43、1显示了l0101所有的8位。可以使用类似B8.8,B16.16,B32.32等的格式强迫开始以O填补。 编辑描述符不包含小数点或负号。相应进制的数据只能由允许的数字组成:B描述符允许0和1,O描述符允许0-7,Z描述符允许0-9和A-F。它们都可用于整型、字符型、实型或逻辑型。因为没有负号,所以B,O和Z的负值应根据所使用编码转换来表示。对二进制、八进制和十六进制的译码,尤其是负数的译码是和CPU有关的。使用B,O和Z编辑描述符和以B,O和Z存储数据的程序可能不能直接在计算机之间移植。示例,概述,6.10 二、八、十六进制数据有格式输入输出,第六讲 Fortran数据结构及输入、输出,6.1
44、0 示例,write(*,(B,B32.32,B1,B8) 22,22,22,22 write(*,(O,O12.12,O1,O4) 22,22,22,22 write(*,(Z,Z8.8, Z1,Z4) 22,22,22,22 write(*,(B,B32.32,B1,B8) 22系,22系,22系,22系 write(*,(O,O12.12,O1,O4) 22系,22系,22系,22系 write(*,(Z,Z8.8, Z1,Z4) 22系,22系,22系,22系 End,6.10 示例,输出结果如下:1011000000000000000000000000000010110* 10110
45、26000000000026* 261600000016* 16 *10110101110011110011001000110010*26563631062026563631062*B5CF3232B5CF3232*,第六讲 Fortran数据结构及输入、输出,6.11 任意类型数据有格式输入输出,G编辑符可用于任意数据类型的有格式输入输出,一般格式是: rGw.dEe 其中:r为G编辑符重复次数;w为域宽;d为小数位数;e为指数位数。对于整数,上述格式等价于rIw。对于字符串,上述格式等价于rAw。对于逻辑值,上述格式等价于rLw。对于实数,上述格式等价于rFw.d或 rEw.dEe。 给定
46、下面示例程序:COMPLEX cLOGICAL logCHARACTER*5 str1READ(*,10) i,log,str1,a,c 10 FORMAT(3G5.1,3G8.1)WRITE(*,“(1X,3G5.1,3G8.1)“) i,log,str1,a,cEND,概述,6.11 任意类型数据有格式输入输出,执行上面程序时,输入数据:12345tttttchina01234567111222.52.5。 程序执行后,i、log、str1、a、c的值为: i=12345,log=.TRUE.,str1=china,a=123456.7,c=(111222.5,2.5) 程序执行后,输出结
47、果为:12345Tchina0.1E+060.1E+063.。,第六讲 Fortran数据结构及输入、输出,6.12 不可重复编辑符,第六讲 Fortran数据结构及输入、输出,6.12 不可重复编辑符/X,6.12 不可重复编辑符,X/TS:PBNQ,X编辑符用于设置输入输出数据的开始位置。 对输出,从当前位置开始插入若干空格,下一输出数据从新位置开始进行。 对输入,从当前位置开始右移若干字符,下一输入数据从新位置开始进行。 示例:READ(*,11) i,j,k 11 FORMAT(2X,I3,3X,I3,3X,I3)WRITE(*,21) i,j,k,i+j+k 21 FORMAT(1X,i=,I3,4X,j=,I3,4X,k=,I3,4X,i+j+k=,I4)END 输入:i=123j=456k=789。 i、j、k值:i=123,j=456,k=789。 输出:i=123j=456k=789i+j+k=1368。,