⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 integer_set.f90

📁 用module来定义数据类型
💻 F90
字号:
MODULE  INTEGER_SETS!  This  module  is  intended  to  illustrate  use  of  the  module  facility!  to  define  a  new  data  type,  along  with  suitable  operators.INTEGER,  PARAMETER  ::  MAX_SET_CARD  =  200TYPE  SET  !  Define  SET  data  type  PRIVATE  INTEGER  CARD  INTEGER  ELEMENT  (MAX_SET_CARD)END  TYPE  SETINTERFACE  OPERATOR  (.IN.)  MODULE  PROCEDURE  ELEMENTEND  INTERFACEINTERFACE  OPERATOR  (<=)  MODULE  PROCEDURE  SUBSETEND  INTERFACEINTERFACE  OPERATOR  (+)  MODULE  PROCEDURE  UNIONEND  INTERFACEINTERFACE  OPERATOR  (-)  MODULE  PROCEDURE  DIFFERENCEEND  INTERFACEINTERFACE  OPERATOR  (*)  MODULE  PROCEDURE  INTERSECTIONEND  INTERFACECONTAINSINTEGER  FUNCTION  CARDINALITY  (A)  !  Returns  cardinality  of  set  A  TYPE  (SET)  A  CARDINALITY  =  A  %  CARDEND  FUNCTION  CARDINALITYLOGICAL  FUNCTION  ELEMENT  (X,  A)  !  Determines  if  INTEGER  X  !  element  X  is  in  set  A  TYPE  (SET)  A  INTENT (IN) X, A  ELEMENT  =  ANY  (A  %  ELEMENT  (1  :  A  %  CARD)  .EQ.  X)END  FUNCTION  ELEMENTFUNCTION  UNION  (A,  B)  !  Union  of  sets  A  and  B  TYPE  (SET)  A,  B,  UNION  INTENT (IN) A, B  INTEGER  J  UNION  =  A  DO  J  =  1,  B  %  CARD  IF  (.NOT.  (B  %  ELEMENT  (J)  .IN.  A))  THEN  IF  (UNION  %  CARD  <  MAX_SET_CARD)  THEN  UNION  %  CARD  =  UNION  %  CARD  +  1  UNION  %  ELEMENT  (UNION  %  CARD)  =  &  B  %  ELEMENT  (J)  ELSE  !  Maximum  set  size  exceeded  .  .  .  END  IF  END  IF  END  DOEND  FUNCTION  UNIONFUNCTION  DIFFERENCE  (A,  B)  !  Difference  of  sets  A  and  B  TYPE  (SET)  A,  B,  DIFFERENCE  INTENT (IN) A, B  INTEGER  J,  X  DIFFERENCE  %  CARD  =  0  !  The  empty  set  DO  J  =  1,  A  %  CARD  X  =  A  %  ELEMENT  (J)  IF  (.NOT.  (X  .IN.  B))  DIFFERENCE  =  DIFFERENCE  +  SET  (1,  X)  END  DOEND  FUNCTION  DIFFERENCEFUNCTION  INTERSECTION  (A,  B)  !  Intersection  of  sets  A  and  B  TYPE  (SET)  A,  B,  INTERSECTION  INTENT (IN) A, B  INTERSECTION  =  A  -  (A  -  B)END  FUNCTION  INTERSECTIONLOGICAL  FUNCTION  SUBSET  (A,  B)  !  Determines  if  set  A  is  TYPE  (SET)  A,  B  !  a  subset  of  set  B  INTENT (IN) A, B  INTEGER  I  SUBSET  =  A  %  CARD  <=  B  %  CARD  IF  (.NOT.  SUBSET)  RETURN  !  For  efficiency  DO  I  =  1,  A  %  CARD  SUBSET  =  SUBSET  .AND.  (A  %  ELEMENT  (I)  .IN.  B)  END  DOEND  FUNCTION  SUBSETTYPE  (SET)  FUNCTION  SETF  (V)  !  Transfer  function  between  a  vector  INTEGER  V  (:)  !  of  elements  and  a  set  of  elements  INTEGER  J  !  removing  duplicate  elements  SETF  %  CARD  =  0  DO  J  =  1,  SIZE  (V)  IF  (.NOT.  (V  (J)  .IN.  SETF))  THEN  IF  (SETF  %  CARD  <  MAX_SET_CARD)  THEN  SETF  %  CARD  =  SETF  %  CARD  +  1  SETF  %  ELEMENT  (SETF  %  CARD)  =  V  (J)  ELSE  !  Maximum  set  size  exceeded  .  .  .  END  IF  END  IF  END  DOEND  FUNCTION  SETFFUNCTION  VECTOR  (A)  !  Transfer  the  values  of  set  A  TYPE  (SET)  A  !  into  a  vector  in  ascending  order  INTEGER,  POINTER  ::  VECTOR  (:)  INTEGER  I,  J,  K  ALLOCATE  (VECTOR  (A  %  CARD))  VECTOR  =  A  %  ELEMENT  (1  :  A  %  CARD)  DO  I  =  1,  A  %  CARD  -  1  !  Use  a  better  sort  if  DO  J  =  I  +  1,  A  %  CARD  !  A  %  CARD  is  large  IF  (VECTOR  (I)  >  VECTOR  (J))  THEN  K  =  VECTOR  (J);  VECTOR  (J)  =  VECTOR  (I);  VECTOR  (I)  =  K  END  IF  END  DO  END  DOEND  FUNCTION  VECTOREND  MODULE  INTEGER_SETS

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -