Eastsheng's Wiki

Fortran-01

2022-07-16 18:11:28

[toc]

Sublime Text配置Fortran高亮

  • 下载插件fortran.tmbundle
  • 解压到C:\Users\xxx\AppData\Roaming\Sublime Text\Packages,通过Sublime Text面板中Preferences>Browse Packages可以打开

一个Fortran程序基本格式

1
2
3
4
5
6
7
8
!program main ! 程序开始,其后跟程序名。这一行可省略。
real :: c, d, av3, av4 ! 定义实数型变量。整数型,则用 integer。
!read *, c, d ! 输入语句1
read(*,*) c, d ! 输入语句2:星号意指默认的输入输出硬件(键盘和屏幕)及格式
av3 = (c + d)/2; av4 = (c*d)**0.5 ! 运算 + - * / **
print *, av3, av4 ! 输出语句1
write(*,*) av3, av4 ! 输出语句2
end! 程序结束

输入圆锥底面半径r和高h,求体积和表面积

1
2
3
4
5
6
7
8
9
program main 
real :: r, h, pi, v, s ! 定义半径、高、体积变量
pi = 3.1415926
write(*,*) "输入圆锥半径r和高h!"
read(*,*) r, h ! 输入半径和高
v = (pi*r**2*h)/3 ! 计算圆锥体积
s = pi*r**2+pi*r*(sqrt(r**2+h**2)) ! 计算圆锥体积
write(*,*) "圆锥体积为v:",v ; write(*,*) "圆锥表面积为s:",s ! F90中用“;”将两行并为一行。
end program main

分别求半径R=1,3,12.5时的圆周长。

1
2
3
4
5
6
7
8
9
10
11
12
13
program main
real :: r(3)
data r /1, 3, 12.5/
do i=1,3
print *, '半径=', r(i), '圆周长=', C(r(i))
end do
end program main

function c(radius)
pi=acos(-1.0)
c=2*pi*radius
return
end

一些内置函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
program main
! 变量类型
integer :: i,j ! (整型说明语句)
real :: x,y ! (实型说明语句)
double precision :: m,n ! (双精度说明语句)
complex :: o,p ! (复型说明语句)
logical :: t,f ! (逻辑型说明语句)
character :: a,b ! (字符型说明语句)

! 内置函数
i = sqrt(4.0) ! 开方!括号内必须是 REAL or COMPLEX
print *, "4.0开方=(整型)",i
j = sin(2.0) ! 三角函数!括号内必须是 REAL or COMPLEX
j1 = cos(2.0); j2 = asin(1.0); j3 = acos(1.0)
j4 = tan(2.0); j5 = atan(2.0)
write(*,*) "2.0的正弦函数值=(整型)",j,j1,j2,j3,j4,j5

x = exp(6.0)!括号内必须是 REAL or COMPLEX
write(*,*) "6.0的e指数(实型)=",x

y = log(3.0)!括号内必须是 REAL or COMPLEX
y1 = log10(3.0)
y2 = alog(3.0)
y3 = alog10(3.0)
write(*,*) "3.0的log值(实型)=",y,y1,y2,y3

m = abs(-3.333); m1 = int(real(-3))
write(*,*) m,m1

n = mod(5,2) !求余
n1 = sign(5,2) !求符号
n2 = max(2,5,6,8,9,44)
n3 = max0(2,5,6,8,9,44)
n4 = min(2,5,6,8,9,44)
n5 = min0(2,5,6,8,9,44)
write(*,*) n,n1,n2,n3,n4,n5

end program main
  • 函数名分为“通用名”和“专用名”例如求余函数的“通用名”为MOD,“专用名”有三个(MOD,AMOD,DMOD)。
  • 根据自变量的类型就自动确定了函数值的类型,如MOD(8,3)的值为整型,而MOD(8.0,3.0)的值为实型。
  • 当调用子程序时如果用内在函数作为自变量(实参),必须使用该内在函数的专用名。

运算误差

  • 为减小误差,在写表达式时应尽量使每一次运算结果都在有效位数范围之内;
  • 尽量不要使两个相差很大的数值直接相加或相减。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
program main
real*8 a

a=11111.1 *1111.11 ; print *, a
a=11111.1d0*1111.11d0; print *, a

a=0.001+1246825.0-1246820.0; print *, a

a=1246825.0 -1246820.0 +0.001 ; print *, a
a=1246825.0d0-1246820.0d0+0.001d0; print *, a
a=1246825 -1246820 +0.001d0; print *, a
a=1246825.0 -1246820.0 +0.001d0; print *, a
end program main

! output
! 12345654.000000000
! 12345654.320999999
! 5.0000000000000000
! 5.0009999275207520
! 5.0010000000000003
! 5.0010000000000003
! 5.0010000000000003

对于给定扇形的半径$r$及圆心角$\theta$,求面积等

  • 对于给定扇形的半径$r$及圆心角$\theta$,弦长$b=2rsin(\frac \theta 2)$,拱高$h=2rsin^2(\frac \theta 4)$,弧度$\alpha=\frac {2\pi\theta} {360}$,面积$S={\frac 1 2}\alpha r^2-\alpha \sqrt{r^2-{\theta}^2}$。编一程序,对任意给定的$r$及$\theta$,输出$h$、$b$及$S$值。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
program main

real :: r, theta, b, h, alpha, S

write(*,*) "请分别输入扇形半径、圆心角: "
read(*,*) r, theta
b = huchang(r,theta)
h = gonggao(r,theta)
alpha = hudu(theta)
S = mianji(r,alpha)

write(*,*) b,h,alpha,S

end program main

function huchang(r,theta)
b = 2*r*sin(theta/2)
end function huchang


function gonggao(r,theta)
h = 2*r*(sin(theta/4)**2)
end function gonggao

function hudu(theta)
real :: pi
pi = 3.1415926
alpha = 2*pi*theta/360.0
end function hudu


function mianji(r,alpha)
S = 0.5*alpha*(r**2)-alpha*sqrt(r**2-alpha**2)
end function mianji

判断一个数N(N>3)是否素数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
program main
read *, n
i=2
1 continue
if(mod(n,i).eq.0) then
print *, '不是素数,可被',i,'整除'
! end if
! if(mod(n,i).ne.0) then
else
i=i+1
if(i.le.int(sqrt(n*1.))) goto 1
print *, '是素数'
end if
end program main

关系运算符

逻辑

  • 逻辑量:Fortran的逻辑常量只有两个:.TRUE. (表示“真”,即满足逻辑条件); .FALSE. (表示“假”,即不满足逻辑条件)。
  • 逻辑运算符

  • 逻辑表达式的运算

统计学生考试合格人数

1
2
3
4
5
6
7
8
9
10
11
12
13
! F90的固定格式 -----统计学生考试合格人数 

program main
INTEGER :: n, s, k
s = 0; k = 0
1 PRINT*,'键入分数 (负数时退出):'
READ*, n
IF(n < 0) GOTO 666
s = s + 1
IF(n >= 60) k = k + 1
GOTO 1
666 PRINT*, k,' 个学生合格。 总人数=', s
END program main