简单 Fortran 90 程序的构造形式 : 第二讲 Fortran 程序设计基础 (2) [PROGRAM 程序名 ] [ 声明语句 ] [ 执行语句 ] END [PROGRAM [ 程序名 ]] 程序的书写 (P5) PROGRAM MONEY!calculate balance after interest compounded! 根据利息计算余额 REAL BALANCE, INTEREST, RATE BALANCE = 1000 RATE = 0.09 INTEREST = BALANCE * RATE BALANCE = BALANCE + INTEREST PRINT*, 'New balance:', BALANCE } 声明区 } 执行区 字符集 (character sets) 允许出现在一个语言的程序里的字符的全体 26 个大写字母 :A ~ Z 26 个小写字母 :a ~ z 10 个数字 : 0 ~ 9 下划线 : _ 5 个运算符号 : + - * / (**) 特殊字符 : () =., ; : $! % & < >? 空格 END PROGRAM MONEY 终止区 1
标识符 常数和变量 Constant and Variables 给变量 常量 函数等标识符命名时, 必须以字母开头, 后面可接多达 30 个字母 (A~Z a~z) 数字 (0~9) 或下划线 (_) 只能以字母开头 ; 不能含有空格 ; 不区分字母大小写 ; 长度限定为 31 个字符 (Fortran 77 为 6 个字符 ); 避免与关键字 标准例程重名 常数的值在整个程序执行过程中不发生改变 变量可以在程序执行过程中改变它的值 每个变量必须有一个独一无二的名字 变量名最长可以有 31 个字符, 包括字母 数字 下划线 ( _ ) 变量名的第一个字符必须是字母 不能含有空格 不区分大小写 不能与关键字 变量名 (Variable name) 变量 有效的变量名 my_time distance z123456789 long_axis_of_elliptic_circle 无效的变量名 This_is _a_very_long_variable_name 3_day A$ my-help exchange rate 以整型变量为例 : integer a a 为自己取的变量名称, 代表一个存储整数的空间位置, 成为变量 声明后可以通过该名称来赋值或提供变量内容 : 1. program example 2. integer a, b! 声明两个整型变量 a,b 3. a = 3! 将 3 赋给变量 a 4. b = a ** 2! 将变量 b 设定为 a**2, 即 3**2 5. print *, a=, a! 输出变量 a 的内容 6. print *, b=, b! 输出变量 b 的内容 7. stop 8. end example 2
语句 (Statement) 语句是 Fortran 程序的基本单位, 一条语句可包含 0~ 132 个字符 ; 除赋值语句外, 所有的语句都从一个关键字开始 ; 一般情况下, 每行一条语句 ; 如果一行有多条语句, 它们之间以分号分隔, 如 : A=1; B=2; C=3 假如一条语句一行写不完, 允许出现续行, 但要求被续行最后的非空白字符为 & 续行从下一行 ( 非注释行 ) 的第一个非空白字符开始, 如果下一行的非空白字符为 &, 则续行从该字符后的第一个字符开始 Fortran 90 允许出现多达 39 个续行 赋值语句 等号意义 : 代表将右边的数值或计算结果赋给左边变量 a = 1 x1 = (-b+sqrt(b*b-4.*a*c))/(2.*a) a = a * b a = b / a 其它语句 数据类型 Print *, x1 If else End 固有数据类型 数值型 (numerical) 整型 INTEGER 实型 REAL 复数型 COMPLEX 非数值型 字符型 CHARACTER 逻辑型 ( 布尔型 ) LOGICAL 自定义数据类型 ( 派生数据类型 ) 3
INTEGER(1) INTEGER(2) INTEGER(4) 之陳 INTEGER(8) 印斌 整型 (INTEGER) 整型变量 INTEGER I INTEGER([KIND=]n) I n=1, 2, 4, 8 字节 1 byte (8 bits) 2 bytes (16bits) 4 bytes (32 bits) 8 bytes (64 bits) 取值范围 -128~127-32768~32767-2147483648~ 2147483647-9223372036854775808~ 9223372036854775807 备注 2 7 2 15 2 31 2 63 INTEGER*1 a INTEGER*2 b INTEGER*4 c! F77 传统作法 整数的存储 整型 (INTEGER) HUGE 获得取值范围的上限 (P9) 2 7 PROGRAM limit INTEGER I, Big, Small 2 15 Big = HUGE(I) Small = HUGE(I) + 1 2 31 PRINT*, 'Largest number is : ', Big PRINT*, 'Smallest number is : ', Small 2 63 END Fortran Help - HUGE 4
整型 (INTEGER) 整型常量 一般的文字整型变量, 其种类参数取缺省值 ; 也可显式声明种类参数, 如 47_2 其一般形式 :[s]n[_k] s: 正负号 n:0~9 的数字 k: 种类参数 整数之间的除法, 结果也是整数! 如果不能整除, 小数部分无条件舍去! 如 :a=3/2: a=1 a=1/2 a=0 REAL(4) 之陳 REAL(8) 印斌 实型 (REAL) 实型变量 REAL X REAL([KIND=]n) X n=4, 8 DOUBLE PRECISION X 字节 4 bytes (32 bits) 8 bytes (64 bits) 取值范围 ±1.1754944E-38~ ±3.4028235E+38 ± 2.225073858507291E-308~ ± 1.797693134862316E+308 备注 2-126 ~(1-2 -24 ) * 2 128 单精度 双精度 双精度实数相当于 REAL(8), 不能再为它规定种类参数 REAL*4 c REAL*8 c! F77 传统作法 5
实数的存储 实型 (REAL) REAL(4) PROGRAM limitreal REAL(4) X, Big, Small, pre, index Big = HUGE(X)! 取上限 Small = TINY(X)! 取下限 pre = PRECISION(X)! 精度函数 REAL(8) index = RANGE(X)! 指数范围函数 PRINT*, 'The largest number is : ', Big PRINT*, 'The smallest number is : ', Small PRINT*, 'The precesion of real type variable is : ', pre END PRINT*, 'The largest index of real type variable is : ', index 实型 (REAL) 实型常量 带小数点的任何数 : 3 3. -999.9 不带指数的实型常量 : [s]n[_k] -6.48 3.1415926_8 带指数的实型常量 ( 科学计数法 ): [s]ne[s]m[_k] 1.0E6 5.3E-9_8 [s]nd[s]m 1.0D6 以 D 表示的实数不能再带种类参数 单精度 REAL(4) 有效位数为 6-7 位, 注意可能存在如下问题 : a = 1000000. + 0.1 a = 1000000. 常见错误, 大数加小数! 6
EXAMPLE 复数型 (COMPLEX) program usual INTEGER A REAL B 复数型变量 COMPLEX Z COMPLEX([KIND=]n) Z n=4, 8 A = 3/2 B = 1000000. + 0.01 取值范围 备注 END PRINT*, 'A=', A, 'B=',B COMPLE X(4) COMPLE X(8) 8 bytes (64 bits) 16 bytes (128 bits) ±1.1754944E-38~ ±3.4028235E+38 ± 2.225073858507291E-308~ ± 1.797693134862316E+308 复数型 (COMPLEX) 复数型 (COMPLEX) 复数由实部和虚部组成,z=x+yi,x 为实部,y 为虚部,x y 皆为实型变量 设定 z = (x, y)! a = x + iy z = (1.5, 2.5)! a = 1.5 + 2.5i z = 1.5! a = 1.5 + 0i COMPLEX*8 COMPLEX*16! F77 传统作法 复数型变量 (r, i) 复数型常量的类型参数, 取实部和虚部的实数种类参数的极大值 KIND((1, 1.0)) =? KIND((3_8, 4_4)) =? KIND((1_2, 2_8)) =? KIND((1.0, 1.0_8)) =? KIND((1.0D3, 2.5)) =? 7
复数的存储 Complex(4) Complex(8) 逻辑型 (LOGICAL) 逻辑型变量 LOGICAL L LOGICAL([KIND=]N) L N=1, 2, 4, 8 逻辑型常量.TRUE.( 逻辑真 ).FALSE.( 逻辑假 ) Example 字符型 (CHARACTER) program logicexample end logical a,b a =.true. b =.false. write(*,*) a, b 字符型变量 CHARACTER [([LEN=]len)] CHARACTER [([LEN=]len [, [KIND=]n])] CHARACTER [(KIND=n [, LEN=len])] 字符串有两个可选参数 : 长度参数 种类参数 种类参数总是 1, 即一个字符占一个存储字节 假如两个可选参数都没给出, 缺省值取 1: character c 若只给出一个参数, 则代表长度参数 :character(20) c 若给出两个参数, 则依次为长度参数和种类参数 ( 种类参数智能为 1):character(20, 1) c 若采取关键字声明形式, 则参数的顺序可以任意 : character(kind=1, LEN=20) c 8
字符型 (CHARACTER) 字符型 (CHARACTER) 字符型常量 统一以单引号 ( ) 或双引号 ( ) 为界定符 [k_] ch (k 为种类参数, 只能为 1) [k_] ch Ch:Fortran 字符集之内或之外的字符, 字符的个数为字符串的长度 This is a typical character variable! 中文字符也是当然的字符串! 字符型常量 Today s date is 2007-05-14 用连续的两个界定符表示与其相同的字符 界定符必须统一, 要么都是单引号, 要么都是双引号 a= Hello! FOTRAN 90 可以用双引号界定字符串 b= Hello! FOTRAN 77 只能用单引号界定字符串 c= That s right.! 用双引号界定字符串, 可以在字串中任意使用单引号 d= That s right! 用单引号界定字符串时, 输出单引号要连续使用两个单引号 e= That s right.! 用双引号界定字符串时, 输出双引号也要连续用两个双引号 字符串中字符的最大数量 :32767 Example CHARACTER*10! F77 传统作法 program charexample character(len= 6) first character(len=10) second character(len=20) add character(len=30) c c = "That s right." c = 'That"s right' c = "That's""right""." print*, c first="happy " second="birthday" add = first//second! 两个连续的除号可以连接两个字符串 write(*,*) add end 9
Example2 数据类型 1.program charexample2 2. character(len=20) string 3. string = "Good morning." 4. write(*,*) string 5. string(6:) = evening.! 重新设定第 6 个字符以后的字符串 6. write(*,*) string 7.end 固有数据类型 数值型 (numerical) 整型 INTEGER 实型 REAL 复数型 COMPLEX 非数值型 字符型 CHARACTER 逻辑型 ( 布尔型 ) LOGICAL 自定义数据类型 ( 派生数据类型 ) 10