第一章概述FORTRAN:FORmulaTRANslator算法有五个基本特征:有穷性、确定性、必要的输入输出、可行性评价算法质量的四个基本标准:正确性、可读性、通用性、高效率程序设计方法:面向过程(模块化、结构化)、面向对象。面向过程两大特征:使用三种基本控制结构;采用自顶向下和逐步求精方法F90采用模块化和结构化相结合的程序组织结构第三章基础知识1字符集由四部分字符组成:英文字母(不区分大小写)、阿拉伯数字、下划线、特殊字符(各种符号)2标识符字母{字母∣数字∣“_”}(不区分大小写)3对关键字不予保留,但应避免使用关键字作为实体名称4语句:说明语句必须放在可执行语句之前任何语句前可设置语句标号3个通用标志符:注释标志符“!”语句分隔标志符“;”续行标志符“&”5两种书写格式:固定格式和自由格式6数据类型:有内部数据类型、派生数据类型、数组和指针类型等预定义内部数据类型INTEGER→int、REAL→float/double、COMPLEX、CHARACTER→char、LOGICAL→bool第四章表控输入输出1三种类型输入输出:表控格式、二进制形式(无格式)、有格式2表控输入READ语句:类似cinREAD*,变量1,变量2,„表控输出PRINT语句:类似coutPRINT*,表达式1,表达式2,„3PARAMETER语句:给常数命名位于类型声明后,可执行语句前类似#definePARAMETER(名称1=表达式1,名称2=表达式2,„)例:Realpi;Parameter(pi=3.14)第五章有格式输入输出1输入输出形式1)语句标号指定例:READ100,M,N100FORMAT(I3,I3)2)直接书写例:READ“(I3,I3)”,M,N3)数据源+标号例:READ(*,100)M,N100FORMAT(I3,I3)4)直接数据源例:READ(*,”(I3,I3)”)M,N2整数有格式输入输出,I编辑符:[r]Iw[.m]r重复次数,w域宽(含符号),m最少输出位数输入:例:READ10,i,j,k10FORMAT(I4,2I5)输入可用逗号间隔,但不能用空格,在域宽范围内数字前后可空,全□时输入为0,格式不正确会致错输出:例:PRINT10,i,j,k10FORMAT(1X,'i=',I4,3x,'j=',I4,3x,'k=',I4)w实际长度,前补空格。w实际长度,输出w个“*”。m实际长度,补前导0至m位,否则按照实际位数输出3小数型实数的有格式输入输出,F编辑符:[r]Fw.dr重复次数,w域宽(含符号和小数点),d小数位数。程序示例:REALa,b,cREAD10,a,b,c10FORMAT(2F5.2,F8.3)PRINT(1X,'a+b+c=',F8.3),a+b+cEND输入:不带小数点时,按域宽读取,根据d值自动加小数点。带小数点,按域宽读取,自带小数点优先输出:w用法同整数d实际长度,左对齐输出,后补0。d实际长度,左对齐输出,小数部分四舍五入保留d位4指数型实数有格式输入输出,E编辑符:[r]Ew.d[Ee]r重复次数,w域宽(含符号小数点和E),d小数位数,e指数位数,缺省为2(不含E和符号),缺省指数域宽为e+2输入:类似F编辑符,在规定域宽内,可按小数型输入,也可按指数型输入例:READ11,a,b,c11FORMAT(E5.2,E8.3,E8.3E3)输出:w、d同F若指数有3位,指数部分的E字母省略,保持3位指数及其符号(+也应给出)5双精度浮型D编辑符[r]Dw.d同F,只是有效位数增加到15位6字符型A编辑符[r]A[w]缺省域宽w取对应字符型变量声明长度。输入:输入中的引号、逗号和空格按一般字符对待输出:W实际长度,左截取W实际长度,左补空可在输出数据中插入提示信息。例:READ*,I,JPRINT25,I,J25FORMAT(1X,’I=‘,I3,’J=‘,I3)END7X编辑符:用于设置输入输出数据的起始位置。nX输入:从当前位置右移n个字符。输出:从当前位置插入n空格。例:READ11,i,j,k11FORMAT(2X,I3,3X,I3,3X,I3)PRINT21,i,j,k21FORMAT(1X,'i=',I3,4X,'j=',I3,4X,'k=',I3)输入:↙。输出:。第六章选择结构同C++,只是除逻辑IF语句,其他都需要有ENDIF对应1逻辑IF语句IF(逻辑表达式e)语句Se为逻辑表达式或关系表达式,S为可执行语句。2基本块IF语句(1)IF(逻辑表达式e)THEN[THEN语句体]ENDIF(2)IF(逻辑表达式e)THEN[THEN语句体][ELSE[ELSE语句体]]ENDIF3多支块IF语句语法IF(逻辑表达式e1)THEN[语句体1]ELSEIF(逻辑表达式e2)THEN[语句体2]ELSEIF(逻辑表达式e3)THEN[语句体3]„„ELSEIF(逻辑表达式en)THEN[语句体n][ELSE[语句体n+1]]ENDIF内外转移的情况:不允许从块IF语句外控制转移到块IF语句体内,但允许通过GOTO语句从块IF语句内转移到块IF语句体外第七章循环结构循环结构分类:计数型、条件型1计数型DO循环类似for(v=e1;v=e2;v+=e3)DOv=e1,e2[,e3]语句1语句2„„语句nENDDOv为循环变量(一般为整型),e1初值,e2终值,e3步长,缺省为1循环次数:[(e2-e1)/e3]+1循环中可引用v,但不能修改v,只可修改e1,e2,e3,但不影响结果允许从循环体内转移到循环体外,反之编译警告。循环结束后,v为最后一次循环增加步长后得到的值。2条件型DOWHILE循环DOWHILE(循环条件)语句1语句2„„语句nENDDO[名字]强制终止循环:EXIT、CYCLE(但只能在DO和DOWHILE循环语句内使用)EXIT:终止整个循环语句的执行类似breakCYCLE:终止本次循环体的执行,开始新循环类似continue3特殊DO循环语句(死循环+强制退出)DO语句体EXIT语句ENDDO必须与EXIT语句配合使用,满足循环结束条件,则执行EXIT语句退出循环。第八章数组1数组分类:静态数组,动态数组2数组声明:类型声明语句、DIMENSION语句、DIMENSION属性1)类型声明语句类型[::]数组声明表数组声明表→数组名(维说明表)[=数组初值]{,数组名(维说明表)[=数组初值]}维说明表→维说明符{,维说明符}维说明符→[下界:]上界数组初值→(/初值1,初值2,„,初值n/)数组元素个数:从1开始到n区别于C++的从0开始到n-1要求:上界≥下界,否则数组大小为0。数组和变量可同一语句混合声明.例:INTEGERmax,count(10)数组声明语句必须出现在所有可执行语句之前2)DIMENSION语句DIMENSION数组声明表DIMENSIONnum1(3),count1(-3:6,0:6)数组类型由I-N规则确定。类型可以通过类型声明语句改变,且声明语句可位于DIMENSION的前面或后面。例:INTEGERdayDIMENSIONnum(3),day(12),count(-3:3)CHARACTER*20num3)DIMENSION属性:类型,DIMENSION(维说明表)::数组声明表::必须出现。例:INTEGER,DIMENSION(-5:-1,5:9)::num,total允许在数组声明表中对数组进行特定维说明。例:INTEGER,DIMENSION(2)::t1,t2(10:15),t3(2,2)可以给数组赋初值。例:INTEGER,DIMENSION(5)::S=(/45,78,85,55,95/)3数组引用格式:数组名[(数组下标{,数组下标})]数组下标→[算术表达式]:[算术表达式]引用一个元素:下标为一个算术表达式。引用部分元素(数组片断引用):下标为:号间隔的两个算术表达式。引用全部元素:只给出数组名,不指定下标引用时要保证数组下标在域内,否则会产生运行错误。维边界检测函数(UBOUND、LBOUND):UBOUND(数组名[,[DIM=]整型表达式])LBOUND(数组名[,[DIM=]整型表达式])检测某一维(指定维数,有第二参数),结果为整数。检测所有维(不指定维数,缺第二参数),结果为一维整型数组4数组结构注:多维时从a(1,1)→a(2,1)先列后行区别于C++的先行后列5数组输入输出1)根据数组逻辑结构下标,使用DO循环输入输出全部或部分数组元素。一维、二维数组输入输出。使用DO循环,输入时每行只能输入一个数据(与逻辑结构不一致);输出时只要输出格式控制得当(使用\编辑符),能够按照逻辑结构输出。2)数组隐含DO循环一维数组隐含DO循环语句(循环项,循环变量=初值,终值[,步长])READ*,(arr1(I),I=1,8,2)READ*,(arr1(I),I=1,8)二维数组隐含DO循环子句READ*,((arr2(I,J),J=1,4),I=1,3)READ*,((arr2(I,J),J=1,4,2),I=1,3,2)(1)允许一行输入多个数据。(2)输入时,循环项不能是常数和表达式,但输出时可以例:根据存储结构,使用数组名在同一行输入输出全部元素。READ*,arr1;READ*,arr2PRINT*,arr1;PRINT*,arr2根据存储结构,使用数组片段在同一行输入输出部分元素。READ*,arr1(1:5)PRINT*,arr2(1:2,1:2)结合隐含DO循环,按逻辑结构输入输出。READ*,(arr1(I),I=1,8)READ*,((arr2(I,J),J=1,3),I=1,3)6数组赋初值1)数组构造器:数组构造器→(/数组初值表/)数组初值表→初值项{,初值项}初值项→初值∣隐含DO循环括号和斜杠之间不能有空格。隐含DO循环用于给出一组相邻的初值。例:(/2,4,6,8,10/)(/(I,I=2,10,2)/)(/2,4,(I,I=6,10,2)/)用数组构造器给数组赋值一维数组:直接使用数组构造器。INTEGER,DIMENSION(5)::num1,num2I=4;J=8num1=(/2,ABS(-4),I+2,J,10/)num2=(/(I,I=2,10,2)/)多维数组:需使用函数RESHAPE将数组构造器转换形式。INTEGERB(2,3),C(8)B=RESHAPE((/1,2,3,4,5,6/),(/2,3/))B为2行3列C=(/0,RESHAPE(B,(/6/)),7/)数组名=表达式:给所有元素赋相同初值。数组构造器也可用于给数组片段赋初值7DATA语句DATA对象表/初值表/{,对象表/初值表/}例:INTEGERA,B(2),C(3),D(3),E(5)DATAA,B,C(2:3),D(1)/1,2*2,2*3,1/DATA(E(I),I=1,5)/5*2/8动态数组1)声明方式:类型声明符,DIMENSION(:{,:}),ALLOCATABLE::数组表例:INTEGER,DIMENSION(:),ALLOCATABLE::num,scoreREAL,DIMENSION(:,:),ALLOCATABLE::A,B或INTEGER,ALLOCATABLE::num(:),score(:)REAL,ALLOCATABLE::A(:,:),B(:,:):的个数表示维数,其后不可变2)声明后,通过ALLOCATE语句为其分配存储空间(指定上下界):ALLOCAT