自顶而下的程序设计
步骤:
- 清楚地陈述要解决的问题;
- 定义程序所需的输入和程序的输出;
- 设计要在程序中实现的算法;
- 将算法转换为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 = ', x1WRITE(*,*) 'X2 = ', x2ELSE 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_partWRITE(*,*) 'X2 = ', real_part, '-i', imag_partELSE !有一个实根x1 = (-b)/(2.*a)WRITE(*,*) 'This equation has two identical real roots:'WRITE(*,*) 'X1 = X2 = ', x1END IFEND PROGRAM roots
有关调试Fortran程序语句的问题
IF结构常见逻辑错误
- 注意逻辑表达式是否使用有误,如打算用>=时使用了>;
- 判断实数型变量相等性时,由于浮点算术运算的小数的四舍五入误差,理论上两个数有误差,并不相等。例如,测试|X-10.|<0.0001,而不是测试X是否等于10.
IF(x == 10.) THEN!替换为IF(ABS(x-10.)<=0.0001) THEN
