Fortran的主要版本及差别

Fortran的主要版本及差别
Fortran的主要版本及差别

、Fortran的主要版本及差别

按其发展历史,Fortran编译器的版本其实很多。现在在广泛使用的是Fortran 77和Fortr

an90。

Fortran 90在Fortran 77基础上添加了不少使用的功能,并且改良了77编程的版面格式,

所以编程

时推荐使用90。鉴于很多现成的程序只有77版本,有必要知道77的一些基本常识,至少保

证能够看

懂77程序。以下是77和90的一些格式上的区别。

Fortran 77:固定格式(fixed format),程序代码扩展名:.f或.for (1)若某行以C,c或*开头,则该行被当成注释;

(2)每行前六个字符不能写程序代码,可空着,或者1~5字符以数字表明行代码(用作格

式化输入

输出等);7~72为程序代码编写区;73往后被忽略;

(3)太长的话可以续行,所续行的第六个字符必须是"0"以外的任何字符。

Fortran 90:自由格式(free format),扩展名:.f90

(1)以"!"引导注释;

(2)每行可132字符,行代码放在每行最前面;

(3)以&续行,放在该行末或下行初。

以下都是讨论Fortran 90。

3、Fortran的一些特点,和C的一些不同

其实很多,在下面涉及具体方面时可以看到。这里只是大致提一些。

(1)不分大小写

(2)每句末尾不必要写分号

(3)程序代码命令间的空格没有意义

(4)不像C,Fortran不使用{ }

(5)数据类型多出了复数和逻辑判断类型。比如复数类型

complex :: a !声明复数的方法。复数显然方便了科学计算,满足了工程方面

的需求

a=(1.0,2.0) ! a=1+i

(6)多出了乘幂运算(**)。乘幂除了整数还可以是实数形式。如开方,开立方

a=4.0**0.5,a=8.0**(1.0/3.0)。

(7)数组有一些整体操作的功能;可以方便的对部分元素进行操作

(8)有些情况下可以声明大小待定的数组,很实用的功能

4、Fortran的基本程序结构

先看一看所谓的"Hello Fortran"程序。

program main !程序开始,main是program的名字,完全自定义write(*,*) "Hello" !主程序

stop !终止程序

end [program[main]] !end用于封装代码,表示代码编写完毕。

[ ]中的内容可省略,下同。

再看一段实用一些的程序,好有点感性认识。程序用于计算圆柱的表面积,要求输入底面

半径和

高。其中展示了Fortran的一些特色用法。程序摘自维基。其实是一个叫https://www.360docs.net/doc/2d9141979.html,

的网上引

用的维基的网页。推荐去看看!能查到不少有意思的东西。

program cylinder !给主函数起个名字

! Calculate the area of a cylinder.

!

! Declare variables and constants.

! constants=pi

! variables=radius squared and height

implicit none ! Require all variables to be explicitly declared !这个一般都是要写上的。下面会进一步说明。

integer :: ierr

character :: yn

real :: radius, height, area

real, parameter :: pi = 3.1415926536 !这是常量的声明方法

interactive_loop: do !do循环,Fortran中的循环可以加标签,如d

o前

!面的 interactive_loop就是标

! Prompt the user for radius and height

! and read them.

write (*,*) 'Enter radius and height.' !屏幕输出

read (*,*,iostat=ierr) radius,height !键盘输入。isotat的值用

于判断

!输入成功否。

! If radius and height could not be read from input,

! then cycle through the loop.

if (ierr /= 0) then

write(*,*) 'Error, invalid input.'

cycle interactive_loop !cycle 相当于C里的continue end if

! Compute area. The ** means "raise to a power."

area = 2 * pi * (radius**2 + radius*height) ! 指数运算比C方便

! Write the input variables (radius, height)

! and output (area) to the screen.

write (*,'(1x,a7,f6.2,5x,a7,f6.2,5x,a5,f6.2)') & !"&"表示续行。这里

!还显示了格式化输出

'radius=',radius,'height=',height,'area=',area

yn = ' '

yn_loop: do !内嵌的另一个do循环

write(*,*) 'Perform another calculation? y[n]'

read(*,'(a1)') yn

if (yn=='y' .or. yn=='Y') exit yn_loop

if (yn=='n' .or. yn=='N' .or. yn==' ') exit interactive_loop end do yn_loop !结束内嵌do循环

end do interactive_loop

end program cylinder

Fortran程序的主要结构就是这样了。一般还会有些module的部分在主函数前,函数在主函

数后。

三、数据类型及基本输入输出

1、数据类型,声明及赋初值

(1)integer:短整型kind=2, 长整型kind=4

integer([kind=]2) :: a=3

如果声明成integer:: a,则默认为长整型。

!"::" 在声明并同时赋初值时必须要写上;类型名后面有形容词时也必须有;其他情况可

略去

!所谓形容词,可以看一下这个。比如声明常数

real,parameter :: pi=3.1415926 。parameter就是形容词。

(2)real:单精度kind=4(默认),双精度kind=8

real([kind=]8) :: a=3.0

还有指数的形式,如1E10为单精度,1D10为双精度

(3)complex 单精度和双精度

complex([kind=]4) b

(4)character

character([len=]10) c !len为最大长度

(5)logical

logical*2 :: d=.ture. (等价于logical(2)::d=.ture.)

(6)自定义类型type:类似于C中的struct

Fortran 77中给变量赋初值常用DATA命令,可同时给多个变量赋初值

data a,b,string /1, 2.0, 'fortran'/

与C不同的是,Fortran中变量不声明也能使用,即有默认类型(跟implicit命令有关)。按

照默认的

规定,以i,j,k,l,m,n开头的变量被定义为integer,其余为real。取消该设置需在程序声明

部分之前

加implicit none。彭国伦建议一般都使用该语句。

另一点关于声明的不同是Fortran有"等价声明":

integer a,b

equivalence(a,b)

使得a,b使用同一块内存。这样可以节省内存;有时可精简代码。如:equivalence(很长名

字的变量

比如三维数组的某个元素,a),之后使用a来编写程序就简洁多了。

2、基本输入输出

输入:read(*,*) a !从键盘读入

输出:write(*,*) "text" !在屏幕上输出。Fortran 77用' text'。Fort

ran 90

!一般" "和' '都可

print *,"text" !只能屏幕输出

(*,*)完整写为(unit=*,fmt=*)。其中unit为输入/输出位置,如屏幕,文件等;fmt为

格式。如

果这两项都写成*,则按默认的方式进行,即上面描述的。print后面的*表示按默认格式输

出。

四、流程控制

1、运算符

(1)逻辑运算符

== /= > >= < <= !Fortran 90用法

.EQ. .NE. .GT. .GE. .LT. .LE. !Fortran 77用法

(2)涉及相互关系的集合运算符

.AND. .OR. .NOT. .EQV. .NEQV.

! 仅.NOT.连接一个表达式,其余左右两边都要有表达式(可以是logical类型的变量)

!.EQV.:当两边逻辑运算值相同时为真, .NEQV.:当两边逻辑运算值不同时为真

2、IF

(1) 基本:

if(逻辑判断式) then

……

end if

如果then后面只有一句,可写为

if(逻辑判断式) …… !then和end if可省略

(2) 多重判断:

if(逻辑判断式) then

……

else if

……

else if

……

else

……

end if

(3) 嵌套:

if(逻辑判断式) then

if(逻辑判断式) then

if(逻辑判断式) then

else if(逻辑判断式) then

……

else

……

end if !没必要跟C语句多时用{}了,因为有end if

end if

end if

(4) 算术判断:

program example

implicit none

real c

write (*,*) "input a number"

read (*,*) c

if(c) 10,20,30 !10,20和30为行代码,根据c小于/等于/大于0,执行10/20/30行的程

10 write (*,*) "A"

goto 40 !goto可实现跳到任意前面或后面的行代码处,但用多了破坏程序结

20 write (*,*) "B"

goto 40

30 write (*,*) "C"

goto 40

40 stop

end

3、SELECT CASE

类似于C的switch语句

select case(变量)

case(数值1) ! 比如case(1:5)代表1<=变量<=5会执行该模块

…… !case(1,3,5)代表变量等于1或3或5会执行该模块

case(数值2) !括号中数值只能是integer,character或logical型常量,不能

是real型

……

case default

……

end case

4、PAUSE, CONTINUE

pause暂停程序执行,按enter可继续执行

continue貌似没什么用处,可用作封装程序的标志

五、循环

1、DO

do counter=初值, 终值, 增/减量 !counter的值从初值到终值按增/减量变

化,

…… !counter每取一个值对应着一次循环。增/减量不写则

默认为1

……

…… !循环主体也没有必要用{}

……

end do

Fortran 77中不是用end do来终止,而是下面这样子:

do 循环最后一行的行代码 counter=初值, 终值, 增/减量

……

行代码…… !这是do的最后一行

2、DO WHILE

do while(逻辑运算)

……

……

end do

类似于C中的while(逻辑运算) {……}。

一开始那个计算圆柱表面积的程序中,应该也算是这一类。不过它是通过内部的if语句来

控制循

环。看来也是可以的,不过在这本书上没看到这样写。其实应该也可以归于下面这种。

3、没看到和C里面的do{……}while(逻辑运算); 相对应的循环语句,不过可以这样,保证

至少做一

次循环:

do while(.ture.)

……

……

if(逻辑运算) exit !exit就好比C里面的break。C里的continue在Fortran 里是cy

cle

end do

4、Fortran的一个特色:带署名的循环

可以这样,不易出错:

outer: do i=1,3

inner: do j=1,3

……

end do inner

end do outer

还可以这样,很方便:

loop 1: do i=1,3

loop2: do j=1,3

if(i==3) exit loop1 !exit终止整个循环loop1

if(j==2) cycle loop2 !cycle跳出loop2的本次循环,进行loop2的

一次循环

write(*,*) i,j

end do loop2

end do loop1

还有一些循环主要用于Fortran中的数组运算,为Fortran特有,很实用。

六、数组

1、数组的声明

和C不同的是,Fortran中的数组元素的索引值写在()内,且高维的也只用一个(),如

integer a(5) !声明一个整型一维数组

real :: b(3,6) !声明一个实型二维数组

类型可以是integer, real, character, logical或type。最高可以到7维。数组大小必须为常数。但是和C语言不同,Fortran也有办法使用大小可变的数组,方法如

下:

integer, allocatable :: a(:) !声明

大小可变经过某个途径得知所需数组大小size之后,用下面的语句:

allocate(a(size)) !配置内存空间

之后该数组和通过一般方法声明的数组完全相同。

与C不同,Fortran索引值默认为从1开始,而且可以在声明时改变该规则:integer a(-3:1) ! 索引值为-3,-2,-1,0,1

integer b(2:3,-1:3) !b(2~3,-1~3)为可使用的元素

2、数组在内存中的存放

和C不同,Fortran中的数组比如a(2,2)在内存中存放顺序为

a(1,1),a(2,1),a(1,2),a(2,2

)。原则是

先放低维的元素,再放高维的元素。此规则称为column major。

3、赋初值

(1)最普通的做法:

integer a(5)

data a /1,2,3,4,5/

或integer :: a(5)=(/1,2,3,4,5/)

若integer :: a(5)=5,则5个元素均为5

对于integer :: a(2,2)=(/1,2,3,4/)

根据数组元素在内存中存放的方式,等价于赋值

a(1,1)=1,a(2,1)=2,a(1,2)=3,a(2,2)=4

(2)利用Fortran的特色:隐含式循环。看例子就明白了。

integer a(5)

integer i

data (a(i),i=2,4)/2,3,4/ !(a(i),i=2,4)表示i从2到4循环,增量为默认值1

还可以这样:

integer i

integer :: a(5)=(/1,(2,i=2,4),5/) !五个元素分别赋值为1,2,2,2,5 integer :: b(5)=(/i, i=1,5/) !五个元素分别赋值为1,2,3,4,

5

还可以嵌套

data ((a(i,j),i=1,2),j=1,2)=/1,2,3,4/ !a(1,1)=1,1(2,1)=2,a(1,2)=3,a( 2,2)=4

4、操作整个数组

设a,b为相同类型、维数和大小的数组

a=5 !所有元素赋值为5

a=(/1,2,3/) !这里假设a为一维,a(1)=1,a(2)=2,a(3)=3

a=b !对应元素赋值,要求a,b,c维数和大小相同,下同

a=b+c

a=b-c

a=b*c

a=b/c

a=sin(b) !内部函数都可以这样用

5、操作部分数组元素

a为一维数组

a(3:5)=(/3,4,5/) !a(3)=3,a(4)=4,a(5)=5

a(1:5:2)=3 !a(1)=3,a(3)=3,a(5)=3

a(3:)=5 !a(3)以及之后的所有元素赋值为5

a(1:3)=b(4:6) !类似于这种的要求左右数组元素个数相同

a(:)=b(:,2) !a(1)=b(1,2),a(2)=b(2,2),以此类推

6、WHERE

where形式上类似于if,但只用于设置数组。设有两个同样类型、维数和大小的数组a,b

[34m where(a<3)

b=a !a中小于3的元素赋值给b对应位置的元素

end where

再如:where(a(1:3)/=0) c=a !略去了end where,因为只跟了一行where可嵌

套,也

!可类似do循环有署名标签。

7、FORALL

有点像C中的for循环:

forall(triplet1[,triplet2 [,triplet3…]],mask)

其中triplet形如i=2:6:2,表示循环,最后一个数字省略则增量为1

例如:

forall(i=1:5,j=1:5,a(i,j)<10)

a(i,j)=1

end forall

又如: forall(i=1:5,j=1:5,a(i,j)/=0) a(i,j)=1/a(i,j)

forall也可以嵌套使用,好比C中for循环的嵌套。

七、函数

Fortran中函数分两类:子程序(subroutine)和自定义函数(function)。自定义函数本

质上就是

数学上的函数,一般要传递自变量给自定义函数,返回函数值。子程序不一定是这样,可

以没有返

回值。传递参数要注意类型的对应,这跟C是一样的。

1、子程序

目的:把某一段经常使用的有特定功能的程序独立出来,可以方便调用。

习惯上一般都把子程序放在主程序结束之后。

形式:

subroutine name (parameter1, parameter2)

!给子程序起一个有意义的名字。可以传递参数,这样可以有返回值。括号内也可以

空着,代

表不传递参数。

implicit none

integer:: parameter1, parameter2 !需要定义一下接收参数的类型。…… !接下来的程序编写跟主程序没有任何

差别。

……

mreturn !跟C不同,这里表示子程序执行后回到调用它的地方继续执行下面的程序。

不一定

!放在最后。可以放在子程序的其他位置,作用相同;子程序中return 之后的部分不

再执行。

end [subroutine name]

调用:使用call命令直接使用,不需要声明。在调用处写:

call subroutine name(parameter1,parameter2)

注意点:

a.子程序之间也可相互调用。直接调用就是了,像在主程序中调用子程序一样。

b.传递参数的原理和C中不同。Fortran里是传址调用(call by

address/reference),就是

传递时用

的参数和子程序中接收时用的参数使用同一个地址,尽管命名可以不同。这样如果子程序

的执行改

变子程序中接收参数的值,所传递的参数也相应发生变化。

c.子程序各自内部定义的变量具有独立性,类似于C。各自的行代码也具有独立性。因此各

个子程序

和主程序中有相同的变量名、行代码号,并不会相互影响。

2、自定义函数

和子程序的明显不同在于:需要在主程序中声明之后才能使用。调用方式也有差别。另外

按照惯例

调用函数不去改变自变量的值。如果要改变传递参数的值,习惯上用子程序来做。声明方式:real, external :: function_name

一般自定义函数也是放在主程序之后。

形式:

function function_name(parameter1, parameter2)

implicit none

real:: parameter1, parameter2 !声明函数参数类型,这是必需的

real::function_name !声明函数返回值类型,这是必需的

……

……

function_name=…. !返回值的表达式

return

end

也可以这样直接声明返回值类型,简洁些:

real function function_name(parameter1, parameter2)

implicit none

real:: parameter1, parameter2 !这个还是必需的

……

……

function_name=…. !返回值表达式

return

end

调用:function_name(parameter1,parameter2)

不需要call命令。

自定义函数可以相互调用。调用时也需要事先声明。

总之,调用自定义函数前需要做声明,调用子程序则不需要。

3、关于函数中的变量

(1)注意类型的对应。Fortran中甚至可以传递数值常量,但只有跟函数定义的参数类型

对应才会

得到想要的结果。如call ShowReal(1.0)就必须用1.0而不是1。

(2)传递数组参数,也跟C一样是传地址,不过不一定是数组首地址,而可以是数组某个

指定元素

的地址。比如有数组a(5),调用call function(a)则传递a(1)的地址,调用call functio

n(a(3))则

传递a(3)的地址。

(3)多维数组作为函数参数,跟C相反的是,最后一维的大小可以不写,其他维大小必须

写。这决

定于Fortran中数组元素column major的存放方式。

(4)在函数中,如果数组是接收用的参数,则在声明时可以用变量赋值它的大小,甚至可

以不指定

大小。例如:

subroutine Array(num,size)

implicit none

integer:: size

integer num(size) !可以定义一个数组,其大小是通过传递过来的参数决定的。这

个很实用

……

……

return

end

(5)save命令:将函数中的变量值在调用之后保留下来,下次调用此函数时该变量的值就

是上次保

留的值。只要在定义时加上save就行:

integer, save :: a=1

(6)传递函数(包括自定义函数、库函数、子程序都是可以的)。类似于C中的函数指针

。需要在

主程序和调用函数的函数中都声明作为参数传递的函数。如

real, external :: function !自定义函数

real, intrinsic :: sin !库函数

external sub !子程序

(7)函数使用接口(interface):一段程序模块。以下情况必需:

a.函数返回值为数组

b.指定参数位置来传递参数时

c.所调用的函数参数个数不固定

d.输入指标参数时

e.函数返回值为指针时。

具体用法结合例子容易看懂。例子都很长。看书吧。

4、全局变量

功能就不用说了。原理:根据声明时的相对位置关系而取用,不同与C中根据变量名使用。

如果在主程序中定义:

integer :: a,b

common a,b !就是这样定义全局变量的

在子程序或自定义函数中定义:

integer :: c,d

common c,d

则a和c共用相同内存,b和d共用相同内存。

全局变量太多时会很麻烦。可以把它们人为归类,只需在定义时在common后面加上区间名

。如

common /groupe1/ a, common /group2/ b。这样使用时就不必把所有全局变量

都列出来

了,再声明common /groupe1/ c就可以用a、c全局变量了。

可以使用block data程序模块。在主程序和函数中不能直接使用前面提到的data命令给全

局变量赋初值。可以给它们各自赋初值;如果要使用data命令必须要这样:block data [name]

implicit none

integer a,b,c

real d,e

common a b c

common /group1/ d,e

data a,b,c,d,e /1,2,3,4.0,5.0/

end [block data [name]]

5、Module

Module不是函数。它用于封装程序模块,一般是把具有相关功能的函数及变量

封装在一起

。用法很

简单,但能提供很多方便,使程序变得简洁,比如使用全局变量不必每次都声明一长串,

写在

Module里调用就行了。Module一般写在主程序开始之前。

形式:

module module_name

……

……

end [module [module_name]]

使用:在主程序或函数中使用时,需要在声明之前先写上一行:use module_name[

37m。

Module中有函数时必须在contains命令之后(即在某一行写上contains然后下

面开始写

函数,多所有函数都写在这个contains之后)。并且module中定义过的变量在module里的

函数中可

以直接使用,函数之间也可以直接相互调用,连module中的自定义函数在被调用时也不用

先声明

的。

6、include放在需要的任何地方,插入另外的文件(必须在同一目录下)。如:include 'funcion.f90'

八、文件

1、文本文件

Fortran里有两种读取文件的方式,对应于两种文件

顺序读取:用于文本文件

直接读取:用于二进制文件

这里只摘录关于文本文件的读取。一般模式如下。

character(len=20)::filenamein="in.txt", filenameout="out.txt" !文件

logical alive

integer::fileidin=10,fileidout=20

!10,20是给文件编的号,除1,2,5,6的正整数都可,因为2、6是默认的输出位置(屏幕

),1、5是默认的输入位置(键盘)

integer::error

real::in,out

!下面这一段用于确认指定名字的文件是否存在

inquire(file=filenamein, exist=alive) !如果存在,alive赋值为0

if(.NOT. alive) then

write(*,*) trim(filenamein), " doesn't exist."!trim用于删去filenamein 中字

符串

!后面的stop多余空格,输出时好看些

end if

open([unit=]fileidin, file=filenamein, status="old")

open([unit=]fileidout,file=filenameout[,status="new"])

!unit指定输入/输出的位置。打开已有文件一定要用status="old";打开新文件用status

="new";

!不指定status,则默认status="unknown",覆盖已有文件或打开新文件……read([unit=]fileidin, [fmt=]100,iostat=error )in !error=0表示正确读入数

据。

100 format(1X,F6.3)

!按一定格式输入输出,格式可以另外写并指定行代码,也可以直接写在

read/write

write(([unit=]fileidout, "(1X,F6.3)")out

close(fileidin)

close(fileidout)

!1X代表一个空格。F6.3代表real型数据用占6个字符(含小数点),其中小数点后三位。

!常用的还有I3,用于整型数据,共占三个字符;A8,字符型,占8个字符。换行用 /

二进制文件的读取有所不同。不再列举。

2、内部文件

另一个很实用的读写功能是内部文件(internal file)。看看这个例子就明白了。

integer::a=1,b=2

character(len=20)::string

write(unit=string,fmt="(I2,'+',I2,'=',I2)")a,b,a+b

write(*,*)string

则结果输出1+2=3。反过来也是可以的:

integer a

character(len=20)::string="123"

read(string,*)a

write(*,*)a

则输出123。

!全文结束

FORTRAN程序设计复习题及答案

FORTRAN程序设计复习题 一、选择题 B (1)下列各FORTRAN表达式中合法的是 A) S+T*2P >= B) .NOT. (A*B+C) C) A2+B2/(C+D) <= D) (A+B).NOT.A*B.GT.(.NOT.只跟一个表达式) C (2)数学式(3/5)ex+y的FORTRAN表达式是 A) 3*EXP(X+Y)/5 B) 3*E* *(X+Y)/ C) (3/5)*EXP(X+Y)D) EXP(X+Y) D (3)下列FORTRAN77表达式中不合法的是 A) A.GT.B.EQV.C.GT.D B) A.AND.B.AND.C.AND.D C) .NOT.(X.LE.D) A.LT.B.LT.C.LT.D D(4)下列叙述中不正确的是 A) FORTRAN子程序可以单独编译 B) 对一个FORTRAN源程序进行编译和连接无误后可生成可执行文件 C) 即使编译和连接都正确无误,FORTRAN程序运行时仍可能出错 D) FORTRAN连接的主要任务是把函数库中的函数翻译成机器指令(正确描述:主要任务为连接目标文件) B (5)在下列FORTRAN77运算符中,优先级最高的是 A) .AND. B) .NOT. C) .OR. D) .EQ. B (6)FORTRAN表达式"6/5+9/2**3/2"的值为 A) 33 B) 1 C) 5 D) 3 A (7)下列FORTRAN77表达式中,合法的是: A) .AND.. B) 10.0 C) D) 提示:A)相当于 .AND.(.NOT.()) D (8)关于编译一个FORTRAN源程序文件,下列说法中错误的是 A) 允许编译只有一个主程序而没有子程序的源文件 B) 允许编译有多个子程序的源文件 C) 允许编译只有一个子程序而没有主程序的源文件 D) 允许编译有多个主程序的源文件 C (9)在FORTRAN77源程序中,续行标志符必须放在 A) 第1列 B) 第1-6列C) 第6列D) 第5列 D (10)下列关于"SUBROUTIN E MAP(X,Y)"语句行的叙述中,不正确的是 A) 这是子程序的第一个语句 B) 字符串"MAP"是子程序名 C) 变量X是子程序的形参D) 子程序执行后,MAP将返回整型数据 提示:子程序无返回值,自定义函数才有) A (11)FORTRAN表达式"2/4+"的值是 A) B) 1 C) D) 0 提示:2/4默认等于整型,=》 D (12)FORTRAN表达式"MOD,"的值是 A) B)0.0 C) D) A (13下列FORTRAN运算符中,优先级最低的是 A)逻辑运算符.AND. B)算术运算符*

MATLAB 与C C + + 、FORTRAN语言混合编程

MATLAB 与C/ C + + 、FORTRAN语言混合编程摘要:对MATLAB 与C/ C + + 和FORTRAN 语言进行混合编程的常用方法进行了介绍,分析了其实现方式和各自的利弊,并用实例对MEX 文件实现方式进行了较详细的论述. 关键词: MATLAB ; C/ C + + ; FORTRAN ; 混合编程 中图分类号: TP313 文献标识码: A 文章编号:16722948X(2004) 0620547205 1 混合编程的意义及其实现方式 1. 1 混合编程的意义 MATLAB 语言具有功能强大、开发效率高等诸 多优点, 已在工程实际中得到广泛应用, 但是与 FORTRAN、C/ C + + 等语言相比,其执行效率较低, 特别是当程序中含有大量循环语句(例如迭代计算) 时,MATLAB 就有些力不从心, 速度很慢, 而运用 FORTRAN 等擅长数值计算语言进行编程,其运行效 率高. 一方面,如果放弃MATLAB 强大功能和数量 众多的应用工具箱,无疑是资源的极大浪费. 另一方 面,针对工程实际,人们用FORTRAN、C/ C + + 语言 已编写了大量实用程序,如果将其重新改写成M 文 件移植到MATLAB 环境中,不仅要花费大量的时间 和精力,而且有时还降低了其运行效率. 可否将二者 优势互补呢? 混合编程就是其有效的解决途径. 1. 2 混合编程的实现 正是考虑到上面这些原由,MATLAB 系统提供 了其应用程序接口(Application Program Interface) 来 解决这些问题. API 主要包括3 部分:MEX 文件——— 外部程序调用接口,用来在MATLAB 环境下调用 FORTRAN、C/ C + + 语言编写的程序;MAT 文件应 用程序———数据输入输出接口,用于MATLAB 系统 与外部环境之间互传数据; 计算引擎函数库——— MATLAB 处于后台作为一个计算引擎,与其它应用 程序建立客户机/ 服务器关系,在其它应用程序中调 用[1 ,2 ] . 1. 2. 1 MEX 文件 MEX 文件是按照一定格式,用FORTRAN 或C/ C + + 语言编写的源程序,在MATLAB 下借助相应 的编译器,生成的动态链接函数的统称. 在Windows 操作系统下,是用MATLAB 附带的批处理mex. bat 来编译生成文件后缀名为. dll (Dynamic Link Li2 brary) 动态链接库文件,该文件可在MATLAB 环境 下,像命令函数一样直接运行和调用,使用起来极为 方便. 采取MEX 文件方式,是重复利用已有FOR2 TRAN、C/ C + + 程序,让MATLAB 和FORTRAN、

C语言转换为fortran语言

C/C++采用的是缺省调用约定是STDCALL约定.在C程序中,可以在函数原型的声明中使用_stdcall关键字来指明过程采用STDCALL调用约定。 Fortran过程采用的缺省标识符是,全部大写的过程名加上“_”前缀和“@n”后缀。在C程序中保留标识符的大小写。编译程序会给采用STDCALL约定的过程标识符加上“_”前缀和“@n”后缀。 Fortran过程缺省的参数传递方式是引用方式是。对于下面这个Fortarn过程:SUBROUTINE ForSub(ivar,rvar) INTEGER ivar REAL rvar WRITE(*,*) ivar,rvar END 在C语言程序中应给出过程的函数原型及调用方式为: void main() { extern void__stdcall FORSUB(int*I,float*f); int iCV AR=1; float rCV AR=2.0; FORSUB(&iCV AR,&rCV AR); } 在C++中调用Fortan的过程,在声明函数原型时需要用extern“C”语句,以避免C++编译程序对标识符的修饰;并且C++也可以通过引用方式传递参数。对于上面的Fortran过程,C++程序应给出的函数原型及调用方法是: void main() { extern “C”{void__stdcall FORSUB(int*I,float*f);} int iCV AR=1; float rCV AR=2.0; FORSUB(&iCV AR,&rCV AR); } 另外,也可以在Fortran中用!MS$ATTRIBUTES编译伪指令来改变Fortran子过程的调用约定,以便于被其他语言的程序调用。在下面的例子中,过程ForSub具有C语言的调用约定。 SUBROUTINE ForSub(ivar,rvar) !MS$ATTRIBUTES C::ForSub INTEGER ivar REAL rvar WRITE(*,*) ivar,rvar END 这样,这个过程使用的是C调用约定,并且参数传递方式也变为传值方式,过程的标识符变为全部小写且有_前缀而无后缀的方式。在C语言源程序中的函数原型及调用方法为:void main() { extern void FORSUB(int ivar,float rvar); int iVar=1;

Fortran95程序设计课后习题答案(word版方便)

第四章 1.program main implicit none write(*,*) "Have a good time." write(*,*) "That's not bad." write(*,*) '"Mary" isn''t my name.' end program 2.program main real, parameter :: PI=3 implicit none.14159 real radius write(*,*) "请输入半径长" read(*,*) radius write(*,"(' 面积='f8. 3)") radius*radius*PI end program 3.program main implicit none real grades write(*,*) "请输入成绩" read(*,*) grades write(*,"(' 调整后成绩为'f8.3)") SQRT(grades)*10.0 end program 4.integer a,b real ra,rb a=2 b=3 ra=2.0 rb=3.0 write(*,*) b/a ! 输出1, 因为使用整数计算, 小数部分会无条件舍去write(*,*) rb/ra ! 输出1.5 5.p rogram main implicit none type distance real meter, inch, cm end type type(distance) :: d write(*,*) "请输入长度:" read(*,*) d%meter d%cm = d%meter*100 d%inch = d%cm/2.54 write(*,"(f8.3'米='f8.3'厘米='f8.3'英寸')") d%meter, d%cm, d%inch end program 第五章 1.program main implicit none integer money real tax write(*,*) "请输入月收入" read(*,*) money if ( money<1000 ) then tax = 0.03 else if ( money<5000) then tax = 0.1 else tax = 0.15 end if write(*,"(' 税金为'I8)") nint(money*tax) end program 2.program main implicit none integer day character(len=20) :: tv write(*,*) "请输入星期几" read(*,*) day select case(day) case(1,4) tv = "新闻" case(2,5) tv = "电视剧" case(3,6) tv = "卡通" case(7) tv = "电影" case default write(*,*) "错误的输入" stop end select write(*,*) tv end program 3.program main implicit none integer age, money real tax write(*,*) "请输入年龄" read(*,*) age write(*,*) "请输入月收入" read(*,*) money if ( age<50 ) then if ( money<1000 ) then tax = 0.03 else if ( money<5000 )then tax = 0.10 else tax = 0.15 end if else if ( money<1000 ) then tax = 0.5 else if ( money<5000 )then tax = 0.7 else tax = 0.10 end if end if write(*,"(' 税金为'I8)") nint(money*tax) end program 4.program main implicit none integer year, days logical mod_4, mod_100, mod_400 write(*,*) "请输入年份" read(*,*) year mod_4 = ( MOD(year,4) == 0 ) mod_100 = ( MOD(year,100) == 0 ) mod_400 = ( MOD(year,400) == 0 ) if ( (mod_4 .NEQV. mod_100) .or. mod_400 ) then days = 366 else days = 365 end if write(*,"('这一年有'I3'天')") days stop end program 第六章 1.program main implicit none integer i do i=1,5 write(*,*) "Fortran" end do stop end program 2.program main implicit none integer i,sum sum = 0 do i=1,99,2 sum = sum+i end do write(*,*) sum stop end program 3.program main implicit none integer, parameter :: answer = 45 integer, parameter :: max = 5 integer weight, i do i=1,max write(*,*) "请输入体重" read(*,*) weight if ( weight==answer ) exit end do if ( i<=max ) then write(*,*) "猜对了" else write(*,*) "猜错了" end if stop end program 4.program main implicit none integer, parameter :: max=10 integer i real item real ans ans = 1.0 item = 1.0 do i=2,max item = item/real(i) ans = ans+item

C与C++与FORTRAN混合编程

C/C++/FORTRAN 混合编程 混合编程在软件编程中是经常遇到的问题,尤其是C/C++/FORTRAN的混合编程,本文主要说明以上三种语言混合编程中经常遇到的问题,同时,也说明了不同平台下混合编程应注意的问题。 混合语言编程要注意的问题主要体现在:函数调用和数据结构的存储。 1 Windows平台 函数:由于Fortran编程语言没有大小写之分,Windows平台下的混合语言编程要注意的主要是大小写的问题。考虑到编译器的差异,可以用下面的方式进行跨平台编程的函数声明。( C/C++编译器使用Microsoft Visual C++ 6.0, Fortran编译器使用 Digital Visual Fortran 6.0)。 假设一个C的函数为 void cFunction(); 那么,只需要在它的头文件里面进行如下定义即可: #ifdef __cplusplus extern “C” void { #endif extern void __stdcall CFunction(); #define cFunction CFUNCTION #ifdef __cplusplus } #endif 这样,在Fortran或者C++的程序里面就可以直接调用了。 假设是一个Fortran函数SUBROUTINE FFUNCTION(); 那么,在C++头文件里进行如下的定义就可以了: #ifdef __cplusplus extern “C” void { #endif extern void __stdcall ffunction(); #define ffunction FFUNCTION #ifdef __cplusplus } #endif 这样,就可以在C++的程序里面直接调用。由于C编译器里面,没有定义__cplusplus这个环境变量,因此,C文件里面,也可以直接使用这个头文件。如果是一个C++函数,如: void cPlusplusFunction();和c函数一样,进行下面的定义即可: #ifdef __cplusplus extern “C” void { #endif extern void __stdcall cPlusplusFunction (); #define cPlusplusFunction CPLUSPLUSFUNCTION #ifdef __cplusplus }

计算机程序设计语言(FORTRAN语言)

计算机程序设计语言(FORTRAN语言) (总分:36.00,做题时间:90分钟) 一、 (总题数:36,分数:36.00) 1.编译程序能将高级语言编写的源程序转换成( )。 A.解释程序 B.汇编程序 C.映象程序 D.目标程序 (分数:1.00) A. B. C. D. √ 解析: 2.一个完整的FORTRAN源程序( )。 A.至少包括一个主程序 B.至少包括一个主程序和一个子程序 C.由一个主程序与一个以上的子程序组成 D.由一个主程序与一个子程序组成 (分数:1.00) A. √ B. C. D. 解析: 3.语句函数定义语句在程序内合法的位置是( )。 A.在程序块开头语句之后,END语句之前 B.在程序块开头语句之后,可执行语句之前 C.在说明语句之后,END语句之前 D.在说明语句之后,可执行语句之前 (分数:1.00) A. B. C. D. √ 解析: 4.下列关于函数子程序虚实参数的错误说法是( )。 A.可以没有形参数 B.虚实结合的数组长度可以不同 C.实参表与虚参表类型可以不同 D.函数名可以作为虚参

(分数:1.00) A. B. C. √ D. 解析: 5.下列叙述中正确的是( )。 A.FORTRAN程序块中,无名公用语句只能有一个B.FORTRAN子程序中,至少应有一个RETURN语句C.FORTRAN程序块中,最后一行必须是END语句D.FORTRAN程序块中,必须有变量说明语句 (分数:1.00) A. B. C. √ D. 解析: 6.运行下面的程序时得不到所需的结果,其主要原因是( )。INTEGER X(11) DATA X/9,8,7,6,5,4,3,2,1,0,-1/ DO 10 1=1,X(1) ,-1 WRITE(*,*)1.0/SQRT(25.0-REAL(X(1) )* * 2) 10 CONTINUE END A.没有给X(11) 赋初值 B.发生除以零的情况 C.发生负数开平方的情况 D.循环参数设置错误 (分数:1.00) A. B. C. D. √ 解析: 7.下列数据中,不符合FORTRAN常量表示法的是( )。 A.-25.6 B.2.758D3 C.'FOOT"=' D.TRUE (分数:1.00) A. B. C. D. √ 解析:

fortran语言内部函数

附录 FORTRAN 90标准函数 符号约定: ●I代表整型;R代表实型;C代表复型;CH代表字符型;S代表字符串;L代表逻辑型;A代表数组;P代表指针;T代表派生类型;AT为任意类型。 ●s:P表示s类型为P类型(任意kind值)。s:P(k)表示s类型为P类型(kind值=k)。 ●[…]表示可选参数。 ●*表示常用函数。 表1 数值和类型转换函数 函数名说明 ABS(x)*求x的绝对值∣x∣。x:I、R,结果类型同x; x:C,结果:R AIMAG(x)求x的实部。x:C,结果:R AINT(x[,kind])*对x取整,并转换为实数(kind)。x:R, kind:I,结果:R(kind) AMAX0(x1,x2,x3,…)*求x1,x2,x3,…中最大值。x I:I,结果:R AMIN0(x1,x2,x3,…)*求x1,x2,x3,…中最小值。x I:I,结果:R ANINT(x[,kind])*对x四舍五入取整,并转换为实数(kind)。x:R, kind:I,结果:R(kind) CEILING(x)*求大于等于x的最小整数。x:R,结果:I CMPLX(x[,y][,kind]))将参数转换为x、(x,0.0)或(x,y)。x:I、R、C, y:I、R,kind:I,结果:C(kind) CONJG(x)求x的共轭复数。x:C,结果:C DBLE(x)*将x转换为双精度实数。x:I、R、C,结果:R(8) DCMPLX(x[,y])将参数转换为x、(x,0.0)或(x,y)。x:I、R、C, y:I、R,结果:C(8) DFLOAT(x)将x转换为双精度实数。x:I,结果:R(8) DIM(x,y)*求x-y和0中最大值,即MAX(x-y,0)。x:I、R, y的类型同x,结果类型同x DPROD(x,y)求x和y的乘积,并转换为双精度实数。x:R, y:R,结果:R(8)

[转载]Fortran 77, C, C++ 和 Fortran 90 的比较

[转载]Fortran 77, C, C++ 和 Fortran 90 的比较 收藏 发信人: quasar (飞贼克斯), 信区: Fortran 标题: Fortran 77, C, C++ 和 Fortran 90 的比较(转载) 发信站: 南京大学小百合站 (Tue Jun 1 10:59:14 2004) 瀚海星云 -- 文章阅读 [讨论区: MathTools] 发信人: HuiCai (老灰菜), 信区: SciComp 标题: Fortran 77, C, C++ 和 Fortran 90 的比较(转载) 发信站: 瀚海星云 (2002年12月19日10:40:38 星期四), 站内信件 【以下文字转载自 Fortran 讨论区】 【原文由 HuiCai 所发表】 Fortran 77, C, C++ 和 Fortran 90 的比较 https://www.360docs.net/doc/2d9141979.html,/develop/article/16/16085.shtm 三十年来, 从 Fortran 77 开始, Fortran 成为了计算科学的主要语言.在这段时间里, Fortran 的数值能力变得非常稳定而且优于其它计算机语言; 最大的改变来自于不断增长的各种可靠的数值过程库的种类. Fortran 联合(union), 它的使用技巧, 扩充的数值库为计算科学赋予了良好的基础. 可是在过去十几年中, 动态数据结构(特别是动态数组)的重要性不窜上升, UNIX 工作站, 复杂的交互式可视化工具, 以及更近的并行体系结构--Fortran 77 都没有实现--刺激了其它语言作为计算语言的使用, 最明显的一个例子是C. 最近C++ 也已经引起人们的兴趣, Fortran 通过发展到 Fortran 90来弥补它在现代科学计算 方面的不足. 这部分的一个通常的工作是比较四种语言对科学计算的适应性的, 这四种语言是两个C 的代表(C, C++) 和两个Fortran的代表(Fortran 77, Fortran 90). 下面的表格总结了这种比较, 后面的内容试图合 理地解释这种等级排序, 从最好(1)到最差(4).. 功能 ------------ F77 - C - C++ - F90 数值健壮性 ---- 2 ---- 4 --- 3 ----- 1 数据并行性 ---- 3 ---- 3 --- 3 ----- 1 数据抽象 ------- 4 ---- 3 --- 2 ----- 1 面向对象编程 - 4 ---- 3 --- 1 ----- 2 函数型编程 ---- 4 ---- 3 --- 2 ----- 1 平均等级 ------ 3.4 - 3.2 - 2.2 -- 1.2

C与FORTRAN的差别

https://www.360docs.net/doc/2d9141979.html,/c.htm 2. C语言和Fortran语言的差异 由于两者产生的背景不同,它们是存在差异的,在比较了几组源代码之后,主要有以下体会: C 最大的优点在于灵活,不但可以藉由 struct 来定义新的数据结构,同时 C 的pointer 更可以让我们自由而且有效率地处理大数据。而在 UNIX 系统中,由于整个操作系统绝大部分就是 C 写出来的,故我们也有方便的 C 函数库,直接使用系统资源与享受系统带来的服务,以做到一些低阶、快速的动作。而FORTRAN从一开始就用于科学计算,它与C的差异主要表现为: * 复数运算的速度 * 程序参数与字串 * 内存的动态管理 * 多维阵列的处理 * 函数调用与参数传递 2.1. 复数运算的速度 在进行复数运算的时候,C++ 可以定义复数的 class,还可以重新定义所有的四则运算式,复杂的算式也可以做到由一个表达式来解决。但它的重新定义复数四则运算是用函数来做的,使用函数来调用其速度很慢,除非采用 inline function 的方式,但会遇到以

下的问题:要先将这个算式拆解,分别算过后再重组结果,故表面上程序代码很简洁,但实际上是 compiler做了很多工作,还是要付出相当的计算时间代价的。 至于 Fortran,最大的优点在于复数 (complex number) 的运算,复数是 Fortran 的基本数据类型之一,这正是 C 所缺乏的 (C 基本上只有实型与整型类型而已)。虽然C 也可以由 struct 的定义,达到复数四则运算的目的,但却很可能牺牲了程序效能,或者是程序写起来相当繁杂降低可读性。因此,在大量而且要求高速的复数运算场合, Fortran 实际上比 C 还要适合。 然而既然复数已是 Fortran 基本数据类型之一,则 Fortran compiler在设计上可以做到对复数特别的 optimization,例如如果遇到较短的复数运算式,它可以用“心算”直接得出 real_part 与 imag_part 的 expression,像这样: real(a) =……;imag(a) = ……. 如此只需两步就得到结果。直到遇到太长太复杂的算式,才去做拆解的动作。 这样使用 C 来做复数运算可能需要绕圈圈,而且绕出来的圈圈可能还不小。不过如果程序中需要复合的数据结构,如一个自定义的数据结构中既有浮点数、整数、还有字符串时, Fortran 只有举白旗投降了。当然, Fortran 如果要做还是可以做,只是不太方便,而且可能也需要绕圈圈。但如果使用 Fortran 90 则不成问题了,因为 Fortran 90 也有类似 C 的 struct 结构以定义复合的数据类型。 2.2. 程序参数与字串 C 程序可以有参数串列, Fortran 则没有。例如,当程序执行时,必须输入 a, b, c 三个参数,在 C 可以这样写: int main(int argc, char **argv) { int a, b, c;

fortran与c语言接口参数传递混合编程

Sun Studio 12:Fortran 编程指南 ?Previous: 第10 章并行化 第11 章C-Fortran 接口 本章论述Fortran 与C 的互操作性方面的问题,内容仅适用于Sun Studio Fortran 95 和C 编译器的特定情况。 11.9 Fortran 2003 与C 的互操作性简要说明了Fortran 2003 标准第15 部分中提到的C 绑定功能。(此标准可以从国际Fortran 标准Web 站点获得)。Fortran 95 编译器实现了标准中所述的这些功能。 如不特别注明,32 位x86 处理器视为与32 位SPARC 处理器等同。对于64 位 x86 处理器和64 位SPARC 处理器也是如此,只是x86 系统未定义REAL*16 和COMPLEX*32 数据类型,这些数据类型只能用于SPARC。 11.1 兼容性问题 大多数 C-Fortran 接口必须在以下这些方面全部保持一致: ?函数和子例程的定义及调用 ?数据类型的兼容性 ?参数传递(按引用或按值) ?参数的顺序 ?过程名(大写、小写或带有结尾下划线(_)) ?向链接程序传递正确的库引用 某些C-Fortran 接口还必须符合: ?数组索引及顺序 ?文件描述符和stdio ?文件权限 11.1.1 函数还是子例程? 函数一词在 C 和Fortran 中有不同的含义。根据具体情况做出选择很重要:?在C 中,所有的子程序都是函数;但void函数不会返回值。 ?在Fortran 中,函数会传递一个返回值,但子例程一般不传递返回值。

当Fortran 例程调用C 函数时: ?如果被调用的C 函数返回一个值,则将其作为函数从Fortran 中调用。 ?如果被调用的C 函数不返回值,则将其作为子例程调用。 当C 函数调用Fortran 子程序时: ?如果被调用的Fortran 子程序是一个函数,则将其作为一个返回兼容数据类型的函数从 C 中调用。 ?如果被调用的Fortran 子程序是一个子例程,则将其作为一个返回int(与Fortran INTEGER*4兼容)或void值的函数从C 中调用。如果Fortran 子例程使用交替返回,则会返回一个值,这种情况下它是RETURN语句中的表达式的值。如果RETURN语句中没有出现表达式,但在SUBROUTINE语句中声明了交替返回,则会返回零。 11.1.2 数据类型的兼容性 表11–2总结了Fortran 95(与 C 比较)数据类型的数据大小和缺省对齐。该表假设未应用影响对齐或提升缺省数据大小的编译选项。请注意以下事项: ? C 数据类型int、long int和long在32 位环境下是等同的(4 字节)。 但是,在64 位环境下long和指针为8 字节。这称为LP64 数据模型。 ?在64 位SPARC 环境下,当用任意-m64选项进行编译时, REAL*16和COMPLEX*32与16 字节边界对齐。 ?标有4/8 的对齐表示缺省情况下与8 字节边界对齐,但在COMMON 块中与 4 字节边界对齐。COMMON 中的最大缺省对齐为4 字节。当用-m64选项进 行编译时,4/8/16 表示与16 字节边界对齐。 ?REAL(KIND=16)、REAL*16、COMPLEX(KIND=16)、COMPLEX*32只能用于SPARC 平台。 ?数组和结构的元素及字段必须兼容。 ?不能按值传递数组、字符串或结构。 ?可以在调用点使用%VAL(arg),按值将参数从Fortran 95 例程传递到C 例程。假如Fortran 例程具有一个显式接口块,该接口块用VALUE属性声明了伪参数,则可以按值将参数从 C 传递到Fortran 95。 ?数值序列类型的组件的对齐方式与通用块的对齐方式相同,也会受到-aligncommon选项的影响。数值序列类型是这样一种序列类型:其中所 有组件的类型为缺省整数、缺省实数、双精度实数、缺省复数或缺省逻辑,而不是指针。 ?在大多数情况下,非数值序列类型的数据类型组件以自然对齐的方式对齐,但QUAD 变量除外。对于四精度变量,32 位SPARC 平台和64 位SPARC 平台之间的对齐方式不同。 ?在所有平台上,用BIND(C) 属性定义的VAX 结构和数据类型的组件始终与C结构具有相同的对齐方式。

大学FORTRAN考试试题精修订

大学F O R T R A N考试试 题 标准化管理部编码-[99968T-6889628-J68568-1689N]

《高级语言程序设计(FORTRAN)》考试样题 一、选择题(每小题2分,共40分) 1. 下列标识符中不能作为FORTRAN的合法变量名的是_____D_____。 A) A_1 B) A1 C) A1A D) A+1 2. 在FORTRAN的变量类型说明语句中没有 B A) REAL语句B)CHAR语句C)INTEGER语句 D)LOGICAL语句 3.FORTRAN90 源程序的扩展名是 C 。 A. TXT B. F C. F90 D. FOR 4.下列关于符号常量的说法正确的是___C____。 A.符号常量的定义应该放在所有语句之前 B.符号常量不可以是字符型常量 C.在一个程序单位中定义一个符号常量后,不能再改变它的值 D.符号常量定义语句与赋值语句一样,是可执行语句 5、在下列写法中,__D______不是FORTRAN常量。 A. .TRUE. C. , ,000,000 6.表达式15/4/的值是 B 。 A.整数2 B.实数1.5 C.实数2.25 D.实数1. 3 7. 下列不是FORTRAN赋值语句的是 _____D______。 A) X=.TRUE. B) X=X*X C) X=X**2**2 D) X=X++ 8. 梯形的上底为A,下底为B,高为H,计算其面积的FORTRAN表达式中错误的是____A____。 A)1/2*(AB)*H B)(A+B)*H/2 C)(A+B)/2*H D)*(A+B)*H 9. 要选拔身高T>米且体重W<公斤的人,FORTRAN的逻辑表达式是__C_____。 A) B) C) D) 90规定,变量类型声明的优先顺序是 C 。 A.隐含约定(I-N规则)、IMPLICIT声明、类型声明 B.类型声明、隐含约定(I-N规则)、IMPLICIT声明 C.类型声明、IMPLICIT声明、隐含约定(I-N规则) 声明、类型声明、隐含约定(I-N规则) 11、假设CH是一个字符型变量,并且具有足够的长度,则对于CH(3:7),下面说法正确的是___D________。 A.它是一个数组片段 B.它是一个数组定义形式 C.它是CH的一个子串,并且长度是4 D.它是CH的一个子串,并且长度是5 12.数组声明语句为: INTEGER,DIMENSION(-5:-1,-3:3,11:15) ::A 数组共有 A 个元素。 A.175 B.150 C.120 D.17 13. 下列DATA语句中正确的是______C____。 A) DATA /A,B/, B) DATA A, B/2*/ C) DATA A, B/2* D) DATA A/, B/ 14. 下列有关FORTRAN数组的说法正确的是______D_____。 A) 数组定义语句只能定义一维或二维数组 B) 数组元素下标不能出现负值 C) 在赋值语句中出现的A(3)肯定是数组元素 D) 程序中使用的数组必须进行说明

C与FORTRAN混合编程2(写得挺好的)

发信人: jxbking (arcane), 信区: Fortran 标题: 偶总结的FORTRAN/C/C++混合编程,大家有兴趣就看看吧 发信站: 南京大学小百合站(Fri Jun 4 13:21:50 2004) C/C++/FORTRAN 混合编程 混合编程在软件编程中是经常遇到的问题,尤其是C/C++/FORTRAN的混合编程,本文主要说明以上三种语言混合编程中经常遇到的问题,同时,也说明了不同平台下混合编程应注意的问题。 混合语言编程要注意的问题主要体现在:函数调用和数据结构的存储。 1 Windows平台 函数:由于Fortran编程语言没有大小写之分,Windows平台下的混合语言编程要注意的主要是大小写的问题。考虑到编译器的差异,可以用下面的方式进行跨平台编程的函数声明。(C/C++编译器使用Mi crosoft Visual C++ 6.0, Fortran编译器使用Digital Visual Fortran 6.0)。 假设一个C的函数为void cFunction(); 那么,只需要在它的头文件里面进行如下定义即可: #ifdef __cplusplus exte rn “C” void { #endif extern void __stdcall CFunction(); #define cFunction CFUNCTION #ifdef __cplusplus } #endif 这样,在Fortran或者C++的程序里面就可以直接调用了。 假设是一个Fortran函数SUBROUTINE FFUNCTION(); 那么,在C++头文件里进行如下的定义就可以了: #ifdef __cplusplus extern “C” void { #endif extern void __stdcall ffunction(); #define ffunction FFUNCTION

工程分析程序设计上机作业一Fortran程序设计基础

工程分析程序设计 上机作业(一) Fortran 程序设计基础 上机目的:掌握程序书写、字符集和标识符、数据类型、声明、算术表达式、表控输入输出语句等编程基本概念。 1、 若有实型数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-B SQRT(REAL(ABS(K)+1)) MAX(J,MOD(J,K)) J+INT(T/B)/2 2、 从键盘输入三个角度值a, b, c ,计算如下式子的值: 22 34a b a b +- c b a b a tan |)||cos(|| |sin +++ 26ln()1403b c a ++ 3、 已知一圆柱底面半径R 为6.4,高为5,编程求圆柱底面圆周长、圆面积,圆柱的体积和表面积;以 R=6.4为半径的圆球表面积和体积、(要求在变量声明的同时赋初值) 4、 编写一个程序,要求完成以下要求: (1) 提示用户输入任意的3个小数; (2)显示这三个小数; (3)将这三个小数相加,并显示其结果; (4)将结果按四舍五入方法转换成整数并显示。 5、 有一个六边形,求其面积。为求面积,作了3条辅助线。如图所示:(提示,三角形面积 2 a b c s ++=,a 、b 、c 为三个边长)。 =21 6、 我国现在人口13.0亿人,假定每年增长率为1.5%,求n 年以后的人口数。n 从键盘输入。

7、 请写一个程序,可以让使用者输入初始速度V 0(单位为m/s )与角度θ(单位°),利用下列公式计算 飞行时间与距离: g V t /sin 20θ= t V D ?=θcos 0

C语言和Fortran语言的比较

C语言和Fortran语言的差异 本文详细介绍C语言和Fortran语言的差异 1. C++语言和Fortran语言的发展背景 在程序设计语言的发展过程中,FORTRAN 语言被认为是科学计算的专用语言。后来推出的FORTRAN90 和FORTRAN 95 版本也不例外,它们虽然可以完全实现C++语言同样的功能,然而其软件开发环境和软件的集成性等方面都远不如C++ 语言。近年来,随着计算机软硬件技术的发展,数据结构、数据库管理技术、可视化与计算机图形学、用户接口系统集成以及人工智能等领域的成果被逐渐应用到结构分析软件中,结构分析软件的设计并不仅仅局限于单一的科学计算需要涉及众多的软件开发领域。C++ 语言可以提供这类软件开发所需的功能,而用FORTRAN 90 却很难实现,另一方面从软件的编程环境来看,目前FORTRAN 90 的编译器极少,而C++ 语言的编译系统相当普及,可以运行在各种机型上,便于实现跨平台的软件系统集成。 2. C语言和Fortran语言的差异 由于两者产生的背景不同,它们是存在差异的,在比较了几组源代码之后,主要有以下体会: C 最大的优点在于灵活,不但可以藉由struct 来定义新的数据结构,同时C的pointer 更可以让我们自由而且有效率地处理大数据。而在UNIX 系统中,由于整个操作系统绝大部分就是 C 写出来的,故我们也有方便的C 函数库,直接使用系统资源与享受系统带来的服务,以做到一些低阶、快速的动作。而FORTRAN从一开始就用于科学计算,它与C的差异主要表现为: * 复数运算的速度 * 程序参数与字串 * 内存的动态管理 * 多维阵列的处理 * 函数调用与参数传递 2.1. 复数运算的速度 在进行复数运算的时候,C++ 可以定义复数的class,还可以重新定义所有的四则运算式,复杂的算式也可以做到由一个表达式来解决。但它的重新定义复数四则运算是用函数来做的,使用函数来调用其速度很慢,除非采用inline function 的方式,但会遇到以下的问题:要先将这个算式拆解,分别算过后再重组结果,故表面上程序代码很简洁,但实际上是compiler做了很多工作,还是要付出相当的计算时间代价的。 至于Fortran,最大的优点在于复数(complex number) 的运算,复数是Fortran 的基本数据类型之一,这正是C 所缺乏的(C 基本上只有实型与整型类型而已)。虽然C 也可以由struct 的定义,达到复数四则运算的目的,但却很可能牺牲了程序效能,或者是程序写起来相当繁杂降低可读性。因此,在大量而且要求高速的复数运算场合,Fortran 实际上比C 还要适合。 然而既然复数已是Fortran 基本数据类型之一,则Fortran compiler在设计上可以做到对复数特别的optimization,例如如果遇到较短的复数运算式,它可以用“心算”直接得出real_part 与imag_part 的expression,像这样: real(a) =……;imag(a) = ……. 如此只需两步就得到结果。直到遇到太长太复杂的算式,才去做拆解的动作。 这样使用 C 来做复数运算可能需要绕圈圈,而且绕出来的圈圈可能还不小。不过如果程序中需要复合的数据结构,如一个自定义的数据结构中既有浮点数、整数、还有字符串时,Fortran 只有举白旗投降了。当然,Fortran 如果要做还是可以做,只是不太方便,而且可能也需要绕圈圈。但如果使用Fortran 90 则不成问题了,因为Fortran 90 也有类似C 的struct 结构以定义复合的数据类型。 2.2. 程序参数与字串

Fortran用法小结

目录: 一、说明 二、概述 三、数据类型及基本输入输出 四、流程控制 五、循环 六、数组 七、函数 八、文件 一、说明 本文多数内容是我读彭国伦《Fortran 95 程序设计》的笔记。只读到第九章,主要是3~9 章,都是最基本的用法(原书共16章)。这里主要摘录了我看书过程中总结的一些Fortran和C不 同的地方,主要是语法方面。希望这份笔记能够给学过C但没有接触过Fortran的同学带去一些帮 助。要想得更清楚些,推荐看一下原书,觉得作者真的写得很好,很清楚;如果有C语言的基础, 看完前九应该很快的,花一两天就行了。觉得如果耐心看完本文,基本功能应该也可以顺利用起 来了。外,由于我之前没有用过Fortran,这次为了赶文档看书又看得很粗浅,大多数东西看过

之后都没得及仔细想,只是按着作者的意思去理解。所以这份笔记还处于纸上谈兵的层次。如果 有不妥的方,希望大家指正。谢谢! 文中蓝色的部分是程序代码,!后面的内容为注释。 二、概述 1、名词解释 Fortran=For mula Tran slator/Translation 一看就知道有什么特色了:可以把接近数学语言的文本翻译成机械语言。的确,从一开始 ,IBM设计的时候就是为了方便数值计算和科学数据处理。设计强大的数组操作就是为了实现这一 目标。ortran奠定了高级语言发展的基础。现在Fortran在科研和机械方面应用很广。 2、Fortran的主要版本及差别 按其发展历史,Fortran编译器的版本其实很多。现在在广泛使用的是Fortran 77和Fortr an90。ortran 90在Fortran 77基础上添加了不少使用的功能,并且改良了77编程的版面格式, 所以编程时推荐使用90。鉴于很多现成的程序只有77版本,有必要知道77的一些基本常识,至少保 证能够看77程序。以下是77和90的一些格式上的区别。

相关文档
最新文档