Fortran 第六讲

合集下载

FORTRAN90第6章2

FORTRAN90第6章2

关键字变元调用举例
例如:Subroutine HF(A,B,M,N) Call HF(5,25,10,1) 使用关键字变元调用可写成: Call HF(B=25,M=10,A=5, N=1) Call HF(5,25, N=1,M=10)
Call HF(5,25, M=10,1) ?

主程序中必须有接口块 interface subroutine HF(A,B,M,N) integer:: A,B,M,N end subroutine end interface
6.6 模块

模块也是一种独立编写的程序单元
模块包含程序说明语句及在模块内定义的过程,但
不能直接运行
假设有几个子程序或函数中都用到了同一些变量,
只需把它们放在一个模块中,从而实现共享数据。
6.6.2模块的引用
USE语句位置:各单位用USE语句共享模块
中的信息,通常在程序单元说明部分的最前 面,即单位定义语句之后,IMPLICIT NONE 语句之前
说明cos和sin是内部 函数,不是一般变量。
外部函数作为实过程(例6-10)
设有一个过程PROC,在调用它的时候,每 次实现不同的功能。输入A和B两个数,第一
次调用时求出A、B之和,第二次调用时求出
A、B之差。程序如下:
PROGRAM ACTUAL_PROCEDURE INTEGER,EXTERNAL::SUM,MINU IMPLICIT NONE 等价 INTERFACE FUNCTION SUM(X,Y) RESULT(SUM_RESULT) INTEGER,INTENT(IN)::X,Y INTEGER::SUM_RSULT END FUNCTION SUM FUNCTION MINU(X,Y) RESULT(MINU_RESULT) INTEGER,INTENT(IN)::X,Y INTEGER::MINU_RESULT END FUNCTION MINU 使用接口块说明 END INTERFACE SUM和MINU是 INTEGER::A,B 外部函数,不是 READ*,A,B 一般变量。 CALL PROC(A,B,SUM) CALL PROC(A,B,MINU) END PROGRAM ACTUAL_PROCEDURE

Fortran6

Fortran6

6.2
格式输入输出语句
LOGO
u 是设备号,用于表明具体使用的输入设备。u 是设备号, 用于表明具体使用的输入设备。 可以是一个无符号整常量, 可以是一个无符号整常量 , 也可以是一个整型 变量或整型表达式,还可以是“ 变量或整型表达式 , 还可以是 “ * ” 。 “ * ” 表 示有计算机系统预先约定的外部设备, 示有计算机系统预先约定的外部设备 , 一般为 键盘。 键盘。 输入项指定了输入的具体内容。 输入项指定了输入的具体内容 。 输入项可以是 变量,可以是隐含do循环, do循环 变量 , 可以是隐含 do 循环 , 不允许是常量或表 达式。 达式。
write(*,10) a,b format(1x,E12.4, 10 format(1x,E12.4,E13.2) .80E□ □ □.1284E+03 □ □ □ □ □ -.80E-03 A:128.433;B: -0.0008 128.433;
输入: 输入:与F编辑符完全相同。 编辑符完全相同。 输出:采用规格化的指数形式, 输出:采用规格化的指数形式,即数字部分小数前面 小数点后面第一位为非0 为0,小数点后面第一位为非0数字,指数部分占四列 指数符号及两位指数) (E、指数符号及两位指数)。若输出项数字部分的小 数位数多于d 保留d 小于d 在右边补0 数位数多于d位,保留d位,小于d位,在右边补0。若 输出项实际的位数小于w 左补空格,否则输出w 输出项实际的位数小于w,左补空格,否则输出w个*。
6.4
常用的编辑描述符
LOGO
F型输出规则: 输出规则: 规则
把输出项的值换成字段宽度为w的小数形式输出, 把输出项的值换成字段宽度为w的小数形式输出, 小数部分占 小数点1 小数部分占d位,小数点1位。 若输出项小数部分实际位数小于d,小数部分低位 输出项小数部分实际位数小于 小数部分实际位数小于d 补0;否则从d+1位四舍五入,保留d位。 否则从d+1位四舍五入,保留d d+ 若输出项实际长度小于w 则在左侧用空格补足。 若输出项实际长度小于w,则在左侧用空格补足。 否则输出w 说明w定义太小。 否则输出w个*,说明w定义太小。

fortran语言教程第6章

fortran语言教程第6章

第6章数组应用6.1 数组与数组元素数组是由任何一种简单数据类型按照一定的组织规则构造出来的数据类型,是有序数据的集合。

数组中可以包含很多个同类型的变量,我们把这些变量叫做“数组元素”或“数组分量”或“下标变量”。

在机器中数组占用一片连续的存贮单元,每个单元都用同样的名字(即数组名)但编号不同。

数组的命名方式与简单(基本)变量命名方式相同。

假设有数组A,占据4个存储单元,元素在内存中的排列可形象表示出来:AA(1),A(2),A(3),A(4)A(1,1),A(1,2),A(2,1),A(2,2)每个单元的编号方式可以有多种,第一种用一个数字来编号称为一维数组,第二种用两个数字来编号称二维数组。

可以推广,用N个数字对数组的元素编号则称为N维数组。

数组使用之前一定要说明,事先告诉机器数组的类型,包含分量的个数,分量的编号方式等,以便机器为数组预留内存空间。

6.1.1数组的说明数组的说明应该包括以下几个方面的内容:•确定数组的名称;•确定数组元素的类型;•确定数组的结构(包括数组维数,每一维的取值范围等内容)。

说明语句的形式有:(1)类型说明语句:说明数组的类型和元素个数类型标识符数组名1 (维说明1[,维说明2,...])[,数组名2...](2)DIMENSION语句:只说明数组元素个数DIMENSION数组名1 (维说明1[,维说明2,...])[,数组名2...]其中“维说明”的形式:维下界∶维上界(或下标下界∶下标上界)例如:REAL A(1:10),B(80:90),C(-5:4),NUM1(1:2,1:5)INTEGER D(0:1,0:4),NUM2(2:5)DIMENSION S(3:5), M(1:10)说明语句中的A,B,C,D,NUM1,NUM2等都是数组名,数组名不能与本程序单位中的其他任何标识符重复。

通过“维说明”可以确定数组维数,每一维的取值范围等内容。

同一维的上下界之间用冒号分开;括号中至少要有一个维说明,也可以有多个。

第六讲 Fortran中的子程序

第六讲 Fortran中的子程序

一、子例行程序的定义
子例行程序是以Subroutine 语句开头,并以End语句结束的一 个程序段,其定义的一般格式为:
Subroutine 子例行程序名(虚参表)
子例行程序体 end
2015/12/20 12
注意: (1)子例行程序的命名方法与变量相同。虚参由变量、数组 名(不能是数组元素,常数、表达式)充当,当有多个虚参 时,之间用“ ,” 分隔,没有虚参时子例行程序名后面的一对 括号可以省略; (2)子例行程序的设计方法与函数子程序相同,但不能有对 子例行程序名的赋值语句(因为其名字没有值)。
第六讲 Fortran中的子程序
实际中的程序由若干个程序单元组成,但是有且只有一个主 程序( Program main ),其它的都是子程序。子程序是构造 大型实用程序的有效工具,设计程序要善于利用子程序,因 此,本讲学习Fortran中的子程序:函数子程序和子例行程序。 此外,在Fortran中还有一种类似与函数子程序的语句函数。
2015/12/20 15
分析:牛顿迭代公式为:
program newton f(x)=7*x**4+6*x**3-5*x**2+4*x+3 f ( xn ) df(x)=28*x**3+18*x**2-10*x+4 xn 1 xn ' f ( xn ) read*,x0,e !x0=-1.0,e=0.0001 x1=x0 首先要给个迭代初值 x0 , x2=x1-f(x1)/df(x1) 代入公式的右边计算 x1 , do while(abs(x1-x2)>e) 再把 x1 代入计算出 x2 , … , x1=x2 x2=x1-f(x1)/df(x1) 当第n次和第(n+1)次计算 end do 结果差不多时(在规定的 print*,x1,f(x1) 精度内),则计算结果就 end

6 Fortran 程序设计6-文件

6 Fortran 程序设计6-文件

6 Fortran 程序设计6-文件6 Fortran 程序设计 6 文件在 Fortran 程序设计中,文件的处理是一个重要且实用的部分。

文件可以帮助我们存储和读取大量的数据,使得程序能够处理复杂和大规模的信息。

首先,让我们来理解一下什么是文件。

简单来说,文件就是在计算机存储设备上存储的数据集合。

在 Fortran 中,文件可以是文本文件,也可以是二进制文件。

文本文件中的数据是以人类可读的字符形式存储的,比如数字、字母和符号。

二进制文件则是以计算机内部的二进制形式存储数据,通常更节省空间并且读取和写入速度更快,但对于人类来说不太直观。

那么,如何在 Fortran 中打开和关闭文件呢?这就需要用到一些特定的语句。

我们使用 OPEN 语句来打开一个文件,并指定一些相关的参数,比如文件的名称、访问模式(读、写、读写等)、文件的格式等。

而当我们完成对文件的操作后,使用 CLOSE 语句来关闭文件,以释放相关的资源并确保数据的正确保存。

接下来,谈谈文件的读取操作。

对于文本文件,我们可以使用READ 语句逐行或者按照特定的格式读取数据。

在读取数据时,需要注意数据的类型和格式与我们程序中的变量相匹配,否则可能会导致读取错误。

而对于二进制文件的读取,通常需要使用专门的二进制读取函数,并要准确地了解文件中数据的存储结构。

写入文件也是常见的操作。

同样,对于文本文件,可以使用WRITE 语句将数据以文本形式写入。

在写入时,可以控制数据的格式和输出的位置。

二进制文件的写入则需要使用相应的二进制写入函数,并且要确保数据的正确转换和存储。

在处理文件时,还需要注意一些错误情况。

比如,文件可能不存在、无法打开、读写权限不足等。

Fortran 提供了一些机制来检测和处理这些错误,通过检查相关的状态变量或者使用特定的错误处理语句,我们可以让程序在遇到问题时能够做出适当的反应,而不是直接崩溃。

另外,文件的访问模式也有多种选择。

只读模式(READONLY)允许我们只能从文件中读取数据;只写模式(WRITEONLY)则只能向文件中写入数据;读写模式(READWRITE)则既可以读也可以写。

Fortran 第六讲

Fortran 第六讲

SUM (ARRAY,MASK) 计算ARRAY中MASK为真的元素的和。MASK为 可选的,如果不提供,计算数组中所有元素的和
TRANSPOSE(MATRIX) 将MATRIX转置后返回
更多的变换函数可以参考教材的附录A的数组函数 部分
这些函数都很有用,我们在以后的例程或习题会涉 及到一部分,请诸位养成查阅这一附录的习惯
说明: WHERE结构中的每个mask_expr是一个逻辑数组, 它应该确保和数组执行语句中处理的数组具有同 样的结构。 WHERE结构使得语句体1中的操作或操作集用于 mask_expr1为TRUE的所有数组元素上,语句体2 中则作用于mask_expr1为FALSE而mask_expr2为 TRUE的所有数组元素上,最后,语句体3作用于 mask_expr1和mask_expr2均为FALSE的所有数组 元素上
6.3 WHERE结构
6.1中,我们学习了如何操作部分数组 INTEGER :: a(10) a(3:5)=3 将a(3),a(4),a(5)赋值为3
如果我们要对满足某个条件的所有元素进行操作 WHERE (a<0) a=ABS(a) END WHERE 将a中所有小于0的元素取绝对值
一般形式 [name:] WHERE (mask_expr1) 数组操作语句体1 ELSEWHERE (mask_expr2) [name] 数组操作语句体2 ELSEWHERE [name] 数组操作语句体3 END WHERE [name]
动态分配一个二维数组 通过status返回分配状态 如果分配成功,status为0,否则不为0
总是使用STAT=status监视分配状态,以便准确知道 程序异常终止的原因
ALLOCATED()函数 ALLOCATED(array) 如果已经用ALLOCATE()给ARRAY分配了空间 那么函数返回值是.TRUE. 否则为.FALSE. 例: IF (ALLOCATED(array)) THEN array=1 ELSE WRITE(*,*) ‘Warning : Array not allocated!’ END IF

Fortran PPT课件 (6)IF基本用法

Fortran PPT课件 (6)IF基本用法

.EQV.
.NEQV.
两边的表达式逻辑运算结果相同,整个表达式成立
两边的表达式逻辑运算结果不相同,整个表达式成立 运算优先级低于大于小于和等式的运算符号
2.2 IF分支结构
OR “或者”,只要一边成立即为真
2.2 IF分支结构
【.NOT.】 只跟一个ห้องสมุดไป่ตู้达式在后面,把原本的逻辑结果取反 (.not. 3>5) !3>5 不成立,经过.not.取反为‘真’ (.not. 1<2) !1<2成立,取反后为‘F’
2.2 IF分支结构
【.EQV.】
逻辑A TRUE TRUE FALSE FALSE
逻辑B TRUE FALSE TRUE FALSE
A .EQV. B TRUE FALSE FALSE TRUE
(1>3 .EQV. 2>3) (1>3 .EQV. 2<3)
!两边都不成立,表达式为真 !两边结果不同,表达式为假
2.2 IF分支结构
各种运算符的优先级
运算类别 括号 算术运算符 运算符 ( ** *, / +, .GT. , .GE., .LT., .LE. ,.EQ. , .NE. .NOT. .AND. .OR. .EQV., .NEQV. ) 优先级 1 2 3 4 5 6 7 8 9
关系运算
集合逻辑运算
endif逻辑成立执行这一块代码逻辑不成立执行这一块代码双分支条件22if分支结构模块内的执行语句后缩便于阅读和分辨22if分支结构fortran90fortran77判断是否?相等?
2.2 IF分支结构
IF基本用法
IF(逻辑判断式) THEN … 逻辑成立时,才会执行这里的程序代码 … … END IF

FORTRAN语言第6章(共8章)

FORTRAN语言第6章(共8章)

F编辑符应用实例 A=2.0 B=3.14 S=A*B WRITE(*,10)A,B,S 10 FORMAT(1x,F6.2,F6.2,F6.2) Δ Δ 2.00 Δ Δ 3.14 Δ Δ 6.28 END
d大于实际需要输出的实数小数部分的位数
F编辑符应用实例 A=2.0 B=3.145 S=A*B WRITE(*,10)A,B,S 10 FORMAT(1x,F6.2,F6.2,F6.2) Δ Δ 2.00 Δ Δ 3.15 Δ Δ 6.29 END
第六讲
格式输入输出
输入输出的三种不同的格式: 1.表控格式的输入输出 按照系统隐含的标准格式在默认的I/O设备上进行I/O操作。
按照用户要求的格式在指定的I/O设备上进行数据I/O操作。 2.有格式的输入输出
3. 不管数据的具体类型,一律以二进制的形式进行I/O操作 。 无格式的输入输出
要素:
1.在什么外部设备上输入或输出
A=Δ Δ 2.00 B= Δ Δ3.14 S= Δ Δ 6.28
记录1
记录2 记录3
一个WRITE语句输出打印了三行信 息,这是由于FORMAT语句中有两 处斜杠,使之产生三个输出记录 (注意,斜杠之后也有一个“1X”, 使第二个记录的第一个字符为“空 格”,作为纵向走纸符)。
3、斜杆描述符(/)
第二节

格式说明语句
格式说明语句(FORMAT语句)是非执行语句,它只是
给输入输出语句提供数据的格式描述。在程序运行
过程中,由输入输出语句根据格式说明语句提供的 数据格式描述,实现数据的格式控制。单独的格式 说明语句在程序中不起任何作用。

格式说明语句可以放在程序单位语句(PROGRAM语句 或子程序FUNCTION或SUBROUTINE语句)之后,END语 句之前的任何位置。

资料-+-Compaq--Visual-Fortran--6--教程

资料-+-Compaq--Visual-Fortran--6--教程
提倡使用具有一定含义的名字,提高程序的清晰度和可 读性。
2.3.5 变量
1、定义:程序运行过程中值可变化的量
2、命名的规则
字母、数字、下划线组成
字母开头
长度1-31个
错例 3A 、 x-3 、3.14 、A3 $
3、变量含义:实际是内存中的一个存储单元,存放变 量的值。
特性:取之不尽,一冲就跑,总采用当前值参与运算。
2.3.6 派生数据类型
根据需要而由基本数据类型定义新的数据类型。在一个 派生类型中可包含多个基本类型。 如:
TYPE STUDENT (定义开始) CHARACTER(LEN=20)::DEPARTMENT CHARACTER(LEN=10)::CLASS CHARACTER(LEN=15)::NAME INTEGER::NUMBER (成员定义)
Visual Fortran 90 程序设计
编译器简介 §2.1Fortran语言的发展
§2.2源程序及其构成 §2.3 语言元素
§2.4 程序单元概念
三、开发自己的简单应用程序
1、运行Visual Fortran 6.6(Fortran PowerStation 4.0) 2、文件——新建——Workspaces标签:
书写格式
1. !Free Format 2. program main 3. write(*,*)”Hello” !这也是注释 4. write(*,*)& 5. ”Hello” 6. wri& 7. &te(*,*)”Hello” 8. end
如果把Fortran的关键字分为两行书写,则两行都要加续行符号。 如6、7行。
F格式(又叫小数型格式)
一般形式:Fw.d w各数值占的总位数 ,d 输出数据的 小数位数(小数点后的位数)。

资料-+-Compaq--Visual-Fortran--6--教程

资料-+-Compaq--Visual-Fortran--6--教程
Fortran90的语言元素是指在程序设计中所用到的基本 成分,例如字符集、常量、变量、记号以及其它的基本结构等。 只有了解并掌握了这些基本要素,才可能正确自如地使用该种 语言。
2.3.1 FORTRAN90字符集:
编写Fortran90程序时,所能使用的所有字符及符号。 ⑴A~Z(a~z)程序中不区分大小写 26个 在大多数处理系统中允许使用小写字母,除了字符 串内的字符外,小写字母等价于相应的大写字母。
执行 连接
编译Leabharlann 注意: 1)所移去的文件仅从此项目中移去,目录下该文件
仍 然存在。 2)所重复的不得与以前的文件名同名。
7、下次重新修改程序时,可直接使用菜单 File/Open Workspace来打开*.dsw的工程文件。
第二章
FORTRAN语言的发展简史
§2.1 Fortran语言的发展简史
5、输入文件内容、存盘(文件菜等) 注意自由格式和固定格式输入的区别。
6、Build—Compile:编译 Build—Build: 连接 Build—Exetuce: 运行
重复3~6进行第二个源程序 (注意一个项目中只能含有1个主程序文件,不能将两个独 立的程序文件放入同一个项目中,否则会导致编译错误。) 或用DEL移去已建立的文件,重复4~6
全局名:主程序单元、外部过程、数据块、模块
2.3.2 记号
在Fortran90中,将字母、数字或专用字符的基本有效的序列称为 记号,它包括标号、关键字、名字、常数、运算符和定界符。例如:
A * SIN(x)+5.3 这个表达式包括6个记号,即A、*、SIN、x、 +、5.3。 注意:
在字符串内部,不能随意地添加空格。 在记号内部,也不许随意地使用空格。 记号与记号之间的空格可以随意地使用。 多个空格在语法上与一个空格的作用相同。 一个记号与相邻关键字、名字、常数或标号之间,应当用一个或多个 空格分开,以避免错误,同时也使结构清晰。

fortran6

fortran6

工程分析程序设计上机作业(六)数组(2)上机目的:练习数组的声明、存储、操作,以及数组参数、动态数组、数组函数的使用。

1、从键盘上输入10个整数,然后逆序打印出来。

program mainreal,dimension(10) ::aprint*,'input 10 numbers'read*,(a(i),i=1,10)print*,(a(10-i),i=0,9)end2、输入任意n个数存放在数组中(如5个数1、2、8、2、10),请在屏幕上打印如下方阵1 2 8 2 1010 1 2 8 22 10 1 2 88 2 10 1 22 8 2 10 1program mainreal,dimension(5) ::aprint*,'input 5numbers'read*,(a(i),i=1,5)print*,aprint*,a(5),a(1),a(2),a(3),a(4)print*,a(4),a(5),a(1),a(2),a(3)print*,a(3),a(4),a(5),a(1),a(2)print*,a(2),a(3),a(4),a(5),a(1)endOrprogram mainimplicit nonereal::a(5)=(/1,2,8,2,10/)real binteger ido i=1,5print*,ab=a(1)a(1:4)=a(2:5)a(5)=bend doend3、用选择法进行排序:假定A数组中有n个数,设定两个变量P和J,J按顺序从数组开头指向数组的各个位置(也就是应该存放数据的位置),P则指向剩余的数据中最小的数。

然后把J指向的元素和P指向的元素进行比较大小,若P指向的元素更小,则把二者对换。

如此把J从1号位向后移动至数组末尾,则完成了排序。

例如第一步:15 8 4 10 1J P J指向1号位,P指向2~5号位的最小值5号位的1,二者对换。

Fortran课件6

Fortran课件6
14
4. 字符表达式和字符关系表达式
Fortran77的字符表达式只有“//”运算。 character*25 name,name1 name='Fortran Powerstation4.0' name1=name(9:20)//' '//name(1:7) $ //name(21:23) write(*,*) '-',name,'-' write(*,*) '-',name1,'-' end Powerstation Fortran4.0name1
不要漏 撇号!
输入 ’Wuhan’,’Shanghai’, ’Lasa’ 效果相同
13
3. 子字符串
即一个字符串的一部分。
$
character name*25,str1*7,str2*7,str3*12 character str4*5,str5*25,str6 name='Fortran Powerstation4.0' str1=name(1:7) Fortranstr1 str2=name(:7) Fortran str2 str3=name(9:20) Powerstationstr3 str4=name(21:) 4.0 □ □ str4 str5=name(:) Fortran Powerstation4.0 str6=name(9:9) □ □ str5 write(*,*) str1,'-',str2,'-',str3, P str6 '-',str4,'-',str5,'-',str6 Powerst name(1:7) write(*,*) '-',name,'-' name(1:7)=name(9:20) write(*,*) '-',name,'-' end 子串不能互相覆盖。可用 a=name(12:23) name(9:16)=a

Fortran的数据结构第六章

Fortran的数据结构第六章
§3 复型数据
2011-4-11
11 可以直接把复型常数赋给复型变量。 可以直接把复型常数赋给复型变量。 如:complex c , d c=(3.0 , 6.3) d=(8.75e+5 , -67.8e-3) 但是,若复型常数中的实部或虚部不是常数, 但是,若复型常数中的实部或虚部不是常数,而是表 达式,则须用cmplx函数将实部和虚部组成复型数后再赋 函数将实部和虚部组成复型数后再赋 达式,则须用 函数 给复型变量。 给复型变量。 × 如:c=(3.0*2 , 6.3+1.7) * c=cmplx(3.0*2 , 6.3+1.7) * √ 函数中只有一个自变量时, 当cmplx函数中只有一个自变量时,则它代表实部,虚 函数中只有一个自变量时 则它代表实部, 部为0。 部为 。 如:c=cmplx(3.0) ⇒ c=(3.0 , 0.0) §3 复型数据
§4 四种数值型数据之间的运算和转换规则
2011-4-11
14
1. 加减乘除的运算规则 设进行a+b、a-b、a*b、a/b,则运算规则为: 设进行 、 、 * 、 ,则运算规则为:
b类型 类型 结果 a类型 类型 类型
15
整 整 实 双 复
型 实
型 双精度型 双 双 双 复⊗


整 型 实 型 双精度型 复 型
6
§1 数据结构
2011-4-11
双精度类型数据(p129 (p129§2 双精度类型数据(p129-130)
7
双精度型数据的有效位数和范围是实型数据的两倍, 双精度型数据的有效位数和范围是实型数据的两倍, 在计算机中,以两倍于实型的字节数来存储一个双精度数。 在计算机中,以两倍于实型的字节数来存储一个双精度数。 一、双精度型常数 必须用指数形式表示 将实数的e或 换成 用指数形式表示, 换成d或 即可 即可。 必须用指数形式表示,将实数的 或E换成 或D即可。 中可表示为实型或双精度型: 如12.3456789在Fortran中可表示为实型或双精度型: 在 中可表示为实型或双精度型 表示为实型: ①表示为实型:12.3456789或1.23456789e1。 或 。 表示为双精度型: ②表示为双精度型:1.23456789d1。 。 注意① 两种表示的区别:设实型为7位有效数字 位有效数字, 注意①和②两种表示的区别:设实型为 位有效数字, 双精度型为15位有效数字 位有效数字, 双精度型为 位有效数字,则: 实际表示的数为12.34568(共7位有效数字) 位有效数字) ①实际表示的数为 ( 位有效数字 实际表示的数为12.3456789000000(15位有效) 位有效) ②实际表示的数为 ( 位有效

F90第六章

F90第六章

IF (A>B .AND. A>C) IF (A>B .AND. A>C) IF A.GT.Max Max=A
第六章 选择结构程序设计
逻辑IF IF语句 6.2 逻辑IF语句
语法 说明 示例
max=A B>max
6.2 逻辑IF语句/示例 逻辑IF语句/ IF语句
已知三个整数A,B,C,输入其值并打印三个数中最大值。 已知三个整数A,B,C,输入其值并打印三个数中最大值。 A,B,C,输入其值并打印三个数中最大值
第六章 选择结构程序设计
6.3 块IF语句 IF语句
基本IF语法 基本IF语法 IF 选择结构类型 基本IF示例 基本IF示例 IF 多支IF语法 多支IF语法 IF 多支选择结构 多支IF示例 多支IF示例 IF 嵌套IF说明 嵌套IF说明 IF
真 S<60 假 真
6.3 块IF语句/多支IF示例1 IF语句 多支IF示例1 语句/ IF示例
多支选择结构是一个嵌套的选择结构,及块IF 多支选择结构是一个嵌套的选择结构,及块IF 语句中又包含块IF语句。 IF语句 语句中又包含块IF语句。
真 e1 假 真 e2 假 真 e3 假
真 语句体1 语句体1 语句体2 语句体2 语句体3 语句体3 语句体n 语句体n
en
假 语句体n+1 语句体n+1
6.2 逻辑IF语句 逻辑IF IF语句
示例: 示例: READ *,i,j IF(i<j) PRINT *,I *,‘逻辑IF语句执行结束 逻辑IF语句执行结束。 PRINT *, 逻辑IF语句执行结束。’ END
第六章 选择结构程序设计
逻辑IF IF语句 6.2 逻辑IF语句
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

释放内存:DEALLOCATE
使用可分配数组的程序或过程的最后应该释放内存 使这些内存可以再次使用 DEALLOCATE(arr1,[arr2,arr3,…,STAT=status]) 例: DEALLOCATE(arr1,STAT=status) 始终记得在使用完成后用DEALLOCATE释放内存
example: INTEGER :: info(9) info=(/1,-3,0,-5,-9,3,0,1,7/) WHERE (info>0) info=-info ELSEWHERE info=-3*info END WHERE WRITE (*,*) info
单行WHERE语句
WHERE (mask_expr) Array Assignment Statement
6.3 WHERE结构
6.1中,我们学习了如何操作部分数组 INTEGER :: a(10) a(3:5)=3 将a(3),a(4),a(5)赋值为3
如果我们要对满足某个条件的所有元素进行操作 WHERE (a<0) a=ABS(a) END WHERE 将a中所有小于0的元素取绝对值
一般形式 [name:] WHERE (mask_expr1) 数组操作语句体1 ELSEWHERE (mask_expr2) [name] 数组操作语句体2 ELSEWHERE [name] 数组操作语句体3 END WHERE [name]
6.1.2 内置函数对数组的作用
多数内置函数都接受数组作为输入参数 返回结果为数组 内置函数对数组的作用是逐个应用到数组的元素
REAL :: a(4)=(/-1.,2.,-3.,4./) a=ABS(a)
6.1.3操作部分数组
部分数组(局部数组): 下标用下标三元组(下标向量)来指定: 常见形式: 下标1:下标2:下标增量 以上三个部分构成一个三元组,都可以缺省 如果缺省下标1,那么默认为数组中本 维度第一 个元素的下标 如果缺省下标2,那么默认为数组中本维度最后一 个元素的下标 如果缺省下标增量,默认为 1
解决方案是采用动态内存分配数组
实现方法: 分配:ALLOCATABLE和ALLOCATE() DEALLOCATE
例: INTEGER,ALLOCAT ABLE:: a(:) INTEGER :: i read (*,*) i ALLOCATE(a(i)) 分配了一个一维数组,数组大小从键盘输入
REAL,ALLOCATABLE :: a(:,:) INTEGER :: i=100,j=500,status ALLOCATE(a(i,0:j),STAT=status)
DOT_PRODUCT(VECTOR_A,VECTOR_B) 计算两个大小相等的向量的点积 参数是两个元素个数相等的一维数组
MATMUL(MATRIX_A,MATRIX_B) 计算两个矩阵的叉积 参数必须是两个可以叉乘的矩阵
MASK 与 mask_expr 在此后的学习中,经常会见到以上两个形式 MASK=mask_expr mask_expr是说明掩码的逻辑数组 这个数组的所有元素都是逻辑值 例: INTEGER :: a(5)=(/1,2,3,4,5/) LOGICAL :: b(5) b=a>3
说明: WHERE结构中的每个mask_expr是一个逻辑数组, 它应该确保和数组执行语句中处理的数组具有同 样的结构。 WHERE结构使得语句体1中的操作或操作集用于 mask_expr1为TRUE的所有数组元素上,语句体2 中则作用于mask_expr1为FALSE而mask_expr2为 TRUE的所有数组元素上,最后,语句体3作用于 mask_expr1和mask_expr2均为FALSE的所有数组 元素上
Fortran程序设计
第六讲 数组(二)
回顾第五讲
数组 定义、改变下标范围的定义 三种初始化方法 和变量一样使用 数组在内存中是如何存储的
防止使用中产生数组的越界
在数组初始化中,引入隐式DO循环
隐式DO循环在IO语句中的应用
FORMAT进阶
第六讲

如何对整个数组或数组的一部分进行操作 如何对数组使用Fortran内置函数 WHERE语句的用法 FORALL结构的用法 如何定义可变大小的数组
WHERE(a<0) a=-a
6.4 FORALL结构
FORALL 结构也可以对部分数组元素操作 被操作的元素通过下标索引和逻辑条件进行选择 [name:]FORALL (in1=triplet1,[in2=triplet2,…,logical_expr]) statement 1 statement 2 … statement n END FORALL [name]
6.2.3 变换内置函数


有一个或多个数组作为参数的函数,变换内置函 数操作整个数组 输出与输入参数可能没有相同的结构
RESHAPE(SOURCE,SHAPE) 这个上次课讲过了 将SOURCE的元素按照SHAPE重新构建一个新的数 组 RESHAPE((/1,2,3,4,5,6/),(/2,3/)) 将一维数组(1,2,3,4,5,6)构造为2X3的二维数组
动态分配一个二维数组 通过status返回分配状态 如果分配成功,status为0,否则不为0
总是使用STAT=status监视分配状态,以便准确知道 程序异常终止的原因
ALLOCATED()函数 ALLOCATED(array) 如果已经用ALLOCATE()给ARRAY分配了空间 那么函数返回值是.TRUE. 否则为.FALSE. 例: IF (ALLOCATED(array)) THEN array=1 ELSE WRITE(*,*) ‘Warning : Array not allocated!’ END IF
三大内置函数: 基本函数 查询函数 变换函数
6.2.1基本内置函数
使用标量参数的函数,也可以用数组作为参数 使用标量作为参数时,函数返回值是标量 使用数组作为参数,函数返回相同结构的数组 ABS LOG SIN LOG10 COS MOD TAN SQRT EXP
6.2.2 查询内置函数
6.1.1 对整个数组的操作
不带下标的数组名引用,视为对整个数组的引用 INTEGER :: a(5) WRITE (*,*) a 会依次输出a的每个元素值
a=1 将a的每个元素赋值1
结构一致的数组可以直接算术运算 INTEGER :: a(5),b(5),c(5) a=1 b=2 c=a+b a和b对应的元素相加后放到c对应的位置 c=a-b c=a*b c=a/b
SHAPE(SOURCE) 返回数组SOURCE的结构 INTEGER :: a(-3:7,0:8)
SHAPE(a) ?
SIZE(ARRAY,DIM) 如果给出了维度,返回该维度的宽度 否则返回数组中元素的个数
INTEGER :: a(-3:7,0:8) SIZE(a,1) SIZE(a) ? ?
ALL(MASK) 如果数组MASK中的所有元素值都为真,逻辑函 数返回TRUE ANY(MASK) 如果数组MASK的任意元素值为真,逻辑函数返 回TRUE COUNT(MASK) 返回数组MASK中为真元素的个数
MAXLOC(ARRAY,MASK) 返回MASK为真对应的ARRAY中的元素的最大值 的位置,结果是带有一个元素的一维数组,这个 数组元素是ARRAY中的下标值,MASK是可选的 MAXVAL(ARRAY,MASK) 返回MASK为真对应的ARRAY中的元素的最大值 MINLOC(ARRAY,MASK) 参考MAXLOC MINVAL(ARRAY,MASK) 参考MINVAL
SUM (ARRAY,MASK) 计算ARRAY中MASK为真的元素的和。MASK为 可选的,如果不提供,计算数组中所有元素的和
TRANSPOSE(MATRIX) 将MATRIX转置后返回
更多的变换函数可以参考教材的附录A的数组函数 部分
这些函数都很有用,我们在以后的例程或习题会涉 及到一部分,请诸位养成查阅这一附录的习惯
INTEGER::a(10) 以下部分应用的含义? a(:) a(3:7) a(3:7:2) a(3:) a(:7) a(::3)
INTEGER :: a(5,10) 以下部分数组的含义? a(1:3:2,3:5:1) a(:,1) a(:,:) a(:5:2,9::) a(3,:)
6.2 对数组使用Fortran内置函数
每个triplet叫一个三元组,由下面形式构成 下标1:下标2:下标增量 REAL::work(10,10) FORALL (i=1:10,j=1:10,work(i,j)/=0.) work(i,j)=1./work(i,j) END FO讲的都是静态内存分配数组 每个数组的大小在编译的时候设定且不可更改 有什么缺点?
用于查询对象的属性 部分常用的数组查询函数 ALLOCATED(ARRAY) LBOUND(ARRAY,DIM) SHAPE(SOURCE) SIZE(ARRAY,DIM) UBOUND(ARRAY,DIM)
这些查询函数在将数组传递给过程时,非常有用
LBOUND(ARRAY,DIM) 如果没有DIM,返回数组ARRAY的所有下界,这 个返回值是一个一维数组 如果指定了DIM,返回一个标量,表示 DIM这个 维度的下界 INTEGER::a(3:5,3:6,0:7) LBOUND(a) LBOUND(a,1) LBOUND(a,3) UBOUND类似,只是表示上界 UBOUND(a,3)
相关文档
最新文档