这部分是FORTRAN90以上版本新增加的内容,它使.ppt

上传人:tang****xu1 文档编号:519828 上传时间:2018-09-25 格式:PPT 页数:64 大小:132.50KB
返回 下载 相关 举报
这部分是FORTRAN90以上版本新增加的内容,它使.ppt_第1页
第1页 / 共64页
这部分是FORTRAN90以上版本新增加的内容,它使.ppt_第2页
第2页 / 共64页
点击查看更多>>
资源描述

《这部分是FORTRAN90以上版本新增加的内容,它使.ppt》由会员分享,可在线阅读,更多相关《这部分是FORTRAN90以上版本新增加的内容,它使.ppt(64页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、第九章 派生类数据类型与结构体本章主要介绍派生类数据类型和结构体,这部分是FORTRAN90以上版本新增加的内容,它使FORTRAN语言功能得到进一步的加强,使用更加方便。9.1派生类数据类型FORTRAN90以前的FORTRAN版本,没有用户自定义的数据类型。这样给用户带来的不便,例如,我们要比较完整的表达多个学生的信息,假设学生包含的信息有:学生所在院系、学生班级、姓名、学号、年龄、性别、家庭住址、各科考试成绩等等,同时要对这些数据进行相应的处理,如 查找、插入、删除、计算、排序等。以前FORTRAN所用的方法是:将学生的每一项放在一个数组中,如:所有学生的姓名可以放在一个字符数组中,学号

2、可以存放在一个整型数组中,成绩可以存放在一个实型数组中等等,这样,要解决这个问题,需要对多个不同数组进行处理,编写程序必须注意各个学生所对应的数据项在数组中不能错位,否则将会张冠李戴。,FORTRAN90在这方面有较大的改进,主要是允许字定义派生类数据类型(简称派生类型),有了它,就能较容易地描述上述问题。派生数据类型定义的一般格式为:TYPE,ACCESS: 派生类名字分量表END TYPE 派生类名,说明,1.TYPE为关键字,是每定义一个派生类型的起点。2.ACCESS是可供选择的访问方式说明,分PRIVATE(私有的)和PUBLIC(公共的)两种,例如:REAL,PRIVATE:X1,

3、X2该语句定义了两个实型的私有派生类变量X1、X2。注意声明为PRIVATE时,外部模块不能访问它;声明为PUBLIC属性的实体,在其程序单位中用了USE语句就可以使用;默认方式为公共访问方式。“:”为作用域符。,3.派生类名为一个标识符,用户可以用任意标示符命名。4.分量表可以是各种类型的数据,并且可以是多项,每项前面必须加上类型说明。5.END TYPE 派生类名为派生类定义结束的标志。,下面看一个具体实例:TYPE STUDENTCHARACTER (15)NAMEINTEGER NUMLOGICAL SEXCHARACTER (30)ADDRESSEND TYPE,其中STUDENT为

4、派生类名。该派生类包含一个最多可存放15个字符的字符数组NAME、一个整型的变量NUM、一个逻辑类型变量SEX、一个最多可存放30个字符的字符数组ADDRESS,由于该派生类访问方式已经省略,因此,按照默认访问方式:公共访问方式对其进行访问。,9.2 结构体的定义与引用,有时我们需要将不同类型的数据结合成一个统一的整体,以便于引用。本节介绍派生类型中一种较简单的数据类型:结构体,它是由若干个相互之间有联系的数据项构成的。,结构体类型定义的一般形式为:TYPE(派生类型名):结构体名。例如第一节,定义学生派生类后,就可以用它来定义结构体变量TYPE (STUDENT):S1,S2 该语句定义了两

5、个结构体变量S1和S2,它们都包含STUDENT的所有成员:NAME、NUM、SEX、ADDRESS等5项。,9.2.1结构体类型定义,结构体既可以在程序中定义,也可以和其他内部数据类型一样放在另一个派生类型的定义中定义,即所谓嵌套定义。例如TYPE STUDENTRECORDCHARACTER (15)NAMEINTEGER NUMLOGICAL SEXCHARACTER (30)ADDRESSEND TYPE,TYPE STUDENTTOGETHERTYPE (STUDENTRECORD):STUDENTREAL MATHREALENGLISHREALCHINESEEND TYPE其中,先

6、定义STUDENTRECORD结构体,再把 TYPE (STUDENTRECORD):STUDENT语句放在结构体定义语句TYPE STUDENTTOGETHER之内,这样构成嵌套定义,即用一个结构体作为另外一个结构体的成员。,这时,如果定义如下结构体:TYPE (STUDENTTOGETHER):S这样,结构体变量S包含:三个实型变量MATH、ENGLISH、CHINESE和一个结构体变量STUDENT,而STUDENT又包含NAME、NUM、SEX、ADDRESS四个成员。,9.2.2结构体成员的引用,结构体成员的引用有两种方式:1.结构体名 % 成员表2.结构体名 . 成员表例如对上面定

7、义个S1,S2两个结构体变量,成员的引用如下:S1. NAME、S1.NUM、S1. SEX、S1.ADDRESSS2%NAME、S2%NUM、S2% SEX、S2%ADDRESS。,注意:,(1)两种引用方式可以交叉使用,但为了清晰起见,在一个程序中最好使用一种。(2)在含嵌套定义的结构体中,成员引用应当嵌套使用“%”或“.”,例如,对上面结构体S中成员NUM的引用方式为S%STUDENT% NUM。,9.3结构体的初始化,9.3.1 利用赋值语句给结构体成员赋值下面看一个完整的例子:例9.1 某单位职工工资表包含的记录有:姓名、性别、家庭住址、工资等项,现计算三个职工工资的平均值。程序如下

8、:,TYPE CLERKCHARACTER (15)NAMELOGICAL SEXCHARACTER (30)ADDRESSINTEGER SALEND TYPETYPE (CLERK):S1,S2,S3S1.SAL=800S2%SAL=900S3.SAL=700AVER=(S1%SAL+S2.SAL+S3.SAL)/3PRINT*,三个职工的平均工资为:,AVEREND,其中结构体成员赋值的三个语句为:S1. SAL =800、 S2% SAL =900、S3. SAL =700,这与普通变量赋值本质上是一样的,也就是说可以把某结构体变量成员的引用一起当作一个变量来使用,因此也可以用输入语句

9、来赋值。,例9.2 学生记录包含如下数据项:姓名、一门功课的成绩、性别、家庭住址,要求打印学生各数据项,并求出该门成绩的平均值。程序如下:TYPE STUDENTCHARACTER (15)NAMEINTEGER GRADELOGICAL SEXCHARACTER (30)ADDRESSEND TYPETYPE (STUDENT):S1,S2,S3,PRINT*,请输入三个学生的名字READ*,S1.NAME,S2.NAME,S3.NAMEPRINT*,请输入三个学生的成绩READ*,S1.GRADE,S2.GRADE,S3.GRADEPRINT*,请输入三个学生的性别READ*,S1%SEX

10、,S2%SEX,S3%SEXPRINT*,请输入三个学生的住址READ*,S1.ADDRESS,S2.ADDRESS,S3.ADDRESS PRINT*,三个学生的名字为,S1.NAME,S2.NAME,S3.NAME,PRINT*,三个学生的性别为 ,S1%SEX,S2%SEX,S3%SEXPRINT*,三个学生的住址为,S1.ADDRESS,S2.ADDRESS, $S3.ADDRESSAVER=(S1%GRADE+S2.GRADE+S3.GRADE)/3PRINT*,三个学生的平均成绩为:,AVEREND,请输入三个学生的名字输入:ZHANG LI WANG回车请输入三个学生的成绩输入三

11、个正整数如85 90 80回车请输入三个学生的性别输入.F. .T. .F.回车请输入三个学生的住址输入:CHANGSHA GUANGZHOU BEIJING 回车,最后输出结果为三个学生的名字为ZHANG LI WANG三个学生的性别为F T F三个学生的住址为CHANGSHA GUANGZHOU BEIJING三个学生的平均成绩为85,9.3.2 定义的同时赋值,在定义结构体变量的同时,给定结构体各成员的值。其格式为:TYPE (派生数据类名):结构体变量名=派生数据类名(成员初值表)其中,=后面的派生类名即为TYPE后面的派生类名;成员之间的值用“,”隔开。例如结构体如下:,TYPE T

12、EACHERCHARACTER (12)NAMELOGICAL SEXCHARACTER(15)POSIT CHARACTER (30)ADDRESSINTEGER SALEND TYPE 这样我们可以用如下方式给对应的结构体变量赋值:TYPE(TEACHER):S1=TEACHER (ZHANG,.TRUE.,PROFESSOR,”CHANGSHANG”,2000),S2,S3这样,结构体变量S1的值全部被给定。,这种赋值方式应当注意:,(1)赋值时,所给的值类型和个数应与结构体变量定义中各成员的类型与个数保持一致。(2)可以将一个结构体变量的值直接赋给另外一个结构体变量,,INTEGER

13、STYPE STUDENTRECORDCHARACTER (15)NAMEINTEGER NUMLOGICAL SEXCHARACTER (30)ADDRESSEND TYPE TYPE (STUDENTRECORD):S1,S2S1=STUDENTRECORD(ABCD,20,.TRUE.,CHANGSHA)S2=S1S=S2%NUM+S1%NUMPRINT*,SEND,这里,通过S2=S1语句,使S1和S2两个结构体变量得到相同的值,输出S的结果为40。当结构体中包含成员较多时,可以用嵌套定义的方式,使结构体变得简洁,如例9.2中,当学生的成绩是多门时,可以将它们单独定义在一个结构体中,然

14、后将该结构体包含到主结构体中,下面再看一个例子:,例9.3、学生信息包含如下数据项:姓名、性别、学号、年龄和5门功课的成绩:语文、数学、物理、化学、英语,要求输入三个学生的记录,打印出相关信息与总成绩。分析:学生的成绩有5门,可以将它们放在一个名为STUDENTSCORE的结构体中,而将学生所有记录存放在名为STUDENTRECORD的结构体中,该结构体包含结构体STUDENTSCORE,然后作相应处理,注意学生成绩输入语句。程序如下:,PROGRAM XUESHENGJILUREAL AVER1,AVER2,AVER3 TYPE STUDENTSCOREREAL CHINESEREAL MA

15、THREAL PHYSICSREAL CHEMISTRYREAL ENGLISHEND TYPE,TYPE STUDENTRECORDCHARACTER (17)NAMELOGICAL SEXINTEGER NUMBERINTEGER BIRTHDAY TYPE(STUDENTSCORE):SCOREEND TYPETYPE(STUDENTRECORD):S1,S2,S3PRINT*,请输入3个学生的姓名READ*,S1.NAME,S2.NAME,S3.NAMEPRINT*,请输入3个学生的性别READ*,S1.SEX,S2.SEX,S3.SEXPRINT*,请输入3个学生的学号READ*,S

16、1.NUMBER,S2.NUMBER,S3.NUMBERPRINT*,请输入3个学生的年龄READ*,S1.BIRTHDAY,S2.BIRTHDAY,S3.BIRTHDAY,PRINT*,请输入3个学生的语文成绩READ*,S1%SCORE%CHINESE,S2%SCORE%CHINESE,S3%SCORE%CHINESEPRINT*,请输入3个学生的数学成绩READ*,S1%SCORE%MATH,S2%SCORE%MATH,S3%SCORE%MATHPRINT*,请输入3个学生的物理成绩READ*,S1%SCORE%PHYSICS,S2%SCORE%PHYSICS,S3%SCORE%PHYS

17、ICSPRINT*,请输入3个学生的化学成绩READ*,S1%SCORE%CHEMISTRY,S2%SCORE%CHEMISTRY,S3%SCORE%CHEMISTRYPRINT*,请输入3个学生的英语成绩READ*,S1%SCORE%ENGLISH,S2%SCORE%ENGLISH,S3%SCORE%ENGLISHAVER1=(S1%SCORE%CHINESE+S1%SCORE%MATH+S1%SCORE%PHYSICS+S1%SCORE%CHEMISTRY+S1%SCORE%ENGLISH)/5.0,AVER2=(S2%SCORE%CHINESE+S2%SCORE%MATH+S2%SCOR

18、E%PHYSICS+S2%SCORE%CHEMISTRY+S2%SCORE%ENGLISH)/5.0AVER3=(S3%SCORE%CHINESE+S3%SCORE%MATH+S3%SCORE%PHYSICS+S3%SCORE%CHEMISTRY+S3%SCORE%ENGLISH)/5.0PRINT*,S1.NAME,S1.SEX,S1.NUMBER,S1.BIRTHDAYPRINT*,S1%SCORE%CHINESE,S1%SCORE%MATH,S1%SCORE%PHYSICS, $S1%SCORE%CHEMISTRY,S1%SCORE%ENGLISH, AVER1,PRINT*,S2.NA

19、ME,S2.SEX,S2.NUMBER,S2.BIRTHDAYPRINT*,S2%SCORE%CHINESE,S2%SCORE%MATH,S2%SCORE%PHYSICS, $S2%SCORE%CHEMISTRY,S2%SCORE%ENGLISH, AVER2 PRINT*,S3.NAME,S3.SEX,S3.NUMBER,S3.BIRTHDAYPRINT*,S3%SCORE%CHINESE,S3%SCORE%MATH,S3%SCORE%PHYSICS, $S3%SCORE%CHEMISTRY,S3%SCORE%ENGLISH, AVER3END,9.5 综合实例,在这一节中,我们结合数据处理

20、中的一些常见操作,如数据的排序、插入、查找、删除、更新等,介绍结构体的综合应用实例。为了简便起见,我们同样以学生信息为例,且假设学生信息仅仅包含姓名和一门功课的成绩,另外加一个唯一的标识(如学号),现在考虑如何完成上述的操作。首先定义学生结构体如下:,TYPE STUDENTRECORD CHARACTER (15)NAME INTEGERMARKINTEGER GRADEEND TYPE STUDENTRECORD其中:NAME 代表学生姓名,MARK代表标示,GRADE代表成绩,其次必须考虑的是如何存储学生信息的问题。为此,定义如下结构体数组:TYPE (STUDENTRECORD), D

21、IMENSION(STNUM):STRECORD其中,STNUM为符号常量,代表学生人数,可以在使用之前通过INTEGER, PARAMETER : STNUM= 20来定义,该语句的含义为定义一个整型的符号常量STNUM,其值为20,可以根据学生人数修改其值,下面一步一步地介绍完成上述的操作。,9.5.1 排序,排序(SORTING)是数据处理领域中最常用的一种运算,分为升序和降序排序两种,排序方法较多,常见的有简单交换排序、选择排序、冒泡排序、堆排序、快速排序、归并排序等,不同的排序方法,有不同的优点和缺点,但其中某些排序牵涉到数据结构方面的知识,如堆排序,已超出本书范围,读者如果有兴趣,

22、可以参看有关数据结构方面的知识,这里仅仅使用简单交换法排序。排序的主要目的之一是为了查找方便,因此一般牵涉到排序字或称关键词(KEY)问题,这里用每个学生的标识MARK作为关键字进行排序字,如果要对学生的成绩排序,只须将MARK改为GRADE即可。,简单交换法思想介绍如下:先将除第一个数据项以外的所有数据与第一个数据项比较,前者小,则将与它有关的记录与后者有关的记录交换,显然,第一轮排序进行完毕,排序项最小者将被交换到最前面。然后从第二个排序项开始重复前述操作,依次类推,直到排序完成止。我们定义SORT函数来完成排序操作,程序如下:,SUBROUTINE SORT(STRECORD,N)TYP

23、E STUDENTRECORD CHARACTER (15)NAMEINTEGERMARKINTEGER GRADEEND TYPE STUDENTRECORDINTEGER, PARAMETER : STNUM= 5TYPE (STUDENTRECORD), DIMENSION(STNUM):STRECORDTYPE (STUDENTRECORD):TEMPINTEGER I,J,N,DOI=1,NDOJ=I+1,NIF(STRECORD(I)%MARKSTRECORD(J)%MARK)THENTEMP=STRECORD(I)STRECORD(I)=STRECORD(J)STRECORD(J

24、)=TEMPENDIFEND DOEND DOEND,9.5.2 查找,查找(SEARCH)同人们日常生活有着密切的联系。如从字典中查找单词,从工资表中查找工资,从电话号码薄中查找电话,从图书馆中查找书,从地图上查找路线和地址等。同排序一样,查找的方法非常多,如顺序查找、二分查找、索引查找、分块查找、B_树查找等,这里介绍无序情况下的顺序查找和有序情况下的二分查找两种。,一、顺序查找,顺序查找的基本思想是:先输入待查找的标示KEY,从第一个开始,将它与已经存放好的学生记录中相应的项(在这里用MARK)比较,如果KEY与MARK相同,说明已找到,这时可以输出相关信息,如果KEY与MARK不同,则

25、拿下一个记录中的MARK与KEY比较,直到找到或者到最后一个记录止,并输出相关的信息。程序如下:,SUBROUTINE SORT_SEARCH(STRECORD,N,KEY)TYPE STUDENTRECORD CHARACTER(15) NAMEINTEGER MARKINTEGER GRADEEND TYPE STUDENTRECORDINTEGER, PARAMETER : STNUM=5TYPE (STUDENTRECORD), DIMENSION(STNUM):STRECORDINTEGER I,N,KEY,I=1DO WHILE(STRECORD(I)%MARK.NE.KEY).A

26、ND.(I.LE.N)I=I+1ENDDOIF(I=N)THEN PRINT*,学生已经找到,其他相关的信息为:PRINT*,姓名为:,STRECORD(I)%NAMEPRINT*,成绩为:,STRECORD(I)%GRADEELSEPRINT*,查无此人ENDIFEND,2.二分查找,二分查找,又称折半查找。作为二分查找对象的表必须是有序表,其最大的优点是查找速度非常快,数据越多,效果越明显。其基本思想如下:定义一个TOP指针(在这里可以理解为数组的第一个下标)指向表的第一个元素,定义一个BOT指针,指向表的最后一个元素,一个MID指针指向表的中间元素(靠左),即MID=(TOP+BOT)/

27、2取下限,每一次查找,总是将待查项与MID指针所对应的元素的对应项比较,如果对应项刚好就是要查找的项,则说明已经找到,可以输出相关的信息;如果对应项小于待查项,则改BOT=MID-1,重新计算MID,然后重复前面的比较;如果对应项大于待查项,则改TOP=MID+1,重新计算MID,然后重复前面的比较。这样如果到TOP大于BOT还没有找到对应待查项,说明该项不在此表中。程序如下:,SUBROUTINE HALF_SEARCH(STRECORD,TOP,BOT,KEY)TYPE STUDENTRECORD CHARACTER(15) NAMEINTEGER MARKINTEGER GRADEEND

28、 TYPE STUDENTRECORDINTEGER, PARAMETER : STNUM=5TYPE (STUDENTRECORD), DIMENSION(STNUM):STRECORD,INTEGER TOP,BOT,MID,KEYMID=(TOP+BOT)/2DO 100 WHILE(STRECORD(MID)%MARK.NE.KEY).AND.(TOP.LE.BOT)IF(STRECORD(MID)%MARKKEY)THENTOP=MID+1ELSEBOT=MID-1ENDIFMID=(TOP+BOT)/2,100CONTINUE IF(TOPSTRECORD(J)%MARK)THEN

29、TEMP=STRECORD(I)STRECORD(I)=STRECORD(J)STRECORD(J)=TEMPENDIFEND DOEND DODOI=1,STNUMPRINT*,STRECORD(I)%NAME,STRECORD(I)%MARK,STRECORD(I)%GRADEENDDOEND当输入zhang589li365,zhao469liu194hu277时,输出:2、定义一个结构体变量,其成员包括学生的:学号、性别、年龄、专业、住址、电话号码等。3、用两种不同的方法为上面结构体变量赋值。4、定义结构体数组,结构体成员同第一题,为它赋值并输出。 5、在第第三题的基础上,以学号作关键字,完成查找更新等操作。6、已知职工工资表记录包括:职工号、姓名、年龄、职称、工资,建立一个10个职工组成的记录表,并找出职工中工资最高和最低者及相关信息,统计工资总额,计算职工平均工资。,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com