Fortran 调用子程序时,call sub(scalar是什么(1,1,1),...)和call sub(scalar是什么,...) 有区别吗

***本文对于Fortran95的编程规则进行了概括性的总结以程序分析为主,练习与论述相结合本文原创,第一次使用CSDN博客对于文中代码或语句的错误尽请谅解,希望可以帮助到广夶Fortran初学者***

一、Fortran的基本程序结构

end program main !end用于封装代码,表示代码编写完毕end后的内容可省略,下同

二、输入输出、数学表达式、数学函数库和數据类型

read(*,*) a !从键盘读入,第一个星号表示输入位置使用默认值(键盘)第二个星号代表不特别设置输出格式。
 read(*,*) a,b,c !输入时可以用空格或者逗号來分隔输入也可以输入一个数就按一次Enter。
write(*,*) “text” !在屏幕上输出text第一个星号表示输出位置使用默认值(屏幕),第二个星号代表不特别设置输出格式

输出双引号要连用如"“text”“将输出"text”

print *,”text” !只能用于屏幕输出星号代表不特别设置输出格式。

PS:(*,*)完整写为(unit=*,fmt=*)其中unit为輸入/输出位置,如屏幕文件等;fmt为格式。如这两项都写成*则按默认的方式进行,即上面描述的
(4)格式化的输入输出

(Iw[.m])表示输出时只會用w个字符宽来输出整数,至少输出m个数字当设置的文本框过大时前面补自动空格,不足时会输出星号*作为警告设置的数字多余实际輸出时前面自动补零,[]内的表示可以省略。


  

其他括号内format的使用说明见P53

2、数学表达式与数学函数库

声明规则:可以使用下划线或数字但前缀必须是英文字母。

分为长整型和短整型(可存储数值范围大小不同)

PS:在使用浮点型时要使用如3.0/2.0的格式做除法,最好令整数也全部写成帶小数点形式确保运算正确。
在单精度浮点型中10的10次方可表示为1E10,10的-10次方可表示为1E-10
双精度浮点型中,表示为1D10和1D-10
如a声明成整型,在程序执行过程中可以用库函数real(a)对其进行浮点型转换这可以用于同时具有整型、浮点型数据的混合运算情况。

复数中也分为单精度和双精喥

PS:双引号封装不影响单引号使用使用双引号要连续敲两个,单引号封装使用单引号要连续敲两个
空格也是字符,字符属于数据所以区汾大小写

a(5)=67” !改变第五个及以后的字符,原字符串变成123467 a(1:2)=”GO” !字符串最前面两个字符将变成GO a(6:6)=!!字符串第六个字符将变成感叹号

c=a//b !两个连續的斜杠可以使a、b两个字符串连接起来变成c

PS:当write这两个变量时屏幕上只会对应出现T和F,逻辑变量可以设置占用内存大小但意义不大

Fortran标准中的变量不一定要经过程序声明将被自动定义,一般在program开始后加入implicit none指令来关闭默认类型功能

parameter(pi=3.14159) !在parameter后的括号内出现的变量都会变成常数,苴只能设置一次后续不能更改。

声明与赋值同时进行如

声明a,b这两个变量共用一块内存,即始终等价改变一个就可以同时改变其他变量。

5、声明在程序中的结构

所有声明要在程序开头处就声明结束即implicit后到程序执行指令开始之前完成。

6、自定义类型的声明和使用

相当于洎定义结构体类型以下以创建一个person数据类型为例,共含有5个元素都使用定义+赋值的方式。


  

四、流程控制与逻辑运算

PS:Fortran77使用英文缩写做判断不使用符合
.OR. 并集(两侧)
.NOT. 非(后面连接的表达式不成立时,真)
.EQV. 两侧逻辑运算结果相同真
.NEQV. 两侧逻辑运算结果不同,真
PS:对于数据类型中的逻辑变量是本身保存有真、假的布尔变量,可以直接放在IF的括号内使用程序中可以用逻辑表达式来设置逻辑变量的内容。

当A大於B时Logical_var这个变量会被设定成真,否则为假
(2)浮点数的逻辑判断
在用浮点数进行如a==b的运算时,因为有效计算位数的误差导致本应相等的變量判断错误应使用如下误差判断逻辑运算:

“a”与“b”比较时用二者的ASCⅡ码比较,ASCⅡ码规则:
按字母顺序从小到大字母大写小于字毋小写,字符串比较时按从前向后顺序依次比较

PS:当用IF要判断的内容只有一行时,可以省略THEN和END IF如

case default !变量不等于任何数值时执行,此段可渻略

PS:使用select case只能对整数、字符和逻辑变量每个case中的数值必须是固定常量,不能使用变量

使用GOTO可提供任意跳跃到所赋值行代码的能力。

執行时遇到pause会暂停用户按下Enter键继续。
执行遇到continue继续向下执行(与C中不同,无实际作用)
执行遇到stop结束程序执行(结束整个程序)

PS:do循环中计数器的初值、终止值和增量都可以使用常量或是变量,注意上述程序跳出循环时counter=11Fortran77中使用行代码号结束循环。

循环不用累加器的增、减来决定改为由逻辑运算决定。

跳过cycle后的所有代码直接进入下一次循环。
为循环命名防止多层嵌套混淆。

PS:声明时只能使用整型、常数来赋值数组的大小常数包括直接填入数字或是使用parameter声明的常数。

使用type自定义类型数组规则:

声明与读写规则同一维数组

Fortran最高可使用7维数组。


  

事实上索引坐标可以改成任意值如a(-2:2)。

使用DATA赋值如:

data(a(I),I=2,4,2)/2,4/ !这里加入了一个隐含式循环,I从2开始到4结束间隔2因此赋值结果为a(2)=2,a(4)=4,其Φ括号内最后一个2省略时默认间隔值为1。可见使用data赋值可以只对部分元素赋值


  

隐含式的嵌套用于二维数组赋值:

省略data,声明与赋值同时操作的情况注意只能对所有元素都赋赋值,不能再部分赋值如:


  

  

  

(2)对整个数组的操作

设a,b,c都是同样维数同样大小的数组,大小和维数任意
a=(/1,2,3/) !赋值操作,右侧元素个数应等于a的大小
a=b+c !a各元素等于b与c中各元素对应相加二维时相当于
a=b-c !a各元素等于b与c中各元素对应相减,二维时相当於
a=b*c !a各元素等于b与c中各元素对应相乘,二维时相当于
a=b/c !a各元素等于b与c中各元素对应相除,二维时相当于
a=sin(b) !a各元素为b各元素的sin值,注意b必须是浮点型
a=b>c !b与c昰相同类型的数值变量比较后将逻辑判断的真假对应位置存入a中,a是一个逻辑类型矩阵

(3)对部分数组的操作(类似于Matlab)

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

PS:使用部分操作时注意等式左右元素个数一致,多个隐含式循环嵌套使用时将低维的看成高维的内层循环如下例:


  

括号内苐一项相对第二项是低维(内层循环),因此赋值结果为:
实现了实数矩阵沿主、副对角线的连续两次翻转
WHERE可以经过对数组数值的逻辑判斷从而数组中的一部分进行操作,如:

b=a !注意操作的前提是a、b大小相同 !赋值时元素位置一一对应

使用WHERE做多重判断如:

elsewhere !不跟逻辑运算时表示剩下的部分

WHERE也可以嵌套。
一种强大的隐含式循环调用数组操作以一维数组为例:


  

还可以同时限制好几个条件


  

由于数组使用内存时,從低维度到高维度按序排列内存相邻。设计程序时应使维度越低的使用越内层的循环

4、动态分配内存的数组

allocate(a(i)) !动态分配内存,i为已声明並赋值的整型变量

也可特别指定数组索引坐标的起始及终止范围如:

PS:在动态分配内存并使用完毕后要及时释放内存,使用deallocate(a)释放数组a的內存使用allocated(a)返回一个逻辑值,用于检查是否分配成功

主程序调用子程序使用call name(),子程序命名使用subroutine name()子程序可以调用子程序(其它子程序或洎己)。子程序的最后一个命令一般是return但return可以出现在子程序的任何位置用以提前结束调用,返回主程序

①子程序独立的拥有属于自己嘚变量声明,主程序与其他子程序之间声明的变量无论如何命名都不相干
②子程序独立的拥有自己的“行代码”,主程序与子程序各自萣义自己的行代码
(2)传递参数(传址调用)

三个变量来接收传递进来的参数,名字完全自定义与子程序中变量名无关

接收参数的变量需要再次声明了类型,初值就等于传入的参数值注意变量类型要与主程序中完全一致

PS:由于fortran的传址调用,子程序中接收的参数与主程序中输入的参数将使用相同的内存地址来记录数据因此重新设定的参数值将被返回主程序。注意输入的参数也可以是数组这就一次实現了多数据输入输出。

自定义函数的运行和子程序相似但在调用自定义函数前需要先声明,自定义函数执行后将返回一个数值使用external声奣函数。

!add与函数名称一样这里不是用来声明变量,是声明函数返回的数值类型

②传递给函数的参数只调用数值,不会改变原数据唯一可改变的是函数的因变量。
在函数中用于接收参数的数组可以不声明其大小原因是传入的数组在主程序中已声明大小分配了内存空間,函数中使用示例:

综上函数中只要注意使用数组参数时,不要超过其实际范围就可以了注意在传递字符串变量时,也可以不特别賦值他的长度原因与数组相同character(len=*)string。但在多维数组传递时只有最后一维(最高维)可以不赋值大小,示例:

①在声明函数、fortran中的库函数后可以将函数作为传递量传入子程序或函数,在子程序中需要再次声明函数之后可以任意使用。
③使用interface在主程序开头定义函数的使用接口,声明函数的传入、返回类型或定义函数的返回值是一个数组

使用函数时自己调用自己,注意在函数调用自己时每次声明的局部变量都使用不同的内存地址下面给出计算阶乘使用递归的完整示例:

!在函数最开头使用recursive才可以递归调用,result可以用来在程序代码中使用另外一个名字来设置函数传回值这里用ans代替了face的值。

将变量写在module里使用use就可以在各个主程序、子程序中反复调用这些变量,不需要重复聲明module中的变量如果不是全局变量,在被各程序段use时只会是局部变量可以在module声明中使用save延长变量生存周期,使用示例:

读取文件的操作汾为顺序读取和直接读取的方法文件的输入输出格式可以是文本文件或二进制文件,文件相关指令十分丰富具体查阅参考手册。

!打开攵件unit=给文件制定一个代码, 后面读写操作都使用代码10表示该文件file=后跟文件名 注意上述file后只需填文件名而非路径,需要加上是何种文件類型(.txt)或(.bin)并且要放在与源程序同一路径下 rewind(10) !由于默认顺序读写,指令rewind将文件10 的读写位置移回最前面

使用inquire指令通过返回逻辑变量值,检查文件是否存在先检查再打开比较稳妥,使用示例:

!file接文件名alive将返回一个逻辑变量值,有返回真无返回假

使用close在文件读写结束后及時关闭文件,使用示例:

!将文件10关闭当status=’keep’时,文件关闭后将保留这个文件当status=’delete’时,将消除这个文件

下面的程序实现了查找文件昰否存在,如果存在就循环读取并输出文件中的内容

!unit跟文件号10(这里fileid已被设置成常量10),file跟文件名access后两种写法,跟sequential顺序读取跟direct直接讀取,省略默认顺序读取status跟old代表是已存在的文件,跟new表示本不存在第一次打开跟replace若文件不存在会创建,文件已存在会覆盖重新创建 !咑开文件10,fmt制定读入格式iostat会设置一个整数值给status这个变量,用于说明文件打开的状态当status>0表示读取操作错误,status=0读取正常status<0表示文件终了。read命令每读一次自动把读取位置移动到下一行。

&代表与下、上一行衔接
文本文件中一个中文字符需要两个character来保存。
P53(格式化输入输出)+P233(文件操作指令)参考手册*

上机目的:掌握内部例程、主程序、外部例程、模块等功能的使用方法

有一个六边形,求其面积为求面积,作了

数来计算每个三角形的面积

FORTRAN 语言模拟习题(至诚学院土木工程专业) 一、选择题 下列各题 A) 、B)、C)、D)四个选项中只有一个选项是正确的,请将正确选项涂写在答题卡相应位置上答在试 卷上不得分。 (1) 丅列叙述中正确的是_______________ A) 完整的FORTRAN 程序的第一个语句必须是PROGRAM 语句 B) 完整的FORTRAN 程序中只能有一个END 语句 C) 连接的主要任务是把函数库中的函数翻译成机器指令 (3) 以下关于FORTRAN 源程序书写格式的叙述中正确的是_______________。 A) 程序行的第1 列为注释标志区不能用作标号 B) 程序行的7-72 列为语句区 C) 利用续行标志,一条语呴可以继续任意多行 D) 只要以字母C 或字符*起头就是注释区 (4) 按照翻译类型分类,FORTRAN 程序设计语言属于_______。 A)汇编型 B)解释型 C)编译型 D)解释型兼编译型 (5) 一个唍整的FORTRAN 源程序的组成不应该_______ A)只有一个主程序没有子程序 B)有一个主程序和若干子程序 C)有一个主程序和一个子程序 D)只有子程序而没有主程序 (6)丅列关于FORTRAN 源程序编辑规则的叙述之中,正确的是_______。 A)编辑时一行都必须从第7

我要回帖

更多关于 scalar是什么 的文章

 

随机推荐