自顶而下的程序设计
步骤:
- 清楚地陈述要解决的问题;
- 定义程序所需的输入和程序的输出;
- 设计要在程序中实现的算法;
- 将算法转换为Fortran语句;
- 测试完成的Fortran程序。
控制结构:分支
IF结构块
IF(逻辑表达式) THen
...
...
...
END IF
ELSE和ELSE IF子句
IF(逻辑表达式1) THEN
...
...
ELSE IF(逻辑表达式2) THEN
...
...
ELSE
...
...
END IF
命名IF结构块
[name:] IF(逻辑表达式1) THEN
...
...
ELSE IF(逻辑表达式2) THEN [name]
...
...
ELSE [name]
...
...
END IF [name]
- 命名的名称必须唯一,且不能与程序里的任何常量和变量重名;
- 如果IF开头给了名称,END IF后面就必须也有;
- ELSE IF和ELSE语句命名是可选的,但是如果命名必须与IF上的命名一致。
在多个IF语句嵌套使用时,用命名的方法可以方便理解和调试。
对于有许多相互排斥的任选项分支,使用带有ELSE IF语句的IF结构优先于嵌套的IF结构。
例题3-2 二次方程式
PROGRAM roots
! 目的
! 该程序求解一元二次方程的根a*x**2+b*x+c=0
!
! 修订版本:
! 日期 程序员 修改说明
! ======= ======= =========
! 2020/06/06 唐怀瑟 源代码
!
IMPLICIT NONE
! 数据字典:声明变量类型、定义和计量单位
REAL::a !二次项x**2系数
REAL::b !一次项x系数
REAL::c !常数项
REAL::discriminant !判断值
REAL::imag_part !虚部(对复根)
REAL::real_part !实部(对复根)
REAL::x1 !第一个根(对实根)
REAL::x2 !第二个根(对实根)
! 提示用户输出方程系数
WRITE(*,*) 'This program solves for the roots of a quadratic'
WRITE(*,*) 'equation of the form A * x**2 + B * x + C = 0.'
WRITE(*,*) 'Enter the coefficients A, B, and C:'
READ(*,*) a, b, c
! 回显系数
WRITE(*,*) 'The coefficients A, B, and C are: ', a, b, c
! 计算判断值
discriminant = b**2 - 4. * a * c
! 根据判断式的值求根
IF(discriminant > 0.) THEN !有两个实根
x1 = (-b+SQRT(discriminant))/(2.*a)
x2 = (-b-SQRT(discriminant))/(2.*a)
WRITE(*,*) 'This equation has two real roots:'
WRITE(*,*) 'X1 = ', x1
WRITE(*,*) 'X2 = ', x2
ELSE IF(discriminant < 0.) THEN !有两个复根
real_part = (-b)/(2. * a)
imag_part = SQRT(ABS(discriminant))/(2.*a)
WRITE(*,*) 'This equation has two complex roots:'
WRITE(*,*) 'X1 = ', real_part, '+i', imag_part
WRITE(*,*) 'X2 = ', real_part, '-i', imag_part
ELSE !有一个实根
x1 = (-b)/(2.*a)
WRITE(*,*) 'This equation has two identical real roots:'
WRITE(*,*) 'X1 = X2 = ', x1
END IF
END PROGRAM roots
有关调试Fortran程序语句的问题
IF结构常见逻辑错误
- 注意逻辑表达式是否使用有误,如打算用>=时使用了>;
- 判断实数型变量相等性时,由于浮点算术运算的小数的四舍五入误差,理论上两个数有误差,并不相等。例如,测试|X-10.|<0.0001,而不是测试X是否等于10.
IF(x == 10.) THEN
!替换为
IF(ABS(x-10.)<=0.0001) THEN