fortran心得
FORTRAN实践报告

中南大学本科生课程设计(实践)设计报告(程序设计基础)题目微分方程求解实践报告学生学号1208100420学生姓名陈立湘指导教师蔡旭晖学院土木建筑学院专业班级土建类10-04班计算机基础教学实验中心2011年 06 月 30 日FORTRAN语言课程计摘要:本次实践主要是让我在独立自主的前提下发挥各种方法途径把在本学期学到的fortran知识运用起来解决实际问题,在问题伴随之下探索并努力解决,并借用了资料上的一些微分方程的解决程序以及书上的画图程序完成。
一.设计思想1.实践目标及目的最直接的目的自然是搜索资料运用所学知识编写一个大型程序来解决特定的实际问题,而众所周知fortran是世界上第一个被正式推广使用的电脑高级语言,而且电脑日益发展在生活中占据着越来越重要的地位,而程序语言又是电脑运行的基础,就像是人体上的各种细胞,组织……更甚者实践出真知,所以我们通过独立实践fortran语言来编写程序解决实际问题是锻炼自身以及学以致用,体验的最好的办法,这样能让我们独立自主,学以致用,实践知识,锻炼能力……2.问题分析当我看到课程设计任务上的三个问题时,义无反顾的选择了第二个,首先是因为微分方程在数学上比较实在(其实编程和数学不同的),问题大体内容是在意大利生物学家Ancona关于鱼类种群相互制约关系的研究前提下绘制一个食饵和鲨鱼数量随时间的变化情况图,这样的话问题就是编写一个微分方程的求解程序来解决这个题目,而在老师给予的参考资料上有一些微分方程的求解程序示范,那自然是要参考资料上的了,最后要以图的形式展现,那么fortran语言中的QuickWin就少不了了,而对于一个大程序子程序是必不可少的,这样实践的各类问题就都展现出来了,接下来就是一一解决。
二.系统设计与实现1.总体设计2.算法以及结构我的算法是以积分一步的特雷西方法为基础主程序辅之以QuickWin画图程序以及其他子程序链接在一起实行解决问题的。
关于fortran的一些学习心得

关于fortran的一些学习心得
长大以来,在学习编程语言方面,我一直被FORTRAN所吸引,也在不断地对它进行深
入的学习与研究。
FORTRAN是一门适用于数值计算和科学计算的高级编程语言,它也是一种特殊的编程语言,用于解决计算机科学中各种各样的复杂问题。
学习FORTRAN语言,最早是通过书本系统学习,书本上有很多重要的理论知识,字符
类型、常量、运算表达式、条件语句等,以及编写的一些示例程序等,这些通过书本系统
学习都是让我有基础的理论和基本的操作技巧。
接着,我又课余的时候,从事一些学习FORTRAN的实践工作,编写一些实用的小程序,包括求数据的极值、求数据的均值、求数据的方差等,以及一些求解一元非线性方程组、
矩阵运算、牛顿插值法等程序,甚至也参与了一些开发多维数值计算模型和混合数值-符
号计算模型程序的项目,这些项目都有助于我提高FORTRAN领域的实际技能。
学习FORTRAN也带给我乐趣与挑战,它需要很多的理论知识和分析能力,学习的过程中,一个是不断的收集资料,然后分析其中的每个部分,学习数学知识,总结出程序的功能,而且在编写程序的过程中,还需要考虑很多实际问题,这使我学习FORTRAN有了更多
的挑战与激励,也乐在其中。
总体来说,学习FORTRAN语言,对我成长大有裨益,我深深的欣赏这门编程语言的强
大功能,通过学习FORTRAN,也逐渐提升了自己的编程基础,以及算法一类知识的能力,
而且,今后我也会继续以实践为主,加以系统地学习,理解FORTRAN的编程模式和思想,
进一步提升自己运用FORTRAN的技能和能力。
fortran用法总结

我的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的一些格式上的区别。
Fortran基本用法小结

【以下文字转载自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学习总结 - 我不是企鹅的日志 - 网易博客

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的一些不同其实很多,在下面涉及具体方面时可以看到。
DEFORM二次开发的一点小心得!

DEFORM二次开发的一点小心得!前一段时间闲着没事,看了DEFORM的help文件.和众位兄弟交流一下.用户子程序实现过程:第一步:所需文件准备:把DEF_SIM目录下的def_usr.f ,DEF_SIM_USR_ABsoft70.gui , DEF_SIM_P4_USR_ABsoft70.gui ,DEF_SIM_P4_USR_LIB.lib , DEF_SIM_USR_LIB.lib和lib目录下的所有.lib文件拷到工作目录下。
备份DEF_SIM.exe ,DEF_SIM_P4.exe两个文件。
第二步:编写源程序。
对于新手可以使用模版自带的子程序,对于材料流动应力子程序模版里头本身就自带有一个,所以可以不需要自己编写。
(我就利用过自带的作过模拟,把前面的常数设置为10和100分别模拟)第三步:用absoft7.0或以上版本打开DEF_SIM_USR_ABsoft70.gui 文档,指定好library files,用工作目录下的lib文件来替换原来默认的lib文件,上述做完后直接点build就ok了,自动生成了DEF_SIM.exe。
重复上面的过程打开DEF_SIM_P4_USR_ABsoft70.gui 文档生成DEF_SIM_P4.exe。
第三步:用生成的DEF_SIM.exe ,DEF_SIM_P4.exe替换原来的这两个文件。
第四步,运行模型。
对于流动应力子程序,只要在material那里选择子程序就ok 了。
注:3D中必须是DEF_SIM.exe,而DEF_SIM— P4.exe不好!(我也不知道原因,师兄是这么说的!).还有一个问题,关于DEFORM的text运行模式.在安装目录下面,有如下几个需要了解的文件:<1>DEF_PRE.EXE;<2>DEF_ARM_DEF_PRE.EXE这是前处理,DOS界面输入前处理参数设置,记录每次设置时的操作,按一定格式记录在记事本上面,这个很重要,二次开发可能需要这个文件.具体参见help.DEF_ARM_ 这是运行命令.具体格式见help.下面是关键:通过fortran子程序调用DEFORM.具体如下.我用的是visual fortran6.6.result=system('E:\DEFORM3D\V5_0\DEF_PRE.EXE') (启动前处理,弹出DEF_PRE.EXE界面)result=system('E:\DEFORM3D\V5_0\DEF_PRE.EXE<INI.TXT') (进行前处理参数设置,INI.TXT是记录每次设置时的操作命令流),譬如一个简单的操作命令流:<CR>21XXXX.KEY (key文件,需要copy到你的子程序目录下)<CR>E72XXXX.DB (生成DB文件)<CR>EY<CR>result=system('E:\DEFORM3D\V5_0\DEF_ARM_ XXXX B') (运行DB文件,XXXX为文件名,B表示batch模式运行)注意运行过程中,有可能生成临时文件,如FOR003等,会影响模拟进行,可通过fortran命令open和write操作清除.以上可以实现一些特殊的操作.如运动子程序等.上述即是我的一点小体会.很多我也不是很懂,自己的课题也不是DEFORM二次开发,也不专长编程.呵呵,希望对大家有所帮助!Re:请问能不能帖个自己二次开发加本构方程的例子这是我尝试过的关于流动应力的二次开发,希望能给没有做过二次开发的朋友一点经验~~~现在要好好研究二次开发和有限元软件的核心机制了~~~共同进步~~~program USRMTRreal YS,TEPS,EFEPS,TEMread (*,*,*)TEPS,EFEPS,TEMYS=123.5237-1.238956*TEM+3.8584*LOG10(EFEPS)+6.7852*TEPS-1.29*TEM*TEPS+52.895* LOG10(EFEPS)*TEPS+0.00088442*TEM*TEMPrint *,YSEND相信看了这个程序后,大家对二次开发肯定有个初步的了解了~呵~用户子程序具体实现心得结合论坛上各位大虾的经验和自带帮助,前段时间动手试了一下用户子程序的实现过程,现将自己的一些体会与大家共享,相信对做二次开发的新手有用用户子程序实现过程:第一步:所需文件准备:把DEF_S IM目录下的def_usr.f , DEF_S IM_USR_ABsoft70.gui ,DEF_SIM_P4_USR_ABsoft70.gui , DEF_S IM_P4_USR_LIB.lib , DEF_S IM_USR_LIB.lib和lib目录下的所有.lib文件拷到工作目录下。
FORTRAN学习中的一些小心得

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 的数组元素之间不能用空格。
Fortran语言编程小结(五篇材料)

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源程序的书写格式。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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位整数。
也可以没有标号。
标号区中的空格不起作用。
如lOO与100 或1 0 0作用相同。
标号应是无符号整数(无正负号或小数点)。
标号大小顺序没有任何要求。
假如第二行的标号为1000,第三行的标号可以是10,也可以是99999。
标号区内不得出现标号以外的内容,但注释行例外。
注释行的内容可以写在标号区内,一行中第一列为C或*的,该行即被认为注释行,编译时对该行内容不作翻译,对程序运行不产生任何影响。
如果在第一列上出现的不是数字、空格或C和*的字符,编译时按出错处理。
2续行区:第6列如果在一行的第6列上写一个非空格和非零的字符,则该行作为其上一行的续行。
注意在某些系统中,这个字符可以不限于上面所列的,如 @ } ] ~ 等字符均可使用。
F77允许一个语句有19个续行(即一个语句最多可以写成20行)。
有的程序中第6列上用“l”,“2”,…表示该行是第1个或第2个续行,但用数字字符容易与第7列的数字形成连续的数字串而引起错觉,故最好使用固定的特殊字符。
3语句区:第7-72列不要求一定从第7列开始写语句,可以从第7列以后(72列以前)的任何一列开始写,但一行只能写一个语句。
如果写满了72列,一旦在终端上修改程序时在该行又插入了一些字符,就会使本行最后几个字符超出语句区而引起意料不到的错误。
特别注意到语句最后的空格将可能溢出72列,在某些计算机系统上将导致难以查出的错误。
应注意,引号内的字符串中所包括的空格是有效的,不能忽略。
4注释区:第73-80列在卡片输入法时代,程序员一般利用此8列为程序行编序号以便查找。
注释区只对程序员提供辨别信息,不是语句的一部分,在编译时不对72-80列作处理。
程序 9 2 将成绩输入date.txtmodule typedeftype studentinteger Chinese,English,Mathend typeend moduleprogram mainuse typedefimplicit noneinteger::studentstype(student),allocatable::s(:)integer,parameter::fileid=10character(len=80)::filename="date.txt"integer::iwrite(*,*)"how many students?"read(*,*)studentsallocate(s(students),stat=i)if(i/=0)thenwrite(*,*)"allocate buffer fail"stop!此处要学习跳出程序。
end ifopen(fileid,file=filename)do i=1,studentswrite(*,"('input the',I2,'th student''s scores')")iread(*,*)s(i)%Chinese,s(i)%English,s(i)%Math !Sb了,其实可以直接写成s(i)write(fileid,"('Student Number:',I2,/,'Chinese Score:',I3,'English Score:',I3,'Math Score:',I3)")i,s(i)!s(i)的三项可以分别设置各自格式,另外注意括号里封装字符用单引号end doclose(fileid)pausestopend program main程序9 3 读取date.txt并且输出module typedeftype studentinteger Chinese,English,Mathend typeend moduleprogram mainuse typedefimplicit noneinteger,parameter::fileid=10integer::studentsinteger::ntype(student)::scharacter(len=10)::filename="date.txt"logical::aliveinteger::stat=0inquire(file=filename,exist=alive)if(.not.alive)thenwrite(*,*)"file doesn'nt exist"stopend ifopen(unit=fileid,file=filename)do while(stat==0)read(fileid,"(16XI2,/,14XI3,14XI3,11XI3)",iostat=stat)n,s !不知道为什么不能写作unit=fileid write(*,"('序号:',I2,'语文:',I3,'英语:',I3,'数学:',I3,I3)")n,s,statend dopausestopend program main程序9 5,跳跃读取:还是不太懂REC的用法program mainimplicit nonecharacter(len=80)::filename="list.txt"integer::fileidlogical::aliveinteger::statinteger::playerreal::scoreinquire(file=filename,exist=alive)if(.not.alive)thenwrite(*,*)"file doesn't exist"stop!体会stop的用法,用于在程序中间终止程序。
end ifopen(unit=fileid,file=filename,access="direct",&form="formatted",recl=7,status="old")do while(.true.)write(*,*)"查询第几棒?"read(*,*)playerread(fileid,"(F5.2)",rec=player,iostat=stat)score if(stat/=0)exitwrite(*,"(F5.2)")scoreend dopausestopend program main程序 9 6 内部变量的应用:本程序中invalid很好!否则我只能通过监视内层那个do的循环的次数来判断strng中的所有字母是不是检验完毕,本程序中的invalid这个变量显然更简单巧妙,先设置.true.进入外循环,然后.false.假设输入的都是正确的,可以跳出,然后用if“考验”这个假设。
很巧!另外,本计算机能接受的最大整数是4byte、32bits,即2147483647。
默认的也是长整型,即kind=4。
program mainimplicit noneinteger::iinteger,external::GetIntegeri=GetInteger()write(*,*)ipausestopend program maininteger function GetInteger()implicit nonecharacter(len=80)::stringinteger::i,codelogical::invalid=.true.do while(invalid)write(*,*)"请输入整数"read(*,"(A80)")stringinvalid=.false.do i=1,len_trim(string)code=ichar(string(i:i)) !用code代替,增加可读性 2.string(i:i)不是string(i) if(code<ichar("0").or.code>ichar("9"))thenwrite(*,*)"invalid input"invalid=.true. !invalid这个逻辑变量用得非常巧妙,认真体会。