6. ÇÛÎó¥Ç¡¼¥¿                                                 Ìܼ¡¤Ø

 6.1.   £±¼¡¸µÇÛÎó
 6.1.1. ÇÛÎó¤ÎÀë¸À
 6.2.   ÇÛÎó¤Î±é»»
 6.2.1. ÉôʬÇÛÎó¤Èź»úÇÛÎó
 6.2.2. ÇÛÎóÂåÆþʸ
 6.2.3. DO·¿Äê¿ô
 6.2.4. ½é´üÃÍÀßÄê
 6.2.5. ÇÛÎó±é»»¼°                [90]
 6.2.6. ÇÛÎó¤ÎÆþ½ÐÎÏ
 6.3.   ÇÛÎó¤ÎưŪ³äÉÕ¤±          [90]
 6.4.   ¿¼¡¸µÇÛÎó
 6.4.1. Àë¸À
 6.4.2. ¿¼¡¸µÇÛÎóÍ×ÁǤΰúÍÑ
 6.4.3. ¿¼¡¸µÇÛÎóÍ×ÁÇ¤Î½ç½ø
 6.4.4. ¿¼¡¸µÇÛÎó¤ÎÄê¿ôÂåÆþʸ
 6.4.5. WHEREʸ                   [90]
 6.5.   ÇÛÎó´Ø¿ô¡Î(ÉÕ)¥»¥ë¥ª¡¼¥È¥Þ¥È¥ó¡Ï

¡¡Åº¤¨»úÉÕ¤­¤Î¥Ç¡¼¥¿¤ò°·¤¦¤Ë¤ÏÇÛÎó¤òÍѤ¤¤ë¡£ÇÛÎó¤Ïɬ¤ºÌ¾Á°¤ÈÂ礭¤µ¤òÀë¸À¤·¤Æ
¤ª¤«¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡£


6.1. £±¼¡¸µÇÛÎó

6.1.1. ÇÛÎó¤ÎÀë¸À


¡¡¡¡¡¡¡¡¡¡·¿¡¤DIMENSION([²¼¸Â¡§] ¾å¸Â):: ÇÛÎó̾¤Î¤Ê¤é¤Ó¡¡¡¡[90]
¡¡¡¡¡¡¡¡¡¡·¿:: ÇÛÎó̾¡Ê[²¼¸Â¡§] ¾å¸Â¡Ë¡¤...                [90]
¡¡¡¡¡¡¡¡¡¡DIMENSION([²¼¸Â¡§] ¾å¸Â¡Ë ÇÛÎó̾¤ÎʤÓ


¡¡¡¡Î㡡ꤍ»ú¤¬£±¤«¤é100¤Þ¤Ç¤ÎÃͤò¤È¤ëÀ°¿ô¥Ç¡¼¥¿¤ÎÇÛÎó¤ÎÀë¸À

          INTEGER, DIMENSION(1:100):: num               [90]
          INTEGER :: abc(100)                           [90]
          INTEGER  kind(1:100)
          DIMENSION(100) mov  ¡Êmov ¤ÏINTEGERÀë¸À¤¬¤µ¤ì¤Æ¤¤¤ë¤È¤¹¤ë¡Ë

¡¡Åº¤¨»ú¤ÎÈϰϤϡʲ¼¸Â¡§¾å¸Â¡Ë¤Çɽ¤·¡¤²¼¸Â¤¬£±¤Î¤È¤­¤À¤±¤Ï¾Êά¤·¤Æ¡Ê¾å¸Â¡Ë¤È½ñ
¤¯¤³¤È¤¬¤Ç¤­¤ë¡£ÇÛÎó¤ÎÂ礭¤µ¡ÊÀ£Ë¡¡Ë¤ò·è¤á¤ë¾å¸Â¡¤²¼¸Â¤Ï¡¤°ìÈ̤ˤÏÄê¿ô¡Ê¤Þ¤¿¤Ï
Ãͤηè¤á¤é¤ì¤¿Äê¿ô̾¡Ë¤ÇÍ¿¤¨¤ë¡£ÇÛÎó¤ÎÂ礭¤µ¤ò¡¤¥×¥í¥°¥é¥à¼Â¹Ô¤ÎÅÓÃæ¤ËÊÑ¿ô¤ÇÍ¿
¤¨¤ë¤³¤È¤¬¤Ç¤­¤ë¤Î¤Ï°Ê²¼¤Î¾ì¹ç¤Ç¤¢¤ë¡£

¡¡1)ALLOCATABLE°À­¤òÀë¸À¤·¤Æ¤ª¤­¡¤ALLOCATEʸ¤ÇÍ¿¤¨¤ë¡ÊưŪ³äÉÕ¤±¢ª6-3¡Ë
¡¡2)¥µ¥Ö¥ë¡¼¥Á¥ó¤Ê¤É¤ÎÉû¥×¥í¥°¥é¥à¤Î°ú¿ô¤È¤Ê¤Ã¤Æ¤¤¤ë¾ì¹ç¡ÊÀ°¹çÇÛÎ󢪣¸¾Ï¡Ë
¡¡3)Éû¥×¥í¥°¥é¥àÃæ¤Ç¤Î¤ß»È¤ï¤ì¤ë¶É½êŪ¤ÊÇÛÎó¤ÎÂ礭¤µ¤ò²¾°ú¿ô¤ÇÍ¿¤¨¤ë¾ì¹ç
¡¡¡¡¡Ê¼«Æ°³äÉÕÇÛÎ󢪣¸¾Ï¡Ë

¡¡Ãí¡Ë¤¿¤À°ì¤Ä¤ÎÍ×ÁǤÀ¤±¤ò¤â¤Ä¡ÖÀ£Ë¡£±¤Î£±¼¡¸µÇÛÎó¡×¤â¡¤¥¹¥«¥éÊÑ¿ô¤È¤Ï¶èÊ̤·¤Æ
¡¡¡¡¡¡ÇÛÎó¤È¤·¤Æ°·¤ï¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¾ì¹ç¤¬¤¢¤ë¡£¡ÊÇÛÎó´Ø¿ô¢ª6.5.¡Ë

¡¡¡¡Îã¡¡INTEGER, DIMENSION(1):: a, b, c


¡¡ÎãÂê 6_1¡Ö100¸Ä°Ê²¼¤ÎÀµ¤ÎÀ°¿ô¥Ç¡¼¥¿¤ò¼¡¡¹¤ËÆÉ¤ß¹þ¤ó¤Ç¡¤¤³¤ì¤òÂ礭¤¤
¡¡¡¡¡¡¡¡¡¡¡¡¡¡½ç¤ËʤÙÂØ¤¨¤Æ½ÐÎϤ»¤è¡£¥Ç¡¼¥¿ÆþÎϤϣ°¤ÎÆþÎϤǽªÎ»¤È¤»¤è¡£¡×

[ex6_1.f90]
  ! --- Sorting Array Elements ---
  PROGRAM Ex6_1_Sorting
      INTEGER :: m, mark(100), n = 0, max, maxi, i, j
      DO WHILE( n <= 99 )
          PRINT*, "Input integer, or negative one to stop:"
          READ*, m ;   IF( m <= 0 ) EXIT
          n = n + 1;    mark(n) = m
      END DO
   ! --- Sorting
      DO i = 1, n-1
         max = mark(i)
         maxi = i
         DO j = i+1, n
             IF( mark(j) > max ) THEN
                 max = mark(j)
                 maxi = j
             END IF
         END DO
         IF( maxi /= i ) THEN
             mark(maxi) = mark(i)
             mark(i) = max
         END IF         
      END DO
   ! --- Output
      DO i = 1, n
         PRINT "( ' Rank', I3, ' =', I10 )", i, mark(i)
      END DO
   END PROGRAM Ex6_1_Sorting



6.2. ÇÛÎó¤Î±é»»

6.2.1. ÉôʬÇÛÎó¤Èź»úÇÛÎó

¡¡¤¹¤Ç¤ËÄêµÁ¤µ¤ì¤Æ¤¤¤ëÇÛÎó¤Î°ìÉôʬ¤òÇÛÎó¤È¤·¤ÆÄêµÁ¤Ç¤­¤ë¡£[90]


  ¡¡             ÇÛÎó̾¡ÊÈϰϤβ¼¸Â¡§ÈϰϤξå¸Â¡Ë


¡¡¡¡¡¡ÈϰϤξå¸Â¡¤²¼¸Â¤ò¾Êά¤¹¤ì¤Ð¡¤¸µ¤ÎÇÛÎó¤Î¾å¸Â¡¤²¼¸Â¤È²ò¼á¤µ¤ì¤ë¡£
¡¡¡¡¡¡¡¡Îã¡¡INTEGER :: a(5) ¤ÈÀë¸À¤µ¤ì¤Æ¤¤¤ë¤È¤­
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡a(4:) ¤Ï a(4:5) ¤ÈƱ¤¸
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡a(:3) ¤Ï a(1:3) ¤ÈƱ¤¸¡¤
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡a(:) ¤Ï a(1:5) ¤Þ¤¿¤Ï a ¤ÈƱ¤¸¡£
                        a(1:5:2) ¤Ï¡¤´ñ¿ôÈÖÌܤÎÍ×ÁÇ
                        a(5:1:-1) ¤Ï¡¤Í×ÁǤòµÕ¤Ëʤ٤¿ÇÛÎó


¡ãź»úÇÛÎó¡ä¡¡À°¿ôÇÛÎó¤Çź»úÎó¤ò»ØÄꤹ¤ë¤³¤È¤¬¤Ç¤­¤ë¡§¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡[90]

¡¡¡¡¡¡Îã¡¡INTEGER :: a(4) = (/ 0, 1, 2, 3 /), b(3) = (/ 1, 4, 3 /) ¤Î¤È¤­
          a(b) ¤Ï¡¤¥Ç¡¼¥¿·¿¤Ï a ¤ÈƱ¤¸¤Ç¡¤·Á¾õ¤Ï b ¤ÈƱ¤¸¡Ê1¼¡¸µ¤ÇÀ£Ë¡3¡Ë
¡¡¡¡¡¡¡¡¡¡¤Î (/ 0, 3, 2 /) ¤È¤Ê¤ë¡£

¡¡¡¡ÉôʬÇÛÎó¤Ç¤¢¤ëɬÍפϤʤ¯¡¤Â礭¤¯¤Ê¤Ã¤Æ¤â¤è¤¤¡§

¡¡¡¡¡¡¡¡¡¡b(6)=(/ 2, 3, 2, 3, 2, 3 /) ¡¡¤Î¤È¤­
¡¡¡¡¡¡¡¡¡¡a(b)=(/ 1, 2, 1, 2, 1, 2 /) ¡¡¤È¤Ê¤ë¡£

¡¡¡¡¡¡Îã  CHARACTER(1) :: symbol(0:1)=(/ 'F', 'M' /)
          INTEGER :: bit(100)

¡¡¡¡¡¡¤Î¤È¤­ symbol(bit) ¤Ï¡¤bit¤ÎÍ×ÁÇÎó¡ÎÎã¡Ï 0001101100111... Åù¤Ë±þ¤¸¤Æ
      {F,M}¤Îʸ»ú¤òƱ¤¸¤¯100¸Äʤ٤¿Ê¸»ú·¿ÇÛÎó FFFMMFMMFFMMM... Åù¤Ë¤Ê¤ë¡£


6.2.2. ÇÛÎóÂåÆþʸ

¡¡ÇÛÎóÍ×ÁǤ˰ì¤Ä¤º¤ÄÃͤòÂåÆþ¤¹¤ë°Ê³°¤Ë¤â¡¤ÇÛÎó̾¡Ê¤Þ¤¿¤ÏÉôʬÇÛÎó̾¡Ë¤Ë¡¤¤Þ¤È
¤á¤ÆÆ±¤¸Â礭¤µ¤ÎÇÛÎóÃͤޤ¿¤ÏÄê¿ô¤òÂåÆþ¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡£[90]

     Îã   INTEGER :: a(10), b(5), c(15)
          a = (/  0, 1, 2, 3, 4, 5, 6, 7, 8, 9   /)    ¢«¡ÖÇÛÎóÄê¿ô¡×¡Ê£±¾Ï¡Ë
          b = a(1:5)
          c(1:10) = a
          c(11:15) = a(6:10)
          a = 0                                      ¢« Á´Í×ÁǤ¬£°¤È¤Ê¤ë
          a(1:9:2)=1                                 ¢« ´ñ¿ô¹à¤¬£±¤È¤Ê¤ë
          a(2:10:2)=0                                ¢« ¶ö¿ô¹à¤¬£°¤È¤Ê¤ë


6.2.3. DO·¿Äê¿ô

¡¡¾å¤ÎÎã¤ÎÇÛÎó a ¤ÎÄêµÁ¤Ï¡¤DO·¿½ÐÎϡʣµ¾Ï¡Ë¤ÈƱ¤¸·Á¼°¤Ç½ñ¤¯¤³¤È¤¬¤Ç¤­¤ë¡£ [90]

     Îã   a = (/ ( i, i = 0, 9 ) /)


6.2.4. ½é´üÃÍÀßÄê

¡¡ÇÛÎóÀë¸Àʸ¤Þ¤¿¤ÏDATAʸ¤Ç½é´üÃͤòÀßÄê¤Ç¤­¤ë¡£

     Îã  REAL, DIMENSION(5):: x =(/ 1.0,0.5,0.25,0.125,0.0625 /)       [90]

         INTEGER :: a(1:10)=(/ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18  /)   [90]
         INTEGER :: a(1:10) = (/  ( n, n = 0, 18, 2)  /)               [90]
         INTEGER :: a(10) = (/ (2*n, n = 0, 9) /)   ¡¡                 [90]

         INTEGER :: b(-2:2)=(/ ( 128, i = 1, 5) /)                     [90]
         INTEGER  b(5)/ 128, 128, 128, 128, 128/
         INTEGER  b(5)/5*128/                        ¢« 5* ¤Ï·«¤êÊÖ¤·¿ô

         CHARACTER*1  c(0:15)/ 8*'T', 8*'F'/

         LOGICAL cond(0:7)
         DATA  cond /4*.TRUE., 4*.FALSE. /          ¢« 4* ¤Ï·«¤êÊÖ¤·¿ô


6.2.5. ÇÛÎó±é»»¼°

¡¡ÇÛÎó̾¡¤ÉôʬÇÛÎó̾¤Î¤Þ¤Þ¤Ç¡¤³ÆÍ×ÁǤδ֤α黻¤ò¤Þ¤È¤á¤Æ½ñ¤¯¤³¤È¤¬¤Ç¤­¤ë¡£ [90]

¡¡¡¡Îã   INTEGER, DIMENSION(100):: even, odd, wa, sa, seki, sho, beki
    ¡¡   even  = (/ (2*i, i=0, 49) /);  odd  = (/ (2*i+1, i=0,49) /)

¡¡¡¡¡¡¤ÈÄêµÁ¤µ¤ì¤Æ¤¤¤ë¤È¤­

         wa = even + odd
         sa = even - odd
         seki = even * odd
         sho = even * odd
         beki = even **2

¡¡¡¡¡¡¤Ë¤è¤ê¡¤Âбþ¤¹¤ë³ÆÍ×ÁǤδ֤α黻·ë²Ì¤òÍ×ÁǤȤ¹¤ëÇÛÎ󤬺î¤é¤ì¤ë¡£¤¹¤Ç¤Ë
¡¡¡¡¡¡½Ð¤Æ¤­¤¿ ź»úÇÛÎó ¤âƱ¤¸À­³Ê¤Î»È¤¤Êý¤Ç¤¢¤ë¡£¤³¤ì¤ÏÁȹþ¤ß´Ø¿ô¤Î°ú¿ô¤Ë¤â
¡¡¡¡¡¡Å¬ÍѤǤ­¤ë¡§

¡¡¡¡Îã
         a = ABS(a)        ¢«¡¡³ÆÍ×ÁǤÎÀäÂÐÃͤòÍ×ÁǤȤ¹¤ëÇÛÎó¤ËÃÖ¤­Âؤï¤ë¡£
         s = SQRT(ABS(a))  ¢«¡¡³ÆÍ×ÁǤÎÀäÂÐÃͤÎÊ¿Êýº¬¤òÍ×ÁǤȤ¹¤ëÇÛÎó¡£

¡¡¤³¤Îµ¡Ç½¤ÏÊÂÎó·×»»µ¡¤ò°Õ¼±¤·¤Æ [90] ¤Ç¿·¤¿¤ËÄɲ䵤줿¤â¤Î¤Ç¡¤ÊÂÎó·×»»µ¡¤Ç
¤Ê¤¤¾ì¹ç¤Ç¤â·Á¤Î¾å¤Ç¤ÏÊÂÎó·×»»¤¬¹Ô¤ï¤ì¤ë¡£

¡¡¡¡Îã ¡¡INTEGER :: a(0:9)=(/ 0,1,2,3,4,5,6,7,8,9 /)
¡¡¡¡¡¡¤Î¤È¤­¡¤
         a( 1:9 ) = a( 0:8 )
¡¡¡¡¡¡¤È¡¤
         DO  i = 1, 9
             a(i) = a(i-1)
         END DO

¡¡¡¡¡¡¤Ï·ë²Ì¤¬°Û¤Ê¤ë¡£Á°¼Ô¤Ç¤Ï

          |a(0)|a(1)|a(2)|a(3)|a(4)|a(5)|a(6)|a(7)|a(8)|a(9)|
   ¡¡     ¡¡¡¡¡¡ ¢¬¡¡ ¢¬   ¢¬   ¢¬   ¢¬   ¢¬   ¢¬   ¢¬   ¢¬
               |a(0)|a(1)|a(2)|a(3)|a(4)|a(5)|a(6)|a(7)|a(8)|a(9)|
¡¡¡¡¡¡
      ¤ÎÂåÆþ¤¬ÊÂÎ󡤤¹¤Ê¤ï¤ÁƱ»þ¤Ë¹Ô¤ï¤ì¤ë¤Î¤ËÂФ·¤Æ¡¤¸å¼Ô¤Ç¤Ï

          |a(0)|a(1)|a(2)|a(3)|a(4)|a(5)|a(6)|a(7)|a(8)|a(9)|
              ¢ª   ¢ª   ¢ª   ¢ª   ¢ª   ¢ª   ¢ª   ¢ª   ¢ª
              ­¡¡¡ ­¢¡¡ ­£   ­¤   ­¥   ­¦   ­§   ­¨   ­©

      ¤È¡¤Ã༡Ū¤ËÂåÆþ¤µ¤ì¤ë¡£¤³¤Î·ë²Ì¡¤Á°¼Ô¤Ç¤Ï¡¡(/ 0,0,1,2,3,4,5,6,7,8 /) 
      ¤È¡¤Ãͤ¬¥·¥Õ¥È¤µ¤ì¤ë¤Î¤ËÂФ·¤Æ¡¤¸å¼Ô¤Ç¤Ï¡¤(/ 0,0,0,0,0,0,0,0,0 /) ¤È¤Ê
      ¤ë¡£Á°¼Ô¤ÈƱ¤¸·ë²Ì¤òDO¥ë¡¼¥×¤Ç¼Â¸½¤¹¤ë¤Ë¤Ï¡¤Ê̤Ρ֥³¥Ô¡¼ÇÛÎó¡×¤òÍѰդ·
      ¤Æ¤ª¤­

         INTEGER :: a(0:9)=(/ 0,1,2,3,4,5,6,7,8,9 /), b(0:9)
         b = a
         DO i = 1, 9
            a(i) = b(i-1)
         END DO

      ¤È¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡£ÊÂÎó·×»»µ¡¤Ç¤Ê¤¤¾ì¹ç¤Ë¤Ï¡¤¤³¤ì¤ÈƱÅù¤Î½èÍý¤¬ÆâÉô
      ¤Ç¹Ô¤ï¤ì¤Æ¤¤¤ë¤ÈÍý²ò¤¹¤ì¤Ð¤è¤¤¤Ç¤¢¤í¤¦¡£

 
¡¡ÎãÂê 6_2¡¡¡Ö ÇÛÎó£ø¤È¡¤£ø¤ÎÍ×ÁǤòµÕ¤Ëʤ٤¿ÇÛÎó¤Î³ÆÍ×ÁÇ´Ö¤ÎÀѤò¡¤¿·¤¿
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¤Ë£ø¤ÎÍ×ÁǤȤ¹¤ë¡£¡×

[ex6_2.f90]
   ! --- Array Product ---
        REAL :: x(0:4)
        x = (/ ( 2.0**n, n = 0, 4)  /)
        x = x(0:4) * x(4:0:-1)
        PRINT *, x
   END

¡Ê½ÐÎÏ¡Ë
  16.00000      16.00000       16.00000      16.00000      16.00000


===============================================================================
¡¡¥Þ¥¹¥¯¼°¡¡a ¤¬¿ôÃÍ·¿ÇÛÎó¤Î¤È¤­¡¤ÇÛÎó¼°¡Öa¡ä0¡×¤Ï¡Öa¤ÎÍ×ÁǤ¬Àµ¤Î°ÌÃ֤ǤϿ¿¡¤
¤½¤¦¤Ç¤Ê¤¤°ÌÃ֤Ǥϵ¶¡×¤òÍ×ÁǤȤ·¤Æ»ý¤Ä¡¤ÇÛÎóa¤ÈƱ¤¸·Á¾õ¤Î¡ÖÏÀÍý¥Ç¡¼¥¿ÇÛÎó¡×
¤Ç¤¢¤ë¡£¤³¤Î¤è¤¦¤ÊÇÛÎó¤Î¤³¤È¤ò¡¤¤½¤Î»ÈÅÓ¤ò¹Íθ¤·¤Æ¥Þ¥¹¥¯¼°¤È¸Æ¤Ö¡£¢Í WHEREʸ
===============================================================================



6.2.6. ÇÛÎó¤ÎÆþ½ÐÎÏ

¡¡³ÆÇÛÎóÍ×ÁǤòÊÑ¿ô¤Î¾ì¹ç¤ÈƱ¤¸¤è¤¦¤Ë»ØÄꤹ¤ë°Ê³°¤Ë¡¤ÇÛÎóÁ´ÂΤ¢¤ë¤¤¤ÏÉôʬÇÛÎó¤ò
¤Þ¤È¤á¤Æ»ØÄꤹ¤ë¤³¤È¤â¤Ç¤­¤ë¡£

    Îã       INTEGER :: a(10)
¡¡¡¡¡¡¤Î¤È¤­
             PRINT '(10I5)', ( a(i), i=1, 10)        ¢« £±¹Ô¤Ë10¸Ä
             PRINT '(10I5)', a                       ¢« Ʊ¾å
             PRINT '(5I5)', a(1:5)                   ¢« £±¹Ô¤Ë£µ¸Ä
             PRINT '(10I5)', ( a(i), i= 10, 1, -1)   ¢«  µÕ½ç¤ËʤÖ

¡¡¡¡¡¡¤³¤ì¤ËÂФ·¤Æ

             DO i = 1, 10
            ¡¡   PRINT '(10I5)', a(i)
             END DO

¡¡¡¡¡¡¤Ç¤Ï¡¤£±¹Ô¤Ë°ì¤Ä¤º¤Ä½ñ¤«¤ì¡¤10¹Ô¤Ë¤ï¤¿¤ë¤³¤È¤Ë¤Ê¤ë¡£

             READ *, a
             READ*, (a(i), i=1,10)

¡¡¡¡¡¡¤Ç¤Ï¡¤ÆþÎϤϣ±¹Ô¤Ë10¸Äʤ٤ƽñ¤¤¤Æ¤â¤è¤¤¤·¡¤£±¹Ô¤Ë£±¸Ä¤º¤Ä¤Ç¤â¤è¤¤¤¬¡¤

             DO i = 1, 10
      ¡¡¡¡       READ*, a(i)
             ENDDO

¡¡¡¡¡¡¤Ç¤Ï¡¤£±¹Ô¤Ë°ì¤Ä¤º¤Ä¤·¤«ÆþÎϤǤ­¤º¡¤£²¤Ä°Ê¾åÆþÎϤ·¤Æ¤â̵»ë¤µ¤ì¤ë¡£

 
¡¡ÎãÂê 6_3¡Ö¼¡¤Î¤è¤¦¤Ê¥Ñ¥¹¥«¥ë¤Î»°³Ñ·Á¡Ê£²¹à·¸¿ô¤òÀѤ߽Ťͤ¿¤â¤Î¡Ë¤òÉÁ¤±¡£¡×

¡Ê½ÐÎÏ¡Ë
 1:    1
 2:    1    1
 3:    1    2    1
 4:    1    3    3    1
 5:    1    4    6    4    1
 6:    1    5   10   10    5    1
 7:    1    6   15   20   15    6    1
 8:    1    7   21   35   35   21    7    1
 9:    1    8   28   56   70   56   28    8    1
10:    1    9   36   84  126  126   84   36    9    1
11:    1   10   45  120  210  252  210  120   45   10    1
12:    1   11   55  165  330  462  462  330  165   55   11    1

              ¡ÊÃí¡¡¥Ô¥é¥ß¥Ã¥É·Á¤Ë½ÐÎϤ¹¤ë¤Ë¤Ï¡¤¤â¤¦¾¯¤·½ñ¼°¤Ë¹©Éפ¬¤¤¤ë¡£¡Ë

[ex6_3.f90]
   ! --- Pascal's Triangle ---
   PROGRAM Ex6_3_Pascal_Triangle
      INTEGER, PARAMETER :: max = 12
      INTEGER :: i, c(0:max) = 0
      c(1) = 1
      DO i = 1, max
          c(1:i) = c(1:i) + c(0:i-1)          ! ¢¨
          PRINT '(i2, ":", 50I5)', i, c(1:i)
      END DO
   END PROGRAM Ex6_3_Pascal_Triangle

¡¡Ìä¡¡¢¨¤ÎÉôʬ¤òÉáÄ̤ÎDO¥ë¡¼¥×¤Ç½ñ¤¯¤Ë¤Ï¤É¤¦¤·¤¿¤é¤è¤¤¤«¡©


¡¡ÎãÂê 6_4 ¡Ö¾å¸Â lim¡Ê < 10000¡Ë¤òÆþÎϤ·¡¤¥¨¥é¥È¥¹¥Æ¥Í¥¹¤Î¤Õ¤ë¤¤Ë¡¤Ë¤è¤ê¡¤
¡¡¡¡¡¡¡¡¡¡¡¡¡¡lim°Ê²¼¤ÎÁÇ¿ôɽ¤òµá¤á¤è¡££±¹Ô¤Ë£±£°¸Ä¤º¤Äʤ٤뤳¤È¡£¡×

¡Î¡Ê¥¨¥é¥È¥¹¥Æ¥Í¥¹¤Î¤Õ¤ë¤¤Ë¡¡Ë£²¤ÎÇÜ¿ô¤Ë°õ¤ò¤Ä¤±¤ë¡¤£³¤ÎÇÜ¿ô¤Ë°õ¤ò¤Ä¤±¤ë¡¤£´¤Ï
¡¡´û¤Ë°õ¤¬¤Ä¤¤¤Æ¤¤¤ë¤Î¤Ç¥¹¥­¥Ã¥×¡¤£µ¤ÎÇÜ¿ô¤Ë°õ¤ò¤Ä¤±¤ë¡¤ ...¤ò·«¤êÊÖ¤·¤Æ»Ä¤Ã¤¿
¡¡¤â¤Î¤¬ÁÇ¿ô¤È¤Ê¤ë¡£¡Ï


[ex6_4.f90]
   ! --- Eratosthenes Sieve ---
   PROGRAM Ex6_4
      INTEGER :: index(10000), prime(10000), lim = 0, n, m = 0
      DO WHILE( lim <= 1  .OR.  lim > 10000  )        ! 1 <= lim <= 10000
            PRINT '(A, $)', 'Upper limit(<10000): '   ! ¤È¤Ê¤ë¤Þ¤ÇÂԤġ£
            READ*, lim
      END DO
      index = 1
      DO n = 2, INT( lim**0.5 )             ! Ãí£±
           IF( index(n) == 0 ) CYCLE        ! IF(...)THEN ¤Ç½ñ¤¤¤Æ¤â¤è¤¤
           index( n**2 : lim : n ) = 0      ! n ¤ÎÇÜ¿ô¤ò¾Ã¤¹¡§Ãí£²
      END DO
      DO n = 2, lim
           IF( index(n) == 1 ) THEN      ¡¡ ! IF(...)CYCLE ¤Ç½ñ¤¤¤Æ¤â¤è¤¤
               m = m+ 1
               prime(m) = n
           END IF
      END DO
      PRINT '(I5, A)', m, "¸Ä¸«¤Ä¤«¤ê¤Þ¤·¤¿¡£"
      PRINT '(10I5)', prime(1:m)
  END PROGRAM Ex6_4


Ãí£±¡ËÀ°¿ô£í¤ÎÌó¿ô¤Ï¡¤¢å£í¤Þ¤ÇÄ´¤Ù¤ì¤Ð¤è¤¤¡£¤½¤ì¤è¤êÂ礭¤¤Ìó¿ô¤Ï¡¤´û¤Ë¾Ã¤µ¤ì¤Æ
¡¡¡¡¡¡¤¤¤ë¤Ï¤º¤Ç¤¢¤ë¡£
Ãí£²¡ËÀ°¿ô£î¤ÎÇÜ¿ô¤Î¤¦¤Á¡¤£î**2 ¤è¤ê¾®¤µ¤¤¤â¤Î¤Ï¡¤£î¤è¤ê¾®¤µ¤¤À°¿ô¤ÎÇÜ¿ô¤È¤·¤Æ
¡¡¡¡¡¡´û¤Ë¾Ã¤µ¤ì¤Æ¤¤¤ë¡£


6.3. ÇÛÎó¤ÎưŪ³äÉÕ¤±     [90] 

¡¡¤³¤³¤Þ¤Ç¤ÎÎã¤Ç¤Ï¡¤ÇÛÎó¤ÎÂ礭¤µ¤Ïͽ¤áÄê¤Þ¤Ã¤Æ¤¤¤ë¤«¡¤¤½¤¦¤Ç¤Ê¤¤¾ì¹ç¤Ë¤Ï½½Ê¬
Â礭¤¯¤È¤Ã¤Æ¤ª¤¯¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤¿¡£¸å¼Ô¤Ç¤Ï¡¤¼ÂºÝ¤Ë¤Ï»È¤ï¤ì¤Ê¤¤Ê¬¤Þ¤Ç¥á¥â¥ê¤ò
ÀêÍ­¤¹¤ë¤³¤È¤Ë¤Ê¤ê¡¤ÌµÂ̤Ǥ¢¤ë¡£µÕ¤ËͽÄê¤è¤êÂ礭¤¯¤Ê¤ë¤³¤È¤¬¤¢¤ë¤È´í¸±¤òȼ¤¦¡£
¤³¤ì¤ò²óÈò¤¹¤ë¤¿¤á¤Ë¡¤[90]¤Ç¤ÏưŪ³äÉÕ¤±¤ÎÊýË¡¤¬²Ã¤¨¤é¤ì¤¿¡£


¡¡Æ°Åª³äÉÕ¤±¡§¡¡ÇÛÎó¤ËALLOCATABLE°À­¤òÀë¸À¤·¤Æ¤ª¤­¡¤¤¢¤È¤Ç¼Â¹Ô»þ¤ËÊÑ¿ô¤òÍѤ¤¤Æ
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ALLOCATEʸ ¤ÇÂ礭¤µ¤ò·è¤á¤ë¡£ÉÔÍפˤʤä¿ÇÛÎó¤Ï DEALLOCATEʸ¤Ë
                ¤è¤ê³äÉÕ¤±¤ò²ò½ü¤·¤Æ¡¤¥á¥â¥ê¤òÀáÌ󤹤롣


      Îã    INTEGER, DIMENSION(:), ALLOCATABLE ::  freq
                ..........
            READ*, limit
            ALLOCATE( freq(1:limit) )
                ..........
            DEALLOCATE( freq )                 ¢« ÉÔÍפˤʤì¤Ð²ò½ü¤·¤Æ¤ª¤¯¡£

      Îã    REAL, ALLOCATABLE ::  x(:), y(:)   ¢« ÇÛÎó¤Ç¤¢¤ë¤³¤È¤ò¼¨¤¹¤¿¤á
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ (:) ¤¬¤¤¤ë¡£


¡¡ÎãÂê 6_5¡ÖNapier¿ô¡Ê¼«Á³Âпô¤ÎÄì¡Ë£å¤ÎÃͤò¡¤°Ê²¼¤Î¸ø¼°¤òÍѤ¤¤ÆÇ¤°Õ·å¤Þ¤Ç
¡¡¡¡¡¡¡¡¡¡¡¡¡¡µá¤á¤è¡§

¡¡¡¡¡¡¡¡¡¡¡¡¡¡£å = 1 + 1/1! + 1/2! + 1/3! + 1/4! + ... 

¡¡¡¡¡¡¡¡¡¡¡¡¡¡µá¤á¤¿¤¤·å¿ô¤òK¤È¤·¤Æ¡¤M > K*log(10.0) ¤È¤Ê¤ëÀ°¿ô M ¤Þ¤Ç·×»»
              ¤¹¤ì¤Ð½½Ê¬¤Ç¤¢¤ê¡¤

                       1     1     1             1        1
              £å = £±+ -(1 + -(1 + -(1 + .....+ --- ( 1 + - )))...)))
                       1     2     3            M-1       M 

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¤È½ñ¤¯¤³¤È¤¬¤Ç¤­¤ë¡£¡×                     0.0043...
                                                    230 )1.00432900...
Î㤨¤Ðk=100·å¤Î·×»»¤¬¤·¤¿¤¤¤È¤­¤Ë¤Ï¡¤M=231¤È¤Ê¤ë¡£         920
ºÇ½é¤Ï1/231¡¤¤³¤ì¤Ë1¤ò­¤·¤Æ1.00432900.../230¡¤         ------------
¤È·«¤êÊÖ¤·¤Æ¤¤¤¯¡£¤ï¤ê»»¤ÏÉ®»»¤Ç¤ä¤ë¤È¤ª¤ê¤Î¤³¤È¤ò          843
¥×¥í¥°¥é¥à¤Ë½ñ¤±¤Ð¤è¤¤¡£¾®¿ôÅÀ°Ê²¼³Æ°Ì¤Î¿ô»ú¤òÀ°¿ô          690
ÇÛÎó¤ÇÍѰդ¹¤ë¡£¾å¤Î°Ì¤Î¤ï¤ê»»¤Ç·«¤ê±Û¤µ¤ì¤¿Í¾¤ê¤ò         ------------
10Çܤ·¤Æ¸½ºß¤Î°Ì¤Î¿ô¤Ë²Ã¤¨¤¿¤â¤Î¤ò³ä¤ê¡¤¤½¤Î¾¦¤ò            1532
¤½¤Î°Ì¤ËÌᤷ¤Æ¤ª¤¯¡¥¡¥¡¥¡¥¡¥


[ex6_5.f90]
! --- Napier Number ---
   INTEGER :: k, max, m, n, r, j
   INTEGER, ALLOCATABLE ::  keta(:)
! --- Input the digits ---
   PRINT*,"How many digits do you want to calculate?"
   READ*, k
   ALLOCATE( keta(k) );  keta = 0
! --- Finding upper limit for M ---
   max = k*log(10.0)
! --- Main Loop ---
   DO m = max, 2, -1
      r = 1                           ! 1.0043...¡¡¤ÎÀ°¿ôÉô¤Î1
      DO n = 1, k
         j = 10*r + keta(n)
         keta(n) = j/m
         r = j - m * keta(n)          ! ;¤ê¤ò·«¤ê±Û¤·¤Æ¤¤¤¯
      END DO
   END DO
   PRINT "(//' e = 2.', 10(1X, 5I1)/(7X, 10(1X, 5I1)))", keta
END

¡Ê½ÐÎÏ¡Ë
 How many digits do you want to calculate?
 100
 e = 2. 71828 18284 59045 23536 02874 71352 66249 77572 47093 69995
        95749 66967 62772 40766 30353 54759 45713 82178 52516 64274


6.4. ¿¼¡¸µÇÛÎó
 
6.4.1. Àë¸À

¡¡Åº¤¨»ú¤ÏÊ£¿ô¤¢¤Ã¤Æ¤â¤è¤¤¡£³Æ¼¡¸µ¤Î¾å²¼¸Â¤òʤ٤ÆÀë¸À¤¹¤ë¡§


          ·¿¡¤DIMENSION(²¼¸Â¡§¾å¸Â¡¤²¼¸Â¡§¾å¸Â¡¤...¡Ë:: ÇÛÎó̾¤Î¥ê¥¹¥È
          ·¿ :: ÇÛÎó̾(²¼¸Â¡§¾å¸Â¡¤²¼¸Â¡§¾å¸Â¡¤...¡Ë
          ·¿  ÇÛÎó̾(²¼¸Â¡§¾å¸Â¡¤²¼¸Â¡§¾å¸Â¡¤...¡Ë¡¤...


¡¡¡¡Îã¡¡8¡ß8¤Î£²¼¡¸µÇÛÎóa¤ò½Ä²££²Åùʬ¤·¤Æ£´¤Ä¤Ëʬ³ä¤·¡¤º¸¾å¡¤±¦¾å¡¤º¸²¼¡¤
¡¡¡¡¡¡¡¡±¦²¼¤Î½ç¤ËÀѤ߽Ťͤ¿£´¡ß£´¡ß£´¤Î£³¼¡¸µÇÛÎób¤òºî¤ë¡§

¡¡¡¡¡¡¡¡¡¡¡¡b(:,:,1) = a(1:4,1:4)¡¡¡¡¡¡¡¡¡¡¡¡
            b(:,:,2) = a(1:4,5:8)¡¡¡¡¡¡¡¡¡¡¡¡­¡¡¡¡Ã¡¡­¢
            b(:,:,3) = a(5:8,1:4)          ¡Ý¡Ý¡Ý¡Ã¡Ý¡Ý¡Ý
            b(:,:,4) = a(5:8,5:8)          ¡¡­£¡¡¡Ã¡¡­¤

¡¡ÇÛÎó¤Î¼¡¸µ¿ô¡Êrank¡Ë¤ÈÀ£Ë¡¡Êextent ³Æ¼¡¸µ¤ÎÂ礭¤µ¡Ë¤ò¤¢¤ï¤»¤Æ ·Á¾õ (shape)¤È
¤¤¤¤¡¤ÇÛÎóa¤Îshape¤ÏÁȹþ¤ß´Ø¿ô SHAPE(a) ¤ÇÆÀ¤ë¤³¤È¤¬¤Ç¤­¤ë¡£

¡¡¡¡Îã¡¡REAL :: a(-1:3,-4:4) ¤Î¤È¤­ SHAPE(a) ¤Ï¡¤³Æ¼¡¸µ¤ÎÀ£Ë¡¤òÍ×ÁǤȤ¹¤ë
¡¡¡¡¡¡¡¡£±¼¡¸µÇÛÎó (/ 5, 9 /)¤òÍ¿¤¨¤ë¡£
 

6.4.2. ¿¼¡¸µÇÛÎóÍ×ÁǤΰúÍÑ

¡¡£±¼¡¸µÇÛÎó¤ÈƱÍͤ˳Ƽ¡¸µ¤Î°ÌÃÖ¤òÀ°¿ôÊÑ¿ô¤Þ¤¿¤ÏÄê¿ô¤Ç»ØÄꤷ¤Æ°úÍѤ¹¤ë¤¬¡¤¼¡¸µ
¤Î¤¦¤Á¤Î°ìÉô¤À¤±¤ò°ÌÃÖ»ØÄꤷ¤Æ¡¤¤è¤êÄ㼡¸µ¤ÎÇÛÎó¤È¤·¤Æ°úÍѤ¹¤ë¤³¤È¤â²Äǽ¤Ç¤¢¤ë¡£

¡¡¡¡Îã¡¡INTEGER :: a(1:3, 1:3), x(1:3), y(1:3), z(1:3)        
        x = a(1,:); y=a(2,:); z=a(3,:)¡¡¡¡¡¡¢«¤³¤Î : ¤Ï 1:3 ¤ò°ÕÌ£¤¹¤ë


6.4.3. ¿¼¡¸µÇÛÎóÍ×ÁÇ¤Î½ç½ø 

¡¡Î㤨¤Ð£³¡ß£³¤ÎÇÛÎó a(1:3,1:3) ¤Î¾ì¹ç

¡¡|a(1,1)|a(2,1)|a(3,1)|a(1,2)|a(2,2)|a(3,2)|a(1,3)|a(2,3)|a(3,3)|

¤Ç¤¢¤ë¡£½é´üÃÍÀßÄê¤ä°ì³çÂåÆþ¡¤°ì³çÆþ½ÐÎϤΤȤ­¤Ë¤ÏÃí°Õ¤¬É¬ÍפǤ¢¤ë¡£

¡¡¡¡Îã      INTEGER A(3,3)/1,2,3,4,5,6,7,8,9/             1    4    7
¡¡¡¡¡¡¡¡¤Ï¡¤¹ÔÎó·Á¼°¤Ç¤Ï£Á¤Î¤è¤¦¤Ë¤Ê¤ë¡£           A =    2    5    8
                                                          3    6    9


6.4.4. ¿¼¡¸µÇÛÎó¤ÎÄê¿ôÂåÆþʸ

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡   a = (/ ( i, i=1, 9) /)

¤Î·Á¤ÎÂåÆþʸ¤Ï¿¼¡¸µ¤Ç¤Ïµö¤µ¤ì¤Æ¤¤¤Ê¤¤¡££±¼¡¸µÇÛÎó¤ò¿¼¡¸µ¤ËÇÛÃÖ¤·¤Ê¤ª¤¹Áȹþ¤ß
´Ø¿ô RESHAPE ¤ò»È¤¦¡Ê¢ª6-5¡Ë¡§


            a = RESHAPE( (/ (i, i=1,9) /), SHAPE(a) )


¤Þ¤¿¤ÏFortran95¤Ç¿·Àߤµ¤ì¤¿FORALLʸ¤ò»È¤¦¡£

¤·¤«¤·¤Ê¤¬¤é¡¤£Â¤Î¤è¤¦¤Ë¹ÔÎó¤òÄêµÁ¤·¤¿¤¤¤È¤­¤Ë¤Ï¡¤ÌÀ³Î¤Ë¹Ô¤´¤È¤Ë
            B(1,1:3) = (/ 1, 2, 3 /)                     1    2    3 
            B(2,1:3) = (/ 4, 5, 6 /)              B =    4    5    6
            B(3,1:3) = (/ 7, 8, 9 /)                     7    8    9
¤È½ñ¤¯Êý¤¬°ÂÁ´¤Ç¤¢¤ë¡£
¡¡Æþ½ÐÎϤ⡤µ¬Äê¤Î½ç½ø¤Ë½¾¤ï¤Ê¤¤¤È¤­¤Ë¤Ï°Ê²¼¤Î¤è¤¦¤Ë¡¤DO¥ë¡¼¥×¤Þ¤¿¤ÏDO·¿¥ê¥¹¥È
¤Ë¤¹¤ë¡£


¡¡ÎãÂê 6_6¡Öm¡ßn¡¤n¡ßk ¤ÎÆó¤Ä¤Î¹ÔÎó¤ÎÀѹÔÎó¤òµá¤á¤è¡£¡×
          ¡Ê¤³¤Î·×»»¤ÏÁȹþ¤ß´Ø¿ô MUTMUL ¤Ç·×»»¤Ç¤­¤ë¢ª6-5 ÇÛÎó´Ø¿ô¡Ë

[ex6_6.f90]
   ! --- Matrix Product ---
      INTEGER, DIMENSION(:,:), ALLOCATABLE :: a, b, c
      INTEGER :: m=0, n=0, k=0, i, j, h
   !
      DO WHILE( m <= 0 .OR. n <= 0 .OR. k <= 0 )
         PRINT*, "Input Array Size m, n, k ( > 0) :"
         READ*, m, n, k
      END DO
      ALLOCATE( a(m,n), b(n,k), c(m,k) )
   !
      PRINT*, "Input Elements of A in a Matrix Form:"
         READ*, ( ( a(i,j), j=1, n), i=1, m ) 
      PRINT*, "Input Elements of B in a Matrix Form:"
         READ*, ( ( b(i,j), j=1, k), i=1, n)
   !
      DO i = 1, m
         DO j = 1, k
               c(i,j) = 0
            DO h = 1, n
               c(i,j) = c(i,j) + a(i,h) * b(h,j)
            END DO
         END DO
      END DO
      DO i = 1, m
         PRINT "(10I5)", ( c( i, j), j = 1, k )
      END DO
   END

¡¡Ãí¡Ë£²¹ÔÌܤΠDIMENSION(:,:) ¤Ï¡¤£²¼¡¸µÇÛÎó¤òÀë¸À¤·¤Æ¤¤¤ë¤³¤È¤ËÃí°Õ¡£
¡¡Ãí¡Ëa,b,c¤ÎÆþ½ÐÎϥꥹ¥È¤Ï¤½¤ì¤¾¤ì¼¡¤Î¤è¤¦¤Ë½ñ¤¤¤Æ¤â¤è¤¤¡§
            ( a(i, 1:n), i=1, m)¡¡¤Þ¤¿¤Ï ( a(i,:), i=1, m)
            ( b(i, 1:k), i=1, n)  ¤Þ¤¿¤Ï ( b(i,:), i=1, n)
              c(i, 1:k)           ¤Þ¤¿¤Ï c(i,:)


6.4.5. WHEREʸ

¡¡¡Êñ½ã WHEREʸ¡Ë

¡¡¡¡¤¢¤ë¾ò·ï¤¬À®Î©¤¹¤ëÇÛÎóÍ×ÁǤÀ¤±¤òÁª¤ó¤Ç¡¤ÆâÍÆ¤ËÊѹ¹¤ò²Ã¤¨¤ë¤³¤È¤¬¤Ç¤­¤ë¡£


¡¡¡¡¡¡WHERE¡ÊÇÛÎó¥Þ¥¹¥¯¼°¡Ë¡¡ÇÛÎó̾¡¡¡á¡¡¼°¡¡¡¡¡¡     ¡¡¢Í ¥Þ¥¹¥¯¼°


¡¡¡¡Îã¡¡¤¢¤ë²ÊÌܤÎÀ®ÀӤΰ켡¸µÀ°¿ôÇÛÎóa¤ò¡Ö40ÅÀ°Ê²¼¤Ï¤½¤Î¤Þ¤Þ¡¤40ÅÀ°Ê¾å¤Ï¡¤
        40ÅÀ¤¬60ÅÀ¡¤100ÅÀ¤¬100ÅÀ¤È¤Ê¤ë°ì¼¡¼°¤ÇÊÑ´¹¡×¤·¤Æ½¤Àµ¤¹¤ë¥²¥¿Çî»Î¡§

           WHERE( a >= 40 )  a = NINT( 2.0*(a+50)/3.0 )  ¡ÊÃí¡§»Í¼Î¸ÞÆþ¡Ë


¡¡¡Ê¥Ö¥í¥Ã¥¯WHERE¹½Ê¸¡Ë

¡¡¡¡¥Ö¥í¥Ã¥¯IF¹½Ê¸¤ÈƱÍͤι½Ê¸¤ò¹½À®¤Ç¤­¤ë¡£

¡¡¡¡Îã
      WHERE¡ÊÇÛÎó¥Þ¥¹¥¯¼°¡Ë¡¡¡¡¡¡¡¡¢« THEN¡¡¤ÏÉÔÍ×
           ÇÛÎó̾¡¡¡á¡¡¼°
      ELSEWHERE¡ÊÇÛÎó¥Þ¥¹¥¯¼°¡Ë¡¡¡¡¢« ELSE WHERE ¤È¤Ï½ñ¤±¤Ê¤¤
           ÇÛÎó̾¡¡¡á¡¡¼°
      ELSEWHERE
           ÇÛÎó̾¡¡¡á¡¡¼°
      END WHERE

¡¡¼Â¹Ôʸ¤È¤·¤Æ½ñ¤¯¤³¤È¤¬¤Ç¤­¤ë¤Î¤ÏÏÀÍý¼°¤Ë½ñ¤«¤ì¤¿ÇÛÎó¡Ê¤Þ¤¿¤Ï¤½¤ì¤ÈƱ¤¸·Á¾õ¤Î
ÇÛÎó¡Ë¤ËÂФ¹¤ëÂåÆþʸ¤À¤±¤Ç¤¢¤ê¡¤Î㤨¤Ð¡ÖÇÛÎóÍ×ÁǤ¬£°¤Ç¤Ê¤¤¤â¤Î¤À¤±PRINT¤¹¤ë¡×
¤è¤¦¤ÊÌÜŪ¤Ë¤Ï»ÈÍѤǤ­¤Ê¤¤¡£¤Ê¤ª¡¤IFʸ¤Ç¤Ï¾åµ­¤ÎÏÀÍýÇÛÎ󼰤ηÁ¤Ï»È¤¨¤Ê¤¤¡£


¡¡ÎãÂê 6_7¡Ö m¡ßn ¤Î¼Â¿ô¹ÔÎó¤Ç¡¤Í×ÁǤÎÃͤ¬Éé¤Î¤È¤­¤Ï0.0¤ËÃÖ¤­´¹¤¨¤¿
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¹ÔÎó¤ò½ÐÎϤ¹¤ë¡£¡×

[ex6_7.f90]
   ! --- Trancation ---
      INTEGER :: m = 0, n = 0
      REAL, ALLOCATABLE:: a( : , : )
      DO WHILE( m <= 0 .OR. n <=0 )
         PRINT*, "Input Array Size m, n ( > 0) :"
         READ*, m, n
      END DO
      ALLOCATE( a(1:m, 1:n) )
      PRINT*, "Input Elements of A:"
      READ*, ( a(i, 1:n), i = 1, m )
   !
      WHERE( a < 0) a = 0.0
      DO i = 1, m
         PRINT "(10F8.5)", a(i, 1:n)
      END DO
   END



6.5. ÇÛÎó´Ø¿ô

¡¡[90]¤ÏÊÂÎó·×»»µ¡ÍøÍÑ¤Î¥×¥í¥°¥é¥ß¥ó¥°¤ò°Õ¼±¤·¤Æ²þÁ±¤µ¤ì¤¿¤â¤Î¤Ç¤¢¤Ã¤Æ¡¤ÇÛÎó
Í×ÁǤÎÊÂÎó±é»»°Ê³°¤Ë¿¤¯¤ÎÇÛÎó´Ø¿ô¤¬ÍѰդµ¤ì¤Æ¤¤¤ë¡£³Æµ¡Ç½¤Ë¤Ä¤¤¤Æ¤Ï»ÈÍѤ·¤Æ
³Î¤«¤á¤Æ¤ß¤è¡£

¡ÊÃí¡Ë¡¡[¡¡]¤Ç°Ï¤Þ¤ì¤¿¾Êά²Äǽ¤Ê°ú¿ô¤¬¤¢¤ë¾ì¹ç¡¤ÅÓÃæ¤Î°ú¿ô¤ò¾Êά¤¹¤ë¤È¤­
¡¡¡¡¡¡¤Ë¤Ï¡¤¤½¤ì¤è¤ê¤¢¤È¤Ë½Ð¤Æ¤¯¤ë°ú¿ô¤ÏÂçʸ»ú¤Ç½ñ¤«¤ì¤¿°ú¿ô̾¤ò»ØÄꤷ¤Æ
¡¡¡¡¡Ö°ú¿ô̾¡á°ú¿ô¡×¤Î·Á¤Ç½ñ¤«¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤(¢ª8.5.¡Ë¡£Îã¡¡SUM(a, MASK=m)

DOT_PRODUCT(u,v)      Ʊ¤¸Â礭¤µ¤Î£±¼¡¸µÇÛÎóu,v¡Ê¥Ù¥¯¥È¥ë¡Ë¤Î¥¹¥«¥é¡¼ÀÑ
MATMUL(a,b)        ¡¡ £²¤Ä¤Î¹ÔÎó¤ÎÀÑ¡ÊÍ×ÁǤÎÀѤǤϤʤ¯¡¤¹ÔÎó¤ÎÀѱ黻¡Ë
PRODUCT(a[,DIM,MASK]) ÇÛÎóa¤Î¡ÊÏÀÍý·¿ÇÛÎóMASK¤ÎÍ×ÁǤ¬¿¿¤Î°ÌÃ֤Ρˤ¹¤Ù¤Æ¤ÎÍ×ÁÇ
                      ¤ÎÀÑ
SUM(a[,DIM,MASK]      Ʊ¤¸¤¯ÏÂ
ALL(m[,DIM])          ÏÀÍý·¿ÇÛÎóm¤Î¡ÊDIM¼¡¸µÊý¸þ¤Î¡ËÍ×ÁǤ¬Á´¤Æ¿¿¤Î¤È¤­¿¿¡¤¤½¤ì
                      °Ê³°¤Ïµ¶¤È¤Ê¤ë¤è¤¦¤ÊÏÀÍý·¿ÇÛÎó¡Êm¤¬£±¼¡¸µ¤¢¤ë¤¤¤ÏDIM»ØÄê
                      ¤¬¤Ê¤¤¤È¤­¤Ï¥¹¥«¥éÃÍ¡Ë
                      Îã¡¡m =|T F F| ¤Î¤È¤­¡¤ ALL(m,1) ¤Ï |T F F|
                             |T T T|          ALL(m,2) ¤Ï |F T|
ANY(m[,DIM])          Ʊ¾å¤ÎÍ×ÁǤΰì¤Ä¤Ç¤â¿¿¤Î¤È¤­¿¿¡¤Á´¤Æµ¶¤Î¤È¤­µ¶
COUNT(m[,DIM])        Ʊ¾å¤ÎÍ×ÁǤΤ¦¤Á¿¿¤ÎÍ×ÁǤοô
MAXVAL(a[,DIM,MASK])  ÇÛÎóa¤Î¡ÊDIM¼¡¸µÊý¸þ¤Ë¡Ë(ÏÀÍý·¿ÇÛÎóMASK¤ÎÍ×ÁǤ¬¿¿¤Î°ÌÃÖ
                      ¤Î¡ËÍ×ÁǤκÇÂçÃͤòÍ×ÁǤȤ¹¤ëÇÛÎó¡Êa¤¬£±¼¡¸µ¤Ê¤é¥¹¥«¥é¡Ë
MINVAL(a[,DIM,MASK])¡¡Æ±¤¸¤¯ºÇ¾®ÃͤòÍ×ÁǤȤ¹¤ëÇÛÎó
MAXLOC(a[,MASK])      ÇÛÎóa¤Î¡ÊÏÀÍý·¿ÇÛÎóm¤ÎÍ×ÁǤ¬¿¿¤Î°ÌÃ֤ΡËÍ×ÁǤκÇÂçÃͤÎ
                      °ÌÃÖ¤òɽ¤¹³Æ¼¡¸µ¤Îź»ú¤Î¥Ù¥¯¥È¥ëÇÛÎó¤¬ÊÖ¤µ¤ì¤ë
MINLOC(a[,MASK])      Ʊ¤¸¤¯ºÇ¾®ÃͤΰÌÃÖ
ALLOCATED(a)¡¡¡¡¡¡¡¡¡¡ALLOCATABLEÇÛÎ󤬸½ºß¡¤¼ÂºÝ¤ËALLOCATE¤µ¤ì¤Æ¤ª¤ì¤Ð¿¿¡¤¤µ
                      ¤ì¤Æ¤¤¤Ê¤±¤ì¤Ðµ¶
LBOUND(a[,DIM])       ÇÛÎóa¤Î¡ÊDIM¼¡¸µ¤Î¡Ëź»ú¤Î²¼¸ÂÃÍ           
UBOUND(a[,DIM])       Ʊ¤¸¤¯¾å¸ÂÃÍ
SHAPE(a)              ÇÛÎóa¤ÎÀ£Ë¡¡Ê¿¼¡¸µ¤Î¾ì¹ç¡¤³Æ¼¡¸µ¤ÎÀ£Ë¡¡Ë¤òÍ×ÁǤȤ¹¤ëÇÛÎó
SIZE(a[,DIM])         ÇÛÎóa¤ÎÁ´ÂΤÎÍ×ÁÇ¿ô¡Ê¤Þ¤¿¤ÏDIM¼¡¸µ¤ÎÀ£Ë¡¡Ë
MERGE(t,f,m)          £²¤Ä¤ÎÇÛÎót,f¤«¤é¡¤ÏÀÍý·¿ÇÛÎóm¤ÎÍ×ÁǤÎÃÍT,F¤Ë±þ¤¸¤ÆÍ×ÁǤò
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡    ÁªÂò¤·¡Ê.TRUE.¤Ê¤ét¤«¤é¡¤.FALSE.¤Ê¤éf¤«¤é¡ËÇÛÎó¤òºî¤ë
PACK(a,m)             ÏÀÍý·¿ÇÛÎóm¤Ë¤·¤¿¤¬¤¤ÇÛÎóa¤ÎÍ×ÁǤò½¸¤á¤Æ£±¼¡¸µÇÛÎó¤òºî¤ë
UNPACK(v,m,f)         ÏÀÍý·¿ÇÛÎóm¤Ë¤·¤¿¤¬¤¤£±¼¡¸µÇÛÎóv¤ÎÍ×ÁǤò½çÈÖ¤ËÇÛÃÖ¤·¡¤µ¶
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡    ¤Î°ÌÃ֤ˤÏÂбþ¤¹¤ëf¤ÎÍ×ÁǤòÇÛÃÖ¤¹¤ë¡£
SPREAD(a,d,n)         ÇÛÎóa¤ò¡¤d¼¡¸µÊý¸þ¤Ën²ó¥³¥Ô¡¼¤·¤Æ¡¤£±¼¡¸µ¹â¤¤ÇÛÎó¤òºî¤ë
RESHAPE(a,s)¡¡¡¡¡¡    ÇÛÎóa¤ÎÍ×ÁǤòs¤ÇÄêµÁ¤µ¤ì¤ëSHAPE¤Ë¤·¤¿¤¬¤Ã¤ÆÁȤßÂØ¤¨¤ë
CSHIFT(a,s[,DIM])¡¡   £±¼¡¸µÇÛÎó¡Ê¤Þ¤¿¤Ï¿¼¡¸µÇÛÎó¤ÎDIM¼¡¸µ¤Ë±è¤Ã¤Æ¡Ë¤ò½Û´ÄŪ¤Ë
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡    ¡Êꤍ»ú¤òs¤À¤±¡Ë¥·¥Õ¥È¤¹¤ë
EOSHIFT(a,s[,DIM])    ¤Ï¤ß½Ð¤·¤¿Ê¬¤ÏÀÚ¤ê¼Î¤Æ¤Æ¥·¥Õ¥È¤¹¤ë
TRANSPOSE(a)¡¡¡¡¡¡    £²¼¡¸µ¹ÔÎó¤ÎžÃÖ¹ÔÎó

¡¡Ãí¡ËALL¤äCOUNT ¤Ï°ú¿ôÇÛÎó¤¬1¼¡¸µ¤Î¤È¤­¤Ë¤Ï¡¤°ú¿ô¤Î·¿¤ËÂбþ¤¹¤ë·¿¤Î¥¹¥«¥éÃͤò
¡¡¡¡¡¡£±¸ÄÊÖ¤¹¤Î¤ËÂФ·¡¤MAXLOC¡¤MINLOC¤Ï°ú¿ôÇÛÎ󤬣±¼¡¸µ¤Ç¤¢¤Ã¤Æ¤â¡ÖÍ×ÁÇ¿ô£±¤Î
¡¡¡¡¡¡ÇÛÎó¡×¤òÊÖ¤¹¡£º®Í𤷤Ƥ¤¤ë¤è¤¦¤Ë»×¤¨¤ë¤«¤â¤·¤ì¤Ê¤¤¤¬¡¤¸å¼Ô¤Î¾ì¹ç¤ËÊÖ¤µ¤ì
¡¡¡¡¡¡¤ë¤Î¤Ï¡¤Åº»ú¡¤¤¹¤Ê¤ï¤ÁºÂɸ¤Ç¤¢¤ê¡¤£±¼¡¸µ¤Ç¤¢¤Ã¤Æ¤â¥¹¥«¥éÎ̤ǤϤʤ¯¡Ö£±¼¡
¡¡¡¡¡¡¸µ¥Ù¥¯¥È¥ë¡×¤Ç¤¢¤ë¤ÈÍý²ò¤¹¤ì¤Ð¡¤Íý¶þ¤Ï¤Á¤ã¤ó¤ÈÄ̤äƤ¤¤ë¡£

¡¡´Ø¿ô»ÈÍÑÎã

¡¡¡¡¡¡¡¡¼Â¿ôÇÛÎóa¤ÎÉé¤Ç¤Ê¤¤Í×ÁǤοô¡¡¡§ COUNT( a >= 0 )
        ¼Â¿ôÇÛÎóa¤ÎÍ×ÁǤÎÊ¿¶ÑÃÍ¡¡¡¡¡¡¡§ SUM(a)/SIZE(a)
¡¡¡¡¡¡¡¡À°¿ôÇÛÎók¤Î£°¤Ç¤Ê¤¤Í×ÁǤò½ÐÎÏ¡§ PRINT*, PACK( k, k/=0 )


¡¡ÎãÂê 6_8¡¡¡Ö¥¨¥é¥È¥¹¥Æ¥Í¥¹¤Î¤Õ¤ë¤¤Ë¡¡Ê²þÎÉÈǡˡ×

[ex6_8.f90]
   ! --- Eratosthenes Sieve (with use of Array Functions) ---
      INTEGER, ALLOCATABLE :: index(:)
      INTEGER :: lim = 0, n
      DO WHILE( lim <= 1 ) 
            PRINT*, 'Upper limit?';  READ*, lim
      END DO
      ALLOCATE( index(lim) )
      index = (/ 0, (n, n= 2, lim) /)
      DO n = 2, INT( lim**0.5 )
           IF( index(n) == 0 ) CYCLE
           index( n**2 : lim : n ) = 0
      END DO
      PRINT '(I5, A)', COUNT(index/=0)," prime numbers are found."
      PRINT '(10I6)', PACK( index, index/=0 )
  END

¡¡Ãí¡ËưŪ³äÉÕ¤±¤òÍѤ¤¤Æ¤¢¤ë¤Î¤Ç lim ¤ÎÃͤξå¸Â¤ÏɬÍפʤ¤¤¬¡¤ºÇ¸å¤Î½ÐÎϤÎÊÔ½¸
µ­½Ò»Ò I6 ¤Ç£µ·å°Ê²¼¤ÎÀ°¿ô¤òÁÛÄꤷ¤Æ¤¤¤ë¡£¤³¤Î¿ôÃÍ£¶¤òÎ×µ¡±þÊѤËÊÑ¿ô¤Ç»ØÄꤹ¤ë
¤Ë¤Ï¡¤Ê¸»ú·¿ÇÛÎó¤òÍѤ¤¤Æ½ñ¼°¤ò¹½À®¤¹¤ë¤Ê¤É¤Î¹©Éפ¬¤¤¤ë¡§

     CHARACTER(LEN=7) :: fmt(1:10)
     fmt=(/ '(10I1 )','(10I2 )','(10I3 )','(10I4 )','(10I5)', & 
            '(10I6 )','(10I7 )','(10I8 )','(10I9 )','(10I10)' /)


¡¡ÎãÂê 6_9¡Ö20¿Í¤ÎÅêɼ¼Ô¤¬ÆÈΩ¤Ë¡¤Î¾Î٤Σ²¿Í¤Î°Õ¸«(0 or 1)¤ò¸«¤ÆÂ¿¿ô¤Ë½¾¤¦¡£
¡¡¡¡¡¡¡¡¡¡¡¡¡¡£²¿Í¤Î°Õ¸«¤¬Ê¬¤«¤ì¤Æ¤¤¤ë¤È¤­¤Ë¤Ï¼«Ê¬¤Î°Õ¸«¤òÊѤ¨¤Ê¤¤¡£¤³¤ì¤ò
¡¡¡¡¡¡¡¡¡¡¡¡¡¡£µ²ó·«¤êÊÖ¤¹¡£¤¿¤À¤·Ã¼¤Ï¼þ´üŪ¤È¤¹¤ë¡£¡×

[ex6_9.f90]
   ! --- Voter Rule---
      INTEGER :: voter(1:20), neighbors(1:20), i = 0
      PRINT*,"Input initial bits for 20 members:"
      READ*, voter(1:20)
         PRINT '(I3, ":", 20I2)', i, voter(1:20)
      DO i = 1, 5
         neighbors = CSHIFT( voter, 1) + CSHIFT( voter, -1)
         WHERE( neighbors /= 1 ) voter = neighbors/2
         PRINT '(I3, ":", 20I2)', i, voter(1:20)
      END DO
   END

¡Ê¼Â¹ÔÎã¡Ë
 Input initial bits for 20 members:
  0: 1 0 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 1 0
  1: 0 1 0 1 0 0 0 0 1 0 1 0 1 1 1 1 0 1 0 1
  2: 1 0 1 0 0 0 0 0 0 1 0 1 1 1 1 1 1 0 1 0
  3: 0 1 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 1
  4: 1 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0
  5: 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1

==============================================================================
¡Ê¥»¥ë¡¦¥ª¡¼¥È¥Þ¥È¥ó¡Ë¤³¤ÎÌäÂê¤ò¥Ó¥Ã¥ÈÎó {b(i)} ¤«¤é¼¡¤Î»þ¹ï¤Î {b(i)}¤Ø¤Î¼ÌÁü
¡¡¤È¤ß¤ì¤Ð¡¤¡Ö¥»¥ë¥ª¡¼¥È¥Þ¥È¥ó¥â¥Ç¥ë¡×¤È¸Æ¤Ð¤ì¤Æ¤¤¤ë¤â¤Î¤Î°ì¼ï¤Ç¡¤¸½ºß¤Î¼«Ê¬¤È
¡¡Î¾Î٤ξõÂ֡ʥӥåÈÃ͡ˤÎÁȤ߹ç¤ï¤»¤«¤é¡¤¼¡¤Î¼«Ê¬¤ÎÃͤ¬·èÄꤵ¤ì¤ë¡£¤³¤ì¤òü¤«
¡¡¤é½çÈ֤ˤǤϤʤ¯¡¤¤¤¤Ã¤»¤¤¤Ë¡¤¤¹¤Ê¤ï¤ÁÊÂÎóŪ¤Ë¹Ô¤¦¡£¡¡¤³¤ÎÌäÂê¤Î¾ì¹ç¡¤ÊÑ´¹¤Î
¡¡ÏÀÍýÃÍɽ¤Ï°Ê²¼¤Î¤è¤¦¤Ë¤Ê¤ë¡§

¡¡¡¡¸½ºß¤Î[º¸ÎÙ ¼«Ê¬ ±¦ÎÙ] ¢ª ¼¡¤Î[¼«Ê¬]
          [ 1    1    1 ] (= 7) ¢ª  1¡¡¡¡Î¾Î٤⻿À®¤À¤«¤é°Â¿´¤·¤ÆÊѤ¨¤Ê¤¤
          [ 1    1    0 ] (= 6) ¢ª  1¡¡¡¡Î¾ÎÙ¤¬³ä¤ì¤Æ¤¤¤ë¤«¤éÊѤ¨¤ºÆüϸ«
          [ 1    0    1 ] (= 5) ¢ª  1¡¡¡¡Î¾ÎÙ¤¬»¿À®¤À¤«¤é¨¡¤»¿À®¤Ë¤Þ¤ï¤ë
          [ 1    0    0 ] (= 4) ¢ª  0¡¡¡¡Î¾ÎÙ¤¬³ä¤ì¤Æ¤¤¤ë¤«¤éÊѤ¨¤ºÆüϸ«
          [ 0    1    1 ] (= 3) ¢ª  1¡¡¡¡¡¡¡¡¡¡¡¡¡¡Æ±¡¡¡¡¡¡¡¡¾å
          [ 0    1    0 ] (= 2) ¢ª  0¡¡¡¡Î¾ÎÙ¤¬È¿ÂФÀ¤«¤é¨¡¤È¿ÂФˤޤï¤ë
          [ 0    0    1 ] (= 1) ¢ª  0¡¡¡¡Î¾ÎÙ¤¬³ä¤ì¤Æ¤¤¤ë¤«¤éÊѤ¨¤ºÆüϸ«
          [ 0    0    0 ] (= 0) ¢ª  0¡¡¡¡Î¾ÎÙ¤âÈ¿ÂФÀ¤«¤é°Â¿´¤·¤ÆÊѤ¨¤Ê¤¤

     [b(i-1) b(i) b(i+1)] (= m) ¢ª b(i)= f(m)

¡¡ [b(i-1) b(i) b(i+1)] ¤ò£³·å¤Î£²¿Ê¿ô¤È¤ß¤Ê¤»¤Ð¡¤À°¿ô m ={7,6,5,4,3,2,1,0}¡¡
¡¡¤«¤é¼¡¤Î¼«Ê¬¤ÎÃÍ {0,1} ¤Ø¤Î¼ÌÁü¤È¤·¤ÆÄêµÁ¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡£

¡Ê̿̾ˡ¡Ë {f(m)} ¤ò£²¿Ê¿ô¤Î m=7,6,5,4,3,2,1,0 ·åÌܤˤ¢¤Æ¤Ï¤á¤ì¤Ð

¡¡¡¡¡¡¡Î 1 1 1 0 1 0 0 0 ¡Ï= 128 + 64 + 32 + 8 = 10¿Ê¿ô¤Î232

¡¡¡¡¤³¤ÎºÇ¸å¤Î¿ô»ú¤òÍ¿¤¨¤ë¤³¤È¤ÇÊÑ´¹µ¬Â§¤¬ÄêµÁ¤Ç¤­¤ë¤Î¤Ç¡¤¡Ö¥ë¡¼¥ë232¡×¤Î¤è¤¦¤Ë
¡¡Ì¾ÉÕ¤±¤ë¡£Î㤨¤Ð¡Ö¥ë¡¼¥ë184¡×¤Ê¤é 184 = 128+32+16+8 = [1 0 1 1 1 0 0 0] ¤À¤«¤é¡¤
¡¡¾å¤Îɽ¤Ç¡Ö¼¡¤Î¼«Ê¬¡×¤ÎÃͤϡ¤¾å¤«¤é 1 0 1 1 1 0 0 0 ¤È¤Ê¤ë¡£¤³¤ì¤Ï¡Ö¸òÄ̽ÂÂÚ
¡¡¥â¥Ç¥ë¡×¤È¸Æ¤Ð¤ì¤Æ¤¤¤ë¡£¥×¥í¥°¥é¥à¤È¤·¤Æ¤Ï¡¤Í¿¤¨¤é¤ì¤¿¥ë¡¼¥ëÈÖ¹æ¤ò£²¿Ê¿ô²½¤·¡¤
¡¡³Æ°Ì¤Î¿ô»ú¡Ê¥Ó¥Ã¥È¡Ë¤òÇÛÎó map(0:7) ¤Ë¤·¤Æ¼ÌÁü m¢ªf(m) ¤òÄêµÁ¤·¤Æ¤ª¤±¤Ð¤è¤¤¡§


[ex6_9_1.f90]
   ! --- Voter Rule as Rule-232 CA model ---
      INTEGER :: voter(1:20), i = 0, rule = 232, map(0:7), n
      map = (/ ( IBITS(rule, n, 1), n=0, 7) /)
      PRINT*,"Input initial bits for 20 members:"
      READ '(20I1)', voter(1:20)
         PRINT '(I3, ":", 20I2)', i, voter(1:20)
      DO i = 1, 5
         voter = map( 4*CSHIFT(voter,-1)+2*voter+CSHIFT(voter,1) )
         PRINT '(I3, ":", 20I2)', i, voter(1:20)
      END DO
   END

===============================================================================

¡¡¢Í£¶¾ÏÀèÆ¬¤Ø¡¡¢Í£·¾Ï¤Ø