Fortran90 第8章
FORTRAN知识点总结
F O R T R A N第2章FORTRAN90基础知识:程序单元的概念:fortran90程序是一种分块形式的程序,整个程序由若干程序单元块组成。
每个程序只有一个主程序单元。
各单元体的程序体形式上相同。
程序单元可以是主程序、子程序(外部过程或内部过程)、模块MODULE (供其他程序单元引用即把该程序单元内的全部语句复制到程序单元中)或块数据程序单元BLOCK 。
语言元素:指在程序设计中用到的基本成分,如字符集、常量、变量、记号(标号、关键字、名字、常数、运算符和定界符)以及其他的基本结构等。
字符集:英文字母、阿拉伯数字、下划线、21个特殊字符($和?没有规定用法)。
数据结构:整型INTEGER (34-2下划线后面是种别参数),n 位字长的计算机的数据表示范围一般为12~211-+---n n ,种别参数由内在询问函数KIND 送回,种别值提供的最小范围由内在函数SELECTED-INT-KIND 送回,表示十进制幂的范围由内在函数RANGE 送回;实型REAL ,小数形式和指数形式;复型COMPLEX (种别类型参数值取实部与虚部中较大者);字符型CHARACTER,由一对单撇号或双撇号之间的字符序列组成;逻辑型LOGICAL。
派生数据类型TYPE;数组INTEGER,DIMENSION(1,50)::A,可直接对数组元素进行运算如3*A,SQRT(A);字符子串,在字符串CHARACTER(LEN=80)::ROW中,ROW(1:3)就表示字符串ROW中第1到第3个元素组成的子串。
变量名的命名规则:不能超过31个字符;组成成分是字母、数字、下划线;第一个字符必须是字母。
第3章基本语句:类型说明语句:类型说明(种别说明),属性说明::变量名表尽量避免把两个实数作相等或不相等的比较。
淘汰隐式说明IMPLICIT NONE种别说明:种别参数即对可移植数据精度和范围进行选择的机制KIND(X) 返回变元X的种别参数值SELECTED-REAL-KIND(n,m) 产生一个种别值,它表示某一精度和范围。
fortran常用算法的程序设计举例
4
2. 梯形法
$ 10
第i个小梯形面积 :
100 f (a ih ) f (a (i 1)h) $ si h 2 200
1 read(*,*) a,b,n 求 : sin xdx 0 x=a h=(b-a)/n s=0.0 do 10 i=1,n si=(sin(x+(i-1)*h)+ sin(x+i*h))*h/2.0 s=s+si continue write(*,100) a,b,n write(*,200) s format(1x,'a=',f10.3,3x, 'b=',f10.3,3x,'n=',i4) format(1x,'s=',f15.8) end
ca 其中h a 2 h { f (a) f (b) 4[ f (a h) f (a 3h)] 2 f (a 2h)} 3
b
f ( x)dx s1 s2
7
如果将(a,b)分成四个小区间:
h a f ( x)dx 3 { f (a) f (b) 4[ f (a h) f (a 3h) f (a 5h) f (a 7h)] 2[ f (a 2h) f (a 4h) f (a 6h)} ba 其中h 2 4
17
五、计算机模拟
计算机模拟(Computer Simulation),又称 “仿真”:用计算机模仿实物系统进行测试,从 测试的结果获得期望的资料。
根据模拟对象的不同特点,可分为: 确定性模拟(Deterministic Mode); 随机性模拟(Stochastic Mode) 。
18
fortran教程[技巧]
前言FORTRAN90的新特性1、淘汰了所有转移语句,增加了新的控制结构,使程序结构化。
增加了结构块,模块及过程的调用灵活形式。
2、加强数组的算法功能。
提出超载概念与实现方法。
提高了文字处理功能。
3、更接近自然语言与公式演算。
允许在字符数据用选取不同种别。
特别:语句书写对列的要求放宽:一般一行写一条语句(也可也多个语句,用“;”分隔),没有标号区、续行区、正文区的区别。
一行最多为132列,可以在任何列处中断语句,中断处写一个“&”,随后在下一行任意列处继续。
一个语句最长不能超过2640个字符。
语句结尾不可有标号、符号。
注释以“!”开始,可以位于任何位置。
***以下只讨论与FORTRAN77不相同处。
第一章FORTRAN90的基本语句第一节类型说明语句1、变量名全长不得超过31个字符。
2、变量类型定义:INTEGER::X,YREAL::ACOMPLEX::B,C,D3、建议淘汰隐式说明,在程序说明部分一开始就写:IMPLICIT NONE向系统声明不使用隐式说明。
4、可以在变量说明时就置初值。
如:REAL::X=1.1,Y,Z=2.25、种别——决定变量的精度和所占内存单元数。
a.如:REAL(KIND=2)::X 说明变量X为REAL型,种别为2。
KIND是种别说明关键字。
如没有种别说明,则采用系统省缺值。
b.有关函数:KIND(X) 返回X的种别参数。
当X取常数0时,返回省缺种别参数。
如KI ND(0)、KIND(0.0)、KIND(.FALSE.)、KIND('A')分别返回整型、实型、逻辑型、字符型的省缺种别参数。
SELECTED_REAL_KIND(N,M) 返回种别参数,使之满足十进制有效位为N, 值范围在10**(-M)和10**M之间的实数。
SELECTED_INT_KIND(N,M) 与上类似,选择整型类别。
c.常数类别表示对数值型常数、逻辑型常数用后缀法,即在常数后加一下划线,再跟种别参数。
fortran有限元程序课程设计
fortran有限元程序课程设计一、课程目标知识目标:1. 掌握Fortran语言的基本语法和程序结构;2. 理解有限元方法的基本原理及其在工程问题中的应用;3. 学会使用Fortran编写有限元程序,解决简单的物理问题;4. 了解有限元程序的调试与优化方法。
技能目标:1. 能够运用Fortran语言编写简单的有限元程序;2. 能够对有限元程序进行调试和性能优化;3. 能够运用所学知识解决实际工程问题,具备一定的编程实践能力;4. 能够通过团队合作,共同完成较复杂的有限元程序编写。
情感态度价值观目标:1. 培养学生对编程和计算物理学的兴趣,激发学生的求知欲和探索精神;2. 培养学生严谨、细致、勤奋的学习态度,提高学生的问题解决能力;3. 培养学生的团队合作精神,提高沟通与协作能力;4. 增强学生的民族自豪感,认识我国在有限元领域的发展成果。
课程性质:本课程为高年级专业选修课,旨在使学生掌握Fortran有限元程序的编写和应用,提高学生的编程实践能力和解决实际问题的能力。
学生特点:学生已具备一定的数学、物理和编程基础,具有较强的逻辑思维能力和动手能力。
教学要求:结合课本内容,注重理论与实践相结合,强化编程实践,提高学生的实际操作能力。
同时,注重培养学生的团队合作精神,提高学生的综合素质。
通过本课程的学习,使学生能够独立编写和优化有限元程序,为后续学习和工作打下坚实基础。
二、教学内容1. Fortran语言基础:变量定义、数据类型、运算符、控制结构、数组、函数与子程序等;2. 有限元方法原理:有限元离散化、单元划分、形函数、刚度矩阵、载荷向量、边界条件处理等;3. 有限元程序编写:根据实际问题,运用Fortran语言编写有限元程序,包括前处理、核心计算和后处理;4. 程序调试与优化:调试技巧、性能分析、优化方法等;5. 实际工程案例:选取具有代表性的工程问题,运用所学的Fortran有限元程序解决。
第8章软件维护
软件维护步骤
4、修改程序的副作用
副作用是指因修改软件而造成的错误或其它不希望发生的情况。 1)编码副作用:在使用程序设计语言修改源代码时可能引起的错误, 如删除或修改一个标号、标识符、一个子程序,改变程序代码的时序关系, 改变逻辑运算符,改进程序的执行效率,改变程序占用存储的大小等,都 很容易引入错误,应特别小心。 2)数据副作用:在修改数据结构时,有可能造成软件设计和数据结构 的不一致,而导致软件错误。数据副作用是修改软件信息结构引起的,如 重新定义全局或局部常量,重新初始化控制标志或指针等,都容易产生设 计与数据不相容的错误,可通过详细设计文档对数据副作用加以控制。 3)文档副作用:对数据流、软件结构、逻辑模块等进行修改时,必须 对相关技术文档进行修改,否则会导致 文档与程序功能不匹配,使文档不 能反映软件当前的状态。
软件维护步骤
5、重新验证程序:
1)静态确认; 2)计算机确认; 3)维护后的验收。
软件维护步骤
第三步:维护文档整理
记录一些与维护工作有关的数据信息,这些信息 可作为估计软件维护的有效程度,确定软件产品的 质量,确定维护的实际开销等工作的原始数据。
软件维护步骤
第四步:维护活动评价
具体的评价工作可从以下几个方面考虑: (1)每次程序运行时的平均出错次数; (2)花费在每类维护活动上的总的“人时”数; (3)每个程序、每种语言、每种维护类型程序的平均修改次数; (4)维护工作中增加或删除每个源程序语句所花费的平均“人 时”数; (5)用于每种语言的平均“人时”数; (6)维护申请报告的平均处理时间; (7)各类维护申请的百分比。 一方面,可判定此次维护活动开展是否顺利、成功;另一方面, 为今面的维护工作积累经验。
2、结构化维护:进行维护 活动时,首先从评价需求开始,搞清楚 功能、性能上的改变,然后对设计说明文档进行评价、修改和复查; 根据设计的修改,再进行程序的变动;然后根据测试文档中的测试 用例进行回归测试;最后将修改后的软件再次交付使用。
FORT讲义RAN语言第5章共8章
有
实型变量的说明
REAL [ ( [KIND = ] 类别参数值) ] [ [ ,属性列表] :: ] 变量列表
单精度用REAL(4)定义,双精度用REAL(8)或 DOUBLE PRECISION定义。缺省的类别值为 4,即为单精度。
REAL :: M12,AREA,LEN REAL(4) :: DX,DY REAL*4 :: DX,DY REAL(8) :: D_PRE,X REAL*8 :: D_PRE,X DOUBLE PRECISION :: D_PRE,X
n1
•源程序如下: Implicit none Real*8 ::x,y,f Integer::n Read*,x Y=x F=x Do f=-f*(2*n-1)/(2*n)*(2*n-1)/(2*n+1)*x*x if (abs(f) .LT. 1d-15) exit y=y+f n=n+1 Enddo Print*,’y=’,y,’f=’,f end
整型变量的说明
基本格式为: INTEGER [ ( [ KIND = ] 类别参数值 ) ] [ [ ,
属性列表 ] :: ] 变量列表 其中类别参数值取1,2,4 例:INTEGER I,TOTAL INTEGER(2) :: K,LIMIT INTEGER(KIND=4) :: MIN,MAX INTEGER*2 :: K,LIMIT INTEGER*4 :: MIN,MAX
用方式,也称为数据类型。
内部数据类型 派生数据类型
数值型 非数值型
整型 实型 复型 逻辑型 字符型
数据类型的性质:
(1)类型的名称 (2)允许值的集合 (3)允许值(常量)的表示方法 (4)操作这些值的运算的集合
Fortran子程序
函数与子程序
子程序和主程序之间最大不同在于:主程序的程序代码,在程序一开始 就自动被执行,而子程序的代码只有在被‚调用‛才会执行。
一个包含子程序的Fortran程序在结构上大致如下:
program main ← 主程序 „„ „„ ←主程序代码 „„ end program main ←主程序结束 subroutine sub1() ←第1个子程序 „„ „„ ←子程序码 „„ end subroutine sub1 ←第1个子程序结束 subroutine sub2() ←第2个子程序 „„ „„ ←子程序码 „„ end subroutine sub2 ← 第2个子程序结束
函数与子程序
使用common还有一些技巧,见下面实例。主程序中有全局变量a,b, 子程序中有大小为2的数组a(2),根据使用相同内存空间的策略,a等于 a(1),而b等于a(2)。
program ex0814 implicit none real :: a,b common a,b ! 把浮点数a,b放在全局变量中 a = 1.0 b = 2.0 call ShowCommon() stop end subroutine ShowCommon() implicit none real :: a(2) common a ! 把数组a放在全局变量中 write(*,*) a(1), a(2) return end
传递参数与使用全局变量都可以在 不同程序之间共享数据,简单的说,当 需要共享的变量不多,而且只由少数几 个程序需要使用这些数据时,就使用参 数;当共享大笔数据,或是有很多个不 同程序都要使用这些数据时,就使用全 局变量。
函数与子程序
2、BLOCK DATA 的使用 关于common设臵初值的方法,common变量不能直接在子 程序或主程序中使用DATA来设臵初值,要在BLOCK DATA程序模块中使用DATA命令来设臵初值,看一个程序:
Fortran90
1、定义:系统函数,FORTRAN90系统已经定义了的函数
2、种类与函数调用写法: 函数名 ( 函数参数 ) |x| : ABS(X) e:
x
x
EXP(x) SQRT(X)
Real(x)
INT(x)取整数部分
NINT(x)最靠近的整数 CMPLX(两种) DBLE(x) Max(a,b,c,……)
Cosx COS(X)
3、名字的命名规则: 字母、数字、下划线组成 字母开头 长度1~31 名字中不能含有空格 错例 3A 、 x-3 、3.14
S_p_r , waiter_ , b123 , a是正确的
字符的大小写没有要求 ,最好遵循“见名知意”的准则
在FORTRAN90标准中,并没有规定保留字,因此完全可以使用其中 的函数名或关键字作为变量名。但为了避免混淆,建议不要使用 FORTRAN90中已有的具有特定意义的名字作为变量名。
例
1/2*2值为0
8/5+2.0*5/2值为6.0
(注意在计算过程中逐步转化、实数有效位7位) FORTRAN90允许不同类型的数值型数据类型之间 进行算术运算,但不允许在数值型数据类型与非数 值型数据类型之间进行算术运算
例:
1、 2 sin( 4) 3
(sin 4 cos10)e2.5 2、 2 ax ln(3 * 5)
FORTRAN90-子程序浅
100
Program Main REAL MYEXP WRITE(*,*) ‘Enter X:’ READ(*,*)X Y=(MYEXP(X)-MYEXP(-X))/2.0 WRITE(*,100)’Sinh(‘,X,’)=‘,Y FORMAT(1X, A, F5.2, A, E13.6) END
9
f(x) = x * x + 2 * x + 5 x = 3.0 y = x * f(1.0) WRITE(*,*) y END
24.00000
10
四、语句函数的应用
例:利用二分法求方程x3-x2-1=0在[0,3]上的实根。
Real::a=0.0,b=3.0,m Fa=a**3-a*a-1.0; Fb=b**3-b*b-1.0 m=(a+b)/2; Fm=m**3-m*m-1.0 Do while (Fm>1.0e-6) If(fm*fa>0) then a=m;Fa=Fm Else b=m Endif m=(a+b)/2.0; Fm=m**3-m*m-1.0 Enddo Write(*,*)’方程的根为:‘,m End
Program Main
REAL W(5,5)
CALL READIN(W) CALL OPP(W,X1,X2) WRITE(*,100)X1,X2 100 FORMAT(1X, ‘The two sum of opposite angles &
elements:’/1X,’X1=‘,F8.2,’X2=‘,F8.2)
(1)
SUBROUTINE SUB(B) DIMENSION B(-1:5) . . . END
B(-1) B(0) B(1) B(2) B(3) B(4) B(5)
第8章符号表与错误处理
8.1 符号表 8.2 错误处理 习题八
8.1 符 号 表
8.1.1 符号表的作用 在编译程序工作的过程中,需要不断收集、记录、查证 和使用源程序中的一些语法符号(简称为符号)的类型和特征等 相关信息。为方便起见,一般的做法是让编译程序在其工作 过程中建立并保存一批表格,如常数表、变量名表、数组内 情向量表、过程或子程序名表及标号表等,将它们统称为符 号表或名字表。符号表中的每一项包括两个部分:一部分填 入名字(标识符);另一部分是与此名字有关的信息,这些信息 将全面地反映各个语法符号的属性以及它们在编译过程中的 特征,诸如名字的种属(常数、变量、数组、标号等)、名字的 类型(整型、实型、逻辑型、字符型等)、特征(当前是定义性 出现还是使用性出现等)、给此名字分配的存储单元地址及与 此名语义有关的其他信息等。
下面,我们给出建造满足上述要求符号表的算法。为了使各 分程序的符号表登记项连续地排列在一起,并结合当扫描具有嵌 套分程序结构的源程序时总是按先进后出的顺序来扫描其中各个 分程序的特点,可设置一个临时工作栈,每当进入一层分程序时, 就在这个栈的顶部预造该分程序的符号表,而当遇到该层分程序 的结束符END时(此时该分程序的全部登记项都出现在栈的顶部 ), 再将该分程序的全部登记项移至正式符号表中。建立符号表的算
号表中找到此标识符,则从表中取出有关的信息并作相应的处理;
为了实现上述查、填表功能,可以按如下方式组织符号表: (1) 分层组织符号表的登记项,使各分程序的符号表登记项 连续地排列在一起,而不许为其内层分程序的符号表登记项所 分割。
(2) 建立一个“分程序表”,用来记录各层分程序符号表的 有关信息。分程序表中的各登记项是在自左至右扫描源程序中 按分程序出现的自然顺序依次填入的,且对每一分程序填写一 个登记项。因此,分程序表各登记项的序号也就隐含地表征了 各分程序的编号。分程序表中的每一登记项由三个字段组成: OUTERN 字段用来指明该分程序的直接外层分程序的编号; COUNT字段用来记录该分程序符号表登记项的个数;POINTER 字段是一个指示器,它指向该分程序符号表的起始位置。
编译原理第八章 符号表
8.3 名字的作用范围(Fortran)
• Fortran 局部、全局
• 执行时过程(函数)不
Name
Information
嵌套,局部区域只有一
···
局
个现行段;
···
部 • 编译时,尽管查填符号
表过程只限于局部,但
考虑到地址分配的全局
性,需将每个程序段符
号表保存在外存中,采
• 定长方式 • 间接方式 (1)名字的间接存储 (2)信息的间接存储
Name ● ●
Information
如何组织
方式
6 S A MP L E 3 S U M
Name
Information ● ●
数组信息表 维数 首地址 维1
内情向量表
··· ···
以数组为例 维n
如何组织
• 对于名称:把所有标识符都存放在一个 独立的字符串数组,主栏只放一个指示 器和一个整数(名字的长度)
var f, g: real; procedure B3(y:real) const b=5; procedure B4 … end B4 end B3
end B2 end B1
8.3 名字的作用范围 (Pascal)
top
(14)…
B4 (13)…
0
h (12)… 13
sp b (11)…
12
y (10)…
最近使用优先查找 (链头)
较难
中 排序整理 折半查找
二叉树
较难
中 构造排序树,查找时 依子树次序逼近。
杂凑(哈希
难
表)
高 杂凑函数: 名称于位置的映射 基于计算的查找。
数据结构的知识
FORTRAN95第八章 实用程序设计方法
直到 x 是一个素数
根据上面的伪码,可以比较容易地写出实现求出前 n个素数并打印的FORTRAN程序。但是, 这个程序的 效率是比较低的。为此可以利用数论的知识,从以 下两个方面考虑进行优化。 首先, 语句“对于k 从2 变到X-1,每次增 1 做:”
在以上各阶段都应有充分的文档资料。而且,以上过程是一个有限次 迭代过程。
8.2 结构化程序设计方法 8.2.1 结构化程序设计的概念 所谓结构化程序设计,就是以良好的程序结构为目标、遵照
“自顶向下、逐步求精”和模块化的方法、每个模块仅有一个 入口
和一个出口、程序中仅使用三种基本控制结构、尽量少用GOTO 语句的程序设计方法, 下面对结构化程序设计方法进行全面、细 致地阐述。
具体说来,计算机程序设计的准则有以下七个方面:
正确性:这是判定程序质量的永恒准则。 可靠性:这是指程序执行的可重复性要好。无论执行环境
如何变化,对相同的输入数据,一个程序的执行结果总是 不变的。 易读性:这是指程序结构要简单、语句要直观、程序内部 要有足够的注解等,以便维护和引用程序。遵照良好的编 程风格(习惯),会增大程序的可读性。 有效性:这是指程序应当少占存储空间、快速运行。良好 的时空效率永远是人类追求的目标。 可维护性:这是指程序应当容易查找错误、容易改正错误。 一个大型程序,常常需要数十人甚至数百人合作开发,代 价高昂。既使通过严格地检测,也不可能保证没有错误。 而且使用期常常达到10年至15年或更长。因此,在使用中, 排除错误、扩充、更新总是难免的。 适应性:这是指程序不应因计算机硬件或外部环境的变更 而更改或废弃。程序的适应性越强,可移植性越好,越能 适应各种机型和环境,其社会效益和经济效益就越好。 可重用性:这是指经过实践证明正确的己有源程序代码, 可以方便地被自己或他人利用,这样不仅能大大提高程序 的开发效率,而且能大大减少程序的错误。
FORTRAN95第八章实用程序设计方法
FORTRAN95第八章实用程序设计方法Fortran 95是一种编程语言,其提供了许多实用的程序设计方法。
本文将介绍Fortran 95的第八章,主要讨论了一些实用的程序设计方法,并对其进行详细的阐述。
首先,第八章首先介绍了Fortran 95中的模块和接口。
模块可以将程序中相关的子程序、变量和常量组织在一起,使得程序更加结构化。
接口则可以定义子程序的输入和输出参数,以及子程序的类型和属性。
这样可以提高代码的可读性和重用性。
接下来,该章节还介绍了Fortran 95中的递归子程序。
递归是指一个子程序可以调用自己。
递归子程序可以解决一些复杂的问题,例如数学中的阶乘计算。
在使用递归子程序时,需要注意递归的终止条件,否则可能导致无限循环。
此外,Fortran 95还引入了动态内存分配的概念。
动态内存分配允许在程序运行时动态地申请和释放内存。
这对于处理大规模数据或者需要临时存储空间的情况非常有用。
Fortran 95提供了ALLOCATE和DEALLOCATE语句来进行动态内存分配和释放。
在实际的程序设计中,很多时候需要对输入数据进行校验和处理。
Fortran 95提供了一系列的内置子程序和函数,可以方便地进行数据处理。
例如,可以使用MOD函数计算一个整数的余数,还可以使用TRANSFER函数将一个数据对象转换成另一种类型。
此外,本章还介绍了一种常见的程序设计技巧,即使用函数来替代变量。
这样可以提高代码的可读性和维护性。
通过将一些复杂的计算封装在函数中,可以简化主程序的逻辑。
最后,本章还介绍了一些常用的数学库函数。
Fortran 95提供了一系列的内置函数,用于数值计算和数学操作。
例如,可以使用SQRT函数计算一个数的平方根,还可以使用LOG函数计算一个数的自然对数。
总之,Fortran 95的第八章介绍了一些实用的程序设计方法。
通过掌握这些方法,可以提高代码的结构化程度和可读性,同时还可以提高代码的灵活性和可重用性。
FORTRAN90
FORTRAN90FORTRAN 90第一章绪论一、特点在FORTRAN 77的基础上增添了许多具有现代特性的功能、递归、数组直接运算、派生类型、指针和过程。
二、与FORTRAN 77的区别1、不区分书写格式2、不赞成语句标号3、不使用BLOCK DATA 数据块子程序、语句函数4、主程序以PROGRAM 开头,以END PROGRAM为结尾函数子程序:区分函数名与函数值5、不使用GOTO 10、STOP、PAUSE语句6、不使用DO 10 I=1,3,而以DO与END DO 匹配使用。
7、不使用:I-N规则、双精度、DATA语句、多条RETURN语句。
而使用REAL ::A=0,B=2.58、不使用COMMON语句,而用模块MODULE9、用假定形状数组取代假定大小数组10、DIMENSION A(10)在FORTRAN 90中不再定义数组11、FORMAT 语句不再使用第二章F ORTRAN 90 基础知识第2.1节语言元素一、字符集1、A-Z (26个)2、0-9 (10个)3、_(下划线)(1个)4、特殊符号(21个):空格、等号、加号、减号、*、/、(、)、,、.、’、:、!、”、%、&、;、<、>、?、$二、数据类型本身:INTEGER real complex character logical派生类型种别参数:对可移值数据精度和范围进行选择的机制,他提供了对每种内部数据类型的不同机器表示进行选择的参数化方式,种别参数均为整数。
用法:KIND=种别参数。
函数KIND(X)表示返回X的种别参数。
1、常量(字符型:双、单引号表示)常数的种别标示:例15_2 14.36_3 .false._4 5_’ang’带种别参数的常量的运算:15_2+14.36_3=29.36_3定义常量:REAL(KIND=2),PARAMETER::N=52、变量(1)变量名(程序名、常量、虚参、派生类型)命名规则:长度小于等于31个字符、须以字母开头、由字母、数字、下划线构成,其中不出现空格。
fortran语言教程第8章
第8章 FORTRAN语言的文件操作在前面介绍的程序中,结果都是输出在屏幕上,数据都是通过键盘送入内存单元,实际上数据的输入/输出也可在磁盘上。
如图所示:FORTRAN中对文件的存取以记录为单位,即:输出时:一个输出语句的数据就是一个记录,叫写入文件。
输入时:一个输入语句需要的数据就是一个记录,叫读出文件。
本章讨论FORTRAN程序的文件操作,也就是FORTRAN程序对磁盘数据文件的操作——读/写方式,并描述数据文件的记录结构,以及在程序设计中怎样建立,使用这些数据的记录结构。
8.1文件的概念8.1.1 文件的分类1)按记录存储结构分:顺序文件:文件记录存储按照时间顺序依次存放,记录的逻辑次序与物理顺序是一致的,不能随意读或取某个记录,必须从首记录开始访问。
直接文件:又叫随机文件,记录存放按记录号完成。
2)按记录数据存放格式分:有格式文件:记录以字符形式(或称ASCII码形式)存储,文件的数据流由一个个的字符组成,每个字符占据一个字节,每条记录用回车和换行符作为结束符,可以用文本编辑器(如记事本)直接打开查看。
无格式文件:数据以计算机内部的二进制代码形式存放。
如果用文本编辑器直接打开查看,只能看到乱码符号。
二进制文件:这是Microsoft的一种扩充模式,数据按其在内存中的存储形式存储在文件中,其数据流由二进制代码形式的一个个字节组成,结构最紧凑,适合保存大容量的数据。
用文本编辑器直接打开查看也只能看到乱码。
归纳起来,FORTRAN语言的文件可以分为:有格式(顺序文件、直接文件、二进制文件);无格式(顺序文件、直接文件、二进制文件);8.1.2 文件的操作1)文件记录定位文件在存取过程中,有一个文件指针控制着读写的位置,它总是指向当前进行输入或输出的那个记录,也可以通过语句拨动指针的位置。
2)文件操作的过程打开文件:要求机器分配一个供该文件使用的I/O缓冲区。
读或写文件:将数据通过分配的I/O缓冲区向文件中读写记录。
FORTRAN语言第7章(共8章)
二维数组,其中第一个下标代表元素所在行号,第二个下 标为该元素所在列号。
第一节 数组的概念
引入数组以后,让一批同类型数据共享一个名字,不 必为每一对象都取一个名字。数组元素是按顺序号连续 存放的,我们可以用循环语句控制下标的变化,这给在 同一方式下处理多个同类型数据带来极大方便。例如: REAL P(5),AVER DO I=1,5 READ(*,*)P(I) AVER=AVER+P(I) ENDDO AVER=AVER/5 !定义P数组 !输入成绩并存入P数组 !求成绩之和 !求平均成绩
PROGRAM example
num=0 DO i=1,15
REAL a(20),sum,av
INTEGER num sum=0.0
IF (a(i)>av) num=num+1 ENDDO PRINT *,'平均值为:',av PRINT *,'大于平均值的数据个数为:,num END
DO i=1,15
只要给出数组名和下标就可以表示某一数组元素。例如:
一个班30个学生的FORTRAN语言课程成绩组成一个数组 G,每个学生的成绩可表示为:
G(1),G(2),G(3),…,G(i),…G(30)
一、变量与数组的区别 例:30个学生4门课程的成绩 S(1,1),S(1,2),S(1,3),S(1,4) S(2,1),S(2,2),S(2,3),S(2,4) …… S(30,1),S(30,2),S(30,3),S(30,4) 二、数组的分类 在上例中,区分G数组的元素需要一个顺序号(下标),故称 为一维数组;而区分S数组的元素需要两个顺序号,故称为
名字后个别说明大小 个别优于统一
上例中说明了三个整型一维数组A,B,C,一个二维实 型数组D,其中A,C各含有5个元素,B含有4个元素;D中 含有12个元素。 在说明数组时,可以在数组名后面给出维说明,这时以 该数组名后的维说明为准。
FORTRAN90实验
2.1 FORTRAN90的编程环境一、实验目的1. 掌握FORTRAN90的集成开发环境——Fortran PowerStation 4.0。
2.熟悉Fortran PowerStation 4.0的安装、启动和退出。
3.熟悉Fortran PowerStation4.0的各工具图标和菜单的作用。
4. 熟练掌握FORTRAN90程序上机实验过程。
二、实验要求1. 掌握进入Fortran PowerStation 4.0集成开发环境的方法。
2. 分别掌握用菜单、快捷键和工具栏图标进行编译和连接的方法。
3. 理解程序设计的概念,掌握FORTRAN90程序结构与书写规范。
4. 熟悉FORTRAN 90程序从输入到运行的全部操作。
5. 按照题目的要求,认真实验上机实验,并对结果进行分析。
三、实验内容1.进入Fortran PowerStation 4.0集成开发环境:开始→程序→Fortran PowerStation 4.0→Microsoft Developer Studio,单击后,进入如图2-1-1所示的FORTRAN90集成开发环境。
2. 熟悉Fortran PowerStation 4.0集成开发环境及菜单的使用: ⑴ 建立项目工作间:选择File →New →Project Workspace ,点击OK ,出现如图2-1-2所示的界面。
在Name 栏目中输入工程名SX ,点击Create ,出现如图2-1-3所示的界面。
图2-1-1 进入Fortran PowerStation 4.0图2-1-2 建立项目工作间的界面⑵ 编辑源程序:①选择菜单Insert →Files into Project ,出现如图2-1-4所示的界面。
②在File Name 栏目里键入源程序文件名EX.F90,点击OK 按钮,出现如图2-1-5所示的界面。
图2-1-3 建立项目名为SX 的工作间界面图2-1-4 插入文件的界面③单击“是”按钮,出现如图2-1-6所示的界面。
FORTRAN语言第8章(共8章)
8.2 函数子程序(外部函数)
语句函数只能用一个语句定义,而且只 能在定义它的程序段中使用。
分析:函数f(X)是用两个表达式定义的,不 能用简单的语句函数来表示。怎么办? FORTRAN提供了一种方法,就是把函数的 计算部份从程序中独立出来,并按一定的格 式编成一个单独的子程序段,称为外部函数 或函数子程序。
2、如果f(x)与f(x1)同号,则用x作为新 的x1,这就舍去了原来的(x1,x)区间。
x2 x
如果f(x1)与f(x2)异号,则它们之间的连线必然交x轴于x点 有x=x2-(x2-x1)*f(x2)/(f(x2)-f(x1)) 3、再根据新的x1,x2,找到与x轴的交点x,重复上述步骤。
LOGICAL S F(X)=X**3-2.0*X**2-7.0*X+4.0 S(A,B)=SIGN(A,B).EQ.A 10 READ(*,*)X1,X2 F1=F(X1) F2=F(X2) IF(S(F1,F2))GOTO 10
一、语句函数的概念 引例:计算W=0.2P(X)+0.3P(Y)+0.5P(Z) 其中P(T)=0.812T3+1.256T2-3.378T+0.689
WRITE(*,*)’请输入X,Y,Z的值:‘
READ(*,*)X,Y,Z
P1= 0.812*X**3+1.256*X**2-3.378*X+0.689 P2= 0.812*Y**3+1.256*Y**2-3.378*Y+0.689
语句函数小结: 在语句函数定义的语句中,也可出现其他的语句 函数引用,但被引用的语句函和须在它前面已定义。 不允许引用自身或在它后面定义的语句函数。 例:S(A, B, C) = (A+B+C) / 2.0
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
读程序写结果
khr=chr(16:16)
implicit none
character(len=16)::chr,khr,c integer::i,n,m=6 chr='!ANIHC EVIL GNOL' do i=1,m
n=len(chr)
do i=1,n khr=khr(1:i)//chr(n-i:n-i) enddo print *,khr end
输入:Good morning!
(1)去尾部空格算法:从右往左顺序查找非空格字符 (2)逆序算法:交换首尾对应元素
字符型数据作为函数过程变元
FUNCTION LENTRIM(STRING)RESULT(LENTRIM_RESULT)
IMPLICIT NONE CHARACTER(LEN=*),INTENT(IN)::STRING INTEGER::LENTRIM_RESULT,I
CHARACTER(len=7)::str
str='dfgh' print *,len (str) End
用于字符处理的内在函数
4.子串位置函数(INDEX)
INDEX(STR1,STR2):返回STR2在STR1中的 起始位置。 例:index(„follfodcfod‟,‟fod‟)值为5 例:character(len=4)::a A='fod' Index('follfodcfod',A)的值为?
类型说明
有时可把长度值写成一个星号,表示长度任意 Character(len=*)::CH,PARA Character*(*):: CH,PARA 使用范围:
(1)具有PARAMETER属性的字符常量
Character(len=*),parameter::para='FORTRAN_90' 字符串长度取对应的字符常量的长度。 (2)用字符变量作为虚元时,虚元的长度取对应实元的长度 虚元可以和任意长度的实元相结合,有利于提高子程序的通用性。
Visual Fortran 90 程序设计
8.1 字符型数据基础 8.2 字符型数据的输入输出 8.3 字符型数组
8.4 用于字符处理的内在函数
8.5 字符型数据作为过程变元及函数值
8.6 程序举例
字符子串
字符型数据又叫字符串。一个字符 串的一部分(相邻的几个字符)称为子 字符串或字符子串。
8.1 字符型数据基础
A(3: 3) ‘3‟
A(:4) A(4:) ‘1234‟ ‘456‟
A(:)
‘123456‟
8.1.3 字符表达式与赋值语句
字符表达式
用字符运算符把字符常数、字符变量、字符数组元素等字符型数 据连接起来的式子。
字符运算符
字符连接符“//” 功能:将两个字符型数据按顺序首尾连接起来,成为一个新的 字符型数据。 例:‘abc‟//‟def‟ 得 ‘abcdef‟
若w>L 右对齐,左边补w-L个空格 若w<L输出左边w个字符 CHARACTER(len=4):: X CHARACTER(len=10)::y X='BASIC' Y='FORTRAN' Print '(A7,A4)', X,Y END 输出: □□□BASI FORT A7 A4
8.3 字符型数组
原样输出
自定义格式的输出
(1)用字符型编辑符:A (2)用字符型编辑符:Aw w是规定的输出宽度
(1)字符型编辑符:A 按实际定义的长度输出
character(len=5)::a,b,c a='a1234' b='b123' c='c123456' print '(1x,3a)',a,b,c end
8.1.2 字符子串
子串:字符串中连续的一部分称为字符子串。 例:已知 A=„123456‟ 则 ‘123‟,456‟是A的子串 子串变量的写法(P201)
字符变量名(e1:e2) e1和e2为整型表达式,表示起始和终止位置。
character (len=6):: A A=„123456‟
例:子串变量写法 A(1:3) ‘123‟
48~57 65~90 97~122
8.2 字符型数据的输入与输出
表控格式输入输出
例如:CHARACTER(len=5)::A,B,C Read *,A,B,C Print *, A,B,C 输入: ‘CHINA‟,‘NEW‟,‘SHANGHAI‟ 结果: A值 CHINA ;B值NEW ;C值SHANG 注意: 各输入项之间应用逗号或空格分隔。
程序举例
例: 验证一字符串是否为“回文”。
算法: 去尾部空格 首尾对应字符比较
CHARACTER(len=80)::LINE INTEGER::I,J LOGICAL::L READ*,LINE J=LEN_TRIM(LINE) L=.TRUE.
程序举例
DO I=1,J/2 IF( )THEN L=.FALSE. 第I次比较 EXIT ENDIF ENDDO IF(L==.true.)THEN PRINT*,TRIM(LINE),'IS A HUIWEN' ELSE PRINT*, TRIM(LINE),'IS NOT A HUIWEN' ENDIF END LINE(I:I)/=LINE(J-I+1:J-I+1)
ENDDO
WRITE(*,‟(A‟)CITY END
IF(CITY(J)<CITY(K))K=J
ENDDO
TEMP=CITY(I);CITY(I)=CITY(K);CITY(K)=TEMP
8.5 字符型数据作为函数过程变元
1.字符型变量作为虚元: 可采用固定长度,长度说明也可采用(*)。 例8-7 编写函数子程序,实现字符内在函数LEN_TRIM的功能。 在主程序中输入一个字符串,对去掉尾部空格部分的字符子串中 的字符逆序存放后输出。
A B C
8.1.4 字符表达式
关系运算:
例:‘abc‟<„ada‟
比较规则: 1.两个字符比较时,以它们的ASCII码值决定大小。
2.字符串比较:从左到右逐个字符进行比较,比到不相同的为止
3.若两个字符串中字符个数不等时,则将较短的字符串后补足 空格后再比较。
ASCII顺序:空格
32
0~9 , A~Z , a~z
LENTRIM_RESULT=0
DO I=LEN(STRING),1,-1 IF(STRING(I:I)/=' ')THEN
LENTRIM_RESULT=I
EXIT ENDIF ENDDO; END
字符型数据作为函数过程变元
PROGRAM CHAR_INVERSE IMPLICIT NONE CHARACTER(len=20)::STRING1,C*1 INTEGER::I,K,LENTRIM READ'(A)',STRING1 K=LENTRIM(STRING1) DO I=1,K/2 C=STRING1(I:I) STRING1(I:I)= STRING1(K-I+1:K-I+1) STRING1(K-I+1:K-I+1)=C ENDDO; PRINT*,STRING1; END
(2)字符型编辑符:Aw
格式:[r]Aw
w:字符的个数(域宽)
字符变量的输出 若W=L(定义的长度),按域宽输出字符串
CHARACTER(len=4):: X CHARACTER(len=10)::y X='BASIC' Y='FORTRAN' WRITE(*, ‘(A4,A10)’)X,Y END 输出:BASIFORTRAN□□□
8.6 程序举例
例8-11 统计英文文章中单词及空格的个数。
共N行,每行40个字符
算法: 按行统计,计数器语句统计个数 NW=NW+1 NB=NB+1 引入标记变量标记是否是单词的首字母: LABEL=0 当前是空格
LABEL=1
当前是字母
首字母: 前一次LABEL=0 ,当前LABEL=1
程序举例
如果具有Dimension属性,就成为字符数组。 例: character(len=3),dimension(4)::a A的每个元素的长度均为3
A(1)(1:1)表示A(1)中的第1个字符
例8-4 用自定格式输入和输出字符型数据。 CHARACTER(LEN=1),DIMENSION(1:7)::A READ'(7A1)',(A(I),I=1,7)
程序设计
例8-5 从键盘上输入5个城市的名称(用汉语拼音表示),然后按从 小到大的顺序排序。(排序算法同数值型) 输 入:’Harbin‟,’Shanghai‟,’Anda‟,’Beijing‟,’Daqi ng‟ CHARACTER(10),DIMENSION(5)::CITY CHARACTER(10)::TEMP READ*,CITY DO I=1,4 K=I DO J=I+1,5
字符型赋值语句
写法 :字符变量或子串变量V=字符型表达式e 功能:计算e;转化为V的长度;赋值 例:character (character (len=3):: SHORT
LONG=„ABCD‟; SHORT =„ABCDEF‟
LONG: A B C D SHORT:
do i=3,1,-1
print '(1x,7a1)',a(1:7:i) enddo end
8.4 用于字符处理的内在函数
1.求字符串长度函数 LEN:字符串的长度 例:LEN(„ASD ‟) 值6 ‟) 值3 LEN_TRIM:去掉尾部空格后的长度。 例:LEN _TRIM(„ASD 2.除去字符串尾部空格函数(TRIM) 例:TRIM(„ASD 例: ichar(„A‟):65 char(65):A 例:char(ichar('a')+4)//'123'的值为? ‟) 值ASD 3.字符与码值转换函数(Ichar,iachar,char,achar) ichar(„REST‟):82