Fortran-第十一讲.pptx
《Fortran-第十一讲.pptx》由会员分享,可在线阅读,更多相关《Fortran-第十一讲.pptx(53页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Fortran程序设计第十一讲第十一讲 派生数据类型派生数据类型 指针与动态分配指针与动态分配复习第十讲内容复习第十讲内容SAVE语句和属性语句和属性永久地保存局部变量和数组的值永久地保存局部变量和数组的值采用采用SAVE属性属性INTEGER,SAVE:count采用采用SAVE语句语句SAVE:count在类型声明语句中初始化在类型声明语句中初始化INTEGER:count=1内部过程内部过程PROGRAM main.CONTAINSSUBROUTINE localsub1(var1,var2).END SUBROUTINE localsub1END PROGRAM main递归过程递归过
2、程RECURSIVE SUBROUTINE sub()RECURSIVE FUNCTION f()例:例:RECURSIVE INTEGER function fact(n)RESULT(answer)IMPLICIT NONEINTEGER:nIF(n=1)THENanswer=n*fact(n-1)ELSEanswer=1END IF11.1 派生数组类型派生数组类型问题的引入:问题的引入:假设我要写一个程序管理我们这个班级的学生成绩假设我要写一个程序管理我们这个班级的学生成绩涉及到这么一些数据:涉及到这么一些数据:学号、姓名、作业分、实验分、期中成绩、期末成绩学号、姓名、作业分、实验分、
3、期中成绩、期末成绩怎么实现这些数据的存储?怎么实现这些数据的存储?一个办法是:声明一个办法是:声明6个一维数组,分别用来存放这个一维数组,分别用来存放这6个个方面的信息,并且约定下标相同的数组元素代表着方面的信息,并且约定下标相同的数组元素代表着同一个学生的不同信息同一个学生的不同信息另外的办法是我们自定义一种数据类型另外的办法是我们自定义一种数据类型这个数据类型的每个数据应该包含有以上的这个数据类型的每个数据应该包含有以上的6个要素个要素在这种情况下,学号、姓名等等都是某个数据的一在这种情况下,学号、姓名等等都是某个数据的一个方面个方面定义定义定义一个名为定义一个名为student的数据类型
4、的数据类型TYPE:studentCHARACTER(len=10):idCHARACTER(len=8):nameREAL:homeworkREAL:experimentREAL:midtermREAL:final_examEND TYPE student声明变量声明变量因为自定义的数据类型是由内置数据类型组成的,因为自定义的数据类型是由内置数据类型组成的,所以,也称之为派生数据类型所以,也称之为派生数据类型现在我们有了现在我们有了student这种派生数据类型这种派生数据类型如果我想定义一个变量代表某个学生:如果我想定义一个变量代表某个学生:TYPE(student):tom如果要把所有的
5、学生信息都储存起来:如果要把所有的学生信息都储存起来:TYPE(student):course(70)声明有名常量声明有名常量也可以定义派生数据类型的常量:也可以定义派生数据类型的常量:TYPE(student),PARAMETER:PETER=&student(2010123456,Peter,90.,80.,87.5,85.)派生数据类型可以作为其它派生数据类型的元素派生数据类型可以作为其它派生数据类型的元素使用使用想知道想知道tom的期中考试成绩:的期中考试成绩:WRITE(*,*)tom%midterm将第将第5名学生的期末成绩输入:名学生的期末成绩输入:course(5)%final
6、_exam=100所有同学的期末成绩都是所有同学的期末成绩都是100:course%final_exam=100以上都是对派生数据的元素进行操作以上都是对派生数据的元素进行操作如果将派生数据作为一个整体操作,以前所学习的如果将派生数据作为一个整体操作,以前所学习的内置操作符(加减乘除之类)都不再适合内置操作符(加减乘除之类)都不再适合输入与输出输入与输出如前所述,如前所述,student是一个派生数据类型是一个派生数据类型如果我们用这个类型声明一个变量如果我们用这个类型声明一个变量tom:TYPE(student):tom那么:那么:WRITE(*,*)tom会将会将tom的的6个元素按顺序输
7、出个元素按顺序输出当然,也可以格式化输出:当然,也可以格式化输出:WRITE(*,100)tom100 FORMAT(1X,A,/,1X,A,/,4(1X,F4.1,/)至于输入语句至于输入语句READ,类似的,也是按照数据类型,类似的,也是按照数据类型中元素的顺序按类型读入中元素的顺序按类型读入READ(*,*)tom当然,任何时候,都可以对此数据类型的变量进行当然,任何时候,都可以对此数据类型的变量进行单个元素的读写操作单个元素的读写操作例:例:READ(*,*)tom%nameWRITE(*,*)tom%id在模块中声明派生数据类型在模块中声明派生数据类型问题的提出:问题的提出:如果我们
8、希望在程序中使用某种派生数据类型如果我们希望在程序中使用某种派生数据类型那么就不得不在任何使用该类型的过程中重复书写那么就不得不在任何使用该类型的过程中重复书写该类型的定义形式该类型的定义形式为了解决这个问题,通常将一个程序中所有的派生为了解决这个问题,通常将一个程序中所有的派生数据类型定义在一个模块中,然后在需要使用的数据类型定义在一个模块中,然后在需要使用的地方地方use这个模块这个模块在学习数组时,我们用长度为在学习数组时,我们用长度为n的一维数组表示一个的一维数组表示一个n维向量维向量这个一维这个一维n长的数组可以理解成一个有长的数组可以理解成一个有n个相同元素个相同元素的派生数据类型
9、的派生数据类型用数组的处理方法是有一定的局限性的,如果向量用数组的处理方法是有一定的局限性的,如果向量的每个维度不是同一类型,就不适合了的每个维度不是同一类型,就不适合了下面我们从简单的二维向量的处理开始学习如何在下面我们从简单的二维向量的处理开始学习如何在模块中声明派生数据类型以及使用它模块中声明派生数据类型以及使用它问题:创建一个包含二维向量数据类型的模块以及问题:创建一个包含二维向量数据类型的模块以及两个完成向量加减法的函数两个完成向量加减法的函数第一步:第一步:创建一个容纳二维向量的派生数据类型:创建一个容纳二维向量的派生数据类型:TYPE:vectorREAL:xREAL:yEND
10、TYPE vector定义两个函数定义两个函数vector_add和和vector_sub,分别完成加,分别完成加法和减法法和减法这两个函数的返回值应该也是这两个函数的返回值应该也是vector所以我们可以这样写代码:所以我们可以这样写代码:TYPE(vector)FUNCTION vector_add(v1,v2)IMPLICIT NONETYPE(vector),INTENT(IN):v1,v2vector_add%x=v1%x+v2%xvector_add%y=v1%y+v2%yEND FUNCTION vector_addTYPE(vector)FUNCTION vector_sub(
11、v1,v2)IMPLICIT NONETYPE(vector),INTENT(IN):v1,v2vector_sub%x=v1%x-v2%xvector_sub%y=v1%y-v2%yEND FUNCTION vector_sub现在把这前面写的代码放在一个模块中现在把这前面写的代码放在一个模块中MODULE vector_moduleIMPLICIT NONETYPE:vector.END TYPE vectorCONTAINSTYPE(vector)FUNCTION vector_add(v1,v2).END FUNCTION vector_addTYPE(vector)FUNCTION
12、vector_sub(v1,v2).END FUNCTION vector_subEND MODULE vector_module测试程序测试程序PROGRAM testuse module_vectorIMPLICIT NONETYPE(vector):v1,v2WRITE(*,*)Enter the first vector(x,y):READ(*,*)v1%x,v1%yWRITE(*,*)Enter the second vector(x,y):READ(*,*)v2%x,v2%yWRITE(*,100)vector_add(v1,v2)100 FORMAT(1X,The sum of
13、the points is(,F8.2,F8.2,)WRITE(*,110)vector_sub(v1,v2)110 FORMAT(1X,The difference of the points is(,F8.2,F8.2,)END PROGRAM test_vector问题:问题:编写函数计算平面上两点间的距离编写函数计算平面上两点间的距离应用举例应用举例问题:问题:在物理研究中,我们在研究质点运动时,通过间隔在物理研究中,我们在研究质点运动时,通过间隔一个固定时间测量质点在空间的坐标,得到一系一个固定时间测量质点在空间的坐标,得到一系列的数据列的数据编写程序,通过对这些数据进行计算,得到质
14、点在编写程序,通过对这些数据进行计算,得到质点在某个时间点运动的速度和加速度某个时间点运动的速度和加速度问题分析:问题分析:每条测量数据是由时间和三维坐标组成每条测量数据是由时间和三维坐标组成可以用可以用t,x,y,z 表示表示我们可以写成一个自定义的数据类型我们可以写成一个自定义的数据类型TYPE:pos_tREAL:timeREAL:xREAL:yREAL:zEND TYPE pos_tN组测量数据可以放置在一个数组内:组测量数据可以放置在一个数组内:TYPE(pos_t):measure(N)假设测量的时间间隔是假设测量的时间间隔是0.1秒秒采用的计算模型:采用的计算模型:式中,式中,h
15、是每组数据之间的时间间隔是每组数据之间的时间间隔 是相邻的几组测量数据是相邻的几组测量数据MODULE example1IMPLICIT NONE TYPE:pos_tREAL:timeREAL:xREAL:yREAL:zEND TYPE pos_tCONTAINS SUBROUTINE velocity_acceleration(m,n,k)IMPLICIT NONEINTEGER n,kTYPE(pos_t):m(n)INTEGER iREAL:vx,vy,vz,ax,ay,azIF(kn-3)THENWRITE(*,*)Cant calculate this point!RETURNEN
16、D IF vx=m(k-2)%x-8*m(k-1)%x+8*m(k+1)%x-m(k+2)%xvx=vx/12/0.1vy=m(k-2)%y-8*m(k-1)%y+8*m(k+1)%y-m(k+2)%yvy=vy/12/0.1vz=m(k-2)%z-8*m(k-1)%z+8*m(k+1)%z-m(k+2)%zvz=vz/12/0.1ax=11*m(k-1)%x-20*m(k)%x+6*m(k+1)%x+4*m(k+2)%x-m(k+3)%xax=ax/12/0.01ay=11*m(k-1)%y-20*m(k)%y+6*m(k+1)%y+4*m(k+2)%y-m(k+3)%yay=ay/12/0
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Fortran 第十一
限制150内