Eastsheng's Wiki

Fortran-03

2022-07-23 18:11:28

[toc]

停止语句

PAUSE

  • 一般形式是:PAUSE [暂停值],暂停值为字符串常量或5位数以下的整型数,当程序运行至断点处将输出暂停值。
  • PAUSE语句(在F90中不推荐使用,在F95中被废除)暂时中止程序的运行,将系统挂起,使程序操作员可以执行其它操作系统命令。

STOP

  • STOP语句的一般形式为: STOP [停止值],与PAUSE语句类似,程序停止运行时将输出停止值。
  • STOP语句是停止运行,一个程序单位中可以有多个STOP语句,执行到任一个STOP语句处时,程序即完全中止运行。在子程序中如果有STOP语句,也是使整个程序停止运行而不是使控制返回主程序。

隐DO循环控制重复读写的次数

  • 一般形式为:(I/O列表,循环变量名=初值,终值,增值)
    1
    2
    READ *,(VALUE(I),I=1,20) !读入VALUE(1),VALUE(2),…,VALUE(20)的值。
    WRITE(*,*)(A,B,N=1,5) !在当前设备用默认格式重复输出A、B的值5次。
  • 隐DO循环只能作为输入输出表的一部分出现,不能用于其它场合。
  • 隐DO表可以嵌套,如:
    1
    PRINT *, ((A(I,J),I=1,3),J=1,3)

无循环变量的DO构造

1

  • DO块中必须有EXIT语句,使它停止循环,否则循环将无休无止地一直进行下去,形成死循环。

    EXIT语句(EXIT [DO构造名])的作用是停止循环,使控制退出循环结构,因此又称出口语句。
    通常将EXIT语句与IF语句结合使用,即在DO构造内使用:IF(逻辑表达式) EXIT

一个猜数游戏

  • 用随机数产生器产生1-10之间的一个整数,你猜它,如果猜得太大或太小都会提示,猜对了结束。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    program main
    CALL RANDOM_SEED ! 用来获取或设置新的种子;注意,这个函数在整个程序里,通常只调用一次!
    call random_number(R)
    Number=int(10*R+1)
    do
    write(*,'("Your Guess:")'); read *, MyGuess
    if(MyGuess.eq.Number) exit
    if(MyGuess.gt.Number) then
    print *, 'Too high. Try again.'
    else
    print *, 'Too low. Try again.'
    end if
    end do
    print *,'You are lucky. It is',Number
    end program main
  • Fortran90 以后,语法规范引入了两个标准的函数用来产生随机数(0 ~1 之间): random_seedrandom_number(如上代码, 通常这两个函数需配合使用 )
  • random_seed

    call random_seed( size , get , put ),一共三个参数(一般一次只能选择一个参数使用,而不能三个一起使用)
    size是输出参数,会返回种子的大小。在获取或设置新的种子时,输入输出的种子数组,必须与size的大小一样。
    get是输出参数,用来返回当前的种子。必须是integer类型的数组(数组大小取决于size),通常很少使用它。
    put是输入参数,用来设置新的种子。
    只要random_seed不加入任何参数,则自动用时间设置种子。所以这个操作可以简化为call random_seed()call random_seed

  • random_number

    用来产生随机数的,当我们需要产生时,调用它就可以了。整个程序可以不限次数地调用它。
    call random_number(R)
    这里的R必须是real类型,可以是单变量,也可以是数组。调用后,R的值变为当前的(伪)随机数。

求两个整数的最大公约数

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和6,先用27除以6,余数为3。再用6除以3,余数为零,即3为最大公约数。

! program main
! read *, m,n
! if(m.lt.n) then
! k=m; m=n; n=k
! end if
! k=mod(m,n)
! do while (k/=0)
! m=n; n=k; k=mod(m,n)
! end do
! print *, '最大公约数=',n
! end program main

program main
read *, m,n
do while (m/=n)
do while (m>n)
m=m-n
end do
do while (n>m)
n=n-m
end do
end do
print *, '最大公约数=',m
end program main
  • do while的一般形式为:[构造名] DO WHILE (逻辑表达式)

求正弦函数的近似值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
!正弦函数用泰勒级数展开:sinx=x-x^3/3!+x^5/5!-x^7/7!+...。计算有限精度范围内的值。

program main
real , parameter:: pi=3.141592, err=1.e-6
integer, parameter:: max_terms=10

read *, x; x=x*pi/180
k=1; term=x; sin_=term

do while((abs(term)>err) .and. (k<=max_terms))
term=-term*x*x/(2*k*(2*k+1))
k=k+1
sin_=sin_+term
print *,k,sin_
end do

print *,sin(x)
end program main

DO 构造的一般形式

1
2
3
4
5
[构造名:] DO [标号][循环控制]



终止语句

用不带循环控制变量的DO构造求下列式

  • $1^2+2^2+3^2+…+m^2$
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
! 1^2+2^2+3^2+...+m^2

program main

integer :: m
m = 1
sum = 0

do
if(m<1000) then
sum = sum+m**2
m = m + 1
print *, m
else
EXIT
end if
end do
! write(*,*) sum
end program main