自顶而下的程序设计

步骤:

  1. 清楚地陈述要解决的问题;
  2. 定义程序所需的输入和程序的输出;
  3. 设计要在程序中实现的算法;
  4. 将算法转换为Fortran语句;
  5. 测试完成的Fortran程序。

控制结构:分支

IF结构块

  1. IF(逻辑表达式) THen
  2. ...
  3. ...
  4. ...
  5. END IF

ELSE和ELSE IF子句

  1. IF(逻辑表达式1) THEN
  2. ...
  3. ...
  4. ELSE IF(逻辑表达式2) THEN
  5. ...
  6. ...
  7. ELSE
  8. ...
  9. ...
  10. END IF

命名IF结构块

  1. [name:] IF(逻辑表达式1) THEN
  2. ...
  3. ...
  4. ELSE IF(逻辑表达式2) THEN [name]
  5. ...
  6. ...
  7. ELSE [name]
  8. ...
  9. ...
  10. END IF [name]
  1. 命名的名称必须唯一,且不能与程序里的任何常量和变量重名;
  2. 如果IF开头给了名称,END IF后面就必须也有;
  3. ELSE IF和ELSE语句命名是可选的,但是如果命名必须与IF上的命名一致。

在多个IF语句嵌套使用时,用命名的方法可以方便理解和调试。
对于有许多相互排斥的任选项分支,使用带有ELSE IF语句的IF结构优先于嵌套的IF结构。

例题3-2 二次方程式

  1. PROGRAM roots
  2. ! 目的
  3. ! 该程序求解一元二次方程的根a*x**2+b*x+c=0
  4. !
  5. ! 修订版本:
  6. ! 日期 程序员 修改说明
  7. ! ======= ======= =========
  8. ! 2020/06/06 唐怀瑟 源代码
  9. !
  10. IMPLICIT NONE
  11. ! 数据字典:声明变量类型、定义和计量单位
  12. REAL::a !二次项x**2系数
  13. REAL::b !一次项x系数
  14. REAL::c !常数项
  15. REAL::discriminant !判断值
  16. REAL::imag_part !虚部(对复根)
  17. REAL::real_part !实部(对复根)
  18. REAL::x1 !第一个根(对实根)
  19. REAL::x2 !第二个根(对实根)
  20. ! 提示用户输出方程系数
  21. WRITE(*,*) 'This program solves for the roots of a quadratic'
  22. WRITE(*,*) 'equation of the form A * x**2 + B * x + C = 0.'
  23. WRITE(*,*) 'Enter the coefficients A, B, and C:'
  24. READ(*,*) a, b, c
  25. ! 回显系数
  26. WRITE(*,*) 'The coefficients A, B, and C are: ', a, b, c
  27. ! 计算判断值
  28. discriminant = b**2 - 4. * a * c
  29. ! 根据判断式的值求根
  30. IF(discriminant > 0.) THEN !有两个实根
  31. x1 = (-b+SQRT(discriminant))/(2.*a)
  32. x2 = (-b-SQRT(discriminant))/(2.*a)
  33. WRITE(*,*) 'This equation has two real roots:'
  34. WRITE(*,*) 'X1 = ', x1
  35. WRITE(*,*) 'X2 = ', x2
  36. ELSE IF(discriminant < 0.) THEN !有两个复根
  37. real_part = (-b)/(2. * a)
  38. imag_part = SQRT(ABS(discriminant))/(2.*a)
  39. WRITE(*,*) 'This equation has two complex roots:'
  40. WRITE(*,*) 'X1 = ', real_part, '+i', imag_part
  41. WRITE(*,*) 'X2 = ', real_part, '-i', imag_part
  42. ELSE !有一个实根
  43. x1 = (-b)/(2.*a)
  44. WRITE(*,*) 'This equation has two identical real roots:'
  45. WRITE(*,*) 'X1 = X2 = ', x1
  46. END IF
  47. END PROGRAM roots

有关调试Fortran程序语句的问题

IF结构常见逻辑错误

  1. 注意逻辑表达式是否使用有误,如打算用>=时使用了>;
  2. 判断实数型变量相等性时,由于浮点算术运算的小数的四舍五入误差,理论上两个数有误差,并不相等。例如,测试|X-10.|<0.0001,而不是测试X是否等于10.
  1. IF(x == 10.) THEN
  2. !替换为
  3. IF(ABS(x-10.)<=0.0001) THEN