版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
FORTRAN90数据类型
整型数据
实型数据
复型数据
字符型数据
逻辑型数据一、整型数据
整型变量的说明:INTEGER[(类别参数值)][[,属性列表]::]变量列表其中类别参数值取1,2,4,变量的属性是指被说明对象的所属性质。一个对象被说明具有某一属性时,就使该对象具有某种附加功能、特殊的使用方式与适用范围。属性的种类有很多,这里介绍两种最常见属性的说明格式:INTEGER,PARAMETER::I=5,J=24INTERGER,DIMENSION(1:10)::A例求Fibonacci数列前30项之和。
分析:本例中,Fibonacci数列前30项之和是一个很大的数,已经超过了类别参数为2的整数的取值范围,只能采用类别参数为4整数。如果数超过类别参数为4的整数取值范围,就只能采用实型数据来处理。二、实型数据
实型变量的说明:REAL[([KIND=]类别参数值)][[,属性列表]::]变量列表单精度用REAL(4)定义,双精度用REAL(8)或DOUBLEPRECISION定义。缺省的类别值为4,即为单精度。例利用双精度求:
直到最后一项的绝对值小于10-15为止。三、复型数据
将两个实数用逗号分隔,再用括号括起来就构成了一个FORTRAN复型常量。其中第一个实数称为复数的实部,第二个实数称为复数的虚部。复型变量的说明:COMPLEX[(类别值)][[,属性列表]::]变量列表如果实部和虚部都不是常数,而是表达式,则应该用CMPLX函数将实部和虚部组成复型数据再赋给复型变量。例如C=CMPLX(3.0*A,6.0+B)例有一线段AB,A的坐标为(1,1),B的坐标为(4.5,4.5),求AB的长度以及黄金分隔点C的坐标。黄金分割点在线段的0.618处。分析:A,B的坐标可用复数表示:即A为(1.0,1.0),B为(4.5,4.5)。AB的长度就是(A-B)的模。可用ABS函数直接求出复数的模。黄金分隔点C的坐标为A+0.618×(B-A)。四、字符型数据
1.字符型常量字符型常量又叫字符串常量,它是用单撇号或双撇号括起来的字符序列。例如,″ABCD″、′CHINA′、′12345678′等都是FORTRAN字符型常量。当字符串中又含有单撇号时,例如要将I′MASTUDENT作为一个字符串来处理,为了区分′是字符串中的字符还是定界符,可采用两种方式表示:″I′MASTUDENT″′I′′MASTUDENT′前者用双撇号作定界符,后者用单撇号作定界符,而将字符串的单撇号用两个单撇号表示,系统会自动将其处理为字符串的一个单撇号字符。2.字符型变量CHARACTER(LEN=n1[,KIND=n2])[[,属性说明]::]变量列表格式中的n1和n2是一个整数和整型表达式,n1代表被说明变量的长度,n2代表字符变量的类别参数,各项属性说明是字符型变量有关属性的说明。例如CHARACTER(LEN=25,KIND=2)::A,B,CCHARACTER(LEN=8),DIMENSION(1:10)::X,Y,ZCHARACTER(10),PARAMETER::NAME=′FORTRAN_90′CHARACTER(15)::ACHARACTER*15::ACHARACTER(15)::A,B*8,C*5,D,E3.子字符串字符变量名(m:n)其中,m和n是整数和整型表达式,表示子字符串在字符串中的起止位置,该子字符串的长度为n-m+1(n≥m≥1)。
4.字符表达式字符运算符只有一个,就是字符连接符″//″,它是由两个斜杠组合而成的,其作用是将两个字符型数据连接起来,成为一个字符型数据。5.字符关系表达式两个字符串比较时,将两个字符串中的字符自左向右这个进行比较。若所有字符完全相同,则两表达式相等。否则,以第一次出现不同字符的比较结果为准。6.用于字符处理的内部函数•
求字符串长度函数(LEN和LEN_TRIM)•
子串位置函数(INDEX)•
字符与字符序号相互转化函数
7.字符处理应用举例例1在读入的一批单词中,把以字母′B′开头的打印出来,直到输入′ZZZ′结束。例2翻译密码:为了保密,常不采用明码电文,而用密码电文,按事先约定的规律将一个字符转换为另一个字符。收报人则按相反的规律转换得到原来的字符。例如,将字母′A′→′F′,′B′→′G′,′C′→′H′,即将一个字母变成其后第五个字母。五、逻辑型数据
逻辑常量只有真和假两种值:.TRUE.和.FALSE.。变量说明的格式为:LOGICAL[(类别值)][[,属性列表]::]变量列表例当某点的X,Y坐标落在四个方块内和方块边上时,Z=0,如在方块外,Z=3。实验六FORTRAN数据类型
格式输入输出
输入输出概述
格式输入输出语句
格式说明语句
常用的编辑描述符
输入输出项与编辑符的相互作用
一、输入输出概述
输入输出是指在计算机内存与外部设备之间传送数据的过程。从外部设备将数据传送到计算机内存称为输入。将计算机内部的数据传送到外部设备称为输出。要顺利地传送数据,一般应在输入输出语句中给计算机提供三方面的信息:
(1)通过什么设备来进行输入输出。
(2)采用什么样的格式来进行输入输出。
(3)输入输出的具体内容。二、格式输入输出语句
1.格式输出v
PRINTf,输出项其中f是格式说明符,指明了输出所用的格式。它有以下三种形式:
(1)格式说明符是一个“*”,表示输出使用表控格式。(2)格式说明符是一个字符常量。例如
PRINT'(1X,2F7.3)',X,Y(3)格式说明符是格式语句(FORMAT)的语句标号。例如PRINT100,A,B,C100FORMAT(1X,F9.4,2F7.3)v
WRITE(u,f)输出项其中u是设备号,用于指明具体使用的输出设备。u可以是一个无符号整数,还可以是星号*。*表示系统预先约定的外部设备,一般为显示器。2.格式输入格式输入语句是指READ语句,它有两种形式:READf,输入项READ(u,f)输入项其中f指明了输入所用的格式。它有以下三种形式:
(1)格式说明符是一个“*”,表示输入使用表控格式。(2)格式说明符是一个字符常量。例如READ(*,'(I3,2I4)')I,J,K(3)格式说明符是格式语句(FORMAT)的语句标号。这是最常用的格式输入形式。
u是设备号,用于指明具体使用的输入设备。u可以是一个无符号整数,还可以是星号“*”。“*”表示由计算机系统预先约定的外部设备,一般为键盘。三、格式说明语句
格式说明语句的一般格式是:
nFORMAT(格式说明)其中n是语句标号,FORMAT语句一定带有语句标号,以便同格式输入输出语句配合使用。四、常用的编辑描述符
1.可重复编辑描述符
整型数据编辑描述符实型数据编辑描述符复型数据编辑描述符逻辑型数据编辑描述符字符型数据编辑描述符2.非重复编辑描述符3.纵向走纸控制符
整型数据编辑描述符:I编辑符、B编辑符、O编辑符和Z编辑符。
I编辑符用于十进制整数的输入输出。它的一般格式是:
rIw其中r是重复系数,为1时可以省略。w表示字段宽度,即与该编辑描述符对应的输入输出项所占用的字符个数。(1)I型输入的使用规则:在输入记录中从左往右取w个字符存入对应的输入项。(2)I型输出的使用规则:在输出记录中,对应的输出项的值占w个字符宽度。实型数据编辑描述符:F编辑符、E编辑符、EN编辑符、ES编辑符和G编辑符。
F编辑符用于实型量的输入输出(按小数形式)。它的一般格式是:rFw.d其中r为重复系数,为1时可以省略。w为字段宽度,d为输入输出项小数部分所占的位数。(1)F型输入规则:按编辑描述符中w指定的字段宽度从输入记录中截取数据,若w个字符中不含小数点,则系统自动按d决定小数点的位置,若w个字符中含有小数点,则按“自带小数点优先”的原则。(2)F型输出规则:把输出项的值转换成字段宽度为w的小数形式输出,其中小数部分占d位,小数点占一位。复型数据编辑描述符复型数据没有专门的编辑符。对复型数据的输入输出,可以按实部和虚部分别输入输出。逻辑型数据编辑描述符逻辑型数据的输入输出用L编辑符。其一般格式是:rLw
逻辑值只有两个:真(.TRUE.)和假(.FALSE.)。(1)输入时,输入的数据可以是头一个字母为T或F的任何字符串。(2)输出时,对逻辑真(.TRUE.),输出一个字母T,对逻辑假(.FALSE.),输出字母F,且在左边补w-1个空格。字符型数据编辑描述符字符型数据的输入输出用A编辑符。其一般格式是:
rAw其中字段宽度w可以省略,省略时,输入输出项的字段宽度隐含为对应的字符型输入输出项的长度l。
(1)A编辑符的输入规则:当w>l时,从w个字符中取出最右边l个字符送给对应的输入项。当w<l时,当w个字符全部送入输入项,并靠左对齐,右边补l-w个空格。这一点同字符赋值语句的规则是相同的。(2)A编辑符的输出规则:在输出记录中,Aw编辑符所对应的输出项一定占w个字符的宽度,但输出项实际包含字符的个数l可能与w不一致。当w=l时,输出项所有的字符全部输出。当w>l时,输出项所有的字符全部输出,并且靠右对齐,左补w-l个空格。当w<l时,输出项最左边w个字符输出。当w省略时,按输出项的长度输出,这是最方便的形式。2.非重复编辑描述符
(1)X编辑符。用于在输入输出的常数之间插入空格。它的一般格式是:
nX其中n是正数,用于指明从当前位置向右跳过n个字符位置。这里n不能省略,即使n为1,也要写成1X。(2)H编辑符。用于输出一个字符串。其一般格式是:
nHh1h2…hn其中n是正整数,表示字符串的长度,h1h2…hn为n个字符。(3)撇号编辑符。用于输出一个字符串。撇号编辑符和H编辑符作用相同,但撇号编辑符使用更为方便。(4)斜扛编辑符:结束当前正在输入或输出的记录,并转入下一个记录开始输入输出。3.纵向走纸控制符FORTRAN规定,将输出记录中的第一个字符作为纵向走纸控制符,这个字符不输出,而从输出纪录的第二个字符开始输出。常用的控制字符有:空格(走纸一行)、0(走纸二行)、1(换页)、+(不走纸,返回到本行重迭打印)。五、输入输出项与编辑符的相互作用
(1)如果可重复编辑符的个数多于输入输出项的个数,则多余的编辑符不起作用。(2)如果可重复编辑符的个数少于输入输出项的个数,则按顺序用完最后一个可重复编辑符之后,再重复使用格式说明,但产生一个新记录。(3)如果在编辑描述符表中包含有重复使用的编辑符组,则当所有编辑符用完之后,返回到最右边那个编辑符组(包括其重复系数)开始使用。分析下列程序的输出结果。
I=56J=1247K=5126WRITE(*,10)I,J,K10FORMAT(1X,2(I5,2X)/)END
输出结果为:
□□□56□□□1247(空一行)5126总结
FORTRAN90提供的编辑描述符很多,这给初学者学习带来了困难,但一些编辑描述符也有共同特点,把握这些特点以后也就不难掌握了。可重复编辑描述符是用来决定对应输入输出项的输入输出格式的,其中都有字段宽度w,而且对于输入都是从输入记录中取w个字符,对于输出都是在输出记录中输出w个字符。但问题是,在输入时,取得的w个字符按什么规则加工后传送到对应的输入项。在输出时,当输出项实际包括的字符的个数和编辑符中所确定的字段宽度(对于数值型数据还有小数位数)之间不相符时,如何输出?读者可以分数值型、逻辑型、字符型进行总结。实验七格式输入输出
数组
数组的概念
数组的说明与引用
数组元素的存储结构
数组的输入输出
给数组赋初值
数组的应用一、数组的概念思考一:•
计算一个班学生的平均成绩。•
计算一个班学生的平均成绩以及每个成绩与平均成绩的差。思考二:•
求100个学生成绩中的最高分。将100个学生的成绩按从高到低的顺序排列。把具有相同类型的一批数据看成是一个整体,叫做数组。给数组取一个名字叫数组名。数组中的每一个数据称为数组元素,它可通过顺序号(下标)来区分。例如,一个班60名学生的成绩组成一个数组G,又如某厂5个车间全年各季度的产量组成数组P。在这里,区分G数组的元素需要一个顺序号,故称为一维数组,而区分P数组的元素需要两个顺序号,故称为二维数组。二、数组的说明与引用1.数组说明的内容程序中要使用任何一个数组都必须给予说明,即说明该数组的名字、类型、维数及大小。数组说明要用到数组说明符。它的一般形式是:数组名(维说明符[,维说明符]…)
维说明符的一般形式是:
[维下界:]维上界2.数组说明(1)用DIMENSION语句说明数组
DIMENSION数组说明符[,数组说明符]…例如DIMENSIONJU(20),NAME(-10:10,1:2)REALJUCHARACTERNAME(2)用类型说明语句说明数组类型符数组说明符[,数组说明符]…例如
CHARACTER*6CH(-10:10,5:9)*8REALKK(8)REAL(8)SOLUTION(30)(3)同时使用DIMENSION语句和类型说明语句说明数组一般格式为:类型符,DIMENSION(维说明符[,维说明符]…)::数组名[,数组名]…例如
REAL(8),DIMENSION(0:10)::A,B,CINTEGER,DIMENSION(4,5)::D,E
在说明数组时,也可以在数组名后面给出维说明,这时以该数组名后面的维说明为准。例如
REAL,DIMENSION(0:10)::A,B(20),C(4,5,3)说明A为A(0:10),而B,C分别为B(2)和C(4,5,3)3.数组元素的引用一般形式是:数组名(下标表达式[,下标表达式]…)思考:有下列程序片段:
REALLK(5,5)
…
LK(5,5)=12.5…两个语句中都有L(5,5),它门的含义有何不同?对数组进行整体操作INTEGER,DIMENSION(4,5)::A A=100 A(:,1:5:2)=470说明了4×5整型数组A,先将A的全部元素赋为100,再将A第1,3,5列元素赋为470。三元表达式一般形式:初值:终值:步长三、数组元素的存储结构FORTRAN90规定,数组元素在内存中是按列的顺序连续存放的。就二维数组而言,存放时先存入第一列元素,然后第二列,…,直到全部元素存完为止。对于多维数组,首先改变第一个下标,其次改变第二个下标,直至最后一个。分析下列数组的存储结构:
INTEGERA(50),B(3,4)REALC(3,2,3)四、数组的输入输出1.使用DO循环输入输出数组元素例如,利用二重循环实现二维数组的输入输出。2.以数组名作为输入输出项数组名作为输入输出项时,数组元素按照它们在内存中的排列顺序输入输出。这种方式要特别注意数据的组织。3.使用隐DO循环进行数组元素的输入输出隐DO循环的一般形式是:
(输入/输出表,i=e1,e2[,e3])其中i是隐DO循环变量,e1、e2、e3是隐DO循环参数。例如WRITE(*,*)(3,4,I=1,3)等价于WRITE(*,*)3,4,3,4,3,4例分析下列程序段在输出格式上的差异:(1)WRITE(*,*)(A(I),I=2,14,3)(2)DOI=2,14,3WRITE(*,*)A(I)ENDDO五、给数组赋初值1.使用DATA语句赋初值一般格式:DATA项目表/常量表/[[,]项目表/常量表/]…2.使用数组赋值符赋初值一般格式是:数组名=(/取值列表/)实验八数组(一)六、数组的应用1.一维数组的应用例1从键盘输入10个整数存入一个一维数组,然后将数组最大值与第一个元素互换,最小值与最后一个元素互换,其余元素不变。例2输入100个字母,分别统计元音字母A、E、I、O、U出现的次数。例3将N个数排序。2.二维数组的应用例1设有一个4×5的矩阵,求(1)矩阵所有元素之和及平均值。(2)保留所有大于平均值的元素,其余元素清零。例2给定一个5×10矩阵,其元素互不相等,求每行绝对值最大的元素及其所在列号。例3矩阵乘法。已知m×n矩阵A和n×p矩阵B,试求它们乘积:C=A×B。例4求矩阵B50x50的范数。矩阵范数定义为它各行元素绝对值和的最大值,计算公式如下:总结1. 数组的概念、定义、引用。2. 关于数组的常用算法:排序、查询、矩阵乘法等。实验八数组(二)
顺序结构程序设计
FORTRAN常量
FORTRAN变量
FORTRAN内部函数
FORTRAN算术表达式
赋值语句
简单输入输出语句
程序执行控制语句
程序举例一、FORTRAN常量
1.直接常量(1)整型常量(2)实型常量:小数形式和指数形式。分析:1E2,1.0E2,100.0,100的区别。2.符号常量所谓符号常量,是用一个标识符来代表一个常量。符号常量常用PARAMETER语句来定义。二、FORTRAN变量
1.变量的概念变量实质上代表的是一个内存单元。分析下列语句:N=N+12.变量名变量的名字用标识符命名。在FORTRAN语言中,标识符只能由字母、数字和下划线组成,且开头只能是字母。3.变量的说明
(1)类型说明语句格式为:类型说明符变量名1,变量名2,…
类型说明符::变量名1,变量名2,…例如
INTEGERX,YREAL::SCORE,HEIGTH=16.5(2)隐含说明语句IMPLICIT格式为:IMPLICIT类型说明(字母表)例如IMPLICITINTEGER(A,C,T-V)(3)隐含约定I-N规则:FORTRAN语言规定以I,J,K,L,M,N6个字母开头的变量被当作整型变量。三、FORTRAN内部函数内部函数是指系统本身带有的能完成一定功能的程序单位。
(1)FORTRAN内部函数,也称为库函数。在程序中可直接调用这些函数,在完成程序的编译后,通过连接,即将一组二进制指令代入该函数出现的地方,与编译好的目标程序一起形成可执行程序。(2)一个内部函数要求一个或多个自变量。(3)函数的自变量是有类型的,函数的值也是有类型的。三、FORTRAN内部函数
例:(1)求三个数X、Y、Z中的最大值可以表示为:MAX(X,Y,Z)。(2)判断一个数自然数M是否为另外一个自然数N的因子,通过MOD(N,M)是否为0可以判断,如果为0,则说明M是N的因数,否则说明N不能被M整除。四、FORTRAN算术表达式
1.运算符号与其优先级别+、-、*、/、**2.如何书写表达式
(1)表达式中的所有字符都必须写在一行。
(2)表达式中常量的表示、变量的命名以及函数的引用要符合FORTRAN语言的规则。
(3)算术表达式中,乘号不能省略。
(4)两整数相除,结果为整数,不会进行四舍五入,而是把小数后面的部分切掉。分析:3*2/3与2/3*33.算术表达式中类型转化:将低级类型转换成高级类型。
例(SIN(A)+COS(B))/(A*B)EXP(X*Y)*SQRT(X-Y)ABS(A**(-n))+LOG(B)1.0/N思考题
写出FORTRAN表达式(1) (2)(3)将两位自然数的个位与十位互换,得到一个新的数。(4)将实数X四舍五入保留两位小数。
实验一FORTRAN程序设计基础
五、赋值语句
1.赋值语句的格式变量名=表达式
2.执行赋值语句时的类型转换问题(1)左右两边类型相同,运算完毕,直接赋值。(2)左右两边类型不同,右边表达式按原来规则计算,再转换为与左边变量相同的类型,然后将值赋给左边的变量。六、简单输入输出语句
1.表控输入语句READ*,变量表READ(*,*)变量表例:READ*,X,Y,Z系统隐含指定的输入设备表控输入
六、简单输入输出语句2.表控输出语句
PRINT*,输出项表WRITE(*,*)输出列表例:PRINT*,”Y=”,X**2表控格式输出
七、程序执行控制语句
•
STOP语句•
PAUSE语句•
END语句八、程序举例
例1已知
f(x)=x3+sin2x2+ln(x4+1)输入自变量的值,求出对应的函数值。READ*,XF=X**3+SIN(X**2)**2+LOG(X**4+1)PRINT*,"F(X)=",FEND总结
1.编程的思路可以分三步来考虑:一是输入原始数据,二是对原始数据进行处理,三是输出处理结果。一般而言第一步和第三步比较简单,往往需重点考虑第三步。在一开始学习程序设计时,读者就要养成好的习惯。2.注意表达式的书写方法。3.注意以下技巧:·
将实数取整。·
整除的判断。分离整数的各位数字。思考题
已知,其中,求y的值。
实验二顺序结构程序设计
文件
文件的概念文件的打开与关闭文件的读写文件应用举例
一、文件的概念
数据文件是存放在外部介质上数据的集合。数据文件由记录组成。它是数据传递的基本实体,是计算机内存与外部设备传递信息的最小单位。记录分为格式记录和无格式记录。格式记录是一个字符的序列,在计算机内部以ASCII码形式存放,输出时转换成外部形式。无格式记录是由二进制值的序列组成。这些二进制值是FORTRAN数据的内部表示,输入输出时无需作格式转换,其速度较快。根据记录的数据存放形式可分为格式文件和无格式文件。由格式记录组成的文件称为格式文件,由无格式记录组成的文件称为无格式文件。根据文件的存放方式分为顺序文件和直接文件。顺序存取是指将文件的记录按建立的时间先后顺序依次存放在存储介质中。
直接存取,又称随机存取。它是指将文件记录由程序指定的某一位置直接存取。顺序文件的存取操作必须从头到尾顺序进行。直接文件也称为随机文件,文件中的每一个记录都有一个记录号,可以按记录号对指定的记录进行读写。顺序存取的文件中所有的记录长度可以完全不同,而直接存取的文件中的记录的长度由OPEN语句中的说明项“RECL=”指定,每个记录长度相同。例以顺序方式和直接方式将字符型、数值型数据写入文件中。OPEN(10,FILE="A.TXT",FORM="FORMATTED",&ACCESS="SEQUENTIAL")WRITE(10,100)911WRITE(10,200)"WELCOME"OPEN(11,FILE="B.TXT",FORM="FORMATTED",&ACCESS="DIRECT",RECL=10)WRITE(11,100,REC=1)911WRITE(11,200,REC=2)"WELCOME"100FORMAT(1X,I5)200FORMAT(1X,A15)END二、文件的打开与关闭
1.OPEN语句
OPEN语句将设备号与文件名联系起来,并指定文件的各项性质,其一般格式为:OPEN([UNIT=]ie[,FILE=ce][,ACCESS=ce][,FORM=ce][,RECL=ie])UNIT=ie是设备号说明,设备号是一个整型表达式。
FILE=ce是指定文件名。
ACCESS=ce是文件存取方式说明。可用'SEQUENTIAL'或'DIRECT',缺省'SEQUENTIAL'。
FORM=ce是记录格式说明。可用'FORMATTED'或'UNFORMATTED'。对于顺序文件隐含为有格式,对于随机文件,隐含为无格式。RECL=ie说明记录长度,仅用于直接文件。
2.CLOSE语句CLOSE语句解除设备号与文件的连接,即关闭该文件。一般格式是:
CLOSE([UNIT=]ie[,STATUS=ce])其中STATUS=ce说明文件被关闭后的状态:'KEEP'(保留)、"DELETE'(删除),缺省状态为'KEEP'。
三、文件的读写
1.READ语句READ([UNIT=]ie[,FMT=]格式说明[,REC=ie][,END=L][,ERR=L])输入表REC=ie为记录号说明,仅适用于直接存取文件。END=L为文件结束说明,遇到文件结束标志时转向标号为L的语句去执行。WRITE语句中无此项。ERR=L为出错说明,当产生错误时,转向标号为L的语句去执行。
2.WRITE语句的一般形式WRITE([UNIT=]ie[,FMT=]格式说明[,REC=ie][,ERR=L])输出表
3内部文件内部文件用字符串或字符数组作为单元标识,通过内部文件,利用格式输入输出可以实现内存和外部字符表示之间值的相互转换。(1)用READ语句将ASCII码转换成数值型、逻辑型、字符型。例分析下列程序的输出结果。CHARACTERstr(2)*10REALn(2)LOGICALloDATAstr/'1.232','.TRUE.'/READ(str(1),200)n,m !字符型转换成数值型READ(str(2),*)lo !字符型转换成逻辑型200FORMAT(2F3.1,I3)WRITE(*,*)n,m,loEND(2)利用WRITE语句将数值型、逻辑型、字符型转换成ASCII码。例11.13假设磁盘上有70个文件,文件的主文件名首字符都为“F”,后两个字符为文件序号(如F01.DAT),编写程序,实现根据输入的序号打开相应文件。CHARACTERfname*7WRITE(*,*)"请输入两位数的文件序号:"READ(*,*)iWRITE(fname,200)I !合并字符串200FORMAT('F',I2,'.DAT')OPEN(11,FILE=fname)WRITE(11,*)'Fortran90'END四、文件应用举例
例1建立一个有格式顺序存取文件,存放某单位办公用品信息(如表所示)。
其中,品名、数量、单价由用户输入,金额由程序计算得出,然后存放到磁盘文件中,文件名为goods.dat。当输入的品名为“/”时,结束输入。
例2有9个班的学生成绩,在磁盘上建立9个存放学生成绩的直接存取文件,文件名分别为class1.dat、class2.dat、…,class9.dat,文件的记录格式见表2。
选择结构程序设计
关系运算和逻辑运算块IF选择结构块CASE选择结构逻辑IF语句程序举例
一、关系运算和逻辑运算
1.关系运算(1)FORTRAN90共有6个关系运算符:(2)关系表达式表达式1关系运算符 表达式2
例:MOD(I,2)/=1或MOD(I,2).NE.12.逻辑运算(1)FORTRAN所用的基本逻辑运算有:·
逻辑与运算.AND.·
逻辑或运算.OR.·
逻辑非运算.NOT.·
逻辑等于运算.EQV.·
逻辑不等运算.NEQV.·
逻辑异或运算.XOR.(2)逻辑表达式逻辑值1逻辑运算符逻辑值2例:
(a)直角坐标中,第一象限的点
(b)X∈[-3,5](c)a<b<c二、块IF选择结构
IF(逻辑表达式)THEN
块1 ELSE
块2ENDIF例:判断自然数M是否为N的因子,是输出“YES”,不是输出“NO” IF(MOD(N,M)==0)THEN PRINT*,”YES” ELSE PRINT*,”NO” ENDIF3.多分支结构IF(逻辑表达式1)THEN
块1ELSEIF(逻辑表达式2)THEN
块2 …ELSEIF(逻辑表达式n)THEN
块nELSE
块n+1ENDIF例教材PAGE44第9题三、块CASE选择结构
块CASE选择结构一般格式为:SELECTCASE(表达式)CASE(表达式1)
块1CASE(表达式2)
块2
……CASE(表达式N)
块NCASEDEFAULT
默认块ENDSELECT例编写程序,输入年月,输出该月所对应的天数。四、逻辑IF语句
逻辑IF语句格式:IF(条件表达式)可执行语句例:教材PAGE44第9题
五、程序举例
例1输入一个三位自然数,判断它是否为水仙花数,所谓水仙花数,是指各位数字的立方和等于该数本身的数如153=13+53+33为水仙花数。例2将学生成绩分为优(90~100分)、良(80~89)、中(70~79)、及格(60~69)、不及格五个档次。从键盘输入学生的成绩,输出对应的档次。
总结
选择结构程序设计注意两个问题:一是如何表达条件?二是实现选择结构的语句。要注意关系表达式和逻辑表达式的书写规则,注意各种语句的书写格式、执行过程以及应用方法。
实验三选择结构程序设计
循环结构程序设计
用DO语句实现循环
用DOWHILE语句实现循环
几种循环组织方式的比较
循环的嵌套
循环结构的程序设计方法
一、用DO语句实现循环
1.DO循环一般格式DOi=e1,e2[,e3]…(循环体)ENDDO其中i代表循环变量,它可以是整型或实型变量。e1、e2、e3称为循环参数表达式,分别表示循环变量的初值、终值和步长。循环体是在循环过程中被重复执行的语句组。例求5!2.DO循环执行过程计算e1、e2、e3的值e1→i计算循环次数rr=0?执行循环体i+e3→ir-1→rENDDO下面的语句YNDO循环的执行次数
r=MAX(INT((e2-e1+e3)/e3),0)说明•
循环体指的是DO语句与ENDDO语句之间的语句,因此循环体并不包括DO语句,执行程序时DO语句也只执行一次。如果循环参数表达式e1、e2、e3中含有变量,那么即便在循环体中改变变量的值,循环参数并不改变。•
在循环体内给循环变量赋值,是不允许的。思考下列程序的执行结果DOK=1,10,2L=KENDDOPRINT*,K,LEND例1一个整数的因子(不包括该数本身)之和等于它本身,则称该数为完数。例如6的因子有1,2,3,且1+2+3=6,因此6是完数。输入一个整数,判断它是否完数例2
Fibonacci数列定义如下:F1=1F2=1Fn=Fn-1+Fn-2(n>2)求Fibonacci数列的前30项。
例3所谓“水仙花数”是指一个三位整数,其各位数字立方和等于该数本身。例如,153就是一个水仙花数。输出全部“水仙花数”。在[100,999]范围内,对所有整数逐一验证是否符合的条件,输出符合条件的数。这种方法称为穷举法。
二、用DOWHILE语句实现循环对于循环次数确定的循环问题使用DO循环是比较方便的。但是,有些循环问题事先是无法确定循环次数的,只能通过给定的条件来决定是否继续循环。这时可以使用DOWHILE语句来实现循环。1.DOWHILE循环的一般格式
DOWHILE(逻辑表达式)
循环体
ENDDO例输出所输入的全部正数,直到输入负数或零,程序结束。
2.DOWHILE循环的执行过程例输入一个整数,输出其位数。执行循环体ENDDO下面的语句满足循环条件?3.与循环有关的控制语句
•
EXIT语句•
CYCLE语句
CYCLE语句和EXIT语句的区别在于:CYCLE语句只结束本次循环,而不是终止整个循环的执行。EXIT语句则是结束所在循环,跳出所在循环体。实验四循环结构程序设计
三、几种循环组织方式的比较实现循环结构的三种语句,它们各具特点。一般而言,事先能确定循环次数的循环问题用DO循环,而事先不能确定循环次数的循环问题用DOWHILE循环。但这并不是绝对的,很多情况下它们是可以相互代替的。例输入一个整数m,判断是否素数。•
用DO循环实现。•
用DOWHILE循环实现•
用DO循环和逻辑IF语句的嵌套实现。四、循环的嵌套如果一个循环结构的循环体又包括一个循环结构,就称为循环的嵌套,或称为多重循环结构。在例求[100,1000]以内的全部素数。
(1)判断一个数是否素数。
(2)利用穷举法将判断一个数是否素数的程序段,对指定范围内的每一个数都执行一遍,即可求出某个范围内的全部素数。五、程序举例例1已知某球从100m高度自由落下,落地后反复弹起。每次弹起的高度都是上次高度的一半。求此球第10次落地后反弹起的高度和球所经过的路程
分析:用变量H来表示下落的高度,变量R来表示反弹的高度,变量S来表示小球经过的路程,则H的初值为100,反弹高度R=H/2。弹起一次小球要经过下降和上升两个阶段,小球经过的路程为H+R,这个过程如图所示。例2用牛顿迭代法求方程f(x)=2x3-4x2+3x-7=0在x=2.5附近的实根,直到满足|xn-xn-1|≤10-6
为止。牛顿迭代公式为:注意:关于迭代初值x0的选取问题,理论上可以证明,只要选取满足条件f(x0)f’’(x0)>0的初始值x0,就可保证牛顿迭代法收敛。当然迭代初值不同,迭代的次数也就不同。
例3求f(x)在[a,b]上的定积分。分析:求一个函数f(x)在[a,b]上的定积分,其几何意义就是求曲线y=f(x)与直线x=a,x=b,y=0所围成的图形的面积。为了求得图形面积,先将区间[a,b]分成n等分,每个区间的宽度为h=(b-a)/n,对应地将图形分成n等分,每个小部分近似一个小曲边梯形。近似求出每个小曲边梯形面积,然后将n个小曲边梯形的面积加起来,就得到总面积,即定积分的近似值。n越大,近似程度越高。这就是函数的数值积分方法。近似求每个小曲边梯形的面积的常用方法(1)用小矩形代替小曲边梯形,求出各个小矩形面积,然后累加。此种方法称为矩形法。
(2)用小梯形代替小曲边梯形,此种方法称为梯形法。
(3)用抛物线代替该区间的f(x),然后求出抛物线与x=a+(i-1)h,x=a+ih,y=0围成的小曲边梯形面积,此种方法称为辛普生法。以梯形法为例:
第一个小梯形的面积为:
第二个小梯形的面积为:
第i个小梯形的面积为:
…
…
第n个小梯形的面积为:本质上讲这是一个累加问题。例4某些分子和分母都是两位数的真分数,分子的个位数与分母的十位数相同,而且奇怪的是:如果把该分数的分子的个位数和分母的十位数同时去掉,所得结果正好等于原分数约分后的结果。例如,试求所有满足上述条件的真分数。分析:我们先把条件归纳为下面四点:
(1)分子和分母原为两位数;
(2)真分数;
(3)分子的个位数与分母的十位数相同;
(4)把分子的个位数和分母的十位数同时划去,分数值不变。考虑到分子和分母原为两位数,可以把分子和分母看成从10到99这90个数中每次取两个数的组合,对每一种组合验证条件(2)、(3)、(4)。总结:如何编写与调试程序
一、程序设计算法“如何编写程序”是学习高级语言程序设计的难点,也是学习的重点。初学者普遍感到头疼的问题是,碰到一个问题后不知从何下手,难以建立起明确的编程思路。根据教学基本要求,将本章程序设计问题分为累加与累乘问题、数字问题、数值计算等3类,每一类程序设计问题的思路如下:
1.累加与累乘问题
累加与累乘问题是很典型、最基本的一类算法,实际应用中很多问题都可以归结为累加与累乘问题。算法设计思路是:
(1)写出循环体中需要重复执行的部分。这一部分要确定两个内容:一是求每次要累加或累乘的数;二是迭代关系S=S+X或P=P*X。
(2)确定终止循环的方式。一般有事先知道循环次数的计数循环和事先不知道循环次数的条件循环两种方式,依具体情况而定。计数循环可用一个变量来计数,当达到一定循环次数后即退出循环。条件循环可根据具体情况确定一个循环的条件,当循环条件不满足时即退出循环。
(3)确定循环初始值,即第一次循环时迭代变量的值。
(4)重新检查,以保证算法正确无误。一般而言,这一类问题的算法流程图基本框架如图所示。
例1已知,分别求:
(1)当N取1000时,S的值。
(2)S<0.78时的最大N值和与此时N值对应的S值。
(3)求S的值,直到累加项小于10-4为止。第一种情况下,属于循环次数已知的循环结构,第二,三两种情况下,属于循环次数未知的循环结构,
2.数字问题
数字问题主要研究整数的一些自身性质与相互关系。处理过程中常常要用到求余数、分离数字及判断整除等技巧,务必熟练掌握。
(1)判断一个整数M能否被另一个整数N整除。方法1:若MOD(M,N)的值为0,则M能被N整除,否则不能。方法2:若M-INT(M/N)*N的值为0,则M能被N整除,否则不能。事实上,MOD(M,N)的函数值是M除以N的余数,正是按照表达式M-INT(M/N)*N得到的计算结果。M-INT(M/N)*N也可以写成M-M/N*N。
(2)分离自然数M各位的数字。
数字问题的提法往往是,求某一范围内符合某种条件的数。这一类问题的算法设计思路是:
(1)考虑判断一个数是否满足条件的算法。有时侯可以直接用一个关系表达式或逻辑表达式来判断,如判断奇数、偶数。但更多的情况是无法直接用一个条件表达式来判断,这时可根据定义往往利用一个循环结构来进行判断。
(2)在指定范围内重复执行“判断一个数是否满足条件”的程序段,从而求得指定范围内全部符合条件的数。这里用的方法是穷举。一般而言,这一类问题的算法流程图基本框架如图2所示。
例2若两个素数之差是2,则称这两个素数是一对孪生数。例如,3和5是一对孪生数。求[2,500]区间内(1)孪生数的对数。(2)最大的一对孪生数。
3.数值计算问题
数值计算是“计算方法”课程研究的对象,主要研究如何用计算机来求一些数学问题的数值解。目前数值计算方法已趋于完臻和成熟,许多问题都有了现成的算法或软件包。详细内容可参阅数值分析或计算方法方面的专著,或直接使用有关软件。(1)用牛顿迭代法求方程f(x)=0在x=x0
附近的实根。直到∣xn-xn-1∣≤ε为止。
(2)求之值。二、常用程序调试技巧
设置断点输出中间结果注释语句的运用
实验五常用算法
指针
指针的定义与使用
动态变量
指针与数组一、指针的定义与使用1.指针变量的定义格式指针变量的定义格式为:类型说明,POINTER::指针变量名1,指针变量名2,…其中类型说明可以是任何数据类型,如INTEGER、REAL等,它表示该指针所指的目标变量类型。POINTER为指针定义的关键字。2.指针变量的使用例PROGRAMPOINTER1 INTEGER,POINTER::P INTEGER,TARGET::X READ*,X P=>X PRINT*,"X=",X PRINT*,"P=",P END输入3,程序的输出结果为:
X=3P=35PX指针变量的三种状态①未定义状态,在程序开始时,所有的指针都处于这种状态。②空状态,此时指针还没有作为任何对象的别名。在程序中,有时为了方便起见,可以让指针指向一个空对象。其语句为:NULLIFY(指针变量名)。③关联状态,此时,指针已经作为其他对象的别名。值得注意的是只有在第三种状态时,指针才能参与运算,否则,或者编译出错,或者非法操作。二、动态变量通过指针,可以先得到变量名,然后再利用ALLOCATE(P)函数可以动态分配其空间,其中P为指针变量。例如
PROGRAMPOINTER3 INTEGER,POINTER::P
ALLOCATE(P) P=4 PRINT*,"P=",P END输出结果为:P=4三、指针与数组指针数组定义格式为:类型说明,DIMENSION(:…:),POINTER::指针名其中类型说明可以为各种数据类型,如INTEGER、REAL等;DIMENSION(:…:)是数组的动态说明标识,即不指定数组下标界限,“:”个数等于数组维数。POINTER为指针说明标识。例如REAL,DIMENSION(:),POINTER::XALLOCATE(X(20))第一个语句声明了一个可以指向一维整型数组的指针X,第二个语句为该数组分配了20个单位的存储空间。例输入任意两个数,将它们及四则运算结果存储起来后,输出。分析:利用指针,定义一个动态数组X,用来存放输入的数据和计算的结果,该数组的空间大小可以根据要存储的数据个数动态分配。总结指针是现代程序设计语言中一个非常重要的概念。FORTRAN90以前的FORTRAN版本,没有指针这种数据类型,FORTRAN90对其作了重大改进,引入了指针的概念。但是值得注意的是,FORTRAN90的指针与C语言中的指针并不相同,因为它并不代表一个变量的地址,而是代表一个变量的别名,实质上它相当于C++里的引用。四、链表指针用途之一是使得数据在计算机中可以按链接方式存储,而链接存储中,最简单是链表。顺序存储和链接存储是数据的两种最基本的存储结构。在顺序存储中,每个存储结点只含有存储元素本身的信息,元素之间的逻辑关系是通过数组下标位置简单计算出来的。顺序存储最大的缺点是不利于数据的动态变化,如向顺序表中插入或删除一个元素时,需要大量移动数据,处理效率很低。在链式存储中,每一个节点包含两个部分:一个值和一个指向下一个节点的指针。10.4.1结点的定义TYPENODEINTEGERVALUETYPE(NODE),POINTER::NEXTENDTYPENODE10.4.2链表的基本操作链表的基本操作包括建表、插入、删除、查找、更新、遍历等例建立一个包含5个节点的链表,并输出建表后的结果。(1)定义链表TYPE(NODE),POINTER::CURRENT,L(2)建立链表READ*,NUMNULLIFY(L)ALLOCATE(CURRENT)CURRENT%VALUE=NUML=>CURRENTDOWHILE(NUM/=0)READ*,NUMIF(NUM/=0)THENALLOCATE(CURRENT)CURRENT%VALUE=NUMCURRENT%NEXT=>LL=>CURRENTENDIFENDDO12345(3)链表的输出CURRENT=>LPRINT*,CURRENT%VALUECURRENT=>CURRENT%NEXTDOWHILE(ASSOCIATED(CURRENT))PRINT*,CURRENT%VALUECURRENT=>CURRENT%NEXTENDDOEND12345
子程序语句函数函数子程序子例行程序程序单元之间的数据传递递归调用等价语句与数据块子程序内部子程序模块一、语句函数1.语句函数的定义语句函数定义的一般格式是:
f(x1,x2,…,xn)=e2.语句函数的调用语句函数的调用形式和内在函数完全相同。例1计算f(1)f(10)f(12)f(-5)的值。例2找出100~999之间的所有水仙花数。二、函数子程序1.函数子程序的定义函数子程序的定义格式是:[类型说明]FUNCTION函数名(虚参表)
函数体END函数名的命名方法与变量名相同,虚参可以是简单变量和数组变量,但不能是常数、数组元素、表达式)例1求分析:上述三个数列的通项不同,求和范围也不同,用一个程序段难以同时计算三个数列的和,并且,因为无法用一个语句函数完成数列的求和计算,所以也无法使用语句函数来简化程序设计。可以采用函数子程序来完成这个问题。设计一个求和的函数子程序SM(M,N,L),M、N分别为求和范围的上、下界,L反映数列通项的性质。函数定义部分应注意如下问题:(1)函数不能有同名虚参。虚参的类型可以在函数体中进行说明,当未对虚参类型进行说明时,虚参类型遵守I—N隐含规则。(2)函数定义部分中一定要有一个语句将函数值赋值给函数名,这种赋值语句的格式是:函数名=表达式。注意不要在函数名后带上括弧。2.函数子程序的调用调用一个函数子程序的方法和调用内在函数和语句函数的方法基本相同。例2用函数子程序的方法设计一个程序,求50~100内的所有素数及其和。分析:设计一个函数子程序PRIME(N):主程序的任务是应用PRIME函数子程序在50~100之间使用枚举法求出那些使PRIME函数值为1的自然数并求这些数的和。思考:子程序的返回值分别为逻辑型、字符型时,主、子程序程序做何修改?例2当一个数各个数位的立方和等于这个数本身时,称这样的数为水仙花数(如153=1**3+5**3+3**3,所以,153是一个水仙花数。)编程:求100~999之间的水仙花数。分析:设计一个函数子程序NUM(N,I),当I=100时,函数NUM返回N的百位上的数;当I=10时,NUM返回N的十位上的数,I=1时,NUM返回N的个位上的数。主程序中调用NUM函数在100~999之间找出所有水仙花数。三、子例行程序1.子例行子程序的定义子例行子程序定义格式是:SUBROUTINE子程序名(虚参表)
子例行程序体END子程序的命名方法与变量相同。虚参由变量、数组名(不能是数组元素,常数、表达式)充当,当虚参多于一个时,各虚参间用逗号分隔,当没有虚参时,子例行程序名后的一对括弧可以省略。子例行程序的设计方法和函数子程序相同,但因为其名字没有值,所以不能有对子例行程序的名字赋值的语句。2.子例行子程序的调用子例行程序的调用格式是:CALL子例行程序名(实参表)其实参的类型与函数子程序相同。和函数子程序的调用不同的是,子例行子程序的调用是一个独立的语句。例1用子例行程序的方法求上面的s1,s2,s3。例2设计一个子例行程序程序,求任意矩阵的转置矩阵。实验九子程序(一)四、程序单元之间的数据传递1.简单变量作为虚参(1)简单变量或数组元素作为实参。系统将实参与虚参安排同一个存储单元,对虚参的任何改变都作用在对应的实参上,因而调用一个子程序(包括函数子程序和子例行程序)时,实参的值有可能改变。(2)常量或表达式作为实参。首先计算表达式的值(如果实参为表达式时),然后将该值赋值给对应的虚参。此种情况下,子程序中不能改变与常量(或表达式)对应的虚参的值。2.数组名作为虚参当虚参是数组名时,对应的实参可以是与虚参类型相同的数组名或数组元素,并且实参与虚参共用一片连续的存储单元。例:写出下列程序的执行结果 INTEGERA(5) N1=1 N2=1 DO10J=1,510 A(J)=M(N1,N2) WRITE(*,*)A END FUNCTIONM(I1,I2) M=I1+I2 I1=I2 I2=M ENDJ=1J=2J=3J=4J=5I2I18—>135—>85—>83—>53—>52—>32—>31—>21—>21—>1N2N1例PROGRAMMAININTEGERA(10)……CALLSB(A(3))……ENDSUBROUTINESB(B)DIMENSIONB(6)
……ENDDIMENSIONB(10)A(1)A(2)A(3)A(4)A(5)A(6)A(7)A(8)A(9)A(10)B(1)B(2)B(3)B(4)B(5)B(6)四、程序单元之间的数据传递3.子程序名作为虚参例设有三个连续函数:四、程序单元之间的数据传递4.变量的作用域(1)变量存储区的分配与释放(2)变量作用域(3)子程序中变量的存储属性:SAVE属性,STATIC属性,AUTOMATIC属性变量的存储属性的说明方法是:存储属性变量名表例如AUTOMATICA,B,CINTEGERSAVEX,Y
例分析:定义一个函数,实现的功能相当于f(a)/(f(b)*f(c)),函数有四个参数(FUN,A,B,C),其中FUN是虚拟函数名,A、B、C为自变量,第一次调用时把内部函数名SIN传送给FUN,第二次调用时把内部函数名COS传送给FUN。五、递归调用1.递归的概念2.递归函数递归函数的定义格式是:RECURSIVEFUNCTION函数名(虚参表)RESULT(变量名)
…
调用该函数本身
…END例1设计一个计算N!的函数子程序。函数子程序如下:RECURSIVEFUNCTIONFAC(N)RESULT(FAC1)IF(N==1)THENFAC1=1
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论