Fortran程序设计之子程序
•
前者用双撇号作定界符,后者用单撇号作定界符, 而将字符串的单撇号用两个单撇号表示,系统会 自动将其处理为字符串的一个单撇号字符。
5
字符串中含有单引号或双引号的处理
•
当字符串中又含有单撇号时例如要将I'M A STUDENT作为一个字符串来处理,为了区分'是 字符串中的字符还是定界符,可采用两种方式表 示:
!
•
直接常量
•
用单引号或双引号(有的地方又称单撇号、 双撇号)括起来的字符串
4
字符常量
•
!
符号常量
program hello implicit none character(len=*), parameter :: & message = "Hello, I am a computer." print *, message end program
6
字符变量赋值
program test_sign implicit none real :: number character(len=8) :: number_sign read *, number if (number > 0) then number_sign = "positive" else if (number == 0) then number_sign = "zero" else number_sign = "negative" end if print *, number, "is ", number_sign end program
•
按ASCII码值判定字符串s1小于字符串s2。
•
结果为逻辑值
16
program char_comp implicit none character(4) :: a, b a='abcd' b='efgh' print*,a>=b print*,lge(a,b) end program
3
字符常量
•
!
符号常量
program hello implicit none character(len=*), parameter :: & message = "Hello, I am a computer." print *, message end program
13
program explore_character_set ! Prints the character with given character code ! in the default kind implicit none integer :: code print *, "Type a character code" read *, code print "(i5, 3a)", code, ">", achar(code), "<" end program
8
•
字符串的输入
•
自由格式输入
•
可以用单引号或双引号把字符串括起来,也可以 不括 但最好是括起来,否则有些字符(如/)无法输入
•
•
格式输入
•
不能使用引号
• •
输入多余的字符将被忽略 输入不足则在后面补空格
9
program char_input1 implicit none character(2) :: a,b read*,a print*,a read'(A)',b print*,b end program
10
program char_input1 implicit none character(2) :: a,b read*,a print*,a read'(A)',b print*,b end program
10
Character Collating Sequences 字符对比序列
6
字符串的长度
•
字符串的长度就是字符串中所包含的字 符个数 可用函数len进行查询
• • • • •
•
len("love") is 4 len("Good morning.") is 13 len(" ") is 1 len(" ") is 4 len("bg7*5 ad") is 8
•
字符串数组
•
character(len=20), dimension(5, 9, 7) :: string_array
•
空字符
•
"",''
2
program test_character implicit none character(len=:),allocatable :: line_4 line_4="" print*,line_4,len(line_4),sizeof(line_4) line_4="test" print*,line_4,len(line_4),sizeof(line_4) line_4="testtest" print*,line_4,len(line_4),sizeof(line_4) end program
• •
"I'M A STUDENT" 'I''M A STUDENT'
•
前者用双撇号作定界符,后者用单撇号作定界符, 而将字符串的单撇号用两个单撇号表示,系统会 自动将其处理为字符串的一个单撇号字符。
That was a "story"可表示为'That was a "story"' 或"That was a ""story"""
• • •
ASCII,也是ISO/IEC 646:1991 多字节字符,ISO/IEC 10646:-1:2000 判断大小就是以此为序
11
achar和iachar函数
• • •
achar(i)返回ASCII码i所代表的字符 iachar(a)返回字符a的ASCII码 一般来说
12
•
program explore_character_set ! Prints the character with given character code ! in the default kind implicit none integer :: code print *, "Type a character code" read *, code print "(i5, 3a)", code, ">", achar(code), "<" end program
• • •
iachar与ichar等价 achar与char等价 区别是char和ichar采用机器内置对比序列,而achar和 iachar采用ASCII对比序列
•
这里i的默认的种别参数为1,但iachar和ichar返回的整 数的默认种别参数是4 这里a的长度可以超过1,但是只有第一个字符起作用
!
•
直接常量
•
用单引号或双引号(有的地方又称单撇号、 双撇号)括起来的字符串
4
字符串中含有单引号或双引号的处理
•
当字符串中又含有单撇号时例如要将I'M A STUDENT作为一个字符串来处理,为了区分'是 字符串中的字符还是定界符,可采用两种方式表 示:
• •
"I'M A STUDENT" 'I''M A STUDENT'
5
字符变量赋值
program test_sign implicit none real :: number character(len=8) :: number_sign read *, number if (number > 0) then number_sign = "positive" else if (number == 0) then number_sign = "zero" else number_sign = "negative" end if print *, number, "is ", number_sign end program
第5章 字符数据
字符串的声明
•
定长度的字符串
•
character(len=7) :: string_7
•
动态字符串
FORTRAN90第6章子程序
Fortran 90
子程序程序体的写法
分为说明部分和执行部分。 1、说明部分应对程序体内一切变量、数组等实体 (包括虚元)作出说明,同时还要说明函数结果 变量名,但不可说明函数名。 2、执行部分中必须对函数结果名至少赋值一次。
例2.计算y=f(x)+g(x)值。
其中
f(x)=x+sin30° x+1,f(x)>0 g(x)= 0, f(x)=0 x-1, f(x)<0 要求用外部函数求g(x)的值。
Fortran 90
PROGRAM MAIN IMPLICIT NONE REAL::X,Y,F,G,GF READ*,X F=X+SIN(30*3.1415926/180) G=GF(X,F) Y=F+G G,GF不能同名 PRINT*,Y END
Fortran 90
最简单的源程序的结构
主程序: 单位定义 说明部分 子程序: 计算或处理
输入
调用子程序 输出 END
Fortran 90
子程序分类
用于完成复杂的计算
1、函数子程序
分为内部函数子程序 外部函数子程序 2、子例行子程序 分为内部子例行子程序 外部子例行子程序
返回 一个或多个值
用于完成复杂计算 ,返回一个或多个 值,或用于其它数 据处理
247.0
4.0
Fortran 90
6.3 完成复杂 计算任务,返回一个或多个值,或用于其它数 据处理
Fortran程序设计(第七章-函数与子程序(上))
QUESTION???
12
!函数子程序 Function MyExp(x) result (exp_res)
Real::Exp_res,x,s,t integer::n
N=0 T=1 S=1 do while (ABS(T)>1E-5) N=N+1 T=T*X/N S=S+T end do
Exp_res=S END FUNCTION
可以是变量名、数组名、过程名、指针等。
函数调用
函数子程序的调用形式与内在函数的引用形式相同,函数 子程序的调用应出现在表达式中。调用形式:
函数名(实元表)
注意:实元与虚元个数、类型、位置一一对应,但实元与虚元 名字可以不同。
例7-2 编写函数子程序,求
x
x2
x31Biblioteka 1 21 23xn 1 23 n
5.主调程序和被调用程序间的数据传递主要是通过虚实结合实现。
系统函数调用
方法:写出相应的函数名字,并在后面的括号中给出所要 计算的自变量值
如:SQRT(9.0)、ABS(X) 注意: (1)每个函数对所需自变量的个数和自变量类型有明确的 规定和要求。 (2)系统函数的函数返回值也具有一定的类型。一般返回 值与自变量类型一致。 (3)函数引用时,自变量必须写在括号里,自变量可以是 常数、变量或表达式。
外部过程 (在主程序外部,用户编写)
对过程有如下说明:
模块过程 (在模块文件中)
1.过程作为子程序不能独立运行,只供其它程序单元调用。
2.过程的调用方法是书写过程名,后跟用一对圆括号括起来的实元表。
3.过程单元中的虚元的个数可以有多个,它们都要写在一对圆括号内。
4.当一个过程被调用时,调用它的主程序或子程序称作主调程序。
FORTRAN 90第八章子程序
3.语句函数表达式 语句函数表达式说明函数与参数的对应关系,在函数表达式中,可以包含常量、 变量、函数虚参(虚参必须包含在表达式中)、FORTRAN 90内在函数、数组以及 前面已经说明了的语句函数。 4.关于语句函数的进一步说明 (1)只有当函数关系简单,可以用一个语句描述函数与参数的对应关系时, 才能使用语句函数。 (2)语句函数是非执行语句,语句函数的定义语句要放在一个程序单位的 所有其他说明语句之,并放在所有可执行语句之前。 (3)语句函数只有在本程序单元中才有意义。也就是说,不能使用其他程 序单元中的语句函数。
8.2.2 函数子程序的调用
定义函数子程序的目的是为了调用。不仅主程序可以调用一个函数子程序, 函数子程序也可以调用其它的函数子程序,甚至于还可以调用本身(递归调 用)。调用程序称为主调程序单元,而被调用的函数子程序称为被调程序单 元。调用一个函数子程序的方法和调用内在函数和语句函数的方法基本相 同: 1. 调用时应该用实参代替函数子程序定义部分的虚参,实参和虚参的类 型要相同。 和语句函数一样,实参可以是常量、变量、表达式等。 2. 调用程序单位中的变量不能与函数子程序同名。函数值的类型由函数 定义程序单元决定,与调用程序单元无关。 3. 当函数名的类型不满足I—N隐含规则时,在调用程序单元中要对函数 名的类型给出说明(如例 8.4 中的主程序EXAM3的第2句。)
1.语句函数名
在语句函数定义格式中,f称为函数名,函数名的组成规则与变量名相同。 如果没有在语句函数定义语句前用类型语句说明该函数名的数据类型,则 该语句函数的函数值的类型按其函数名遵守I—N隐含规则。如f函数隐含为 实型函数,而nf则隐含为整形函数。
F(X,Y)=X**2+Y**2
INTEGER F(X,Y)=X**2+Y**2 NF(X,Y)=X**2+Y**2
fortran子程序
说明: 1. 函数名的取名方法与变量 名同,遵循I—N隐含约定, 否则需采用类型说明语句。
function myabs(x) real myabs 定义法二 .
2. 函数名后的虚参可以是变量名、数组名和子程序名。 如没有虚参,一对圆括号不能省。 3. 在函数子程序流程返回调用单位之前,必须把所求得 的函数值赋给函数名(不带括号和虚参)。 4. 函数子程序流程执行到return或end语句时,立即返回 到调用单位。return语句在子程序中可以有多处,如 果紧邻end 可以省去。
第 九 章 数组
第 十 章 语句函数
第十一章 子程序
第十二章 数据共用存储单元 和数据块子程序
第十三章 文件
1
Fortran程序往往由一个主程序和若干个子程序组成。 Fortran的子程序有函数子程序、子例行子程序和数 据块子程序三种。 子程序可以被主程序调用,也可以被其他子程序调 用。Fortran77中的子程序不能递归调用。
100
一行打印20个 “*”号,打两行。
8
subroutine opp(a,s1,s2) 求矩阵两对角 real a(5,5) 线元素之和 s1=0 do 10 i=1,5 subroutine readin(a) s1=s1+a(i,i) real a(5,5) 10 continue do 10 i=1,5 s2=0 read(*,*) (a(i,j),j=1,5) do 20 i=1,5 10 continue j=5-i+1 end s2=s2+a(i,j) 20 continue real w(5,5) end call readin(w) call opp(w,x1,x2) 输入矩阵 write(*,100) x1,x2 1,2,3,4,5 100 format(1x,'The two sum of', 2,3,4,5,1 3,4,5,1,2 $ ' oppusite angles elements:', 4,5,1,2,3 $ /1x,'x1=',f8.2,' x2=',f8.2) 5,1,2,3,4 end
在c++主程序中调用fortran子例程
在c++主程序中调用fortran子例程一、引言C语言和Fortran是两种不同的编程语言,广泛应用于不同的领域。
在某些情况下,可能需要将Fortran程序嵌入到C程序中,以便更好地利用Fortran的优势。
在这种情况下,如何在C主程序中调用Fortran子例程成为了一个重要的问题。
本文将介绍如何在C主程序中调用Fortran子例程,并给出一些示例代码。
二、基本步骤1. 编写Fortran子程序:首先需要编写一个Fortran子程序,该程序可以作为一个独立的程序运行,也可以作为主程序的一个子例程。
2. 编译Fortran子程序:使用Fortran编译器将Fortran子程序编译成可执行文件。
3. 创建C主程序:创建一个C主程序,用于调用Fortran子例程。
4. 链接C和Fortran程序:使用C编译器将C主程序和Fortran 可执行文件链接成一个完整的程序。
三、示例代码下面是一个简单的示例代码,展示如何在C主程序中调用Fortran子例程:Fortran子程序(example.f90):```fortransubroutine add(a, b, result) bind(c, name="add")use iso_c_binding, only: c_intimplicit noneinteger(c_int), intent(in) :: a, binteger(c_int), intent(out) :: resultresult = a + bend subroutine add```这个Fortran子程序接受两个整数参数,并返回它们的和。
它使用了iso_c_binding模块来声明C兼容的变量类型。
C主程序(main.c):```c#include <stdio.h>#include <stdlib.h>#include <complex.h>#include "example.f90"int main() {int result;int a = 5, b = 10;complex c;c = (complex) a + (complex) b; // 将整数转换为复数,以便在C和Fortran之间传递数据类型兼容的数据call add(a, b, result); // 调用Fortran子例程并将结果保存到变量result中printf("Result: %d\n", result); // 输出结果return 0;}```这个C主程序调用了上面定义的Fortran子程序add,并将结果保存到变量result中。
FORTRAN95第六章 Fortran 过程程序设计
普通的外部函数子程序形式之二为:
例6.2 利用函数子程序,计算N的阶乘。
! 计算N!的函数子程序
function fact (n)
!fact为外部函数子程序名, n为哑元
implicit none
integer:: n,i
! 说明哑元n和函数体中所用变量i的类型
real*8:: fact
! 说明函数名的类型
fact=1d0
!函数名作为变量名使用
do
write(*,*)'输入正整数m:'
read (*,*)m
if (m>0) exit
write(*,*)'输入了一个负整数或零,重输!'
end do
do
write(*,"('输入正整数n(n<=',i4,'):')")m
read (*,*)n
if (n>0 .and. n<m) exit
read *,n
h=(b-a)/n
do i=1,n-1
s=s+f (a+i*h) !调用语句函数f的语句
end do
s=h*(f (a)+f (b)+2.0*s)/2.0 !调用语句函f
write ( *,"('定积分的值为: ',f10.6)")s
fortran 子程序参数
fortran 子程序参数摘要:I.引言A.Fortran 子程序的概念B.Fortran 子程序的作用II.Fortran 子程序参数的定义与使用A.参数的定义1.内部参数2.外部参数B.参数的传递1.值传递2.引用传递C.参数的返回值1.返回值的概念2.返回值的类型III.Fortran 子程序的调用A.调用子程序的方式1.外部调用2.内部调用B.调用子程序的参数1.参数的传递方式2.参数的默认值IV.Fortran 子程序参数的实例分析A.实例介绍B.实例代码解析1.定义子程序2.调用子程序C.实例总结V.结论A.Fortran 子程序参数的重要性B.Fortran 子程序参数的应用场景C.展望Fortran 子程序参数的未来发展正文:I.引言Fortran(Formula Translation)是一种高级编程语言,广泛应用于数值计算、科学计算等领域。
在Fortran 程序设计中,子程序(Subprogram)是一种重要的程序组织方式,可以将程序划分为更小的、可重用的功能模块。
子程序参数是子程序与主程序之间进行数据交换的关键,正确理解和使用子程序参数对于编写高效的Fortran 程序具有重要意义。
II.Fortran 子程序参数的定义与使用A.参数的定义Fortran 子程序参数分为内部参数和外部参数。
1.内部参数:在子程序内部定义的参数,仅在子程序内部使用,与外部程序无关。
内部参数的定义格式如下:```fortraninteger :: a, b, sum```2.外部参数:在子程序外部定义的参数,可以在子程序内部和外部程序中使用。
外部参数的定义格式如下:```fortraninteger, external :: a, b, sum```B.参数的传递Fortran 子程序参数的传递方式有值传递和引用传递两种。
1.值传递:将参数的值传递给子程序,子程序中对参数的修改不会影响主程序中的参数值。
F77第十一章
总结
函数子程序和子例行子程序的不同点: 1、定义语句不同 2、名字的作用不同 3、调用方法不同 4、用途不同:
函数子程序带回一个值。 子例行子程序可以带回一批值(数组),或者完
成特定的操作。(如:交换,排序等)
11.3 实参和虚参之间的数据 传递
在Fortran程序设计中子程序的虚参可以是变量 名、数组名、函数名、子例行程序名和星号 ‘*’。
function s(a)
do 10 r=1,5,2
integer a
c=s(r)
pi=3.14159
print 100,r,c
s=2*pi*a
10 continue
return
100 format(1x,’r=’,i1,’ c=‘,f6.3) end
end
例2:求a,b,c三个数的平均值。
第十一章 子程序
第十一章 子程序
函数子程序 子例行程序 实参和虚参之间的数据传递 利用子程序实现程序的模块化设计 在子程序中的SAVE语句和DATA语句 程序举例
第十一章 子程序
在实际工作中,经常要编制一些求解特定问 题的程序,如:排序、求积分、解线性方程 组、插值等。如果每使用一次就编写一次, 程序就会显得冗长、累赘。因此常把它们编 制成独立的程序单位,需要时可随时调用。
dimension s(1000)
function cpt(x,m)
read *,n x(1000)
dimension
read *,(s(i),i=1,n)
t=0.0
aver=cpt(s,n)
do 10 i=1,m
print *,’aver=‘,aver
t=t+x(i)
end
fortran语言程序设计知识点
fortran语言程序设计知识点Fortran语言是一种面向科学与工程计算的编程语言,因其在数值计算和科学应用方面的高效性而受到广泛使用。
本文将重点介绍Fortran语言程序设计的一些重要知识点。
一、基础语法1.1 变量与数据类型在Fortran中,变量是用于存储数据的容器。
常见的数据类型包括整型(INTEGER)、实型(REAL/DOUBLE PRECISION)、复数型(COMPLEX)、逻辑型(LOGICAL)等。
变量的命名需遵循一定规则,如以字母开头,长度不超过31个字符等。
1.2 运算符与表达式Fortran支持常见的算术运算符(如+、-、*、/)以及逻辑运算符(如. AND.、. OR.、. NOT.)等。
表达式由变量、常数和运算符组成,可以进行数值运算和逻辑判断。
1.3 控制结构Fortran提供循环结构(DO)、条件结构(IF-THEN-ELSE)和选择结构(SELECT CASE)等控制语句,用于控制程序的流程。
二、数组与数据处理2.1 数组定义与操作Fortran中数组是由相同类型的数据元素组成的集合。
可以使用DIMENSION语句定义数组的维度和大小,通过下标访问和修改数组元素。
2.2 数组运算与函数Fortran提供了许多对数组进行运算和处理的函数,如数组求和(SUM)、最大最小值(MAX、MIN)、数组重排(RESHAPE)等,方便对数据进行统计和处理。
2.3 文件读写操作Fortran支持对文件进行读写操作,可以通过OPEN语句打开文件,使用READ和WRITE语句读取和写入数据。
可以根据需要设置文件的访问模式和格式。
三、过程与模块3.1 过程(Subroutine/Function)过程是一段独立的代码块,可接受传入参数并返回值。
在Fortran中,过程可以是子程序(Subroutine)或函数(Function)。
子程序用于完成一系列操作,而函数则返回一个值。
3.2 模块(Module)Fortran中的模块是一个编译单元,用于组织和管理相关的过程和变量。
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命令来设臵初值,看一个程序:
