FORTRAN学习中的一些小心得
- 格式:docx
- 大小:35.04 KB
- 文档页数:9
中南大学本科生课程设计(实践)设计报告(程序设计基础)题目微分方程求解实践报告学生学号1208100420学生姓名陈立湘指导教师蔡旭晖学院土木建筑学院专业班级土建类10-04班计算机基础教学实验中心2011年 06 月 30 日FORTRAN语言课程计摘要:本次实践主要是让我在独立自主的前提下发挥各种方法途径把在本学期学到的fortran知识运用起来解决实际问题,在问题伴随之下探索并努力解决,并借用了资料上的一些微分方程的解决程序以及书上的画图程序完成。
一.设计思想1.实践目标及目的最直接的目的自然是搜索资料运用所学知识编写一个大型程序来解决特定的实际问题,而众所周知fortran是世界上第一个被正式推广使用的电脑高级语言,而且电脑日益发展在生活中占据着越来越重要的地位,而程序语言又是电脑运行的基础,就像是人体上的各种细胞,组织……更甚者实践出真知,所以我们通过独立实践fortran语言来编写程序解决实际问题是锻炼自身以及学以致用,体验的最好的办法,这样能让我们独立自主,学以致用,实践知识,锻炼能力……2.问题分析当我看到课程设计任务上的三个问题时,义无反顾的选择了第二个,首先是因为微分方程在数学上比较实在(其实编程和数学不同的),问题大体内容是在意大利生物学家Ancona关于鱼类种群相互制约关系的研究前提下绘制一个食饵和鲨鱼数量随时间的变化情况图,这样的话问题就是编写一个微分方程的求解程序来解决这个题目,而在老师给予的参考资料上有一些微分方程的求解程序示范,那自然是要参考资料上的了,最后要以图的形式展现,那么fortran语言中的QuickWin就少不了了,而对于一个大程序子程序是必不可少的,这样实践的各类问题就都展现出来了,接下来就是一一解决。
二.系统设计与实现1.总体设计2.算法以及结构我的算法是以积分一步的特雷西方法为基础主程序辅之以QuickWin画图程序以及其他子程序链接在一起实行解决问题的。
对于VOF学习的几点体会1、对于网格的选择尽量选择四边形或六面体网格,而不用三角形或四面体网格,以简化多相流问题。
2、对于VOF 公式的选择Geo-Reconstruct:是目前最精确的界面跟踪方法,是对大多数瞬态VOF 计算所推荐使用的方法。
Donor-Acceptor:在网格中包含很多扭曲的六面体单元,可用该公式代替Geo-Reconstruct。
Euler-Explicit:可解决Donor-Acceptor 公式仅对四边形、六面体网格有效的问题,可用于三角形或四面体网格计算;也可以用于Geo-Reconstruct 不能给出满意结果的情形。
注意:Geo-Reconstruct和Donor-Acceptor,必须保证在区域内没有双边壁面。
3、对于VOF 模型相的定义原则上可以根据个人的喜好定义。
如果其中有一相是可压缩的,为了提高解的稳定性,应指定该相为主相。
注意:在VOF 模型中,只能有一相是可压缩的。
4、关于表面张力和壁面粘附对于网格的选择:在表面张力有重大影响的计算区域内应使用四边形或六边形网格。
在打开WallAdhesion后,在wall边界条件下指定接触角为每一对相。
(接触角定义:当系统达到平衡时,在气、液、固三相交界处,气-液界面和固-液界面之间的夹角。
实际反映的是液体表面张力与液-固界面张力间的夹角。
)提高解的收敛性:对于涉及到表面张力的计算,建议在Multiphase Model panel 中为Body Force Formulation 打开Implicit Body Force。
这样做由于压力梯度和动量方程中表面张力的部分平衡,从而提高解的收敛性。
5、关于运算环境的设置对于VOF 计算,应当选择Specified Operating Density,并且在Operating Density 下为最轻相设置密度。
这样做排除了水力静压的积累,提高了round-off 精度为动量平衡。
Read 的规则:按行读取,每次读一行,读完后光标自动跳到下一行的开头,空格和逗号代表结束(所以空格和逗号也是读取的一部分的话,需要使用“输入输出格式”)如果想要将一行数据读入数组,代码为:Read(10,*) s(:,:,:)不用规定输入输出格式,因为会根据s(:,:,:)确定需要读入的数字的个数,然后fortran会按部就班的读取,甚至文件中当前这一行的数字个数不足以填满s(:,:,:)的时候,read会自动跳到下一行继续搜索数字,直到填满s(:,:,:)为止。
但是需要注意给数组赋值的顺序:read会把它搜索到的第一个数字给s(1,1,1),第二个给s(2,1,1),第三个给s(3,1,1)…程序9 1: 将read(unit=field,fmt="(A79)",iostat=status)buffer 中的A79改为A2,结果只输出每行的前两个字符,说明read是按整行整行读取的。
中间空了几行之后,空行之后的内容还是能被读取和输出,这说明,空行和空白是不一样的:空行也算是一种文本内容,因此不会终止读取,而空白意味着结束。
!读取文件program mainimplicit nonecharacter(len=79)::filename="number.txt",bufferinteger,parameter::field=10integer::status=0logical aliveinquire(file=filename,exist=alive)if(alive)thenopen(unit=field,file=filename)do while(.true.)read(unit=field,fmt="(A79)",iostat=status)bufferif(status/=0)exitwrite(*,"(A79)")bufferend doelsewrite(*,*)filename,"does't exist."end ifpausestopend program main=============================================附number.txt===============================1234555666879789789789789二)Fixed Format(固定格式)扩展名:.F 或 .FOR1标号区:第l-5列可以写l至5位整数。
关于fortran的一些学习心得
长大以来,在学习编程语言方面,我一直被FORTRAN所吸引,也在不断地对它进行深
入的学习与研究。
FORTRAN是一门适用于数值计算和科学计算的高级编程语言,它也是一种特殊的编程语言,用于解决计算机科学中各种各样的复杂问题。
学习FORTRAN语言,最早是通过书本系统学习,书本上有很多重要的理论知识,字符
类型、常量、运算表达式、条件语句等,以及编写的一些示例程序等,这些通过书本系统
学习都是让我有基础的理论和基本的操作技巧。
接着,我又课余的时候,从事一些学习FORTRAN的实践工作,编写一些实用的小程序,包括求数据的极值、求数据的均值、求数据的方差等,以及一些求解一元非线性方程组、
矩阵运算、牛顿插值法等程序,甚至也参与了一些开发多维数值计算模型和混合数值-符
号计算模型程序的项目,这些项目都有助于我提高FORTRAN领域的实际技能。
学习FORTRAN也带给我乐趣与挑战,它需要很多的理论知识和分析能力,学习的过程中,一个是不断的收集资料,然后分析其中的每个部分,学习数学知识,总结出程序的功能,而且在编写程序的过程中,还需要考虑很多实际问题,这使我学习FORTRAN有了更多
的挑战与激励,也乐在其中。
总体来说,学习FORTRAN语言,对我成长大有裨益,我深深的欣赏这门编程语言的强
大功能,通过学习FORTRAN,也逐渐提升了自己的编程基础,以及算法一类知识的能力,
而且,今后我也会继续以实践为主,加以系统地学习,理解FORTRAN的编程模式和思想,
进一步提升自己运用FORTRAN的技能和能力。
《FORTRAN95程序设计》学习笔记编辑整理:尊敬的读者朋友们:这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望(《FORTRAN95程序设计》学习笔记)的内容能够给您的工作和学习带来便利。
同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。
本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快业绩进步,以下为《FORTRAN95程序设计》学习笔记的全部内容。
《FORTRAN 95程序设计》学习笔记66RPG gg★目录★《FORTRAN 95程序设计》学习笔记 (1)基础知识(基础、字符串、FORMAT、隐式、TYPE) (1)流程与控制(if、select、do) (4)数组(声明、隐式循环、整体操作、可变数组) (5)函数与子程序(子程序、函数、全局变量) (6)MODULE与面向对象(重载操作符、虚函数) (9)文件相关(OPEN、WRITE、READ) (10)指针(指向变量、数组、函数) (11)Visual Fortran 编译器(DLL,VB调用) (12)数值算法与IMSL(数值算法插件) (14)常用库函数(数学、数组、零碎、子程序) (15)基础知识(基础、字符串、FORMAT、隐式、TYPE)★【小玩意】二进制观察器:装在M.。
Visual Studio\DF98\bin,有一个Bitviewer,可以观察变量储存方式★【语法】续行:行结尾或行开头使用&符号;注释:使用 ! 符号★【语法】数学表达式:+ ;— ;*;/ ;( ;) ;**乘幂★【语法】程序结束:STOP (Ruby的exit)★【语法】输出:write(*,*),完整写法:write(unit=*,fmt=*)⏹建议:少用print,尽量用write★【语法】声明⏹整型:integer(kind=4) a ;其中kind是使用的bytes数,4 or 2◆其他写法:integer*4 a; integer(4) a⏹浮点:real(kind=4) a ;有效数位6位(12345678存为1。
我的Fortran基本用法小结周日, 10/14/2007 - 21:00 — gator一、说明二、概述三、数据类型及基本输入输出四、流程控制五、循环六、数组七、函数八、文件一、说明本文多数内容是我读彭国伦《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和Fortran90。
ortran 90在Fortran 77基础上添加了不少使用的功能,并且改良了77编程的版面格式,所以编程时推荐使用90。
鉴于很多现成的程序只有77版本,有必要知道77的一些基本常识,至少保证能够看77程序。
以下是77和90的一些格式上的区别。
【以下文字转载自D_Atmosphere 讨论区】【原文由superjyq 所发表】我的Fortran基本用法小结高级语言和算法组heavensky目录:一、说明二、概述三、数据类型及基本输入输出四、流程控制五、循环六、数组七、函数八、文件一、说明本文多数内容是我读彭国伦《Fortran 95 程序设计》的笔记。
只读到第九章,主要是3~9章,都是些最基本的用法(原书共16章)。
这里主要摘录了我看书过程中总结的一些Fortran和C不同的地方,主要是语法方面。
希望这份笔记能够给学过C但没有接触过Fortran的同学带去一些帮助。
要想弄得更清楚些,推荐看一下原书,觉得作者真的写得很好,很清楚;如果有C语言的基础,看完前九章应该很快的,花一两天就行了。
觉得如果耐心看完本文,基本功能应该也可以顺利用起来了。
另外,由于我之前没有用过Fortran,这次为了赶文档看书又看得很粗浅,大多数东西看过之后都没来得及仔细想,只是按着作者的意思去理解。
所以这份笔记还处于纸上谈兵的层次。
如果有不妥的地方,希望大家指正。
谢谢!文中蓝色的部分是程序代码,!后面的内容为注释。
二、概述1、名词解释Fortran=Formula Translator/Translation一看就知道有什么特色了:可以把接近数学语言的文本翻译成机械语言。
的确,从一开始,IBM设计它的时候就是为了方便数值计算和科学数据处理。
设计强大的数组操作就是为了实现这一目标。
Fortran奠定了高级语言发展的基础。
现在Fortran在科研和机械方面应用很广。
2、Fortran的主要版本及差别按其发展历史,Fortran编译器的版本其实很多。
现在在广泛使用的是Fortran 77和Fortran90。
Fortran 90在Fortran 77基础上添加了不少使用的功能,并且改良了77编程的版面格式,所以编程时推荐使用90。
鉴于很多现成的程序只有77版本,有必要知道77的一些基本常识,至少保证能够看懂77程序。
《FORTRAN语言程序设计》教学的几点体会霍 星 朱仲元(内蒙古农业大学水利与土木建筑工程学院)摘 要 《FOR TRAN语言程序设计》是工科专业的基础课程。
本文是作者多年来为水利工程专业、水文水资源专业、给水排水专业从事高级语言程序设计教学与实习的几点体会。
关键词 工科 FOR TRAN语言程序设计 教学 体会 FORTRAN语言是国际上最早出现的计算机高级语言,它结构紧凑、计算能力强。
据文献(1)介绍,目前世界上仍有90%的数值计算采用FORTRAN 语言编写的程序计算。
在科学技术发达的国家中,几乎每一个工程技术人员都会使用FORTRAN语言,我国大多数理工科院校都开设FORTRAN语言课程。
我院根据工科专业的特点,从1985年开始开设《FORTRAN语言程序设计》课程。
十多年来不断摸索,总结经验,改进教学,以适应专业的要求。
现就这门课的教学法谈几点体会。
1 培养兴趣,打好基础高级语言程序设计是一门基础课程,不但要求学生有较强的逻辑思维能力,而且要求学生有较好的数学表达能力和数值计算基础。
为了使初学者能尽快地掌握计算机知识,进入计算机的应用领域,在课程讲授过程中,我们特别注意培养学生的学习兴趣。
学生的学习兴趣和对课程的热爱程度对学习课程是十分重要的。
恩格斯说“兴趣与爱好是最好的老师”。
初接触计算机时,很多学生感到新奇、好玩,这不能说是兴趣,只是一种好奇。
随着课程的不断深入,大量的规则、定义、要求和机械的格式出现,很容易使一部分(甚至是大部分)学生产生枯燥无味的感觉。
为了把学生的好奇转化为学习兴趣,授课时我们改变过去先给出定义和规则的讲授办法,而是从具体问题入手,努力把枯燥无味的“语言”讲的生动、活泼。
在第一节课上,就给学生找一些《高等数学》、《线性代数》、《水力学》等已学课程或同行课程的问题,用算法语言来求解,使学生体会程序设计的用途和一种全新的解决问题的方法。
在课程的进行中,引导学生学一种算法,就尝试在同行课程中应用。
Fortran学习总结- 我不是企鹅的日志- 网易博客Fortran学习总结目录:一、说明二、概述三、数据类型及基本输入输出四、流程控制五、循环六、数组七、函数八、文件一、说明本文多数内容是读彭国伦《Fortran 95 程序设计》的笔记。
二、概述1、名词解释Fortran=Formula Translator/Translation一看就知道有什么特色了:可以把接近数学语言的文本翻译成机械语言。
的确,从一开始,IBM设计的时候就是为了方便数值计算和科学数据处理。
设计强大的数组操作就是为了实现这一目标。
fortran奠定了高级语言发展的基础。
现在Fortran在科研和机械方面应用很广。
2、Fortran的主要版本及差别按其发展历史,Fortran编译器的版本其实很多。
现在在广泛使用的是Fortran 77和Fortran90。
ortran 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的一些不同其实很多,在下面涉及具体方面时可以看到。
Fortran语言编程小结(五篇材料)第一篇:Fortran语言编程小结1.单双精度Program ex01 implicit none real(kind=4):: a real(kind=8):: b a=3.***66666666_4!确定这个数字是使用单精度 b=3.***66666666_8!确定这个数字是使用双精度 write(*,*)a,b End program ex012.判断kind值 program ex02 Implicit none!判断可以记录9个位数的整数kind值integer, parameter :: long_int = selected_int_kind(9)!判断可以记录3个位数的整数kind值integer, parameter :: short_int = selected_int_kind(3)!判断可以有3个有效位数, 指数可以记录到3的浮点数kind值integer, parameter :: long_real = selected_real_kind(10, 50)!判断可以有10个有效位数, 指数可以记录到50的浮点数kind值integer, parameter :: short_real= selected_real_kind(3, 3)integer(kind=long_int):: a = 123456 integer(kind=short_int):: b = 123 real(kind=long_real):: c = +1.23456789D45 real(kind=short_real):: d =+1230 write(*, “(I3,1X,I10)”)long_int,a write(*, “(I3,1X,I10)”)short_int, b write(*, “(I3,1X,E10.5)”)long_real, c write(*, “(I3,1X,E10.5)”)short_real, d END3.TYPE program ex0434 implicit none Type :: person!开始建立person这个类型character(len=30):: name!人名integer :: age!年龄integer :: height!身高INTEGER :: weight!体重character(len=80):: address!地址End type person type(person):: a!声明一个person类型的变量write(*,*)“NAME:” read(*,*)a%name write(*,*)“AGE:” read(*,*)a%age write(*,*)“HEIGHT:” read(*,*)a%height write(*,*)“WEIGHT:” read(*,*)a%weight write(*,*)“ADDRESS:” read(*,*)a%address write(*,100)a%name,a%age,a%height,a%weight 100 format(“Name:”,A10/,“Age:”,I3/,“Height:”,I3/,“Weight:”,I 3/,&“Addres:”,A80)End4.REAL 与 INTEGER Program ex0431 implicit noneinteger :: a=1integer :: b=2real:: cc=a/b!c=1/2=0, 虽然c是浮点数,但因为a,b是整数,计算a/b时会用整数去计算.write(*,“(F5.2)”)c End5.DATA 变量表/初值表/,变量表/初值表/,… PROGRAM ex0430 IMPLICIT NONE INTEGER A REALB COMPLEXC CHARACTER(20)STR DATA A,B,C,STR /1,2.0,(1.0,2.0), 'FORTRAN 77'/ WRITE(*,*)A,B,C,STR END6.复数实虚部Program ex0430 complex :: c =(1,2)write(*,100)real(c),'+',aimag(c),'i' 100 format(f5.1,a1,f5.1,a1)End7.逻辑输出 Program ex0416logical a,ba=.true.b=.false.write(*,100)a,bformat(L5,L4)End8.Program ex0415character(len=20)stringcharacter(len=5)substringstring = “Have a nice day.”substring = “nice”write(*,*)ichar('A')!输出字符A的ASCII码write(*,*)char(65)!输出ASCII码65所代表的字符,也就是Awrite(*,*)len(string)!输出字符串string声明时的长度write(*,*)len_trim(string)!输出字符串string内容的长度write(*,*)index(string, substring)!nice在Have a nice day的第8个位置 End9.Program ex0414character(len= 6)firstcharacter(len=10)secondcharacter(len=20)addfirst=“Happy ”second=“Birthday”add = first//second!经由两个连续的除号可以连接两个字符串write(*,100)addFORMAT('生日快乐',/,A)End10.带精度计算 Program ex0408real(kind=8):: a,ba=1b=0.1write(*,*)a,“+”,b,“=”,a+b End11.逻辑if语句 Program ex0504 implicit noneinteger rain, windspeedlogical r,wwrite(*,*)“Rain:”read(*,*)rainwrite(*,*)“Wind:”read(*,*)windspeedr =(rain>=500)!如果rain>=150, r=.true, 不然r=.false.w =(windspeed>=10)!如果windspeed>=10, w=.true, 不然w=.false.if(r.or.w)then !只要r或w有一个值是true就成立write(*,*)“停止上班上课”elsewrite(*,*)“照常上班上课” End if End12.Select Case用法 Program ex0512 implicit noneinteger :: scorecharacter gradewr ite(*,*)“Score:”read(*,*)scoreselect case(score)case(90:100)grade='A'case(80:89)grade='B'case defaultgrade='?'End selectwrite(*,“('Grade:',A1)”)grade End13.IF GOTO语句PROGRAM ex0514 IMPLICIT NONE REAL heightREAL weightWRITE(*,*)“height:” READ(*,*)heightWRITE(*,*)“weight:” READ(*,*)weightIF(weight > height-100)GOTO 200 100 WRITE(*,*)“Under control.”GOTO 300200WRITE(*,*)“Too fat!” 300 STOP END14.DO WHILE 循环 Program ex0604 implicit noneinteger, parameter :: limit=10integer counterinteger :: ans = 0counter = 2do while(counter <= limit)ans = ans + countercounter = counter + 2end dowrite(*,*)ans END15.CYCLE,EXIT 语句 Program ex0609 implicit noneinteger :: i,jloop1: do i=1,3loop2: do j=1,3if(i==3)exit loop1!跳离loop1循环if(j==2)cycle loop2!重做loop2循环write(*, “('(',i2,',',i2,')')”)i, jend do loop2end do loop1 End16.大小写字符 Program ex0612 implicit noneinteger iinteger strlencharacter(len=20):: stringwrite(*,*)“String:”read(*,*)stringstrlen = LEN_TRIM(string)do i = 1, strlenstring(i:i)= char(ichar(string(i:i))+32)end dowrite(*,“('encoded:',A20)”)string End17.循环计算 Program ex0614 implicit nonereal a,b,anscharacter :: key = 'y'!为了至少循环一次do while(key=='y'.or.key=='Y')read(*,*)a read(*,“(A1)”)key read(*,*)b select case(key)case('+')ans = a+b case('-')ans = a-b case('*')ans = a*bcase('/')ans = a/b case defaultwrite(*,“('Unknown operator ',A1)”)keystop end selectwrite(*,“(F6.2,A1,F6.2,'=',F6.2)”)a,key,b,answrite(*,*)“(Y/y)to do again.(Other)to exit.” read(*,“(A1)”)key end do End18.矩阵相加 pogram ex implicit noneinteger, parameter :: row = 2integer, parameter :: col = 2integer :: matrixA(row,col)integer :: matrixB(row,col)integer :: matrixC(row,col)integer rinteger cwrite(*,*)“Matrix A”do r=1, rowdo c=1, colwrite(*,“('A(',I1,',',I1,')=')”)r,cread(*,*)matrixA(r,c)end doend dowrite(*,*)“Matrix B”do r=1, rowdo c=1, colwrite(*,“('B(',I1,',',I1,')=')”)r,cread(*,*)matrixB(r,c)end doend dowrite(*,*)“Matrix A+B=”do r=1, rowdo c=1, colmatrixC(r,c)= matrixB(r,c)+matrixA(r,c)write(*,“('(',I1,',',I1,')=',I3)”)r,c,matrixC(r,c)end do end do end pogram ex[ write(*,“(I3,I3,/,I3,I3)”)((mc(i,j), i=1,2),j=1,2)] 19.program eximplicit noneinteger, parameter :: row = 2integer, parameter :: col = 2integer :: a(2,2)=(/ 1,2,3,4 /)!a(1,1)=1, a(2,1)=2, a(1,2)=3, a(2,2)=4integer :: b(4)=(/ 5,6,7,8 /)integer :: c(2)write(*,*)a,2)write(*,*)a(:,1)c = a(:,1)!c(1)=a(1,1), c(2)=a(2,1)write(*,*)c!c(1), c(2)c = a(2,:)!c(1)=a(2,1), c(2)=a(2,2)write(*,*)c!c(1), c(2)write(*,*)c(2:1:-1)!c(2), c(1)c = b(1:4:2)!c(1)=b(1), c(2)=b(3)write(*,*)c!c(1), c(2)End20.FORALL语句 Program ex Implicit none integer :: I,Jinteger, parameter :: size = 5integer :: a(size,size)forall(I=1:size, J=1:size, I>J)a(I,J)=1!上半部分forall(I=1:size, J=1:size, I==J)a(I,J)=2!对角线forall(I=1:size, J=1:size, I!下半部分write(*,“(5(5I5,/))”)a End21.Allocatable Program EX Implicit none integer :: size, error=0integer, parameter :: one_mb=1024*1024 !1MBcharacter, allocatable :: a(:)Dosize=size+one_mb!allocate(a(size), stat=error)if(error/=0)exitwrite(*,“('Allocate ',I10, ' bytes')”)size write(*,“(F10.2,' MB used')”)real(size)/real(one_mb)deallocate(a)End do End22.Function 函数 Program ex implicit nonereal :: a=10real :: b=20real :: addwrite(*,“(f6.2)”)add(a,b)End Function add(a,b)implicit none real :: a,breal :: addadd = a*b End23.SAVE语句 Program ex Implicit nonecall sub()call sub()call sub()End program Subroutine sub()Implicit noneInteger :: count = 1Save count!指定save变量永远活着,不会忘记它的内容Write(*,*)countcount = count+1 End[运行结果:1 2 3 ]24.生成随机数 program ex implicit noneinterface!定义函数的接口function random10(lbound, ubound)implicit none real :: lbound, ubound real :: random10(10)end functionend interfacereal :: a(10)CALL RANDOM_SEED()!系统根据日期和时间随机地提供种子a = random10(1.0, 10.0)write(*,“(10F6.2)”)aend function random10(lbound, ubound)implicit nonereal :: lbound, uboundreal :: lenreal :: random10(10)realtinteger ilen = ubound-lbound!计算范围大小do i=1,10call random_number(t)!t会是0~1之间的随机数random10(i)= lbound + len * t!把t转换成lbound~ubound 间的随机数end do End25.MODULE语句 Module globalimplicit noneinteger a,bcommon a,b End module Program ex0834use globalimplicit nonea=1b=2call sub()End program Subroutine sub()use globalimplicit nonewrite(*,*)a,breturn End subroutine26.写文件到text program ex0902implicit nonecharacter(len=20):: stringopen(unit=10, file=“test.txt”)write(10,“(A20)”)“I LOVE YOU.”!写到文件中rewind(10)read(10,“(A20)”)string!从文件中读出来write(*,“(A20)”)string!写到屏幕上 end27.随机成绩 program gendataimplicit noneinteger studentsinteger irealr(3)write(*,“(4A5)”)“座位”,“语文”,“数学”,“英语”call random_seed()write(*,*)“How many students?”read(*,*)studentsdo i=1,studentscall random_number(r)write(*,“(6I5)”)i,int(r*50+50)end do end program第二篇:Fortran语言复习大纲复习内容提纲1.FORTRAN程序的结构、书写规则FORTRAN程序的构成(主程序和子程序);FORTRAN77源程序的书写格式。
FORTRAN 心得第一部分:一些小心得1Fortran不区分大小写2 Fortran有5种基本数据类型,integer,real, character, logical, complex3 fortran fixed format格式中的变量赋初值一般用DATA,因为它不能用::4 real(kind=8) a这种格式只使用于Fortran90,Fortran77中要使用real*8或real(8)5 FORTRAN中FREE与FIXED两种格式do循环的区别:Fortran 95使用end do来结束循环。
Fortran 77使用DO循环要麻烦一点,它不使用END DO来结束循环,而是使用行号来结束循环,程序代码要在DO的后面写清楚这个循环到哪一行程序代码结束。
Fortran 77中,经常会使用CONTINUE这个命令来结束循环。
因为CONTINUE这个命令没有实际的用途,刚好可以拿来做封装使用。
6 循环的流程控制:循环中的cycle命令相当于c++里的continue命令,用于结束一次循环循环中的exit命令好比c里面的break,用于结束循环7 不使用do循环,单纯用GOTO语句也能设计循环程序,但不推荐使用GOTO语句7 fortran有等价声明:即用equivalence(a,b),这样使得a,b使用同一块内存,这样可以节省内存,有时可精简代码。
8 fortran77中只能用单引号。
(还有疑问,因为fixed format能用双引号)9 逻辑运算符== /= > >= < <= !Fortran90用法.EQ. .NE. .GT. GE. .LT. .LE. !Fortran77用法9 PAUSE,CONTINUE,STOPpause 暂停程序执行,按enter可继续执行continue 貌似没什么用处,可用作封装程序的标志STOP 命令用来结束程序,要谨慎使用10 数组元素之间要用逗号分隔,而不能像matlab一样既可以用逗号也可以用空格,fortran 的数组元素之间不能用空格。
11 数组的声明:Fortran 77中数组的声明,必须使用DIMENSION命令Integer a; !先声明a是整型Dimension a(10) !再声明a是大小为10的数组Fortran 95中可以用简单的方法:Integer a(10) !最简单的方法Integer,dimension(10):: a !另一种方法12 数组的赋值:Fortran 77中数组的声明,可以使用DATA命令或隐含式循环来赋初值;Fortran 95中可以直接设置初值;如:integer ::a(5)=(/1,2,3,4,5/);此时,括号和除号之间不能有空格;13 与C不同,Fortran数组索引值默认从1开始,而且可以在声明时改变该规则,如integer a(-3:1) !索引值为-3,-2,-1 ,0,113 数组在内存中的存放顺序也与C不同(正好相反),如a(2,2)在内存中的存放顺序为a(1,1),a(2,1),a(1,2),a(2,2);原则是放低维的元素,再放高维的元素,此规则称为column major矩阵输出时也是按列输出。
14 Fortran的特色:隐含式循环15 a,b都为数组,则可以这样用a=sin(b),(内部函数都可以这样用)16 数组专用:where命令形式上类似于if,但只用于设置数组where.....elsewhere...elsewhere...endwhere (没有then)FORALL是Fortran95添加的功能,只能用于数组操作forall可以嵌套使用,还可以在forall中使用where,但where中不能使用forall 15 Fortran中传递参数的原理与c++不同,Fortran中是传址调用,就是传递时用参数和子程序接受时用的参数使用一个地址,尽管命名可以不同。
16 调用自定义函数前需要做声明,调用子程序则不需要。
17 Module中有函数时必须在contains命令之后18 全局变量(有的书上叫无名公用区、有名公用区)全局变量用来定义一块共享的内存空间;全局变量不能声明成常量全局变量不能直接使用data命令赋初值,要在block data模块中使用data来设置初值。
COMMON语句是说明语句,因此它应该出现在相应程序单元中的所有可执行语句之前。
取用全局变量时,是根据它们的相对位置关系来作对应,而不是根据变量名称来对应。
19 传递参数与使用全局变量都可以在不同程序之间共享数据,那什么时候该使用参数,还有什么时候该使用全局变量呢?简单地说,当需要共享的变量不多,而且只有少数几个程序需要使用这些数据时,那就使用参数,需要共享大笔数据,或是有很多不同程序都需要使用这些数据时,就使用全局变量。
20 INCLUDE命令1 INCLUDE命令可以写在任何地方,它只是单纯地用来插入一个文件的内容。
2 有时候也会应用在声明全局变量,先把声明全局变量的程序代码编写在某个文件中,需要使用全局变量的函数再去INCLUDE这个文件,这样可以减少程序代码。
第二部分:格式化输入输出1 表控输入输出(即表控格式输入输出)1 注意点:不同计算机系统对表控格式输出的规定不同,例如对一个整型数,有的系统规定输出占13列,有的系统规定输出占10列,也有的系统不规定固定的列数而按照数据的实际长度输出,再用一个空格作分隔符。
2 如果在输入数据行中出现”/”号,表示对READ语句的输入到此结束,未被赋值的变量将不予赋值。
2 FORMAT 语句语句格式:标号FORMAT(格式描述符)例如:write(*,100) i,j,k;100 FORMAT(1X,I3,I5,I7),其中,1X是换行控制符(走纸控制),I3表示i变量的值输出占3列,I5表示j变量的值输出占5列1格式描述符主要介绍:I、F、E、X、纵向走纸、'(撇号)、r(重复系数)、/(斜杠)等(1)X描述符作用:用于输出空格一般形式:nX(2)I描述符作用:用于整型数据的输出一般形式:Iw 或Iw.n(3)F描述符作用:用于实数的小数形式输出一般形式:Fw.d(4)E描述符作用:用于实数的指数形式输出一般形式:Ew.d其中:E—实数的指数形式输出;w—字段宽度;d—数字部分的小数位数。
数值部分<1(5)A描述符作用:用于字符型数据的格式描述一般形式:Aw或A ,其中w是字段宽度。
(6)‘号描述符作用:用于输出字符常量,即把撇号内的字符串原样照打例如:write(*,100) i,j100 format(1x,'i=',i3,'j=',i4)(7)H描述符作用:它的作用与撇号描述符类似,也可以输出字符型常量一般形式:nH建议:建议最好不要使用H描述符,而是使用撇号描述符,避免错误例如:I=123WTRITE(*,100),I100 FORMAT(1X,2HI=,I3);(8)斜杠描述符反斜杠\描述符和美元$描述符的作用相同,都是在输出一个记录行后取消回车符,常用于输出字符串与输入数据显示于屏幕同一行的情形。
例如:write(*,'("please enter your name",$)');Read(*,*) My_age(9)重复系数r在format语句中,如果出现几个(或几组)相同的格式编辑符,则可以利用重复系数而只写一个(或一组)编辑符。
r——可重复使用的次数。
例:write(*,100) n1,n2,x,y1,y2,y3100 format (1x, i10, i10, f8.3, f7.2, f7.2, f7.2)↓Format (1x, 2i10, f8.3, 3f7.2)第三部分:函数操作1 语句函数1 语句函数的定义REAL(KIND=8) X,FF(X)=X**2+X+12 语句函数的调用语句函数一旦被定义后,就可以在本程序单元中被调用。
调用的形式和调用内容函数形同,即:语句函数名(实参)2说明语句函数定义语句是非执行语句,它应该放在所有可执行语句之前和所有的说明语句之后。
语句函数只能在本程序单元中被使用。
2 函数子程序1定义的一般形式:类型说明符FUNCTION 函数名(形参表)函数主体函数名=表达式;END或者:FUNCTION 函数名(形参表)函数主体函数名=表达式;END3 子例行程序子例行程序定义的一般形式:SUBROUTINE 函数名(形参表)。
end子例行程序的调用:CALL 子程序名(实参)4 函数子程序与子例行程序的区别1子例行程序的名称不用来返回函数的处理结果,因此是没有类型的。
所以不能定义子例行程序的类型。
2子例行程序必须以SUBROUTINE语句开头,以END语句结束。
3能用函数子程序实现的功能,都能用子例行程序来实现,反之亦然。
因此在程序设计时,要对具体问题选择哪种方式。
4由于不能给子例行程序名赋值,所以在将函数子程序转换为子例行程序时,应该增加一个变量用来带回在函数子程序中由函数名带出的子例行程序处理结果。
5子例行程序的调用需要专门的CALL语句。
5 数据块子程序(BLOCK DATA)1 数据块子程序是非执行程序单元,因而在其中不能出现任何可执行语句,也不能被别的程序调用。
2 它是专门用来给有名公用区中的项目赋初值的子程序。
注意:COMMON变量不能直接在子程序或主程序中使用DATA命令来设置初值,要在BLOCK DATA程序模块中使用DATA 命令来设置初值。
3 数据块子程序是一个完整的程序单元。
它由BLOCK DATA语句开始,END语句结束。
4 BLOCK DATA只能用来设置全局变量的初值,而且在主程序执行前,全局变量的初值内容就会设置完毕,事实上这一段程序会在主程序执行前就会生效;5 全局变量不能声明成常量,所以BLOCK DATA中不能出现PARAMETER。
6 MODULE1 MODULE可以用来封装程序模块,通常是用来把程序中具备相关功能的函数及变量封装在一起。
例如需要使用全局变量时,可以把全局变量都声明在MODULE中,需要使用这些变量的函数只要USE这个MODULE就可以使用它们。
2 MODULE中的变量如果不是声明成全局变量,这些变量被函数使用时,只会是函数中的局部变量。
3MODULE中还可以容纳函数,语法如下:Module module_name………!先写声明相关程序代码………contains !从contains后开始写作函数subroutine sub_name………end subroutine [sub_name] !subroutine不能省略function function_name…………..end function [function_name] !function不能省略end这个做法比较符合模块化概念,编写大程序时,可以把程序中属于绘图功能的部分放在module Graphics中,把数值计算的部分放在module Numerical中。