跳转到内容

User:Evesiesta/Fortran

维基教科书,自由的教学读本
  • Fortran对大小写不敏感
  • &连接因过长而换行的两个半句
  • 可用数字作为语句开头标号(一句一号不重复)
  •  ! C 注释
  • 程序开头可用PROGRAM为程序命名,名字第一个字符必须为字母
  • 可用STOP停止执行程序,若加数字或用单引号包括的字符,则结束时打印(可选)
  • 保留字段及常量大写,变量名及过程名小写(可选,但风格需保持一致)
  • 变量名由字数字及下划线任意组合,但首字符必须为字母
  • 整型数无小数点
  • 默认式定义变量类型:以ijklm开头的变量为整型变量,其他字母开头的为实型变量
  • 无变量类型默认情况下为字符型
  • 显式定义变量类型:
    INTEGER :: var1 [,var2,var3]
    REAL :: var1 [,var2,var3]
    
     :: 可省略)
  • CHARACTER (len=<len>) :: var1 [,var2,var3]
    
    声明所有字符变量(len可选,缺省则默认为1)
  • <type>,PARAMETER :: value
    
    声明常数(保持常数取值一致、精度一致)
  • 常见算数运算符号:+-*/****为指数运算)
  • 整型运算时计算机会去除小数部分
  • 一般运算顺序:
    1. 首先做圆括号内的计算,且内层括号比外层括号优先
    2. 再从右到左做指数运算。
    3. 从左到右做乘法和除法运算。
    4. 从左到右做加法和减法运算。
  • 可用括号调整运算顺序
  • 小心处理混合模式计算
  • 不能对负数进行实数幂运算
  • IMPLICIT NONE强制所有变量必须显式声明,否则报错(通常放于类型声明语句前)
  • ==为等值关系运算符,=为赋值运算符
  • 关系运算符在所有算数运算符后计算
  • 若比较整型数与实型数,则在比较执行前整型数将被转换为实型数再比较
  • 数值与字符无法比较
  • 逻辑运算符有5个:.AND..OR..EQV..NEQV..NOT. .EQV. 为逻辑等价)
  • 如果逻辑变量出现在以.READ.开头的语句中,那么相应的输入值必须是.TRUE..FALSE.或以TF开头的一个或一组字符。如果输入值的第一个值是.TRUE.或以T开头的字符,那么逻辑变量就会被设定为.TRUE.。如果输入值的第一个值是.FALSE.F开头的字符,那么逻辑变量就会被设定为.FALSE.。输入值以任何其他字符开头都会产生运行时错误。如果逻辑变量或表达式出现在以WRITE开头的语句中,那么如果变量值为.TRUE.,则相应的输出值将为单个字符T,如果变量值为.FALSE.,则相应的输出值为F
  • IF语句正确写法:
    IF (<term>) THEN
    !执行语句
    END IF
    
  • END IF不能有行号
  • IF的另一种写法:
    IF (<term>) <执行语句>
    
  • SELECT CASE用法:
    [name: ] SELECT CASE (<case_expr>)
    CASE (<term1>) [name]
    	!语句
    CASE (<term2>) [name]
    	!语句
    CASE DEFAULT [name]
    	!语句
    END SELECT [name]
    
    (在CASE结构中总包含CASE DEFAULT来捕捉缺省情况)
  • 当循环:
    1. DO循环:
      DO
      	!...
          IF (<logical_expr>) EXIT
          !...
      END DO
      
      DOEND DO之间的语句重复执行直至term为真执行EXIT,而后跳至END DO后第一句。DO循环可包括多个EXIT,每个EXIT通常是IF语句的一部分
    2. DO WHILE循环:
      DO WHILE (<logical_expr>)
      	!语句
      END DO
      
      该语句将重复执行被包括的语句直至逻辑表达式为假,而后将跳至END DO后第一句
  • 迭代或计数循环:
    DO index=istart, iend, incr
    	!语句
    END DO
    
    incr若缺省则默认为1。计数循环遵循以下规则:
    1. istartiendincr可为常量、变量或表达式。若为变量或表达式,其在循环开始前计算并控制循环
    2. 循环开始时,程序将istart的值赋予index,若index*incr≤iend*incr则开始循环
    3. 一次循环后程序将自动执行index = index+incrindex*incr≤iend*incr则再次循环
    • 因此,某计数循环次数可由下列公式计算:
  • CYCLE语句在循环体内执行,则该循环将立即停止并回到循环开头,此后若控制变量仍允许,循环将再次开始。
  • 给每个循环命名,便于在嵌套循环中调试
  • 两个嵌套的DO循环不能共用一套控制变量
  • CYCLEEXIT位于一组未命名的嵌套循环中,则它们将会对距自己最近的一层循环起作用
  • 一个循环必须完全嵌套于另一循环中
  • 字符赋值时若字符表达式短于所赋值的字符变量,则用空格补全;若字符表达式长于所赋值的字符变量,则去除多余部分
  • 子串提取:若初始时
    CHARACTER (len=8) :: a,b,c
    a = 'ABCDEFGHIJ‘
    b = '12345678'
    c = a (5:7)
    b (7:8) = a (2:6)
    
    则:
    1. a被赋值后取前8个字符,则a的值为ABCDEFGH
    2. b被赋值为12345678
    3. c = a (5:7),赋值给c后还差5个字符,用空格补全后为EFG
    4. b (7:8) = a (2:6),由于b (7:8)只有两字符,所以只使用了a (2:6)的两个字符,因此b的值为123456BC
  • 连接操作符//可以将多个字符串或子串合并成一个大字符串
  • 两字符串比较时按其ASCII字符集比较
  • 基本I/O)当程序从左至右地移过WHITE语句的变量列表时,它也从左到右扫描对应格式。但是格式中内容的使用顺序可能由于包含重复次数和括号改变。格式的扫描规则如下:
    1. 从左至右扫描格式
    2. 如果一个格式描述符带有一个与之相关的重复次数,则在使用下一个描述符之前该描述符将按重复次数中指定的次数使用
    3. 如果包含在括号内的一组格式描述符带有与之相关的重复次数,那么在使用下一个描述符之前,整组描述符将按重复次数中指定的次数使用
    4. 如果WHITE语句在格式结束前用完了所有变量,格式的使用要么停在第一个没有对应变量的格式描述符外,要么停在格式的结尾处,无论哪种先出现
    5. 如果在WHITE语句数值输出完前,扫描到了格式的结尾处,程序就将当前的输出缓冲区发送到打印机,然后在格式中最右边不带重复次数的开始括号处重新开始
  • 数组下标类型为“INTEGER”,常数或变量都可作为下标
  • 数组的声明实例:
    REAL, DIMENSION (<num>) :: NAME
    !或
    REAL :: NAME (<num>)
    
    这表明一个有16个元素的名为“NMAE”的数组,且数组中数据类型为REAL
  • 数组的维度宽度
  • 数组构造器实例:
    [1, 2, 3, 4, 5]
    !或
    (/ 1, 2, 3, 4, 5 /)
    
  • 数组元素也是普通变量。可用于算数或逻辑表达式,计算结果也可赋给数组元素
  • 数组元素在使用前也需初始化
  • 下标三元数组:
    !若
    INTEGER, DIMENSION (10) :: array = [1. 2. 3. 4. 5. 6. 7. 8. 9. 10]
    !则
    array (1:10:2) = [1, 3, 5, 7, 9]