文章参考:
【1】《fortran 95 程序设计》-彭国伦
【2】https://www.bilibili.com/video/BV1oe4y1E7VL/?p=42&spm_id_from=333.880.my_history.page.click
【3】https://www.bilibili.com/video/BV1Lv41117Lz/?spm_id_from=autoNext&vd_source=66b0773d043c6771a39076e23ddfb6af
一、书面格式
二、一些注意的点(区别于其他语言)
-
每行末尾不需要加分号
-
输出:
write(*,*)a ! 括号里面是*号
-
写完程序后最后一行要写end,对所写程序进行封装
-
在program的下一行加上以下内容以取消它的默认设置(会把IJKLMN开头的字符串设置成整型)
implicit none
-
常量声明
real,**parameter**::pi=3.1415926
-
等价声明
equivalence(a,b) !两个变量使用同一块内存空间,改变a的同时也会改变b
-
声明的位置:使用Fortran时所有变量都需要先声明后使用,意思是所有变量的声明都需要统一放在操作之前,这和一般的语言使用方式是有差别的。
type::person !自定义数据类型
a%name="zhangsan" !变量a的值会逐个访问name这个字符串,并给它赋值
三、选择判断语句
-
if 语句
if(判断条件1) then 执行命令语句1 else if(判断语句2) **then** 执行命令语句2 ... 执行完所有命令后要对这个条件判断语句的程序进行封装 end if
-
逻辑预算符 不等于 /=
-
要表示一个变量大于1小于3时
if(x>1**.and.**x<3)
-
do循环
do counter=1,lines,1 (计数器,名称可以自己命名,表示初始值为1,循环lines次,后面的1可以省略,默认执行一次循环就在计数器加1) ...... end do
-
do while循环
do while(逻辑运算) ....... end do
-
cycle命令可以跳出本次循环,进行下一次的循环,相当于C里面的continue
-
exit命令可以跳出本层循环,意思是所在位置的循环全部终止,但不会影响外层的循环,相当于C里面的break
四、数组
4_1、一维数组
数据类型 数组名(数组大小)
integer arr(10)
4_2、二维数组
数据类型 数组名(size1,size2)
integer arr(2,3)
4_3、数组索引
由于Fortran中数组的索引值都是从1开始,但是可以经过特别声明的方法来改变这个默认的规则,在声明时,可以特别赋值数组的坐标值使用范围,例如:integer a(0:5) 可以将数组的索引值设置为从0到5。
4_4、数组的初始化
4_5、数组的存储规则
4_6、数组的操作
需要注意第七条,数组b需要满足浮点数的条件
4_7、where命令:判断数组的部分元素
4_8、forall命令:循环判断使用数组元素
4_9、大小可变的数组
注意,用完之后一定要及时释放内存
五、子函数
5_1、子程序
program example
implicit none
integer::a=2,b=3
call message() !请调用message函数
call add(a,b) !请调用add子程序
end
!子程序message
subroutine message()
implicit none
write(<em>,</em>) "hello"
return
end
!子程序add
subroutine add(first,second)
implicit none
integer::first,second
write(<em>,</em>) first+second
return
end
输出3+2的结果是 5
如果是自定义函数,调用的时候就无需使用call命令,且子程序无法返回数值
(其实我暂时没懂这句话的意思)
5_2、自定义函数
5_3、子程序的局部变量
COMMON /group1/ inf, e
这表示在公共区 group1
中有变量 inf
和 e
。无论在主程序还是子程序中给这些变量赋值,它们的值都会保持一致。
现在更推荐使用module来代替,Fortran不分大小写
5_4、函数的只读操作
(中间有两部分比较简单的部分此处省略,因为后面也会提及)
2,3知道即可
<p>program example
implicit none
integer,external::func
integer::f
integer::a=1
write(<em>,</em>) a
call sub(a)
write(<em>,</em>) a
f=func(a)
write(<em>,</em>) a
end program</p>
<p>subroutine sub(num) !num是形参,值可以随着子程序变化
integer::num !会改变a这个实参的值,可以加上integer,intent()in::a来固定a
num=3
return
end subroutine</p>
<p>integer function func(num)
integer::num
num=7
return
end function</p>
输出1 3 7(纵向排列)
注意:一个项目只能有一个主函数,【main函数(C语言),program(Fortran)】
5_5、函数的使用接口
5_6、不定个数的参数传递
5_7、函数递归
- 改变参数传递位置的方法
- 函数递归
fact不能返回,只能当作函数来使用,只能通过ans返回
5_8、内部函数模块(contains和module)
先输出1 2
在输出5 9
这种方式不需要函数声明,也不需要函数接口
输出的结果不一样,当调用show时会根据输入的实参类型来决定调用哪个子程序
当调用进入口entry时,只执行entry后面的子程序,前面的不执行
在Fortran中我们定义一个自定义类型后无法直接使用加减乘除这些操作符,但是我们可以自己定义一个内部函数对自定义类型来进行操作
.dot.注意两边的.是不能省略的
六、总结
1.数据类型定义及使用
2.文件类型
1)主函数
program main
···
end program main
2)子函数
module constant
···
end module constant
fortran里面的use相当于python里面的import,用来调用子函数模块
3.子程序的嵌套使用
乘方3**8
除余mod(3,8)
log(3)
exp(8)
注释:在语句前加上!或者C
4.选择判断和循环语句
5.打开文本
用完后得关闭文本,把这个文本取一个代称3
打印用print *,
输出用write(3,*) a指的是把3这个文件输出到l_list这个新的文件里
6.转换文件数据类型
7.运行Fortran需要的命令
使用Fortran之前需要compile,下面是相应的运行命令
FC:运行Fortran。电脑安装的是iFortran就写成ifort,安装的是gFortran就写成gfortran
要注意前后顺序,constant要写在calculate的前面,这样calculate才能使用constant成功compile之后的数据
example:
make clean会把之前complie的数据删掉
会print结果,里面存储的res:7.00000
以及call output会出来out.log文件,里面存储的是l_list的数