FORTRAN听课笔记.doc_第1页
FORTRAN听课笔记.doc_第2页
FORTRAN听课笔记.doc_第3页
FORTRAN听课笔记.doc_第4页
FORTRAN听课笔记.doc_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

FORTRAN程序是最常用的一种语言。现在从最简单的FORTRAN程序结构整理,方便入门。FORTRAN程序的结构是由主程序和主程序体,还有END组成的。在解决某个问题时,可使用FORTRAN程序,其中,需要对一些变量进行定义,只有对变量进行定义了,才可以是程序顺利的运行下去。因为,就像人一样,只有对各个部门的人进行分类,才能是人们能够井然有序的参加工作。首先主程序的结构如下所示:PROGRAM MAIN。END其中,PROGRAM翻译为“程序”的意思。对于一个主程序,可以对其进行命名,比如,MAIN就是一个主程序的名字。中间的省略号指的就是主程序的主体语句,问题的描述与解答均是位于主程序范围内。但是,必须注意的是,一个程序,必须有结束语句,也就是END语句。否则程序将无法正常运行。1.变量定义的介绍:在进行编制程序的时候,首先要对问题中用到的变量进行定义。最常用的一些变量定义有,整型变量,实型变量,字符型变量等。就像数学中的数字定义一样,分实数、整数,所以整型变量就是定义一些表示整数的一些变量,比如说,整型变量NN,用NN表示节点的数目(Number of Nodes),因为点的数量就是整数,所以要用整型变量来定义。用INTEGER来表示整型变量。例如,定义的语句可以这么写:INTEGER NN对于实型变量,用REAL表示,但是通常来说REAL的精度没有DOUBLE PRECISION的精度高,通常使用DOUBLE PRECISION来表示实型变量。因为REAL是8字节的,而DOUBLE PRECISION是16字节的,所以是双精度的。因此DOUBLE PRECISION就翻译为“双精度的实型变量”。例如,想要定义一个矩形的边长,因为边长不一定是整数,所以要定义为实型变量,则程序语句应该这么写:DOUBLE PRECISION L,H 在此说明一点,就是在编写程序语句的时候,一定要在英文状态下编写,尤其是标点符号,虽然可以直接写出来,但是如果是在汉语状态下写入的标点符号,在程序运行的时候,会认为是错误,这一点一定要注意。字符型变量,就是要定义一些字符,用CHARACTER来表示,在写程序语句时,要给出字符型变量的长度,因为如果不给定长度的话,有可能程序运行完之后会输不出结果。比如说,你想在程序中写一句话,那么它不是一些可以运算的变量,就像矩形的边长一样,可以参与计算,字符型变量只是一个标记。字符型变量的长度就是指,一个字母或者空格都要算进去。例如,I am a student.,则用程序语句写为:CHARACTER*20,即其长度最大是20,超过20的部分,则程序不能输出,注意引号以及最后面的那个句号也要计算进去。2. 简单程序编写:现在编写一些简单的小程序来说明变量的定义以及语句的规范书写。例1:有两个整数,已知该两个整数的值分别为2和3,则用程序语言实现二者的和分析:从已知的题干中可以看出,要定义的变量是整形变量,所以要用INTEGER来定义,此外有两个已知的整型变量,因为整数与整数的和还是整数,所以在定义时要定义三个整型变量。程序语言实现如下:注:程序的编写过程中,一些变量或者程序内部函数的书写正确的时候,会自动显示为蓝色,如上图所示。程序中的PRINT*,C表示要在电脑的屏幕上输出计算的结果,因为PRINT在英文中是打印的意思,而其后面的星号*表示在屏幕上写出,如下图所示。计算你的结果为:5 则程序输出的为:如果想在屏幕上写出C=5,则用程序语句实现为:输出结果为:注意以上二者的区别。程序编写好以后要分别进行“编译”,“连接”,“运行”三个步骤,图标分别如下图所示: (左一表示编译;左二表示连接;最后一个(也就是那个红色的叹号)表示运行),然后就弹出上面黑色的对话框。此外,整数也可以定义为实型变量,仍以上面的例题为例,将变量定义为实型变量时,输出的结果与定义为整型变量的区别:注意,在定义双精度时,A,B的值可以写为2,3,或者2.0,3.0均可以。因为虽然A,B的值写成2,3,实际程序在运行的时候,读入的是A=2.00000000000000,B=3.00000000000000则程序输出的结果是双精度的,有16个字节。同样的,如果在定义实型变量的时候,用的是REAL,则计算的结果如下:用REAL定义的时候,程序读入的数据是A=2.000000,B=3.000000注意REAL与DOUBLE PRECISION的区别。例2:用程序语句在屏幕上输出一下语句:I am a teacher !分析:由已知得:该程序中涉及到的变量是字符型变量,也就是要用CHARACTER来定义,根据字符型变量定义的要求,就是要输入变量的字符长度。根据这句话来看,字符的长度为18,那么可以定义字符型变量的长度为20,也就是,最大长度是20。要在屏幕上打印,所以要用PRINT*,来表示。程序语句如下:3. 符号的优先计算在程序中,当要运算一个方程式的时候,有符号的优先计算问题。比如说,*,/ 是同一个级别的,也就是说在一个方程式中,乘号(*)和除号(/)是同等的,而*会优先于*,/ *表示乘方的意思,就是说,如果想表达一下X3 则用程序的语句可表示为X*3,所以不管是几次方,只改变后面的数字就可以了。当然了,*,/ 会优先于 +,- 。就和数学中的加减乘除运算差不多。例3. 计算AB2=C,则用程序语句编写为:程序在计算的时候,是先计算B*2的,然后再与A相乘。此处说一下在程序中怎样表达“大于”,“等于”,“小于”,“不等于”,“大于等于”,“小于等于”等逻辑运算符。程序中分别用.GT. ; .EQ. ; .LT. ; .NE. ; .GE. ; .LE. ,来表示。写出相对应的英文单词,便于记忆。GT就是GREAT THAN的首字母缩写;EQ就是EQUAL的前两个字母的缩写;LT就是LESS THAN 的首字母缩写;NE就是NOT EQUAL的首字母缩写;GE就是GREAT AND EQUAL的缩写;LE就是LESS AND EQUAL的缩写。比如说,AB 那么用程序语句来实现,就可写为:A .LT. B 。此外,说明一点,在编写程序时,不区分字母的大小写,也就是说,如果你定义了两个变量,分别为A,a,那么在程序运行时它认为是同一个变量,所以程序就会提示你说,“变量A被重复定义”的错误。4. 从文件中读取数据由于在一些大型问题中,需要输入的数据比较多,因此不可能在程序中直接写入数据,而且当数据发生变化之后,又得重新开始书写数据,是非常麻烦的事,那么可以试着编写程序语句,以实现从文件中读取数据,这样比较方便快捷。因此在从文件中读取数据时,首先要建立文件,然后将程序中需要的数据放入该文件中,程序在读数据的时候就会从这个文件中读取。建立一个文件的程序语句是“OPEN(4,FILE=IN,DAT)”,OPEN是打开的意思,所以就用来建立一个文件,括号内的数字4表示通道号,通道可以是在1100之间的任何一个数。后面的IN.DAT 表示数据文件的名称,可以改写为其他的名称,但是文件的后缀必须是.DAT文件或者是.IN文件。读取数据时用READ(4,*)来读取,括号内的4是与前面的OPEN中的通道号是一致的,只要数据所在文件是哪个通道号,那么在读取READ时,就要写相应的通道号,后面的星号*,表示是没有任何格式的读取。,就是说,文件中写的是什么样的数据,就读什么样的数据,如果你在读取时,将数据的小数位数少读入几位,那么就要有格式的读取(这个在后面进行讨论)。在读取完数据以后,一定要将相应的文件关闭掉,程序语句是CLOSE(4),当然,括号内的通道号要相对应。例如:其中,第一句表示在通道号7中建立一个名为OUT。DAT的文件,第二句是要将一些数据写入该文件中,因为所使用的语句是WRITE(7,*),WRITE在英文中是写的意思,*表示无格式的写入数据,要写的数据是变量C,最后一句是要关闭掉该文件,所以用CLOSE(7)5. 循环语句在程序中,有一些共同的东西,如果单次运行的话,会比较麻烦,那么为了改善这种状况,就要用循环语句来实现,非常简便。也就是常说的DO循环语句。DO循环的结构就是DO。END DO现在用一例题来说明DO循环的运用例4. 用程序语言计算100以内所有整数的和。分析:由已知得,程序中所需要的变量就是整数,用整型变量来定义。在程序中有一个IN规则,就是说,在程序中,如果你使用的IN中的任何一个字母,那么它就表示是整型变量,在程序中的变量定义的时候,可以不用进行定义IN之间的任何一个。程序如下:输出结果为5050,。现在说明一下程序中的各个语句的含义:程序中用SUM表示整数的和,而在程序开始运行的时候,和SUM是为0的,称之为初值,所以初值为0.在编写程序的时候,也可以不用单独写出SUM=0,因为只要你不给一个变量赋值,那么系统就默认该变量的值为0. 紧接着是DO循环,循环的变量是I,循环的范围是从1100,每次循环都增加1,程序中增加1时,可以不用单独写出(就是如果编写程序,DO循环中,不是按照每次增加1来循环的,那么书写的语句应该是:DO I=1,100,2,该语句表示,从1100开始循环,每次增加2)。语句SUM=SUM+I,这个对于初学者来说比较难于理解。就是把等式右边的数值赋给等式左边,当I=1的时候,因为初值SUM等于0,那么SUM=SUM+I,就相当于SUM=0+I,因为此时的I=1,所以SUM=1,而当下一次循环开始的时候,也就是说,I=2的时候,此时SUM的值已经等于1了,而SUM=SUM+I就相当于SUM=1+I,所以此时的SUM就等于3了(因为I=2),下次循环,就是I=3的时候,此时SUM的初值为3,那么SUM=SUM+I就相当于SUM=3+I,所以循环后,SUM=6,一次类推。,直至循环到I=100的时候,循环结束。再运行PRINT语句,将计算的结果输出在屏幕上。例5. 用程序语言求3个同学的平均成绩。分析:由已知得是要求3个学生的平均成绩,那么就要读入学生的名字,以及相应的学生成绩,因此要定义字符型变量(也就是学生名字)和实型变量(也就是学生成绩),本例题要从文件中读入数据,并将计算的结果存入一个文件中。程序语句如下:输出结果为:就是在建立新的文件时,点击FORTRAN视图区左上角的按钮(就是FILE下面的这个按钮,点击它之后,就会自动跳出一个空白的框,然后可以将要读入的数据写在该文件中,比如然后再点击红色叉下面的那个小的黑色的叉,然后弹出一个对话框,显示了你将要保存的文件,输入你要保存的文件名,点击“保存”就可以了,只有需要读入数据的文件需要这么建立,那么对于程序运行后,将一些数据输入到文件中的那个文件,是在程序的运行过程中自动产生的,不用用户单独建立。比如上面程序中的AVERAGE。OUT文件,就是系统自动产生的,它和读取数据的文件在同一个目标文件下)。此处需要强调的是,上面程序中的(S1+S2+S3)/3.0,使用的括号,因为如果不使用括号的话,根据符号的优先运算的规则,那么程序就会先计算S3/3.0然后再与S1和S2进行加法运算。这一点一定要注意。如果将数据没有写在屏幕上,而是写再文件中了,那么当你运行完程序之后就会显示下面的对话框,意思是,“按任何一个键继续”。然后去目标文件下面查找计算产生的结果文件。常用的一些标准函数要记住,这个在FORTRAN程序课本的第104页给出。注意函数中的角度为弧度值。比如,SIN(60),在编写程序的时候应该写成:SIN(PI/3),其中在程序中常写为PI。6. 选择语句在日常编制程序过程中,最常用的选择语句就是IF语句。就是说,当某一事物有好多中情况时,可以使用选择IF语句来解决问题。比如说,拿学生的成绩排名来说,计算90分以上的有多少人,8090之间的有多少人,7080之间有多少人,6070之间有多少人,不及格的有多少人,那么在用程序解决这个问题的时候就应该使用选择IF语句。IF语句有基本块IF语句,多支块IF语句,IF语句的嵌套等。基本块IF语句的结构形式就是:IF(逻辑表达式e) THENTHEN 语句体ELSEELSE 语句体END IF基本IF语句的意思就是说,如果逻辑表达式e是正确的,那么(THEN)就继续执行THEN后面的语句体,如果说IF后面的逻辑表达式e是不正确的,那么就要跳过THEN语句体,直接执行ELSE后面的语句体。因为ELSE本身就有否则的意思。多支块IF语句的结构形式是:IF(逻辑表达式1) THEN 语句体1ELSE IF(逻辑表达式2) THEN 语句体2。ELSE IF(逻辑表达式n) THEN 语句体nELSE语句体(n+1)END IF多支块IF语句就是说,对于一些复杂的结构,这些复杂的结构往往有多个执行分支,所以要使用多支块IF语句。就是说,如果IF后面的逻辑表达式1是正确的,那么就继续执行THEN后面的语句体,如果IF后面的逻辑表达式1是错误的,那么就跳过THEN语句体,继续执行ELSE IF后面的逻辑表达式2,同理,如果逻辑表达式2是错误的,那么就直接执行下面的ELSE IF语句后面的逻辑表达式3.。,当前面的n种情况都执行完之后,就只有最后一种情况了,那么就直接用ELSE来表示了,后面的语句体就不用写出来了,因为它只有那一种情况了。IF语句嵌套的结构形式是:IF (逻辑表达式1) THENIF(逻辑表达式2) THENIF(逻辑表达式3) THEN语句体。END IFEND IFEND IF其中嵌套的IF语句的嵌套层数越多,逻辑关系就越混乱,所以要尽量少的使用多层次的嵌套,一般最多三层。而嵌套的IF语句,就是说,上下两层关系的“且”的关系,也就是说,逻辑运算中的“。AND。”的关系。具体,可参照FORTRAN程序课本的第157页的程序来理解。7. 数组结构有了前面的基础知识的积累,下面说一下数组结构,数组可以说是FORTRAN中最难于理解的部分了,在理解数组结构的时候一定要结合线性代数中的矩阵来理解。数组分为一维数组、二维数组,以及多维数组,其中最常用的就是一维数组和二维数组,因为一旦超过三维的时候,其逻辑结构就会非常的麻烦,不便于理解,因此建议在使用数组存储数据的时候,一定要是其维数足够少。一维数组,它的表示就是“数组名称(维说明表)”。就是说,它的逻辑结构可以看成是由一组数据构成的线性表,比如说A(3),它表示A中总共有3个数值,在进行数据的读取与存储的时候,A(1),A(2),A(3)分别表示数组中的第一个,第二个,第三个数值。同时标号1,2,3表示数组元素的位置。括号中只有一个数字,那么可以简单的理解为,它是一维数组。二维数组,它的表示也是“数组名称(维说明表)”。就是说,按照数学的语言来说,就是说二维数组是由X,Y两个方向来决定的,比如说,在XOY坐标性中定义一个点的坐标,就是要知道它的X、Y两个方向的坐标才可以确定它的位置。常用的形式就是“数组名称(m,n)”,它可以用m来表示行,用n来表示列(要按照线性代数中的矩阵来理解);也可以用m来表示列,用n来表示行,这个均是可以的,纯粹就是个人的习惯问题。比如,A(3,3),它表示一个3*3的一个数组,就是说该数组中共有9个元素,分别是A(1,1),A(1,2),A(1,3),A(2,1),A(2,2),A(2,3),A(3,1),A(3,4),A(3,3),括号中的两个数字就表示它在数组中的位置,例如,A(1,3)表示是数组中第一行第三列的位置上那个元素的值(这个的前提就是说用m来表示行,用n来表示列)。也可以理解为第三行第一列的位置上的元素(这个的前提是以m表示列,以n表示行)。数组在定义的时候也分为整型数组和实型数组,定义的方式和前面的变量定义的是一样的。就是说,如果数组中的全部元素是整数的,就可以定义为整型数组,如果是小数的,就要定义为实型数组。现在用一个程序来说明数组的使用。例6. 已知矩阵A和B,那么用程序语句计算A与B的乘积。分析:由已知得出,矩阵A和B是需要用数组来表示的,当然也可以每个元素单一的写出来,但是如果矩阵中有10000000个元素的话,你再挨个写出来,是非常不现实的。所以要用数组来表示。编写的程序如下:解释一下上面程序中的一些语句:首先根据已知,定义整型数组A、B,因为C=A*B,那么,C应该也是整型数组,而且,A是3*3的数组,B是3*2的数组,那么根据线性代数中的矩阵乘法,C应该是3*2的数组,所以定义C为3*2的整型数组,即C(3,2)。因为数据是从文件中读取的,那么要建立一个文件,名称取为IN。DAT,让计算的结果输出为OUT。DAT。因为定义数组的一个方便之处就是可以使用循环语句,所以在读取数据的时候应该是使用DO循环。现在关于DO循环读取数据的一个重要特别强调一下。上面程序中使用的是因为数组存储为,所以程序读出来的数据也应该是这种形式的,否则在以后的计算过程中就会产生错误。DO I=1,3就是I从1开始,一直到3循环,也就是,当I=1的时候,就开始运行下面的语句,也就是READ(4,*)语句,本程序中使用了一种隐式DO循环,也就是(A(I,J),J=1,3),就是括号内的J=1,3。它表明,当I=1的时候,直接读数组A中的第一行的三个元素。如果第一行读完了,光标会自动换行到第二行的第一个元素的前面,则当I=2时,就开始从第二行的第一个元素开始读了。如果程序中的DO循环写为如下的形式,。程序不能够把A中的元素全部读出来,因为没当它循环完一次的时候,光标就会自动换行到第二行上,所以说,它读出来的数据就只是第一列,结果就是。 它所读出的数据是一列。因为数组在存储的时候是按照列来存储的。如果想使用这种形式的DO循环,那么输入文件应该为: 。 所以要注意DO循环的区别。,程序输出的结果为:上面程序中的绿色的字母C是把不需要的语句行注释掉,当程序在运行的时候,就不运行被注释掉的语句了。如果想再使用被注释掉的语句行时,只要把字母C去掉就可以了。如果IN。DAT内的数据没有变化,只是改变主程序中的输出语句,那么结果为:所以一定要注意二者的区别。同理,数组B的读取也是一样的。紧接着是矩阵的乘法。注意在矩阵的乘法的过程中,要引入一个中间变量,也就是K,因为在乘积的过程中,矩阵A的列与矩阵B的行是相抵消掉的,在计算的过程中,二者的变量应该是一样的,所以不能使用I,或者J,因为A与B相乘之后,I,J是不能消掉的,所以要引入变量K。因为矩阵的乘法是A的行乘以B的列,然后再时相应的乘积的和,所以这里有一个求和的过程,也就是。乘完之后是一个3*2的矩阵C。所以写出该计算结果用DO循环的时候与前面读取数据的DO循环是一样的。用隐式DO循环。在定义数组的时候,一定要明白数组中的m、n的含义。比如说我现在要定义一个数组,NE(3,10000),则我用它来表示单元的数量,单元数最多为1000个,而构成单元需要3个结点(也就是三角形单元)。则NE(1,5)表示第5个单元的第1个结点的结点号;NE(2,5)表示第5个单元的第2个结点的结点号;NE(3,5)表示第5个单元的第3个结点的结点号.一定要仔细的理解明白,否则在编程的时候思维上会产生混乱。此外DO循环读取数据的时候,还可以单个读出来,也就是:如果数组中的元素个数少的话,可以这样写。但是不灵活,最好还是用DO循环来读。8. 子程序就是当一个主程序比较复杂时,需要一些小的子程序要完成,也就是相当于分块编程一样,非常清晰。当子程序编写完以后,主要要对其进行调用,调用的语句常使用CALL语句来实现。程序中使用子程序的结构,以下面的一个简单的小程序来说明。在编程序使用子程序的时候,子程序的命令叫做SUBROUTINE,英文翻译为子程序的意思。SUBROUTINE后面的是子程序的名称(变量名),子程序中调用的变量是在子程序中需要的一些变量,在主程序开始调用子程序时,子程序的名字以及变量名称一定是相同的,而且顺序也要相同,因为主程序与子程序之间在进行传递数据的时候是一一对应的。也就是说,主程序中的语句CALL后面的语句要与SUBROUTINE后面的语句完全一样。在子程序中,前面的一些变量,比如本程序中的X,Y吃从主程序中传递来的,而子程序是要完成变量S的值的求解,那么子程序在求解完之后,一定要把求解出的变

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论