Fortran保姆级教学——考试所有知识点看这一篇就够了
临近期末本人复习的同时将整个fortran课堂知识整理了下来,希望学弟学妹们今后学这门课的时候不至于在csdn找不到系统的教程,也希望能帮到需要期末突击的同学。
都是考试重点,跳过了一些不常用的方法,用的最通俗易懂的语言和例子,如果有疏漏或者错误的希望得到大家指正
不要为了考试学编程,爱上它就会发现新天地
文章目录
Fortran保姆级教学——考试所有知识点看这一篇就够了一、Fortran语言的历史和优点历史优点
二、Fortran语言基础1.字符集2.保留字3.基本数据类型1.整型常量2.实型常量3.复型常量4.字符型常量5.逻辑型常量6.符号常量
4.变量的声明1.整型变量声明2.实型变量的声明3.字符型4.逻辑型变量声明5. 全局变变量的声明
三. 表达式和语句1.表达式2.关系表达式3.逻辑运算
四. 程序怎么写(三大结构和写法)1.Fortran程序框架2.顺序结构3.选择结构1.if系列2.select case
4.循环结构1.DO循环2.DO-WHILE循环3.退出循环语句4.如何选择两种循环5. forall循环筛选操作
5.输入语句6.输出语句. 写程序中容易犯的错误
五. 数组1.什么是数组2.数组的定义3. 数组引用4.数组的储存结构5.数组的输入输出6.给数组赋初始值7. 数组运算8.数组的常用内置函数9. where10. 可变长数组11. 改变当前数组的长度
六. 文件1.读文件2.要记住的两个读写方式1.文本文件顺序读写2.二进制文件顺序读取3.二进制文件直接读取
3.文件的读写
7.子程序1.什么时候需要子程序2. 函数子程序function3. 子例行程序subroutine4. 传参的注意点1. fortran是地址传参2. 数组参数
八. 一个综合例子
一、Fortran语言的历史和优点
历史
Fortran全称:Formula Translator(公式翻译器)1953年由巴库斯第一次提出解决科学和公式计算问题的程序设计语言1991年发布的Fortran90 是主要使用的Fortran版本
优点
适合计算的语言,语法简单在数值计算,科学和工程技术领域,Fortran有强大的优势Fortran编写的大型科学计算软件比C编写的通常快一个量级
总结一句话:快!大家现在学的程度处理的数据量还太小了,但一但是超大数据量计算时,就能体现出速度的差异了,一个量级可不是开玩笑的
二、Fortran语言基础
1.字符集
Fortran中规定可以使用的字符为:A-Z,z-a 数字0-9,以及一些特殊符号 Fortran中不区分大小写,实际编写中按自己习惯来,我习惯关键字要么都大写要么都小写,保证程序的可读性
2.保留字
语句保留字:用于描述语句语法成分的固定单词
常用的保留字有
PROGRAM INTEGER REAL READ PRINT WRITE DO END SUBROUTINE FUNCITION
稍后的使用中这些都是一定会使用的,不用特殊去记忆,但是需要注意避免使用保留字作为实体名称,这会降低程序的可读性
3.基本数据类型
这一部分有个大概了解就行,重点是各种数据类型变量的声明 这是一部分Fortran数据类型,如果看的有点懵逼不要紧,考试阶段我们只用掌握内部数据类型,简单又好学
1.整型常量
整型常量又称为整型常数或整数,包括正数,负数和0如:1,2,3,4,0,-10都是整型使用关键字integer来声明
2.实型常量
实型可以理解为实数——包括小数,指数使用real关键字声明小数应该大家都会的,重点说一下指数的表达
!声明一个实型变量
real a
!声明时候赋值(小数点后可以没有数字)
real ::a=9.
指数的表达:用E分隔,E左边是数字部分,右边是指数部分 real ::a= 3.14E5 !表示3.14*乘十的五次方 注意:
E后面的指数只能是整型常量E左右两边数字必须都有,E9是不合法的E表示单精度实数,当单精度实数不足以表示一个数的大小或者精度时候,用双精度表示——将E换位D即可
3.复型常量
用一对括号括起来的两个实数表示,一个表示实部,一个表示虚部,**很简单,考试应该也不怎么考,看看就好**
ex: (1.0,1.0)表示 1.0+1.0i
4.字符型常量
用单引号引起来的若干非空字符串,称为字符型,如’a’ ‘#dfhgsf’使用关键字character来声明如果在单引号内想使用引号,需要在需要的地方加两个‘ ex:'I '‘m a boy’ 表示的是——I’m a boy字符串长度:从第一个字符算起,有多少个字符长度就是多少,注意:“空格” 空格算一个字符,有一个空格不表示空,同时’中间啥都没有’字符串长度为0
5.逻辑型常量
逻辑型(boolean)只有两个——true 和 false逻辑型也可以表示整型——true赋值后可以表示任何整数,未赋值的时候true表示-1, false表示0 ,可以参与数学运算
6.符号常量
可以理解为定义宏变量PARAMETER (pi=3.1415926) =>定义pi是3.1415926,之后使用pi就代表这个数字,方便,对于一些全局都要使用的如year,可以使用这样定义,增加程序可读性和解耦合
4.变量的声明
变量的声明是程序的重要重要部分,不会这部分就无法写程序!!!
变量是什么:指在程序运行期间其值可以变化的量,实质上是系统在内存中开辟了一个存储单元来存放变量的值变量名的命名规范(考试必考):必须!必须!以字母开头,只要看到不是字母开头的都是错的,记住这个原则就对了,非开头可以使用数字和下划线 ex: Sum, Average1, prcp, hello_world 都是合法的 | 1sum, ok% 这样的就是非法的变量名的声明最好见名知意,方便程序阅读
1.整型变量声明
使用关键字integer
! 声明一个名叫a的变量
integer a
integer a,b
! 同时声明了两个整型变量
可以选择整数在内存中储存的字节数
integer(1) a
integer(2) a ->短整型
integer(4) a ->长整型(默认就是4)
integer(8) a
!括号中数字越大表示储存的字节数越长,能储存的数字范围就越大
在声明期间想给a赋值要用” :: “
integer ::a=0
!切记不可不用::直接赋值——integer a=4是非法的
2.实型变量的声明
和整型类似,但是用real关键字声明只有real(4) 和real(8) 分别是单精度实型和双精度实型
3.字符型
使用关键字character声明
需要指定字符型长度,否则默认是长度为1
character a ->长度为1的变量a
character (9) b,d ->同时声明了两个长度为9的字符串
character(3) ::b='hel' ->声明了b且赋值为'hel'
character*5 ::b='hello' =>使用character*len 也可以设定相应长度的字符串
字符型常用函数
CHAR(num)-> 返回数字num对应的ASCII字符表的值
LEN(string)-> 返回字符串长度
LEN_TRIM(string)-> 返回去掉字符串尾端空格后的长度
INDEX(string,key)-> 第一个string是要处理的字符串对象,第二个是要查找的值,返回key在string中第一次出现的位置
TRIM(string)-> 返回string 去掉尾端空格的值
4.逻辑型变量声明
使用logical关键字声明
program main
logical ::b=.TRUE. =>这种方式声明的true,默认参与运算时是-1
logical ::a=5
write(*,*)a+5,b+1
! => 10 0
pause
end
program main2
logical a
a=true
a=3
write(*,*)a
! =>T 就算赋值之后a也是布尔类型,但是参与运算的时候当3
end
!注意:赋初始值的时候a不能使用 logical ::a=true或者a=T,只能让a是一个数或者a=.TRUE.,只要非0就是true,是5也可以
5. 全局变变量的声明
在一个函数或者一个子程序中声明的变量,作用域只有在该函数或者子程序中,如果想声明全局变量需要用common关键字声明
program main
integer a,b,c
common a,b,c
external sub
a=3.14
b=4.76
c=3.81
call sub()
pause
end
subroutine sub()
integer a,b,c
common a,b,c
write(*,*)a
end
由于全局变量是通过地址对应的方式实现共享数据的,因此如果声明了100个全局变量,想取到最后一个全局变量,则需要把之前99个变量都要写出来,才能拿到最后第100个变量为了解决这个问题,可以将全局变量进行分组使用common /groupname/ 就可以进行分组定义和分组取值
program main
real pi, c1, c2
common /group1/ pi, c1
common /group2/ c2
external sub
const1 = 3.14
c2 = 4.47
call sub()
pause
end
subroutine sub()
real pi, c1, c2
common /group2/ c2
write(*,*) c2
end
三. 表达式和语句
1.表达式
看这张图就ok
注意点:考试必考
算数运算顺序:先乘方再乘除最后加减;有括号括号优先
易考易错 不同类型之间的运算规则:
同类型之间运算结果还是同类型——最典型是整型之间除法,最后还是整型 ex:1/2 =0而不是0.5,0.5变成整型要把小数舍掉,还是0不同类型之间的转换:会自动把低级类型转换为高级类型,同时转换从左到右进行,遇到不同类型才进行转换 ex: 1/2* 1.0=0 1./21=0.5记住real类型比integer高级就行
2.关系表达式
关系表达式的格式: 表达式1 关系运算符 表达式2 ===>返回布尔值T/F
12>34 整数之间比较
(4+9)<10 带表达式的整数比较
(4.2,7.3)>(7.3,4.3) 复数之间比较
mod(4,2)==0 函数表达式参与
gpple‘ < 'baaaaaanana' 依次比较字符串的ASCII码值,只要有一个比较出来就返回,不比长度
这里g的ascii比b大,所以是F
3.逻辑运算
类似于其他与语言的 三个常用的掌握就行
&&=>.and.|| =>.or.! => .not.
四. 程序怎么写(三大结构和写法)
1.Fortran程序框架
程序需要用program+程序名——end括起来 示例代码:
program main
!程序名字叫main,也可以叫任意的名字
!程序体写在这之间
integer a,b !定义变量
a=2
b=5
!使用各种结构对数据进行处理
do i=1,5
a=a+1
b=b+1
enddo
!最后输出
write(*,*)a,b
end
本质是将输入的数据处理后变成需要的数据输出
2.顺序结构
按照顺序一路走到黑
3.选择结构
1.if系列
重点
单分支
!单分支骨架
if(判断条件:是个布尔值T/F) then
!代码块
endif
双分支
!双分支骨架
if(判断条件) then
!代码块
else
!代码块
endif
多分支
if(判断条件) then
!代码块
elseif then
!代码块
else
!代码块
endif
使用示例
program main
real U,V,S
read(*,*)U,V
IF(U>0) THEN
IF(V==0)THEN
WRITE(*,*)"西风"
else if(v<0) then
write(*,*)'西北风'
else
write(*,*)'西南风'
ENDIF
else if(U==0) then
if(V==0) then
write(*,*)'无风'
else if(V>0) then
write(*,*)'南风'
else
write(*,*)'北风'
end if
else
if(V==0)then
write(*,*)'东风'
else if(v<0) then
write(*,*)'东北风'
else
write(*,*)'东南风'
ENDIf
END IF
S=sqrt(U**2+V**2)
write(*,*)S
if(S>=30.0)then
write(*,*)'强湍流'
else
write(*,*)'弱湍流'
end if
pause
end
对于if中代码块只有一行的可以进行简写
program main
integer ::a = 4
!等价于