本例中我构建了一个直流电阻电路和一个简单交流阻抗场景。直流部分使用欧姆定律V=I*R。交流部分用复数阻抗Z=R+jX表示电阻和电抗。本例用这些基础电磁学量演示入门级的五种基础类型:integer、real、complex、logical、character。
implicit none 要求所有变量必须先声明后使用。
本文代码
program variableTypeAndImplicitNoneDemo
implicit none
! 变量定义开始
character(len=24) :: circuitName ! 定义电路名称,使用character文本类型
integer :: resistorCount ! 定义电阻数量这类整数,integer整数类型
real :: resistanceOhm ! 定义电阻值,单位是ohm。real实数类型
real :: currentAmpere ! 定义电流值,单位是A。real类型
real :: voltageVolt ! 定义电压值,单位是V。real类型
complex :: impedanceOhm ! 定义交流复阻抗,实部是电阻,虚部是电抗。用complex类型。
complex :: acCurrentAmpere ! 定义交流电流的复数表示。complex类型
complex :: acVoltageVolt ! 定义交流电压的复数表示。complex类型
logical :: isVoltageSafe ! 定义“电压是否安全”的真假判断。logical类型
! 变量定义结束
! 赋值操作:左侧必须是已声明的变量名,右侧是值、变量或公式表达式。赋值号=并非数学意义的恒等式,而是“把右侧计算结果存入左侧变量”。
circuitName = "basic ohm circuit" ! 左侧是character变量;右侧是字符字面量,必须用引号包住文本。
resistorCount = 1 ! 左侧是integer变量;右侧是整数值,表示电路中有1个电阻。
resistanceOhm = 10.0 ! 左侧是real变量;右侧写成10.0,表示实数电阻值10ohm。
currentAmpere = 2.0 ! 左侧是real变量;右侧写成2.0,表示实数电流值2A。
voltageVolt = currentAmpere * & ! 左侧是real变量;右侧是公式表达式,先计算I*R再存入电压变量。
resistanceOhm
impedanceOhm = (10.0, 5.0) ! 左侧是complex变量;右侧(real,imag)表示10+5i ohm。
acCurrentAmpere = (2.0, 0.0) ! 左侧是complex变量;右侧表示交流电流2+0i A。
acVoltageVolt = acCurrentAmpere * & ! 左侧是complex变量;右侧是复数乘法表达式,计算交流电压。
impedanceOhm
isVoltageSafe = voltageVolt < 36.0 ! 左侧是logical变量;右侧是关系表达式,结果为真或假。
print *, "变量类型与implicit none:" ! 输出示例标题。
print *, "电路名称 circuitName =", & ! 输出character变量,trim去掉尾部空格。
trim(circuitName)
print *, "电阻数量 resistorCount =", resistorCount ! 输出integer变量。
print *, "电阻 resistanceOhm =", resistanceOhm, "ohm" ! 输出real变量resistanceOhm。
print *, "电流 currentAmpere =", currentAmpere, "A" ! 输出real变量currentAmpere。
print *, "电压 voltageVolt =", voltageVolt, "V" ! 输出由欧姆定律计算出的real变量。
print *, "复阻抗 impedanceOhm =", impedanceOhm, "ohm" ! 输出complex变量impedanceOhm。
print *, "交流电流 acCurrentAmpere =", & ! 输出complex变量acCurrentAmpere。
acCurrentAmpere, "A"
print *, "交流电压 acVoltageVolt =", & ! 输出复数乘法得到的complex变量。
acVoltageVolt, "V"
print *, "直流电压是否低于 36 V =", & ! 输出logical变量,T=.true,F=.false。
isVoltageSafe
end program variableTypeAndImplicitNoneDemo
编译与运行
(base) hong@hongdeMacBook-Pro 004.variableTypeAndImplicitNone % gfortran exampleVariableTypeAndImplicitNone.f90
(base) hong@hongdeMacBook-Pro 004.variableTypeAndImplicitNone % ./a.out
变量类型与 implicit none:
电路名称 circuitName =basic ohm circuit
电阻数量 resistorCount = 1
电阻 resistanceOhm = 10.0000000 ohm
电流 currentAmpere = 2.00000000 A
电压 voltageVolt = 20.0000000 V
复阻抗 impedanceOhm = (10.0000000,5.00000000) ohm
交流电流 acCurrentAmpere = (2.00000000,0.00000000) A
交流电压 acVoltageVolt = (20.0000000,10.0000000) V
直流电压是否低于 36 V = T
运行结果分析
- character类型用来保存文本。
- circuitName是character(len=24) 类型;
- 输出时使用trim(circuitName),所以尾部空格被去掉;
- character(len=24) :: circuitName用自然语言解释可以是”定义了名为circuitName、最大长度是24字符的字符型变量“,以下不再重复;
- 另外,若赋值不足24字符,则用空格补全;若赋值超过24字符,则截断。
- integer类型用来保存整数。
- 如resistorCount表示电阻数量;
- 整数类型适合表示“个数、编号、次数”等没有小数的量。
- real类型存储实数。
- 电阻 resistanceOhm = 10.0000000 ohm;
- 电流 currentAmpere = 2.00000000 A;
- 电压 voltageVolt = 20.0000000 V;
- 以上都是real类型,在程序中currentAmpere和resistanceOhm被赋值,voltageVolt经currentAmpere*resistanceOhm计算。
- complex复数类型。
- 复阻抗 impedanceOhm = (10.0000000,5.00000000) ohm,Fortran中复数字面量:(10.0, 5.0)表示10.0+5.0i,前实后虚;
- 交流电流 acCurrentAmpere = (2.00000000,0.00000000) A表示2.0+0.0i
- 关于交流电压 acVoltageVolt = (20.0000000,10.0000000) V ,acVoltageVolt = acCurrentAmpere * impedanceOhm = (2.0 + 0.0i) * (10.0 + 5.0i) = 20.0 + 10.0i,输出(20.0000000,10.0000000)
- logical是逻辑类型。
- isVoltageSafe是logical类型。
- isVoltageSafe = voltageVolt < 36.0,这里的
=是赋值运算符,并非数学符号,不作关系比较,而<是关系运算符,用于判断"小于",因此要把=的右侧看成一个整体。用自然语言解释”先计算右侧表达式 voltageVolt<36.0,再将逻辑结果赋值给左侧 isVoltageSafe“,即如果小于36V,我认为是安全的。
知识点总结
- implicit none的作用:要求所有变量必须先声明、后使用,避免编译器按变量名首字母自动推断类型。
- 赋值语句的基本形式:变量名 = 值或表达式
- 左侧必须是变量,右侧可以是字面量、变量或公式表达式。程序会先计算右侧,再把结果存入左侧变量。