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
=============================================================================== ¡¡¢Í£¶¾ÏÀèÆ¬¤Ø¡¡¢Í£·¾Ï¤Ø