由于大量的接触fortran77,先学习fortran77吧
- 1.fortran不区分大小写,fortran77一般全部大写,感觉没必要,不好读,还是用大小写混合着写吧。后缀 .for 为固定格式的代码,比如fortran77的代码语法就是。另一种以 .f90 为后缀,是*格式。
Program ex1
print *,'Hello world!'
end
- 最好在程序开头写上implicit none语句,作用是不按照默认的数据类型。要是默认的则I和N之间所有字母开头的变量都代表这个变量是整数类型。
Program ex1
implicit none
real x,y,z,aver
x=90.5
y=87.0
z=60.5
aver=(x+y+z)/
print *,'the three number are:',x,y,z
print *,'average=',aver
end但是注意所有变量要在所有执行语句之前声明。
- 调用子函数:
在子函数中声明与子函数同名的变量,记得要返回的值赋值给这个与子函数同名的变量。
c Main program,to calculate the area of the circle
Program ex2
implicit none
real x,y,z,areaofcircle
x=90.5
y=87.0
z=60.5
print *,'r=',x,'area of circle=',areaofcircle(x)
print *,'r=',y,'area of circle=',areaofcircle(y)
print *,'r=',z,'area of circle=',areaofcircle(z)
end function areaofcircle(r)
implicit none
real r ,areaofcircle
areaofcircle=3.1415926*r**
return
end
从上面可以看出,子函数更像数学里一个公式,其实areaofcircle可以用一个更简单的f代替,就更好理解啦。
- 子例行函数
c Main program,to calculate the area of the circle
Program ex2
implicit none
real x,y,z,xarea,yarea,zarea
x=90.5
y=87.0
z=60.5
c 必须有call
call areaofcircle(x,xarea)
call areaofcircle(y,yarea)
call areaofcircle(z,zarea)
print *,'r=',x,'area of circle=',xarea
print *,'r=',y,'area of circle=',yarea
print *,'r=',z,'area of circle=',zarea
end
c 通过传址方式回传数值,利用了area的地址
subroutine areaofcircle(r,area)
implicit none
c 含有implicit none语句,那么本子程序所有变量都要显示声明
real r,area
area=3.1415926*r**
end
2. 算法
- if:
program readGrade
implicit none
integer num,grade,i,j
i=
j=
print *,"请输入",i,"个人的学号和成绩:"
read *,num,grade
if(grade .GT. ) then
print *,num,grade
end if
j=j+
if (j .LE. i) goto
end
尽量不要用goto这种跳转,多了逻辑会很乱。可以用do 代替。
由于visual studio 2013安装的inter 的fortran编译器兼容性比较好,在.for中写fortran90的语法也不报错,所以,大于号也可以直接写 >,比如: if(grade > 80) then
判断是否是闰年:
C 判断是否是闰年,这种c开头的注释是fortran77语法
Program isYear
implicit none
integer year!year是整数类型; 以 ! 开头的语句或!之后的部分是fortran90语法的注释
!下面是执行语句
year=
!下面是默认的读入方式
print *,'请输入年份,为整数:'
read *,year
if ( MOD(year,) .EQ. ) then
if (MOD(year,) .NE. ) then
print *,year,'年是闰年,1'
else
print *,year,'年不是闰年,1'
endif
else
if (MOD(year,) .EQ. ) then
print *,year,"年是闰年,2"
else
print *,year,'年不是闰年,2'
endif
endif end
- 计算1-1/2+1/3-...-1/100:
program computeSum
implicit none
real sum
integer i
sum=0.0
do i=,
if (mod(i,) .EQ. ) then
sum=sum-1.0/i
else
sum=sum+1.0/i
end if
print *,sum end
program computeSum
implicit none
real sum
integer i
sum=0.0
do , i=, ,!10后面的逗号要不要都行
if (mod(i,) .EQ. ) then
sum=sum-1.0/i
else
sum=sum+1.0/i
end if!fortran77中不让这样,但也可以执行,兼容了
print *,sum
sum=
do , i=, ,!10后面的逗号要不要都行
if (mod(i,) .EQ. ) then
sum=sum-1.0/i
else
sum=sum+1.0/i
end if
continue!最好这样
print *,sum end
优化
--------------
program mymath
!double 比 real 精度要高
double precision a,b!fortran77语法
a=11111.1
b=1111.11
print *,a*b
print *,sin(1.0)
print *,asin(1.0)
print *,log(3.0)
print *,int(8.6)
print *,mod(,)
print *,sign(8.5,-2.0)!将后一个数的符号给前一个数
print *,max(1.0,3.0,9.0,11.0,22.0,100.0)!求一系列数的最大值,但类型必须相同,都是实数
print *,max(,**,,,,)!类型必须相同,都是实数,**10代表2的10次方
print *,min(,,,,,)
!real 只能表示7位数
print *,0.001+123456.0-123455.0
print *,123456.0-123455.0+0.001
print *,1.0/3.0*3.0
print *,,
print *,sqrt(4.0),sqrt(9.0)!必须为实型数据
print *,sqrt(a),sqrt(b)
write(*,*) ''!整数占11列,两个整数占23列,说明中间有个空格 end
--------------------------
program arrayStudy
double precision a(:)!一维数组,包含10个整形数组
double precision b(:,:)!二维数组,3行3列
!dimension b(:,:)!和上面声明效果一样,不过是多写了一行
!double precision b
DATA C,D,E,F/-1.0,2.0,3.0,4.0/
DATA G/2.0/,H/3.0/ integer i
do ,i=,
a(i)=i**
!print *,a(i)
continue
print *,a()
end
Program ex1
print *,'Hello world!'
end
fortran77.for