爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 5859|回复: 6

[经验总结] Fortran基本用法小结

[复制链接]

新浪微博达人勋

发表于 2015-8-7 11:23:16 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
Fortran的基本程序结构
先看一看所谓的"Hello Fortran"程序。
program main          !程序开始,mainprogram的名字,完全自定义
write(*,*) "Hello"    !主程序
stop                  !终止程序
end [program[main]]   !end用于封装代码,表示代码编写完毕。
[ ]中的内容可省略,下同。

程序用于计算圆柱的表面积,要求输入底面半径和高。其中展示了Fortran的一些特色用法。程序摘自维基。其实是一个叫www.answers.com的网上引用的维基的网页。推荐去看看!能查到不少有意思的东西。

program cylinder        !给主函数起个名字
! Calculate the area of a cylinder.
!
! Declare variables and constants.
! constants=pi
! variables=radius squared and height

  implicit none         ! Require all variables to be explicitly declared
                        ! 这个一般都是要写上的。下面会进一步说明。
  integer :: ierr
  character :: yn
  real :: radius, height, area
  real, parameter :: pi = 3.1415926536   !这是常量的声明方法

  interactive_loop: do       !do循环,Fortran中的循环可以加标签,如do
                             !面的 interactive_loop就是标签

!    Prompt the user for radius and height and read them.

     write (*,*) 'Enter radius and height.'    !屏幕输出
     read (*,*,iostat=ierr) radius,height      !键盘输入。isotat的值用于判断
                                               !输入成功否。

!    If radius and height could not be read from input,
!    then cycle through the loop.
     if (ierr /= 0) then         
        write(*,*) 'Error, invalid input.'
        cycle interactive_loop                  !cycle 相当于C里的continue
     end if

!    Compute area.  The ** means "raise to a power."

     area = 2 * pi * (radius**2 + radius*height)        ! 指数运算比C方便

!    Write the input variables (radius, height)
!    and output (area) to the screen.

     write (*,'(1x,a7,f6.2,5x,a7,f6.2,5x,a5,f6.2)') &     !"&"表示续行。这里
                                                          !还显示了格式化输出
          'radius=',radius,'height=',height,'area=',area

     yn = ' '
     yn_loop: do                                           !内嵌的另一个do循环
        write(*,*) 'Perform another calculation? y[n]'
        read(*,'(a1)') yn
        if (yn=='y' .or. yn=='Y') exit yn_loop
        if (yn=='n' .or. yn=='N' .or. yn==' ') exit interactive_loop
     end do yn_loop                                         !结束内嵌do循环

  end do interactive_loop   
end program cylinder        

Fortran程序的主要结构就是这样了。一般还会有些module的部分在主函数前,函数在主函数后。

三、数据类型及基本输入输出
1、数据类型,声明及赋初值
1integer: 短整型kind=2, 长整型kind=4     
   integer([kind=]2) :: a=3
   如果声明成integer:: a,则默认为长整型。
  !"::" 在声明并同时赋初值时必须要写上;类型名后面有形容词时也必须有;其他情况可略去 !所谓形容词,可以看一下这个。比如声明常数
   realparameter :: pi=3.1415926 parameter就是形容词。
2real:单精度kind=4(默认),双精度kind=8   
   real([kind=]8) :: a=3.0
   还有指数的形式,如1E10为单精度,1D10为双精度
3complex 单精度和双精度         
   complex([kind=]4) b
4character   
   character([len=]10) c  !len为最大长度
5logical      
   logical*2 :: d=.ture. (等价于logical(2)::d=.ture.)
6)自定义类型type:类似于C中的struct

Fortran 77中给变量赋初值常用DATA命令,可同时给多个变量赋初值
data  a,b,string  /1, 2.0, 'fortran'/

C不同的是,Fortran中变量不声明也能使用,即有默认类型(跟implicit命令有关)。按照默认的规定,以i,j,k,l,m,n开头的变量被定义为integer,其余为real。取消该设置需在程序声明部分之前加implicit none。彭国伦建议一般都使用该语句。
另一点关于声明的不同是Fortran"等价声明"
integer a,b
equivalence(a,b)
使得a,b使用同一块内存。这样可以节省内存;有时可精简代码。如:equivalence(很长名字的变量,比如三维数组的某个元素,a),之后使用a来编写程序就简洁多了。

2、基本输入输出
输入:read(*,*) a           !从键盘读入   
输出:write(*,*) "text"     !在屏幕上输出。Fortran 77'text'Fortran 90   
                            !一般" "' '都可
     print *"text"        !只能屏幕输出
*,*)完整写为(unit=*,fmt=*)。其中unit为输入/输出位置,如屏幕,文件等;fmt为格式。如果这两项都写成*,则按默认的方式进行,即上面描述的。print后面的*表示按默认格式输出。

四、流程控制
1、运算符
1)逻辑运算符
==    /=    >    >=   <    <=        !Fortran 90用法
.EQ.  .NE.  .GT.  .GE.  .LT.  .LE.   !Fortran 77用法

2)涉及相互关系的集合运算符
.AND.  .OR.  .NOT.  .EQV.  .NEQV.  
! .NOT.连接一个表达式,其余左右两边都要有表达式(可以是logical类型的变量)
!.EQV.:当两边逻辑运算值相同时为真, .NEQV.:当两边逻辑运算值不同时为真

2IF
(1) 基本 :
if(逻辑判断式) then
       ……
end if

如果then后面只有一句,可写为
if(逻辑判断式)  ……         !thenend if可省略

(2)  多重判断:
if(逻辑判断式) then
……
else if
……
else if
……
else
……
end if

(3) 嵌套:
if(逻辑判断式) then
  if(逻辑判断式) then
    if(逻辑判断式) then
    else if(逻辑判断式) then
    ……
    else
    ……
    end if          !没必要跟C语句多时用{}了,因为有end if
  end if
end if

(4) 算术判断:
program example
implicit none
real c
write (*,*)  "input a number"
read (*,*) c
if(c) 10,20,30     !10,2030为行代码,根据c小于/等于/大于0,执行10/20/30行的程序
10    write (*,*)  "A"
goto 40            !goto可实现跳到任意前面或后面的行代码处,但用多了破坏程序结构
20    write (*,*)  "B"
goto 40
30    write (*,*)  "C"
goto 40
40    stop
end

3SELECT CASE
类似于Cswitch语句
select case(变量)
case(数值1! 比如case(1:5)代表1<=变量<=5会执行该模块
……          !case135)代表变量等于135会执行该模块
case(数值2!括号中数值只能是integer,characterlogical型常量,不能是real
……
case default
……
end case

4PAUSE, CONTINUE
pause暂停程序执行,按enter可继续执行
continue貌似没什么用处,可用作封装程序的标志

五、循环

1DO
do counter=初值, 终值, /减量   !counter的值从初值到终值按增/减量变化,
      ……                       !counter每取一个值对应着一次循环。增/减量不写则默认为1
      ……      
      ……                       !循环主体也没有必要用{}
      ……
end do

Fortran 77中不是用end do来终止,而是下面这样子:
do 循环最后一行的行代码  counter=初值, 终值, /减量   
             ……      
行代码       ……       !这是do的最后一行

2DO WHILE
do while(逻辑运算)
……   
……   
end do
类似于C中的while(逻辑运算) {……}
一开始那个计算圆柱表面积的程序中,应该也算是这一类。不过它是通过内部的if语句来控制循环。看来也是可以的,不过在这本书上没看到这样写。其实应该也可以归于下面这种。

3、没看到和C里面的do{……}while(逻辑运算); 相对应的循环语句,不过可以这样,保证至少做一次循环:
do while(.ture.)
……
……
if(逻辑运算) exit  !exit就好比C里面的breakC里的continueFortran里是cycle
end do

4Fortran的一个特色:带署名的循环
可以这样,不易出错:
outer:  do i=1,3
      inner:  do j=1,3
         ……
      end do inner
end do outer

还可以这样,很方便:
loop 1: do i=1,3
  loop2: do j=1,3
     if(i==3) exit loop1     !exit终止整个循环loop1
     if(j==2) cycle loop2    !cycle跳出loop2的本次循环,进行loop2的下一次循环
     write(*,*) i,j
  end do loop2
end do loop1

还有一些循环主要用于Fortran中的数组运算,为Fortran特有,很实用。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2015-8-7 15:40:56 | 显示全部楼层
大学四年唯一挂科的就是fortran了。一辈子都记得啊
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2015-8-8 08:19:47 | 显示全部楼层
有尅有续集啊  求
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2015-8-10 10:23:06 | 显示全部楼层
不错,希望楼主多写点啊
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2015-8-26 22:29:16 | 显示全部楼层
谢谢谢谢谢谢
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2015-9-11 08:38:00 | 显示全部楼层
学习学习!!
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2015-9-11 08:49:29 | 显示全部楼层
实用~精简!
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表