fortran 自学笔记
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
INTEGER(NUM=100) REAL UOC(NUM),ISC(NUM),RS(NUM)
Error: An automatic object is invalid in a main program.
!parameter(pi=3.1415927,J=10) parameter(pi=3.1415927,J=10.0) real :: h=1.0/J do i=1,J-1 u(i)=sin(i*pi*h) !正确写法 !注意: real :: h=1/J,这样写也是不行的 !即使 J=10.0 循环依然可以继续
数字型字符<--->数字 字符串数字 character(len=30)::aa real b 数字字符串: character(len=30)::aa real b 带小数点的数据转换: character(len=30)::aa real b
aa="1234.5678"
read(aa,*) b write(*,*) b
character(len=30)::aa
1)Free Format(自由格式) 扩展名.F90 1》行:一行为132列。可以有复数条程序语句,语句间用分号“;”分开。语句没有位置规定。 一行可以是0~132个字符,空格有意义 语句最长不超过2640个字符 最多可有511个续行 2》注释行:起始用注释符“!”号,此行其后的所有字符均作为注释(字符串中的!号除外,如 print *,’help!!!!’ )。 3》续行 :当一个语句非常长以至于132列都书写不下时,允许有39个续行。在语句行最后加 上续行符“&”号。如果字符串跨2行以上,则在续行的开始位置也要加&号。注意语句的有效字符 是从“&”前和续行符“&”之后的位置算起。(一行程序代码的最后如果是符号&,代表下一行 程序会和这一行连接。如果一行程序代码的开头是符号&,代表它会和上一行程序连接。如果 把Fortran的关键字分为两行书写,则两行都要加续行符号。)
write(10,*) u(i)
Enddo Q:为何我的u输出全是 0;
write(10,“(5f10.4)”) (v(i),i=1,5) == write(10,100) (v(i),i=0,5) 100 format(7(e10.4 , 2x)) write(10,"('aa')") ==write (10,*)‘aa’
Q: continue和 goto和break语句的区别 Continue 是跳出本次循环,进行下一次循环. FORTRAN中为CYCLE,而continue=enddo Goto Break 是强制转向,高级编程语言中不提倡用goto语句 FORTRAN也用 是跳出循环体,执行循环体下面的语句. FORTRAN中对应的为 EXIT 2.goto Main () {int i; Label: for(i=1;i<=4;i++) { if(i%2==0) goto Label; else printf("%d "i); }} 输出结果为1 1 1 1 1 1 1 …………程 序陷入死循环无法正常结束。当i=2时 执行goto语句for循环又重新开始,i重 新等于1,接着i=2,又执行goto语 句……程序不停输出1.goto语句打破了 正常的执行顺序容易出错不提倡使用 3.break main {int i; for(i=1;i<=4;i++) { if(i%2==0) break; else printf("%d "i); }} 输出为:1,当i=2是 跳出for循环,i仍等于2, 程序结束
b=1234
write(aa,'(I4)') b write(*,*) aa
b=1234.00
write(aa,*) b write(*,*) aa
end
end
end
所有第四行在进行转换时,可以把aa看是是个文本文件名 数学符号 DSQRT LOG 平方根 对数 == character*30::aa
!括号即为format的部分,引号为代价 ! 多余的格式可以不管
!或者 write (10,*)‚aa‛
Advance: 即输出一行后不换行,但是注意输出格式必须写成一样的‚(A)‛ 启示:先输出,再换行
IMSL--国际数学和统计链接库
trim和adjustl : FORTRAN的标准内部函数。 Adjustl 的作用是将字符串里的内容左对齐,空格置于右端。 trim的作用是将字符串末尾(即右端)的空格删掉。
1.continune main() {int i; for(i=1;i<=4;i++) { if(i%2==0) continue; else printf("%d "i); }} 输出为1 3,当 i=2时第一次执行 continue,进入下 一次循环即i=3, 不退出循环
Q: 如何在VC++中调用FORTRAN子程序 我在《电脑编程技巧与维护》7期上看到有关FORTRAN(应用POWER
Q:fortran怎么输出向左对齐的数据
PROGRAM main
implicit none integer :: aa(7)=(/1,10,100,1000,10000,10000,100000/)
CHARACTER(len=12) :: ch(7)
integer :: i write(ch,*) aa !把数组直接写成了字符,牛逼,研究中... do i=1,7 ch(i)=TRIM(ADJUSTL(ch(i))) write(*,*) ch(i) end do end PROGRAM
ቤተ መጻሕፍቲ ባይዱ
这是fortran的一种表示格式,它可以输出十五位有效数字,D前面的-1.表示-1.0,
D后面的0代表-1.0扩大的倍数,譬如1.3D.3就表示1.3*10^3(不过表示时得换成 十五位有效数字1300.00000000000替代之。)
EQUIVALENCE: 变量等价声明
equivalence(a,b) equivalence(c(3),d) !注意:变量a和b占用同一块内存 !数组c的第3个元素和变量d等价,数组名较长的时
INQUIRE(FILE=DIR_APP(1IR_LEN)//‘WAVECAR.’//EXT,EXIST=junk)
Q:这个句子中的两个” //”什么意思?
退出关键字
exit :退出循环…… stop :停止整个程序的运行,不管是不是在主程序中…… break :不是 Fortran 中的,至少我没有看到过用 break 的……
(二)Fixed Format(固定格式) 扩展名:.F 或 .FOR 1》标号区:第l—5列 可以写l至5位整数。也可以没有标号。标号区中的空格不起作用。如lOO与100 或100作用相同。 标号应是无符号整数(无正负号或小数点)。标号大小顺序没有任何要求。假如第二行的标号为1000, 第三行的标号可以是10,也可以是99999。 标号区内不得出现标号以外的内容,但注释行例外。注释行的内容可以写在标号区内,一行中 第一列为C或*的,该行即被认为注释行,编译时对该行内容不作翻译,对程序运行不产生任何影响。 如果在第一列上出现的不是数字、空格或C和*的字符,编译时按出错处理。
必须写你需要的数字,原因未知
FORTRAN 90可以用“”来封装字符串 FORTRAN 77只能用单引号来封装字符串 FORTRAN 77:‘’:字符串; “”:引用符
**********************************************************************
INTEGER AA(22,22)
DO 20 I=1,22 DO 20 J=1,22 20 END 对于字符串: AA(I,J)=I+I*100 WRITE(*,“(22I8)”)((AA(I,J),J=1,22),I=1,3 ) !也可写成 DO20I=1,22 !如果是将AA全部输出22可以是 大于22的任意个整数,输出仍 然是每行22个数据,但是当只 输出AA的一部分,则格式较死,
STATION平台)移植的文章。在FORTRAN移植过程中:一种方法是将FORTRAN程
序编译成EXE文件,然后通过数据文件将数据传给通过迚程生成而运行的 FORTRAN可执行文件。另一法是通过POWERSTATION的编译选项将FORTRAN子程 序编译成DLL来迚行调用。我想编译成DLL也许更符合你的要求。在该杂志第10 期上还有一篇关于NDP FORTRAN向POWERSTATION移植的文章。如果你用 POWERSTATION的话,我想帮助中有关转换成DLL的参数会有说明的。 Q:设置运行完程序后自动关机 system("shutdown now") fortran可以调用任何程序
!这里的TT想用module中的
编译时:Error: The attributes of this name conflict with those made accessible by a USE statement. 好像是EQUIVALENCE中的TT和MODULE中的TT不代表一个数组吧,名称有冲突 USE ABC , ABC_TT=>TT
杂七杂八(一)
integer是无法用real格式输出的 WRITE(*,”(I)”) I 此语法不对,不会有输出结果,可为WRITE(*,”(I2)”) I ********************************************************************** PROGRAM MAIN
候可以用一个短名的变量等价,比较方便
在module中定义了一个数组 MODULE ABC INTEGER,DIMENSION(:,:)::TT END MODULE ABC SUBROUTINE TEST USE ABC INTEGER,DIMENSION(:)::YY EQUIVALENCE(TT(1,1),YY(1)) END SUBROUTINE
Q:fortran语句:pi=dacos(-1.D0) 1.acos 前面加d什么意思 2.(-1.D0),.D0什么意思? dacos()是fortran中返回值是双精度(有十五位有效数字)的反余弦函数,其 参数也是双精度的数. -1.D0就是双精度数。-1.D0代表的是-1.00000000000000,
4》空格 :在语句名和变量名中间不能有空格。需要空格的地方必须有一个以上空格(GOTO 和GO TO,ELSEIF和ELSE IF,END构造名(构造名有:DO, PROGRAM, FUNCTION, MODULE, SUBROUTINE)等有两种写法的除外),如关系运算符 ==,<= 不能写成 = =,< =。这与F77有很大 不同之处,因为F77的设计中将编译源程序的空格忽略。
杂七杂八(二)
integer是无法用real格式输出的 WRITE(*,”(I)”) I 此语法不对,不会有输出结果,可为WRITE(*,”(I2)”) I WRITE(*,“(E10.4)”) ”DCDT=”,DCDT 不对,必须把字符串放在里面 **********************************************************************
2》续行区:第6列 如果在一行的第6列上写一个非空格和非零的字符,则该行作为其上一行的续行。注意在某些系 统中,这个字符可以不限于上面所列的,如 @ } ] ~ 等字符均可使用。F77允许一个语句有19个续行(即 一个语句最多可以写成20行)。有的程序中第6列上用“l”,“2”,…表示该行是第1个或第2个续行, 但用数字字符容易与第7列的数字形成连续的数字串而引起错觉,故最好使用固定的特殊字符。 3》语句区:第7—72列 不要求一定从第7列开始写语句,可以从第7列以后(72列以前)的任何一列开始写,但一行只 能写一个语句。如果写满了72列,一旦在终端上修改程序时在该行又插入了一些字符,就会使本行最 后几个字符超出语句区而引起意料不到的错误。特别注意到语句最后的空格将可能溢出72列,在某些 计算机系统上将导致难以查出的错误。应注意,引号内的字符串中所包括的空格是有效的,不能忽略。 4》注释区:第73—80列 在卡片输入法时代,程序员一般利用此8列为程序行编序号以便查找。注释区只对程序员提供辨 别信息,不是语句的一部分,在编译时不对72—80列作处理。
Error: An automatic object is invalid in a main program.
!parameter(pi=3.1415927,J=10) parameter(pi=3.1415927,J=10.0) real :: h=1.0/J do i=1,J-1 u(i)=sin(i*pi*h) !正确写法 !注意: real :: h=1/J,这样写也是不行的 !即使 J=10.0 循环依然可以继续
数字型字符<--->数字 字符串数字 character(len=30)::aa real b 数字字符串: character(len=30)::aa real b 带小数点的数据转换: character(len=30)::aa real b
aa="1234.5678"
read(aa,*) b write(*,*) b
character(len=30)::aa
1)Free Format(自由格式) 扩展名.F90 1》行:一行为132列。可以有复数条程序语句,语句间用分号“;”分开。语句没有位置规定。 一行可以是0~132个字符,空格有意义 语句最长不超过2640个字符 最多可有511个续行 2》注释行:起始用注释符“!”号,此行其后的所有字符均作为注释(字符串中的!号除外,如 print *,’help!!!!’ )。 3》续行 :当一个语句非常长以至于132列都书写不下时,允许有39个续行。在语句行最后加 上续行符“&”号。如果字符串跨2行以上,则在续行的开始位置也要加&号。注意语句的有效字符 是从“&”前和续行符“&”之后的位置算起。(一行程序代码的最后如果是符号&,代表下一行 程序会和这一行连接。如果一行程序代码的开头是符号&,代表它会和上一行程序连接。如果 把Fortran的关键字分为两行书写,则两行都要加续行符号。)
write(10,*) u(i)
Enddo Q:为何我的u输出全是 0;
write(10,“(5f10.4)”) (v(i),i=1,5) == write(10,100) (v(i),i=0,5) 100 format(7(e10.4 , 2x)) write(10,"('aa')") ==write (10,*)‘aa’
Q: continue和 goto和break语句的区别 Continue 是跳出本次循环,进行下一次循环. FORTRAN中为CYCLE,而continue=enddo Goto Break 是强制转向,高级编程语言中不提倡用goto语句 FORTRAN也用 是跳出循环体,执行循环体下面的语句. FORTRAN中对应的为 EXIT 2.goto Main () {int i; Label: for(i=1;i<=4;i++) { if(i%2==0) goto Label; else printf("%d "i); }} 输出结果为1 1 1 1 1 1 1 …………程 序陷入死循环无法正常结束。当i=2时 执行goto语句for循环又重新开始,i重 新等于1,接着i=2,又执行goto语 句……程序不停输出1.goto语句打破了 正常的执行顺序容易出错不提倡使用 3.break main {int i; for(i=1;i<=4;i++) { if(i%2==0) break; else printf("%d "i); }} 输出为:1,当i=2是 跳出for循环,i仍等于2, 程序结束
b=1234
write(aa,'(I4)') b write(*,*) aa
b=1234.00
write(aa,*) b write(*,*) aa
end
end
end
所有第四行在进行转换时,可以把aa看是是个文本文件名 数学符号 DSQRT LOG 平方根 对数 == character*30::aa
!括号即为format的部分,引号为代价 ! 多余的格式可以不管
!或者 write (10,*)‚aa‛
Advance: 即输出一行后不换行,但是注意输出格式必须写成一样的‚(A)‛ 启示:先输出,再换行
IMSL--国际数学和统计链接库
trim和adjustl : FORTRAN的标准内部函数。 Adjustl 的作用是将字符串里的内容左对齐,空格置于右端。 trim的作用是将字符串末尾(即右端)的空格删掉。
1.continune main() {int i; for(i=1;i<=4;i++) { if(i%2==0) continue; else printf("%d "i); }} 输出为1 3,当 i=2时第一次执行 continue,进入下 一次循环即i=3, 不退出循环
Q: 如何在VC++中调用FORTRAN子程序 我在《电脑编程技巧与维护》7期上看到有关FORTRAN(应用POWER
Q:fortran怎么输出向左对齐的数据
PROGRAM main
implicit none integer :: aa(7)=(/1,10,100,1000,10000,10000,100000/)
CHARACTER(len=12) :: ch(7)
integer :: i write(ch,*) aa !把数组直接写成了字符,牛逼,研究中... do i=1,7 ch(i)=TRIM(ADJUSTL(ch(i))) write(*,*) ch(i) end do end PROGRAM
ቤተ መጻሕፍቲ ባይዱ
这是fortran的一种表示格式,它可以输出十五位有效数字,D前面的-1.表示-1.0,
D后面的0代表-1.0扩大的倍数,譬如1.3D.3就表示1.3*10^3(不过表示时得换成 十五位有效数字1300.00000000000替代之。)
EQUIVALENCE: 变量等价声明
equivalence(a,b) equivalence(c(3),d) !注意:变量a和b占用同一块内存 !数组c的第3个元素和变量d等价,数组名较长的时
INQUIRE(FILE=DIR_APP(1IR_LEN)//‘WAVECAR.’//EXT,EXIST=junk)
Q:这个句子中的两个” //”什么意思?
退出关键字
exit :退出循环…… stop :停止整个程序的运行,不管是不是在主程序中…… break :不是 Fortran 中的,至少我没有看到过用 break 的……
(二)Fixed Format(固定格式) 扩展名:.F 或 .FOR 1》标号区:第l—5列 可以写l至5位整数。也可以没有标号。标号区中的空格不起作用。如lOO与100 或100作用相同。 标号应是无符号整数(无正负号或小数点)。标号大小顺序没有任何要求。假如第二行的标号为1000, 第三行的标号可以是10,也可以是99999。 标号区内不得出现标号以外的内容,但注释行例外。注释行的内容可以写在标号区内,一行中 第一列为C或*的,该行即被认为注释行,编译时对该行内容不作翻译,对程序运行不产生任何影响。 如果在第一列上出现的不是数字、空格或C和*的字符,编译时按出错处理。
必须写你需要的数字,原因未知
FORTRAN 90可以用“”来封装字符串 FORTRAN 77只能用单引号来封装字符串 FORTRAN 77:‘’:字符串; “”:引用符
**********************************************************************
INTEGER AA(22,22)
DO 20 I=1,22 DO 20 J=1,22 20 END 对于字符串: AA(I,J)=I+I*100 WRITE(*,“(22I8)”)((AA(I,J),J=1,22),I=1,3 ) !也可写成 DO20I=1,22 !如果是将AA全部输出22可以是 大于22的任意个整数,输出仍 然是每行22个数据,但是当只 输出AA的一部分,则格式较死,
STATION平台)移植的文章。在FORTRAN移植过程中:一种方法是将FORTRAN程
序编译成EXE文件,然后通过数据文件将数据传给通过迚程生成而运行的 FORTRAN可执行文件。另一法是通过POWERSTATION的编译选项将FORTRAN子程 序编译成DLL来迚行调用。我想编译成DLL也许更符合你的要求。在该杂志第10 期上还有一篇关于NDP FORTRAN向POWERSTATION移植的文章。如果你用 POWERSTATION的话,我想帮助中有关转换成DLL的参数会有说明的。 Q:设置运行完程序后自动关机 system("shutdown now") fortran可以调用任何程序
!这里的TT想用module中的
编译时:Error: The attributes of this name conflict with those made accessible by a USE statement. 好像是EQUIVALENCE中的TT和MODULE中的TT不代表一个数组吧,名称有冲突 USE ABC , ABC_TT=>TT
杂七杂八(一)
integer是无法用real格式输出的 WRITE(*,”(I)”) I 此语法不对,不会有输出结果,可为WRITE(*,”(I2)”) I ********************************************************************** PROGRAM MAIN
候可以用一个短名的变量等价,比较方便
在module中定义了一个数组 MODULE ABC INTEGER,DIMENSION(:,:)::TT END MODULE ABC SUBROUTINE TEST USE ABC INTEGER,DIMENSION(:)::YY EQUIVALENCE(TT(1,1),YY(1)) END SUBROUTINE
Q:fortran语句:pi=dacos(-1.D0) 1.acos 前面加d什么意思 2.(-1.D0),.D0什么意思? dacos()是fortran中返回值是双精度(有十五位有效数字)的反余弦函数,其 参数也是双精度的数. -1.D0就是双精度数。-1.D0代表的是-1.00000000000000,
4》空格 :在语句名和变量名中间不能有空格。需要空格的地方必须有一个以上空格(GOTO 和GO TO,ELSEIF和ELSE IF,END构造名(构造名有:DO, PROGRAM, FUNCTION, MODULE, SUBROUTINE)等有两种写法的除外),如关系运算符 ==,<= 不能写成 = =,< =。这与F77有很大 不同之处,因为F77的设计中将编译源程序的空格忽略。
杂七杂八(二)
integer是无法用real格式输出的 WRITE(*,”(I)”) I 此语法不对,不会有输出结果,可为WRITE(*,”(I2)”) I WRITE(*,“(E10.4)”) ”DCDT=”,DCDT 不对,必须把字符串放在里面 **********************************************************************
2》续行区:第6列 如果在一行的第6列上写一个非空格和非零的字符,则该行作为其上一行的续行。注意在某些系 统中,这个字符可以不限于上面所列的,如 @ } ] ~ 等字符均可使用。F77允许一个语句有19个续行(即 一个语句最多可以写成20行)。有的程序中第6列上用“l”,“2”,…表示该行是第1个或第2个续行, 但用数字字符容易与第7列的数字形成连续的数字串而引起错觉,故最好使用固定的特殊字符。 3》语句区:第7—72列 不要求一定从第7列开始写语句,可以从第7列以后(72列以前)的任何一列开始写,但一行只 能写一个语句。如果写满了72列,一旦在终端上修改程序时在该行又插入了一些字符,就会使本行最 后几个字符超出语句区而引起意料不到的错误。特别注意到语句最后的空格将可能溢出72列,在某些 计算机系统上将导致难以查出的错误。应注意,引号内的字符串中所包括的空格是有效的,不能忽略。 4》注释区:第73—80列 在卡片输入法时代,程序员一般利用此8列为程序行编序号以便查找。注释区只对程序员提供辨 别信息,不是语句的一部分,在编译时不对72—80列作处理。