最近需要使用fortran,通过网上的资料,快速入门该语言
program main !程序开始,main可以自定义
implicit none !告诉编译器,所有变量需要声明后才能使用,否则编译失败
!主体内容
stop !终止程序,相当与C exit(0)
end program main
与老式C语言一样,所有变量声明在开头,之后就不能声明了
parameter声明的变量,不可被修改,相当于C中的const
program fortran_learn
implicit none !不允许隐式变量声明
integer, external :: myfunc !声明函数,必须有返回类型
integer :: a !int类型(4字节)
integer(kind=8) :: b !int 8字节
integer :: i !4字节
integer sum
real :: p,q !浮点数
character :: ch !charl类型
character(len=20) :: name !字符数组
character(len=10) :: str1, str2, str !字符串
logical :: true_or_false !逻辑类型
complex :: cx !复数
integer, dimension (5,5) :: matrix !声明5x5矩阵,二维数组
real, dimension (5) :: array !声明数组
integer, parameter :: constval = 123 !不能修改
!变量赋值
a = 12345678
print *, a, b
name = "abcdefg"
print *, name
true_or_false = .true. !.false.
print *, true_or_false, b !一次输出多个
cx = cmplx(23.1, -7) !23.1+7i
print *, cx
a = 2**3 !2^3
print *, a
array(2) = 23.4
array = (/12.0, 234.4, 234.2, 45.2 , 123.45/) !数组初始化
print *, array !打印数组
end program
数组操作补充,类似matlab
a(3:5)=(/3,4,5/) !a(3)=3,a(4)=4,a(5)=5
a(1:5:2)=3 !a(1)=3,a(3)=3,a(5)=3
a(3:)=5 !a(3)以及之后的所有元素赋值为5
a(1:3)=b(4:6) !类似于这种的要求左右数组元素个数相同
a(:)=b(:,2) !a(1)=b(1,2),a(2)=b(2,2),以此类推
if有if-endif , if-else-endif , if-elseif-endif 这几种模式,与C一眼
select就是C中的switch
do-endo就是列表循环
do-while 与C一致
常用运算符(if条件判断)
(1)逻辑运算符
== /= > >= < <= ! Fortran 90用法
.EQ. .NE. .GT. .GE. .LT. .LE. ! Fortran 77用法
(2)涉及相互关系的集合运算符
.AND. .OR. .NOT. .EQV. .NEQV. ! 仅.NOT.连接一个表达式,其余左右两边都要有表达式(可以是logical类型的变量) !.EQV.:当两边逻辑运算值相同时为真, .NEQV.:当两边逻辑运算值不同时为真
if (a >= 8) then !if-then-endif
print *, "a>=8"
end if
if (true_or_false .and. .true.) then !两个都是true
print *, "true_or_false and true is true"
else
print *, "true_or_false and true is not all true"
end if
ch = 'A'
! select结构
select case (ch)
case ('A')
print *, "A"
case ('B')
print *, "B"
end select
! do-while 循环结构
a = 1
b = 100
sum = 0
do i = a, b
sum = sum + i
end do
print *, "1 to 100 ", sum
sum = 0
do i = a, b, 2 ! i+=2
sum = sum + i
end do
print *, "odd sum ", sum
子程序使用call来调用,且子程序没有返回值,参数是地址的形式传递,返回值是作为参数
函数需要声明后才能使用,跟变量的声明类似,返回变量就是自身的函数名
(函数需要声明的原因,数组使用()来索引,如果不声明无法区分是数组还是函数)
integer, external :: myfunc !在外部使用该语句声明函数
integer :: a,b,c
c = myfuc(a,bc) !调用函数
function myfunc(a, b)
implicit none
integer :: myfunc, a, b !声明返回值类型和函数参数
myfunc = a * b
end function myfunc
call mysub(a,b) !调用子程序
subroutine mysub(a, b)
!intent: 意图属性允许指定与参数的过程中使用的意向
implicit none
integer, intent(in) :: a !a不会被改变
integer, intent(out) :: b !b可能会被改变
integer :: c
print *, "call mysub"
!a = 123 ! a是输入的变量,不可以被修改
b = a + 1
end subroutine mysub
递归函数
recursive function myfactorial (n) result (fac) !递归函数 result指定返回值,默认返回值为函数名
implicit none
integer :: fac
integer, intent (in) :: n !输入的变量、
select case (n)
case (0:1)
fac = 1
case default
fac = n * myfactorial (n-1)
end select
end function myfactorial
声明模块
module constants
! 模块中一般是声明函数或者过程
implicit none
real, parameter :: pi = 3.1415926536 !parameter声明,相当于const
real, parameter :: e = 2.7182818285
contains !内部过程或函数,变量不可在这声明
subroutine show_consts()
print*, "Pi = ", pi
print*, "e = ", e
end subroutine show_consts
end module constants
使用模块
program fortran_learn
use constants !声明使用的模块,该句在第一句
implicit none !不允许隐式变量声明
call show_consts() !调用模块过程
print *, pi !模块公有变量
end program
使用private修饰后的变量,外部不可以访问,例如
module constants
! 模块中一般是声明函数或者过程
implicit none
real, private :: val !外部不可访问
contains !内部过程,变量不可在这声明
subroutine set_val(val2)
integer, intent(in) :: val2
val = val2
end subroutine set_val
subroutine print_val()
print *, "val is ", val
end subroutine print_val
end module constants
program fortran_learn
use constants !声明使用的模块
implicit none !不允许隐式变量声明
call set_val(2) !设置val
call print_val() !打印val
!print *, val !失败
end program