1第三讲FORTRAN77编程基础2主要内容FORTRAN77基础数据结构控制结构(选择与循环)基本输入输出函数与子程序计时函数文件操作3FORTRAN基础FORTRAN语言发展概况FORmulaTRANslation适用于工程及科学计算的一种高级程序设计语言1951年由约翰贝克斯等人开始研发1957年第一个FORTRAN程序在IBM704机上运行1966和1978年先后颁布FORTRAN66和FORTRAN771991和1997年颁布了Fortran90和Fortran952004年公布Frotran2003标准,面向对象程序设计2010年公布Fortran2008标准4FORTRAN编译器免费的FORTRAN编译器商业版FORTRAN编译器GNUFORTRAN/gfortranG95IntelFortran编译器(非商业版)PowerStation、CompaqVisualFortran(已停止更新)IntelFortranPGIFortranAbsoftProFortranLaheyFortran5程序开发环境Linux系统Windows系统字符界面,命令行方式Code::Blocks+GCCMicrosoftVisualStudio+IntelVisualFortranCode::Blocks+GCC6一个简单的编程示例programmatmulintegernparameter(n=100)reala(n,n),b(n,n),c(n,n)cdoj=1,ndoi=1,na(i,j)=1.
0/(i+j‐1)b(i,j)=1.
0c(i,j)=0.
0enddoenddocdoi=1,ndoj=1,ndok=1,nc(i,j)=c(i,j)+a(i,k)*b(k,j)enddoenddoenddocprint*,"c(1,1)=",c(1,1)stopend7FORTRAN程序分析一个FORTRAN源程序由一个或多个程序单元组成每个独立的程序单元以"end"语句结束每个程序单元包括若干行(一行不能写多条语句,但一条语句可以分几行写)每个程序单元可包含语句行和非语句行(注释行)语句行:可执行语句和非执行语句行非执行语句在所有可执行语句行前面语句可以根据需要设置标号各类语句在程序单元中的位置必须满足一定规则程序必须按规定的格式书写8源程序书写格式每行只能在72列内书写,并把80列分为4个区1~5列:标号区(1~5位整数)如果第1列为"*"或"c",则为注释行第6列:续行标志区续行符可以是任意非空格/非零字符最多19个续行7~72列:语句区(一行只能写一条语句)73~:被忽略,有的编译器会报错FORTRAN77源程序必须按规定的格式书写(FixedFormat固定格式)9编写程序与编译执行源程序以.
f为扩展名纯文本文件,可使用任何文本编辑器编写编译与执行g77‐O2–o输出文件名源程序文件名.
/输出文件名g77‐O2–ohellohello.
f.
/hello10编译执行g77常用选项-o:指定生成的可执行文件的文件名,缺省为a.
out-c:只编译不链接,即只生成目标文件(.
o文件)-Ipath:指定或增加包含文件(如*.
h)的搜索路径-Lpath:指定(增加)库文件的搜索路径-lname:与库文件libname.
a链接-O,-O1,-O2,-O3:优化开关-g:在目标码中加入更多信息,用于程序调试11FORTRAN字符集英文字母:ABCD.
.
.
.
.
.
XYZ下划线和阿拉伯数字:_0123456789特殊符号:空格FORTRAN不区分大小写早期的FORTRAN卡片不允许小写故很多FORTRAN程序源代码都是大写的12FORTRAN数据结构F77支持基本类型和构造类型的数据结构基本类型构造类型:数组、记录、文件F77不支持指针整型、实型、双精度、复型、逻辑型、字符型13常量①整型常量(Integer)正、负整数和零,缺省取值范围为:[-231,231-1]②实型常量(Real)小数或指数形式:0.
876→8.
76E-1→87.
6E-2指数部分只能是整数,取值范围:[10-38,1038]③双精度常量(Doubleprecision)8字节:0.
125D+45,取值范围:[10-308,10308]④复型常量(Complex)8字节:(实数,实数)⑤逻辑型常量(Logical)⑥字符型常量(Character)14变量变量名第一个字符必须是字母后面可以跟1~5个字母、下划线或数字变量类型整型、实型、双精度、复型、逻辑型、字符型现在的FORTRAN编译器允许多于6个字符(g77最多支持约51个字符)变量名中的空格不起作用.
如:abc,abc相同变量要先声明,后赋值,然后才能被引用15变量声明变量声明的三种方式I~N规则(隐含约定)implicit语句(隐式声明,更改或取消I~N规则)以i、j、k、l、m、n开头的变量缺省为整型变量,以其它字母开头的变量缺省为实型变量implicitdoubleprecision(a‐c,x)implicitreal(i,j)implicitinteger(a,b),real(i,k)implicitnone!
去除所有的隐含约定16变量声明类型声明语句(显式声明)integeri,i2realx,ydoubleprecisionsum!
也可以写为real*8sumcomplexc1,c2logicall1,l2characterch1,ch2类型关键字变量列表基本数据类型关键字:integer,real,doubleprecision,complex,logical,character17变量声明implicit变量声明的几点注意三种类型声明方式的优先级显式声明I~N规则>>变量声明是非执行语句,必须位于所有可执行语句的前面implicit语句应放在所有的类型声明语句的最前面只在本程序单元内有效(局部变量)implicitdoubleprecision(a‐z)integeri,j18数组数组的声明(方式一)类型关键字数组名(下标说明符,.
.
.
)下标说明符用于指定数组的大小,一般形式为下标下界:下标上界integerA(1:3,0:5)若下界为1,可省略integerA(3,0:5)19数组数组的声明(方式二)integerAdimensionA(3,0:5)FORTRAN中的数组是按列排放的dimension数组名(下标说明符,.
.
.
)例:20内部函数基本数学函数(三角、指数、对数函数等)直接调用函数名(自变量列表)sin(1.
57),mod(10,3)函数自变量(参数)必须用括号括起来函数自变量可以是常量、变量或表达式函数的类型通常由函数值的类型来确定,但有些函数的类型是由自变量的类型来确定的三角函数的角度单位是"弧度"21表达式表达式算术表达式、逻辑表达式、关系表达式、字符表达式算术运算符:没有左除多次乘方按"先右后左"的原则处理运算顺序:()→函数4**3**24**(3**2)22算术表达式算术表达式运算结果的数据类型运算数据类型相同,则结果仍为原类型运算数据类型不同,则按下面的次序转换整型→实型→双精度→复型注:类型转换从左到右进行,遇到不同类型运算时才进行4/5+3*1.
1–4.
14.
0/5+3*1.
1–4.
14d0/5d0+3d0*1.
1d0–4.
1d0例:ex4number.
f例:23赋值语句赋值号左端只能是变量类型转换问题赋值号左右的数据类型不同时,先计算表达式的值,然后将结果转换为左端变量的数据类型变量=表达式为避免出现类型转换过程中的错误,应保证两侧类型一致24初始化DATA语句可用DATA语句对变量进行初始化data变量表/初值表/,变量表/初值表/,.
.
.
datax,y/3.
1,5.
2/,i,j,k/1,2,3/integera(10)dataa/10*3.
1/!
表示10个3.
1例:25输入输出表控输出:按系统规定的缺省格式输出输入/输出三要素FORTRAN输出分类整数:每个整数占11列,数印右端,左补空格实数:15列,数印右端,左补空格,小数部分占6列对象(数据)、格式、设备表控输出、格式化输出、无格式输出表控输出语句print*,输出列表write(*,*)输出列表26输入语句表控输入FORTRAN输入分read*,输入列表read(*,*)输入列表当执行到输入语句时,程序会暂停,等待用户输入输入多个数据时,以逗号或空格隔开以回车结束输入输入的数据应和输入列表中变量的个数、类型、次序严格一致表控输入、格式化输入、无格式输入27parameter定义符号常量parameter(p1=c1,p2=c2,.
.
.
)符号常量名的命名规则与变量名相同符号常量也有类型,也可用三种方法声明类型parameter语句是非执行语句parameter语句位于类型声明语句后面一次可以定义多个符号常量integerm,nparameter(n=100,m=200)例:28END,STOP,PAUSEEND语句STOP语句PAUSE语句程序单元结束标志,每个程序单元有且仅有一个END暂停运行程序,用于调试程序停止运行程序,用于调试程序29关系运算关系运算符不等于.
NE.
等于.
EQ.
小于等于.
LE.
小于.
LT.
大于等于.
GE.
大于.
GT.
关系运算符两边为算术量运算结果为逻辑值:真(True)或假(False)算术运算优先级高于关系运算注意运算符前后的两个点!
现在的F77编译器大多数也支持下列关系运算符:30逻辑运算逻辑运算符逻辑不等于.
NEQV.
逻辑等于.
EQV.
逻辑非.
NOT.
逻辑或.
OR.
逻辑与.
AND.
逻辑运算符两边为逻辑量两个逻辑常量:.
True.
.
False.
运算结果为逻辑值:真(.
True.
)或假(.
False.
)算术运算→关系运算→逻辑运算.
not.
→.
and.
→.
or.
→.
eqv.
/.
neqv.
31IF语句逻辑IF语句if(条件)一条执行语句逻辑IF语句:当条件为"真"时执行后面的语句逻辑IF语句后面只能写一条语句逻辑IF语句也常与GOTO语句合用32IF结构IF结构if(条件)then语句块elseif(条件)then语句块.
.
.
.
.
.
else语句块endifelseif可以没有或有多个else至多只能有一个if结构可以嵌套then不能省略33GOTO语句GOTO语句F77允许使用GOTO语句来实现转移由于GOTO语句不符合结构化原则,一般不提倡使用GOTO语句和IF语句结合使用可以实现循环结构goto语句标号例:ex4goto.
f34DO循环DO循环DO[标号]循环变量=初值,终值[,增量]循环体标号终止语句sum=0do110i=1,100,1110sum=sum+i例:ex4do1.
f35DO循环DO语句的几点说明当循环变量的增量(步长)为1时可省略循环次数=int((终值-初值+增量)/增量循环次数一开始就被确定,不再改变循环次数<=0时不执行循环若循环变量的类型和初值、终值和步长的类型不一致,则按赋值的规则处理尽量避免用实数作为循环的初值、终值或步长循环变量在循环体内只能被引用,不能被赋值离开循环时,循环变量的值为最后一次被赋的值若程序中用到转移语句(GOTO),则:允许从循环体内→体外;不允许从循环体外→体内36DO循环DO循环的执行过程①计算初值、终值、增量的值,并转换成循环变量的类型②将初值赋给循环变量③计算循环的次数④检查循环次数,若≤0则跳过循环,否则执行循环体⑤执行终止语句后,循环变量增值,循环次数减1⑥返回第④步37DO循环DO循环中的终止语句CONTINUE语句sum=0do110,i=1,100,1sum=sum+i110continue又称"空语句",不进行任何操作,常作为循环的终止语句终端语句可以是除GOTO、块IF、CASE、CYCLE、DO、ELSE、ELSEIF、ENDIF、END、ENDSELECT、EXIT、SELECTCASE、STOP和RETURN语句以外的任一可执行语句,如打印、赋值、输入或CONTINUE语句等38DO循环ENDDO语句sum=0doi=1,100,1sum=sum+ienddoDO循环可以嵌套DO循环的终止语句此时DO循环中不需要标号推荐使用!
39隐式DO循环隐式DO循环READ*,(X(I),I=1,20)WRITE(*,*)(A,B,N=1,5)PRINT*,((A(I,J),I=1,3),J=1,3)例:ex4do2.
f隐式DO循环是一个简化的DO循环,只含普通DO循环的第一句,且省略关键词DO只能用于数据的输入输出隐式DO循环也可以嵌套40条件DO循环条件DO循环DOWHILE(条件)循环体ENDDO不带循环变量的DO语句DO循环体ENDDO例:ex4do3.
f循环体中通常含if.
.
.
goto.
.
.
语句现在的F77编译器也支持exit语句,退出最内层循环41字符变量字符型数据字符变量的声明character*15str1用单引号括起来,每个字符占用一个字节连续两个单引号表示一个普通单引号characterstr1*5,str2*10,str3*8character*5str1,str2*10,str3字符变量的赋值str1='Fortan77'42字符数组character*15str1(100)character*15str1dimensionstr1(100)字符数组43字符数据的运算字符型数据的运算字符串的合并://A='hello'B='world'C=A//B比较两个字符串的大小:按ASCII码,依次比较A(2:5),B(:3),C(3:)提取子串字符串相关函数LEN,CHAR,ICHARINDEX,LGT,LGE,LLT,LLE44有格式输出有格式的输出write(*,标号)输出列表标号format(格式说明)print标号,输出列表标号format(格式说明)print100,k,y100format(i8,f7.
2)print'(i8,f7.
2)',k,y格式说明是由各种"格式编辑符"构成格式说明也可以放到print、write和read语句中45格式编辑符格式编辑符:I、F、E、G、D、X、A、'、/、r、.
.
.
.
.
.
Iw或Iw.
m!
w为打印宽度,m为输出的最少位数Fw.
m或Ew.
m!
w打印宽度,m输出的小数位数I:整型数据的输出,一般形式为F/E:小数/指数形式输出实数,一般形式为G:根据需要,自动采用小数或指数形式输出实数D:采用更高精度,以指数形式输出实数46格式编辑符nX!
输出n个空格A或Aw!
w打印宽度format(1x,2I10,F8.
3,3F7.
2)X:空格A:字符变量的输出,一般形式为':单引号,直接输出字符串/:结束本行的输出并从下一行开始输出下一个记录r:重复系数47有格式输入有格式的输入read(*,标号)输入列表标号format(格式说明)read101,a,b,c101format(3F5.
1)48内部函数与语句函数内部函数函数名(变量1,变量2,表达式语句函数f(x,y)=x*y+x/y函数名的命名规则与变量名相同函数名不能与其他对象(变量,数组等)同名是非执行语句,应放在所有可执行语句的前面和所有声明语句之后虚参(形参)没有具体的值,可与其它变量等同名语句函数可以使用前面已定义的其它语句函数只在所在程序单元内有效(可直接使用)(先定义,后调用,使用方便)49函数子程序类型关键字function函数名(形参列表)函数体endfunction函数名(形参列表)类型关键字函数名函数体end函数子程序的定义(自定义函数)函数子程序的调用:直接调用RETURN语句:返回调用函数,可出现一次或多次50函数子程序的几点说明①函数名的命名规则和类型都与变量相同②形参也有数据类型,要在子函数体中声明③形参可以是变量名、数组名和子程序名④函数被调用时,形参和实参共用一个存储单元⑤若无形参,括号不能省⑥函数子程序中所有变量和标号(除函数名和虚参外),与其它程序单元无任何联系(局部变量)⑦函数名负责把函数值带回主调程序,故在函数体中,要被赋值,即:函数名=表达式⑧函数子程序是一个独立的程序单位,可以作为一个单独的源文件进行存贮和编译,与调用程序链接后起作用51子例程序子例程序(子程序)的定义subroutine子程序名(形参列表)程序体end子例行程序名的命名规则与变量名相同如果没有形参,括号可以省略形参可以是变量名、数组名和子程序名形参和子程序体中所用的局部变量都要声明子程序的名字只起标识作用,不能在程序体中出现子例程序的调用call子程序名(实参列表)实参和形参的结合:地址传递,即共用一个存储单元52子例程序子例程序与自定义函数的差别名字的作用不同:函数名除了供调用外,还代表函数返回值,而子例程序名只供调用返回值的方式不同:自定义函数是通过函数名将函数值带回主调程序,而子例程序是通过"虚实结合"将其新值转送回主调程序调用方式不同:函数的调用总是出现在表达式中,而子例程序必须用一条独立的语句调用53文件操作文件打开open(说明项)文件的读写read(设备号,格式),输入列表write(设备号,格式),输出列表说明项包括:设备号、文件名、状态、存取方式、记录格式等文件的关闭close(设备号)54文件操作二进制文件的读写文本文件的读写详见课程主页"FORTRAN77讲义"55计时函数etime(FORTRAN77)system_clock(FORTRAN90)cpu_time(FORTRAN95)callcpu_time(t0).
.
.
.
.
.
callcpu_time(t1)print*,'Elapsedtime:',t1‐t0calletime(tarray,t0).
.
.
.
.
.
calletime(tarray,t1)print*,'Elapsedtime:',t1‐t056上机作业比较两种矩阵乘积算法的计算效率(文件名hw01.
f)矩阵A为Hilbert矩阵,维数为4096*4096矩阵B存放在二进制文件dataB.
dat中,维数为4096*4096每种算法计算1000次,统计总的运算时间有没有其他实现方法!
i‐j‐k形式doi=1,mdoj=1,Ldok=1,nc(i,j)=c(i,j)+a(i,k)*b(k,j)enddoenddoenddo!
j‐k‐i形式doj=1,Ldok=1,ndoi=1,mc(i,j)=c(i,j)+a(i,k)*b(k,j)enddoenddoenddoA,B,C均为双精度实型57上机作业用Jacobi迭代解线性方程组Ax=b,其中10241024,TIIARIIT11b3232411,114TR最大迭代步数设为1000次停机准则为:相对残量的2范数小于10-6(文件名hw02.
f)
官方网站:点击访问星梦云活动官网活动方案:机房CPU内存硬盘带宽IP防护流量原价活动价开通方式成都电信优化线路4vCPU4G40G+50G10Mbps1个100G不限流量210元/月 99元/月点击自助购买成都电信优化线路8vCPU8G40G+100G15Mbps1个100G不限流量370元/月 160元/月点击自助购买成都电信优化线路16vCPU16G40G+100G20Mb...
hostkey应该不用说大家都是比较熟悉的荷兰服务器品牌商家,主打荷兰、俄罗斯机房的独立服务器,包括常规服务器、AMD和Intel I9高频服务器、GPU服务器、高防服务器;当然,美国服务器也有,在纽约机房!官方网站:https://hostkey.com/gpu-dedicated-servers/比特币、信用卡、PayPal、支付宝、webmoney都可以付款!CPU类型AMD Ryzen9 ...
华纳云(HNCloud Limited)是一家专业的全球数据中心基础服务提供商,总部在香港,隶属于香港联合通讯国际有限公司,拥有香港政府颁发的商业登记证明,保证用户的安全性和合规性。 华纳云是APNIC 和 ARIN 会员单位。主要提供香港和美国机房的VPS云服务器和独立服务器。商家支持支付宝、网银、Paypal付款。华纳云主要面向国内用户群,所以线路质量还是不错的,客户使用体验总体反响还是比较好...
linux格式化命令为你推荐
淘宝收费淘宝要收费吗?缓冲区溢出教程溢出攻击原理正则表达式javajava正则表达式怎么点亮qq空间图标QQ空间图标怎么点亮?mate8价格华为mate8什么时候会降价小米手柄小米手柄能连几个手机怎么上传音乐怎么上传音乐三星s8什么时候上市三星s8什么时候上市 三星s8上市时间qq等级表QQ等级天数表聚美优品红包聚美优品怎么给别人发红包
上海服务器租用 播放vps上的视频 域名备案信息查询 快速域名备案 linuxapache虚拟主机 免费动态域名解析 cloudstack 日志分析软件 java虚拟主机 ftp教程 北京双线机房 服务器托管什么意思 电信主机 上海联通宽带测速 联通网站 免费的域名 测试网速命令 杭州电信宽带 月付空间 godaddy中文 更多