FORTRAN语言程序设计课件_第1页
FORTRAN语言程序设计课件_第2页
FORTRAN语言程序设计课件_第3页
FORTRAN语言程序设计课件_第4页
FORTRAN语言程序设计课件_第5页
已阅读5页,还剩264页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第一章FORTRAN

语言的

程序结构及其兼容性

程序设计基本概念FORTRAN语言的发展简史FORTRAN77程序的构成FORTRAN90程序的构成及其兼容性

*第一节程序设计基本概念程序设计的基本过程程序设计的基本方法模块化设计自顶向下、逐步细化的设计过程结构化设计程序设计语言*高级语言程序设计基础(Fortran)什么是程序?用计算机能识别的语言所描述的解决实际问题的方法和步骤。计算机能识别的语言有哪些?机器语言、汇编语言、高级语言什么是程序设计?*程序设计的基本过程问题的分析问题的性质;输入/输出数据;数学模型或常用的方法-----算法算法的设计可行性;确定性;有穷性;有零或多个输入;有一个或多个输出流程的描述自然语言;算法描述语言;流程图;编程调试与运行测试;调试程序设计=算法+数据结构+方法+工具BACK*算法什么是算法?解决问题的方法和步骤。算法的特征?有穷性算法中执行的步骤总是有限次数的,不能无止境地执行下去。

确定性算法中的每一步操作必须具有确切的含义,不能有二义性有效性算法中的每一步操作必须是可执行的。要有数据输入算法中操作的对象是数据,因此应提供有关数据。要有结果输出算法的目的是用来解决一个给定的问题,因此应提供输出结果,否则算法就没有实际意义。*算法算法的描述有哪些?

自然语言一般流程图

N-S图

Pad图伪代码算法描述语言(如:C,Fortran)等*自然语言:输入x,y;判断x是否为0:若x=0,则输出错误信息;否则计算y/x→z,且输出z

例:计算z=y/x算法描述语言算法描述语言+自然语言(伪代码)INPUTx,y输入x,yIF(x=0)THENIF(x=0)THENOUTPUT“ERROR”

输出错误信息ELSEELSE{z=y/x{z=y/xOUTPUTz

输出z}}BACK*N-S结构化流程图输入x,y

输出错误信息z=y/x

输出z

结束编程WRITE(*,100)100FORMAT(1X,‘INPUTX,Y:’)READ(*,*)X,YIF(X.EQ.0.0)THENWRITE(*,200)ELSEZ=Y/XWRITE(*,300)ZENDIF200FORMAT(1X,‘ERROR!X=0’)300

FORMAT(1X,‘Z=’,E15.6)ENDx=0yesnoBACK*1.一般流程图是一种传统的算法描述方法它用不同的几何图形来代表不同性质的操作。主要优点:是直观性强,初学者容易掌握。缺点是对流程线的使用没有严格限制,如毫无限制地使流程任意转来转去,将使流程图变得毫无规律,难以阅读。为了提高算法可读性和可维护性,必须限制无规则的转移,使算法结构规范化。*例1.4用一般流程图来描述例1.1的算法。输入a、ba<b?输出uyn*例1.2的算法。y1→ix>max?输入maxy输入xi≤9?x→maxi+1→i输出maxnn*2.N-S图S1S2S3

YNS1S2

当P满足时SP由于传统流程图的缺点,1973年美国学者I.Nassi和B.Shneiderman提出了一种新的流程图工具─N-S图。N-S图以三种基本结构作为构成算法的基本元素,每一种基本结构用一个矩形框来表示,而且取消了流程线,各基本结构之间保持顺序执行关系。N-S图可以保证程序具有良好的结构,所以N-S图又叫做结构化流程图。*例1.5用N-S图来描述例1.1的算法。输入a、bYN输出ua<b?*例1.2的算法。输入max1→i当i≤9时输入xynx→maxi+1→i输出maxx>max?*按功能划分模块按层次组织模块主模块模块1模块2模块3模块5模块6模块4模块化设计BACK*自顶向下、逐步细化的设计过程

优点:符合人们解决复杂问题的普遍规律,可显著提高程序设计效率;用先全局后局部、先整体后细节、先抽象后具体的方法设计出的程序具有清晰的层次结构,容易阅读和理解。BACK*1966年Bohra和Jacopini提出了组成结构化算法的三种基本结构顺序结构选择结构循环结构特点:

(1)只有一个入口。

(2)只有一个出口。

(3)结构中无死语句,即结构内的每一部分都有机会被执行。

(4)结构中无死循环。结构化设计记忆:单入口、单出口、无死语句、无死循环。*顺序结构选择结构循环结构顺序结构S1S2S3结构化设计*两路分支结构S1

S2

多路分支结构条件情况1情况2情况3……S1S2S3……当型循环WHILE条件S直到型循环SUNTIL条件条件满足不满足BACK*自顶向下逐步细化模块化设计结构化编码如何保证得到结构化程序*程序设计语言机器语言;汇编语言;高级语言语言名称适用范围BASIC教学和小型应用程序的开发FORTRAN科学与工程计算程序的开发PASCAL专业教学与应用程序的开发C中小型系统程序的开发COBAL商业与管理应用程序的开发dBASE数据库管理程序的开发FoxBASE数据库管理程序的开发C++面向对象程序的开发LISP人工智能程序的开发PROLOG人工智能程序的开发JAVA应用程序的开发BACK*第二节FORTRAN语言的发展简史

1954年IBM公司在IBM704上发展

DOS下

1956年IBM公司FORTRANII1966年美国国家标准化协会(两级美国标准)FORTRANII和FORTRANIV1972年国际标准化组织(三级国际标准)FORTRANII(基本级)FORTRAN中间级和FORTRANIV(完全级)1978年美国国家标准化协会FORTRAN771992年国际标准化组织ISO公布Fortran90标准

与77版本差异较大在“形式”上让Fortran脱胎换骨

BACK*第二节FORTRAN语言的发展简史

Microsoft(微软)公司FORTRAN90FORTRANPOWERSTATION1.0~4.0DEC公司VisualFORTRANVisualFORTRAN5.0~6.01997年国际标准化组织ISO公布Fortran95标准

加強平行运算2004年Fortran2003面向对象BACK*第三节FORTRAN77程序的构成计算z=x+y

PROGRAMMAIN主程序说明语句

INTEGERX,Y,Z说明了三个整型变量X、Y、Z

WRITE(*,100)用于输出一个提示信息,以提醒用户从键盘输入两个整数给X与Y100FORMAT(1X,‘INPUTX,Y:’)

READ(*,*)X,Y输入语句,表示要从键盘输入两个整型数分别赋给X与Y

Z=X+Y赋值语句,X与Y相加后赋给Z

WRITE(*,200)Z输出X与Y之和,即Z的值200FORMAT(1X,‘X+Y=’,I6)

END结束语句,表示程序的结束*

INTEGERX,Y,Z主程序,并不直接计算X与Y的和,而是通过调用函数子程序(子程序名为M)来计算;另外,在主程序中可以省略主程序说明语句(即PROGRAM语句)

WRITE(*,10)10FORMAT(1X,‘INPUTX,Y:’)

READ(*,*)X,Y

Z=M(X,Y)

WRITE(*,20)Z20FORMAT(1X,‘X+Y=’,I6)

ENDCFUNCTION子程序(称为函数子程序),此函数子程序M的功能是具体计算两个整数之和FUNCTIONM(A,B)INTEGERA,BM=A+BEND*一个程序单位必须有一个、也只能有一个END语句,并且它只能出现在一个程序单位的最后;每一个程序单位可以包括若干行,在FORTRAN77中,有语句行和非语句行两类;FORTRAN77程序中的语句前可以没有标号,也可以有标号,根据需要而定;FORTRAN77对各类程序单位中的第一个语句是有规定的;FORTRAN77源程序必须按一定的格式书写。标号区续行标志区语句区注释区1~567~7273~80FORTRAN77

程序结构与组成的规定BACK*第四节FORTRAN90程序的构成

及其兼容性FORTRAN77FORTRAN90源代码只能用固定格式进行输入源代码可以用两种格式进行输入:自由格式和固定格式以字母C或字符“*”起始的一行为注释行以“!”起始的一行为注释行要求以一个非空格且非零的字符作为续行标志要求以一个“&”作为一个续行标志一行中最多只能写一条语句一行中可以写多条语句,用“;”隔开*第二章MicrosoftFortranPowerStation4.0

开发环境介绍MicrosoftFortranPowerStation4.0用户界面查看文档查看界面元素对话框菜单工具栏输出和出错信息*第一节MicrosoftFortranPowerStation4.0用户界面项目工作区窗口:这个带标签的窗口使访问应用程序的任何部分变得简单、迅速;信息视图:在BooksOnline中可找到答案;资源视图:访问菜单、对话框、位图、以及其他用户界面的资源;文件视图:组织文件,并方便地打开它们;输出窗口和状态栏:位于屏幕下端,这些区域通知用户并提供结果;代码编辑器:此为用户工作之地,它可以输入代码、修正错误、以及观察应用程序的形态。*BACK第二节查看文档BACK第三节查看界面元素对话框BACKResourceID(资源ID);Caption(标题);Prompt(提示)BACK菜单菜单BACK工具栏BACK创建(Build):显示编译和链接结果;调试(Debug):调试时使用;在文件中查找(FindinFile):显示在文件搜索中查找的结果;结果(Profile):显示结果。

第四节输出和出错信息

*39第二章顺序结构程序设计

REALX,Y,T READ*,X,Y PRINT*,"交换前X=",X PRINT*,"交换前Y=",Y T=X X=Y Y=T PRINT*,"交换后X=",X PRINT*,"交换后Y=",Y END2023/11/1240第二章顺序结构程序设计数据类型及其运算最基本的语句实例分析顺序结构是面向过程程序设计三种基本结构中最简单的一种结构,它只需按照处理顺序,依次写出相应的语句即可。2023/11/1241§2.1数据类型及其运算数据

表现形式

数据类型常量变量表达式函数整型实型双精度型常量复型常量逻辑型常量字符型常量2023/11/1242§2.1数据类型及其运算常量变量及其定义符号常量及其定义FORTRAN表达式43常量整型常量小数形式实型常量指数形式双精度型常量复型常量逻辑型常量字符型常量44常量常量是在程序运行过程中,其值不改变的量。例如15、0、-21、3.1416、’FORTRAN’等分为:直接常量和符号常量两大类。

451.直接常量

直接常量是指数据本身就是一个常量。分为:整型常量、实型常量(1)整型常量:称为整型常数或整数,(正数、负数、0)。如125,-258,+28等。注意:123,000×;千分位123.00×

;点123

00×

空格(77可以,而90及以上版本出错)。

4677中一个整型常量占2个字节90中整型常量的范围没有明确规定。如16位计算机上整型常量的范围是2个字节,表示为十进制数为-32768~+32767,即-215~215-1。47

(2)实型常量

即实型常数或简称实数。它有2种表示形式:小数形式和指数形式。小数形式根据小数点前后是否有数字形成3种不同格式,分别是:m.n、m.、.n。数字前面可以加上“+”或“-”号,默认为正号。小数点“.”前或后可以不出现数字。例如3.52、4.0、-5.(相当于-5.0)、.6378(相当于0.6378)等。48指数形式可以表示一个绝对值非常大或非常小的数,表示方式是用E将有效数字和指数分隔,E的前面是指数,E的后面是小数。例如:

1.32E5表示13200或1.32*105。1.285E-12表示1.285*10-12。注意:有效数字可是整型或实型常量,如1E2和1.0E2两种表示100.0,但与100同;E后只能是整型常量,如5E3.2×

,.E8×

。还有复型、逻辑型、字符型等类型的常量练习:P28/3492.符号常量

是用一个标识符来代表一个常量。常用PARAMETER语句来定义。例如:PARAMETER(PI=3.1416,M=10,…)。含义:定义了两符号常量PI和M,PI代表3.1416,M代表10,…注意:PARAMETER、()、如有多项,用逗号隔开。

50符号常量及其定义注意问题:非执行语句,写在所有可执行语句之前,且,一旦定义,不能再改变;命名规则:同变量名;但应先写类型说明,后写PARAMETER语句;一个PARAMETER中,可定义多个符号常量;类型:数值型、逻辑型、字符型;符号常量不能作为语句标号,也不能出现在FORMAT中;此外,均可。符号常量与变量的区别:编译时,变量分配存储空间,符号常量进行数据替换。51变量及其定义变量与变量名隐含规则类型说明语句整型说明语句实型说明语句双精度型说明语句复型说明语句逻辑型说明语句字符型说明语句隐含说明语句52变量说明中应注意的问题有效范围:说明语句中所说明的变量类型只在本程序单位内有效;优先级:类型说明语句→隐含说明语句→隐含规则(I-N规则);出现顺序:IMPLICIT在最前,专门的类型说明语句在本程序中所有执行语句的前面;隐含规则适用:整型和实型变量;IMPLICIT适用:所有的FORTRAN变量的类型,但各种专门的类型说明语句只适用于对一种类型的变量进行说明。53变量

是指在程序运行过程中其值可以改变的量。变量实质上代表一个内存单元54变量名

一个变量需要一个名字来识别同一程序中,不能用同一个变量名代表不同的变量。变量的名字即标识符。55

表2.1FORTRAN77与FORTRAN90标识符对照FORTRAN类型组成字符长短开头字符大小写要求FORTRAN77及以前版本字母、数字1~6个字符超过6后面字符无效字母不区分FORTRAN90及以上字母、数字和下划线1~31个字符超过31个后面字符无效字母不区分练习:P28/256注意:要“见名知义”,如:AREA“面积”,GRADE“成绩”,AVER“平均值”等。FORTRAN无“保留字”,但为避免误解、混淆,应尽量避免。57变量的说明

三种方式:1.强制说明2.

隐含说明语句IMPLICIT3.

隐含说明I—N规则顺序:123581.强制说明格式为:类型说明符变量名1,变量名2…另一种格式:REAL::SCORE=89.5可同时进行初始化INTEGER整型REAL实型DOUBLEPRECISION双精度型

COMPLEX复型变量说明LOGICAL逻辑型CHARACTER字符型可定义多个,中间用“,”分开。如:REALAREA,AVER,STUD592.隐含说明语句IMPLICIT将某个或某些字母开头的变量规定为所需的类型格式:IMPLICIT类型说明(字母表)例:IMPLICITINTEGER(A,C,T-V)含义603.隐含约定

FORTRAN语言规定:以I,J,K,L,M,N6个字母开头的变量被当作整型变量。又称I~N规则如:在无前面两种说明时,I1,MA,N3S等都为整型变量。

61FORTRAN表达式算术表达式关系表达式逻辑表达式字符表达式不同类型数据的混合运算例题62算术表达式运算顺序为:乘幂**→乘*、除/→加+、减-常用的算术型标准函数P19—2063注意问题书写:左

右,数学

FORTRAN,适当加括号;乘号*不能省略;只允许用圆括号;连续使用乘幂运算符时,加上必要的括号;求值顺序:括号内→函数→**→*、/→+、-允许不同数值类型的量进行混合运算;实型运算注意误差问题;整型运算注意整数范围。64例题A=1.0,B=3.5,T=10.0,X=5.0,I=-5,J=7,K=3,求下面表达式的值。-(A+T)(B+(X/T))/(4.0*A)(I*J)/K(I/K)*J+T/X-(K+1)/5+I*A-BSQRT(REAL(ABS(K)+1))MAX(J,MOD(J,K))J+INT(T/B)/A2023/11/1265§2.2最基本的语句赋值表控输入输出END、STOP、GOTO赋初值格式输入输出66赋值语句格式:变量名=表达式算术赋值语句逻辑赋值语句逻辑型变量=逻辑表达式数值型变量=逻辑表达式×

逻辑型变量=算术表达式×

字符赋值语句

67算术赋值语句数值型变量名或数组元素=算术表达式右边的算术表达式允许整型与实型的混合运算;但注意:整数相除,结果为整型;左、右类型不一致,系统自动右转左算术赋值语句执行过程:1、计算右边的值2、计算结果转换与左边类型一致3、左边=右边。68表控输入输出语句格式:WRITE(*,*)

输出表项

PRINT*,输出项表输出空行,WRITE(*,*)

;逻辑型变量,.TRUE.输出T;.FALSE.输出F。表控输入语句例题1、269表控输入语句格式:READ(*,*)

输入表项注意输入数据的个数、类型应与READ一致规定:每个READ总是从新的输入行开始读数逻辑型变量,.TRUE.用以T开头的一串字母代替,.FALSE.以F开头的一串字母代替READ(*,*),输入Enter分隔符:Enter,空格、逗号、斜杠(/)出现斜杠(/)符号,输入结束,后面变量不再赋值数据各数字间不能有空格70END语句、STOP语句与GOTO语句END语句程序单位的结束主程序中END表示停止程序运行子程序中END表示需要返回调用程序STOP语句作用是停止程序的运行格式:STOP[n]GOTO语句格式:GOTO语句标号

×

71程序举例

例2.3任意输入两个数,对它们进行加、减、乘、除、乘方运算分析:结构?变量?结构:顺序结构变量:X1、X2,S1、S2、S3、S4、S572

realx1,x2 read*,x1,x2 s1=x1+x2 s2=x1-x2 s3=x1*x2 s4=x1/x2 s5=x1**x2 print*,"2数之和为",s1 print*,"2数之差为",s2 print*,"2数之积为",s3 print*,"2数之商为",s4 print*,"2数之幂为",s5 end问题:S1、S2、S3、S4、S5没说明,如何判断类型?73例2.4求f(x)=x3+sin2x+ln(x4+1)分析:f(x)用y表示,x从键盘输入

implicitnone realx,y read*,x y=x**3+(sin(x))**2+log(x**4+1) print*,y end输入:154输出:2.40122174例2.5将两个变量的值互换。分析:临时变量T做桥梁

realx,y,t read*,x,y print*,"交换前x=",x print*,"交换前y=",y t=x x=y y=t print*,"交换后x=",x print*,"交换后y=",y end75方法二、直接用X和Y交换

integerx,y read*,x,y print*,"交换前x=",x print*,"交换前y=",y x=x+y y=x-y x=x-y print*,"交换后x=",x print*,"交换后y=",y end如何记?左边:xyx右边:x与y,+--76例2.6输入一个三位整数,将它反向输出,如输入123,输出321。分析:关键在于如何将N拆分?

integern,m,n1,n2,n3 read*,n n1=mod(n,10) n2=mod(n/10,10) n3=n/100 m=n1*100+n2*10+n3 print*,"原来的数为:",n print*,"反向输出的数为:",m end 如何取位?取第n位:除10n-1,除10取余77赋初值语句DATA语句格式DATA变量表列/初值表/,变量表列/初值表/,…用DATA注意变量与常量在个数、类型等方面要一一对应初值表中,如n个连续的常量相同,简写:n*常量初值表中,不允许出现表达式如有多个DATA语句给同一变量赋初值,以最后一个为准78作业与实验作业

P29:8.1、10实验实验手册:P18:2、3、5要求:1、提前想好如何编程2、文件名起名为:LX1_2,LX1_3,LX1_53、每人建一个文件夹,起名为:学号+姓名,如:05王刚4、把自己的程序文件保存到本班下的自己的文件夹里。注意:只要后缀名为.f90的文件,其他的不要考进来。2023/11/1279第三章

选择结构程序设计课前思考对于条件语句,fortran中提供了几种形式?每种形式各适用于什么场合?每种形式的注意事项是什么?编写程序时应考虑哪些问题?2023/11/1281第三章选择结构程序设计逻辑if语句块if结构选择结构的嵌套用elseif语句实现多路分支块分支选择结构程序举例关系表达式格式:<算术量><关系运算符><算术量>关系运算符

.GT.(>大于);.LT.(<小于);.EQ.(==等于);

.NE.(/=不等于);.GE.(>=大于或等于);

.LE.(<=小于或等于)结果是逻辑型常数.TRUE.或.FALSE.

注意两边的小数点不能漏实数存在误差,在用.EQ.

与.NE.

时要特别注意一个算术型量的两侧不允许都是关系运算符逻辑表达式格式:<逻辑型量><逻辑运算符><逻辑型量>逻辑运算符

.AND.

与.OR.或.NOT.非

.EQV.等价.NEQV.不等价.XOR.异或结果是逻辑型值.TRUE.或.FALSE.含义运算顺序.NOT.→.AND.→.OR.→.EQV.

.NEQV.

.XOR.逻辑表达式中,各种运算符的优先顺序:注意不同运算符的运算对象和运算结果一个逻辑型量的两侧都可以与逻辑运算符相邻,但不能与算术运算符、关系运算符相邻不能在算术量的两侧都出现关系运算符一定要注意运算顺序逻辑IF语句一般形式:if(逻辑表达式)

内嵌语句执行过程:

1.先算圆括号内判断条件

2.成立,执行内嵌语句,然后执行后面的语句

3.不成立,直接执行后面的语句适用范围:只关心一种条件时,仅执行一个处理的简单情况注意问题:逻辑if语句中的逻辑表达式一定要用一对圆括号括起来;逻辑if语句中的内嵌语句只能是单个的可执行语句,即内嵌语句不能是非执行语句,也不能有多于一个可执行语句;在使用逻辑if语句时,一定要注意逻辑表达式的正确写法,特别是在使用多个逻辑if语句时更要注意。例3.1输入三个数,求出最大和最小的值。

realx,y,z,max,min read*,x,y,z max=xmin=x if(max<y)max=y if(max<z)max=z print*,"三个数中最大数是",max if(min>y)min=y if(min>z)min=z print*,“三个数中最小数是",min end块IF结构逻辑if语句的局限性只允许有一个语句,多个语句无法实现实现多个分支时,如用多个逻辑if语句实现,则每一个逻辑if语句中的逻辑表达式比较复杂块if结构的一般形式If(逻辑表达式)thenS1elseS2endif逻辑表达式必须用一对圆括号括起来S1、S2可由若干个可执行语句组成,但一行上只能写一个语句,语句太长时可以使用继续行else语句必须单独占一行endif语句必须单独占一行,表示块if结构结束if语句与endif语句是必须的,而then、else语句可根据实际情况省略注意问题块if语句至少应有一个end

if语句与它相对应;而逻辑if语句不用块if结构中有then;而逻辑if语句中无块if语句中的then后面有多句;逻辑if语句有一句逻辑if可用块if实现;反之,不一定。例题3.2逻辑if与块if区别选择结构的嵌套一般形式注意每层必以if开始,以end

if结束。采用缩进规则每层不允许出现交叉可从内层转到外层。反之不行;then块与else块也不能互转例题3.3N-S流程图用ELSEIF语句实现多路分支一般形式注意的问题:用ELSEIF语句实现多路分支例题3.4例题3.5使用ELSEIF语句时应注意的问题elseif语句相当于将else语句与下一行的块if语句连接成一个语句用块if实现多路分支,每一块if必有一endif与之对应。但elseif语句不需endif与之对应块if结构中,可有多个else

if,但只能有一个else语句,且与最后一个else

if语句相配对块if结构中,也可只有else

if,而没有else特别强调,条件必须写对,否则会出现逻辑错误块SELECT CASE选择结构

问题:用elseif语句实现多路分支,书写是否方便?是否容易阅读?解决办法:块select case选择结构

一般格式selectcase(表达式)

case(表达式1)块1case(表达式2)块2……case(表达式n)块ncasedefault

默认块endselect执行过程(1)selectcase后括号里的“表达式”,用来表示待选择的内容,如成绩、工资、年龄等,一般为变量名,可是整型、逻辑型、单个字符型变量或者相应的表达式(2)后面各case分支中,case后面括号里的表达式相当于前面selectcase括号里表达式的具体取值,取值不同,动作不同(3)casedefault是缺省情况,可有可无(4)endselect为case结构结束标志说明

例3.4、设计程序,完成小学加、减、乘、除四则运算,即输入两个数,再输入一个运算符号,做对应的运算,并显示相应的结果。

reala,b characterop!定义一个字符变量

read*,a,b,opselectcase(op) case('+') print*,'两个数之和为:',a+b case('-') if(a<b)then print*,'被减数不能小于减数' else print*,'两个数之差为:',a-b endifcase('*') print*,'两个数之积为',a*bcase('/') if(b==0)then print*,'除数不能为0' else print*,'两个数之商为',a/b endifcasedefault print*,"输入错误,请重新输入"endselectendcase后括号内表达式的值可用以下方式确定:(1)用逗号隔开的单个值,如:case(1,3,5,7)(2)用冒号分隔的值的范围。一般形式为case(a:b),其中,a为下界,b为上界,下界或上界也可缺省,如:case(2:8)、case(:10)、case(’i’:’n’)、case(15:)(3)1和2的混合,如:case(2:4,6,8:)

说明例3.5编写程序,输入年月,输出该月所对应的天数

分析4、6、9、11为30天,其他为31天2月:一般28天,闰年29天闰年:年能被4整除,但不能被100整除;或年能被400整除都为闰年 integeryear,month,day read*,year,month selectcase(month) case(1,3,5,7,8,10,12) day=31 case(4,6,9,11) day=30 case(2) if((mod(year,4).eq.0.and.mod(year,100).ne.0) $.or.mod(year,400).eq.0)then day=29 else day=28 endif casedefault print*,"月份输入错误" endselect print*,year,"年",month,"月所对应的天数为:",dayend算术IF语句(简单了解)

格式:if(算术表达式)标号1,标号2,标号3执行过程计算算术表达式的值值小于0,执行标号1对应的语句等于0,执行标号2对应的语句大于0,执行标号3对应的语句

例3.6输入x,求函数的值。已知函数如下:此问题可以用算术if语句实现。程序如下:

realx read*,x if(x)10,20,3010 y=x*x+1 goto10020 y=sin(x+1) goto100 30 y=sqrt(x+2) goto100100continueprint*,"y=",yend

从上可看出,和goto结合使用,使程序结构不太清晰,不宜多用。

程序举例例题3.7由键盘输入三个整数A、B、C,然后按从小到大的顺序输出。流程图:例3.8输入一个三位自然数,判断它是否为水仙花数。即:各位数字的立方和等于该数本身的数。如153=13+53+33integern,g,s,b,sread*,ng=mod(n,10) !求n的个位s=mod(n/10,10)!求n的十位b=mod(n/100,10)!求n的百位s=g**3+s*3+b**3If(s==n)thenprint*,n,"是水仙花数"elseprint*,"不是水仙花数"endifend可看运行结果153;243例3.9将学生成绩分为优(90~100分)、良(80~89)、中(70~79)、及格(60~69)、不及格五个档次,输入成绩,输出对应的档次。思考:用什么语句实现? integerg read*,g selectcase(g) case(0:59) print*,"不及格" case(60:69) print*,"及格" case(70:79) print*,"中" case(80:89)print*,"良" case(90:100) print*,"优" casedefault print*,"成绩输入错误,请重新输入!" endselect end作业P445、7、9要求:1、作业本上画流程图2、程序输入计算机,下次上机使用3、上机要求与上次一致预习如何构造循环结构?有哪些基本的循环语句?适用场合?2023/11/12110第四章

循环结构程序设计课前思考现实生活中,如果一件事情重复去做,你会有什么感受?对于循环结构,fortran中提供了几种形式?每种形式各适用于什么场合?每种形式的注意事项是什么?怎样选择循环的形式?编写程序时应考虑哪些问题?2023/11/12112第四章循环结构程序设计DO循环DO循环的一般形式与执行过程DO循环中循环次数的计算DOwhile循环DOwhile循环的一般形式DOWHILE循环的执行过程循环的嵌套DO循环的一般形式与执行过程DO循环的一般形式

DOi=e1,e2[,e3](循环体)

ENDDO计算e1、e2、e3的值e1→i计算循环次数rr=0?执行循环体i+e3→ir-1→rENDDO下面的语句YN如何计算循环次数?DO循环的循环次数计算公式:CONT=INT((e2-e1+e3)/e3)

DO循环的循环次数的计算:循环控制变量可为整型、实型先将e1,e2,e3转换成与循环控制变量类型一致,再计算循环次数当计算循环次数为负数时,则循环次数为0FORTRAN对DO循环结构的一些规定:e1、e2与e3在循环体内可以被引用,但不能被赋值在DO循环结构中,可从循环体内转到外,但不允许从外转到内例4.1求累加项f的递推式为:fi=fi-1*x/i可用赋值语句f=f*x/i来实现read*,x,nf=1.0y=1.0doi=1,nf=f*x/iy=y+fenddoprint*,’y=’,yend思考(举一反三)类似这样的连加或连乘的式子如何处理?例4.2一个整数的因子(不包括该数本身)之和等于它本身,则称该数为完数。例如6的因子有1,2,3,1+2+3=6,6是完数。输入一整数,判断它是否完数

integerm,sum,iread*,msum=0doi=1,m/2!该循环求因子之和

if(mod(m,i)==0)sum=sum+ienddoif(m==sum)thenprint*,m,'是完数'elseprint*,m,'不是完数'endifend

例4.3Fibonacci数列定义如下:

F1=1

F2=1

Fn=Fn-1+Fn-2(n>2)

求Fibonacci数列的前30项。

设待求项为F,待求项前面的第1项为F1,待求项前面的第2项为F2。首先根据F1和F2推出F,再将F1作为F2,F作为f1,为求下一项作准备。如此一直递推下去。具体过程如下:

11235

第一次F2+F1→F↓↓

第二次F2+F1→F↓↓

第三次F2+F1→F与循环有关的控制语句1、EXIT语句迫使循环立即终止。通常与IF语句配合使用:IF(e)EXIT例4.6求两个整数a与b的最大公约数和最小公倍数分析算法:找出a与b中较小的一个,则最大公约数必在1与最小整数的范围内使用DO语句,循环变量i从较小整数变化到1一旦循环控制变量i同时整除a与b,则i就是最大公约数,然后使用EXIT语句强制退出循环求出最大公约数后,直接应用最小公倍数和最大公约数之间的关系求出最小公倍数。integera,b,gcd,lcm,t print*,'请输入两个自然数' read*,a,b if(a>b)then

t=a;a=b;b=t

endif dot=a,1,-1 if(mod(a,t)==0.and.mod(b,t)==0)then

print*,'gcd=',t

exit endif enddo

print*,'lcm=',a*b/t

end思考加入exit后的循环结构,对结构化有什么影响?如何将这样的程序改为结构化的程序?2.CYCLE语句(1)用来结束本次循环,即跳过循环体中尚未执行的语句

(2)使控制直接转向循环条件测试部分,从而决定是否继续执行循环

(3)CYCLE和EXIT的区别

CYCLE只结束本次循环,而不是终止整个循环的执行

EXIT语句则是结束所在循环,跳出所在循环体。例4.7求1~100之间的全部奇数之和。

integer::x=0,y=0

dox=1,100,1 if(mod(x,2)==0)then cycle endify=y+x

enddo print*,y end思考加入cycle后的循环结构,对结构化有什么影响?当型循环当型循环结构的流程图一般形式

DOWHILE

(逻辑表达式)

循环体

ENDDO例题4.8计算并输入下列级数和DOWHILE循环的执行过程执行循环体ENDDO下面的语句满足循环条件?例4.8输入一个整数,输出其位数

输入整数n,位数kinteger::n,k=1read*,nn=abs(n/10)dowhile(n>0)k=k+1n=n/10enddoprint*,'k=',kend循环的嵌套循环的嵌套是指在一个循环体内又完整地包含了另一个循环结构,又称“多重循环”例题计算并输出10以内(包括10)所有自然数的阶乘值,即计算1!,2!,3!,4!,5!,6!,7!,8!,9!,10!FORTRAN对循环嵌套的规定循环控制变量不允许同名不允许循环的交叉,会造成语法上的错误循环结构及块IF结构的嵌套,要遵循“完全包含”的原则允许从内层将控制转到外层,但不允许从外层转到内层。例4.12求[100,1000]以内的全部素数(1)判素数

(2)用穷举法将判某个范围内所有数是否素数

logicalflagdom=101,1000,2flag=.true.i=2j=sqrt(real(m))dowhile(i<=j.and.flag)if(mod(m,i)==0)flag=.false.i=i+1enddoif(flag)thenprint*,m,’isaprimenumber’endifenddoend几种循环组织方式的比较问题:如何选择所需要的循环语句?do?dowhile?事先能确定循环次数

do或dowhile事先不能确定循环次数

dowhile很多情况下它们是可以相互代替

具体情况视个人喜好作业P652、5、9要求:1、作业本上画流程图2、程序输入计算机,下次上机使用3、上机要求与上次一致2023/11/12135第四章

循环结构程序设计

(深入讨论与训练)上次课提出的问题现实生活中,如果一件事情重复去做,你会有什么感受?对于循环结构,fortran中提供了几种形式?每种形式各适用于什么场合?每种形式的注意事项是什么?怎样选择循环的形式?编写程序时应考虑哪些问题?2023/11/12137结构化程序设计巩固训练判断循环次数训练程序逻辑一致性训练程序填空训练程序改错训练编程训练判断循环次数训练循环语句dox=2.5,-1.5,-0.5所确定的循环次数为循环语句doi=4,2,2所确定的循环次数为

循环体执行的总次数为dot=1.5,10.5,1.5doi=1,10<循环体>enddoenddo循环体执行的总次数为doj=1,10doi=j,10<循环体>enddoenddo循环体执行的总次数为doj=1,5,2doi=10,3<循环体>enddoenddo0970550程序逻辑一致性训练请在下面程序的空白添入合适内容,使与上述程序等价read

(*,*)

ns=0.0[

(10)

]k=110s=s+d[

(11)

]d=1.0/(k*(k+1))if

(k.le.n

)

goto

10write

(*,*)

‘s=’,send

d

=0.5

k=k+1阅读程序read

(*,*)

ns=0.0do

k=1,ns=s+1.0/(k*(k+1))enddowrite(*,*)

‘s=’,send

程序填空训练1dowhile(k.ne.0)

(1)

(2)

(3)

enddogcd=llcm=

(4)

write(*,*)’n1,n2=’,n1,n2write(*,*)’gcd=’,gcdwrite(*,*)’lcm=’,lcmend

k=mod(m,l)m=linteger

gcd,lcminteger

n1,n2,mwrite(*,*)’n1,n2=’read(*,*)n1,n2if(n1.ge.n2)

then

m=n1l=n2elsem=n2l=n1endifk=mod(m,l)l=kn1*n2/l求两个数n1,n2的最大公约数gcd,和最小公倍数lcm参照P2-3的算法程序填空训练2ave=(5)write(*,*)‘ave=‘,avewrite(*,*)‘amax=‘,amaxwrite(*,*)‘amin=‘,aminend

x>=0.00n=(1)sum=(2)read*,,xamax=xamin=xdowhile((3))n=n+1sum=sum+xif(x>amax)amax=x

if((4))amin=xread*,xenddo0.0x<amin从键盘输入一个班的学生成绩,计算平均成绩,班上的最高与最低成绩,以输入负数结束输入.sum/n程序改错训练logicalpread(*,*)np=.true.k=2dowhile(k<=n/2)if(n/k==0)thenwrite(*,*)kp=.false.endifk=k+1enddoif(.not.p)write(*,*)nendif(mod(n,k)==0)then输入一个正数,若该数是素数,则输出素数,否则,输出该数的所有因子.注意:书上p143有错(答案k==0?!)一般改错题有1—2处错误编程训练1请编写一程序,功能:判断整数x是否是同构数所谓“同构数”是指这样的数,它出现在它的平方数的右边例如:输入整数5,5的平方数是25,5是25中右侧的数,所以5是同构数x的值从健盘读入,要求不大于100。要求:画出此程序的流程图(形式不限)用fortran语言,编写此程序编程训练2牛顿法解方程。课本P59(重要的实际应用)

要求:画出此程序的流程图(形式不限)用fortran语言,编写此程序编程训练3打印1到1000之内能被7或11整除、但不能同时被7和11整除的所有整数,并统计这样的数的个数要求:画出此程序的流程图(形式不限)用fortran语言,编写此程序编程训练4辛普森法求定积分。课本P60(重要的实际应用)要求:画出此程序的流程图(形式不限)用fortran语言,编写此程序作业P6611、12要求:1、作业本上画流程图2、程序输入计算机,下次上机使用3、上机要求与上次一致第五章

FORTRAN90数据类型第五章FORTRAN90数据类型数据常量变量表达式函数整型实型

表现形式

数据类型数值非数值构造类型双精度型常量复型常量逻辑型常量字符型常量5.1数据类型的概念

一种数据类型(1)类型的名称(2)允许值的集合(3)允许值(常量)的表示方法(4)操作这些值的运算的集合5.2整型数据

在FORTRAN语言中,整型值的集合是数学上整数的一个子集。每种方法用类别类型参数来区分。整型常量的表示形式为一个数字串,并在数字串后有一个可任选的下划线后再跟类别类型参数。例如,373、-1024、35792、0、32_2、1992110235764803_8整型数据类型的字节数和取值范围在FORTRAN90中,还可以使用二进制、八进制和十六进制整型常量,但它只能用于DATA语句中。二进制:以字母B开头,后跟用一对撇号或双引号括起来的数字串,0--1。例如B'10101101'、B"1011101"八进制:以字母O开头,后跟用一对撇号或双引号括起来的数字串,0--7。例如,O'453'、O"376"。十六进制:以字母Z开头,后跟用一对撇号或双引号括起来的数字串,0--9或A--F。例如,Z‘FFA9’、Z“9B45”。INTEGERi,j,kDATAi/B'110010'/DATAj/O'62'/DATAk/Z'32'/

整型变量的说明格式:integer[([kind=]类别参数值)][[,属性列表]::]变量列表1,2,4例:integeri,totalinteger(2)::k,limitinteger(kind=4)::min,maxinteger*2::k,limitinteger*4::min,max变量的属性

属性是被说明对象的所属性质。一个对象被说明具有某一属性时,就使该对象具有某种附加功能、特殊的使用方式与适用范围。属性的种类有很多,这里介绍两种最常见属性的说明格式。integer,parameter::i=5,j=24interger,dimension(1:10)::a例5.1求Fibonacci数列前30项之和。

Fibonacci数列的递推公式是:

F0=0

F1=1

Fi=Fi-1+Fi-2

问题:选用那种类型合适?

Fibonacci数列前30项之和是一个很大的数,已经超过了类别参数为2的整数的取值范围,只能采用类别参数为4整数。如果数超过类别参数为4的整数取值范围,就只能采用实型数据来处理。

5.3实型数据FORTRAN用类别类型参数区分不同类型的实型数据。实型数据有单精度和双精度之分。单精度类别类型参数值为4,双精度数类别类型参数值为8。一般形式为:有效数E指数[_类别参数]

有效数D指数实型变量的说明real[([kind=]类别参数值)][[,属性列表]::]变量列表单精度用real(4)定义,双精度用real(8)或doubleprecision定义。缺省为4。real::m12,area,lenreal(4)::dx,dyreal*4::dx,dyreal(8)::d_pre,xreal*8::d_pre,xdoubleprecision::d_pre,x1,2,4例5.2利用双精度按下面近似公式求直到最后一项的绝对值小于10-15为止。分析:首先找出累加项fn与fn-1的递推关系。不难推出其中f0=x5.4.1复型常量将两个实数用逗号分隔,再用括号括起来就构成了一个FORTRAN复型常量。其中:第一个为实部,第二个为虚部。例如(1.25,0.4)、(1E2,-3.4)分别表示复数1.25+0.4i和100.0-3.4i,(1.0_4,4.2)。复型数据的类别类型参数是用于说明实部和虚部这两个实型数据的类别类型。5.4复型数据5.4.2复型变量complex[([kind=]类别值)][[,属性列表]::]变量列表

complexz1,z2

complex(4)::com_val

complex(8)::cz,cq

cz=(3.0,6.3)

cq=(8.76e+5,-67.8e-3)若实部、虚部是表达式,则应用cmplx函数将实部和虚部组成复型数据再赋给复型变量。例如c=cmplx(3.0*a,6.0+b)例5.5有一线段AB,A的坐标为(1,1),B的坐标为(4.5,4.5),如图5.2所示。求AB的长度,以及黄金分隔点C的坐标。黄金分割点在线段的0.618处。分析:

A,B的坐标可用复数表示:即A为(1.0,1.0),B为(4.5,4.5)。

AB的长度就是(A-B)的模,从图中可以明显地看到,AB的长度,可用ABS函数直接求出复数的模。黄金分隔点C的坐标为:A+0.618×(B-A)。

programcomp_3implicitnonecomplex::a,b,creal::lread*,a,bc=a+0.618*(b-a)l=abs(a-b)print*,'l=',lprint*,'c=',cendprogramcomp_3

注意:读入复型数据时,以2个实数作为一个复型数据,一为实部,二为虚部,用括号括起来。程序的输入可以如下:(1.0,1.0),(4.5,4.5)5.5字符型数据5.5.1字符型常量

字符型常量又叫字符串常量,它是用单撇号或双撇号括起来的字符序列。例如,″ABCD″、'CHINA'、'12345678'字符可是允许使用的任何字符。区分大小写。单撇号和双撇号只起定界作用,不属字符串。问题:串中含有单撇号或双引号如何处理两种方式表示:

″I'MASTUDENT″'I''MASTUDENT'前者用双撇号作定界符后者用单撇号作定界符,而将字符串的单撇号用两个单撇号表示,系统会自动将其处理为字符串的一个单撇号字符。同样,要表示双撇号如何?串内字符的个数称为字符串的长度。字符串’’和””的长度为0。在字符串内部的空格是有效字符,并占有一个字符的位置。例如,'ABC'和'A

B

C'是两个不同的字符串。前者长度为3,后者为5。一个字符常数需要写成多行源程序时,有一条特殊的规则:1、每一续行都不能尾随注释。2、每一续行必须以续行标识符(&)作为开头,任何尾随&号之后或者前导&号之前的空格都不是字符常数的组成部分,&号本身不是常数的组成部分。其它的字符包括空格都是字符常数的有效组成部分。5.5.2字符型变量character(len=n1[,kind=n2])[[,属性说明]::]变量列表

格式中的n1和n2是一个整数和整型表达式n1代表长度,n2代表类别参数,各项属性说明是字符型变量有关属性的说明。例如character(len=25,kind=2)::a,b,ccharacter(kind=3,len=15)::var,chcharacter(len=8),dimension(1:10)::x,y,zcharacter(len=10),parameter::name='fortran_90'character(len=15)::acharacter*15::acharacter(len=15)::a,b*8,c*5在以下两种状态下均可以采用星号来说明长度:(1)具有parameter属性的字符常量。例如以下两个语句:character(len=*),parameter::para='fortran_90'character*(*),parameter::para='fortran_90'给出的字符串长度是确定的,因此字符符号常数para的长度是可知的(等于10),可用*说明。(2)用字符变量作虚元时子程序中,用字符型变量作虚元时可以不指明其具体长度,即用*定义长度。这时它可以与任意长度的字符型实元相结合,有利于提高子程序的通用性。5.5.3子字符串字符变量名(m:n)

其中:

m和n是整数和整型表达式,表示子串在串中的起止位置,该子串长度为n-m+1(n≥m≥1)。例如:character(len=80)::row

row(4:7)表示row字符串中从第4个字符到第7个字符组成的一个子串,其长度为4;row(i:i)表示该字符型变量的第i个字符。5.5.4字符表达式与字符赋值语句字符表达式是指用字符运算符把字符常数、字符变量等字符型数据连接起来的有意义的式子。字符运算符只有一个″//″作用是将两个字符型数据连接起来,成为一个字符型数据。该运算符是一个双目运算符。例如,'he'//'llo!'

'hello!','fortran'//''//'90'

'fortran

90'。programchar_1implicitnonecharacter(len=5)::a,b,ccharacter(len=11)::da='china'b='japan'c=ad=a//''//bprint*,a,b,c,d

endprogramchar_15.5.5字符关系表达式字符比较的规则是:按ASCII码的值(见附录)进行比较。常用的字符顺序为:

″空格″<0<…<9<A<…<Z<a<…<z在进行关系运算时,遵循以下规律:(1)单个字符,以代码值决定大小。

'A'>'B'的值为假

'8'>'2'的值为真(2)两串比较时,自左向右逐个进行比较。所有字符完全相同,则两

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论