Fortran结构体课件

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

结构体类型可以嵌套定义,即结构体类型的成员也可 以是另一个结构体类型的变量。P177 例: TYPE STUDENTRECORD CHARACTER (15) NAME INTEGER NUM LOGICAL SEX CHARACTER (30) ADDRESS END TYPE
TYPE STUDENTTOGETHER TYPE (STUDENTRECORD):: STUDENT REAL MATH REAL ENGLISH REAL CHINESE END TYPE
program clerkrecord implicit none integer :: k, i type clerk ! 定义结构体类型 integer num character(15) name real sal end type clerk type (clerk), dimension(150):: cl ! 定义结构体数组 k=0 Print *, "输入职工号num: " do i=1, 150 read *, cl(i).num end do
P177 例: TYPE STUDENT CHARACTER (15) NAME INTEGER NUM LOGICAL SEX CHARACTER (30) ADDRESS END TYPE
9.2 结构体变量的定义与引用 一、结构体类型变量的定义
格式: TYPE(派生类型名):: 结构体变量名 例:TYPE (STUDENT):: S1,S2
fortran结构体结构体fortran结构体定义fortran95程序设计c结构体结构体初始化结构体指针结构体数组c语言结构体结构体赋值
第九章
9.1 派生类数据类型
结构体
格式:TYPE[,ACCESS[::] ]派生类型名字 分量表 END TYPE [派生类名] ACCESS:访问方式,PRIVATE(私有的) PUBLIC(公共的) 默认方式为 PUBLIC 。 分量表:该类型中的成员项,每项要有类型说明。
! 插入算法 SUBROUTINE SORT_INSERT(STRE, NEW, N) type :: student character(15) :: name integer :: MARK integer :: grade end type student type (student)::stre(N+1) ! 说明数组 , N+1=11 type (student)::new Integer i, n, j i=1 do while (stre(i)% MARK <new% MARK. and. i<=N) i=i+1 end do do j=N, i, -1 stre(j+1)=stre(j) end do stre(i)=new end
print*, "输入职工姓名 name " do i=1, 150 read *, cl(i).name end do print*, "输入职工工资 sal " do i=1, 150 read *, cl(i).sal end do do i=1, 150 if(cl(i).sal<500) then ! 打印 工资<500的职工信息 及计数 k=k+1 print*, cl(i).num, " ", cl(i).name, " ", cl(i).sal end if end do Print *, k end
若定义 STUDENTTOGETHER 结构体变量 S : TYPE (STUDENTTOGETHER):: S 则结构体变量 S 包含:三个实型变量MATH、 ENGLISH、CHINESE和一个结构体变量STUDENT, 而STUDENT又包含NAME、NUM、SEX、 ADDRESS四个成员。
! 删除算法 SUBROUTINE DEL(STRE, DEKEY, N) TYPE STUDENT CHARACTER(15) NAME INTEGER MARK INTEGER GRADE END TYPE STUDENT TYPE (STUDENT), DIMENSION(N)::STRE TYPE (STUDENT)::TEMP INTEGER I, N, J, DEKEY I=1 DO WHILE((STRE(I)%MARK .NE. DEKEY) .AND. (I. LE. N)) I=I+1 ENDDO IF(I .GT. N)THEN PRINT*, "学生记录没找到,无法删除!" ELSE TEMP=STRE(I) !TEMP为一个临时记录,用于存放待删记录 DO J=I, N-1 STRE (J)=STRE(J+1) ENDDO PRINT*,"删除的记录为:",TEMP%NAME,TEMP%MARK,TEMP%GRADE ENDIF END
9.4 结构体数组
一般格式: TYPE (派生类型名), DIMENSION(维数说明符, …) :: 结构体数组名
例:TYPE(STUDENT), DIMENSION(100)::STU
P183 例:职工信息:职工号、职工姓名、年龄、工资,职工150人,存储 信息后统计工资低于500元的职工数,并输出相关信息。
PROGRAM STUDENT_RECORDS !主程序 TYPE STUDENT CHARACTER (15) NAME INTEGER MARK INTEGER GRADE END TYPE STUDENT INTEGER, PARAMETER :: STNUM= 5 ! 代表要处理的学生数 TYPE (STUDENT), DIMENSION(STNUM+1)::STRE TYPE (STUDENT)::NEW1 PRINT*, "请输入学生有关的信息" DO I=1, STNUM READ*,STRE (I)%NAME, STRE (I)%MARK, STRE (I)%GRADE END DO CALL SORT(STRE,stnum) PRINT*, "排序后的结果信息" DO I=1, STNUM print*, "NAME","MARK","GRADE" print*, STRE (I)%NAME, STRE (I)%MARK, STRE (I)%GRADE END DO PRINT*,“请输入待处理的学生有关的信息" READ(*,*) …… CALL …… END
二、定义变量的同时赋值
格式: TYPE (派生数据类成员初值表)
例如: TYPE TEACHER CHARACTER (12) NAME LOGICAL SEX END TYPE TYPE(TEACHER)::S1=TEACHER (“WU",.TRUE.), S2, S3 赋值时,所给的值类型和个数应与结构体变量定义中各成员的 类型与个数保持一致。 可以将一个结构体变量的值直接赋给另外一个结构体变量,
二、结构体成员的引用
结构体名 % 成员名 结构体名 . 成员名
如:S1. NAME、S1.NUM S2%NAME、S2%NUM S%STUDENT% NUM
9.3 结构体变量的赋值 一、用赋值语句给结构体成员赋值
P178 例9.1 职工工资表包含的数据有:姓名、性别、家庭住址、 工资等,现计算三个职工工资的平均值。
TYPE CLERK CHARACTER (15) NAME LOGICAL SEX CHARACTER (30) ADDRESS INTEGER SAL END TYPE TYPE (CLERK):: S1, S2, S3 S1.SAL=800 !也可用输入语句 READ*, S1.SAL S2%SAL=900 S3.SAL=700 AVER=(S1%SAL+S2.SAL+S3.SAL)/3 PRINT*, "三个职工的平均工资为:", AVER END
!排序算法 SUBROUTINE SORT(STRE, N) !可调数组 TYPE STUDENT CHARACTER (15) NAME INTEGER MARK INTEGER GRADE END TYPE STUDENT TYPE (STUDENT), DIMENSION(N)::STRE TYPE (STUDENT)::TEMP INTEGER I, J, N DO I=1, N-1 DO J=I+1, N IF(STRE (I)%MARK>STRE (J)%MARK)THEN TEMP=STRE (I) ;STRE (I)=STRE (J);STRE (J)=TEMP ENDIF END DO END DO END
P180 例: INTEGER S TYPE STUDENTRECORD CHARACTER (15) NAME INTEGER NUM LOGICAL SEX CHARACTER (30) ADDRESS END TYPE TYPE (STUDENTRECORD)::S1, S2 S1=STUDENTRECORD("ABCD",20,.TRUE.,"CHANGSHA") S2=S1 S=S2%NUM+S1%NUM PRINT*, S END
! 顺序查找 SUBROUTINE SORT_SEARCH(STRE, N, KEY) TYPE STUDENT CHARACTER(15) NAME INTEGER MARK INTEGER GRADE END TYPE STUDENT TYPE (STUDENT)::STRE (N) INTEGER I, N, KEY I=1 DO WHILE((STRE (I)%MARK.NE.KEY).AND.(I.LE.N)) I=I+1 ENDDO IF(I<=N)THEN PRINT*,“找到,姓名:”, STRE (I)%NAME ,"成绩:",STRE (I)%GRADE ELSE PRINT*,"查无此人" ENDIF END
相关文档
最新文档