New > Project Workspace, naming the project, and selecting the project type as Console Application. It also describes how to create and save a Fortran source code file with a .F90 extension within the project folder."> New > Project Workspace, naming the project, and selecting the project type as Console Application. It also describes how to create and save a Fortran source code file with a .F90 extension within the project folder.">
Fortran 11
Fortran 11
Fortran 11
ﺍﻟــــــﺒــــــﺮﻣـــــﺠــــــﺔ
Fortran 90/95
2017-2018
|(D)2 ﻟﻐﺔ ﺍﻟﺒﺮﻣﺠﺔ Fortran 90
ﻓﻲ ﻫﺬﻩ ﺍﻟﻤﺮﺣﻠﺔ ﻳﻤﻜﻦ ﻣﻼﺣﻈﺔ ﺟﺰﺀ ) (Paneﻣﺴﺎﺣﺔ ﻋﻤﻞ ﺍﻟﻤﺸﺮﻭﻉ ﻓﻲ ﻳﺴﺎﺭ ﻧﺎﻓﺬﺓ
،MSDEVﻳﻤﻜﻦ ﺇﺧﻔﺎﺀ ﻭﺇﻇﻬﺎﺭ ﻫﺬﺍ ﺍﻟﺠﺰﺀ ﺑـ .View » Project Workspace
ﻣﻼﺣﻈﺔ :ﺗﻘﺴﻢ ﻭﺍﺟﻬﺔ MSDEVﺇﻟﻰ ﻋﺪﺓ ﺃﻗﺴﺎﻡ ﻓﻲ ﺃﻋﻠﻰ ﺍﻟﻨﺎﻓﺬﺓ ﺷﺮﻳﻂ ﺍﻟﻌﻨﻮﺍﻥ )(Title Bar
ﻭﻣﻦ ﺛﻢ ﺷﺮﻳﻂ ﺍﻟﻘﻮﺍﺋﻢ )(Menu Barﻭﻣﻦ ﺛﻢ ﺃﺷﺮﻃﺔ ﺍﻷﺩﻭﺍﺕ ) (Tool Barsﻭﺗﺤﺖ ﻫﺬﻩ
ﺍﻷﺷﺮﻃﺔ ﺗﻮﺟﺪ ﻣﻨﻄﻘﺔ ﺗﺤﻮﻱ ﻧﺎﻓﺬﺓ ﻟﺘﺤﺮﻳﺮ ﺍﻟﺒﺮﺍﻣﺞ ﻭﻋﺪﺓ ﺃﺟﺰﺍﺀ ) (Paneﻳﻤﻜﻦ ﺇﻇﻬﺎﺭ ﻭﺇﺧﻔﺎﺀ
ﺃﻱ ﻣﻨﻬﺎ ﻣﻦ ﺧﻼﻝ ﻗﺎﺋﻤﺔ .View
(5ﺍﻵﻥ ﻳﻤﻜﻨﻚ ﻛﺘﺎﺑﺔ ﺍﻟﺒﺮﻧﺎﻣﺞ ،ﻣﺜﻼً ﺍﻛﺘﺐ ﻓﻲ ﺍﻟﻤﻠﻒ ﺍﻟﺬﻱ ﺻﻨﻌﺘﻪ ﻓﻲ ﺍﻟﻔﻘﺮﺓ :3
"!PRINT *, "Hello
END
|(D)3 ﻟﻐﺔ ﺍﻟﺒﺮﻣﺠﺔ Fortran 90
ﻣﻼﺣﻈﺔ :ﻭﺟﻮﺩ ﺍﻟﺘﺤﺬﻳﺮﺍﺕ ﻻ ﻳﻤﻨﻊ ﺍﻟﺒﺮﻧﺎﻣﺞ ﻣﻦ ﺍﻟﺘﺮﺟﻤﺔ ﻭﺍﻟﺘﻨﻔﻴﺬ ﻭﻟﻜﻦ ﻣﻦ ﺍﻷﻓﻀﻞ ﺇﺯﺍﻟﺔ
ﺍﻟﺘﺤﺬﻳﺮﺍﺕ ﻣﻦ ﺍﻟﺒﺮﻧﺎﻣﺞ ﻷﻥ ﺗﺠﺎﻫﻞ ﺑﻌﺾ ﺍﻟﺘﺤﺬﻳﺮﺍﺕ ﻳﺴﺒﺐ ﻣﺸﺎﻛﻞ ﻏﻴﺮ ﻣﺘﻮﻗﻌﺔ ﻓﻲ ﻋﻤﻞ
ﺍﻟﺒﺮﻧﺎﻣﺞ.
ﻣﻼﺣﻈﺔ :ﻳﻤﻜﻦ ﺍﺳﺘﺨﺪﺍﻡ ﻣﻔﺎﺗﻴﺢ ﺍﻻﺧﺘﺼﺎﺭ ﺍﻟﻤﻜﺘﻮﺑﺔ ﺑﺠﺎﻧﺐ ﺍﻷﻭﺍﻣﺮ ﻓﻲ ﺍﻟﻘﻮﺍﺋﻢ ﺑﺪﻻً ﻣﻦ
ﺍﺳﺘﺨﺪﺍﻡ ﺍﻟﻘﻮﺍﺋﻢ ﺑﻤﺆﺷﺮ ﺍﻟﻔﺄﺭﺓ.
ﻣﻼﺣﻈﺔ :ﻳﻤﻜﻦ ﺍﺧﺘﺼﺎﺭ ﻫﺬﻩ ﺍﻟﻤﺮﺍﺣﻞ ﺑﻄﺮﻳﻘﺔ ﺳﺮﻳﻌﺔ ﻭﻟﻜﻦ ﻏﻴﺮ ﻛﺎﻣﻠﺔ ﻛﻤﺎ ﻳﻠﻲ:
(1ﺍﻏﻠﻖ ﺍﻟﻤﺸﺮﻭﻉ ﺍﻟﺴﺎﺑﻖ ﺇﺫﺍ ﻛﺎﻥ ﻣﻔﺘﻮﺣﺎً ﺑـ File » Close Workspace
(2ﺍﺻﻨﻊ ﻣﻠﻒ ﺟﺪﻳﺪ ﺑـ File » New » Text File » OK
(3ﺍﻛﺘﺐ ﺍﻟﺒﺮﻧﺎﻣﺞ
(4ﺍﺣﻔﻆ ﺍﻟﻤﻠﻒ ﺑـ File » Save Asﺛﻢ ﺍﺩﺧﻞ ﺍﺳﻢ ﺍﻟﻤﻠﻒ
(5ﺗﺮﺟﻢ ﺍﻟﺒﺮﻧﺎﻣﺞ ﺑـ ،Build » Build *.exeﻓﻲ ﻫﺬﻩ ﺍﻟﻤﺮﺣﻠﺔ ﺳﻮﻑ ﻳﺴﺄﻟﻚ :MSDEVﻫﻞ
ﺗﺮﻳﺪ ﺇﻳﺠﺎﺩ ﻣﺴﺎﺣﺔ ﻋﻤﻞ ﺟﺪﻳﺪﺓ ﺧﺎﺻﺔ ﺑﻬﺬﺍ ﺍﻟﻤﻠﻒ؟ ﻭﺑﺎﻹﺟﺎﺑﺔ ﺑﻨﻌﻢ ﺳﻮﻑ ﻳﺼﻨﻊ ﻣﺴﺎﺣﺔ ﻋﻤﻞ
ﺑﻨﻔﺲ ﺍﺳﻢ ﻣﻠﻒ ﺍﻟﺒﺮﻧﺎﻣﺞ ﻭﻳﻀﻊ ﻣﻠﻒ ﺍﻟﺒﺮﻧﺎﻣﺞ ﻓﻴﻪ ﻭﻳﺘﺮﺟﻤﻪ ﻣﺒﺎﺷﺮﺓ.
ﻫـ( ﺍﻟﺘﻌﻠﻴﻤﺎﺕ
ﻣﻦ ﺍﻟﺨﺪﻣﺎﺕ ﺍﻟﺘﻲ ﻳﻘﺪﻣﻬﺎ MSDEVﻫﻲ ﺇﻋﻄﺎﺀ ﺍﻟﺘﻌﻠﻴﻤﺎﺕ ﻟﻠﻤﺒﺮﻣﺞ ،ﻓﻤﺜﻼً ﺇﺫﺍ ﻭﺿﻌﺖ
ﺍﻟﻤﺆﺷﺮ ) (cursorﻋﻠﻰ ﻛﻠﻤﺔ IFﻓﻲ ﺍﻟﺒﺮﻧﺎﻣﺞ ﻭﺿﻐﻄﺖ ﻋﻠﻰ ﺍﻟﻤﻔﺘﺎﺡ F1ﺳﻮﻑ ﻳﻌﺮﺽ ﻟﻚ
MSDEVﺗﻌﻠﻴﻤﺎﺕ ﺣﻮﻝ ﺗﺮﻛﻴﺒﺔ ،IFﺃﻭ ﻣﺜﻼً ﺇﺫﺍ ﻛﺘﺒﺖ ﻛﻠﻤﺔ ABSﺩﺍﺧﻞ ﺍﻟﺒﺮﻧﺎﻣﺞ ﻭﻭﺿﻌﺖ
ﺍﻟﻤﺆﺷﺮ ﻋﻠﻰ ﺍﻟﻜﻠﻤﺔ ﻭﺿﻐﻄﺖ ﻋﻠﻰ ﻣﻔﺘﺎﺡ F1ﺳﻮﻑ ﺗﺤﺼﻞ ﻋﻠﻰ ﺗﻌﻠﻴﻤﺎﺕ ﻣﻔﻴﺪﺓ ﻋﻦ ﻫﺬﻩ ﺍﻟﺪﺍﻟﺔ
ﻭﻃﺮﻳﻘﺔ ﺍﺳﺘﺨﺪﺍﻣﻬﺎ ﻭﺩﻭﺍﻝ ﻣﺸﺎﺑﻬﺔ ﺃﺧﺮﻯ.
ﺗﻌﺮﻳﻒ
ﻟﻐﺔ ﺍﻟﻔﻮﺭﺗﺮﺍﻥ ﻫﻲ ﺇﺣﺪﻯ ﺃﻗﺪﻡ ﻟﻐﺎﺕ ﺍﻟﺒﺮﻣﺠﺔ ﻭﻗﺪ ﻃﻮﺭ ﻫﺬﻩ ﺍﻟﻠﻐﺔ ﻓﺮﻳﻖ ﻣﻦ ﺍﻟﻤﺒﺮﻣﺠﻴﻦ
ﺑﺈﺷﺮﺍﻑ John Backusﻭﺗﻢ ﻧﺸﺮﻫﺎ ﻓﻲ ﻋﺎﻡ 1957ﻷﻭﻝ ﻣﺮﺓ .ﺍﺳﻢ ﻫﺬﻩ ﺍﻟﻠﻐﺔ ﻫﻮ ﺍﺧﺘﺼﺎﺭ ﻟـ
FORmulaTRANslationﻣﻤﺎ ﻳﺆﻛﺪ ﺃﻥ ﻫﺬﻩ ﺍﻟﻠﻐﺔ ﻗﺪ ﺻﻤﻤﺖ ﻟﺘﺴﻬﻴﻞ ﻋﻤﻠﻴﺔ ﺗﺮﺟﻤﺔ ﺍﻟﺼﻴﻎ
ﺍﻟﺮﻳﺎﺿﻴﺔ ﺇﻟﻰ ﺑﺮﺍﻣﺞ ﻟﻠﺤﺎﺳﻮﺏ؛ ﻭﻟﻬﺬﺍ ﻓﺈﻧﻬﺎ ﻟﻐﺔ ﻋﻠﻤﻴﺔ– ﻫﻨﺪﺳﻴﺔ.
ﻣﺮّ ﺗﻄﻮﺭ ﻟﻐﺔ ﺍﻟﻔﻮﺭﺗﺮﺍﻥ ﺑﻌﺪﺓ ﻣﺮﺍﺣﻞ ﺑﻌﺪ ﺃﻭﻝ ﺇﺻﺪﺍﺭ ﻟﻬﺎ ﻭﻟﺬﻟﻚ ﺗﻮﺟﺪ ﻋﺪﺓ ﺇﺻﺪﺍﺭﺍﺕ
ﻗﻴﺎﺳﻴﺔ ﻣﻦ ﺃﻫﻤﻬﺎ ﺍﻹﺻﺪﺍﺭ FORTRAN 66ﺍﻟﺬﻱ ﺗﻢ ﻧﺸﺮﻩ ﻓﻲ ﺳﻨﺔ 1966ﻭﺍﻹﺻﺪﺍﺭ ﺍﻟﻤﻌﺮﻭﻑ
ﺟﺪﺍً FORTRAN 77ﺍﻟﺬﻱ ﺗﻢ ﻧﺸﺮﻩ ﺳﻨﺔ ) 1978ﺑﺪﺃ ﺍﻟﻌﻤﻞ ﺑﻪ ﺳﻨﺔ (1977ﻭﺍﻹﺻﺪﺍﺭ
Fortran 90ﺍﻟﺬﻱ ﺗﻢ ﺳﻨﺔ 1990ﻭﻓﻲ ﻫﺬﺍ ﺍﻹﺻﺪﺍﺭ ﺗﻢ ﺇﺿﺎﻓﺔ ﻣﻴﺰﺍﺕ ﺟﺪﻳﺪﺓ ﻛﺜﻴﺮﺓ ﺇﻟﻰ ﻫﺬﻩ
ﺍﻟﻠﻐﺔ ﺑﻌﺪ ﺍﻟﺘﻄﻮﺭ ﺍﻟﻜﺒﻴﺮ ﺍﻟﺬﻱ ﺣﺪﺙ ﻋﻠﻰ ﻟﻐﺎﺕ ﺍﻟﺒﺮﻣﺠﺔ ﻣﻨﺬ ﺇﺻﺪﺍﺭﺍﺕ ﺍﻟﻔﻮﺭﺗﺮﺍﻥ ﺍﻷﻭﻟﻰ.
|(D)5 ﻟﻐﺔ ﺍﻟﺒﺮﻣﺠﺔ Fortran 90
ﺍﻟﺨﻄﺄ ﺍﻷﻭﻝ ﻫﻮ ﺧﻄﺄ ﺗﺴﻤﻴﺔ ﺣﻴﺚ ﺍﻻﺳﻢ prg#1ﻳﺤﺘﻮﻱ ﻋﻠﻰ ﺍﻟﺮﻣﺰ #ﺍﻟﻐﻴﺮ ﻣﺴﻤﻮﺡ ﺑﻪ،
ﻭﺍﻟﺨﻄﺄ ﺍﻟﺜﺎﻧﻲ ﻫﻮ ﻋﺪﻡ ﻛﺘﺎﺑﺔ ﻛﻠﻤﺔ programﺑﻴﻦ ﻛﻠﻤﺔ endﻭﺍﺳﻢ ﺍﻟﺒﺮﻧﺎﻣﺞ ﻓﻲ ﺟﻤﻠﺔ ﺍﻹﻧﻬﺎﺀ.
ﻣﺜﺎﻝ:
"!print *, name, " is ", age, "years old
ﺍﻟﺘﻌﺒﻴﺮ ﺍﻷﻭﻝ ﻓﻲ ﻫﺬﻩ ﺍﻟﺠﻤﻠﺔ ﻫﻮ ﺍﻟﻤﺘﻐﻴﺮ nameﻭﺍﻟﺘﻌﺒﻴﺮ ﺍﻟﺜﺎﻧﻲ ﻫﻮ ﺍﻟﻨﺺ " " isﻭﺍﻟﺘﻌﺒﻴﺮ
ﺍﻟﺜﺎﻟﺚ ﻫﻮ ﺍﻟﻤﺘﻐﻴﺮ ageﻭﺍﻟﺘﻌﺒﻴﺮ ﺍﻟﺮﺍﺑﻊ ﻫﻮ ﺍﻟﻨﺺ "!."years old
ﺳﻮﻑ ﻳﻜﻮﻥ ﻣﻦ ﻧﻮﻉ ﺍﻷﻋﺪﺍﺩ ﺍﻟﺼﺤﻴﺤﺔ ﻭﺃﻱ ﻣﺘﻐﻴﺮ ﺁﺧﺮ ﺳﻮﻑ ﻳﻜﻮﻥ ﻣﻦ ﻧﻮﻉ ﺍﻷﻋﺪﺍﺩ ﺍﻟﺤﻘﻴﻘﻴﺔ.
ﻳﻤﻜﻦ ﺇﻟﻐﺎﺀ ﺍﻹﻋﻼﻥ ﺍﻟﻀﻤﻨﻲ ﺑﻜﺘﺎﺑﺔ ﺍﻟﺠﻤﻠﺔ ﺍﻟﺘﺎﻟﻴﺔ ﻓﻲ ﺑﺪﺍﻳﺔ ﺍﻟﺒﺮﻧﺎﻣﺞ:
implicitnone
ﻭﻫﺬﺍ ﻣﺎ ﻳﻘﻠﻞ ﻣﻦ ﺍﻷﺧﻄﺎﺀ ﺍﻟﻤﺤﺘﻠﻤﺔ ﻓﻲ ﺍﻟﺒﺮﻧﺎﻣﺞ )ﺍﻟﺼﺮﻳﺢ ﺃﻓﻀﻞ ﻣﻦ ﺍﻟﻀﻤﻨﻲ(.
ﻣﺜﺎﻝ:
integer :: count
logical :: done
character (len=30) :: name
ﻣﻼﺣﻈﺔ :ﻓﻲ ﺣﺎﻟﺔ ﺍﻟﻤﺘﻐﻴﺮ ﺍﻟﻨﺼﻲ ﻳﺠﺐ ﺫﻛﺮ ﻋﺪﺩ ﺍﻟﺤﺮﻭﻑ ﺍﻟﺘﻲ ﻳﺴﺘﻮﻋﺒﻬﺎ ﺍﻟﻤﺘﻐﻴﺮ ﻭﻓﻲ ﺣﺎﻟﺔ
ﻋﺪﻡ ﺫﻛﺮ ﻃﻮﻝ ﺍﻟﻤﺘﻐﻴﺮ ﺳﻮﻑ ﻳﻜﻮﻥ ﺍﺳﺘﻴﻌﺎﺏ ﺍﻟﻤﺘﻐﻴﺮ ﺣﺮﻑ ﻭﺍﺣﺪ ﻓﻘﻂ.
ﺍﺳﻢ ﺍﻟﻤﺘﻐﻴﺮ ) ::ﻋﺪﺩ ﺍﻟﺤﺮﻭﻑ ﺍﻟﺘﻲ ﻳﺴﺘﻮﻋﺒﻬﺎ ﺍﻟﻤﺘﻐﻴﺮ ﺍﻟﻨﺼﻲ=character (len
ﻣﻼﺣﻈﺔ:ﻳﻤﻜﻦ ﺣﺬﻑ ﻛﻠﻤﺔ lenﻭﻋﻼﻣﺔ ﻳﺴﺎﻭﻱ ﺍﻟﺘﻲ ﺗﻠﻴﻬﺎ ﻭﻛﺘﺎﺑﺔ ﺍﻹﻋﻼﻥ ﻛﻤﺎ ﻳﻠﻲ:
character(30) :: name
|(D)8 ﻟﻐﺔ ﺍﻟﺒﺮﻣﺠﺔ Fortran 90
Constants ﺍﻟﺜﻮﺍﺑﺖ
ﻟﻺﻋﻼﻥ ﻋﻦ ﺍﻟﺜﻮﺍﺑﺖ ﺗﺴﺘﺨﺪﻡ ﻓﻲ ﺍﻟﻔﻮﺭﺗﺮﺍﻥ ﻧﻔﺲ ﺟﻤﻠﺔ ﺍﻹﻋﻼﻥ ﻋﻦ ﺍﻟﻤﺘﻐﻴﺮ ﺑﺈﺿﺎﻓﺔ ﻛﻠﻤﺔ
parameterﻛﻤﺎ ﻳﻠﻲ:
ﺍﻟﻘﻴﻤﺔ = ﺍﺳﻢ ﺍﻟﺜﺎﺑﺖ ﺍﻷﻭﻝ , parameter ::ﻧﻮﻉ ﺍﻟﺒﻴﺎﻧﺎﺕ
ﻣﺜﺎﻝ:
real, parameter :: pi = 3.14
integer, parameter :: n = 20
ﻣﻼﺣﻈﺔ :ﻻ ﻳﺨﺼﺺ ﻣﻜﺎﻥ ﻓﻲ ﺍﻟﺬﺍﻛﺮﺓ ﻟﺨﺰﻥ ﺍﻟﺜﺎﺑﺖ ﻭﺇﻧﻤﺎ ﻳﻌﻮﺽ ﻋﻦ ﺍﺳﻢ ﺍﻟﺜﺎﺑﺖ ﺑﻘﻴﻤﺘﻪ ﻓﻲ
ﻛﻞ ﻣﻜﺎﻥ ﻳُﺴﺘﺨﺪﻡ ﺍﻟﺜﺎﺑﺖ ﻓﻲ ﺍﻟﺒﺮﻧﺎﻣﺞ.
ﻣﻼﺣﻈﺔ :ﻳﺠﺐ ﺃﻥ ﺗﻌﻄﻰ ﻗﻴﻤﺔ ﺍﻟﺜﺎﺑﺖ ﻓﻲ ﻧﻔﺲ ﺟﻤﻠﺔ ﺍﻹﻋﻼﻥ.
Expressions ﺍﻟﺘﻌﺎﺑﻴﺮ
ﺍﻟﺘﻌﺒﻴﺮ ﻫﻮ ﻣﺠﻤﻮﻋﺔ ﻣﻦ ﺍﻟﻘﻴﻢ ) (valueﻭﺍﻟﻤﺘﻐﻴﺮﺍﺕ ) (variableﻭﺍﻟﻌﻮﺍﻣﻞ )(operator
ﻭﺍﻟﺪﻭﺍﻝ ) (functionﻭﺍﻟﻬﺪﻑ ﻣﻦ ﺍﻟﺘﻌﺒﻴﺮ ﺇﻳﺠﺎﺩ »ﻗﻴﻤﺔ« ﺟﺪﻳﺪﺓ.
Operators ﺍﻟﻌﻮﺍﻣﻞ
ﺇﻥ ﺃﺑﺴﻂ ﻋﻤﻠﻴﺎﺕ ﻣﻌﺎﻟﺠﺔ ﺗﺘﻢ ﻋﻠﻰ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻓﻲ ﺍﻟﺒﺮﻧﺎﻣﺞ ﻫﻮ ﻣﺎ ﺗﻘﻮﻡ ﺑﻪ ﺍﻟﺤﺎﺳﺒﺔ ﺍﻟﻴﺪﻭﻳﺔ
ﻛﻌﻤﻠﻴﺔ ﺍﻟﺠﻤﻊ ﻭﺍﻟﻘﺴﻤﺔ ﻭﻏﻴﺮﻫﺎ ،ﻭﺗﻨﻔﺬ ﻫﺬﻩ ﺍﻟﻌﻤﻠﻴﺎﺕ ﻓﻲ ﻟﻐﺎﺕ ﺍﻟﺒﺮﻣﺠﺔ ﺑﻮﺍﺳﻄﺔ ﻣﺎ ﻳﺴﻤﻰ
ﺑﺎﻟﻌﻮﺍﻣﻞ ﻭﻫﻲ ﻋﻠﻰ ﺃﻧﻮﺍﻉ:
ﻣﻼﺣﻈﺔ :ﻓﻲ ﺗﻨﻔﻴﺬ ﺍﻟﻌﻤﻠﻴﺎﺕ ﺇﺫﺍ ﻛﺎﻥ ﺃﺣﺪ ﺍﻟﻘﻴﻢ ﺻﺤﻴﺤﺔ ﻭﺍﻟﻘﻴﻤﺔ ﺍﻷﺧﺮﻯ ﺣﻘﻴﻘﻴﺔ ﻓﺴﻮﻑ ﺗﺒﺪﻝ
ﺍﻟﻘﻴﻤﺔ ﺍﻟﺼﺤﻴﺤﺔ ﺇﻟﻰ ﻗﻴﻤﺔ ﺣﻘﻴﻘﻴﺔ ﻭﻣﻦ ﺛﻢ ﺗﻨﻔﺬ ﺍﻟﻌﻤﻠﻴﺔ ﻭﻳﻜﻮﻥ ﺍﻟﻨﺎﺗﺞ ﻗﻴﻤﺔ ﺣﻘﻴﻘﻴﺔ ﻭﺇﺫﺍ ﻛﺎﻧﺖ ﺃﺣﺪ
ﺍﻟﻘﻴﻢ ﺣﻘﻴﻘﻴﺔ ﻭﺍﻟﻘﻴﻤﺔ ﺍﻷﺧﺮﻯ ﻣﺮﻛﺒﺔ ﻓﺴﻮﻑ ﻳﻜﻮﻥ ﺍﻟﻨﺎﺗﺞ ﻗﻴﻤﺔ ﻣﺮﻛﺒﺔ ﻭﺇﺫﺍ ﻛﺎﻧﺖ ﺃﺣﺪ ﺍﻟﻘﻴﻢ ﺻﺤﻴﺤﺔ
ﻭﺍﻟﻘﻴﻤﺔ ﺍﻟﺜﺎﻧﻴﺔ ﻣﺮﻛﺒﺔ ﻓﺴﻮﻑ ﻳﻜﻮﻥ ﺍﻟﻨﺎﺗﺞ ﻗﻴﻤﺔ ﻣﺮﻛﺒﺔ ﺃﻳﻀﺎً )ﺍﻟﻘﺎﻧﻮﻥ :ﺗﺒﺪﻝ ﺍﻟﻘﻴﻢ ﻟﻠﻨﻮﻉ ﺍﻟﺬﻱ
ﻳﺴﺘﻮﻋﺐ ﺍﻟﻘﻴﻤﺘﻴﻦ(.
"ﺍﻟﻨﺼﻲ" ﻭﻳﻜﻮﻥ ﻧﺎﺗﺞ ﻋﻤﻠﻴﺔ ﺍﻟﻤﻘﺎﺭﻧﺔ ﻗﻴﻤﺔ "ﻣﻨﻄﻘﻴﺔ" ،ﻭﺗﻜﺘﺐ ﻋﻤﻠﻴﺎﺕ ﺍﻟﻤﻘﺎﺭﻧﺔ ﺑﻄﺮﻳﻘﺘﻴﻦ ﺍﻟﻄﺮﻳﻘﺔ
ﺍﻟﻘﺪﻳﻤﺔ ﻭﺍﻟﻄﺮﻳﻘﺔ ﺍﻟﺤﺪﻳﺜﺔ ﻛﻤﺎ ﻳﻠﻲ:
ﻣﻼﺣﻈﺔ :ﻣﻘﺎﺭﻧﺔ ﺍﻟﻤﺴﺎﻭﺍﺓ ﺃﻭ ﻋﺪﻡ ﺍﻟﻤﺴﺎﻭﺍﺓ ﺑﻴﻦ ﺍﻷﺭﻗﺎﻡ ﺍﻟﺤﻘﻴﻘﻴﺔ ﺗﺨﻀﻊ ﻟﺪﻗﺔ ﺍﻟﺤﺎﺳﻮﺏ ﻭﻗﺪ
ﺗﺆﺩﻱ ﺇﻟﻰ ﻧﺘﻴﺠﺔ ﺧﺎﻃﺌﺔ ﻓﻤﺜﻼً ﻗﺪ ﺗﻜﻮﻥ ﻧﺘﻴﺠﺔ ﺍﻟﺘﻌﺒﻴﺮ 3.0 == 3.000001ﺍﻟﻘﻴﻤﺔ .TRUE.ﻭﻫﻲ
ﻧﺘﻴﺠﺔ ﻏﻴﺮ ﺻﺤﻴﺤﺔ ،ﻟﺬﻟﻚ ﻳﻔﻀﻞ ﻓﻲ ﻣﺜﻞ ﻫﺬﻩ ﺍﻟﺤﺎﻟﺔ ﺍﺳﺘﺨﺪﺍﻡ ﻃﺮﻳﻘﺔ ﻣﺜﻞ ﺍﻟﺘﻌﺒﻴﺮ ﺍﻟﺘﺎﻟﻲ:
ﻋﺪﺩ ﺻﻐﻴﺮ< )ﺍﻟﻘﻴﻤﺔ ﺍﻟﺜﺎﻧﻴﺔ – ﺍﻟﻘﻴﻤﺔ ﺍﻷﻭﻟﻰ(abs
ﻣﺜﻞ :ﻟﻤﻘﺎﺭﻧﺔ ﺍﻟﻤﺘﻐﻴﺮ xﻣﻊ ﺍﻟﻌﺪﺩ 3.0ﻣﻦ ﺍﻷﻓﻀﻞ ﺍﺳﺘﺨﺪﺍﻡ ﺍﻟﺘﻌﺒﻴﺮ ﺍﻟﺘﺎﻟﻲ:
abs(x - 3.0) < 0.000001
ﻣﺜﺎﻝ:
""Sir Isac" // "Newton" → "Sir IsacNewton
ﻣﻼﺣﻈﺔ :ﺍﻷﺟﺰﺍﺀ ﺩﺍﺧﻞ ﺍﻷﻗﻮﺍﺱ ﺗﻨﻔﺬ ﻗﺒﻞ ﺃﻱ ﺷﻲﺀ ﺁﺧﺮ ،ﺃﻱ ﻳﻤﻜﻦ ﺍﻟﻘﻮﻝ ﺃﻥ ﺍﻷﻗﻮﺍﺱ ﺗﺘﻤﺘﻊ
ﺑﺄﻋﻠﻰ ﺃﺳﺒﻘﻴﺔ.
ﺃﻣﺜﻠﺔ:
3/4→0
13/4→3
13/4.0→3.25
ﻧﻮﻉ ﺍﻟﻨﺎﺗﺞ ﻳﺘﺒﻊ ﻧﻮﻉ ﺍﻟﻤﻌﺎﻣﻠﻴﻦ )(operands
-3**2.0 → -9.0
-5**2 → -25
ﻷﻥ ﺃﺳﺒﻘﻴﺔ ﺍﻟﺮﻓﻊ ﻟﻘﻮﺓ ﺃﻋﻠﻰ ﻣﻦ ﺍﻟﺴﺎﻟﺐ )ﻻﺣﻆ ﻓﻲ ﺍﻟﺤﺎﻟﺔ ﺍﻷﻭﻟﻰ ﺍﻟﻨﺎﺗﺞ ﺣﻘﻴﻘﻲ ﻭﻓﻲ ﺍﻟﺤﺎﻟﺔ
ﺍﻟﺜﺎﻧﻴﺔ ﺍﻟﻨﺎﺗﺞ ﺻﺤﻴﺢ(
5-5/3*3→2
(D)11| Fortran 90 ﻟﻐﺔ ﺍﻟﺒﺮﻣﺠﺔ
.not. .true. .and. .false. → (.not. .true.) .and. .false. -> .false.
5 > 10 .or. .not. 5 < 3 → (5 > 10) .or. (.not. (5 < 3)) → .false. .or. (.not.
.false.) → .true.
ﻳﻔﻀﻞ ﺍﺳﺘﺨﺪﺍﻡ ﺍﻷﻗﻮﺍﺱ ﻓﻲ ﻛﺘﺎﺑﺔ ﺍﻟﺘﻌﺎﺑﻴﺮ ﺍﻟﻄﻮﻳﻠﺔ ﻭﺫﻟﻚ ﻟﺰﻳﺎﺩﺓ ﻭﺿﻮﺡ ﺍﻟﺒﺮﻧﺎﻣﺞ:ﻣﻼﺣﻈﺔ
.ﻭﺗﺠﻨﺐ ﺍﻷﺧﻄﺎﺀ
ﻣﺜﺎﻝ :ﺍﻟﺒﺮﻧﺎﻣﺞ ﺍﻟﺘﺎﻟﻲ ﻳﻘﻮﻡ ﺑﺤﺴﺎﺏ ﺟﺬﺭ ﺍﻟﻌﺪﺩ ﺍﻟﻤﺪﺧﻞ ﺑﺪﻗﺔ ﻗﻠﻴﻠﺔ ،ﺗﺎﺑﻊ ﺗﻨﻔﻴﺬ ﻫﺬﺍ ﺍﻟﺒﺮﻧﺎﻣﺞ
ﻳﺪﻭﻳﺎ.
real :: x, y
read *, x
y=x
)y = 0.5 * (y +2 / y
)y = 0.5 * (y +2 / y
)y = 0.5 * (y +2 / y
print *, “the square root of ”, x, “ is approximately ”, y
end
ﺛﺎﻧﻴﺎً:
) thenﺗﻌﺒﻴﺮ ﻣﻨﻄﻘﻲ( if
ﺟﻤﻠﻪ ﺗﻨﻔﻴﺬﻳﺔ ﺭﻗﻢ [1
else
ﺟﻤﻠﻪ ﺗﻨﻔﻴﺬﻳﺔ ﺭﻗﻢ [2
endif
ﻋﻨﺪ ﻭﺻﻮﻝ ﺍﻟﺘﻨﻔﻴﺬ ﺇﻟﻰ ﻫﺬﻩ ﺍﻟﺘﺮﻛﻴﺒﺔ ﺳﻮﻑ ﻳﺤﺼﻞ ﺍﻟﺤﺎﺳﻮﺏ ﻋﻠﻰ ﻧﺎﺗﺞ ﺍﻟﺘﻌﺒﻴﺮ ﺍﻟﻤﻨﻄﻘﻲ
)ﻭﻫﻮ ﺍﻟﺸﺮﻁ( ﻭﺇﺫﺍ ﻛﺎﻧﺖ ﻗﻴﻤﺔ ﺍﻟﻨﺎﺗﺞ .true.ﻓﺈﻧﻪ ﺳﻮﻑ ﻳﻨﻔﺬ ﺍﻟﺠﻤﻞ ﺍﻟﺒﺮﻣﺠﻴﺔ ﺭﻗﻢ 1ﺟﻤﻠﺔ ﺑﻌﺪ
ﺍﻷﺧﺮﻯ ﻭﻣﻦ ﺛﻢ ﻳﻨﺘﻘﻞ ﺇﻟﻰ ﺑﻌﺪ ﻛﻠﻤﺔ ،end ifﻭﺇﺫﺍ ﻛﺎﻧﺖ ﻗﻴﻤﺔ ﺍﻟﻨﺎﺗﺞ .false.ﻓﺈﻧﻪ ﺳﻮﻑ ﻳﻨﻔﺬ
|(D)13 ﻟﻐﺔ ﺍﻟﺒﺮﻣﺠﺔ Fortran 90
ﺍﻟﺠﻤﻞ ﺍﻟﺒﺮﻣﺠﻴﺔ ﺭﻗﻢ 2ﻭﻣﻦ ﺛﻢ ﻳﻨﺘﻘﻞ ﺇﻟﻰ ﺑﻌﺪ ﻛﻠﻤﺔ .end if
ﺛﺎﻟﺜﺎً:
) thenﺗﻌﺒﻴﺮ ﻣﻨﻄﻘﻲ ﺃﻭﻝ( if
ﺟﻤﻠﻪ ﺗﻨﻔﻴﺬﻳﺔ[
) thenﺗﻌﺒﻴﺮ ﻣﻨﻄﻘﻲ ﺛﺎﻧﻲ( Else if
ﺟﻤﻠﻪ ﺗﻨﻔﻴﺬﻳﺔ[
) thenﺗﻌﺒﻴﺮ ﻣﻨﻄﻘﻲ ﺛﺎﻟﺚ( Else if
ﺟﻤﻠﻪ ﺗﻨﻔﻴﺬﻳﺔ[
...
else
ﺟﻤﻠﻪ ﺗﻨﻔﻴﺬﻳﺔ ﻓﻲ ﺣﺎﻝ ﻋﺪﻡ ﺗﻮﻓﺮ ﺍﻟﺸﺮﻭﻁ[
End if
ﻋﻨﺪ ﻭﺻﻮﻝ ﺍﻟﺘﻨﻔﻴﺬ ﺇﻟﻰ ﻫﺬﻩ ﺍﻟﺘﺮﻛﻴﺒﺔ ﺳﻮﻑ ﻳﺤﺼﻞ ﺍﻟﺤﺎﺳﻮﺏ ﻋﻠﻰ ﻧﺎﺗﺞ ﺍﻟﺘﻌﺒﻴﺮ ﺍﻟﻤﻨﻄﻘﻲ
"ﺍﻷﻭﻝ" ﻭﺇﺫﺍ ﻛﺎﻧﺖ ﻗﻴﻤﺔ ﺍﻟﻨﺎﺗﺞ .true.ﻓﺈﻧﻪ ﺳﻮﻑ ﻳﻨﻔﺬ ﺍﻟﺠﻤﻞ ﺍﻟﺒﺮﻣﺠﻴﺔ ﺭﻗﻢ 1ﺟﻤﻠﺔ ﺑﻌﺪ ﺍﻷﺧﺮﻯ
ﻭﻣﻦ ﺛﻢ ﻳﻨﺘﻘﻞ ﺇﻟﻰ ﺑﻌﺪ ﻛﻠﻤﺔ ،end ifﻭﺇﺫﺍ ﻛﺎﻧﺖ ﻗﻴﻤﺔ ﺍﻟﻨﺎﺗﺞ .false.ﻓﺈﻧﻪ ﻳﺤﺼﻞ ﻋﻠﻰ ﻧﺎﺗﺞ ﺍﻟﺘﻌﺒﻴﺮ
ﺍﻟﻤﻨﻄﻘﻲ "ﺍﻟﺜﺎﻧﻲ" ﻭﺇﺫﺍ ﻛﺎﻧﺖ ﻗﻴﻤﺔ ﺍﻟﻨﺎﺗﺞ .true.ﻓﺈﻧﻪ ﺳﻮﻑ ﻳﻨﻔﺬ ﺍﻟﺠﻤﻞ ﺍﻟﺒﺮﻣﺠﻴﺔ ﺭﻗﻢ 2ﺟﻤﻠﺔ ﺑﻌﺪ
ﺍﻷﺧﺮﻯ ﻭﻣﻦ ﺛﻢ ﻳﻨﺘﻘﻞ ﺇﻟﻰ ﺑﻌﺪ ﻛﻠﻤﺔ ،end ifﻭﺇﺫﺍ ﻛﺎﻧﺖ ﻗﻴﻤﺔ ﺍﻟﻨﺎﺗﺞ .false.ﻳﺤﺼﻞ ﻋﻠﻰ ﻧﺎﺗﺞ
ﺍﻟﺘﻌﺒﻴﺮ ﺍﻟﻤﻨﻄﻘﻲ "ﺍﻟﺜﺎﻟﺚ" ...ﻭﻓﻲ ﺣﺎﻟﺔ ﻓﺸﻞ ﺟﻤﻴﻊ ﺍﻟﺸﺮﻭﻁ )ﻗﻴﻤﺔ ﺟﻤﻴﻊ ﺍﻟﺘﻌﺎﺑﻴﺮ ﺍﻟﻤﻨﻄﻘﻴﺔ
(.false.ﺳﻮﻑ ﺗﻨﻔﺬ ﺃﺧﻴﺮ ﻣﺠﻤﻮﻋﺔ ﻣﻦ ﺍﻟﺠﻤﻞ.
ﺭﺍﺑﻌﺎً :ﻓﻲ ﺑﻌﺾ ﺍﻟﺤﺎﻻﺕ ﺍﻟﻤﻄﻠﻮﺏ ﻫﻮ ﺗﻨﻔﻴﺬ ﺟﻤﻠﺔ ﻭﺍﺣﺪﺓ ﻓﻲ ﺣﺎﻝ ﺻﺤﺔ ﺷﺮﻁ ﻣﻌﻴﻦ ﻭﺗﻜﺘﺐ
ﺗﺮﻛﻴﺒﺔ ifﻓﻲ ﻫﺬﻩ ﺍﻟﺤﺎﻻﺕ ﺑﺸﻜﻞ ﻣﺒﺴﻂ ﻛﻤﺎ ﻳﻠﻲ:
ﺟﻤﻠﺔ ﻭﺍﺣﺪﺓ )ﺗﻌﺒﻴﺮ ﻣﻨﻄﻘﻲ( if
ﻻﺣﻆ ﺃﻥ ﻛﻠﻤﺔ thenﺗﺤﺬﻑ ﺃﻳﻀﺎً )ﺧﻼﻓﺎً ﻟﻠﻐﺔ ﺍﻟﺒﻴﺴﻚ(.
ﻣﺜﺎﻝ :ﺍﻛﺘﺐ ﺑﺮﻧﺎﻣﺠﺎ ﻳﺒﺪﻝ ﺩﺭﺟﺔ ﺍﻟﻄﺎﻟﺐ ﺇﻟﻰ ﺗﻘﺪﻳﺮ ﻋﻠﻤﺎً ﺑﺄﻥ ﺍﻟﺪﺭﺟﺔ ﻣﻦ 90ﺇﻟﻰ 100ﺗﻘﺪﺭ
ﺑـ Aﻭﻣﻦ 80ﺇﻟﻰ 89ﺗﻘﺪﺭ ﺑـ Bﻭﻣﻦ 70ﺇﻟﻰ 79ﺗﻘﺪﺭ ﺑـ Cﻭﻣﻦ 60ﺇﻟﻰ 69ﺗﻘﺪﺭ ﺑـ Dﻭﻣﻦ
50ﺇﻟﻰ 59ﺗﻘﺪﺭ ﺑـ Eﻭﺍﻟﺪﺭﺟﺎﺕ ﺃﻗﻞ ﻣﻦ 50ﺗﻘﺪﺭ ﺑـ . F
ﺍﻟﺠﻮﺍﺏ:
integer :: deg
character :: eval
read *, deg
’eval = ‘B
elseif (deg>= 70 .and. deg<= 79) then
’eval = ‘C
elseif (deg>= 60 .and. deg<= 69) then
’eval = ‘D
elseif (deg>= 50 .and. deg<= 59) then
’eval = ‘E
elseif (deg>= 0 .and. deg<= 49) then
’eval = ‘F
endif
print *, eval
end
ﻳﻤﻜﻦ ﺣﺬﻑ ﺃﺟﺰﺍﺀ ﻣﻦ ﺍﻟﺘﻌﺎﺑﻴﺮ ﺍﻟﻤﻨﻄﻘﻴﺔ )ﺍﻟﺸﺮﻭﻁ ﺍﻟﺘﻲ ﻳﻜﻮﻥ ﻧﺎﺗﺠﻬﺎ ﻣﻌﺮﻭﻑ ﻣﺴﺒﻘﺎً(
ﻭﺗﻠﺨﻴﺺ ﺍﻟﺠﻮﺍﺏ ﻛﻤﺎ ﻳﻠﻲ:
integer :: deg
character :: eval
read *, deg
print *, eval
end
ﻣﻼﺣﻈﺔ :ﻫﺬﺍ ﺍﻟﺠﻮﺍﺏ ﻧﺎﻗﺺ ﺣﻴﺚ ﺃﻧﻪ ﻻ ﻳﻬﺘﻢ ﻟﻸﺭﻗﺎﻡ ﺍﻟﺘﻲ ﺗﻜﻮﻥ ﺃﺻﻐﺮ ﻣﻦ ﺍﻟﺼﻔﺮ ﺃﻭ ﺃﻛﺒﺮ
ﻣﻦ ﺍﻟﻤﺎﺋﺔ ،ﻭﻳﺠﺐ ﻓﻲ ﺍﻟﺒﺮﺍﻣﺞ ﺍﻟﺤﻘﻴﻘﻴﺔ ﺍﻟﺘﻨﺒﺆ ﻟﻤﺜﻞ ﻫﻜﺬﺍ ﺃﺧﻄﺎﺀ ،ﻭﻋﺪﻡ ﻧﻘﻞ ﺃﺧﻄﺎﺀ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺇﻟﻰ
ﻣﺮﺍﺣﻞ ﺃﺧﺮﻯ ﻣﻦ ﺍﻟﺒﺮﻧﺎﻣﺞ ).(garbage in garbage out
-2ﺗﺮﻛﻴﺒﺔ ﺍﻟﺤﺎﻻﺕselect-case
ﺗﺸﻜﻞ ﻫﺬﻩ ﺍﻟﺘﺮﻛﻴﺒﺔ ﺑﺪﻳﻼً ﻟﺘﺮﻛﻴﺒﺔ ifﻓﻲ "ﺑﻌﺾ" ﺍﻟﺤﺎﻻﺕ ﻭﺗﺘﻤﻴﺰ ﺑﻮﺿﻮﺣﻬﺎ ﻭﻟﻜﻦ ﻻ ﻳﻤﻜﻦ
ﺍﺳﺘﺒﺪﺍﻝ ﺃﻱ ﺗﺮﻛﻴﺒﺔ ifﺑﺘﺮﻛﻴﺒﺔ ﺣﺎﻻﺕ.
ﺗﺄﺧﺬ ﺗﺮﻛﻴﺒﺔ ﺍﻟﺤﺎﻻﺕ ﺍﻟﺸﻜﻞ ﺍﻟﻌﺎﻡ ﺍﻟﺘﺎﻟﻲ:
)ﺗﻌﺒﻴﺮ( select case
)ﻣﺠﻤﻮﻋﺔ ﻣﻦ ﺍﻟﻘﻴﻢ( case
|(D)15 ﻟﻐﺔ ﺍﻟﺒﺮﻣﺠﺔ Fortran 90
ﺟﻤﻞ ﺑﺮﻣﺠﺔ
)ﻣﺠﻤﻮﻋﺔ ﺛﺎﻧﻴﺔ ﻣﻦ ﺍﻟﻘﻴﻢ( case
ﺟﻤﻞ ﺑﺮﻣﺠﺔ ﺛﺎﻧﻴﺔ
...
case default
ﺟﻤﻞ ﺑﺮﻣﺠﺔ ﺃﺧﺮﻯ
end select
ﻣﻼﺣﻈﺔ ﻫﺎﻣﺔ:ﻧﺎﺗﺞ ﺍﻟﺘﻌﺒﻴﺮ ﻓﻲ ﺗﺮﻛﻴﺒﺔ ﺍﻟﺤﺎﻻﺕ "ﻻ ﻳﺴﻤﺢ" ﺃﻥ ﻳﻜﻮﻥ ﻋﺪﺩ ﺣﻘﻴﻘﻲ ﺃﻭ ﻣﺮﻛﺐ.
ﻣﻼﺣﻈﺔ:ﺗﺘﻜﻮﻥ ﻣﺠﻤﻮﻋﺔ ﺍﻟﺤﺎﻻﺕ ﻣﻦ "ﻗﻴﻤﺔ ﻭﺍﺣﺪﺓ" ﺃﻭ "ﻗﻴﻢ" ﺃﻭ "ﻣﺠﺎﻻﺕ ﻗﻴﻢ" ﻳﻤﻜﻦ ﺃﻥ ﺗﻨﺘﺞ
ﻋﻦ ﺍﻟﺘﻌﺒﻴﺮ ﻣﻔﺼﻮﻟﺔ ﻋﻦ ﺑﻌﻀﻬﺎ ﺑﺎﻟﻔﺎﺭﺯﺓ.
ﻣﺠﺎﻝ ﺍﻟﻘﻴﻢ ﻳﻜﺘﺐ ﺑﺈﺣﺪﻯ ﺍﻷﺷﻜﺎﻝ ﺍﻟﺘﺎﻟﻴﺔ
ﺃ( ) (a : bﻭﻳﺪﻝ ﻫﺬﺍ ﺍﻟﻤﺠﺎﻝ ﻋﻠﻰ ﺟﻤﻴﻊ ﺍﻟﻘﻴﻢ ﻣﺎ ﺑﻴﻦ aﻭ bﻭﻛﺬﻟﻚ ﻧﻔﺲ ﻫﺎﺗﻴﻦ ﺍﻟﻘﻴﻤﺘﻴﻦ.
ﺏ( ) ( : bﻭﻳﺪﻝ ﻫﺬﺍ ﺍﻟﻤﺠﺎﻝ ﻋﻠﻰ ﺟﻤﻴﻊ ﺍﻟﻘﻴﻢ ﺍﻷﺻﻐﺮ ﺃﻭ ﺗﺴﺎﻭﻱ ﺍﻟﻘﻴﻤﺔ .b
ﺝ( ) (a :ﻭﻳﺪﻝ ﻫﺬﺍ ﺍﻟﻤﺠﺎﻝ ﻋﻠﻰ ﺟﻤﻴﻊ ﺍﻟﻘﻴﻢ ﺍﻷﻛﺒﺮ ﺃﻭ ﺗﺴﺎﻭﻱ ﺍﻟﻘﻴﻤﺔ .a
ﻣﺜﺎﻝ:
)ﻳﻌﻨﻲ ﺍﻟﻌﺪﺩ (71 71
)ﻳﻌﻨﻲ ﺍﻟﻌﺪﺩ 1ﺃﻭ ﺍﻟﻌﺪﺩ 4ﺃﻭ ﺍﻟﻌﺪﺩ (5 1,4,5
)ﺍﻷﻋﺪﺍﺩ 1ﺇﻟﻰ 6ﺃﻭ ﺍﻟﻌﺪﺩ 9ﺃﻭ ﺍﻷﻋﺪﺍﺩ 11ﺇﻟﻰ (20 1:6,9,11:20
)ﺍﻟﻘﻴﻤﺔ ﺍﻟﻨﺼﻴﺔ "("RED ""RED
)ﺍﻟﻘﻴﻤﺔ ﺍﻟﻨﺼﻴﺔ " "Aﺃﻭ ﺍﻟﻘﻴﻤﺔ ﺍﻟﻨﺼﻴﺔ "("U ""A","U
ﻣﺜﺎﻝ :ﺍﻛﺘﺐ ﺑﺮﻧﺎﻣﺞ ﺗﺒﺪﻳﻞ ﺩﺭﺟﺔ ﺍﻟﻄﺎﻟﺐ ﺇﻟﻰ ﺗﻘﺪﻳﺮ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺗﺮﻛﻴﺒﺔ select case
integer :: deg
character :: eval
read *, deg
print *, eval
end
ﻻﺣﻆ ﺃﻥ ﺍﻟﺒﺮﻧﺎﻣﺞ ﺃﻭﺿﺢ ﻣﻤﺎ ﻛﺎﻥ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺗﺮﻛﻴﺒﺔ .if
ﻣﺜﺎﻝ :ﺍﻛﺘﺐ ﺑﺮﻧﺎﻣﺞ ﺗﺄﺧﺬ ﺭﻗﻢ ﺍﻟﺸﻬﺮ ﺍﻟﻤﻴﻼﺩﻱ ﻭﺗﻌﻄﻲ ﻋﺪﺩ ﺃﻳﺎﻡ ﺍﻟﺸﻬﺮ.
read *, month
)select case (month
)case (1,3,5,7:8,10,12
days = 31
)case (4,6,9,11
days = 30
case default
days = 28
end select
"!print *, "month ", month, " has ", days, " days
end
ﻣﻼﺣﻈﺔ ﻫﺎﻣﺔ:ﺟﻤﻠﺔ EXITﻳﻤﻜﻦ ﺃﻥ ﺗﻮﺿﻊ ﺩﺍﺧﻞ ﺗﺮﻛﻴﺒﺔ doﻛﺄﻱ ﺟﻤﻠﺔ ﺃﺧﺮﻯ ﻭﻋﻨﺪ ﻭﺻﻮﻝ
ﺍﻟﺘﻨﻔﻴﺬ ﺇﻟﻰ ﻫﺬﻩ ﺍﻟﺠﻤﻠﺔ ﺳﻮﻑ ﺗﻨﻬﻲ ﺗﻨﻔﻴﺬ ﺍﻟﺘﺮﻛﻴﺒﺔ ﻭﺗﺮﺳﻞ ﺍﻟﺘﻨﻔﻴﺬ ﺇﻟﻰ ﻣﺎ ﺑﻌﺪ ﻛﻠﻤﺔ ،end doﺃﻣﺎ
ﺟﻤﻠﺔ CYCLEﻓﻬﻲ ﺃﻳﻀﺎً ﻳﻤﻜﻦ ﺃﻥ ﺗﻮﺿﻊ ﺩﺍﺧﻞ ﺗﺮﻛﻴﺒﺔ doﻛﺄﻱ ﺟﻤﻠﺔ ﺃﺧﺮﻯ ﻭﻋﻨﺪ ﻭﺻﻮﻝ
ﺍﻟﺘﻨﻔﻴﺬ ﺇﻟﻰ ﻫﺬﻩ ﺍﻟﺠﻤﻠﺔ ﺳﻮﻑ ﻳﺬﻫﺐ ﺍﻟﺘﻨﻔﻴﺬ ﺇﻟﻰ ﺃﻭﻝ ﺟﻤﻠﺔ ﻓﻲ ﺍﻟﺘﺮﻛﻴﺒﺔ ﺑﻌﺪ ﻛﻠﻤﺔ ،doﺗﺴﺘﺨﺪﻡ
|(D)17 ﻟﻐﺔ ﺍﻟﺒﺮﻣﺠﺔ Fortran 90
read *, n
i=n
f=1
do
f=f*i
i = i-1
if (i==0) exit
enddo
print *, "factorial of ", n, " = ", f
end
ﻋﻨﺪ ﻭﺻﻮﻝ ﺍﻟﺤﺎﺳﻮﺏ ﻟﻬﺬﻩ ﺍﻟﺘﺮﻛﻴﺒﺔ ﻓﺈﻧﻪ ﺳﻮﻑ ﻳﻔﺤﺺ ﺍﻟﺘﻌﺒﻴﺮ ﺍﻟﻤﻨﻄﻘﻲ )ﺍﻟﺸﺮﻁ( ﻭﺇﺫﺍ ﻛﺎﻥ
ﺍﻟﻨﺎﺗﺞ .true.ﻓﺈﻧﻪ ﻳﺒﺪﺃ ﺑﺘﻨﻔﻴﺬ ﺍﻟﺠﻤﻞ ﺍﻟﺪﺍﺧﻠﻴﺔ ﻟﻠﺘﺮﻛﻴﺒﺔ ﻭﻋﻨﺪ ﺍﻟﻮﺻﻮﻝ ﺇﻟﻰ enddoﻳﺮﺟﻊ ﺍﻟﺘﻨﻔﻴﺬ
ﺇﻟﻰ ﺑﺪﺍﻳﺔ ﺍﻟﺘﺮﻛﻴﺒﺔ )ﻓﺤﺺ ﺍﻟﺸﺮﻁ ﻣﻦ ﺟﺪﻳﺪ ﻭﺗﻨﻔﻴﺬ ﻭ ،(...ﺃﻣﺎ ﺇﺫﺍ ﻛﺎﻧﺖ ﻗﻴﻤﺔ ﺍﻟﺘﻌﺒﻴﺮ ﺍﻟﻤﻨﻄﻘﻲ
.false.ﻓﺈﻥ ﺍﻟﺘﻨﻔﻴﺬ ﺳﻮﻑ ﻳﻨﺘﻘﻞ ﺇﻟﻰ ﺃﻭﻝ ﺃﻣﺮ ﺑﻌﺪ ﻛﻠﻤﺔ ،enddoﻳﻤﻜﻦ ﺍﺳﺘﺨﺪﺍﻡ ﺟﻤﻠﺘﻲ exitﻭ
cycleﻓﻲ ﺍﻷﻭﺍﻣﺮ ﺍﻟﺪﺍﺧﻠﻴﺔ ﻟﻬﺬﻩ ﺍﻟﺘﺮﻛﻴﺒﺔ ﻛﻤﺎ ﻓﻲ ﺍﻟﺤﺎﻟﺔ ﺍﻟﺴﺎﺑﻘﺔ.
read *, n
i=n
f=1
)dowhile (i>0
f=f*i
i = i-1
enddo
print *, "factorial of ", n, " = ", f
end
ﺍﻟﺠﻮﺍﺏ:
integer :: a, b, c, N
|(D)18 ﻟﻐﺔ ﺍﻟﺒﺮﻣﺠﺔ Fortran 90
read *, N
a=1
b=1
c=2
print *, a, b, c
ﺱ :ﻫﻞ ﺍﻟﺒﺮﻧﺎﻣﺞ ﺻﺤﻴﺢ ﺑﺘﻌﻮﻳﺾ ﺍﻟﺠﻤﻞ ﺍﻟﺪﺍﺧﻠﻴﺔ ﻟﺘﺮﻛﻴﺒﺔ doﻛﻤﺎ ﻳﻠﻲ؟
c=a+b
b=c
a=b
ﻭﻫﺬﻩ ﺍﻟﺘﺮﻛﻴﺒﺔ ﺗﻌﻤﻞ ﻋﻤﻞ ﺗﺮﻛﻴﺒﺔ for – nextﻓﻲ ﻟﻐﺔ ﺍﻟﺒﻴﺴﻚ ،ﻓﻌﻨﺪ ﻭﺻﻮﻝ ﺍﻟﺤﺎﺳﻮﺏ ﺇﻟﻰ
ﻫﺬﻩ ﺍﻟﺘﺮﻛﻴﺒﺔ ﻷﻭﻝ ﻣﺮﺓ ﻓﺈﻧﻪ ) (1ﺳﻮﻑ ﻳﻌﻄﻲ ﺍﻟﻤﺘﻐﻴﺮ ﺍﻟﻤﺴﻴﻄﺮ ﺍﻟﻘﻴﻤﺔ ﺍﻟﺒﺪﺍﺋﻴﺔ ﻭ) (2ﻳﻘﺎﺭﻥ ﻗﻴﻤﺔ
ﺍﻟﻤﺘﻐﻴﺮ ﻣﻊ ﺍﻟﻘﻴﻤﺔ ﺍﻟﻨﻬﺎﺋﻴﺔ ﻓﺈﺫﺍ ﻛﺎﻧﺖ ﺃﺻﻐﺮ ﺃﻭ ﺗﺴﺎﻭﻱ ﻟﻠﻘﻴﻤﺔ ﺍﻟﻨﻬﺎﺋﻴﺔ ﻓﺈﻧﻪ ﺳﻴﺒﺪﺃ ﺑﺘﻨﻔﻴﺬ ﺟﻤﻞ
ﺍﻟﺘﺮﻛﻴﺒﺔ ﺍﻟﺪﺍﺧﻠﻴﺔ ﻭﺇﺫﺍ ﻛﺎﻧﺖ ﻗﻴﻤﺔ ﺍﻟﻤﺘﻐﻴﺮ ﺍﻟﻤﺴﻴﻄﺮ ﺃﻛﺒﺮ ﻣﻦ ﺍﻟﻘﻴﻤﺔ ﺍﻟﻨﻬﺎﺋﻴﺔ ﻓﺈﻧﻪ ﻳﻨﻘﻞ ﺍﻟﺘﻨﻔﻴﺬ ﺇﻟﻰ
ﺍﻟﺠﻤﻠﺔ ﺍﻟﺘﻲ ﺗﻠﻲ ، end doﻋﻨﺪ ﺍﻟﻮﺻﻮﻝ ﺇﻟﻰ ﻧﻬﺎﻳﺔ ﺍﻟﺘﺮﻛﻴﺒﺔ ﻓﺈﻥ ﺍﻟﺤﺎﺳﻮﺏ ﺳﻮﻑ ﻳﺮﺟﻊ ﺇﻟﻰ
ﺑﺪﺍﻳﺘﻬﺎ ﻭﻳﻀﻴﻒ ﺑﻤﻘﺪﺍﺭ ﺍﻟﺨﻄﻮﺓ ﻋﻠﻰ ﻗﻴﻤﺔ ﺍﻟﻤﺘﻐﻴﺮ ﺍﻟﻤﺴﻴﻄﺮ ﻭﻳﻘﺎﺭﻧﻪ ﻣﻊ ﺍﻟﻘﻴﻤﺔ ﺍﻟﻨﻬﺎﺋﻴﺔ ...
ﻳﻤﻜﻦ ﺗﻠﺨﻴﺺ ﻫﺬﺍ ﺍﻟﺸﺮﺡ ﺑﻜﺘﺎﺑﺔ ﻣﻌﺎﺩﻝ ﻟﻬﺬﻩ ﺍﻟﺘﺮﻛﻴﺒﺔ ﻛﻤﺎ ﻳﻠﻲ:
ﻣﻼﺣﻈﺔ :ﻫﺬﺍ ﺍﻟﻤﻌﺎﺩﻝ ﻟﻴﺲ ﺻﺤﻴﺤﺎ ﻓﻲ ﺣﺎﻟﺔ ﺍﺳﺘﺨﺪﺍﻡ ﺍﻷﻣﺮ cycleﻓﻲ ﺍﻟﺠﻤﻞ ﺍﻟﺪﺍﺧﻠﻴﺔ ﻭﻣﻊ
ﺫﻟﻚ ﻓﺈﻧﻪ ﻳﻌﻄﻲ ﻓﻜﺮﺓ ﺑﺴﻴﻄﺔ ﺣﻮﻝ ﻫﺬﻩ ﺍﻟﺘﺮﻛﻴﺒﺔ.
ﻣﻼﺣﻈﺔ ﻫﺎﻣﺔ :ﻓﻲ ﺣﺎﻟﺔ ﻋﺪﻡ ﻛﺘﺎﺑﺔ ﺍﻟﺨﻄﻮﺓ ﻓﺈﻥ ﺍﻟﺤﺎﺳﻮﺏ ﺳﻮﻑ ﻳﺴﺘﺨﺪﻡ ) (1ﻟﻬﺬﺍ ﺍﻟﺠﺰﺀ.
ﻣﻼﺣﻈﺔ ﻫﺎﻣﺔ :ﻳﺠﺐ ﺍﻻﺑﺘﻌﺎﺩ ﻋﻦ ﺍﺳﺘﺨﺪﺍﻡ ﻣﺘﻐﻴﺮ ﺣﻘﻴﻘﻲ ﻟﻠﺴﻴﻄﺮﺓ ﻋﻠﻰ ﺗﻨﻔﻴﺬ ﻫﺬﻩ ﺍﻟﺘﺮﻛﻴﺒﺔ
ﻭﺍﻻﻛﺘﻔﺎﺀ ﺑﺎﻟﻤﺘﻐﻴﺮ ﻣﻦ ﺍﻟﻨﻮﻉ ﺍﻟﺼﺤﻴﺢ.
|(D)19 ﻟﻐﺔ ﺍﻟﺒﺮﻣﺠﺔ Fortran 90
Arrays ﺍﻟﻤﺼﻔﻮﻓﺎﺕ
ﺍﻟﻤﺼﻔﻮﻓﺔ ﻫﻲ ﻣﺠﻤﻮﻋﺔ ﻣﻦ ﺧﻼﻳﺎ ﺍﻟﺬﺍﻛﺮﺓ ﺗﺴﻤﻰ ﺑﺎﺳﻢ ﻭﺍﺣﺪ ﻭﻳﺘﻢ ﺍﻟﺘﻤﻴﻴﺰ ﻣﺎ ﺑﻴﻦ ﺍﻟﺨﻼﻳﺎ
ﺑﺎﺳﺘﺨﺪﺍﻡ ﻋﺪﺩ ﺻﺤﻴﺢ ﻳﺴﻤﻰ ﺍﻟﻤﻤﻴﺰ ).(index
ﻣﺜﺎﻝ:
integer, dimension(10:20) :: a
ﻳﻌﻠﻦ ﻋﻦ ﻣﺼﻔﻮﻓﺔ ﺑﺎﺳﻢ aﺗﺨﺰﻥ ﺃﻋﺪﺍﺩ ﺻﺤﻴﺤﺔ ﺗﻜﻮﻥ ﺧﻼﻳﺎﻫﺎ ﻣﺮﻗﻤﺔ ﻣﻦ 10ﺇﻟﻰ 11) 20
ﺧﻠﻴﺔ( ﻳﻤﻜﻦ ﺭﺳﻢ ﻫﺬﻩ ﺍﻟﻤﺼﻔﻮﻓﺔ ﻛﻤﺎ ﻳﻠﻲ:
a 10 11 12 13 14 15 16 17 18
19 20
logical,dimension(-10:10) :: good
ﻳﻌﻠﻦ ﻋﻦ ﻣﺼﻔﻮﻓﺔ ﺑﺎﺳﻢ goodﺗﺨﺰﻥ ﻛﻞ ﺧﻠﻴﺔ ﻣﻨﻬﺎ ﻗﻴﻤﺔ ﻣﻨﻄﻘﻴﺔ ) .true.ﺃﻭ (.false.
ﻭﺗﻜﻮﻥ ﺧﻼﻳﺎ ﺍﻟﻤﺼﻔﻮﻓﺔ ﻣﺮﻗﻤﺔ ﻣﻦ -10ﺇﻟﻰ 21) 10ﺧﻠﻴﺔ(
ﻳﺘﻢ ﺍﻟﻮﺻﻮﻝ ﺇﻟﻰ ﺧﻠﻴﺔ ﺩﺍﺧﻞ ﻣﺼﻔﻮﻓﺔ ﺑﻜﺘﺎﺑﺔ ﺍﺳﻢ ﺍﻟﻤﺼﻔﻮﻓﺔ ﺛﻢ ﺭﻗﻢ ﺍﻟﺨﻠﻴﺔ ﺍﻟﻤﻄﻠﻮﺑﺔ ﺩﺍﺧﻞ
|(D)20 ﻟﻐﺔ ﺍﻟﺒﺮﻣﺠﺔ Fortran 90
ﻗﻮﺳﻴﻦ.
ﻣﺜﺎﻝ:
integer, dimension(3) :: n
n(1) = 2
n(2) = 7
n(3) = n(1) * n(2) / 11
)print *, n(3
end
ﺍﻟﺒﺮﻧﺎﻣﺞ ﺑﺎﻟﻠﻐﺔ ﺍﻟﻌﺮﺑﻴﺔ:
ﺍﺣﺠﺰ ﻓﻲ ﺍﻟﺬﺍﻛﺮﺓ ﻣﻜﺎﻥ ﻟﻤﺼﻔﻮﻓﺔ ﻣﻦ ﺛﻼﺙ ﺧﻼﻳﺎ ﻟﺨﺰﻥ ﺃﻋﺪﺍﺩ ﺻﺤﻴﺤﺔ ﺑﺎﺳﻢ n
ﺿﻊ ﻓﻲ ﺍﻟﺨﻠﻴﺔ ﺍﻷﻭﻟﻰ ﻣﻦ ﺍﻟﻤﺼﻔﻮﻓﺔ nﺍﻟﻌﺪﺩ 2
ﺿﻊ ﻓﻲ ﺍﻟﺨﻠﻴﺔ ﺍﻟﺜﺎﻧﻴﺔ ﻣﻦ ﺍﻟﻤﺼﻔﻮﻓﺔ nﺍﻟﻌﺪﺩ 7
ﺍﺿﺮﺏ ﻣﺤﺘﻮﻯ ﺍﻟﺨﻠﻴﺔ ﺍﻷﻭﻟﻰ ﻓﻲ ﺍﻟﻤﺼﻔﻮﻓﺔ nﻓﻲ ﻣﺤﺘﻮﻯ ﺍﻟﺨﻠﻴﺔ ﺍﻟﺜﺎﻧﻴﺔ ﻓﻲ ﺍﻟﻤﺼﻔﻮﻓﺔ n
ﻭﻗﺴﻢ ﻧﺎﺗﺞ ﺍﻟﻀﺮﺏ ﻋﻠﻰ ﺍﻟﻌﺪﺩ 11ﻭﺿﻊ ﻧﺎﺗﺞ ﺍﻟﻘﺴﻤﺔ ﻓﻲ ﺍﻟﺨﻠﻴﺔ ﺍﻟﺜﺎﻟﺜﺔ ﻓﻲ ﺍﻟﻤﺼﻔﻮﻓﺔ n
ﺍﻃﺒﻊ ﻗﻴﻤﺔ ﺍﻟﺨﻠﻴﺔ ﺍﻟﺜﺎﻟﺜﺔ ﻓﻲ ﺍﻟﻤﺼﻔﻮﻓﺔ n
ﻧﻬﺎﻳﺔ ﺍﻟﺒﺮﻧﺎﻣﺞ
ﺍﺳﺘﺨﺪﺍﻡ ﺍﻟﻤﺼﻔﻮﻓﺎﺕ
ﺗﺘﻤﺘﻊ ﻟﻐﺔ ﺍﻟﻔﻮﺭﺗﺮﺍﻥ ﺑﺈﻣﻜﺎﻧﻴﺎﺕ ﻧﺎﺩﺭﺓ ﻟﻠﺘﻌﺎﻣﻞ ﻣﻊ ﺍﻟﻤﺼﻔﻮﻓﺎﺕ ﺇﺿﺎﻓﺔ ﺇﻟﻰ ﺍﻟﻄﺮﻕ ﺍﻻﻋﺘﻴﺎﺩﻳﺔ
ﺍﻟﻤﺴﺘﺨﺪﻣﺔ ﻓﻲ ﻟﻐﺎﺕ ﺍﻟﺒﺮﻣﺠﺔ ﺍﻷﺧﺮﻯ ﻭﺍﻟﺘﻲ ﺗﻢ ﺷﺮﺣﻬﺎ ﻓﻲ ﻓﻘﺮﺓ ﺳﺎﺑﻘﺔ .ﻭﺗﺮﺗﻜﺰ ﻫﺬﻩ ﺍﻹﻣﻜﺎﻧﻴﺎﺕ
ﻋﻠﻰ:
(1ﺍﻟﻤﻤﻴﺰ ﺍﻟﺜﻼﺛﻲ Triple Index
ﻳﻤﻜﻦ ﺍﺳﺘﺨﺪﺍﻡ ﺍﻟﻤﻤﻴﺰ ﺍﻟﺜﻼﺛﻲ ﻻﺧﺘﻴﺎﺭ ﺍﻟﺨﻼﻳﺎ ﺍﻟﻤﻄﻠﻮﺑﺔ ﻭﻳﺘﻜﻮﻥ ﺍﻟﻤﻤﻴﺰ ﺍﻟﺜﻼﺛﻲ ﺃﻣﺎ ) (1ﻣﻦ
ﺭﻗﻤﻴﻦ ﻣﻔﺼﻮﻟﻴﻦ ﺑﺎﻟﻨﻘﻄﺘﻴﻦ ﻳﺤﺪﺩ ﺍﻟﺮﻗﻢ ﺍﻷﻭﻝ ﺍﻟﺤﺪ ﺍﻷﺩﻧﻰ ﻭﺍﻟﺮﻗﻢ ﺍﻟﺜﺎﻧﻲ ﺍﻟﺤﺪ ﺍﻷﻋﻠﻰ ﻷﺭﻗﺎﻡ
ﺍﻟﺨﻼﻳﺎ ﺍﻟﺘﻲ ﻳﺘﻢ ﺍﺧﺘﻴﺎﺭﻫﺎ ﺃﻭ ) (2ﻣﻦ ﺛﻼﺛﺔ ﺃﺭﻗﺎﻡ ﻣﻔﺼﻮﻟﺔ ﺑﺎﻟﻨﻘﻄﺘﻴﻦ ﻳﺤﺪﺩ ﺍﻟﺮﻗﻢ ﺍﻷﻭﻝ ﺍﻟﺤﺪ
ﺍﻷﺩﻧﻰ ﻭﺍﻟﺮﻗﻢ ﺍﻟﺜﺎﻧﻲ ﺍﻟﺤﺪ ﺍﻷﻋﻠﻰ ﻭﺍﻟﺮﻗﻢ ﺍﻟﺜﺎﻟﺚ ﺍﻟﻔﺎﺻﻠﺔ ﺑﻴﻦ ﺍﻟﺨﻠﻴﺘﻴﻦ ﻓﻲ ﺍﻟﻤﺠﺎﻝ ﺍﻟﺬﻱ ﻳﺘﻢ
ﺍﺧﺘﻴﺎﺭﻩ ،ﻭﻳﻤﻜﻦ ﺣﺬﻑ ﺍﻟﺮﻗﻢ ﺍﻷﻭﻝ ﻭ/ﺃﻭ ﺍﻟﺜﺎﻧﻲ ﻭ/ﺃﻭ ﺍﻟﺜﺎﻟﺚ ﻓﻲ ﺍﻟﻤﻤﻴﺰ ﺍﻟﺜﻼﺛﻲ.
ﻣﺜﺎﻝ:
)ﻳﻌﻨﻲ ﺟﻤﻴﻊ ﺍﻟﺨﻼﻳﺎ ﺍﻟﺘﻲ ﻣﻤﻴﺰﻫﺎ ﺃﻛﺒﺮ ﻣﻦ (4 4:
)ﻳﻌﻨﻲ ﺟﻤﻴﻊ ﺍﻟﺨﻼﻳﺎ ﺍﻟﺘﻲ ﻣﻤﻴﺰﻫﺎ ﺃﺻﻐﺮ ﻣﻦ (6 :6
)ﻳﻌﻨﻲ ﺍﻟﺨﻼﻳﺎ 1ﻭ 3ﻭ (5 :6:2
|(D)21 ﻟﻐﺔ ﺍﻟﺒﺮﻣﺠﺔ Fortran 90
(2ﺍﻟﻤﺼﻔﻮﻓﺔ ﺍﻟﺜﺎﺑﺘﺔ
ﻳﻤﻜﻦ ﻛﺘﺎﺑﺔ ﻣﺼﻔﻮﻓﺔ ﻣﻦ ﺍﻟﻘﻴﻢ ﺑﻮﺿﻊ ﺍﻟﻘﻴﻢ ﺩﺍﺧﻞ ﻋﻼﻣﺘﻲ ) /ﻭ (/ﻭﺑﻬﺬﺍ ﺗﺘﻜﻮﻥ ﻣﺼﻔﻮﻓﺔ
ﺛﺎﺑﺘﺔ .ﻣﺜﻞ:
ﻳﻌﻨﻲ ﻣﺼﻔﻮﻓﺔ ﻣﻜﻮﻧﺔ ﻣﻦ ﺍﻟﻘﻴﻢ 12ﻭ 4ﻭ 5ﻭ 9 )(/12, 4, 5, 9/
ﻳﻌﻨﻲ ﻣﺼﻔﻮﻓﺔ ﻣﻜﻮﻧﺔ ﻣﻦ ﺍﻟﻘﻴﻢ 44ﻭ ﻣﺤﺘﻮﻯ ﺍﻟﺨﻠﻴﺔ )(/ 44 , x(5), 20 /
ﺍﻟﺨﺎﻣﺴﺔ ﻓﻲ ﺍﻟﻤﺼﻔﻮﻓﺔ xﻭ ﺍﻟﻘﻴﻤﺔ 20
ﻳﻌﻨﻲ ﻣﺼﻔﻮﻓﺔ ﻣﻜﻮﻧﺔ ﻣﻦ ﺍﻟﻘﻴﻢ 11ﻭ 33ﻭ 10ﻭ 2 )(/ 11, (/33, 10/), 2 /
ﻭﻳﻤﻜﻦ ﺍﺳﺘﺨﺪﺍﻡ ﺍﻟﻤﺼﻔﻮﻓﺔ ﺍﻟﺜﺎﺑﺘﺔ ﺑﺪﻝ ﺍﻟﻤﻤﻴﺰ ﻛﻤﺎ ﺃﻧﻪ ﻳﻤﻜﻦ ﺍﺳﺘﺨﺪﺍﻣﻬﺎ ﻟﺘﻌﻴﻴﻦ ﻣﺠﻤﻮﻋﺔ ﻣﻦ
ﺍﻟﻘﻴﻢ ﻳﻤﻜﻦ ﻧﻘﻠﻬﺎ ﺇﻟﻰ ﻣﺼﻔﻮﻓﺔ ﺃﻭ ﺍﺳﺘﺨﺪﺍﻣﻬﺎ ﻛﻤﺼﻔﻮﻓﺔ ﻛﻤﺎ ﺳﺘﻼﺣﻆ ﻓﻲ ﺍﻷﻣﺜﻠﺔ.
x = 1.0
ﻳﻨﻘﻞ ﺍﻟﻘﻴﻤﺔ 1,0ﺇﻟﻰ ﺟﻤﻴﻊ ﺧﻼﻳﺎ ﺍﻟﻤﺼﻔﻮﻓﺔ ) xﻋﻠﻰ ﺍﻟﻴﻤﻴﻦ ﻗﻴﻤﺔ ﻭﺍﺣﺪﺓ ﻭﻋﻠﻰ ﺍﻟﻴﺴﺎﺭ
ﻣﺼﻔﻮﻓﺔ(
y = y * 3.1
ﻳﻀﺮﺏ ﺟﻤﻴﻊ ﺧﻼﻳﺎ ﺍﻟﻤﺼﻔﻮﻓﺔ yﻓﻲ ﺍﻟﻌﺪﺩ 3,1ﻭﻳﻀﻊ ﺍﻟﻨﺎﺗﺞ ﻓﻲ ﺍﻟﻤﺼﻔﻮﻓﺔ y
)x(1:2) = x(2:1:-1
ﺳﻮﻑ ﻳﻌﻮﺽ ﻗﻴﻢ ﺍﻟﺨﻠﻴﺘﻴﻦ ﺍﻷﻭﻟﻰ ﻭﺍﻟﺜﺎﻧﻴﺔ ﻓﻲ ﺍﻟﻤﺼﻔﻮﻓﺔ ) xﻷﻥ ﻋﻤﻠﻴﺔ ﺍﻟﻨﻘﻞ ﺗﺘﻢ ﻓﻲ ﺧﻄﻮﺓ
ﻭﺍﺣﺪﺓ(
ﺗﺮﻛﻴﺒﺔ Where
ﺗﺴﺘﺨﺪﻡ ﺗﺮﻛﻴﺒﺔ whereﺍﻟﺸﺮﻃﻴﺔ ﻟﻤﺴﺎﻭﺍﺓ )ﺟﻤﻞ ﺗﻌﻴﻴﻦ ﻓﻘﻂ( ﻋﻨﺎﺻﺮ ﻣﺼﻔﻮﻓﺔ ﺑﻌﻨﺎﺻﺮ
ﻣﺼﻔﻮﻓﺔ ﺃﺧﺮﻯ ﺑﺸﺮﻁ ﺻﺤﺔ ﺗﻌﺒﻴﺮ ﻣﻨﻄﻘﻲ.
ﻣﺜﺎﻝ:
integer, dimension(10) :: a, b, c
)where (a/=0
c=b/a
elsewhere
c=1
endwhere
ﻳﻌﻨﻲ ﺃﻳﻨﻤﺎ ﻛﺎﻧﺖ ﺧﻼﻳﺎ ﺍﻟﻤﺼﻔﻮﻓﺔ aﺗﺴﺎﻭﻱ ﺍﻟﺼﻔﺮ ﺿﻊ ﻓﻲ ﺍﻟﻤﺼﻔﻮﻓﺔ cﻧﺎﺗﺞ ﻗﺴﻤﺔ ﺍﻟﺨﻠﻴﺔ
ﺍﻟﻤﺘﻨﺎﻇﺮﺓ ﻓﻲ ﺍﻟﻤﺼﻔﻮﻓﺔ bﻋﻠﻰ ﺍﻟﺨﻠﻴﺔ ﺍﻟﻤﺘﻨﺎﻇﺮﺓ ﻓﻲ ﺍﻟﻤﺼﻔﻮﻓﺔ aﻭﻓﻲ ﺑﺎﻗﻲ ﺍﻟﺤﺎﻻﺕ ﺿﻊ ﻓﻲ
ﺍﻟﻤﺼﻔﻮﻓﺔ cﺍﻟﻌﺪﺩ .1
"names(1) = "basem
"names(2) = "jasem
…
"names(100) = "naser
"x = "naser
end
ﺍﻟﺠﺰﺀ ﺍﻟﻤﺆﻃﺮ ﻣﻦ ﺍﻟﺒﺮﻧﺎﻣﺞ ﻫﻮ ﻣﺎ ﻳﻘﻮﻡ ﺑﻌﻤﻠﻴﺔ ﺍﻟﺒﺤﺚ.
ﻭﻟﻜﻮﻥ ﻃﺮﻳﻘﺔ ﺍﻟﺒﺤﺚ ﻫﺬﻩ ﺑﻄﻴﺌﺔ ﻭﻣﻜﻠﻔﺔ ﻛﻮﻧﻬﺎ ﺗﻘﺎﺭﻥ ﺟﻤﻴﻊ ﺧﻼﻳﺎ ﺍﻟﻤﺼﻔﻮﻓﺔ ﻣﻊ ﺍﻟﻘﻴﻤﺔ
ﺍﻟﻤﻄﻠﻮﺑﺔ؛ ﺗﺴﺘﺨﺪﻡ ﻃﺮﻳﻘﺔ ﺃﺧﺮﻯ ﻓﻲ ﻟﻠﺒﺤﺚ ﺗﻜﻮﻥ ﺃﺳﺮﻉ ﻭﻫﺬﻩ ﺍﻟﻄﺮﻳﻘﺔ ﺗﺴﺘﺨﺪﻡ ﻣﻨﺬ ﻓﺘﺮﺓ ﻃﻮﻳﻠﺔ
ﻓﻲ ﺍﻟﺒﺤﺚ ﻋﻦ ﺍﻟﻜﻠﻤﺎﺕ ﺩﺍﺧﻞ ﺍﻟﻘﺎﻣﻮﺱ ،ﻭﻳﺘﻢ ﺫﻟﻚ ﺑﺘﺮﺗﻴﺐ ﻛﻠﻤﺎﺕ ﺍﻟﻘﺎﻣﻮﺱ ﻗﺒﻞ ﻋﻤﻠﻴﺔ ﺍﻟﺒﺤﺚ ﻟﻤﺮﺓ
ﻭﺍﺣﺪﺓ ﻭﻫﺬﺍ ﺳﻮﻑ ﻳﺨﻠﺼﻨﺎ ﻣﻦ ﻋﻤﻠﻴﺎﺕ ﻛﺜﻴﺮﺓ ﻓﻲ ﺍﻟﻤﺮﺍﺣﻞ ﺍﻟﺘﺎﻟﻴﺔ.
"names(1) = "ahmad
"names(2) = "basem
"names(3) = "ghasem
...
"names(30) = "jasem
|(D)24 ﻟﻐﺔ ﺍﻟﺒﺮﻣﺠﺔ Fortran 90
...
"names(100) = "wael
"x = "ghasem
i=1
j = 100
)dowhile (i =/ j
m = (i+j) / 2
if (x > names(m)) then
i = m+1
else
j=m
endif
enddo
end
ﻣﻦ ﺍﻟﻮﺍﺿﺢ ﺃﻧﻪ ﺑﻌﺪ ﻛﻞ ﻣﻘﺎﺭﻧﺔ ﻳﺘﻢ ﺣﺬﻑ ﻧﺼﻒ ﻣﺠﺎﻝ ﺍﻟﺒﺤﺚ ﻳﺤﺚ ﺑﻬﺬﻩ ﺍﻟﻤﻘﺎﺭﻧﺔ ﺍﻟﻮﺍﺣﺪﺓ ﻳﺘﻢ
ﺍﻟﺘﺄﻛﺪ ﻣﻦ ﺃﻥ ﺍﻟﻘﻴﻤﺔ ﺍﻟﻤﺮﺍﺩ ﺍﻟﺒﺤﺚ ﻋﻨﻬﺎ ﻟﻴﺴﺖ ﻣﻮﺟﻮﺩ ﻓﻲ ﺇﺣﺪﻯ ﻧﺼﻔﻲ ﺍﻟﻤﺼﻔﻮﻓﺔ ﺍﻟﻤﺘﺒﻘﻴﺔ؛ ﻟﻬﺬﺍ
ﻓﻠﻤﺼﻔﻮﻓﺔ ﻣﻦ nﺧﻠﻴﺔ ﻳﺘﻢ ﺇﺑﻘﺎﺀ ﺧﻠﻴﺔ ﻭﺍﺣﺪﺓ ﻓﻘﻂ ﺑﻌﺪ log2 nﻋﻤﻠﻴﺔ ﻣﻘﺎﺭﻧﺔ) .ﻣﺜﻼ :ﺍﻟﺒﺤﺚ ﻓﻲ
ﻣﺼﻔﻮﻓﺔ ﻣﻦ 1024ﺧﻠﻴﺔ ﺑﻌﺪ ﻣﻘﺎﺭﻧﺔ ﻭﺍﺣﺪﺓ ﻳﺼﺒﺢ ﺍﻟﺒﺤﺚ ﻓﻲ ﻣﺼﻔﻮﻓﺔ ﻣﻦ 512ﺧﻠﻴﺔ ﺑﻌﺪ
ﻣﻘﺎﺭﻧﺔ ﺛﺎﻧﻴﺔ ﻳﺼﺒﺢ ﺍﻟﺒﺤﺚ ﻓﻲ ﻣﺼﻔﻮﻓﺔ ﻣﻦ 256ﺧﻠﻴﺔ ﺑﻌﺪ ﻣﻘﺎﺭﻧﺔ ﺛﺎﻟﺜﺔ ﻳﺼﺒﺤﺎﻟﺒﺤﺚ ﻓﻲ
ﻣﺼﻔﻮﻓﺔ ﻣﻦ 128ﺧﻠﻴﺔ ﺑﻌﺪ ﻣﻘﺎﺭﻧﺔ ﺭﺍﺑﻌﺔ ﻳﺼﺒﺢ ﺍﻟﺒﺤﺚ ﻓﻲ ﻣﺼﻔﻮﻓﺔ ﻣﻦ 64ﺧﻠﻴﺔ ﺑﻌﺪ ﻣﻘﺎﺭﻧﺔ
ﺧﺎﻣﺴﺔ ﻳﺼﺒﺢ ﺍﻟﺒﺤﺚ ﻓﻲ ﻣﺼﻔﻮﻓﺔ ﻣﻦ 32ﺧﻠﻴﺔ ﺑﻌﺪ ﻣﻘﺎﺭﻧﺔ ﺳﺎﺩﺳﺔ ﻳﺼﺒﺢ ﺍﻟﺒﺤﺚ ﻓﻲ ﻣﺼﻔﻮﻓﺔ
ﻣﻦ 16ﺧﻠﻴﺔ ﺑﻌﺪ ﻣﻘﺎﺭﻧﺔ ﺳﺎﺑﻌﺔ ﻳﺼﺒﺢ ﺍﻟﺒﺤﺚ ﻓﻲ ﻣﺼﻔﻮﻓﺔ ﻣﻦ 8ﺧﻼﻳﺎ ﺑﻌﺪ ﻣﻘﺎﺭﻧﺔ ﺛﺎﻣﻨﺔ ﻳﺼﺒﺢ
ﺍﻟﺒﺤﺚ ﻓﻲ ﻣﺼﻔﻮﻓﺔ ﻣﻦ 4ﺧﻼﻳﺎ ﺑﻌﺪ ﻣﻘﺎﺭﻧﺔ ﺗﺎﺳﻌﺔ ﻳﺼﺒﺢ ﺍﻟﺒﺤﺚ ﻓﻲ ﻣﺼﻔﻮﻓﺔ ﻣﻦ 2ﺧﻼﻳﺎ ﺑﻌﺪ
ﻣﻘﺎﺭﻧﺔ ﻋﺎﺷﺮﺓ ﻳﺼﺒﺢ ﺍﻟﺒﺤﺚ ﻓﻲ ﻣﺼﻔﻮﻓﺔ ﻣﻦ ﺧﻠﻴﺔ ﻭﺍﺣﺪﺓ ﻭﻫﻨﺎ ﻻ ﻧﺤﺘﺎﺝ ﺇﻻ ﻟﻠﺘﺄﻛﺪ ﻣﻦ ﺃﻥ ﻫﺬﻩ
ﺍﻟﺨﻠﻴﺔ ﺗﺤﺘﻮﻱ ﻋﻠﻰ ﺍﻟﻘﻴﻤﺔ ﺍﻟﺘﻲ ﻧﺒﺤﺚ ﻋﻨﻬﺎ ﺃﻡ ﻻ(.
ﺳﺆﺍﻝ :ﻣﺎﺫﺍ ﻳﺘﻐﻴﺮ ﻟﻮ ﺃﺭﺩﻧﺎ ﺍﺳﺘﺨﺪﺍﻡ ﺍﻟﺸﺮﻁ ) x < names(mﺑﺪﻻ ﻣﻦ ) x > names(mﻓﻲ
ﻫﺬﺍ ﺍﻟﺒﺮﻧﺎﻣﺞ؟
ﺳﺆﺍﻝ :ﻣﺎﺫﺍ ﻳﺘﻐﻴﺮ ﻟﻮ ﻛﺎﻧﺖ ﺍﻟﻤﺼﻔﻮﻓﺔ ﻣﺮﺗﺒﺔ ﺗﺮﺗﻴﺒﺎ ﻧﺰﻭﻟﻴﺎً )(descending order؟
ﺍﻟﻔﺮﻋﻴﺔ ﻫﻲ ﺍﻟﺘﺨﻠﺺ ﻣﻦ ﺗﻔﺎﺻﻴﻞ ﺍﻟﻌﻤﻠﻴﺎﺕ ﺑﺎﺳﺘﺪﻋﺎﺋﻬﺎ ﺑﺎﺳﻤﻬﺎ ﻓﻘﻂ ﻣﻤﺎ ﻳﻤﻜﻦ ﻓﺮﻕ ﺍﻟﺒﺮﻣﺠﺔ ﻣﻦ
ﺗﻘﺴﻴﻢ ﺍﻟﻌﻤﻞ ﻭﺍﺳﺘﺨﺪﺍﻡ ﻣﻨﺘﺠﺎﺕ ﻋﻤﻞ ﺍﻵﺧﺮﻳﻦ )ﺍﻟﺒﺮﺍﻣﺞ ﺍﻟﻔﺮﻋﻴﺔ ﺍﻟﺘﻲ ﻳﻜﺘﺒﻬﺎ ﺑﺎﻗﻲ ﺃﻋﻀﺎﺀ
ﺍﻟﻔﺮﻳﻖ( ﻓﻲ ﺍﻟﻤﺸﺮﻭﻉ.
ﻭﻫﻨﺎﻙ ﻧﻮﻋﻴﻦ ﻣﻦ ﺍﻟﺒﺮﺍﻣﺞ ﺍﻟﻔﺮﻋﻴﺔ ﻓﻲ ﺍﻟﻔﻮﺭﺗﺮﺍﻥ ﻭﻫﻤﺎ ) (1ﺍﻟﺮﻭﺗﻴﻦ ﺍﻟﻔﺮﻋﻲ subroutine
ﻭﻫﻮ ﺍﻟﺒﺮﻧﺎﻣﺞ ﺍﻟﻔﺮﻋﻲ ﺍﻟﺬﻱ ﻳﺄﺧﺬ ﻣﺪﺧﻼﺕ ﻭﻻ ﻳﺮﺟﻊ ﻧﺎﺗﺞ ﻭ) (2ﺍﻟﺪﺍﻟﺔ functionsﻭﻫﻮ
ﺍﻟﺒﺮﻧﺎﻣﺞ ﺍﻟﻔﺮﻋﻲ ﺍﻟﺬﻱ ﻳﺄﺧﺬ ﻣﺪﺧﻼﺕ ﻭﻳﺮﺟﻊ ﻧﺎﺗﺞ ﺑﺎﺳﺘﺨﺪﺍﻡ ﻫﺬﻩ ﺍﻟﻤﺪﺧﻼﺕ.
ﺍﻟﺮﻭﺗﻴﻦ ﺍﻟﻔﺮﻋﻲ:
ﻭﻳﻜﺘﺐ ﺍﻹﻋﻼﻥ ﻟﻠﺮﻭﺗﻴﻦ ﺍﻟﻔﺮﻋﻲ ﺑﺎﻟﺸﻜﻞ ﺍﻟﺘﺎﻟﻲ:
), ...ﺍﻟﻌﺎﻣﻞ ﺍﻟﺜﺎﻧﻲ ,ﺍﻟﻌﺎﻣﻞ ﺍﻷﻭﻝ( ﺍﺳﻢ ﺍﻟﺒﺮﻧﺎﻣﺞ ﺍﻟﻔﺮﻋﻲ SUBROUTINE
ﺍﻟﺠﻤﻞ ﺍﻟﺒﺮﻣﺠﻴﺔ
END SUBROUTINE
ﺃﻣﺎ ﺍﻻﺳﺘﺪﻋﺎﺀ ﻓﻴﻜﺘﺐ ﺑﺎﻟﺸﻜﻞ ﺍﻟﺘﺎﻟﻲ:
), ...ﺍﻟﻌﺎﻣﻞ ﺍﻟﺜﺎﻧﻲ ,ﺍﻟﻌﺎﻣﻞ ﺍﻷﻭﻝ( ﺍﺳﻢ ﺍﻟﺒﺮﻧﺎﻣﺞ ﺍﻟﻔﺮﻋﻲ CALL
ﻣﺜﺎﻝ:
)SUBROUTINE SWAP(A, B
INTEGER :: A, B, temp
temp = A
A=B
B = temp
END SUBROUTINE
PROGRAM main
INTEGER :: X, Y
X = 19
X=7
PRINT *, X, Y
)CALL SWAP(X, Y
PRINT *, X, Y
END
ﺍﻟﺪﺍﻟﺔ:
ﻭﻳﻜﺘﺐ ﺍﻹﻋﻼﻥ ﻟﻠﺪﺍﻟﺔ ﺑﺎﻟﺸﻜﻞ ﺍﻟﺘﺎﻟﻲ:
)ﻣﺘﻐﻴﺮ ﺍﻟﻨﺎﺗﺞ(, ...) RESULTﺍﻟﻌﺎﻣﻞ ﺍﻟﺜﺎﻧﻲ ,ﺍﻟﻌﺎﻣﻞ ﺍﻷﻭﻝ( ﺍﺳﻢ ﺍﻟﺪﺍﻟﺔ FUNCTION
ﺍﻟﺠﻤﻞ ﺍﻟﺒﺮﻣﺠﻴﺔ
END FUNCTION
ﺃﻣﺎ ﺍﻻﺳﺘﺪﻋﺎﺀ ﻓﻴﻜﺘﺐ ﺑﺎﻟﺸﻜﻞ ﺍﻟﺘﺎﻟﻲ:
), ...ﺍﻟﻌﺎﻣﻞ ﺍﻟﺜﺎﻧﻲ ,ﺍﻟﻌﺎﻣﻞ ﺍﻷﻭﻝ( ﺍﺳﻢ ﺍﻟﺪﺍﻟﺔ
ﻭﻳﻤﻜﻦ ﺃﻥ ﻳﺴﺘﺨﺪﻡ ﻛﺠﺰﺀ ﻣﻦ ﺗﻌﺒﻴﺮ.
|(D)26 ﻟﻐﺔ ﺍﻟﺒﺮﻣﺠﺔ Fortran 90
PROGRAM TESTC
INTEGER :: C
)n = C(10, 4
PRINT *, n
END
PROGRAM TESTC
INTEGER :: C
)n = C(10, 4
PRINT *, n
END
Recursion ﺍﻹﺭﺟﺎﻉ
ﻳﺴﻤﻰ ﺍﻟﺒﺮﻧﺎﻣﺞ ﺍﻟﻔﺮﻋﻲ ﺍﻟﺬﻱ ﻳﺴﺘﺪﻋﻲ ﻧﻔﺴﻪ ﻣﻦ ﺟﺪﻳﺪ ﻟﻠﺤﺼﻮﻝ ﻋﻠﻰ ﺍﻟﺠﻮﺍﺏ ﺇﺭﺟﺎﻋﻲ
) (RECURSIVEﻭﻟﻜﺘﺎﺑﺔ ﺍﻟﺒﺮﺍﻣﺞ ﺍﻟﻔﺮﻋﻲ ﺍﻹﺭﺟﺎﻋﻲ ﻳﺠﺐ ﺇﺿﺎﻓﺔ ﻛﻠﻤﺔ RECURSIVEﻓﻲ
|(D)27 ﻟﻐﺔ ﺍﻟﺒﺮﻣﺠﺔ Fortran 90
ﺑﺪﺍﻳﺔ ﺍﻹﻋﻼﻥ.
ﺗﻮﺟﺪ ﻧﻘﻄﺔ ﻣﻬﻤﺔ ﺟﺪﺍً ﻓﻲ ﻛﺘﺎﺑﺔ ﺍﻟﺒﺮﺍﻣﺞ ﺍﻟﻔﺮﻋﻴﺔ ﺍﻻﺭﺟﺎﻋﻴﺔ ﻭﻫﻲ ﺃﻥ ﻳﺘﻮﻗﻒ ﺍﻹﺭﺟﺎﻉ
)ﺍﺳﺘﺪﻋﺎﺀ ﺍﻟﺒﺮﻧﺎﻣﺞ( ﻟﻨﻔﺴﻪ ﻓﻲ ﺍﻟﻨﻬﺎﻳﺔ ﻟﻜﻲ ﻳﻘﻊ ﺍﻟﺘﻨﻔﻴﺬ ﻓﻲ ﺩﻭﺭ ﻻ ﻣﺘﻨﺎﻫﻲ ﻣﻦ ﺍﻹﺭﺟﺎﻋﺎﺕ.
PROGRAM TEST
INTEGER :: FACTORIAL
INTEGER :: A
)A = FACTORIAL(10
PRINT *, A
END
ﻣﻼﺣﻈﺔ ﻫﺎﻣﺔ ﺟﺪﺍ :ﻳﺠﺐ ﺍﻹﻋﻼﻥ ﻋﻦ ﻧﻮﻉ ﺍﻟﺪﺍﻟﺔ ﻓﻲ ﺍﻟﻤﻜﺎﻥ ﺍﻟﺬﻱ ﻧﺤﺘﺎﺝ ﻻﺳﺘﺨﺪﺍﻣﻪ ﻭﻗﺪ ﺗﻢ
ﺫﻟﻚ ﻓﻲ ﻫﺬﺍ ﺍﻟﻤﺜﺎﻝ ﺑﺎﻟﺴﻄﺮ
INTEGER :: FACTORIAL
ﻣﻼﺣﻈﺔ :ﺍﺳﺘﺪﻋﺎﺀ ﺩﺍﻟﺔ FACTORIALﻟﻨﻔﺴﻬﺎ ﻳﺘﻢ ﻓﻲ ﻇﺮﻭﻑ ﻣﻌﻴﻨﺔ ،ﺃﻳﻀﺎ ﻛﻠﻤﺎ ﺍﺳﺘﺪﻋﺖ
ﺍﻟﺪﺍﻟﺔ ﻧﻔﺴﻬﺎ ﻣﻦ ﺟﺪﻳﺪ ﻳﻜﻮﻥ ﺍﻻﺳﺘﺪﻋﺎﺀ ﺍﻟﺠﺪﻳﺪ ﺃﻗﺮﺏ ﺇﻟﻰ ﺷﺮﻭﻁ ﻋﺪﻡ ﺍﻻﺳﺘﺪﻋﺎﺀ.
DOi = 1, 10
DOj = i+1, 10
IF(A(j)<A(i)) THEN
)t = A(i
)A(i) = A(j
A(j) = t
ENDIF
ENDDO
ENDDO
PRINT *, A
END
ﻭﻟﻜﻦ ﻫﺬﺍ ﺍﻟﺒﺮﻧﺎﻣﺞ ﻳﺴﺘﻐﺮﻕ ﻭﻗﺘﺎً ﻃﻮﻳﻼ ﻟﺘﻨﻔﻴﺬ ﻋﻤﻠﻴﺔ ﺍﻟﻔﺮﺯ ،ﻓﻬﻮ ﻳﺤﺘﺎﺝ ﻣﺜﻼً ﺇﻟﻰ 9ﻋﻤﻠﻴﺎﺕ
ﻣﻘﺎﺭﻧﺔ ﻟﻠﺤﺼﻮﻝ ﻋﻠﻰ ﺃﺻﻐﺮ ﻋﺪﺩ ﻟﻴﻀﻌﻪ ﻓﻲ ﺍﻟﺨﻠﻴﺔ ﺍﻷﻭﻟﻰ ﻭﺇﺫﺍ ﻛﺎﻧﺖ ﺍﻟﻤﺼﻔﻮﻓﺔ ﻣﻜﻮﻧﺔ ﻣﻦ n
2
n )n(n + 1
ﺧﻠﻴﺔ ﻓﺈﻥ ﻋﻤﻠﻴﺔ ﺍﻟﻔﺮﺯ ﺗﺤﺘﺎﺝ ﺇﻟﻰ 2 ≈ 2ﻋﻤﻠﻴﺔ ﻣﻘﺎﺭﻧﺔ ﻭﻫﺬﺍ ﺍﻟﻘﺪﺭ ﻣﻦ ﺍﻟﻌﻤﻠﻴﺎﺕ ﻳﺤﺘﺎﺝ ﺇﻟﻰ
ﻭﻗﺖ ﻃﻮﻳﻞ ﻟﻤﺼﻔﻮﻓﺎﺕ ﻟﻴﺴﺖ ﻛﺒﻴﺮﺓ ﺟﺪﺍً.
ﺗﻮﺟﺪ ﻃﺮﻕ ﺃﺧﺮﻯ ﻟﻠﻔﺮﺯ ﻣﻦ ﺃﻫﻤﻬﺎ ﻃﺮﻳﻘﺔ ﺍﻟﻔﺮﺯ ﺍﻟﺴﺮﻳﻊ ﺍﻟﺘﻲ ﺗﺴﺘﺨﺪﻡ ﺃﺳﻠﻮﺑﺘﻘﺴﻴﻢ ﺍﻟﻤﺴﺄﻟﺔ
ﺇﻟﻰ ﻣﺴﺎﺋﻞ ﺃﺻﻐﺮ ﻭﺣﻞ ﺍﻟﻤﺴﺎﺋﻞ ﺍﻟﺼﻐﻴﺮﺓ ﻭﺩﻣﺞ ﺍﻟﻨﻮﺍﺗﺞ ﻟﻠﺤﺼﻮﻝ ﻋﻠﻰ ﺍﻟﻨﺎﺗﺞ ﺍﻟﻨﻬﺎﺋﻲ.
ﺗﻼﺣﻆ ﺃﻥ ﻋﻤﻠﻴﺔ ﺍﻟﻔﺮﺯ ﺍﻟﺴﺮﻳﻊ ﺗﺴﺘﺪﻋﻲ ﻧﻔﺴﻬﺎ ﺑﺸﻜﻞ ﺇﺭﺟﺎﻋﻲ ﻟﺬﻟﻚ ﺳﻴﻜﻮﻥ ﺍﻟﺠﻮﺍﺏ ﻛﻤﺎ
ﻳﻠﻲ:
)RECURSIVESUBROUTINEQuickSort(A, first, last
INTEGER :: first, last
INTEGER, DIMENSION(first:last) :: A
INTEGER :: i, j, chosen, t
i = first
j = last
DO
)DOWHILE (A(i)<=chosen
i = i+1
ENDDO
PROGRAMmain
)INTEGER :: x(6
)x = (/3,4,7,1,2,-3/
PRINT *, x
)CALLQuickSort(x, 1, 6
PRINT *, x
END
ﻣﻼﺣﻈﺔ :ﺍﻟﺪﺍﻟﺔ )( RANDﺗﻌﻄﻲ ﻋﺪﺩ ﻋﺸﻮﺍﺋﻲ ﺑﻴﻦ ﺍﻟﺼﻔﺮ ﻭﺍﻟﻮﺍﺣﺪ ،ﻭﻗﺪ ﺍﺳﺘﺨﺪﻣﺖ ﻓﻲ
ﺍﺧﺘﻴﺎﺭ ﺧﻠﻴﺔ ﺑﺸﻜﻞ ﻋﺸﻮﺍﺋﻲ ﻓﻲ ﺍﻟﻤﺼﻔﻮﻓﺔ.
ﺷﺮﺡ ﺍﻟﺒﺮﻧﺎﻣﺞ :ﻳﺘﻢ ﻓﻲ ﺍﻟﺒﺪﺍﺋﻴﺔ ﺍﺧﺘﻴﺎﺭ ﺧﻠﻴﺔ ﺑﺸﻜﻞ ﻋﺸﻮﺍﺋﻲ ﻣﻦ ﺑﻴﻦ ﺧﻼﻳﺎ ﺍﻟﻤﺼﻔﻮﻓﺔ ،ﺛﻢ
ﻳﺴﺘﺨﺪﻡ ﻣﺆﺷﺮ ﻳﺆﺷﺮ ﺇﻟﻰ ﺑﺪﺍﻳﺔ ﺍﻟﻤﻨﻄﻘﺔ ﺍﻟﻤﺮﺍﺩ ﺗﺮﺗﻴﺒﻬﺎ ﻭﻣﺆﺷﺮ ﻳﺆﺷﺮ ﺇﻟﻰ ﻧﻬﺎﻳﺔ ﻫﺬﻩ ﺍﻟﻤﻨﻄﻘﺔ،
ﻳﺘﻘﺪﻡ ﺍﻟﻤﺆﺷﺮ ﺍﻷﻭﻝ ﺣﺘﻰ ﻳﺼﻞ ﺇﻟﻰ ﻗﻴﻤﺔ ﺃﻛﺒﺮ ﻣﻦ ﺍﻟﻘﻴﻤﺔ ﺍﻟﻤﺨﺘﺎﺭﺓ )ﻗﻴﻤﺔ ﻓﻲ ﺍﻟﺠﺰﺀ ﺍﻷﻭﻝ ﻟﻴﺴﺖ
ﻓﻲ ﻣﻜﺎﻧﻬﺎ( ﺛﻢ ﻳﺘﺮﺍﺟﻊ ﺍﻟﻤﺆﺷﺮ ﺍﻟﺜﺎﻧﻲ ﺣﺘﻰ ﻳﺼﻞ ﺇﻟﻰ ﻗﻴﻤﺔ ﺃﺻﻐﺮ ﺃﻭ ﺗﺴﺎﻭﻱ ﺍﻟﻘﻴﻤﺔ ﺍﻟﻤﺨﺘﺎﺭﺓ
)ﻗﻴﻤﺔ ﻓﻲ ﺍﻟﺠﺰﺀ ﺍﻟﺜﺎﻧﻲ ﻟﻴﺴﺖ ﻓﻲ ﻣﻜﺎﻧﻬﺎ( ﻭﺑﻌﺪ ﺫﻟﻚ ﻳﺘﻢ ﺗﻌﻮﻳﺾ ﻫﺎﺗﻴﻦ ﺍﻟﻘﻴﻤﺘﻴﻦ؛ ﻭﺗﺴﺘﻤﺮ ﻫﺬﻩ
ﺍﻟﻌﻤﻠﻴﺔ ﺣﺘﻰ ﺗﺘﻢ ﻋﻠﻰ ﺟﻤﻴﻊ ﺧﻼﻳﺎ ﺍﻟﻤﺼﻔﻮﻓﺔ .ﻭﻓﻲ ﺍﻟﻨﻬﺎﻳﺔ ﺇﺫﺍ ﻛﺎﻥ ﻛﻞ ﻣﻦ ﺍﻟﺠﺰﺀ ﺍﻷﻭﻝ ﻭﺍﻟﺠﺰﺀ
ﺍﻟﺜﺎﻧﻲ ﻓﻴﻪ ﺃﻛﺜﺮ ﻣﻦ ﺧﻠﻴﺔ ﻳُﺮﺳﻞ ﺇﻟﻰ ﺍﻟﺒﺮﻧﺎﻣﺞ ﺍﻟﻔﺮﻋﻲ ﻧﻔﺴﻪ ﻟﻴﺮﺗﺒﻪ.
ﺍﻟﻄﺒﺎﻋﺔ ﻋﻮﺿﺎ ﻋﻦ ﻋﻼﻣﺔ ﺍﻟﻨﺠﻤﺔ ﻓﻔﻲ ﺣﺎﻟﺔ ﻛﺘﺎﺑﺔ ﺟﻤﻠﺔ ﺍﻹﺧﺮﺍﺝ ﻛﻤﺎ ﻳﻠﻲ:
...ﺗﻌﺒﻴﺮ ﺛﺎﻧﻲ ,ﺗﻌﺒﻴﺮ ﺃﻭﻝ print *,
ﻣﺜﻼً:
"print *, 22, " birds
ﺳﻮﻑ ﻳﻄﺒﻊ ﺍﻟﻔﻮﺭﺗﺮﺍﻥ ﻗﻴﻢ ﺍﻟﺘﻌﺎﺑﻴﺮ ﻣﺘﺘﺎﻟﻴﺔ ﺑﺎﺳﺘﺨﺪﺍﻡ ﻃﺮﻳﻘﺘﻪ ﺍﻻﻓﺘﺮﺍﺿﻴﺔ ﻓﻴﺴﺘﺨﺪﻡ ﻟﻄﺒﺎﻋﺔ
ﺍﻟﻌﺪﺩ ﺍﻟﺼﺤﻴﺢ 11ﺧﺎﻧﺔ )ﻋﻤﻮﺩ( ﻣﻦ ﺍﻟﺴﻄﺮ ﺍﻟﺤﺎﻟﻲ ﻓﻲ ﺍﻟﺸﺎﺷﺔ ﻭﻳﻄﺒﻊ ﺍﻟﻌﺪﺩ 22ﻓﻲ ﺍﻟﺠﻬﺔ
ﺍﻟﻴﻤﻨﻰ ﻣﻦ ﻫﺬﻩ ﺍﻟﺨﺎﻧﺎﺕ ﺛﻢ ﻳﺴﺘﺨﺪﻡ ﺧﺎﻧﺎﺕ ﺑﻘﺪﺭ ﺣﺮﻭﻑ ﺍﻟﻨﺺ )ﺳﺘﺔ ﺧﺎﻧﺎﺕ ﻷﻥ ﺍﻟﺤﺮﻑ ﺍﻷﻭﻝ
ﻓﻲ ﻫﺬﺍ ﺍﻟﻨﺺ ﻫﻮ ﺍﻟﻔﺮﺍﻍ( ﻭﻳﻄﺒﻊ ﻓﻴﻬﺎ ﺍﻟﻘﻴﻤﺔ ﺍﻟﻨﺼﻴﺔ.
ﻣﻼﺣﻈﺔ :ﺇﺫﺍ ﻛﺎﻧﺖ ﻋﺪﺩ ﺍﻟﺨﺎﻧﺎﺕ ﺍﻟﻤﺤﺪﺩﺓ ﻟﻠﻄﺒﺎﻋﺔ ﻻ ﺗﻜﻔﻲ ﻟﻄﺒﺎﻋﺔ ﺍﻟﺘﻌﺒﻴﺮ ﺳﻴﻄﺒﻊ ﺍﻟﻔﻮﺭﺗﺮﺍﻥ
ﻧﺠﻤﺎﺕ ﺑﺤﺠﻢ ﺍﻟﺤﻘﻞ ﺍﻟﻤﺨﺼﺺ ﻟﺘﺒﻴﻴﻦ ﺣﺪﻭﺙ ﻫﺬﺍ ﺍﻟﺨﻄﺄ.
ﻣﻼﺣﻈﺔ :ﺗﻜﺘﺐ ﺻﻴﻎ ﺍﻟﻄﺒﺎﻋﺔ ﻛﻘﻴﻤﺔ ﻧﺼﻴﺔ ﺣﺮﻓﻬﺎ ﺍﻷﻭﻝ ﻭﺍﻷﺧﻴﺮ ﻫﻮ ﻓﺘﺢ ﻭﻏﻠﻖ ﺃﻗﻮﺍﺱ.
(2ﺻﻴﻐﺔ fﻭﺗﺴﺘﺨﺪﻡ ﻟﻄﺒﺎﻋﺔ ﺍﻟﺘﻌﺎﺑﻴﺮ ﺍﻟﺤﻘﻴﻘﻴﺔ ﻭﺗﺄﺧﺬ ﺍﻟﺸﻜﻞ fn.mﺣﻴﺚ ﻳﺤﺪﺩ ﺍﻟﻌﺪﺩ nﻋﺪﺩ
ﺍﻟﺨﺎﻧﺎﺕ ﺍﻟﻜﻠﻲ ﺍﻟﻤﺴﺘﺨﺪﻡ ﻟﻄﺒﺎﻋﺔ ﺍﻟﺘﻌﺒﻴﺮ ﻭﻳﺤﺪﺩ ﺍﻟﻌﺪﺩ mﻋﺪﺩ ﺍﻟﺨﺎﻧﺎﺕ ﺍﻟﺘﻲ ﺗﺴﺘﺨﺪﻡ ﻟﻄﺒﺎﻋﺔ
ﺍﻟﺠﺰﺀ ﺍﻟﻌﺸﺮﻱ.
ﻣﺜﺎﻝ:
a = 3.14
b = 34127.19
print "(f6.1, f6.1)", a, b
ﺳﻮﻑ ﻳﻄﺒﻊ ﻋﻠﻰ ﺍﻟﺸﺎﺷﺔ ﻛﻤﺎ ﻳﻠﻲ:
3 . 1 * * * * * *
(4ﺻﻴﻐﺔ aﻭﺗﺴﺘﺨﺪﻡ ﻟﻄﺒﺎﻋﺔ ﺍﻟﻘﻴﻢ ﺍﻟﻨﺼﻴﺔ ﻭﺗﺄﺧﺬ ﺍﻟﺸﻜﻞ anﺣﻴﺚ ﻳﺤﺪﺩ nﻋﺪﺩ ﺍﻟﺨﺎﻧﺎﺕ
ﺍﻟﺘﻲ ﺗﺴﺘﺨﺪﻡ ﻟﻄﺒﺎﻋﺔ ﺍﻟﻨﺺ ،ﻭﻓﻲ ﺣﺎﻟﺔ ﻋﺪﻡ ﺫﻛﺮ ﺍﻟﻌﺪﺩ nﻓﺈﻥ ﺍﻟﻔﻮﺭﺗﺮﺍﻥ ﺳﻮﻑ ﻳﻄﺒﻊ ﺍﻟﻨﺺ ﺑﻌﺪﺩ
|(D)31 ﻟﻐﺔ ﺍﻟﺒﺮﻣﺠﺔ Fortran 90
ﺃﻣﺜﻠﺔ ﻋﺎﻣﺔ
ﻣﺜﺎﻝ :ﺍﻛﺘﺐ ﺑﺮﻧﺎﻣﺠﺎ ﻟﺤﺴﺎﺏ ﺃﻛﺒﺮﻋﺎﻣﻠﻤﺸﺘﺮﻙ ).(Greatest Common Divisorﻫﻨﺎﻟﻚ
ﻃﺮﻳﻘﺔ ﻟﺤﺴﺎﺏ ﺃﻛﺒﺮ ﻋﺎﻣﻞ ﻣﺸﺘﺮﻙ ﻣﻌﺮﻭﻓﺔ ﺑﺎﺳﻢ ﻃﺮﻳﻘﺔ ﺍﻗﻠﻴﺪﺱ ﻫﻲ )ﺑﻌﺪ ﺗﻐﻴﻴﺮ ﻟﻠﺘﺴﻬﻴﻞ(:
{
a if a = b
( )
= GCD a, b GCD(b, a - )b if a > b
GCD(a,b - a) if a < b
do
if (a > b)then
a=a–b
elseif (a < b) then
b=b–a
else
exit
endif
enddo
PROGRAM QuadraticEquation
IMPLICITNONE
REAL :: a, b, c
REAL :: d, d2
REAL :: x1, x2
READ *, a, b, c
d2 = b*b - 4.0*a*c
IF (a == 0.0) THEN
IF (b == 0.0) THEN
IF (c == 0.0) THEN
PRINT *, "All numbers are roots"
ELSE
PRINT *, "Unsolvable equation"
ENDIF
ELSE
PRINT *, "This is linear equation, root = ", -c/b
ENDIF
ENDPROGRAM QuadraticEquation