Sei sulla pagina 1di 75

‫ﻣﻘﺪﻣﺔ ﺣﻮل اﻟﺤﻮاﺳﻴﺐ‬

C++ ‫واﻟﺒﺮﻣﺠﺔ ﺑﻠﻐﺔ‬

< <<Ø’ËÖ]<Í]‚â_
< <Jhç‰^£]<Ýç×ÃÖ<íé‰^‰ù]<Üéâ^˹]<h^Ãéj‰] Υ

< <Jí¥Ö]<l^Ç×Ö<íË×j~¹]<Å]çÞù]<ÄÚ<ÌÖbjÖ] Υ

< <<JC++<íÇ×e<^Ú<sÚ^ÞÖ<íéqƒç´<†èçŞi<íòée<ÜãÊ Υ

< <<JC++<íÇ×e<¼éŠe<sÚ^Þ†e<íe^jÒ<î×Â<ì…‚ÏÖ]<h^ŠjÒ] Υ

< <JíŞéŠfÖ]<t†}<KØ}‚Ö]<l^Ûé×Ãi<Ý]‚~j‰]<î×Â<ì…‚ÏÖ]<h^ŠjÒ] Υ

< <Jl^éŞÃÛ×Ö<íé‰^‰ù]<Å]çÞù]<ÄÚ<ÌÖbjÖ] Υ

< <<Jíée^Š£]<l^é×ÛÃÖ]<Ý]‚~j‰]<î×Â<ì…‚ÏÖ]<h^ŠjÒ] Υ

< <Jíée^Š£]<l^é×ÛÃÖ]<°e<íèçÖæù]<ÝçãËÚ<h^Ãéj‰] Υ
< <<JíŞéŠfÖ]<…]†ÏÖ]<ƒ^¡]<l^Ûé×Ãi<íe^jÒ<î×Â<ì…‚ÏÖ]<h^ŠjÒ] Υ
‫اﻟﻔﺼﻞ اﻷول‬ ‫‪٢٠‬‬

‫ﻣﻘﺪﻣﺔ‬
‫‪1-1‬‬
‫ﻼ ﺑﻜﻢ ﰲ ﻋﺎﱂ ﺍﻟﱪﳎﺔ ﺑﻠﻐﺔ ‪ ...!! C++‬ﻟﻘﺪ ﻋﻤﻠﻨﺎ ﲜﺪ ﺣﱴ ﻧﻀﻊ ﺑﲔ ﻳﺪﻱ ﺍﻟﻘﺎﺭﺉ ﻛﺘﺎﺑﹰﺎ ﻧﺄﻣﻞ ﺃﻥ‬ ‫ﺃﻫ ﹰ‬
‫ﻳﻜﻮﻥ ﻣُﺜﻘﻔﹰﺎ ﻭﳑﺘﻌﹰﺎ ﻭﻋﻠﻰ ﻣﺴﺘﻮﻯ ﺍﻟﺘﺤﺪﻱ ﳋﻮﺽ ﲡﺮﺑﺔ ﺍﻟﺘﻌﻠﻴﻢ‪ .‬ﺗﻌﺪ ﻟﻐﺔ ‪ C++‬ﻟﻐﺔ ﺻﻌﺒﺔ ﻭﻳﺘﻢ‬
‫ﺗﻌﻠﻴﻤﻬﺎ ﻋﺎﺩ ﹰﺓ ﻟﻠﻤﱪﳎﲔ ﺫﻭﻱ ﺍﳋﱪﺓ‪ .‬ﻟﺬﻟﻚ ﳝﻜﻦ ﺍﻋﺘﺒﺎﺭ ﻫﺬﺍ ﺍﻟﻜﺘﺎﺏ ﻣﺘﻤﻴﺰﹰﺍ ﻣﻘﺎﺭﻧﺔ ﺑﺎﻟﻜﺘﺐ ﺍﻷﺧﺮﻯ‬
‫ﺍﳋﺎﺻﺔ ﺑﻠﻐﺔ ‪ C++‬ﻭﺫﻟﻚ ﻟﻸﺳﺒﺎﺏ ﺍﻟﺘﺎﻟﻴﺔ‪:‬‬
‫ﻼ ﺧﱪﺓ ﺿﻌﻴﻔﺔ ﺃﻭ ﻟﻴﺲ ﻟﺪﻳﻬﻢ ﺃﻳﺔ‬ ‫‪ .1‬ﺃﻧﻪ ﻣﻼﺋﻢ ﻻﻛﺴﺎﺏ ﺗﻘﻨﻴﺎﺕ ﺑﺮﳎﻴﺔ ﻷﻭﻟﺌﻚ ﺍﻟﺬﻳﻦ ﳝﺘﻠﻜﻮﻥ ﺃﺻ ﹰ‬
‫ﲡﺮﺑﺔ ﰲ ﳎﺎﻝ ﺍﻟﱪﳎﺔ‪.‬‬
‫‪ .2‬ﺃﻧﻪ ﻣﻼﺋﻢ ﻟﻠﻤﱪﳎﲔ ﺍﳌﺘﻤﺮﺳﲔ ﻭﺍﻟﺬﻳﻦ ﻳﺒﺤﺜﻮﻥ ﻋﻦ ﺗﻌﻤﻴﻖ ﺗﻌﺎﻣﻠﻬﻢ ﻣﻊ ﻟﻐﺔ ‪.C++‬‬
‫ﻛﻴﻒ ﳝﻜﻦ ﳍﺬﺍ ﺍﻟﻜﺘﺎﺏ ﺃﻥ ﻳﺮﻭﻕ ﻟﻜﻼ ﺍﺠﻤﻟﻤﻮﻋﺘﲔ؟ ﳝﻜﻦ ﺍﻹﺟﺎﺑﺔ ﻋﻠﻰ ﻫﺬﺍ ﺍﻟﺴﺆﺍﻝ ﺑﺎﻟﻘﻮﻝ ﺃﻥ‬
‫ﺍﻟﻠﺐ ﺍﻷﺳﺎﺳﻲ ﻟﻠﻜﺘﺎﺏ ﻳُﻌﲎ ﺑﺈﳒﺎﺯ ﻭﺗﻄﻮﻳﺮ ﺑﺮﺍﻣﺞ ﻭﺍﺿﺤﺔ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺍﻷﺳﺎﻟﻴﺐ ﻭﺍﻟﺘﻘﻨﻴﺎﺕ‬
‫ﺍﳌﱪﻫﻦ ﻋﻨﻬﺎ ﰲ ﺍﻟﱪﳎﺔ ﺍﳌﹸﻬﻴﻜﻠﺔ ‪ Structured Programming‬ﻭﺍﻟﱪﳎﺔ ﻏﺮﺿﻴﻪ ﺍﻟﺘﻮﺟﻪ‬
‫‪ Object Oriented Programming‬ﳑﺎ ﻳﺸﻜﻞ ﻓﺎﺋﺪﺓ ﻛﺒﲑﺓ ﻟﻜﻼ ﺍﻟﻄﺮﻓﲔ‪ .‬ﻟﻜﻦ ﳚﺐ ﺍﻻﻧﺘﺒﺎﻩ ﺇﱃ ﺃﻥ‬
‫ﻏﲑ ﺍﳌﱪﳎﲔ ﺳﻮﻑ ﻳﻘﻮﻣﻮﻥ ﺑﺘﻌﻠﻢ ﺍﻟﱪﳎﺔ ﺑﺎﻷﺳﻠﻮﺏ ﺍﻟﺼﺤﻴﺢ ﺍﻧﻄﻼﻗﺎ ﻣﻦ ﻧﻘﻄﺔ ﺍﻟﺼﻔﺮ‪ .‬ﻟﻘﺪ ﺣﺎﻭﻟﻨﺎ‬
‫ﺗﺄﻟﻴﻒ ﺍﻟﻜﺘﺎﺏ ﺑﺄﺳﻠﻮﺏ ﻭﺍﺿﺢ ﻭﻣﺒﺎﺷﺮ ﻭﻏﲏ ﺑﺎﻷﻣﺜﻠﺔ ﺍﻟﺘﻮﺿﻴﺤﻴﺔ‪ .‬ﻓﻬﻮ ﳛﺘﻮﻱ ﻋﻠﻰ ﻛﻤﻴﺔ ﻭﻓﲑﺓ ﻣﻦ‬
‫ﻧﺼﻮﺹ ﺍﻟﱪﺍﻣﺞ ﺍﳌﻜﺘﻮﺑﺔ ﺑﻠﻐﺔ ‪ C++‬ﻣﻊ ﺗﻮﺿﻴﺢ ﺧﺮﺟﻬﺎ ﻟﺪﻯ ﺗﻨﻔﻴﺬﻫﺎ ﻋﻠﻰ ﺍﳊﺎﺳﺐ‪.‬‬
‫ﻧﺴﻤﻲ ﻫﺬﻩ ﺍﻟﻄﺮﻳﻘﺔ "ﻃﺮﻳﻘﺔ ﺍﻟﻌﺮﺽ ﺍﳌﺒﺎﺷﺮﺓ ﺑﺎﺳﺘﺨﺪﺍﻡ ﻧﺼﻮﺹ ﺍﻟﱪﺍﻣﺞ" )‪ .(Line- Code approach‬ﺗﺘﻮﻓﺮ‬
‫ﲨﻴﻊ ﻫﺬﻩ ﺍﻷﻣﺜﻠﺔ ﺍﻟﱪﳎﻴﺔ ﺿﻤﻦ ﺍﻟﻌﺮﺽ ﺍﳌﻀﻐﻮﻁ ‪ CD- ROM‬ﺍﳌﺼﺎﺣﺐ ﳍﺬﺍ ﺍﻟﻜﺘﺎﺏ‪.‬‬
‫ﺗﻌﺮﺽ ﺍﻟﻔﺼﻮﻝ ﺍﳋﻤﺴﺔ ﺍﻷﻭﱃ ﻣﻦ ﺍﻟﻜﺘﺎﺏ ﺍﻟﻌﺪﻳﺪ ﻣﻦ ﺍﻷﺳﺎﺳﻴﺎﺕ ﺣﻮﻝ ﺍﳊﺎﺳﺐ ﻭﺑﺮﳎﺘﻬﺎ ﻭﺣﻮﻝ‬
‫ﻟﻐﺔ ﺍﻟﱪﳎﺔ ‪ .C++‬ﻟﻘﺪ ﻭﺟﺪ ﺍﳌﺒﺘﺪﺋﻮﻥ ﺍﻟﺬﻳﻦ ﺗﺎﺑﻌﻮﺍ ﺩﺭﻭﺳﻨﺎ ﺍﳌﺮﺳﻮﻣﺔ ﻣﻦ ﺧﻼﻝ ﺍﻟﻜﺘﺎﺏ ﺃﻥ ﺍﻷﻓﻜﺎﺭ‬
‫ﺍﳌﻌﺮﻭﺿﺔ ﰲ ﺍﻟﻔﺼﻮﻝ ﺍﳋﻤﺴﺔ ﺍﻷﻭﱃ ﺗﺸﻜﻞ ﻗﺎﻋﺪﺓ ﺻﻠﺒﺔ ﻣﻦ ﺃﺟﻞ ﺍﻟﺘﻌﺎﻣﻞ ﺍﻟﻌﻤﻴﻖ ﻣﻊ ﻟﻐﺔ ‪ C++‬ﺍﻟﺬﻱ‬
‫ﺗﻘﻮﻡ ﺑﻪ ﺍﻟﻔﺼﻮﻝ ﻣﻦ ﺍﻷﺧﺮﻯ‪ .‬ﺃﺿﻒ ﺇﱃ ﺫﻟﻚ ﺃﻥ ﺍﳌﺘﻤﺮﺳﲔ ﰲ ﺍﻟﱪﳎﺔ ﺍﻟﺬﻳﻦ ﻗﺎﻣﻮﺍ ﺑﻘﺮﺍﺀﺓ ﺳﺮﻳﻌﺔ‬
‫ﻟﻠﻔﺼﻮﻝ ﺍﳋﻤﺴﺔ ﺍﻷﻭﱃ ﻭﺟﺪﻭﺍ ﺃﻥ ﺍﳌﻌﺎﳉﺔ ﻟﻠﻤﻮﺍﺿﻴﻊ ﺍﳌﺘﻌﻠﻘﺔ ﺑـ ‪ C++‬ﺍﳌﻌﺮﻭﺿﺔ ﰲ ﺍﻟﻔﺼﻮﻝ ﻣﻦ‬
‫ﺍﻷﺧﺮﻯ ﺗﺘﻤﻴﺰ ﺑﻜﻮﻬﻧﺎ ﺩﻗﻴﻘﺔ ﻭﺗﺘﺴﻢ ﺑﺎﻟﺘﺤﺪﻱ‪.‬‬
‫ﺍﻟﻜﺜﲑ ﻣﻦ ﺍﻟﻨﺎﺱ ﻫﻢ ﻋﻠﻰ ﺩﺭﺍﻳﺔ ﺑﺎﻷﺷﻴﺎﺀ ﺍﳌﺜﲑﺓ ﺍﻟﱵ ﺗﻘﻮﻡ ﻬﺑﺎ ﺍﳊﻮﺍﺳﺐ‪ ،‬ﻭﺑﺎﺳﺘﺨﺪﺍﻡ ﻫﺬﺍ ﺍﻟﻜﺘﺎﺏ ﺳﻮﻑ‬
‫ﺗﻘﻮﻡ ﺑﺘﻌﻠﻢ ﻛﻴﻒ ﺗﻄﻠﺐ ﻣﻦ ﺍﳊﺎﺳﺐ ﺍﻟﻘﻴﺎﻡ ﲟﺜﻞ ﻫﺬﻩ ﺍﻷﺷﻴﺎﺀ‪ .‬ﻳﺘﻢ ﺍﻟﺘﺤﻜﻢ ﺑﺎﳊﻮﺍﺳﺐ )ﺍﻟﺒﻨﻴﺔ ﺍﻟﺼﻠﺒﺔ‬
‫‪ (Hardware‬ﺑﻮﺍﺳﻄﺔ ﳎﻤﻮﻋﺔ ﻣﻦ ﺍﻟﱪﳎﻴﺎﺕ ﺍﻟﱵ ﺗﺸﻜﻞ ﺍﻟﺒﻨﻴﺔ ﺍﳌﺮﻧﺔ )‪ (software‬ﻟﻪ )ﻭﻫﻲ ﻋﺒﺎﺭﺓ ﻋﻦ ﳎﻤﻮﻋﺔ‬
‫ﻣﻦ ﺍﻟﺘﻌﻠﻴﻤﺎﺕ ﺍﻟﱵ ﻧﻜﺘﺒﻬﺎ ﻟﻠﻄﻠﺐ ﻣﻦ ﺍﳊﺎﺳﺐ ﺍﻟﻘﻴﺎﻡ ﺑﺄﻓﻌﺎﻝ ﻣﻌﻴﻨﺔ ﺃﻭ ﺑﺎﲣﺎﺫ ﻗﺮﺍﺭﺍﺕ ﻣﺎ(‪ ،‬ﻭﺗﻌﺪ ﻟﻐﺔ ‪C++‬‬
‫ﺣﺎﻟﻴﹰﺎ ﻣﻦ ﺃﻛﺜﺮ ﻟﻐﺎﺕ ﺍﻟﱪﳎﺔ ﺷﻌﺒﻴﺔ ﻭﺍﻧﺘﺸﺎﺭﹰﺍ ﻟﺘﻄﻮﻳﺮ ﺍﻟﱪﳎﻴﺎﺕ‪ .‬ﻳﻌﺮﺽ ﻛﺘﺎﺑﻨﺎ ﻫﺬﺍ ﻣﻘﺪﻣﺔ ﻟﻠﱪﳎﺔ ﺑﻠﻐﺔ‬
‫‪ C++‬ﺑﺎﺳﺘﺨﺪﺍﻡ ﻧﺴﺨﺔ ‪ version‬ﻋﻨﻬﺎ ﺧﺎﺿﻌﺔ ﻟﻠﻤﻌﺎﻳﲑ ﺍﳌﺘﺒﻌﺔ ﰲ ﺍﻟﻮﻻﻳﺎﺕ ﺍﳌﺘﺤﺪﺓ ﻭﺍﻟﱵ ﺃﻗﺮﻫﺎ ﺍﳌﻌﻬﺪ‬
‫‪ ،(ANSI) American National Standards Institute‬ﻭﰲ ﺑﻘﻴﺔ ﺑﻠﺪﺍﻥ ﺍﻟﻌﺎﱂ ﻧﺘﻴﺠﺔ ﳉﻬﻮﺩ ﺍﳌﻨﻈﻤﺔ ﺍﻟﻌﺎﳌﻴﺔ‬
‫ﻟﻠﻤﻌﺎﻳﺮﺓ ‪ (ISO) International Standards Organisation‬ﺍﳌﺘﻌﻠﻘﺔ ﻬﺑﺬﺍ ﺍﻟﺼﺪﺩ‪.‬‬
‫‪٢١‬‬ ‫‪ .1‬ﻣﻘﺪﻣﺔ ﺣﻮل اﻟﺤﻮاﺳﻴﺐ واﻟﺒﺮﻣﺠﺔ ﺑﻠﻐﺔ ‪C++‬‬

‫ﻳﺘﺰﺍﻳﺪ ﺍﺳﺘﺨﺪﺍﻡ ﺍﳊﻮﺍﺳﺐ ﺗﻘﺮﻳﺒﹰﺎ ﰲ ﻣﻌﻈﻢ ﺍﺠﻤﻟﺎﻻﺕ‪ ،‬ﻓﻔﻲ ﻋﺼﺮﻧﺎ "ﻋﺼﺮ ﺗﺰﺍﻳﺪ ﺍﻟﺘﻜﺎﻟﻴﻒ"‪ ،‬ﺗﻨﺎﻗﺼﺖ‬
‫ﺍﻟﻜﻠﻔﺔ ﺍﳌﺘﻌﻠﻘﺔ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺍﻟﱪﳎﻴﺎﺕ ﻭﺗﻄﻮﻳﺮﻫﺎ ﺇﱃ ﺩﺭﺟﺔ ﻛﺒﲑﺓ ﻭﺫﻟﻚ ﺑﺴﺒﺐ ﺍﻟﺘﻄﻮﺭ ﺍﻟﺴﺮﻳﻊ ﺍﻟﺬﻱ‬
‫ﺃﺻﺎﺏ ﺗﻘﻨﻴﺎﺕ ﺍﻟﺒﲎ ﺍﻟﺼﻠﺒﺔ ﻭﺍﳌﺮﻧﺔ‪ .‬ﻛﺎﻧﺖ ﺍﳊﻮﺍﺳﺐ ﻣﻨﺬ ‪ 25‬ﻋﺎﻣﹰﺎ ﻣﺎﺿﻴﺔ ﺗﺸﻐﻞ ﻋﺪﺓ ﻏﺮﻑ ﻭﺗﻜﻠﻒ‬
‫ﻋﺪﺓ ﻣﻼﻳﲔ ﻣﻦ ﺍﻟﺪﻭﻻﺭﺍﺕ ﺃﻣﺎ ﺍﻵﻥ ﻓﻴﻤﻜﻦ ﺍﺧﺘﺰﺍﳍﺎ ﻋﻠﻰ ﺳﻄﻮﺡ ﺩﺍﺭﺍﺕ ﻣﻦ ﺍﻟﺴﻴﻠﻴﻜﻮﻥ ﺃﺻﻐﺮ ﻣﻦ‬
‫ﺃﻇﺎﻓﺮ ﺍﻷﺻﺎﺑﻊ ﻭﺑﻜﻠﻔﺔ ﻻ ﺗﺘﺠﺎﻭﺯ ﻋﺪﺓ ﺩﻭﻻﺭﺍﺕ ﻟﻠﺪﺍﺭﺓ ﺍﻟﻮﺍﺣﺪﺓ‪ .‬ﻭﳑﺎ ﻳﺪﻓﻊ ﻟﻠﺴﺨﺮﻳﺔ‪ ،‬ﺃﻥ ﻣﺎﺩﺓ‬
‫ﺍﻟﺴﻴﻠﻴﻜﻮﻥ ﻫﻲ ﻣﻦ ﺃﻛﺜﺮ ﺍﳌﻮﺍﺩ ﺗﻮﻓﺮﹰﺍ ﻋﻠﻰ ﺳﻄﺢ ﺍﻷﺭﺽ ﻟﻜﻮﻧﻪ ﺃﺣﺪ ﺍﳌﻘﺎﺩﻳﺮ ﺍﻟﺪﺍﺧﻠﺔ ﰲ ﺗﺮﻛﻴﺐ‬
‫ﺍﻟﺮﻣﺎﻝ‪ .‬ﻟﻘﺪ ﺃﺿﺤﺖ ﺍﳊﻮﺍﺳﺐ ﺑﻔﻀﻞ ﺍﻟﺪﺍﺭﺍﺕ ﺍﳌﺼﻨﻮﻋﺔ ﻣﻦ ﺍﻟﺴﻴﻠﻴﻜﻮﻥ ﺍﻗﺘﺼﺎﺩﻳﺔ ﺟﺪﹰﺍ ﻟﺪﺭﺟﺔ ﺃﻧﻪ‬
‫ﻳﻮﺟﺪ ﰲ ﺍﻟﻌﺎﱂ ﺣﻮﺍﱄ ‪ 200‬ﻣﻠﻴﻮﻥ ﺣﺎﺳﺐ ﻣﻦ ﳐﺘﻠﻒ ﺍﻷﻧﻮﺍﻉ‪ .‬ﺗﺴﺎﻋﺪ ﻫﺬﻩ ﺍﳊﻮﺍﺳﺐ ﺍﻟﻨﺎﺱ ﰲ‬
‫ﳎﺎﻻﺕ ﺇﺩﺍﺭﺓ ﺍﻷﻋﻤﺎﻝ‪ ،‬ﺍﻟﺼﻨﺎﻋﺔ‪ ،‬ﺍﳊﻜﻢ ﻭﰲ ﺷﺆﻭﻥ ﺣﻴﺎﻬﺗﻢ ﺍﻟﺸﺨﺼﻴﺔ‪ .‬ﳝﻜﻦ ﻟﻠﺮﻗﻢ ﺍﻟﺴﺎﺑﻖ ﺃﻥ‬
‫ﻳﺘﻀﺎﻋﻒ ﺑﺴﻬﻮﻟﺔ ﺧﻼﻝ ﺍﻟﺴﻨﻮﺍﺕ ﺍﻟﻘﻠﻴﻠﺔ ﺍﻟﻘﺎﺩﻣﺔ‪.‬‬
‫ﺭﲟﺎ ﻗﺎﻡ ﺃﻗﺮﺍﻧﻚ ﺧﻼﻝ ﺍﻷﻋﻮﺍﻡ ﺍﳌﺎﺿﻴﺔ ﺑﺘﻌﻠﻢ ﻣﻨﻬﺠﻴﺔ ﺍﻟﱪﳎﺔ ﺑﺄﺳﻠﻮﺏ ﺍﻟﱪﳎﺔ ﺍﳌﻬﻴﻜﻠﺔ‪ ،‬ﺃﻣﺎ ﺃﻧﺖ‬
‫ﻓﺴﻮﻑ ﺗﺘﻌﻠﻢ ﺃﺳﻠﻮﺏ "ﺍﻟﱪﳎﺔ ﺍﳌﹸﻬﻴﻜﻠﺔ" ﻭﺃﺳﻠﻮﺏ "ﺍﻟﱪﳎﺔ ﻏﺮﺿﻴﺔ ﺍﻟﺘﻮﺟﻪ"‪ .‬ﳌﺎﺫﺍ ﻧﻘﻮﻡ ﺑﺘﺪﺭﻳﺲ‬
‫ﺍﻷﺳﻠﻮﺑﲔ؟ ﺫﻟﻚ ﻷﻧﻨﺎ ﻧﺘﻮﻗﻊ ﺃﻥ ﺃﺳﻠﻮﺏ ﺍﻟﱪﳎﺔ ﻏﺮﺿﻴﺔ ﺍﻟﺘﻮﺟﻪ ﺃﺻﺒﺢ ﻣﻔﺘﺎﺣﹰﺎ ﻟﺘﻘﻨﻴﺔ ﺍﻟﱪﳎﺔ ﺍﻋﺘﺒﺎﺭﺍ ﻣﻦ‬
‫ﺍﻟﻨﺼﻒ ﺍﻟﺜﺎﱐ ﻟﻠﺘﺴﻌﻴﻨﺎﺕ‪ .‬ﻟﺬﻟﻚ ﺳﻮﻑ ﺗﻘﻮﻡ ﺑﺒﻨﺎﺀ ﻭﺑﺎﻟﺘﻌﺎﻣﻞ ﻣﻊ ﺍﻟﻌﺪﻳﺪ ﻣﻦ ﺍﻷﻏﺮﺍﺽ ﻣﻦ ﺧﻼﻝ‬
‫ﺍﻟﻜﺘﺎﺏ ﻭﻟﻜﻨﻚ ﺳﻮﻑ ﺗﻜﺘﺸﻒ ﺃﻥ ﺍﻟﺒﻨﻴﺔ ﺍﻟﺪﺍﺧﻠﻴﺔ ﻟﻠﺒﻌﺾ ﻣﻨﻬﺎ ﳝﻜﻦ ﺇﳒﺎﺯﻩ ﺑﺸﻜﻞ ﺃﻓﻀﻞ ﺑﺎﺳﺘﺨﺪﺍﻡ‬
‫ﺃﺳﺎﻟﻴﺐ ﳍﺎ ﻋﻼﻗﺔ ﺑﺎﻟﱪﳎﺔ ﺍﳌﹸﻬﻴﻜﻠﺔ‪ .‬ﺑﺎﻹﺿﺎﻓﺔ ﺇﱃ ﺫﻟﻚ ﳝﻜﻦ ﺃﻥ ﻧﺬﻛﺮ ﺃﻧﻪ ﳝﻜﻦ ﰲ ﺑﻌﺾ ﺍﻷﺣﻴﺎﻥ‬
‫ﺍﻟﺘﻌﺒﲑ ﻋﻦ ﻣﻨﻄﻖ ﺍﻟﺘﻌﺎﻣﻞ ﻣﻊ ﺍﻷﻏﺮﺍﺽ ﺑﺴﻬﻮﻟﺔ ﺃﻛﱪ ﻣﻦ ﺧﻼﻝ ﺍﻟﱪﳎﺔ ﺍ ﹸﳌﻬﻴﻜﻠﺔ‪.‬‬
‫ﻳﻮﺟﺪ ﺃﻳﻀﹰﺎ ﺳﺒﺐ ﺁﺧﺮ ﻳﺪﻓﻌﻨﺎ ﺇﱃ ﻋﺮﺽ ﻃﺮﻳﻘﱵ ﺍﻟﱪﳎﺔ ﺍﳌﺬﻛﻮﺭﺗﲔ‪ .‬ﲡﺮﻱ ﺣﺎﻟﻴﹰﺎ ﻋﻤﻠﻴﺔ ﻧﻘﻞ ﺷﺎﻣﻞ‬
‫ﻟﻸﻧﻈﻤﺔ ﺍﻟﱵ ﺗﻌﺘﻤﺪ ﻋﻠﻰ ﻟﻐﺔ ‪ C‬ﺇﱃ ﺗﻠﻚ ﺍﻟﱵ ﺗﻌﺘﻤﺪ ﻋﻠﻰ ﻟﻐﺔ ‪ C++‬ﺣﻴﺚ ﻳﻮﺟﺪ ﻟﺪﻳﻨﺎ ﺣﺎﻟﻴﹰﺎ ﻣﲑﺍﺙ‬
‫ﺿﺨﻢ ﻣﻦ ﺍﻟﱪﺍﻣﺞ ﺍﳌﻜﺘﻮﺑﺔ ﺑﻠﻐﺔ ‪ C‬ﻭﺍﻟﱵ ﻫﻲ ﻗﻴﺪ ﺍﻻﺳﺘﺨﺪﺍﻡ ﻣﻨﺬ ﺣﻮﺍﱄ ﺭﺑﻊ ﻗﺮﻥ ﻭﻳﺘﺰﺍﻳﺪ ﺍﺳﺘﺨﺪﺍﻣﻬﺎ ﰲ‬
‫ﺍﻟﻮﻗﺖ ﺍﻟﺮﺍﻫﻦ ﺑﺸﻜﻞ ﻣﻠﻔﺖ ﻟﻠﻨﻈﺮ‪ .‬ﻋﻨﺪﻣﺎ ﻳﺘﻌﻠﻢ ﺍﻟﻨﺎﺱ ﻟﻐﺔ ‪ C++‬ﻳﻼﺣﻈﻮﻥ ﻣﺒﺎﺷﺮﺓ ﻣﻦ ﺧﻼﻝ ﻣﻴﺰﺍﻬﺗﺎ‬
‫ﺃﻬﻧﺎ ﺃﻛﺜﺮ ﻗﻮﺓ ﻣﻦ ﻟﻐﺔ ‪ ،C‬ﻭﳜﺘﺎﺭﻭﻥ ﺑﺎﻟﺘﺎﱄ ﺍﻻﻧﺘﻘﺎﻝ ﺇﱃ ﻟﻐﺔ ‪ .C++‬ﻭﻳﺒﺪﺅﻭﻥ ﺑﻌﺪﻫﺎ ﰲ ﻋﻤﻠﻴﺔ ﲢﻮﻳﻞ‬
‫ﺃﻧﻈﻤﺘﻬﻢ ﺍﳌﻮﺭﻭﺛﺔ ﻭﻫﻲ ﻋﻤﻠﻴﺔ ﻏﺎﻟﺒﹰﺎ ﻣﺎ ﺗﻜﻮﻥ ﻣﺒﺎﺷﺮﺓ‪ .‬ﰒ ﻳﻘﻮﻣﻮﻥ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺍﳌﻤﻴﺰﺍﺕ ﺍﳌﺨﺘﻠﻔﺔ ﻟﻠﻐﺔ‬
‫‪) C++‬ﺍﻟﱵ ﺗﺴﻤﻰ ﻏﺎﻟﺒﹰﺎ "ﺑﺎﻟﺘﺤﺴﻴﻨﺎﺕ" ﺍﻟﱵ ﺃﺿﺎﻓﺘﻬﺎ ‪ C++‬ﺇﱃ ‪ (C‬ﻣﻦ ﺃﺟﻞ ﲢﺴﲔ ﺃﺳﻠﻮﻬﺑﻢ ﰲ ﻛﺘﺎﺑﺔ‬
‫ﺑﺮﺍﻣﺞ ﺑﻠﻐﺔ ﺷﺒﻴﻬﺔ ﺑﻠﻐﺔ ‪ .C‬ﺑﻌﺪﻫﺎ ﳛﺎﻭﻟﻮﻥ ﺍﺳﺘﺨﺪﺍﻡ ﻗﺪﺭﺍﺕ ﺍﻟﱪﳎﺔ ﻏﺮﺿﻴﺔ ﺍﻟﺘﻮﺟﻪ ﺍﳌﺘﻮﻓﺮﺓ ﰲ ﻟﻐﺔ ‪C++‬‬
‫ﻣﻦ ﺃﺟﻞ ﺍﺳﺘﻐﻼﻝ ﺍﻟﻔﻮﺍﺋﺪ ﺍﻟﻌﻈﻴﻤﺔ ﺍﻟﱵ ﺗﺘﻤﻴﺰ ﻬﺑﺎ ﻫﺬﻩ ﺍﻟﻠﻐﺔ‪.‬‬
‫ﻣﻦ ﺧﻼﻝ ﺍﻟﻔﺼﻮﻝ ﺍﳋﻤﺴﺔ ﺍﻷﻭﱃ ﰲ ﻫﺬﺍ ﺍﻟﻜﺘﺎﺏ ﺳﻮﻑ ﺗﺘﻌﻠﻢ ﺍﻟﱪﳎﺔ ﺍﳌﻬﻴﻜﻠﺔ ﺑﻠﻐﺔ ‪ C++‬ﻭﺍﳉﺰﺀ‬
‫ﺍﳌﺘﻌﻠﻖ ﺑﻠﻐﺔ ‪ C‬ﺍﳌﺘﻀﻤﻦ ﺑﻠﻐﺔ ‪ C++‬ﺑﺎﻹﺿﺎﻓﺔ ﺑﺎﻟﺘﺤﺴﻴﻨﺎﺕ ﺍﳌﺪﺧﻠﺔ ﻣﻦ ﻗﺒﻠﻬﺎ ﻋﻠﻰ ﻟﻐﺔ ‪ .C‬ﰲ ﺣﲔ ﺃﻧﻚ‬
‫ﺳﻮﻑ ﺗﺘﻌﻠﻢ ﻣﻊ ﺍﻟﻜﺘﺎﺏ ﻛﻜﻞ ﺃﺳﻠﻮﺏ ﺍﻟﱪﳎﺔ ﻏﺮﺿﻴﺔ ﺍﻟﺘﻮﺟﻪ ﺑﻠﻐﺔ ‪ .C++‬ﻭﻟﻜﻨﻨﺎ ﻻ ﻧﺮﻳﺪﻙ ﺃﻥ ﺗﻨﺘﻈﺮ‬
‫ﺣﱴ ﺍﻟﻔﺼﻞ ﺍﻟﺴﺎﺩﺱ ﺣﱴ ﺗﺒﺪﺃ ﺑﺘﺬﻭﻕ ﺍﳌﻔﺎﻫﻴﻢ ﺍﳌﺘﻌﻠﻘﺔ ﺑﺎﻷﻏﺮﺍﺽ‪ .‬ﻟﺬﻟﻚ ﻓﻜﻞ ﻓﺼﻞ ﻣﻦ ﺍﻟﻔﺼﻮﻝ‬
‫ﺍﳋﻤﺴﺔ ﺍﻷﻭﱃ ﻳﻨﺘﻬﻲ ﲟﻘﻄﻊ ﻋﻨﻮﺍﻧﻪ "ﻣﺎﺫﺍ ﻋﻦ ﺍﻷﻏﺮﺍﺽ"‪ .‬ﺗﻌﺮﺽ ﺍﳌﻘﺎﻃﻊ ﺍﻟﺴﺎﺑﻘﺔ ﺍﳌﻔﺎﻫﻴﻢ ﻭﺍﳌﺼﻄﻠﺤﺎﺕ‬
‫اﻟﻔﺼﻞ اﻷول‬ ‫‪٢٢‬‬

‫ﻼ ﻟﻠﺒﺪﺀ‬
‫ﺍﻷﺳﺎﺳﻴﺔ ﺍﳌﺘﻌﻠﻘﺔ ﺑﺎﻷﻏﺮﺍﺽ‪ .‬ﻭﻋﻨﺪﻣﺎ ﻧﺼﻞ ﺇﱃ ﺍﻟﻔﺼﻞ ﺍﻟﺴﺎﺩﺱ‪ ،‬ﻓﺈﻧﻚ ﺳﻮﻑ ﺗﻜﻮﻥ ﻣﺆﻫ ﹰ‬
‫ﺑﺎﺳﺘﺨﺪﺍﻡ ﻟﻐﺔ ‪ C++‬ﻟﺒﻨﺎﺀ ﺍﻷﻏﺮﺍﺽ ﻭﻟﻜﺘﺎﺑﺔ ﺑﺮﺍﻣﺞ ﻏﺮﺿﻴﺔ ﺍﻟﺘﻮﺟﻪ‪.‬‬
‫ﳛﺘﻮﻱ ﺍﻟﻔﺼﻞ ﺍﻷﻭﻝ ﻋﻠﻰ ﺃﺭﺑﻌﺔ ﺃﺟﺰﺍﺀ‪ .‬ﻳﻌﺮﺽ ﺍﻷﻭﻝ ﻣﻨﻬﺎ ﺍﳌﻔﺎﻫﻴﻢ ﺍﻷﺳﺎﺳﻴﺔ ﺍﳌﺘﻌﻠﻘﺎﺕ ﺑﺎﳊﺎﺳﺒﺎﺕ‬
‫ﻭﺑﺄﺳﺎﻟﻴﺐ ﺑﺮﳎﺘﻬﺎ‪ .‬ﰲ ﺣﲔ ﻳﺄﺧﺬﻙ ﺍﳉﺰﺀ ﺍﻟﺜﺎﱐ ﻟﺘﺒﺪﺃ ﻣﺒﺎﺷﺮﺓ ﺑﻜﺘﺎﺑﺔ ﺑﻌﺾ ﺍﻟﱪﺍﻣﺞ ﺍﻟﺒﺴﻴﻄﺔ ﺑﻠﻐﺔ‬
‫‪ .C++‬ﺃﻣﺎ ﺍﳉﺰﺀ ﺍﻟﺜﺎﻟﺚ ﻓﻴﺘﻨﺎﻭﻝ ﺍﳌﻘﻄﻊ "ﻣﺎﺫﺍ ﻋﻦ ﺍﻷﻏﺮﺍﺽ"‪ .‬ﺃﻣﺎ ﺍﳉﺰﺀ ﺍﻷﺧﲑ‪ ،‬ﻓﻴﺄﺧﺬﻙ ﰲ ﺟﻮﻟﺔ‬
‫ﺳﺮﻳﻌﺔ ﰲ ﺑﻘﻴﺔ ﻓﺼﻮﻝ ﺍﻟﻜﺘﺎﺏ‪.‬‬

‫ﻣﺎ هﻮ اﻟﺤﺎﺳﺐ‬ ‫‪2-1‬‬


‫ﺍﳊﺎﺳﺐ ﻋﺒﺎﺭﺓ ﻋﻦ ﺟﻬﺎﺯ ﻗﺎﺩﺭ ﻋﻠﻰ ﺇﳒﺎﺯ ﺍﳊﺴﺎﺑﺎﺕ ﻭﺍﲣﺎﺫ ﺍﻟﻘﺮﺍﺭﺍﺕ ﺑﺴﺮﻋﺔ ﺗﺼﻞ ﺇﱃ ﻣﻼﻳﲔ ﻭﺣﱴ‬
‫ﺑﻼﻳﲔ ﺍﳌﺮﺍﺕ ﺃﺳﺮﻉ ﻣﻦ ﺍﻟﻜﺎﺋﻦ ﺍﻟﺒﺸﺮﻱ‪ .‬ﻋﻠﻰ ﺳﺒﻴﻞ ﺍﳌﺜﺎﻝ‪ ،‬ﺗﺴﺘﻄﻴﻊ ﺍﻟﻌﺪﻳﺪ ﻣﻦ ﺍﳊﻮﺍﺳﺐ ﺍﻟﺸﺨﺼﻴﺔ‬
‫ﰲ ﻳﻮﻣﻨﺎ ﻫﺬﺍ ﺍﻟﻘﻴﺎﻡ ﺑﻌﺸﺮﺍﺕ ﺍﳌﻼﻳﲔ ﻣﻦ ﻋﻤﻠﻴﺎﺕ ﺍﳊﺴﺎﺏ ﺍﻟﺴﺎﺑﻘﺔ )ﳑﺎ ﻳﺴﺘﺮﻋﻲ ﺍﻻﻧﺘﺒﺎﻩ ﻭﺍﻟﺘﻔﻜﲑ‪:‬‬
‫ﻛﻴﻒ ﳝﻜﻦ ﻟﻨﺎ ﺃﻥ ﻧﻌﻠﻢ ﻓﻴﻤﺎ ﺇﺫﺍ ﻛﺎﻥ ﺍﻟﺸﺨﺺ ﻗﺪ ﻗﺎﻡ ﲜﻤﻊ ﺍﻷﺭﻗﺎﻡ ﺑﺸﻜﻞ ﺻﺤﻴﺢ؟ ﻭﻛﻴﻒ ﻟﻨﺎ ﺃﻥ‬
‫ﻧﻌﺮﻑ ﻓﻴﻤﺎ ﺇﺫﺍ ﻛﺎﻥ ﺍﳊﺎﺳﺐ ﻗﺪ ﻗﺎﻡ ﻫﻮ ﺑﺪﻭﺭﻩ ﺑﻌﻤﻠﻪ ﺑﺸﻜﻞ ﺻﺤﻴﺢ؟(‪ .‬ﻳﺴﺘﻄﻴﻊ ﺃﺳﺮﻉ ﺍﳊﻮﺍﺳﺐ‬
‫ﰲ ﻳﻮﻣﻨﺎ ﻫﺬﺍ ﺍﻟﻘﻴﺎﻡ ﲟﺌﺎﺕ ﺍﻟﺒﻼﻳﲔ ﻣﻦ ﻋﻤﻠﻴﺎﺕ ﺍﳉﻤﻊ ﰲ ﺍﻟﺜﺎﻧﻴﺔ )ﺃﻱ ﺣﻮﺍﱄ ﻣﺎ ﻳﺴﺘﻄﻴﻊ ﺍﻟﻘﻴﺎﻡ ﺑﻪ‬
‫ﻣﺌﺎﺕ ﺍﻵﻻﻑ ﻣﻦ ﺍﻟﺒﺸﺮ ﻣﻦ ﺍﻟﻌﻤﻠﻴﺎﺕ ﺍﳊﺴﺎﺑﻴﺔ ﰲ ﺳﻨﺔ ﻭﺍﺣﺪﺓ!!( ﻭﻫﻨﺎﻙ ﺣﻮﺍﺳﺐ ﺗﻌﻤﻞ ﰲ ﳐﺎﺑﺮ‬
‫ﺍﻟﺒﺤﺚ ﺍﻟﻌﻠﻤﻲ‪ ،‬ﺗﺴﺘﻄﻴﻊ ﺇﳒﺎﺯ ﺗﺮﻟﻴﻮﻥ ﺗﻌﻠﻴﻤﺔ ﰲ ﺍﻟﺜﺎﻧﻴﺔ‪.‬‬
‫ﺗﻘﻮﻡ ﺍﳊﻮﺍﺳﺐ ﲟﻌﺎﳉﺔ ﺍﳌﻌﻄﻴﺎﺕ ‪ Data‬ﻭﻓﻘﹰﺎ ﺠﻤﻟﻤﻮﻋﺔ ﻣﻦ ﺍﻟﺘﻌﻠﻴﻤﺎﺕ ﺗﺪﻋﻰ ﺑﺎﻟﱪﺍﻣﺞ ‪ Programs‬ﻭﺍﻟﱵ‬
‫ﺗﻘﻮﺩ ﺍﳊﺎﺳﺐ ﻣﻦ ﺧﻼﻝ ﳎﻤﻮﻋﺔ ﻣﻦ ﺍﻷﻓﻌﺎﻝ ﺍﳌﺮﺗﺒﺔ ﻭﺍﶈﺪﺩﺓ ﺑﻮﺍﺳﻄﺔ ﺷﺨﺺ ﻧﺪﻋﻮﻩ "ﺑﺎﳌﱪﻣﺞ"‬
‫‪.Computer Programmer‬‬
‫ﻧﺪﻋﻮ ﺍﳌﻜﻮﻧﺎﺕ ﺍﳌﺨﺘﻠﻔﺔ )ﻣﺜﻞ ﻟﻮﺣﺔ ﺍﳌﻔﺎﺗﻴﺢ‪ ،‬ﺍﻟﺸﺎﺷﺔ‪ ،‬ﺍﻷﻗﺮﺍﺹ ﺍﻟﺼﻠﺒﺔ‪ ،‬ﺍﻟﺬﺍﻛﺮﺓ ﻭﻭﺣﺪﺓ ﺍﳌﻌﺎﳉﺔ( ﺍﻟﱵ‬
‫ﻳﺘﺄﻟﻒ ﻣﻨﻬﺎ ﺍﳊﺎﺳﺐ ﺑﺎﻟﺒﻨﻴﺔ ﺍﻟﺼﻠﺒﺔ ‪ .Hardware‬ﰲ ﺣﲔ ﻧﺴﻤﻲ ﺍﻟﱪﺍﻣﺞ ﺍﻟﱵ ﻧﻨﻔﺬﻫﺎ ﻋﻠﻰ ﺍﳊﺎﺳﺐ ﺑﺎﻟﺒﻨﻴﺔ‬
‫ﺍﳌﺮﻧﺔ ‪ .Software‬ﺷﻬﺪﺕ ﺍﻟﺴﻨﻮﺍﺕ ﺍﻷﺧﲑﺓ ﺍﳔﻔﺎﺿﺎ ﻛﺒﲑﹰﺍ ﰲ ﺗﻜﺎﻟﻴﻒ ﺑﻨﺎﺀ‬
‫ﺍﻟﺒﻨﻴﺔ ﺍﻟﺼﻠﺒﺔ ﺇﱃ ﺍﳊﺪ ﺍﻟﺬﻱ ﺃﺻﺒﺤﺖ ﻣﻌﻪ ﺍﳊﻮﺍﺳﺐ ﺍﻟﺸﺨﺼﻴﺔ ﺳﻠﻌﺔ ﻣﻨﺘﺸﺮﺓ‪ .‬ﻟﻜﻦ ﻟﺴﻮﺀ ﺍﳊﻆ‪،‬‬
‫ﺗﺰﺍﻳﺪﺕ ﺗﻜﺎﻟﻴﻒ ﺑﻨﺎﺀ ﻭﺗﻄﻮﻳﺮ ﺍﻟﺒﻨﻴﺔ ﺍﳌﺮﻧﺔ ﺟﻨﺒﹰﺎ ﺇﱃ ﺟﻨﺐ ﻣﻊ ﺑﻨﺎﺀ ﺗﻄﺒﻴﻘﺎﺕ ﻭﺑﺮﺍﻣﺞ ﺃﻛﺜﺮ ﻓﻌﺎﻟﻴﺔ‬
‫ﻭﺃﻛﺜﺮ ﺗﻌﻘﻴﺪﹰﺍ ﺑﺪﻭﻥ ﺃﻥ ﻧﻜﻮﻥ ﻗﺎﺩﺭﻳﻦ ﻋﻠﻰ ﲢﺴﲔ ﺗﻘﻨﻴﺔ ﺗﻄﻮﻳﺮ ﺍﻟﺒﻨﻴﺔ ﺍﳌﺮﻧﺔ‪ .‬ﺳﻮﻑ ﺗﺘﻌﻠﻢ ﻣﻊ ﻫﺬﺍ‬
‫ﺍﻟﻜﺘﺎﺏ‪ ،‬ﺃﺳﺎﻟﻴﺐ ﻣﱪﻫﻦ ﻋﻨﻬﺎ ﰲ ﻋﻤﻠﻴﺔ ﺗﻄﻮﻳﺮ ﺍﻟﺒﻨﻴﺔ ﺍﳌﺮﻧﺔ‪ .‬ﺗﺘﺴﻢ ﻫﺬﻩ ﺍﻷﺳﺎﻟﻴﺐ ﰲ ﺃﻬﻧﺎ ﻗﺎﺩﺭﺓ‬
‫ﻋﻠﻰ ﺧﻔﺾ ﺗﻜﺎﻟﻴﻒ ﺑﻨﺎﺀ ﺍﻟﺒﻨﻴﺔ ﺍﳌﺮﻧﺔ ﻭﺍﻟﱵ ﻧﺬﻛﺮ ﻣﻨﻬﺎ‪ :‬ﺍﻟﱪﳎﺔ ﺍﳌﻬﻴﻜﻠﺔ ‪،Structured Programming‬‬
‫ﺃﺳﻠﻮﺏ ﺍﻟﺘﺤﻠﻴﻞ ﺍﻟﺘﻨﺎﺯﱄ ﺍﻟﺘﺪﺭﺟﻲ ‪ ،Top-down stepwise refinement‬ﺍﺳﺘﺨﺪﺍﻡ ﺍﻟﺘﻮﺍﺑﻊ ﻭﺍﻹﺟﺮﺍﺋﻴﺎﺕ‬
‫‪ Functionalization‬ﻭﺃﺳﻠﻮﺏ ﺍﻟﱪﳎﺔ ﻏﺮﺿﻴﺔ ﺍﻟﺘﻮﺟﻪ ‪ ،Object-oriented programming‬ﺇﺿﺎﻓﺔ ﺍﻟﻌﻤﻠﻴﺎﺕ‬
‫ﺍﻟﺘﺼﻤﻴﻢ ﺍﻟﱪﳎﻲ ﻏﺮﺿﻲ ﺍﻟﺘﻮﺟﻪ ‪.Object- oriented design‬‬
‫‪٢٣‬‬ ‫‪ .1‬ﻣﻘﺪﻣﺔ ﺣﻮل اﻟﺤﻮاﺳﻴﺐ واﻟﺒﺮﻣﺠﺔ ﺑﻠﻐﺔ ‪C++‬‬

‫ﺑﻨﻴﺔ اﻟﺤﺎﺳﺐ‬‫‪3-1‬‬
‫ﺑﻐﺾ ﺍﻟﻨﻈﺮ ﻋﻦ ﺍﻟﻔﺮﻭﻗﺎﺕ ﺍﳌﺘﻌﻠﻘﺔ ﺑﺎﳌﻈﻬﺮ ﺍﳋﺎﺭﺟﻲ‪ ،‬ﳝﻜﻦ ﺗﺼﻮﺭ ﺍﳊﺎﺳﺐ ﻋﻠﻰ ﺃﻧﻪ ﻳﺘﺄﻟﻒ ﺑﺸﻜﻞ‬
‫ﻋﺎﻡ ﻣﻦ ﺳﺘﺔ ﻭﺣﺪﺍﺕ ﻣﻨﻄﻘﻴﺔ‪ ،‬ﻫﻲ‪:‬‬
‫ﻭﺣﺪﺓ ﺍﻟﺪﺧﻞ )‪ :(Input Unit‬ﻭﻫﻲ ﺍﳉﺰﺀ "ﺍﳌﹸﺴﺘﻘﺒﻞ" ﻣﻦ ﺍﳊﺎﺳﺐ ﺍﻟﺬﻱ ﳛﺼﻞ ﻋﻠﻰ ﺍﳌﻌﻠﻮﻣﺎﺕ‬ ‫‪.1‬‬

‫)ﻣﻌﻄﻴﺎﺕ ﻭﺑﺮﺍﻣﺞ( ﻣﻦ ﻋﺪﺓ ﺃﺟﻬﺰﺓ ﺩﺧﻞ ﳐﺘﻠﻔﺔ ﻭﻳﻀﻊ ﻫﺬﻩ ﺍﳌﻌﻠﻮﻣﺎﺕ ﲢﺖ ﺗﺼﺮﻑ ﺍﻟﻮﺣﺪﺍﺕ‬
‫ﺍﻷﺧﺮﻯ ﺣﱴ ﺗﺘﻢ ﻣﻌﺎﳉﺘﻬﺎ‪ .‬ﳝﻜﻦ ﰲ ﻳﻮﻣﻨﺎ ﻫﺬﺍ ﺇﺩﺧﺎﻝ )ﺍﳌﻌﻄﻴﺎﺕ ﺃﻭ( ﺍﳌﻌﻠﻮﻣﺎﺕ ﻋﻦ ﻃﺮﻳﻖ‬
‫ﺟﻬﺎﺯﻱ ﻟﻮﺣﺔ ﺍﳌﻔﺎﺗﻴﺢ )‪ (Keyboard‬ﻭﺍﻟﻔﺄﺭﺓ )‪ .(Mouse‬ﻭﺭﲟﺎ ﳝﻜﻦ ﺍﻟﻘﻴﺎﻡ ﺑﺬﻟﻚ ﰲ ﺍﳌﺴﺘﻘﺒﻞ‬
‫ﺑﻮﺍﺳﻄﺔ )ﺍﻟﻜﻼﻡ ﺃﻭ( ﺍﻟﺘﺤﺪﺙ ﻣﻊ ﺍﳊﺎﺳﺐ‪.‬‬
‫ﻭﺣﺪﺓ ﺍﳋﺮﺝ )‪ :(Output Unit‬ﻭﻫﻲ ﺟﺰﺀ "ﺍﻟﺸﺤﻦ ﻭﺍﻟﺘﺰﻭﻳﺪ ﺑﺎﳌﻌﻠﻮﻣﺎﺕ" ﺍﻟﱵ ﲤﺖ ﻣﻌﺎﳉﺘﻬﺎ‬ ‫‪.2‬‬
‫ﺑﻮﺍﺳﻄﺔ ﺍﳊﺎﺳﺐ ﻟﺘﺼﺒﺢ ﻣﺘﺎﺣﺔ ﻟﻸﺳﺘﺨﺪﺍﻡ ﺧﺎﺭﺝ ﺍﳊﺎﺳﺐ‪ .‬ﻳﺘﻢ ﺑﺸﻜﻞ ﻋﺎﻡ ﺇﺧﺮﺍﺝ ﺍﳌﻌﻠﻮﻣﺎﺕ‬
‫ﺧﺎﺭﺝ ﺍﳊﺎﺳﺐ ﻭﺇﻇﻬﺎﺭﻫﺎ ﻋﻠﻰ ﺍﻟﺸﺎﺷﺎﺕ )‪ (Screens‬ﺃﻭ ﺗﻄﺒﻊ ﻋﻠﻰ ﺍﻟﻮﺭﻕ ﺃﻭ ﺗﺴﺘﺨﺪﻡ ﻟﻠﺘﺤﻜﻢ‬
‫ﺑﺄﺟﻬﺰﺓ ﺃﺧﺮﻯ‪.‬‬
‫ﻭﺣﺪﺓ ﺍﻟﺬﺍﻛﺮﺓ )‪ :(Memory Unit‬ﻭﻫﻲ ﻭﺣﺪﺓ "ﲣﺰﻳﻦ" ﰲ ﺍﳊﺎﺳﺐ ﺍﻟﱵ ﺗﺘﻤﺘﻊ ﺑﺴﻬﻮﻟﺔ ﺍﻟﻮﺻﻮﻝ‬ ‫‪.3‬‬
‫ﺇﻟﻴﻬﺎ ﻭﺑﺴﻌﺔ ﻣﻨﺨﻔﻀﺔ ﺃﻭ ﳏﺪﻭﺩﺓ ﻧﺴﺒﻴﹰﺎ‪ .‬ﲢﺘﻮﻱ ﻫﺬﻩ ﺍﻟﻮﺣﺪﺓ ﻋﻠﻰ ﺍﳌﻌﻠﻮﻣﺎﺕ ﺍﻟﱵ ﰎ ﺇﺩﺧﺎﳍﺎ ﻣﻦ‬
‫ﺧﻼﻝ ﻭﺣﺪﺓ ﺍﻟﺪﺧﻞ ﳑﺎ ﳚﻌﻠﻬﺎ ﻣﺘﺎﺣﺔ ﻣﻦ ﺃﺟﻞ ﺍﳌﻌﺎﳉﺔ ﻋﻨﺪ ﺍﳊﺎﺟﺔ ﻟﺬﻟﻚ‪ .‬ﻛﻤﺎ ﺃﻬﻧﺎ ﳝﻜﻦ ﺃﻥ‬
‫ﲣﺰﻥ ﺍﳌﻌﻠﻮﻣﺎﺕ ﺍﻟﱵ ﲤﺖ ﻣﻌﺎﳉﺘﻬﺎ ﺣﱴ ﻧﻘﻮﻡ ﺑﺈﻇﻬﺎﺭﻫﺎ ﻋﻠﻰ ﺃﺟﻬﺰﺓ ﺍﳋﺮﺝ ﺑﻮﺍﺳﻄﺔ ﻭﺣﺪﺓ‬
‫ﺍﳋﺮﺝ‪ .‬ﻧﺴﻤﻲ ﻋﺎﺩ ﹰﺓ ﻭﺣﺪﺓ ﺍﳋﺮﺝ ﺑـ "ﺍﻟﺬﺍﻛﺮﺓ" ﺃﻭ ﺑـ"ﺍﻟﺬﺍﻛﺮﺓ ﺍﻷﺳﺎﺳﻴﺔ"‪.‬‬
‫ﻭﺣﺪﺓ ﺍﳊﺴﺎﺏ ﻭﺍﳌﻨﻄﻖ )‪ :(ALU) (Arithmetic and logic unit‬ﻭﻫﻲ "ﺍﳌﺼﻨﻊ" ﺍﳌﺴﺆﻭﻝ ﻋﻦ ﺍﻟﻘﻴﺎﻡ‬ ‫‪.4‬‬
‫ﺑﺎﻟﻌﻤﻠﻴﺎﺕ ﺍﳊﺴﺎﺑﻴﺔ ﻣﺜﻞ ﺍﳉﻤﻊ‪ ،‬ﺍﻟﻄﺮﺡ‪ ،‬ﺍﻟﻀﺮﺏ‪ ،‬ﺍﻟﻘﺴﻤﺔ‪ .‬ﺑﺎﻹﺿﺎﻓﺔ ﺇﱃ ﺃﻬﻧﺎ ﺗﺘﻀﻤﻦ ﺁﻟﻴﺎﺕ‬
‫ﺍﲣﺎﺫ ﺍﻟﻘﺮﺍﺭ ﺍﻟﱵ ﺗﺴﻤﺢ ﻟﻠﺤﺎﺳﺐ ﻋﻠﻰ ﺳﺒﻴﻞ ﺍﳌﺜﺎﻝ ﺑﺎﳌﻘﺎﺭﻧﺔ ﺑﲔ ﻋﻨﺼﺮﻳﻦ ﰲ ﺍﻟﺬﺍﻛﺮﺓ ﻟﺘﺤﺪﻳﺪ‬
‫ﻓﻴﻤﺎ ﺇﺫﺍ ﻛﺎﻧﺎ ﻣﺘﺴﺎﻭﻳﲔ ﺃﻡ ﻻ‪.‬‬
‫ﻭﺣﺪﺓ ﺍﳌﻌﺎﳉﺔ ﺍﳌﺮﻛﺰﻳﺔ )‪ :(CPU) (Central Processing Unit‬ﻭﻫﻲ ﺍﳉﺰﺀ "ﺍﳌﺪﻳﺮ" ﻟﻠﺤﺎﺳﺐ‪ .‬ﻓﻬﻲ‬ ‫‪.5‬‬
‫ﺗﻠﻌﺐ ﺩﻭﺭ ﺍﳌﻨﺴﻖ ﻷﻋﻤﺎﻝ ﺍﳊﺎﺳﺐ ﺑﺎﻹﺿﺎﻓﺔ ﺇﱃ ﻛﻮﻬﻧﺎ ﺍﳌﺸﺮﻑ ﺍﻟﻌﺎﻡ ﻋﻠﻰ ﻋﻤﻞ ﺍﻟﻮﺣﺪﺍﺕ‬
‫ﺍﻷﺧﺮﻯ ﺣﻴﺚ ﺃﻬﻧﺎ ﲢﺪﺩ ﻟﻮﺣﺪﺓ ﺍﻟﺪﺧﻞ ﻣﱴ ﳚﺐ ﻗﺮﺍﺀﺓ ﺍﳌﻌﻠﻮﻣﺎﺕ ﻭﻭﺿﻌﻬﺎ ﰲ ﻭﺣﺪﺓ ﺍﻟﺬﺍﻛﺮﺓ‪.‬‬
‫ﻭﲣﱪ ﺃﻳﻀﹰﺎ ﻭﺣﺪﺓ ﺍﳊﺴﺎﺏ ﻭﺍﳌﻨﻄﻖ ﻣﱴ ﳚﺐ ﻣﻌﺎﳉﺔ ﺍﳌﻌﻠﻮﻣﺎﺕ ﺍﳌﻮﺟﻮﺩﺓ ﰲ ﻭﺣﺪﺓ ﺍﻟﺬﺍﻛﺮﺓ ﻭﻣﱴ‬
‫ﳚﺐ ﻋﻠﻰ ﻭﺣﺪﺓ ﺍﳋﺮﺝ ﺇﺭﺳﺎﳍﺎ ﻣﻦ ﻭﺣﺪﺓ ﺍﻟﺬﺍﻛﺮﺓ ﺇﱃ ﺃﺣﺪ ﺃﺟﻬﺰﺓ ﺍﳋﺮﺝ‪.‬‬
‫ﻭﺣﺪﺓ ﺍﻟﺘﺨﺰﻳﻦ ﺍﻟﺜﺎﻧﻮﻳﺔ )‪ :(Secondary Storage Unit‬ﻭﻫﻲ ﻭﺣﺪﺓ "ﺍﻟﺘﺨﺰﻳﻦ" ﺍﻟﱵ ﺗﺘﺼﻒ‬ ‫‪.6‬‬

‫ﺑﻜﻮﻬﻧﺎ ﺷﺒﻪ ﺩﺍﺋﻤﺔ ﻭﺫﺍﺕ ﺳﻌﺔ ﲣﺰﻳﻦ ﻋﺎﻟﻴﺔ‪ .‬ﻳﺘﻢ ﲣﺰﻳﻦ ﺍﳌﻌﻄﻴﺎﺕ ﻭﺍﻟﱪﺍﻣﺞ ﺍﻟﱵ ﻟﻴﺴﺖ ﻗﻴﺪ‬
‫ﺍﻻﺳﺘﺨﺪﺍﻡ ﺍﳊﺎﱄ ﻣﻦ ﻗﺒﻞ ﺍﻟﻮﺣﺪﺍﺕ ﺍﻷﺧﺮﻯ ﰲ ﺍﳊﺎﺳﺐ ﺿﻤﻦ ﻭﺣﺪﺍﺕ ﺍﻟﺘﺨﺰﻳﻦ ﺍﻟﺜﺎﻧﻮﻳﺔ‬
‫)ﻣﺜﻞ ﺍﻷﻗﺮﺍﺹ ‪ (disks‬ﺣﱴ ﺗﱪﺯ ﺍﳊﺎﺟﺔ ﺇﻟﻴﻬﺎ ﺑﻌﺪ ﺳﺎﻋﺎﺕ ﺃﻭ ﺃﻳﺎﻡ ﺃﻭ ﺃﺷﻬﺮ ﺃﻭ ﺣﱴ ﺑﻌﺪ‬
‫اﻟﻔﺼﻞ اﻷول‬ ‫‪٢٤‬‬

‫ﺳﻨﻮﺍﺕ‪ .‬ﻳﺘﻄﻠﺐ ﺍﻟﻮﺻﻮﻝ ﺇﱃ ﺍﳌﻌﻠﻮﻣﺎﺕ ﰲ ﻭﺣﺪﺍﺕ ﺍﻟﺘﺨﺰﻳﻦ ﺍﻟﺜﺎﻧﻮﻳﺔ ﺯﻣﻨﹰﺎ ﺃﻛﱪ ﺑﻜﺜﲑ ﻣﻦ ﺯﻣﻦ‬
‫ﺍﻟﻮﺻﻮﻝ ﺇﻟﻴﻬﺎ ﰲ ﺍﻟﺬﺍﻛﺮﺓ ﺍﻟﺜﺎﻧﻮﻳﺔ‪ .‬ﺑﺎﻹﺿﺎﻓﺔ ﺇﱃ ﺃﻧﻪ ﻛﻠﻔﺔ ﺻﻨﺎﻋﺔ ﻣﻮﺿﻊ ﻭﺍﺣﺪ ﻟﻠﺘﺨﺰﻳﻦ‬
‫)ﺣﺴﺐ ﻭﺣﺪﺓ ﺍﻟﻘﻴﺎﺱ( ﰲ ﺍﻟﻮﺣﺪﺍﺕ ﺍﻟﺜﺎﻧﻮﻳﺔ ﺃﻗﻞ ﺑﻜﺜﲑ ﻣﻦ ﻛﻠﻔﺘﻪ ﰲ ﺍﻟﺬﻭﺍﻛﺮ ﺍﻷﺳﺎﺳﻴﺔ‪.‬‬

‫ﺗﻄﻮر ﻥﻈﻢ اﻻﺳﺘﺜﻤﺎر‬ ‫‪4-1‬‬


‫ﻓﻴﻤﺎ ﺳﺒﻖ ﻛﺎﻧﺖ ﺍﳊﻮﺍﺳﺐ ﻗﺎﺩﺭﺓ ﻋﻠﻰ ﺇﳒﺎﺯ ﻣﻬﻤﺔ ﺃﻭ ﻭﻇﻴﻔﺔ ﻭﺍﺣﺪﺓ ﻓﻘﻂ ﰲ ﳊﻈﺔ ﻣﻌﻴﻨﺔ‪ .‬ﻫﺬﺍ ﺍﻟﻨﻤﻂ‬
‫ﻣﻦ ﺍﻟﺘﺸﻐﻴﻞ ﻟﻠﺤﺎﺳﺐ ﻳﺴﻤﻰ ﺑﻨﻤﻂ "ﺍﳌﺴﺘﺨﺪﻡ ﺍﻟﻮﺣﻴﺪ ﺫﻭ ﺍﳌﻌﺎﳉﺔ ﻋﻠﻰ ﺩﻓﻌﺎﺕ" ‪single-user batch‬‬
‫‪ processing‬ﺣﻴﺚ ﻳﻨﻔﺬ ﺍﳊﺎﺳﺐ ﺑﺮﻧﺎﻣﺞ ﻭﺣﻴﺪ ﰲ ﳊﻈﺔ ﻣﻌﻴﻨﺔ ﻭﻳﻌﺎﰿ ﺍﳌﻌﻄﻴﺎﺕ ﻋﻠﻰ ﺷﻜﻞ ﺩﻓﻌﺎﺕ ﺃﻭ‬
‫ﻛﻤﻴﺎﺕ ﻣﺘﻌﺎﻗﺒﺔ‪ .‬ﻣﻊ ﺗﻠﻚ ﺍﻷﻧﻈﻤﺔ ﺍﻟﻘﺪﳝﺔ ﻛﺎﻥ ﺍﳌﺴﺘﺨﺪﻣﻮﻥ ﻳﺴﻠﻤﻮﻥ ﺃﻋﻤﺎﳍﻢ ﺇﱃ ﻣﺮﻛﺰ ﺍﳊﺎﺳﺐ‬
‫ﻋﻠﻰ ﺷﻜﻞ ﳎﻤﻮﻋﺎﺕ ﻣﻦ ﺍﻟﺒﻄﺎﻗﺎﺕ ﺍﳌﺜﻘﺒﺔ‪ .‬ﻭﻛﺎﻥ ﻋﻠﻴﻬﻢ ﺍﻻﻧﺘﻈﺎﺭ ﻟﻌﺪﺓ ﺳﺎﻋﺎﺕ ﻭﺣﱴ ﻟﻌﺪﺓ ﺃﻳﺎﻡ ﻗﺒﻞ‬
‫ﺃﻥ ﺗﺼﻠﻬﻢ ﻧﺘﺎﺋﺞ ﺃﻋﻤﺎﳍﻢ ﻣﻄﺒﻮﻋﺔ‪.‬‬
‫ﰎ ﺗﺼﻤﻴﻢ ﻭﺗﻄﻮﻳﺮ ﺍﻟﻨﻈﻢ ﺍﳌﺴﻤﺎﺓ "ﺑﻨﻈﻢ ﺍﻟﺘﺸﻐﻴﻞ" ﻟﺘﻜﻮﻥ ﻣﺮﳛﺔ ﻋﻨﺪ ﺍﺳﺘﺨﺪﺍﻡ ﺍﳊﺎﺳﺒﺎﺕ‪.‬‬
‫ﻟﻮ ﺃﻭﻟﺖ ﻧﻈﻢ ﺍﻟﺘﺸﻐﻴﻞ ﺍﻟﻘﺪﳝﺔ ﺍﻫﺘﻤﺎﻣﺎ ﻛﺒﲑﹰﺍ ﻟﻌﻤﻠﻴﺔ ﺍﻻﻧﺘﻘﺎﻝ ﺍﻟﺴﻠﺲ ﻣﺎ ﺑﲔ ﺍﻟﻮﻇﺎﺋﻒ ﳑﺎ ﲰﺢ‬
‫ﺑﺘﻘﻠﻴﻞ ﺍﻟﻮﻗﺖ ﺍﻟﺬﻱ ﳛﺘﺎﺟﻪ ﻣﺸﻐﻠﻲ ﺍﳊﺎﺳﺐ ﻟﻼﻧﺘﻘﺎﻝ ﻣﺎ ﺑﲔ ﺍﻟﻮﻇﺎﺋﻒ ﻭﺯﺍﺩ ﺑﺎﻟﺘﺎﱄ ﻛﻤﻴﺔ ﺍﻟﻮﻗﺖ‬
‫ﺍﻟﻌﻤﻞ ﺃﻭ ﺍﻹﻧﺘﺎﺝ ﺍﻟﺬﻱ ﳝﻜﻦ ﻟﻠﺤﻮﺍﺳﺐ ﺇﳒﺎﺯﻩ‪.‬‬
‫ﻭﻋﻠﻰ ﺍﻋﺘﺒﺎﺭ ﺃﻥ ﺍﳊﻮﺍﺳﺐ ﺃﺻﺒﺤﺖ ﺃﻛﺜﺮ ﻗﺪﺭﺓ ﻓﺈﻥ ﳕﻂ "ﺍﳌﺴﺘﺨﺪﻡ ﺍﻟﻮﺣﻴﺪ ﺫﻭ ﺍﳌﻌﺎﳉﺔ ﻋﻠﻰ ﺩﻓﻌﺎﺕ"‬
‫ﺃﺻﺒﺢ ﻏﲑ ﻗﺎﺩﺭ ﻋﻠﻰ ﺍﺳﺘﺨﺪﺍﻡ ﻣﻮﺍﺭﺩ ﺍﳊﺎﺳﺐ ﻭﺇﻣﻜﺎﻧﻴﺎﺗﻪ ﺑﺸﻜﻞ ﻓﻌﺎﻝ‪ .‬ﺑﺪ ﹰﻻ ﻋﻦ ﺫﻟﻚ‪ ،‬ﰎ ﺗﻄﺒﻴﻖ‬
‫ﻼ‬
‫ﺍﻟﻔﻜﺮﺓ ﺍﻟﻘﺎﺋﻠﺔ ﺑﺄﻧﻪ ﳝﻜﻦ ﻟﻌﺪﺓ ﻣﻬﺎﻡ ﻭﻭﻇﺎﺋﻒ ﺃﻥ ﺗﺘﺸﺎﺭﻙ ﲟﻮﺍﺭﺩ ﺍﳊﺎﺳﺐ ﳑﺎ ﳛﻘﻖ ﺍﺳﺘﺨﺪﺍﻣﹰﺎ ﺃﻓﻀ ﹰ‬
‫ﻟﻪ‪ .‬ﻭﻫﺬﺍ ﻣﺎ ﻳﺴﻤﻰ ﺑﺎﻟﺘﻌﺪﺩ ﺍﻟﱪﳎﻲ ‪ multiprogramming‬ﺍﻟﺬﻱ ﻳﻌﲏ ﺍﻟﺘﺸﻐﻴﻞ ﻟﻌﺪﺓ ﻭﻇﺎﺋﻒ ﰲ ﻧﻔﺲ‬
‫ﺍﻟﻮﻗﺖ ﻋﻠﻰ ﺍﳊﺎﺳﺐ ﺍﻟﺬﻱ ﻳﺼﻨﻊ ﻣﻮﺍﺭﺩﻩ ﻣﺸﺘﺮﻛﺔ ﻓﻴﻤﺎ ﺑﻴﻨﻬﺎ ﺃﺛﻨﺎﺀ ﺗﻨﺎﻓﺴﻬﺎ ﰲ ﻋﻤﻠﻴﺔ ﺟﻠﺐ ﺍﻧﺘﺒﺎﻩ‬
‫ﺍﳊﺎﺳﺐ ﻭﻣﺘﺎﺑﻌﺔ ﺍﻟﻌﻤﻞ ﻋﻠﻴﻪ‪ .‬ﺑﻘﻲ ﺍﳌﺴﺘﺨﺪﻣﻮﻥ ﻣﻊ ﺍﻟﻨﻈﻢ ﻣﺘﻌﺪﺩﺓ ﺍﻟﱪﺍﻣﺞ ﻳﻘﺪﻣﻮﻥ ﺃﻋﻤﺎﳍﻢ ﻋﻠﻰ‬
‫ﺷﻜﻞ ﺭﺯﻡ ﻣﻦ ﺍﻟﺒﻄﺎﻗﺎﺕ ﺍﳌﺜﻘﺒﺔ ﻭﻳﻨﺘﻈﺮﻭﻥ ﺃﻳﻀﹰﺎ ﻋﺪﺓ ﺳﺎﻋﺎﺕ ﺃﻭ ﻋﺪﺓ ﺃﻳﺎﻡ ﻟﻠﺤﺼﻮﻝ ﻋﻠﻰ ﺍﻟﻨﺘﺎﺋﺞ‪.‬‬
‫ﰲ ﺳﻨﻮﺍﺕ ﺍﻟﺴﺘﻴﻨﺎﺕ‪ ،‬ﺍﺣﺘﻠﺖ ﻋﺪﺓ ﳎﻤﻮﻋﺎﺕ ﺻﻨﺎﻋﻴﺔ ﻭﺟﺎﻣﻌﺎﺕ ﻣﻮﻗﻊ ﺍﻟﺮﻳﺎﺩﺓ ﺑﻌﺪ ﺍﺳﺘﺨﺪﺍﻣﻬﺎ ﻟﻨﻈﻢ‬
‫ﺗﺸﻐﻴﻞ ﺗﻌﺘﻤﺪ ﻣﻔﻬﻮﻡ ﺍﳌﺸﺎﺭﻛﺔ ﺑﺎﻟﻮﻗﺖ ‪ time sharing‬ﺍﻟﺬﻱ ﻫﻮ ﺣﺎﻟﺔ ﺧﺎﺻﺔ ﻣﻦ ﳕﻂ ﺍﻟﺘﻌﺪﺩ ﺍﻟﱪﳎﻲ‪.‬‬
‫ﻭﻫﻮ ﻳﻌﲏ ﺍﻟﺴﻤﺎﺡ ﻟﻠﻌﺪﺩ ﻣﻦ ﺍﳌﺴﺘﺨﺪﻣﲔ ﺍﻟﻮﺻﻮﻝ ﺇﱃ ﺍﳊﺎﺳﺐ ﻣﻦ ﺧﻼﻝ ﻃﺮﻓﻴﺎﺕ ‪) terminals‬ﻋﺒﺎﺭﺓ‬
‫ﻋﻦ ﺃﺟﻬﺰﺓ ﻣﺆﻟﻔﺔ ﻣﻦ ﺷﺎﺷﺎﺕ ﻭﻟﻮﺣﺎﺕ ﻣﻔﺎﺗﻴﺢ(‪ .‬ﳝﻜﻦ ﺣﺴﺐ ﺃﻧﻈﻤﺔ ﺍﻟﺘﺸﻐﻴﻞ ﺍﻟﱵ ﺗﻌﺘﻤﺪ ﻣﻔﻬﻮﻡ‬
‫ﺍﳌﺸﺎﺭﻛﺔ ﺑﺎﻟﺰﻣﻦ‪ ،‬ﺃﻥ ﻳﻮﺟﺪ ﻋﺸﺮﺍﺕ ﺑﻞ ﺃﺣﻴﺎﻧﹰﺎ ﻣﺌﺎﺕ ﺍﳌﺴﺘﺨﺪﻣﲔ ﺍﻟﺬﻳﻦ ﻳﺘﺸﺎﺭﻛﻮﻥ ﺑﺎﳊﺎﺳﺐ ﰲ‬
‫ﻧﻔﺲ ﺍﻟﻮﻗﺖ‪ .‬ﻻﻳﻘﻮﻡ ﺍﳊﺎﺳﺐ ﺑﻮﺍﻗﻊ ﺍﻷﻣﺮ ﺑﺘﻨﻔﻴﺬ ﻣﺎ ﻳﻄﻠﺒﻪ ﺍﳌﺴﺘﺨﺪﻣﻮﻥ ﺑﻨﻔﺲ ﺍﻟﻮﻗﺖ ﻭﺇﳕﺎ ﳜﺼﺺ‬
‫ﺷﺮﺍﺋﺢ ﺯﻣﻨﻴﺔ ﺻﻐﲑﺓ ﻟﻜﻞ ﻣﻬﻤﺔ ﻣﻦ ﻣﻬﺎﻡ ﻛﻞ ﻣﺴﺘﺨﺪﻡ ﰒ ﻳﻨﺘﻘﻞ ﺑﻌﺪﻫﺎ ﳋﺪﻣﺔ ﻣﺴﺘﺨﺪﻡ ﺁﺧﺮ‪ .‬ﻳﻘﻮﻡ‬
‫ﺍﳊﺎﺳﺐ ﺑﺬﻟﻚ ﺑﺴﺮﻋﺔ ﻛﺒﲑﺓ ﺗﻜﻔﻲ ﻟﺘﺨﺪﱘ ﺍﳌﺴﺘﺨﺪﻡ ﺍﻟﻮﺍﺣﺪ ﺃﻛﺜﺮ ﻣﻦ ﻣﺮﺓ ﰲ ﺍﻟﺜﺎﻧﻴﺔ ﺍﻟﻮﺍﺣﺪﺓ‪ .‬ﻭﻫﺬﺍ‬
‫ﻳﻌﻄﻲ ﺍﻻﻧﻄﺒﺎﻉ ﺃﻥ ﺑﺮﺍﻣﺞ ﺍﳌﺴﺘﺨﺪﻣﲔ ﺗﻨﻔﺬ ﻣﻊ ﺑﻌﻀﻬﺎ ﺍﻟﺒﻌﺾ ﰲ ﻧﻔﺲ ﺍﻟﻮﻗﺖ‪ .‬ﻣﻦ ﺃﻫﻢ ﻣﻴﺰﺍﺕ ﻫﺬﻩ‬
‫‪٢٥‬‬ ‫‪ .1‬ﻣﻘﺪﻣﺔ ﺣﻮل اﻟﺤﻮاﺳﻴﺐ واﻟﺒﺮﻣﺠﺔ ﺑﻠﻐﺔ ‪C++‬‬

‫ﺍﻟﻄﺮﻳﻘﺔ ﺃﻥ ﺍﳌﺴﺘﺨﺪﻡ ﻳﺴﺘﻘﺒﻞ ﺃﺟﻮﺑﺔ ﻣﺒﺎﺷﺮﺓ ﺭﺩﹰﺍ ﻋﻠىﻄﻠﺒﺎﺗﻪ ﺑﺪ ﹰﻻ ﻣﻦ ﺍﻻﻧﺘﻈﺎﺭ ﻟﻔﺘﺮﺍﺕ ﻃﻮﻳﻠﺔ‬
‫ﻟﻠﺤﺼﻮﻝ ﻋﻠﻰ ﺍﻟﻨﺘﺎﺋﺞ ﻛﻤﺎ ﻛﺎﻥ ﺍﳊﺎﻝ ﻣﻊ ﺍﻷﳕﺎﻁ ﺍﻟﺴﺎﺑﻘﺔ ﻟﻌﻤﻞ ﺍﳊﻮﺍﺳﺐ‪.‬‬

‫اﻟﻨﻈﻢ اﻟﺤﺴﺎﺑﻴﺔ اﻟﺸﺨﺼﻴﺔ‪ ،‬واﻟﻤﻮزﻋﺔ‪،‬‬ ‫‪5-1‬‬


‫وﻥﻈﻢ اﻟﺰﺑﻮن‪ /‬اﻟﻤﺨﺪم‬
‫ﰲ ﺳﻨﺔ ‪ ،1977‬ﻗﺎﻣﺖ ﺷﺮﻛﺔ ‪ Apple‬ﺑﻨﺸﺮ ﻭﺗﻌﻤﻴﻢ ﺍﻟﻨﻈﻢ ﺍﳊﺴﺎﺑﻴﺔ ﺍﻟﺸﺨﺼﻴﺔ ﺍﻟﱵ ﻛﺎﻧﺖ‬
‫ﻗﺒﻞ ﺫﻟﻚ ﺍﻟﺘﺎﺭﻳﺦ ﺣﻠﻤﹰﺎ ﺑﻌﻴﺪ ﺍﳌﻨﺎﻝ‪ .‬ﻟﻘﺪ ﺃﺻﺒﺤﺖ ﺍﳊﻮﺍﺳﺐ ﺍﻗﺘﺼﺎﺩﻳﺔ ﻟﺪﺭﺟﺔ ﻛﺎﻓﻴﺔ ﺗﺴﻤﺢ ﻟﻠﻨﺎﺱ‬
‫ﺍﻟﻌﺎﺩﻳﲔ ﺑﺸﺮﺍﺋﻬﺎ ﻣﻦ ﺃﺟﻞ ﺃﻋﻤﺎﳍﻢ ﻭﺍﺳﺘﺨﺪﺍﻣﺎﻬﺗﻢ ﺍﻟﺸﺨﺼﻴﺔ‪ .‬ﻭﰲ ﺳﻨﺔ ‪ ،1981‬ﻗﺪﻣﺖ ﺷﺮﻛﺔ ‪ IBM‬ﺃﻛﱪ‬
‫ﺷﺮﻛﺎﺕ ﺍﳊﺎﺳﺒﺎﺕ ﰲ ﺍﻟﻌﺎﱂ‪ ،‬ﺣﺎﺳﺒﻬﺎ ﺍﻟﺸﺨﺼﻲ ﻟﺘﺼﺒﺢ ﺑﻌﺪﻫﺎ ﺍﻟﻨﻈﻢ ﺍﳊﺴﺎﺑﻴﺔ ﺍﻟﺸﺨﺼﻴﺔ ﻣﺸﺮﻭﻋﺔ‬
‫ﺍﻻﺳﺘﺨﺪﺍﻡ ﰲ ﺇﺩﺍﺭﺓ ﺍﻷﻋﻤﺎﻝ ﻭﺍﻟﺼﻨﺎﻋﺔ ﻭﰲ ﺃﻋﻤﺎﻝ ﺍﳌﺆﺳﺴﺎﺕ ﺍﳊﻜﻮﻣﻴﺔ‪ .‬ﻟﻜﻦ ﺑﻘﻴﺖ ﻫﺬﻩ ﺍﳊﺎﺳﺒﺎﺕ‬
‫ﻋﻠﻰ ﺷﻜﻞ ﻭﺣﺪﺍﺕ ﻣﺴﺘﻘﻠﺔ ﺣﻴﺚ ﻳﻘﻮﻡ ﺍﻟﻨﺎﺱ ﺑﺎﻟﻌﻤﻞ ﻋﻠﻰ ﺣﻮﺍﺳﺒﻬﻢ ﰒ ﻳﻨﻘﻠﻮﻥ ﻣﻌﻠﻮﻣﺎﻬﺗﻢ ﺑﺎﺳﺘﺨﺪﺍﻡ‬
‫ﺍﻷﻗﺮﺍﺹ ﻣﻦ ﺣﺎﺳﺐ ﺇﱃ ﺁﺧﺮ ﻟﻠﻤﺸﺎﺭﻛﺔ ﻬﺑﺎ‪ .‬ﻛﺬﻟﻚ ﱂ ﺗﻜﻦ ﺍﳊﻮﺍﺳﺐ ﺍﻟﺸﺨﺼﻴﺔ ﺍﻷﻭﱃ ﻗﻮﻳﺔ ﺑﺸﻜﻞ‬
‫ﻛﺎﻑ ﺣﱴ ﺗﺴﻤﺢ ﲟﺸﺎﺭﻛﺔ ﻋﺪﺓ ﻣﺴﺘﺨﺪﻣﲔ ﻋﻠﻴﻬﺎ‪ .‬ﻟﻜﻦ ﳝﻜﻦ ﻭﺻﻞ ﻫﺬﻩ ﺍﳊﺎﺳﺒﺎﺕ ﻓﻴﻤﺎ ﺑﻴﻨﻬﺎ‬
‫ﻟﺘﺸﻜﻞ ﺷﺒﻜﺎﺕ ﺣﺎﺳﺒﻴﺔ ﺇﻣﺎ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺍﳋﻄﻮﻁ ﺍﳍﺎﺗﻔﻴﺔ ﺃﻭ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺍﻟﺸﺒﻜﺎﺕ ﺍﶈﻠﻴﺔ ‪(LANs) local‬‬

‫‪ area networks‬ﻋﻠﻰ ﻣﺴﺘﻮﻯ ﻣﺆﺳﺴﺔ‪ .‬ﳑﺎ ﻣﻬﺪ ﺍﻟﻄﺮﻳﻖ ﻟﻈﻬﻮﺭ ﺍﻟﻨﻈﻢ ﺍﳊﺴﺎﺑﻴﺔ ﺍﳌﻮﺯﻋﺔ ‪Distributed‬‬
‫‪ Computing‬ﻭﻫﺬﺍ ﻳﻌﲏ ﺃﻧﻪ ﺑﺪ ﹰﻻ ﻣﻦ ﺇﳒﺎﺯ ﻋﻤﻠﻴﺎﺕ ﺣﺴﺎﺑﻴﺔ ﻣﺎ ﻋﻠﻰ ﺣﺎﺳﺐ ﻣﺮﻛﺰﻱ ﳝﻜﻦ ﺗﻮﺯﻳﻊ ﻫﺬﻩ‬
‫ﺍﻟﻌﻤﻠﻴﺎﺕ ﻋﻦ ﻃﺮﻳﻖ ﺍﻟﺸﺒﻜﺔ ﻋﻠﻰ ﻋﺪﺓ ﺣﻮﺍﺳﺐ ﺣﻴﺚ ﳚﺮﻱ ﺍﻟﻌﻤﻞ ﺍﳊﻘﻴﻘﻲ ﺍﳌﻄﻠﻮﺏ ﻹﳒﺎﺯ ﺍﳊﺴﺎﺑﺎﺕ‬
‫ﺍﳌﻄﻠﻮﺑﺔ‪.‬ﻛﺎﻧﺖ ﺍﳊﻮﺍﺳﺐ ﺍﻟﺸﺨﺼﻴﺔ ﰲ ﺗﻠﻚ ﺍﻟﻔﺘﺮﺓ ﻗﻮﻳﺔ ﻟﺪﺭﺟﺔ ﻛﺎﻓﻴﺔ ﻟﻠﻘﻴﺎﻡ ﺑﺎﳊﺴﺎﺑﺎﺕ ﺍﳌﻄﻠﻮﺑﺔ ﻣﻦ‬
‫ﻗﺒﻞ ﺍﳌﺴﺘﺨﺪﻡ ﺍﻟﻔﺮﺩ ﻭﻟﺘﺤﻘﻴﻖ ﺍﻻﺗﺼﺎﻝ ﻓﻴﻤﺎ ﺑﻴﻨﻬﺎ ﻟﺘﻤﺮﻳﺮ ﺍﳌﻌﻄﻴﺎﺕ ﺑﺸﻜﻞ ﺇﻟﻜﺘﺮﻭﱐ‪.‬‬
‫ﰲ ﻳﻮﻣﻨﺎ ﺍﳊﺎﱄ ﺗﺘﺼﻒ ﺍﳊﺎﺳﺒﺎﺕ ﺍﻟﺸﺨﺼﻴﺔ ﰲ ﻛﻮﻬﻧﺎ ﻗﻮﻳﺔ ﻟﺪﺭﺟﺔ ﺗﻘﺎﺭﻥ ﺑﻘﻮﺓ ﺍﳊﻮﺍﺳﺐ ﺍﻟﱵ ﻛﺎﻧﺖ‬
‫ﺗﻜﻠﻒ ﻣﻠﻴﻮﻥ ﺩﻭﻻﺭ ﻗﺒﻞ ﻋﺸﺮﺓ ﺳﻨﻮﺍﺕ‪ .‬ﺗﺴﻤﻰ ﺍﳊﻮﺍﺳﺐ ﺍﳌﻜﺘﺒﻴﺔ ﺍﻷﻛﺜﺮ ﻗﻮﺓ ﲟﺤﻄﺎﺕ ﺍﻟﻌﻤﻞ‬
‫‪ workstations‬ﺍﻟﱵ ﺗﺘﻴﺢ ﻟﻠﻤﺴﺘﺨﺪﻡ ﺍﻟﻔﺮﺩ ﻗﺪﺭﺍﺕ ﻫﺎﺋﻠﺔ‪ .‬ﺗﺘﻢ ﺍﳌﺸﺎﺭﻛﺔ ﺑﺎﳌﻌﻠﻮﻣﺎﺕ ﺑﺴﻬﻮﻟﺔ ﻣﻦ ﺧﻼﻝ‬
‫ﺍﻟﺸﺒﻜﺎﺕ ﺣﻴﺚ ﺗﻘﺪﻡ ﺑﻌﺾ ﺍﳊﺎﺳﺒﺎﺕ ﺍﳌﺴﻤﺎﺓ ﲟﺨﺪﻣﺎﺕ ﺍﳌﻠﻔﺎﺕ ‪ file servers‬ﳎﻤﻮﻋﺔ ﻣﺸﺘﺮﻛﺔ ﻣﻦ‬
‫ﺍﻟﱪﺍﻣﺞ ﻭﺍﳌﻌﻄﻴﺎﺕ ﺍﻟﱵ ﳝﻜﻦ ﺍﺳﺘﺨﺪﺍﻣﻬﺎ ﻣﻦ ﻗﺒﻞ ﺍﳊﻮﺍﺳﺐ ﺍﻟﺰﺑﻮﻧﺔ ‪ clients‬ﺍﳌﻮﺯﻋﺔ ﺿﻤﻦ ﺍﻟﺸﺒﻜﺔ‪ .‬ﳑﺎ‬
‫ﻣﻬﺪ ﺍﺠﻤﻟﺎﻝ ﻹﺩﺧﺎﻝ ﻣﻔﻬﻮﻡ ﺍﻟﻨﻈﻢ ﺍﳊﺴﺎﺑﻴﺔ ﺍﻟﺰﺑﻮﻥ‪ /‬ﺍﳌﺨﺪﻡ‪.‬‬
‫ﺃﺿﺤﺖ ﻟﻐﺔ ‪ C++‬ﺍﳋﻴﺎﺭ ﺍﻷﻭﻝ ﻟﻜﺘﺎﺑﺔ ﺍﻟﱪﺍﻣﺞ ﺍﳋﺎﺻﺔ ﺑﺄﻧﻈﻤﺔ ﺍﻟﺘﺸﻐﻴﻞ ﺃﻭ ﺍﳋﺎﺻﺔ ﺑﺎﻟﻨﻈﻢ ﺍﳌﻮﺯﻋﺔ ﺃﻭ‬
‫ﺗﻠﻚ ﺍﻟﱵ ﺗﻌﺘﻤﺪ ﻣﻔﻬﻮﻡ ﺍﻟﺰﺑﻮﻥ‪ /‬ﺍﳌﺨﺪﻡ‪ .‬ﺗﻮﻓﺮ ﺃﻧﻈﻤﺔ ﺍﻻﺳﺘﺜﻤﺎﺭ ﺍﻟﺸﺎﺋﻌﺔ ﰲ ﻳﻮﻣﻨﺎ ﻫﺬﺍ ﻣﺜﻞ ‪Unix‬‬
‫ﻭ‪ Linux‬ﻭﻧﻈﻢ ‪ Windows‬ﻗﺪﺭﺍﺕ ﳑﺎﺛﻠﺔ ﻟﻠﻘﺪﺭﺍﺕ ﺍﳌﺬﻛﻮﺭﺓ ﺃﻋﻼﻩ‪.‬‬
‫ﻟﻐﺔ اﻵﻟﺔ‪ ،‬ﻟﻐﺔ اﻟﻤﺠﻤﻊ‪ ،‬واﻟﻠﻐﺎت ﻋﺎﻟﻴﺔ اﻟﻤﺴﺘﻮى‬ ‫‪6-1‬‬
‫ﻳﻜﺘﺐ ﺍﳌﱪﳎﻮﻥ ﺗﻌﻠﻴﻤﺎﻬﺗﻢ ﺑﻠﻐﺎﺕ ﳐﺘﻠﻔﺔ ﻟﻠﱪﳎﺔ ﺑﻌﻀﻬﺎ ﻣﻔﻬﻮﻡ ﻣﺒﺎﺷﺮﺓ ﻣﻦ ﻗﺒﻞ ﺍﳊﺎﺳﺐ ﻭﺑﻌﻀﻬﺎ‬
‫اﻟﻔﺼﻞ اﻷول‬ ‫‪٢٦‬‬

‫ﺍﻵﺧﺮ ﳛﺘﺎﺝ ﺇﱃ ﺧﻄﻮﺍﺕ ﺗﺮﲨﺔ ﻭﺳﻴﻄﺔ‪ .‬ﻳﻮﺟﺪ ﺣﺎﻟﻴﹰﺎ ﺍﳌﺌﺎﺕ ﻣﻦ ﻟﻐﺎﺕ ﺍﻟﱪﳎﺔ ﺍﳌﺴﺘﺨﺪﻣﺔ ﻭﺍﻟﱵ ﳝﻜﻦ‬
‫ﺗﻘﺴﻴﻤﻬﺎ ﺇﱃ ﺛﻼﺛﺔ ﺃﻧﻮﺍﻉ‪:‬‬
‫‪ .1‬ﻟﻐﺎﺕ ﺍﻵﻟﺔ‪.‬‬
‫‪ .2‬ﻟﻐﺎﺕ ﺍﺠﻤﻟﻤﻊ‪.‬‬
‫‪ .3‬ﻟﻐﺎﺕ ﻋﺎﻟﻴﺔ ﺍﳌﺴﺘﻮﻯ‪.‬‬
‫ﻳﺴﺘﻄﻴﻊ ﺍﳊﺎﺳﺐ ﺃﻥ ﻳﻔﻬﻢ ﻣﺒﺎﺷﺮﺓ ﻟﻐﺔ ﺍﻵﻟﺔ ﺍﳋﺎﺻﺔ ﺑﻪ ﺍﻟﱵ ﻫﻲ ﺍﻟﻠﻐﺔ ﺍﻟﻄﺒﻴﻌﻴﺔ ﻟﻪ‪ .‬ﳝﻜﻦ ﺗﻌﺮﻳﻒ ﻫﺬﻩ‬
‫ﺍﻟﻠﻐﺔ ﻋﻠﻰ ﺃﻬﻧﺎ ﺍﻟﻠﻐﺔ ﺍﳌﻌﺮﻓﺔ ﻣﻦ ﻗﺒﻞ ﺍﻟﺒﻨﻴﺔ ﺍﻟﺼﻠﺒﺔ ﻟﻠﺤﺎﺳﺐ‪ .‬ﺗﺘﺄﻟﻒ ﻟﻐﺎﺕ ﺍﻵﻟﺔ ﺑﺸﻜﻞ ﻋﺎﻡ ﻣﻦ ﺳﻼﺳﻞ‬
‫ﻣﻦ ﺍﻷﻋﺪﺍﺩ )ﳎﻤﻮﻋﺎﺕ ﻣﻦ ﺍﻷﺻﻔﺎﺭ ﻭﺍﻟﻮﺍﺣﺪﺍﺕ( ﺍﻟﱵ ﺗﻌﻄﻲ ﺍﻷﻭﺍﻣﺮ ﻟﻠﺤﺎﺳﺐ ﻣﻦ ﺃﺟﻞ ﺗﻨﻔﻴﺬ ﺗﻌﻠﻴﻤﺎﺗﻪ‬
‫ﺍﻷﻭﻟﻴﺔ ﻛﻞ ﺗﻌﻠﻴﻤﺔ ﻋﻠﻰ ﺣﺪﺓ‪ .‬ﺗﺮﺗﺒﻂ ﻟﻐﺎﺕ ﺍﻵﻟﺔ ﺑﺎﻵﻟﺔ ﺍﺭﺗﺒﺎﻃﹰﺎ ﻭﺛﻴﻘﹰﺎ ‪ machine-dependent‬ﲟﻌﲎ ﺃﻥ ﻟﻐﺔ‬
‫ﺁﻟﺔ ﻣﺎ ﳝﻜﻦ ﺃﻥ ﺗﺴﺘﺨﺪﻡ ﻓﻘﻂ ﺍﻟﻨﻮﻉ ﳏﺪﺩ ﻓﻘﻂ ﻣﻦ ﺍﳊﻮﺍﺳﺐ‪ .‬ﺗﻌﺘﱪ ﻟﻐﺎﺕ ﺍﻵﻟﺔ ﻟﻐﺎﺕ ﺛﻘﻴﻠﺔ ﻭﻣﺮﻫﻘﺔ‬
‫ﻟﻠﻜﺎﺋﻦ ﺍﻟﺒﺸﺮﻱ ﻭﳝﻜﻦ ﺃﻥ ﻧﺮﻯ ﺫﻟﻚ ﻣﻦ ﺧﻼﻝ ﺍﳌﺜﺎﻝ ﺍﻟﺘﺎﱄ ﳉﺰﺀ ﻣﻦ ﺑﺮﻧﺎﻣﺞ ﻣﻜﺘﻮﺏ ﺑﻠﻐﺔ ﺍﻵﻟﺔ ﻭﺍﻟﺬﻱ‬
‫ﻳﻘﻮﻡ ﲜﻤﻊ ﺃﺟﻮﺭ ﺳﺎﻋﺎﺕ ﺍﻟﻌﻤﻞ ﺍﻹﺿﺎﻓﻴﺔ ﻣﻊ ﺍﻷﺟﻮﺭ ﺍﻷﺳﺎﺳﻴﺔ ﻭﳜﺰﻥ ﺍﻟﻨﺘﻴﺠﺔ ﰲ ﺇﲨﺎﱄ ﺍﻟﺪﻓﻊ‪:‬‬
‫‪+1300042774‬‬
‫‪+1400593419‬‬
‫‪+1200274027‬‬

‫ﻣﻊ ﺍﻧﺘﺸﺎﺭ ﺍﳊﻮﺍﺳﺐ‪ ،‬ﺃﺻﺒﺢ ﻣﻦ ﺍﳌﻼﺣﻆ ﺃﻥ ﻋﻤﻠﻴﺔ ﺍﻟﱪﳎﺔ ﺑﻠﻐﺔ ﺍﻵﻟﺔ ﻫﻲ ﺑﺒﺴﺎﻃﺔ ﻋﻤﻠﻴﺔ ﺑﻄﻴﺌﺔ ﻭﳑﻠﱢﺔ‬
‫ﳌﻌﻈﻢ ﺍﳌﱪﳎﲔ‪ .‬ﻭﺑﺪ ﹰﻻ ﻣﻦ ﺍﺳﺘﺨﺪﺍﻡ ﺳﻼﺳﻞ ﺍﻷﻋﺪﺍﺩ ﺍﻟﱵ ﻳﻔﻬﻤﻬﺎ ﺍﳊﺎﺳﺐ ﻣﺒﺎﺷﺮﺓ ﺑﺪﺃ ﺍﳌﱪﳎﻮﻥ‬
‫ﺑﺎﺳﺘﺨﺪﺍﻡ ﻣﺼﻄﻠﺤﺎﺕ ﻗﺮﻳﺒﺔ ﻣﻦ ﺍﻟﻠﻐﺔ ﺍﻹﻧﻜﻠﻴﺰﻳﺔ ‪ English- like abbreviations‬ﻟﻠﺘﻌﺒﲑ ﻋﻦ ﺍﻟﻌﻤﻠﻴﺎﺕ‬
‫ﺍﻷﻭﻟﻴﺔ ﻟﻠﺤﺎﺳﺐ‪ .‬ﲤﺜﻞ ﻫﺬﻩ ﺍﻻﺧﺘﺼﺎﺭﺍﺕ ﺍﻷﺳﺎﺱ ﺍﻟﺬﻱ ﺍﻧﻄﻠﻘﺖ ﻣﻨﻪ ﻟﻐﺎﺕ ﺍﺠﻤﻟﻤﻊ ﺣﻴﺚ ﰎ ﺗﻄﻮﻳﺮ‬
‫ﻣﺘﺮﲨﺎﺕ ﻟﻠﱪﺍﻣﺞ ﺗﺴﻤﻰ ﺑﺎﺠﻤﻟﻤﻌﺎﺕ )‪ (assemblers‬ﻟﺘﺤﻮﻳﻞ ﻫﺬﻩ ﺍﻟﱪﺍﻣﺞ ﻣﻦ ﻟﻐﺔ ﺍﺠﻤﻟﻤﻊ ﺇﱃ ﻟﻐﺔ ﺍﻵﻟﺔ‪.‬‬
‫ﻳﺒﲔ ﺍﳌﺜﺎﻝ ﺍﻟﺘﺎﱄ ﺟﺰﺀﹰﺍ ﻣﻦ ﺑﺮﻧﺎﻣﺞ ﻣﻜﺘﻮﺏ ﺑﻠﻐﺔ ﺍﺠﻤﻟﻤﻊ ﻳﻘﻮﻡ ﺃﻳﻀﹰﺎ ﲜﻤﻊ ﺃﺟﻮﺭ ﺳﺎﻋﺎﺕ ﺍﻟﻌﻤﻞ ﺍﻹﺿﺎﰲ‬
‫ﻣﻊ ﺍﻷﺟﻮﺭ ﺍﻷﺳﺎﺳﻴﺔ ﻭﻳﻀﻊ ﺍﻟﻨﺘﻴﺠﺔ ﰲ ﺇﲨﺎﱄ ﺍﻟﺪﻓﻊ‪:‬‬
‫‪LOAD‬‬ ‫‪BASEPAY‬‬
‫‪ADD‬‬ ‫‪OVERPAY‬‬
‫‪STORE‬‬ ‫‪GROSSPAY‬‬

‫ﻧﻼﺣﻆ ﲜﻼﺀ ﺃﻥ ﻫﺬﺍ ﺍﳌﺜﺎﻝ ﺃﻭﺿﺢ ﺑﻜﺜﲑ ﻣﻦ ﺍﳌﺜﺎﻝ ﺍﻟﺴﺎﺑﻖ ﺍﳌﻜﺎﻓﺊ ﻟﻪ ﻭﺍﳌﻜﺘﻮﺏ ﺑﻠﻐﺔ ﺍﻵﻟﺔ‪ .‬ﻛﻤﺎ ﺃﻧﻨﺎ‬
‫ﻧﻼﺣﻆ ﺃﻥ ﺍﻟﻨﺺ ﺍﻟﺜﺎﱐ ﻭﺍﺿﺢ ﻭﻣﻔﻬﻮﻡ ﻣﻦ ﻗﺒﻞ ﺍﻟﺒﺸﺮ ﻟﻜﻨﻪ ﻟﻴﺲ ﻣﻔﻬﻮﻣﹰﺎ ﻣﻦ ﻗﺒﻞ ﺍﳊﻮﺍﺳﺐ ﺣﱴ ﺗﺘﻢ‬
‫ﻋﻤﻠﻴﺔ ﺗﺮﲨﺘﻪ ﺇﱃ ﻟﻐﺔ ﺍﻵﻟﺔ‪.‬‬
‫ﺗﺰﺍﻳﺪ ﺍﺳﺘﺨﺪﺍﻡ ﺍﳊﻮﺍﺳﺐ ﻣﻊ ﻇﻬﻮﺭ ﻟﻐﺎﺕ ﺍﺠﻤﻟﻤﻊ‪ .‬ﻟﻜﻦ ﺑﻘﻲ ﺇﳒﺎﺯ ﺃﺑﺴﻂ ﺍﳌﻬﺎﻡ ﻳﺘﻄﻠﺐ ﺍﺳﺘﺨﺪﺍﻡ ﺍﻟﻌﺪﻳﺪ‬
‫ﻣﻦ ﺍﻟﺘﻌﻠﻴﻤﺎﺕ‪ .‬ﻭﺑﺎﻟﺘﺎﱄ ﻣﻦ ﺃﺟﻞ ﺗﺴﺮﻳﻊ ﻋﻤﻠﻴﺔ ﺍﻟﱪﳎﺔ ﰎ ﺗﻄﻮﻳﺮ ﻟﻐﺎﺕ ﻋﺎﻟﻴﺔ ﺍﳌﺴﺘﻮﻯ ‪high-level‬‬
‫‪ languages‬ﺗﺴﺎﻋﺪ ﺗﻌﻠﻴﻤﺎﻬﺗﺎ ﻋﻠﻰ ﺍﻟﻘﻴﺎﻡ ﺑﺎﻟﻌﺪﻳﺪ ﻣﻦ ﺍﳌﻬﺎﻡ ﺍﳉﻮﻫﺮﻳﺔ‪ .‬ﰎ ﺗﺴﻤﻴﺔ ﺍﻟﱪﺍﻣﺞ ﺍﻟﱵ ﺗﻘﻮﻡ ﺑﺘﺤﻮﻳﻞ‬
‫‪٢٧‬‬ ‫‪ .1‬ﻣﻘﺪﻣﺔ ﺣﻮل اﻟﺤﻮاﺳﻴﺐ واﻟﺒﺮﻣﺠﺔ ﺑﻠﻐﺔ ‪C++‬‬

‫ﻧﺼﻮﺹ ﺍﻟﱪﺍﻣﺞ ﺍﳌﻜﺘﻮﺑﺔ ﺑﻠﻐﺎﺕ ﻋﺎﻟﻴﺔ ﺍﳌﺴﺘﻮﻯ ﺇﱃ ﻟﻐﺔ ﺍﻵﻟﺔ"ﺑﺎﳌﺘﺮﲨﺎﺕ" )‪ .(compilers‬ﺗﺴﺎﻋﺪ ﻟﻐﺎﺕ‬
‫ﺍﻟﱪﳎﺔ ﻋﺎﻟﻴﺔ ﺍﳌﺴﺘﻮﻯ ﺍﳌﱪﳎﲔ ﻋﻠﻰ ﻛﺘﺎﺑﺔ ﺗﻌﻠﻴﻤﺎﺕ ﳝﻜﻦ ﺃﻥ ﺗﺒﺪﻭ ﻗﺮﻳﺒﺔ ﻣﻦ ﺍﻟﻌﺒﺎﺭﺍﺕ ﺑﺎﻟﻠﻐﺔ ﺍﻹﻧﻜﻠﻴﺰﻳﺔ‬
‫ﻼ ﻟﱪﻧﺎﻣﺞ ﺍﻟﺮﻭﺍﺗﺐ ﺍﳌﻜﺘﻮﺏ ﺑﻠﻐﺔ‬ ‫ﺍﶈﻠﻴﺔ ﻭﲢﺘﻮﻱ ﻋﻠﻰ ﺍﻟﺮﻣﻮﺯ ﺍﻟﺮﻳﺎﺿﻴﺔ ﺍﻟﺸﺎﺋﻌﺔ ﺍﳌﺴﺘﺨﺪﻣﺔ‪ .‬ﳝﻜﻦ ﻣﺜ ﹰ‬
‫ﻋﺎﻟﻴﺔ ﺍﳌﺴﺘﻮﻯ ﺃﻥ ﳛﺘﻮﻱ ﻋﻠﻰ ﺍﻟﺘﻌﻠﻴﻤﺔ ﺍﻟﺘﺎﻟﻴﺔ‪:‬‬
‫‪grossPay = basyPay+overTimePay‬‬

‫ﻼ ﻣﻦ ﻗﺒﻞ ﺍﳌﱪﳎﲔ ﺃﻛﺜﺮ ﺑﻜﺜﲑ ﻣﻦ ﻟﻐﺎﺕ‬ ‫ﻣﻦ ﺍﻟﻮﺍﺿﺢ ﺃﻥ ﻟﻐﺎﺕ ﺍﻟﱪﳎﺔ ﻋﺎﻟﻴﺔ ﺍﳌﺴﺘﻮﻯ ﻫﻲ ﺃﻛﺜﺮ ﺗﻘﺒ ﹰ‬
‫ﺍﻵﻟﺔ ﺃﻭ ﻟﻐﺎﺕ ﺍﺠﻤﻟﻤﻊ‪ .‬ﺗﻌﺪ ﺍﻟﻠﻐﺘﺎﻥ ‪ C‬ﻭ ‪ C++‬ﻣﻦ ﺃﻛﺜﺮ ﻟﻐﺎﺕ ﺍﻟﱪﳎﺔ ﻋﺎﻟﻴﺔ ﺍﳌﺴﺘﻮﻯ ﻗﻮ ﹰﺓ ﻭﺇﻧﺘﺸﺎﺭﹰﺍ‪.‬‬
‫ﳝﻜﻦ ﻟﻌﻤﻠﻴﺔ ﺍﻟﺘﺮﲨﺔ ﻟﱪﻧﺎﻣﺞ ﻣﻦ ﻟﻐﺔ ﻋﺎﻟﻴﺔ ﺍﳌﺴﺘﻮﻯ ﺇﱃ ﻟﻐﺔ ﺍﻵﻟﺔ ﺃﻥ ﺗﺄﺧﺬ ﺯﻣﻨﹰﺎ ﻛﺒﲑﹰﺍ‪ .‬ﻳﻮﺟﺪ ﺃﻳﻀﹰﺎ‬
‫ﺑﻌﺾ ﺍﳌﻔﺴﺮﺍﺕ ‪ Interpreter Programs‬ﺍﻟﱵ ﺗﺴﺘﻄﻴﻊ ﺗﻨﻔﻴﺬ ﺑﺮﺍﻣﺞ ﻣﻜﺘﻮﺑﺔ ﺑﻠﻐﺔ ﻋﺎﻟﻴﺔ ﺍﳌﺴﺘﻮﻯ ﻣﺒﺎﺷﺮﺓ‬
‫ﺩﻭﻥ ﺍﳊﺎﺟﺔ ﺇﱃ ﺗﺮﲨﺔ ﻫﺬﻩ ﺍﻟﱪﺍﻣﺞ ﺇﱃ ﻟﻐﺔ ﺍﻵﻟﺔ‪ .‬ﻟﻜﻦ ﺗﻨﻔﻴﺬ ﺍﻟﱪﺍﻣﺞ ﺍﳌﹸﺘﺮﲨﺔ ﻫﻮ ﺃﺳﺮﻉ ﻣﻦ ﺗﻨﻔﻴﺬ‬
‫ﺍﻟﱪﺍﻣﺞ ﺍﳌﹸﻔﺴﺮﺓ‪ .‬ﻋﻤﻮﻣﺎﹰ‪ ،‬ﳓﺘﺎﺝ ﺇﱃ ﺍﳌﻔﺴﺮﺍﺕ ﰲ ﻣﺮﺣﻠﺔ ﺗﻄﻮﻳﺮ ﺍﻟﱪﺍﻣﺞ ﺣﻴﺚ ﺗﻘﻮﻡ ﺑﺈﻋﺎﺩﺓ ﺗﺮﲨﺔ‬
‫ﺍﻟﱪﻧﺎﻣﺞ ﻋﻨﺪ ﺃﻳﺔ ﺇﺿﺎﻓﺔ ﺟﺪﻳﺪﺓ ﺃﻭ ﻋﻨﺪ ﺗﺼﺤﻴﺢ ﺃﻱ ﺧﻄﺄ‪ .‬ﻟﻜﻦ ﺑﻌﺪ ﺍﻻﻧﺘﻬﺎﺀ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ‪ ،‬ﳝﻜﻦ‬
‫ﺇﻧﺸﺎﺀ ﻧﺴﺨﺔ ﻣﺘﺮﲨﺔ ﻋﻨﻪ ﺇﱃ ﻟﻐﺔ ﺍﻵﻟﺔ ﻣﻦ ﺃﺟﻞ ﺗﻨﻔﻴﺬﻩ ﺑﻔﻌﺎﻟﻴﺔ ﺃﻛﱪ‪.‬‬

‫‪ 7-1‬ﻥﺒﺬة ﺗﺎریﺨﻴﺔ ﻋﻦ ‪ C‬و‪C++‬‬


‫ﰎ ﺗﻄﻮﻳﺮ ﻟﻐﺔ ‪ C++‬ﺍﻧﻄﻼﻗﹰﺎ ﻣﻦ ﻟﻐﺔ ‪ C‬ﺍﻟﱵ ﺗﻄﻮﺭﺕ ﺑﺪﻭﺭﻫﺎ ﻣﻦ ﻟﻐﺘﲔ ﺳﺎﺑﻘﺘﲔ ﳍﺎ ﳘﺎ‪ BCPL :‬ﻭ ‪ .B‬ﰎ‬
‫ﺗﻄﻮﻳﺮ ﻟﻐﺔ ‪ BCPL‬ﰲ ﻋﺎﻡ ‪ 1967‬ﻣﻦ ﻗﺒﻞ ‪ Martin Richards‬ﻟﺘﻜﻮﻥ ﻟﻐﺔ ﺑﺮﳎﺔ ﻟﻜﺘﺎﺑﺔ ﻧﻈﻢ ﺍﺳﺘﺜﻤﺎﺭ‬
‫ﻭﻣﺘﺮﲨﺎﺕ‪ .‬ﺑﻌﺪﻫﺎ ﻗﺎﻡ ‪ Ken Tompson‬ﺑﺈﺿﺎﻓﺔ ﺍﻟﻌﺪﻳﺪ ﻣﻦ ﺍﻹﻣﻜﺎﻧﻴﺎﺕ ﻋﻠﻰ ﻟﻐﺘﻪ ‪ B‬ﺍﻟﱵ ﻃﻮﺭﻫﺎ‬
‫ﺇﻧﻄﻼﻗﹰﺎ ﻣﻦ ﻧﺴﺨﺔ ﻣﻄﺎﺑﻘﺔ ﻣﻦ ﻟﻐﺔ ‪ BCPL‬ﻭﺫﻟﻚ ﻣﻦ ﺃﺟﻞ ﻛﺘﺎﺑﺔ ﺍﻟﻨﺴﺦ ﺍﻷﻭﱃ ﻟﻨﻈﺎﻡ ﺍﻟﺘﺸﻐﻴﻞ ‪ UNIX‬ﰲ‬
‫ﳐﺎﺑﺮ ﺷﺮﻛﺔ ‪ Bell‬ﺳﻨﺔ ‪ 1970‬ﻋﻠﻰ ﺍﳌﻌﺎﰿ ‪ .DEC PDP-7‬ﻛﺎﻧﺖ ﺍﻟﻠﻐﺘﺎﻥ ‪ BCPL‬ﻭ‪ B‬ﺧﺎﻟﻴﺘﲔ ﻣﻦ ﺍﻷﳕﺎﻁ‬
‫)‪ (Typeless languages‬ﺣﻴﺚ ﻳﺸﻐﻞ ﻛﻞ ﻋﻨﺼﺮ ﻣﻦ ﺍﳌﻌﻄﻴﺎﺕ ﻛﻠﻤﺔ"‪ "Word‬ﻭﺍﺣﺪﺓ ﰲ ﺍﻟﺬﺍﻛﺮﺓ ﻭﻳﻘﻊ‬
‫ﻼ ﺃﻭ ﺃﻋﺪﺍﺩ ﺣﻘﻴﻘﻴﺔ ﻋﻠﻰ ﻋﺎﺗﻖ ﺍﳌﱪﻣﺞ‪.‬‬
‫ﺑﺎﻟﺘﺎﱄ ﻋﺐﺀ ﻣﻌﺎﳉﺔ ﻋﻨﺎﺻﺮ ﺍﳌﻌﻄﻴﺎﺕ ﻋﻠﻰ ﺃﻬﻧﺎ ﺃﺭﻗﺎﻡ ﻛﺎﻣﻠﺔ ﻣﺜ ﹰ‬
‫ﰎ ﺗﻄﻮﻳﺮ ﻟﻐﺔ ﺍﻟﱪﳎﺔ ‪ C‬ﺍﻧﻄﻼﻗﺎ ﻣﻦ ﺍﻟﻠﻐﺔ ‪ B‬ﺑﻮﺍﺳﻄﺔ ‪ Dennis Ritchie‬ﰲ ﳐﺎﺑﺮ ﺷﺮﻛﺔ ‪ Bell‬ﻭﰎ ﺑﻨﺎﺅﻫﺎ‬
‫ﺑﺎﻷﺻﻞ ﻣﻦ ﺃﺟﻞ ﺣﻮﺍﺳﺐ ﺗﺴﺘﺨﺪﻡ ﺍﳌﻌﺎﰿ ‪ DEC PDP-11‬ﺳﻨﺔ ‪ .1972‬ﺗﺴﺘﺨﺪﻡ ﻟﻐﺔ ‪ C‬ﺍﻟﻌﺪﻳﺪ ﻣﻦ‬
‫ﺍﳌﻔﺎﻫﻴﻢ ﺍﳍﺎﻣﺔ ﺍﻟﱵ ﻛﺎﻧﺖ ﻣﻮﺟﻮﺩﺓ ﰲ ﺍﻟﻠﻐﺘﲔ ‪ BCPL‬ﻭ ‪ B‬ﺑﺎﻹﺿﺎﻓﺔ ﺇﱃ ﺇﺿﺎﻓﺔ ﺃﻧﻮﺍﻉ ﻟﻠﻤﻌﻄﻴﺎﺕ ﻣﻊ‬
‫ﺍﻟﻌﺪﻳﺪ ﻣﻦ ﺍﻹﻣﻜﺎﻧﻴﺎﺕ ﺍﻷﺧﺮﻯ ﺍﳍﺎﻣﺔ‪.‬‬
‫ﰲ ﺍﻟﺒﺪﺍﻳﺔ‪ ،‬ﻋُﺮﻓﺖ ﻟﻐﺔ ‪ C‬ﻋﻠﻰ ﺃﻬﻧﺎ ﻟﻐﺔ ﺍﻟﺘﻄﻮﻳﺮ ﺍﳋﺎﺻﺔ ﺑﻨﻈﺎﻡ ﺍﻟﺘﺸﻐﻴﻞ ‪ .UNIX‬ﺃﻣﺎ ﺣﺎﻟﻴﹰﺎ ﻓﺈﻧﻨﺎ ﻧﺴﺘﻄﻴﻊ‬
‫ﺍﻟﻘﻮﻝ ﺃﻥ ﲨﻴﻊ ﻧﻈﻢ ﺍﻟﺘﺸﻐﻴﻞ ﺍﻟﺮﺋﻴﺴﻴﺔ ﻫﻲ ﻧﻈﻢ ﻣﻜﺘﻮﺑﺔ ﺑﻠﻐﺔ ‪ C‬ﻭ‪/‬ﺃﻭ ﻟﻐﺔ ‪ .C++‬ﻟﻘﺪ ﺃﺻﺒﺤﺖ ﻟﻐﺔ ‪C‬‬
‫ﻣﺘﺎﺣﺔ ﻋﻠﻰ ﻣﻌﻈﻢ ﺍﳊﻮﺍﺳﺐ ﺧﻼﻝ ﺍﻟﻌﻘﺪﻳﻦ ﺍﳌﺎﺿﻴﲔ ﻭﻫﻲ ﺗﺘﺼﻒ ﺑﻜﻮﻬﻧﺎ ﻟﻐﺔ ﻣﺴﺘﻘﻠﺔ ﻋﻦ ﺍﻟﺒﻨﻴﺔ‬
‫ﺍﻟﺼﻠﺒﺔ ﻟﻠﺤﻮﺍﺳﺐ‪ ،‬ﺑﺎﻹﺿﺎﻓﺔ ﺇﱃ ﻛﻮﻬﻧﺎ ﺫﺍﺕ ﺗﺼﻤﻴﻢ ﺩﻗﻴﻖ ﻭﳝﻜﻦ ﺍﺳﺘﺨﺪﺍﻣﻬﺎ ﻟﻜﺘﺎﺑﺔ ﺑﺮﺍﻣﺞ ﻗﺎﺑﻠﺔ‬
‫ﻟﻠﻨﻘﻞ ﺑﲔ ﻣﻌﻈﻢ ﺍﳊﻮﺍﺳﺐ‪.‬‬
‫اﻟﻔﺼﻞ اﻷول‬ ‫‪٢٨‬‬

‫‪Ritchie‬‬ ‫ﰲ ﺃﻭﺍﺧﺮ ﺍﻟﺴﺒﻌﻴﻨﺎﺕ‪ ،‬ﺃﺿﺤﺖ ﻟﻐﺔ ‪ C‬ﺗُﻌﺮﻑ ﲢﺖ ﺍﺳﻢ ﻟﻐﺔ ‪ C‬ﺍﻟﺘﻘﻠﻴﺪﻳﺔ ﺃﻭ ﻟﻐﺔ ‪ C‬ﺍﳋﺎﺻﺔ ﺑـ‬
‫ﻭ‪ .kernighan‬ﻭﻟﻘﺪ ﺳﺎﻋﺪ ﻧﺸﺮ ﻛﺘﺎﺏ ﻟﻐﺔ ﺍﻟﱪﳎﺔ ‪ (The C Programming Languge) C‬ﻟﻠﻤﺆﻟﻔﲔ‬
‫‪ Ritchie‬ﻭ‪ Kernighan‬ﻟﺪﺍﺭ ﺍﻟﻨﺸﺮ ‪ Prantice-Hall‬ﺳﻨﺔ ‪ 1978‬ﻋﻠﻰ ﺟﻠﺐ ﺇﻧﺘﺒﺎﻩ ﻭﺍﺳﻊ ﺣﻮﻝ ﺍﻟﻠﻐﺔ ﻟﻴﺼﺒﺢ‬
‫ﺑﻌﺪﻫﺎ ﻫﺬﺍ ﺍﻟﻜﺘﺎﺏ ﺃﺣﺪ ﺃﺷﻬﺮ ﺍﻟﻜﺘﺐ ﻭﺃﳒﺤﻬﺎ ﻋﻠﻰ ﺍﻹﻃﻼﻕ ﻣﻦ ﺑﲔ ﲨﻴﻊ ﺍﻟﻜﺘﺐ ﰲ ﳎﺎﻝ‬
‫ﺍﳌﻌﻠﻮﻣﺎﺗﻴﺔ‪.‬‬
‫ﻟﻘﺪ ﺃﺩﻯ ﻟﺴﻮﺀ ﺍﳊﻆ ﺍﻹﺳﺘﺨﺪﺍﻡ ﺍﻟﻮﺍﺳﻊ ﻟﻠﻐﺔ ‪ C‬ﻋﻠﻰ ﺍﻟﻌﺪﻳﺪ ﻣﻦ ﺍﻷﻧﻮﺍﻉ ﺍﳌﺨﺘﻠﻔﺔ ﻟﻠﺤﻮﺍﺳﺐ )ﺍﻟﱵ‬
‫ﻧﺴﻤﻴﻬﺎ ﺃﺣﻴﺎﻧﹰﺎ ﺍﻷﺭﺿﻴﺔ ﺫﺍﺕ ﺍﻟﺒﻨﻴﺔ ﺍﻟﺼﻠﺒﺔ ‪ (hardware platforms‬ﺇﱃ ﺑﻌﺾ ﺍﻹﺧﺘﻼﻓﺎﺕ‬
‫ﺑﲔ ﻧﺴﺦ ﻟﻐﺔ ‪ C‬ﺍﻟﱵ ﳝﻜﻦ ﺃﻥ ﺗﻜﻮﻥ ﻣﺘﺸﺎﻬﺑﺔ ﻭﻟﻜﻨﻬﺎ ﻏﺎﻟﺒﹰﺎ ﻏﲑ ﻣﺘﻮﺍﻓﻘﺔ ﻓﻴﻤﺎ ﺑﻴﻨﻬﺎ‪ .‬ﳑﺎ ﺷﻜﻞ ﻣﺸﻜﻠﺔ‬
‫ﻋﻮﻳﺼﺔ ﺑﺎﻟﻨﺴﺒﺔ ﳌﻄﻮﺭﻱ ﺍﻟﱪﺍﻣﺞ ﺍﻟﺬﻳﻦ ﳛﺘﺎﺟﻮﻥ ﺇﱃ ﻛﺘﺎﺑﺔ ﺑﺮﺍﻣﺞ ﳝﻜﻦ ﺃﻥ ﺗﻌﻤﻞ ﻋﻠﻰ ﻋﺪﺓ ﺃﻧﻮﺍﻉ ﻣﻦ‬
‫ﺍﳊﻮﺍﺳﺐ‪ .‬ﻭﻇﻬﺮﺕ ﺑﻨﺘﻴﺠﺔ ﺫﻟﻚ ﺍﳊﺎﺟﺔ ﺇﱃ ﺗﻌﺮﻳﻒ ﻧﺴﺨﺔ ﻣﻌﻴﺎﺭﻳﺔ ﻣﻦ ﻟﻐﺔ ‪ .C‬ﰎ ﰲ ﺳﻨﺔ ‪ 1983‬ﺇﻧﺸﺎﺀ‬
‫ﺍﻟﻠﺠﻨﺔ ﺍﻟﺘﻘﻨﻴﺔ ‪ X3J11‬ﲢﺖ ﺇﺷﺮﺍﻑ ﺍﻟﻠﺠﻨﺔ ﺍﻟﻮﻃﻨﻴﺔ ﺍﻷﻣﲑﻛﻴﺔ ﻟﻠﻤﻌﺎﻳﺮﺓ ﺍﳋﺎﺻﺔ ﺑﺎﳊﻮﺍﺳﺐ ﻭﻣﻌﺎﳉﺔ‬
‫ﺍﳌﻌﻠﻮﻣﺎﺕ )‪ (X3‬ﻣﻦ ﺃﺟﻞ "ﲢﺪﻳﺪ ﺗﻌﺮﻳﻒ ﻏﲑ ﻣﺒﻬﻢ ﻭﻣﺴﺘﻘﻞ ﻋﻦ ﺍﳊﻮﺍﺳﺐ ﺍﳌﺴﺘﺨﺪﻣﺔ ﻟﻠﻐﺔ ﺍﻟﱪﳎﺔ ‪."C‬‬
‫ﲤﺖ ﰲ ﺳﻨﺔ ‪ 1989‬ﺍﳌﺼﺎﺩﻗﺔ ﻋﻠﻰ ﺍﳌﻌﺎﻳﺮﺓ ﺍﻟﱵ ﺃﹸﺻﺪﺭﺕ‪ .‬ﺑﻌﺪﻫﺎ ﻗﺎﻣﺖ ﻣﻨﻈﻤﺔ ﺍﻟـ ‪ ANSI‬ﺑﺎﻟﺘﻌﺎﻭﻥ ﻣﻊ‬
‫ﺍﳌﻨﻈﻤﺔ ﺍﻟﻌﺎﳌﻴﺔ ﻟﻠﻤﻌﺎﻳﺮﺓ )‪ (ISO‬ﺑﺘﻌﻤﻴﻢ ﺍﳌﻌﺎﻳﺮﺓ ﺍﳋﺎﺻﺔ ﺑﻠﻐﺔ ‪ C‬ﰲ ﳐﺘﻠﻒ ﺃﳓﺎﺀ ﺍﻟﻌﺎﱂ‪ .‬ﰎ ﺇﺻﺪﺍﺭ ﻧﺺ‬
‫ﺍﳌﻌﺎﻳﺮﺓ ﺳﻨﺔ ‪ 1990‬ﲢﺖ ﺍﻟﺮﻗﻢ ‪ ANSI/ ISO 9899: 1990‬ﻭﺍﻟﱵ ﳝﻜﻦ ﻃﻠﺐ ﻧﺴﺦ ﻋﻨﻬﺎ ﻣﻦ ﺍﳌﻌﻬﺪ ‪.ANSI‬‬
‫ﺗﻌﻜﺲ ﺍﻟﻄﺒﻌﺔ ﺍﻟﺜﺎﻧﻴﺔ ﻣﻦ ﻛﺘﺎﺏ ‪ Ritchie‬ﻭ ‪ Kernighan‬ﺍﳌﻨﺸﻮﺭ ﻋﺎﻡ ‪ 1988‬ﺍﻷﻓﻜﺎﺭ ﺍﳌﺘﻌﻠﻘﺔ ﻬﺑﺬﻩ‬
‫ﺍﻟﻨﺴﺨﺔ ﺍﳌﺴﻤﺎﺓ ﺑـ ‪ ANSI C‬ﻭﺍﻟﱵ ﻫﻲ ﺣﺎﻟﻴﹰﺎ ﻗﻴﺪ ﺍﻻﺳﺘﺨﺪﺍﻡ ﻋﻠﻰ ﻣﺴﺘﻮﻯ ﺍﻟﻌﺎﱂ ﺃﲨﻊ‪.‬‬
‫ﺗﻠﻤﻴﺢ ﻟﺘﺤﺴﻴﻦ اﻟﻤﺤﻤﻮﻟﻴﺔ‬ ‫‪1-1‬‬

‫ﺑﺴﺒﺐ آﻮن ﻟﻐﺔ ‪ C‬ﻟﻐﺔ ﻣﻌﻴﺎریﺔ واﺳﻌﺔ اﻹﻧﺘﺸﺎر وﻣﺴﺘﻘﻠﺔ ﻋﻦ اﻵﻟﺔ‪،‬‬


‫ﻓﺎﻟﺘﻄﺒﻴﻘﺎت اﻟﻤﻜﺘﻮﺑﺔ ﺑﻬﺎ هﻲ ﺕﻄﺒﻴﻘﺎت یﻤﻜﻦ ﺕﻨﻔﻴﺬهﺎ ﻣﻊ ﺑﻌﺾ اﻟﺘﻌﺪیﻼت‬
‫اﻟﺒﺴﻴﻄﺔ أو ﺑﺪون أي ﺕﻌﺪیﻞ ﻋﻠﻰ ﻋﺪد آﺒﻴﺮ ﻣﻦ اﻷﻧﻈﻤﺔ اﻟﺤﺎﺳﺒﻴﺔ اﻟﻤﺨﺘﻠﻔﺔ‪.‬‬

‫ﰎ ﺗﻄﻮﻳﺮ ﻟﻐﺔ ﺍﻟﱪﳎﺔ ‪ C++‬ﺍﻟﱵ ﺗﻌﺘﱪ ﺍﻣﺘﺪﺍﺩﹰﺍ ﻟﻠﻐﺔ ‪ C‬ﻣﻦ ﻗﺒﻞ ‪ Bjarne Stroustuf‬ﰲ ﺑﺪﺍﻳﺔ ﺍﻟﺜﻤﺎﻧﻴﺎﺕ‪ .‬ﰲ‬
‫ﳐﺘﱪﺍﺕ ﺷﺮﻛﺔ ‪ .Bell‬ﺗﻘﺪﻡ ﻟﻐﺔ ‪ C++‬ﺍﻟﻌﺪﻳﺪ ﻣﻦ ﺍﻹﻣﻜﺎﻧﻴﺎﺕ ﺍﻟﱵ "ﺗﺴﻤﻮ" ﺑﻠﻐﺔ ‪ C‬ﻭﺗﻌﻠﻮ ﻬﺑﺎ‪ .‬ﻟﻜﻦ‬
‫ﺍﻷﻫﻢ ﻣﻦ ﺫﻟﻚ ﻛﻠﻪ ﻓﻬﻲ ﺑﻘﺪﺭﺍﺕ ﺍﻟﱪﳎﺔ ﻏﺮﺿﻴﺔ ﺍﻟﺘﻮﺟﻪ‪.‬‬
‫ﳝﺮ ﻋﺎﱂ ﺗﻄﻮﻳﺮ ﺍﻟﱪﳎﻴﺎﺕ ﺣﺎﻟﻴﹰﺎ ﺑﺜﻮﺭﺓ ﻫﺪﻓﻬﺎ ﺑﻨﺎﺀ ﺑﺮﳎﻴﺎﺕ ﺳﺮﻳﻌﺔ ﻭﺻﺤﻴﺤﺔ ﻭﺍﻗﺘﺼﺎﺩﻳﺔ‪ .‬ﻟﻜﻦ ﺑﻘﻲ‬
‫ﻫﺬﺍ ﺍﳍﺪﻑ ﺣﱴ ﺍﻵﻥ ﻫﺪﻓﹰﺎ ﺑﻌﻴﺪ ﺍﳌﻨﺎﻝ ﰲ ﺍﻟﻮﻗﺖ ﺍﻟﺬﻱ ﻳﺘﺰﺍﻳﺪ ﺍﻟﻄﻠﺐ ﻓﻴﻪ ﻋﻠﻰ ﺑﺮﳎﻴﺎﺕ ﺟﺪﻳﺪﺓ ﻭﺃﻛﺜﺮ‬
‫ﻓﻌﺎﻟﻴﺔ ﻭﻗﻮﺓ‪ .‬ﺗﻌﺘﱪ ﺍﻷﻏﺮﺍﺽ )‪ (objects‬ﻣﻦ ﺍﳌﻜﻮﻧﺎﺕ ﺍﻟﱪﳎﻴﺔ ﺍﻟﻘﺎﺑﻠﺔ ﻟﻼﺳﺘﺨﺪﺍﻡ ﺃﻛﺜﺮ ﻣﻦ ﻣﺮﺓ ﻭﻫﻲ‬
‫ﻗﺎﺩﺭﺓ ﻋﻠﻰ ﲤﺜﻴﻞ ﻋﻨﺎﺻﺮ ﻣﻦ ﺍﻟﻌﺎﱂ ﺍﳊﻘﻴﻘﻲ ﺍﶈﻴﻂ ﺑﻨﺎ‪ .‬ﻛﻤﺎ ﺃﻥ ﺍﳌﱪﳎﲔ ﻳﻜﺘﺸﻔﻮﻥ ﺣﺎﻟﻴﹰﺎ ﺃﻥ ﺍﺳﺘﺨﺪﺍﻡ‬
‫ﺃﺳﻠﻮﺏ ﺍﻟﱪﳎﺔ ﺍﻟﺬﻱ ﻳﻌﺘﻤﺪ ﻋﻠﻰ ﲡﺰﺋﺔ ﺍﳌﺴﺄﻟﺔ ﺍﳌﺪﺭﻭﺳﺔ ﻭﻋﻠﻰ ﺍﺳﺘﺨﺪﺍﻡ ﺃﺳﺎﻟﻴﺐ ﺍﻟﺘﺼﻤﻴﻢ ﻭﺍﻟﱪﳎﺔ‬
‫ﻏﺮﺿﻴﺔ ﺍﻟﺘﻮﺟﻪ‪ ،‬ﳚﻌﻞ ﻣﻦ ﳎﻤﻮﻋﺎﺕ ﺗﻄﻮﻳﺮ ﺍﻟﱪﳎﻴﺎﺕ ﺃﻛﺜﺮ ﺇﻧﺘﺎﺟﻴﺔ ﳑﺎ ﻛﺎﻧﺖ ﻋﻠﻴﻪ ﻋﻨﺪ ﺍﺳﺘﺨﺪﺍﻡ‬
‫‪٢٩‬‬ ‫‪ .1‬ﻣﻘﺪﻣﺔ ﺣﻮل اﻟﺤﻮاﺳﻴﺐ واﻟﺒﺮﻣﺠﺔ ﺑﻠﻐﺔ ‪C++‬‬

‫ﺍﻷﺳﺎﻟﻴﺐ ﺍﻟﱪﳎﻴﺔ ﺍﻟﺴﺎﺑﻘﺔ ﻣﺜﻞ ﺃﺳﻠﻮﺏ ﺍﻟﱪﳎﺔ ﺍﳌﻬﻴﻜﻠﺔ‪ .‬ﻓﺎﻟﱪﺍﻣﺞ ﻏﺮﺿﻴﺔ ﺍﻟﺘﻮﺟﻪ ﻫﻲ ﺑﺮﺍﻣﺞ ﺳﻬﻠﺔ‬
‫ﺍﻟﻔﻬﻢ ﻭﻗﺎﺑﻠﺔ ﻟﻠﺘﻌﺪﻳﻞ ﻭﺍﻟﺘﺼﺤﻴﺢ ﺑﺴﻬﻮﻟﺔ‪.‬‬
‫ﰎ ﺗﻄﻮﻳﺮ ﺍﻟﻌﺪﻳﺪ ﻣﻦ ﻟﻐﺎﺕ ﺍﻟﱪﳎﺔ ﻏﺮﺿﻴﺔ ﺍﻟﺘﻮﺟﻪ ﺍﻷﺧﺮﻯ‪ ،‬ﻧﺬﻛﺮ ﻣﻨﻬﺎ ﻋﻠﻰ ﺳﺒﻴﻞ ﺍﳌﺜﺎﻝ‪ ،‬ﻟﻐﺔ ‪SmallTalk‬‬
‫ﺍﳌﻄﻮﺭﺓ ﻣﻦ ﻗﺒﻞ )‪ Xerox’s Palo Alto Research Center (PARC‬ﻭﺍﻟﱵ ﺗﻌﺘﱪ ﻟﻐﺔ ﻏﺮﺿﻴﺔ ﺍﻟﺘﻮﺟﻪ ﺻﺎﻓﻴﺔ )ﻷﻥ‬
‫ﻛﻞ ﺷﻲﺀ ﻓﻴﻬﺎ ﻫﻮ ﻋﺒﺎﺭﺓ ﻋﻦ ﻏﺮﺽ( ﰲ ﺣﲔ ﺗﻌﺘﱪ ﻟﻐﺔ ‪ C++‬ﻟﻐﺔ ﻫﺠﻴﻨﺔ ‪ hybrid language‬ﻓﻤﻌﻬﺎ ﳝﻜﻦ‬
‫ﻛﺘﺎﺑﺔ ﺑﺮﺍﻣﺞ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺃﺳﻠﻮﺏ ﻣﺸﺎﺑﻪ ﻟﻠﱪﳎﺔ ﺑﻠﻐﺔ ‪ C‬ﺃﻭ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺃﺳﻠﻮﺏ ﻏﺮﺿﻲ ﺍﻟﺘﻮﺟﻪ ﺃﻭ ﻛﻼﳘﺎ‪.‬‬

‫ﻣﻜﺘﺒﺔ ‪ C++‬اﻟﻤﻌﻴﺎریﺔ‬ ‫‪8-1‬‬


‫ﺗﺘﺄﻟﻒ ﺑﺮﺍﻣﺞ ‪ C++‬ﻣﻦ ﻣﻜﻮﻧﺎﺕ ﺗﺴﻤﻰ ﺑﺎﻟﺼﻔﻮﻑ ‪ classes‬ﻭﺍﻟﺘﻮﺍﺑﻊ ‪ functions‬ﻭﻣﻦ ﺃﺟﻞ ﺑﺮﳎﺔ ﺃﺣﺪ‬
‫ﻫﺬﻩ ﺍﳌﻜﻮﻧﺎﺕ ﺭﲟﺎ ﲢﺘﺎﺝ ﺇﱃ ﻛﺘﺎﺑﺔ ﺑﺮﻧﺎﻣﺞ ﻛﺎﻣﻞ ﺑﻠﻐﺔ ‪ C++‬ﻟﻜﻦ ﺍﳌﱪﳎﲔ ﺑﻠﻐﺔ ‪ C++‬ﻳﺴﺘﻔﻴﺪﻭﻥ ﻣﻦ‬
‫ﻣﻴﺰﺍﺕ ﺍﺠﻤﻟﻤﻮﻋﺔ ﺍﻟﻐﻨﻴﺔ ﻣﻦ ﺍﻟﺼﻔﻮﻑ ﻭﺍﻟﺘﻮﺍﺑﻊ ﺍﳌﹸﻌﺮﻓﺔ ﻣﺴﺒﻘﹰﺎ ﺿﻤﻦ ﻣﻜﺘﺒﺎﺕ ‪ C++‬ﺍﳌﻌﻴﺎﺭﻳﺔ‪ .‬ﻟﺬﻟﻚ ﳝﻜﻦ‬
‫ﻓﻌﻠﻴﹰﺎ ﺗﻘﺴﻴﻢ ﻋﻤﻠﻴﺔ ﺗﻌﻠﻢ ‪ C++‬ﺇﱃ ﻗﺴﻤﲔ‪ :‬ﻳﻌﺘﻤﺪ ﺍﻷﻭﻝ ﻣﻨﻬﺎ ﻋﻠﻰ ﺗﻌﻠﻢ ﻟﻐﺔ ‪ C++‬ﻧﻔﺴﻬﺎ ﰲ ﺣﲔ‬
‫ﻳﺴﻤﺢ ﺍﻟﺜﺎﱐ ﺑﺘﻌﻠﻢ ﻛﻴﻔﻴﺔ ﺍﺳﺘﺨﺪﺍﻡ ﺍﻟﺼﻔﻮﻑ ﺍﳌﻠﺤﻘﺔ ﺑـ ‪ C++‬ﻭﺍﺳﺘﺨﺪﺍﻡ ﺍﻟﺘﻮﺍﺑﻊ ﺍﳌﻮﺟﻮﺩﺓ ﺿﻤﻦ‬
‫ﺍﳌﻜﺘﺒﺔ ﺍﳌﻌﻴﺎﺭﻳﺔ ﻟـ ‪ .C++‬ﺳﻮﻑ ﺗﺘﻌﺮﺽ ﻣﻦ ﺧﻼﻝ ﻛﺘﺎﺑﻨﺎ ﻫﺬﺍ ﺇﱃ ﺍﻟﻌﺪﻳﺪ ﻣﻦ ﻫﺬﻩ ﺍﻟﺼﻔﻮﻑ ﻭﺍﻟﺘﻮﺍﺑﻊ‪.‬‬
‫ﺃﻣﺎ ﺑﺎﻟﻨﺴﺒﺔ ﻟﻠﻤﱪﳎﲔ ﺍﻟﺬﻳﻦ ﻳﺮﻏﺒﻮﻥ ﺑﺎﻟﺘﻌﻤﻖ ﰲ ﻓﻬﻢ ﺗﻮﺍﺑﻊ ﻣﻜﺘﺒﺔ ﻟﻐﺔ ‪ ANSI C‬ﻭﺍﻟﺘﻌﺮﻑ ﻋﻠﻰ ﻛﻴﻔﻴﺔ‬
‫ﻛﺘﺎﺑﺘﻬﺎ ﻭﻛﻴﻔﻴﺔ ﺍﺳﺘﺨﺪﺍﻣﻬﺎ ﻟﻜﺘﺎﺑﺔ ﺑﺮﺍﻣﺞ ﻗﺎﺑﻠﺔ ﻟﻠﻨﻘﻞ ﻓﻴﺠﺐ ﻋﻠﻴﻬﻢ ﺍﻹﻃﻼﻉ ﻋﻠﻰ ﻛﺘﺎﺏ ‪Plauger‬‬
‫)‪ .(P192‬ﳝﻜﻦ ﺍﻟﺘﺰﻭﺩ ﲟﻜﺘﺒﺎﺕ ﺍﻟﺼﻔﻮﻑ ﻣﻦ ﻋﻨﺪ ﺑﺎﺋﻌﻲ ﺑﺮﺍﻣﺞ ﺍﳌﺘﺮﲨﺎﺕ ﻭﻟﻜﻦ ﳝﻜﻦ ﺍﳊﺼﻮﻝ ﻋﻠﻰ‬
‫ﻋﺪﺩ ﻛﺒﲑ ﻣﻨﻬﺎ ﻣﻦ ﻋﻨﺪ ﺑﺎﺋﻌﻲ ﺍﻟﱪﳎﻴﺎﺕ ﺍﻵﺧﺮﻳﻦ‪.‬‬
‫ﻣﻼﺣﻈﺔ ﺥﺎﺹﺔ ﺑﻬﻨﺪﺳﺔ اﻟﺒﺮﻣﺠﻴﺎت‬ ‫‪1-1‬‬

‫اﺳﺘﺨﺪام أﺳﻠﻮب اﻟﺒﻨﺎء اﻟﻜﺘﻠﻲ ﻟﺒﻨﺎء ﺑﺮاﻣﺠﻚ‪ .‬وﺕﺠﻨﺐ ﻣﺤﺎوﻟﺔ إﻋﺎدة اﺥﺘﺮاع‬
‫اﻟﺪوﻻب‪ .‬أي ﻗﻢ ﺑﺎﺳﺘﺨﺪام اﻷﺝﺰاء اﻟﺠﺎهﺰة اﻟﻤﻮﺝﻮدة ﻣﺴﺒﻘًﺎ‪ .‬ﻧﺴﻤﻲ هﺬﻩ‬
‫اﻟﻄﺮیﻘﺔ ﻓﻲ اﻟﻌﻤﻞ ﺑﻄﺮیﻘﺔ إﻋﺎدة اﺳﺘﺨﺪام اﻟﺒﻨﻰ اﻟﻤﺮﻧﺔ وهﻲ ﻧﺎﺣﻴﺔ أﺳﺎﺳﻴﺔ‬
‫ﻓﻲ أﺳﻠﻮب اﻟﺒﺮﻣﺠﺔ ﻏﺮﺿﻴﺔ اﻟﺘﻮﺝﻪ‪.‬‬

‫ﻣﻼﺣﻈﺔ ﺥﺎﺹﺔ ﺑﻬﻨﺪﺳﺔ اﻟﺒﺮﻣﺠﻴﺎت‬ ‫‪2-1‬‬

‫ﻋﻨﺪ اﻟﻘﻴﺎم ﺑﺎﻟﺒﺮﻣﺠﺔ ﺑﺎﺳﺘﺨﺪام ﻟﻐﺔ ‪ C++‬ﺳﻴﺘﻮﺝﺐ ﻋﻠﻴﻚ اﺳﺘﺨﺪام اﻟﻜﺘﻞ‬


‫اﻟﺠﺎهﺰة اﻟﺘﺎﻟﻴﺔ‪ :‬اﻟﺼﻔﻮف ﻣﻦ ﻣﻜﺘﺒﺎت اﻟﺼﻔﻮف واﻟﺘﻮاﺑﻊ ﻣﻦ اﻟﻤﻜﺘﺒﺔ‬
‫اﻟﻤﻌﻴﺎریﺔ ﻟـ ‪ .C++‬ﺑﺎﻹﺿﺎﻓﺔ إﻟﻰ اﻟﺼﻔﻮف واﻟﺘﻮاﺑﻊ اﻟﺘﻲ ﺕﻘﻮم ﺑﺒﻨﺎءهﺎ‬
‫ﺑﻨﻔﺴﻚ أو ﺕﻠﻚ اﻟﺘﻲ ﻗﺎم اﻟﻐﻴﺮ ﺑﺒﻨﺎءهﺎ وﺝﻌﻠﻬﺎ ﻣﺘﺎﺣﺔ ﻟﻚ‪.‬‬
‫اﻟﻔﺼﻞ اﻷول‬ ‫‪٣٠‬‬

‫ﻣﻼﺣﻈﺔ‬ ‫‪1-1‬‬

‫ﻗﻤﻨﺎ ﺑﺈدراج اﻟﻌﺪیﺪ ﻣﻦ اﻟﺘﻠﻤﻴﺤﺎت واﻟﻤﻼﺣﻈﺎت اﻟﺨﺎﺹﺔ ﺑﻬﻨﺪﺳﺔ اﻟﺒﺮﻣﺠﻴﺎت‬


‫ﺿﻤﻦ ﻓﺼﻮل هﺬا اﻟﻜﺘﺎب وذﻟﻚ ﻟﺸﺮح اﻟﻤﻔﺎهﻴﻢ اﻟﺘﻲ ﺕﺴﺎﻋﺪ ﻋﻠﻰ ﺕﺤﺴﻴﻦ‬
‫اﻟﺒﻨﻴﺔ اﻟﻌﺎﻣﺔ وﻧﻮﻋﻴﺔ اﻷﻧﻈﻤﺔ اﻟﺒﺮﻣﺠﻴﺔ آﺎﻓﺔ وﺥﺎﺹﺔ اﻟﻜﺒﻴﺮة ﻣﻨﻬﺎ‪ .‬وﻟﻘﺪ‬
‫أﺑﺮزﻧﺎ ﺕﻠﻤﻴﺤﺎت اﻟﻌﺎدات اﻟﺒﺮﻣﺠﻴﺔ اﻟﺠﻴﺪة )اﻟﺘﻲ ﺕﺴﺎﻋﺪ ﻋﻠﻰ آﺘﺎﺑﺔ ﺑﺮاﻣﺞ‬
‫واﺿﺤﺔ وﻗﺎﺑﻠﺔ ﻟﻠﻔﻬﻢ واﻟﺼﻴﺎﻧﺔ واﻟﺘﺪﻗﻴﻖ واﻟﻔﺤﺺ ﺑﻜﻞ ﺳﻬﻮﻟﺔ(‪ ،‬اﻷﺥﻄﺎء‬
‫اﻟﺒﺮﻣﺠﻴﺔ اﻟﺸﺎﺋﻌﺔ )وهﻲ اﻟﻤﺸﺎآﻞ اﻟﺸﺎﺋﻌﺔ اﻟﺘﻲ یﺠﺐ اﻟﺤﺬر ﻣﻨﻬﺎ ﻟﺘﺠﻨﺐ‬
‫اﻟﻮﻗﻮع ﺑﻬﺎ أﺛﻨﺎء ﺕﻄﻮیﺮ اﻟﺒﺮاﻣﺞ(‪ ،‬ﺕﺤﺴﻴﻦ اﻷداء )وهﻲ ﺕﻘﻨﻴﺎت ﻣﺴﺎﻋﺪة‬
‫ﻋﻠﻰ آﺘﺎﺑﺔ ﻧﺼﻮص ﺑﺮﻣﺠﻴﺔ ذات ﺳﺮﻋﺔ ﺕﻨﻔﻴﺬ ﻋﺎﻟﻴﺔ واﺳﺘﻬﻼك ﻗﻠﻴﻞ‬
‫ﻟﻠﺬاآﺮة(‪ ،‬ﺕﺤﺴﻴﻦ اﻟﻤﺤﻤﻮﻟﻴﺔ )وهﻲ ﺕﻘﻨﻴﺎت ﻣﺴﺎﻋﺪة ﻋﻠﻰ آﺘﺎﺑﺔ ﻧﺼﻮص‬
‫ﺑﺮﻣﺠﻴﺔ یﻤﻜﻦ ﺕﻨﻔﻴﺬهﺎ ﻋﻠﻰ ﻣﻨﺼﺎت ﻋﻤﻞ وﺣﻮاﺳﻴﺐ ﻣﺨﺘﻠﻔﺔ( وﺕﻠﻤﻴﺤﺎت‬
‫اﻟﻔﺤﺺ واﻟﺘﺤﻘﻖ ‪) Testing and Debugging Tips‬وهﻲ ﺕﻘﻨﻴﺎت ﻣﺴﺎﻋﺪة ﻋﻠﻰ‬
‫إزاﻟﺔ اﻟﻌﻴﻮب اﻟﺒﺮﻣﺠﻴﺔ إﺿﺎﻓﺔ إﻟﻰ آﻮﻧﻬﺎ ﺕﺴﺎﻋﺪ ﻋﻠﻰ ﺕﻄﻮیﺮ ﺑﺮاﻣﺞ ﺥﺎﻟﻴﺔ‬
‫اﻟﻌﻴﻮب‬ ‫ﻣﻦ‬
‫‪ bug- free programs‬ﻓﻲ اﻟﻤﻘﺎم اﻷول(‪ .‬ﺕﻌﺘﺒﺮ اﻟﻌﺪیﺪ ﻣﻦ اﻟﺘﻘﻨﻴﺎت اﻟﺴﺎﺑﻘﺔ‬
‫ﻣﺠﻤﻮﻋﺔ ﻣﻦ اﻟﺘﻮﺝﻴﻬﺎت اﻟﺘﻲ یﻤﻜﻦ أن ﺕﺴﺎﻋﺪك ﻋﻠﻰ ﺕﻄﻮیﺮ أﺳﻠﻮﺑﻚ‬
‫اﻟﺒﺮﻣﺠﻲ اﻟﻤﻔﻀﻞ‪.‬‬

‫ﺗﻜﻤﻦ ﺍﳌﻴﺰﺓ ﺍﻷﺳﺎﺳﻴﺔ ﻟﻘﻴﺎﻣﻚ ﺑﺒﻨﺎﺀ ﺗﻮﺍﺑﻌﻚ ﻭﺻﻔﻮﻓﻚ ﺍﳋﺎﺻﺔ ﰲ ﺃﻧﻚ ﺗﻌﺮﻑ ﲤﺎﻡ ﺍﳌﻌﺮﻓﺔ ﻛﻴﻒ‬
‫ﺗﻌﻤﻞ‪ .‬ﻭﳝﻜﻦ ﻟﻚ ﻓﺤﺺ ﻧﺼﻮﺹ ﺑﺮﺍﳎﻚ ﺍﳌﻜﺘﻮﺑﺔ ﺑﻠﻐﺔ ‪ .C++‬ﰲ ﺣﲔ ﺗﺘﺠﻠﻰ ﺳﻴﺌﺔ ﺗﻠﻚ ﺍﻟﻄﺮﻳﻘﺔ ﰲ‬
‫ﺃﻬﻧﺎ ﺗﺘﻄﻠﺐ ﻭﻗﺘﹰﺎ ﻭﺟﻬﺪﹰﺍ ﻛﺒﲑﻳﻦ ﻣﻦ ﺃﺟﻞ ﺗﺼﻤﻴﻢ ﻭﺗﻄﻮﻳﺮ ﺗﻮﺍﺑﻊ ﻭﺻﻔﻮﻑ ﺟﺪﻳﺪﺓ ﻭﺫﺍﺕ ﺃﺩﺍﺀ ﻓﻌﺎﻝ‪.‬‬
‫ﺗﻠﻤﻴﺢ ﻟﺘﺤﺴﻴﻦ اﻷداء‬ ‫‪1-1‬‬

‫ﻻ ﻣﻦ‬
‫إن اﺳﺘﺨﺪام اﻟﺘﻮاﺑﻊ واﻟﺼﻔﻮف اﻟﻤﻮﺝﻮدة ﻓﻲ اﻟﻤﻜﺘﺒﺔ اﻟﻤﻌﻴﺎریﺔ ﺑﺪ ً‬
‫آﺘﺎﺑﺔ ﻧﺴﺦ ﻣﻜﺎﻓﺌﺔ ﻟﻬﺎ یﻤﻜﻦ أن یﺴﺎﻋﺪ ﻋﻠﻰ ﺕﺤﺴﻴﻦ أداء اﻟﺒﺮﻧﺎﻣﺞ ﻷﻧﻪ‬
‫ﺝﺮى ﺕﻄﻮیﺮ هﺬﻩ اﻟﺘﻮاﺑﻊ ﺑﻌﺪ اﻷﺥﺬ ﺑﻌﻴﻦ اﻻﻋﺘﺒﺎر اﻟﺮﻏﺒﺔ اﻟﻘﻮیﺔ ﻓﻲ‬
‫ﺕﺤﺴﻴﻦ أداء اﻟﺒﺮاﻣﺞ اﻟﺘﻲ ﺕﺪﺥﻞ ﻓﻴﻬﺎ‪.‬‬

‫ﺗﻠﻤﻴﺢ ﻟﺘﺤﺴﻴﻦ اﻟﻤﺤﻤﻮﻟﻴﺔ‬ ‫‪2-1‬‬

‫ﻻ ﻣﻦ‬‫إن اﺳﺘﺨﺪام اﻟﺘﻮاﺑﻊ واﻟﺼﻔﻮف اﻟﻤﻮﺝﻮدة ﻓﻲ اﻟﻤﻜﺘﺒﺔ اﻟﻤﻌﻴﺎریﺔ ﺑﺪ ً‬


‫آﺘﺎﺑﺔ ﻧﺴﺦ ﻣﻜﺎﻓﺌﺔ ﻟﻬﺎ‪ ،‬یﻤﻜﻦ أن یﺴﺎﻋﺪ ﻋﻠﻰ ﺕﺤﺴﻴﻦ اﻟﻤﺤﻤﻮﻟﻴﺔ ﻟﻠﺒﺮﻧﺎﻣﺞ‬
‫اﻟﻤﻜﺘﻮب ﺑﺴﺒﺐ آﻮن هﺬﻩ اﻟﺘﻮاﺑﻊ ﻣﺘﻮﻓﺮة ﻓﻲ ﺝﻤﻴﻊ ﻧﺴﺦ ﻟﻐﺔ ‪.C++‬‬
‫‪٣١‬‬ ‫‪ .1‬ﻣﻘﺪﻣﺔ ﺣﻮل اﻟﺤﻮاﺳﻴﺐ واﻟﺒﺮﻣﺠﺔ ﺑﻠﻐﺔ ‪C++‬‬

‫‪ 9-1‬ﻟﻐﺔ ‪Java‬‬
‫ﻳﻌﺘﻘﺪ ﻋﺪﺩ ﻻ ﺑﺄﺱ ﺑﻪ ﻣﻦ ﺍﻟﻌﺎﻣﻠﲔ ﰲ ﳎﺎﻝ ﺍﳌﻌﺎﳉﺎﺕ ﺍﻟﺼﻐﺮﻳﺔ ‪ Microprocessors‬ﺃﻧﻪ ﺳﻴﻜﻮﻥ ﳍﺬﻩ‬
‫ﺍﳌﻌﺎﳉﺎﺕ ﺗﺄﺛﲑ ﻛﺒﲑ ﰲ ﻋﻤﻠﻴﺎﺕ ﺑﻨﺎﺀ ﻭﺗﻄﻮﻳﺮ ﲡﻬﻴﺰﺍﺕ ﺇﻟﻜﺘﺮﻭﻧﻴﺔ ﺫﻛﻴﺔ‪ .‬ﺍﻧﻄﻼﻗﹰﺎ ﻣﻦ ﻫﺬﻩ ﺍﻟﻔﻜﺮﺓ‪،‬‬
‫ﻗﺎﻣﺖ ﺷﺮﻛﺔ ‪ Sun Microsystems‬ﺑﺘﻤﻮﻳﻞ ﻣﺸﺮﻭﻉ ﲝﺚ ﻋﻠﻤﻲ ﺩﺍﺧﻠﻲ ﻟﺪﻳﻬﺎ ﺍﲰﺘﻪ ‪ Green‬ﰲ ﻋﺎﻡ‬
‫‪ .1991‬ﺃﺩﻯ ﻫﺬﺍ ﺍﳌﺸﺮﻭﻉ ﺇﱃ ﺗﻄﻮﻳﺮ ﻟﻐﺔ ﺑﺮﳎﺔ ﻣﻌﺘﻤﺪﺓ ﻋﻠﻰ ﻟﻐﱵ ‪ C‬ﻭ‪ .C++‬ﻭﻟﻘﺪ ﲰﻴﺖ ﻫﺬﻩ ﺍﻟﻠﻐﺔ‬
‫ﰲ ﺍﻟﺒﺪﺍﻳﺔ ﻟﻐﺔ ‪ Oak‬ﻧﺴﺒﺔ ﺇﱃ ﺷﺠﺮﺓ ﺍﻟﺒﻠﻮﻁ ﺍﻟﱵ ﻳﻄﻞ ﻋﻠﻴﻬﺎ ﻣﻜﺘﺐ ﺍﻟﺴﻴﺪ ‪ James Gosling‬ﳐﺘﺮﻉ ﻫﺬﻩ‬
‫ﺍﻟﻠﻐﺔ‪ .‬ﻟﻜﻨﻪ ﺳﺮﻋﺎﻥ ﻣﺎ ﺗﺒﲔ ﻟﻠﺴﻴﺪ ‪ Gosling‬ﺃﻥ ﻫﻨﺎﻙ ﻟﻐﺔ ﺑﺮﳎﺔ ﺃﺧﺮﻯ ﲢﻤﻞ ﻧﻔﺲ ﺍﻟﺘﺴﻤﻴﺔ‪ .‬ﻭﺃﺛﻨﺎﺀ‬
‫ﺯﻳﺎﺭﺓ ﳎﻤﻮﻋﺔ ﻣﻦ ﺍﻟﻌﺎﻣﻠﲔ ﰲ ﺷﺮﻛﺔ ‪ Sun‬ﺇﱃ ﺃﺣﺪ ﳏﻼﺕ ﺍﻟﻘﻬﻮﺓ ﺍﶈﻠﻴﺔ‪ ،‬ﺟﺮﻯ ﺍﻗﺘﺮﺍﺡ ﺍﻻﺳﻢ ‪Java‬‬
‫ﻟﻠﺘﻌﺒﲑ ﻋﻦ ﻟﻐﺔ ﺍﻟﱪﳎﺔ ﺍﳉﺪﻳﺪﺓ ﺍﳌﻄﻮﺭﺓ ﺣﺪﻳﺜﹰﺎ‪.‬‬
‫ﻟﻜﻦ ﻣﺮ ﺍﳌﺸﺮﻭﻉ ‪ Green‬ﺑﻌﺪﺩ ﻣﻦ ﺍﻟﺼﻌﻮﺑﺎﺕ ﻭﺫﻟﻚ ﺑﺴﺒﺐ ﻋﺪﻡ ﺗﻄﻮﺭ ﺳﻮﻕ ﺍﻟﺘﺠﻬﻴﺰﺍﺕ ﺍﻟﺬﻛﻴﺔ‬
‫ﺑﺎﻟﺴﺮﻋﺔ ﺍﻟﱵ ﺗﻮﻗﻌﺘﻬﺎ ﺷﺮﻛﺔ ‪ .Sun‬ﻭﺍﻷﺳﻮﺀ ﻣﻦ ﺫﻟﻚ ﺃﻧﻪ ﺟﺮﻯ ﲢﻮﻳﻞ ﺃﺣﺪ ﺍﻟﻌﻘﻮﺩ ﺍﳍﺎﻣﺔ ﺍﻟﱵ ﻛﺎﻧﺖ‬
‫ﺷﺮﻛﺔ ‪ Sun‬ﺗﻨﺎﺿﻞ ﻟﻠﺤﺼﻮﻝ ﻋﻠﻴﻪ ﺇﱃ ﺷﺮﻛﺔ ﺃﺧﺮﻯ‪ .‬ﻛﻞ ﺫﻟﻚ ﻛﺎﻥ ﻳﻬﺪﺩ ﺍﳌﺸﺮﻭﻉ ‪ Green‬ﻭﳝﻬﺪ‬
‫ﻼ‪ .‬ﻭﻟﻜﻦ ﳊﺴﻦ ﺍﳊﻆ‪ ،‬ﺑﺪﺃﺕ ﰲ ﻋﺎﻡ ‪ 1993‬ﺷﻌﺒﺔ ﺷﺒﻜﺔ ﺍﻟﻮﻳﺐ ‪World‬‬ ‫ﺑﺎﻟﺘﺎﱄ ﺇﱃ ﺇﻬﻧﺎﺋﻪ ﻭﺗﻮﻗﻴﻔﻪ ﻛﺎﻣ ﹰ‬
‫‪ Wide Web‬ﻭﺗﻄﺒﻴﻘﺎﻬﺗﺎ ﺑﺎﻻﻧﺘﺸﺎﺭ ﺍﻟﻜﺒﲑ ﻭﲢﺴﺴﺖ ﺷﺮﻛﺔ ‪ Sun‬ﻷﳘﻴﺔ ﺍﺳﺘﺨﺪﺍﻡ ‪ Java‬ﰲ ﺗﻄﻮﻳﺮ ﻣﺎ‬
‫ﻳﺴﻤﻰ ﺑﺎﶈﺘﻮﻯ ﺍﻟﺪﻳﻨﺎﻣﻴﻜﻲ ‪ Dymanic Content‬ﻟﺼﻔﺤﺎﺕ ﺍﻟﻮﻳﺐ‪.‬‬
‫ﻗﺎﻣﺖ ﺷﺮﻛﺔ ‪ Sun‬ﺑﺎﻹﻋﻼﻥ ﺭﲰﻴﹰﺎ ﻋﻦ ﻟﻐﺔ ‪ Java‬ﰲ ﻋﺮﺽ ﲡﺎﺭﻱ ﰲ ﺷﻬﺮ ﺃﻳﺎﺭ ﻋﺎﻡ ‪ .1995‬ﻭﻟﻘﺪ ﻇﻬﺮ‬
‫ﻣﺒﺎﺷﺮﺓ ﺍﻫﺘﻤﺎﻡ ﺍﻟﻌﺎﻣﻠﲔ ﰲ ﳎﺎﻝ ﺍﻷﻋﻤﺎﻝ ﻬﺑﺎ ﺑﺴﺒﺐ ﻇﺎﻫﺮ ﺍﻻﻫﺘﻤﺎﻡ ﺍﻟﻌﺎﻡ ﺑﺸﺒﻜﺔ ﺍﻟﻮﻳﺐ ﺍﻟﻌﺎﳌﻴﺔ‪.‬‬
‫ﺗﺴﺘﺨﺪﻡ ﻟﻐﺔ ‪ Java‬ﺣﺎﻟﻴﹰﺎ ﻟﺒﻨﺎﺀ ﺻﻔﺤﺎﺕ ﻭﻳﺐ ﺫﺍﺕ ﳏﺘﻮﻯ ﺩﻳﻨﺎﻣﻴﻜﻲ ﻭﲣﺎﻃﱯ‪ .‬ﻛﻤﺎ ﺗﺴﺘﺨﺪﻡ ﺃﻳﻀﹰﺎ‬
‫ﻟﺒﻨﺎﺀ ﺗﻄﺒﻴﻘﺎﺕ ﻭﺍﺳﻌﺔ ﻭﻟﺘﺤﺴﲔ ﻋﻤﻞ ﳐﺪﻣﺎﺕ ﺍﻟﻮﻳﺐ )ﻭﻫﻲ ﺍﳊﻮﺍﺳﻴﺐ ﺍﻟﱵ ﺗﺰﻭﺩﻧﺎ ﺑﺎﶈﺘﻮﻯ ﺍﻟﺬﻱ‬
‫ﻧﺴﺘﻌﺮﺿﻪ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺍﳌﺘﺼﻔﺤﺎﺕ(‪ .‬ﺳﺎﻋﺪﺕ ﻫﺬﻩ ﺍﻟﻠﻐﺔ ﺃﻳﻀﹰﺎ ﻋﻠﻰ ﺗﻮﻓﺮ ﺗﻄﺒﻴﻘﺎﺕ ﻟﺒﻌﺾ ﺍﻟﺘﺠﻬﻴﺰﺍﺕ‪،‬‬
‫ﻣﺜﻞ ﺍﳍﻮﺍﺗﻒ ﺍﶈﻤﻮﻟﺔ ‪ Cell Phones‬ﻭﺍﻟـ ‪ Pagers‬ﻭﻏﲑﻫﺎ‪...‬‬
‫ﰲ ﻋﺎﻡ ‪ ،1995‬ﻛﻨﺎ ﻧﺘﺎﺑﻊ ﺗﻄﻮﻳﺮ ﻟﻐﺔ ‪ Java‬ﻣﻦ ﺧﻼﻝ ﺷﺮﻛﺔ ‪ .Sun Microsystems‬ﻭﰲ ﺷﻬﺮ ﺗﺸﺮﻳﻦ‬
‫ﺍﻟﺜﺎﱐ ‪ November‬ﻋﺎﻡ ‪ ،1995‬ﺗﺎﺑﻌﻨﺎ ﻣﺆﲤﺮﹰﺍ ﺣﻮﻝ ﺷﺒﻜﺔ ﺍﻹﻧﺘﺮﻧﺖ ﰲ ﺑﻮﺳﻄﻦ ‪ .Boston‬ﺃﺛﻨﺎﺀ ﻫﺬﺍ‬
‫ﺍﳌﺆﲤﺮ‪ ،‬ﻗﺎﻡ ﺃﺣﺪ ﳑﺜﻠﻲ ﺷﺮﻛﺔ ‪ Sun‬ﺑﺘﻘﺪﱘ ﻋﺮﺽ ﻣﺜﲑ ﺣﻮﻝ ﻟﻐﺔ ‪ .Java‬ﺑﺮﺯ ﻣﻦ ﺧﻼﻝ ﺍﻟﻌﺮﺽ ﺃﻥ ﻟﻐﺔ‬
‫‪ Java‬ﺳﺘﻠﻌﺐ ﺩﻭﺭﹰﺍ ﰲ ﺗﻄﻮﻳﺮ ﺻﻔﺤﺎﺕ ﺍﻟﻮﻳﺐ ﺍﻟﺘﺨﺎﻃﺒﻴﺔ ﻭﻣﺘﻌﺪﺩﺓ ﺍﻟﻮﺳﺎﺋﻂ‪ .‬ﻭﻟﻜﻨﻨﺎ ﻻﺣﻈﻨﺎ ﻣﻦ‬
‫ﺟﻬﺘﻨﺎ ﺇﻣﻜﺎﻧﻴﺎﺕ ﺃﺧﺮﻯ ﳍﺬﻩ ﺍﻟﻠﻐﺔ‪.‬‬
‫ﻻﺣﻈﻨﺎ ﺃﻧﻪ ﳝﻜﻦ ﺍﺳﺘﺨﺪﺍﻡ ﻟﻐﺔ ‪ Java‬ﰲ ﺍﻟﺴﻨﺔ ﺍﻷﻭﱃ ﻟﺘﻌﻠﻴﻢ ﺍﻟﱪﳎﺔ ﻟﺘﻮﺿﻴﺢ ﺗﻘﻨﻴﺎﺕ ﻣﺮﺗﺒﻄﺔ‬
‫ﺑﺄﺳﺎﺳﻴﺎﺕ ﺍﻟﺮﺳﻮﻣﻴﺎﺕ ‪ ،Graphics‬ﻭﺍﻟﺘﻌﺎﻣﻞ ﻣﻊ ﺍﻟﺼﻮﺭ ‪ Images‬ﻭﺍﻹﺣﻴﺎﺀ ‪ Animation‬ﻭﺍﻟﺼﻮﺕ‬
‫‪ Audio‬ﻭﺍﻟﻔﻴﺪﻳﻮ ﻭﻗﻮﺍﻋﺪ ﺍﳌﻌﻄﻴﺎﺕ ‪ Databases‬ﻭﺍﻟﺸﺒﻜﺎﺕ ‪ Networking‬ﻭﺗﻌﺪﺩ ﺍﳌﺴﺎﺭﺍﺕ‬
‫‪ Multithreading‬ﻭﺍﳊﻮﺳﺒﺔ ﺍﻟﺘﻌﺎﻭﻧﻴﺔ ‪.Collaborative Computing‬‬
‫اﻟﻔﺼﻞ اﻷول‬ ‫‪٣٢‬‬

‫‪Internet‬‬ ‫ﺇﺿﺎﻓﺔ ﺇﱃ ﺷﻬﺮﺓ ﻟﻐﺔ ‪ Java‬ﰲ ﳎﺎﻝ ﺗﻄﻮﻳﺮ ﺗﻄﺒﻴﻘﺎﺕ ﻣﻌﺘﻤﺪﺓ ﻋﻠﻰ ﺷﺒﻜﺔ ﺍﻹﻧﺘﺮﻧﺖ‬
‫ﺃﻭ ﺷﺒﻜﺔ ﺍﻹﻧﺘﺮﺍﻧﺖ ‪ ،Interanet‬ﻓﺈﻧﻪ ﻣﻦ ﺍﳌﺆﻛﺪ ﺃﻬﻧﺎ ﺳﺘﺼﺒﺢ ﺍﳋﻴﺎﺭ ﺍﻷﻭﻝ ﻟﺒﻨﺎﺀ ﻭﺗﻄﻮﻳﺮ ﺑﺮﳎﻴﺎﺕ‬
‫ﻟﺘﺠﻬﻴﺰﺍﺕ ﻗﺎﺩﺭﺓ ﻋﻠﻰ ﺍﻻﺗﺼﺎﻝ ﻣﻦ ﺧﻼﻝ ﺍﻟﺸﺒﻜﺔ )ﻣﺜﻞ ﺍﳍﻮﺍﺗﻒ ﺍﶈﻤﻮﻟﺔ ﺍﳋﻠﻮﻳﺔ ‪Cellular Phones‬‬
‫ﻭﺍﻟـ ‪ ... Pagers‬ﻭﻏﲑﻫﺎ(‪ .‬ﻻ ﳚﺐ ﻋﻠﻴﻚ ﺃﻥ ﺗﺴﺘﻐﺮﺏ ﺇﺫﺍ ﻋﺮﻓﺖ ﺃﻧﻪ ﳝﻜﻦ ﺭﺑﻂ ﲡﻬﻴﺰﺍﺕ ﺍﻟﺼﻮﺕ‬
‫ﺍﳊﺪﻳﺜﺔ ﺍﻟﱵ ﲤﺘﻠﻜﻬﺎ ﰲ ﺑﻴﺖ ﻣﻦ ﺧﻼﻝ ﺍﻟﺸﺒﻜﺔ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺗﻘﻨﻴﺎﺕ ‪.Java‬‬
‫‪ 10-1‬ﻟﻐﺎت ‪ Visual Basic‬و‪ Visual C++‬و‪C#‬‬
‫ﺗﺒﲔ ﺃﻥ ﺗﻄﻮﻳﺮ ﻭﺑﻨﺎﺀ ﺗﻄﺒﻴﻘﺎﺕ ﺫﺍﺕ ﻭﺍﺟﻬﺎﺕ ﺑﻴﺎﻧﻴﺔ ﺑﺎﺳﺘﺨﺪﺍﻡ ﻟﻐﺎﺕ ‪ C‬ﻭ‪ C++‬ﻫﻲ ﻋﻤﻠﻴﺔ ﺻﻌﺒﺔ ﻭﻟﻴﺴﺖ‬
‫ﺑﺎﻟﺴﻬﻠﺔ‪ .‬ﻋﻨﺪﻣﺎ ﺃﺳﺲ ﺑﻴﻞ ﻏﻴﺖ ﺷﺮﻛﺔ ‪ ،Microsoft‬ﻗﺎﻡ ﺑﺘﻄﻮﻳﺮ ﻟﻐﺔ ‪ BASIC‬ﻋﻠﻰ ﻋﺪﺓ ﺃﻧﻮﺍﻉ ﻣﻦ ﺍﳊﻮﺍﺳﻴﺐ‬
‫ﺍﻟﺸﺨﺼﻴﺔ‪ .‬ﺟﺮﻯ ﺗﻄﻮﻳﺮ ﻟﻐﺔ ‪ (Beginner's All- Puurpose Symbolic Instruction Code) Basic‬ﰲ ﻣﻨﺘﺼﻒ‬
‫ﺍﻟﺴﺘﻴﻨﺎﺕ ﻣﻦ ﻗﺒﻞ ﺍﻷﺳﺎﺗﺬﺓ ‪ John Kemeny‬ﻭ‪ Thom as Kurtz‬ﰲ ﻛﻠﻴﺔ ‪ Dartmouth‬ﻭﺍﺳﺘﺨﺪﻣﺖ ﻫﺬﻩ ﺍﻟﻠﻐﺔ‬
‫ﻟﻜﺘﺎﺑﺔ ﺑﺮﺍﻣﺞ ﺑﺴﻴﻄﺔ‪ .‬ﻛﺎﻥ ﺍﳍﺪﻑ ﻣﻦ ﻫﺬﻩ ﺍﻟﻠﻐﺔ ﰲ ﺍﻟﺒﺪﺍﻳﺔ ﺗﻌﺮﻳﻒ ﻣﺒﺘﺪﺋﻲ ﺍﻟﱪﳎﺔ ﺑﺘﻘﻨﻴﺎﺕ ﺍﻟﱪﳎﺔ‪ .‬ﺟﺮﻯ‬
‫ﺗﻄﻮﻳﺮ ﻟﻐﺔ ‪ Basic‬ﺇﱃ ‪ Visual Basic‬ﰲ ﻋﺎﻡ ‪ 1991‬ﻛﻨﺘﻴﺠﺔ ﻟﺘﻄﻮﻳﺮ ﺷﺮﻛﺔ ‪ Microsoft‬ﻟﻮﺍﺟﻬﺎﺕ ﺍﳌﺴﺘﺨﺪﻡ‬
‫ﺍﻟﺒﻴﺎﻧﻴﺔ )‪ Graphical Vser Interface (GUI‬ﰲ ﺃﻭﺍﺧﺮ ﺍﻟﺜﻤﺎﻧﻴﻨﺎﺕ ﻭﺑﺪﺍﻳﺔ ﺍﻟﺘﺴﻌﻴﻨﺎﺕ‪.‬‬
‫ﺟﺮﻯ ﺍﺷﺘﻘﺎﻕ ﻟﻐﺔ ‪ Visual Basic‬ﻣﻦ ﻟﻐﺔ ‪ Basic‬ﺃﻳﻀﹰﺎ ﻭﺍﻟﱵ ﺗﻌﺘﱪ ﻟﻐﺔ ﳐﺘﻠﻔﺔ ﻋﻨﻬﺎ‪ ،‬ﻣﻦ ﺧﻼﻝ ﺇﺗﺎﺣﺘﻬﺎ‬
‫ﻹﻣﻜﺎﻧﻴﺎﺕ ﻗﻮﻳﺔ ﻟﺒﻨﺎﺀ ﻭﺍﺟﻬﺔ ﺑﻴﺎﻧﻴﺔ‪ ،‬ﻭﺗﻌﺎﻣﻠﻬﺎ ﻣﻊ ﺍﻷﺣﺪﺍﺙ‪ ،‬ﻭﺍﻟﻮﺻﻮﻝ ﺇﱃ ﺍﻟﻮﺍﺟﻬﺎﺕ ﺍﻟﱪﳎﻴﺔ‬
‫ﻟﺘﻄﺒﻴﻘﺎﺕ )‪ ،(32-bit‬ﻭﺍﻟﱪﳎﺔ ﻏﺮﺿﻴﺔ ﺍﻟﺘﻮﺟﻪ‪ ،‬ﺇﺿﺎﻓﺔ ﺇﱃ ﺍﻟﺘﻌﺎﻣﻞ ﻣﻊ ﺍﻷﺧﻄﺎﺀ‪ .‬ﺗﻌﺪ ﻟﻐﺔ ‪Visual Basic‬‬
‫ﻭﺍﺣﺪﺓ ﻣﻦ ﻟﻐﺎﺕ ﺍﻟﱪﳎﺔ ﺍﻟﺸﻬﲑﺓ ﻭﺍﳌﻘﺎﺩﺓ ﺑﺎﻷﺣﺪﺍﺙ ﻭﻭﺍﺟﻬﺎﺕ ﺍﻟﱪﳎﺔ ﺍﻟﺒﻴﺎﻧﻴﺔ‪.‬‬
‫ﺗﺴﻤﻰ ﺍﻟﻨﺴﺨﺔ ﺍﻷﺧﲑ ﻟﻠﻐﺔ ‪ Visual Basic‬ﺑﻠﻐﺔ ‪ Visual Basic.Net‬ﻭﺍﻟﱵ ﺟﺮﻯ ﺗﺼﻤﻴﻤﻬﺎ ﻣﻦ ﺃﺟﻞ ﻣﻨﺼﺔ‬
‫ﺍﻟﻌﻤﻞ ﺍﳉﺪﻳﺪﺓ ‪ .Net‬ﺍﳋﺎﺻﺔ ﺑـ ‪ .Microsoft‬ﺃﺗﺎﺣﺖ ﺍﻟﻨﺴﺦ ﺍﻟﺴﺎﺑﻘﺔ ﻟﻠﻐﺔ ‪ Visual Basic‬ﺇﻣﻜﺎﻧﻴﺎﺕ‬
‫ﻏﺮﺿﻴﺔ ﺍﻟﺘﻮﺟﻪ‪ ،‬ﻟﻜﻦ ﺗﻘﺪﻡ ﻟﻐﺔ ‪ Visual Basic.Net‬ﺇﻣﻜﺎﻧﻴﺎﺕ ﻏﺮﺿﻴﺔ ﺍﻟﺘﻮﺟﻪ ﻣﺘﻘﺪﻣﺔ ‪Visual Basic.Net‬‬

‫ﻭﺗﺘﻴﺢ ﺍﺠﻤﻟﺎﻝ ﻻﺳﺘﺨﺪﺍﻡ ﻣﻜﻮﻧﺎﺕ ‪ .Net‬ﺍﻟﱪﳎﻴﺔ ﻣﻦ ﺧﻼﻝ ﺍﳌﻜﺘﺒﺎﺕ ﺍﳌﺘﻘﺪﻣﺔ ﺍﳌﺘﻮﻓﺮﺓ‪.‬‬


‫ﺗﻌﺘﱪ ﺑﻴﺌﺔ ﺍﻟﱪﳎﺔ ‪ Visual C++‬ﺗﻄﻮﻳﺮﹰﺍ ﻣﻦ ﻗﺒﻞ ﺷﺮﻛﺔ ‪ Microsoft‬ﻟﻠﻐﺔ ‪ C++‬ﺇﺿﺎﻓﺔ ﺇﱃ ﺍﻹﺿﺎﻓﺎﺕ ﺍﻟﱵ‬
‫ﺃﺩﺧﻠﺘﻬﺎ ﺇﻟﻴﻬﺎ‪ .‬ﺟﺮﻯ ﺑﻨﺎﺀ ﺍﻟﻮﺍﺟﻬﺎﺕ ﺍﻟﺒﻴﺎﻧﻴﺔ ﺍﻷﻭﱃ ﰲ ‪ Visual C++‬ﺑﺎﺳﺘﺨﺪﺍﻡ ﺻﻔﻮﻑ ﺍﻷﺳﺎﺱ‬
‫ﳌﺎﻳﻜﺮﻭﺳﻮﻓﺖ ‪ (MFC) Microsoft Foundation Classes‬ﻭﺑﻌﺪ ﺇﺩﺧﺎﻝ ﺗﻘﻨﻴﺎﺕ ‪ .Net‬ﺣﺎﻟﻴﺎﹰ‪ ،‬ﻗﺎﻣﺖ ﺷﺮﻛﺔ‬
‫ﻣﺎﻳﻜﺮﻭﺳﻮﻓﺖ ﺑﺘﻮﻓﲑ ﻣﻜﺘﺒﺔ ﻋﺎﻣﺔ ﻟﺒﻨﺎﺀ ﻭﺍﺟﻬﺎﺕ ﻣﺴﺘﺨﺪﻣﲔ ﺑﻴﺎﻧﻴﺔ ﻭﻟﻠﺘﻌﺎﻣﻞ ﻣﻊ ﺍﻟﺸﺒﻜﺎﺕ ﻭﺗﻌﺪﺩ‬
‫ﺍﳌﺴﺎﺭﺍﺕ ﻭﻏﲑ ﺫﻟﻚ ﻣﻦ ﺍﳌﻘﺪﺭﺍﺕ ﺍﻷﺧﺮﻯ‪ .‬ﻫﺬﻩ ﺍﳌﻜﺘﺒﺔ ﻫﻲ ﻣﻜﺘﺒﺔ ﻣﺸﺘﺮﻛﺔ ﺑﲔ ﻟﻐﺎﺕ ‪Visual Basic‬‬
‫ﻭ‪ Visual C++‬ﻭﻟﻐﺔ ‪ C#‬ﺍﳉﺪﻳﺪﺓ‪.‬‬
‫ﺳﺎﻫﻢ ﺗﻄﻮﺭ ﺃﺩﻭﺍﺕ ﺍﻟﱪﳎﺔ )ﻣﺜﻞ ‪ C++‬ﻭ‪ (Java‬ﻭﺍﻟﺘﺠﻬﻴﺰﺍﺕ ﺍﻹﻟﻜﺘﺮﻭﻧﻴﺔ )ﻣﺜﻞ ﺍﳍﻮﺍﺗﻒ ﺍﳋﻠﻮﻳﺔ( ﰲ‬
‫ﻇﻬﻮﺭ ﺇﺷﻜﺎﻻﺕ ﻭﻣﺘﻄﻠﺒﺎﺕ ﺟﺪﻳﺪﺓ‪ .‬ﻟﻘﺪ ﺗﺒﲔ ﺃﻥ ﺍﳌﻜﺎﻣﻠﺔ ﺑﲔ ﺍﳌﻜﻮﻧﺎﺕ ﺍﻟﱪﳎﻴﺔ ﺍﳌﺨﺘﻠﻔﺔ ﺍﳌﻜﺘﻮﺑﺔ‬
‫ﺑﻠﻐﺎﺕ ﺳﺎﺑﻘﺔ‪ ،‬ﻫﻲ ﻋﻤﻠﻴﺔ ﺻﻌﺒﺔ‪ .‬ﻧﺎﻫﻴﻚ ﻋﻦ ﻇﻬﻮﺭ ﻣﺸﺎﻛﻞ ﺗﺜﺒﻴﺖ ﻭﺗﺄﻫﻴﻞ ﳍﺬﻩ ﺍﻟﱪﳎﻴﺎﺕ ﺑﺴﺒﺐ‬
‫‪٣٣‬‬ ‫‪ .1‬ﻣﻘﺪﻣﺔ ﺣﻮل اﻟﺤﻮاﺳﻴﺐ واﻟﺒﺮﻣﺠﺔ ﺑﻠﻐﺔ ‪C++‬‬

‫ﻋﺪﻡ ﺍﻟﺘﻮﺍﻓﻖ ﺑﲔ ﺍﻟﻨﺴﺦ ﺍﳉﺪﻳﺪﺓ ﻟﻠﻤﻜﻮﻧﺎﺕ ﺍﳌﺸﺘﺮﻛﺔ ﻭﺍﻟﱪﳎﻴﺎﺕ ﺍﻟﻘﺪﳝﺔ‪ .‬ﺇﺿﺎﻓﺔ ﺇﱃ ﺫﻟﻚ‪ ،‬ﻓﻠﻘﺪ‬
‫ﻻﺣﻆ ﺍﳌﻄﻮﺭﻭﻥ ﺃﻬﻧﻢ ﲝﺎﺟﺔ ﺇﱃ ﺗﻄﺒﻴﻘﺎﺕ ﻣﻌﺘﻤﺪﺓ ﻋﻠﻰ ﺍﻟﻮﻳﺐ ﻭﳝﻜﻦ ﺍﻟﻮﺻﻮﻝ ﺇﻟﻴﻬﺎ ﻭﺍﻟﺘﻌﺎﻣﻞ ﻣﻌﻬﺎ‬
‫ﻣﻦ ﺧﻼﻝ ﺷﺒﻜﺔ ﺍﻹﻧﺘﺮﻧﺖ‪ .‬ﻭﻧﺘﻴﺠﺔ ﻟﺸﻌﺒﻴﺔ ﺍﻟﺘﺠﻬﻴﺰﺍﺕ ﺍﻹﻟﻜﺘﺮﻭﻧﻴﺔ‪ ،‬ﻻﺣﻆ ﺍﳌﻄﻮﺭﻭﻥ ﺃﻥ ﺯﺑﺎﺋﻨﻬﻢ ﱂ‬
‫ﻳﻌﻮﺩﻭﺍ ﳏﺼﻮﺭﻳﻦ ﺑﺄﻭﻟﺌﻚ ﺍﻟﺬﻳﻦ ﻳﻌﻤﻠﻮﻥ ﻋﻠﻰ ﺍﳊﻮﺍﺳﻴﺐ ﺍﻟﺘﻘﻠﻴﺪﻳﺔ ﻭﻫﻢ ﺑﺎﻟﺘﺎﱄ ﻣﻄﺎﻟﺒﻮﻥ ﺑﺒﻨﺎﺀ ﺑﺮﳎﻴﺎﺕ‬
‫ﳝﻜﻦ ﺍﻟﺘﻌﺎﻣﻞ ﻣﻌﻬﺎ ﻭﺍﻟﻮﺻﻮﻝ ﺇﻟﻴﻬﺎ ﻣﻦ ﺧﻼﻝ ﺃﻱ ﺟﻬﺎﺯ ﺗﻘﺮﻳﺒﹰﺎ‪.‬‬
‫ﻭﻟﻐﺔ ﺍﻟﱪﳎﺔ‬ ‫‪.Net‬‬ ‫ﳌﻮﺍﺟﻬﺔ ﻫﺬﻩ ﺍﳊﺎﺟﺎﺕ ﺍﳉﺪﻳﺪﺓ‪ ،‬ﻗﺎﻣﺖ ﺷﺮﻛﺔ ﻣﺎﻳﻜﺮﻭﺳﻮﻓﺖ ﺑﺘﻄﻮﻳﺮ ﺑﻴﺌﺔ ﺍﻟﻌﻤﻞ‬
‫ﺍﳉﺪﻳﺪﺓ ‪.C#‬‬
‫ﳝﻜﻦ ﺑﻮﺍﺳﻄﺔ ﺑﻴﺌﺔ ﺍﻟﻌﻤﻞ ‪ .Net‬ﺗﻮﺯﻳﻊ ﺍﻟﺘﻄﺒﻴﻘﺎﺕ ﺍﳌﻌﺘﻤﺪﺓ ﻋﻠﻰ ﺍﻟﻮﻳﺐ ﻋﻠﻰ ﺷﺮﳛﺔ ﻭﺍﺳﻌﺔ ﻣﻦ‬
‫ﺍﻟﺘﺠﻬﻴﺰﺍﺕ ﺍﻹﻟﻜﺘﺮﻭﻧﻴﺔ ﻭﻋﻠﻰ ﺍﳊﻮﺍﺳﻴﺐ ﺍﻟﺘﻘﻠﻴﺪﻳﺔ‪ .‬ﻳﺘﻮﻓﺮ ﰲ ﺑﻴﺌﺔ ﺍﻟﻌﻤﻞ ﻫﺬﻩ ﳕﻮﺫﺟﹰﺎ ﺟﺪﻳﺪﹰﺍ ﻟﻠﺘﻌﺎﻣﻞ‬
‫ﻣﻊ ﺍﻟﱪﳎﻴﺎﺕ ﳑﺎ ﻳﺴﺎﻋﺪ ﻋﻠﻰ ﺗﻄﻮﻳﺮ ﻭﺑﻨﺎﺀ ﺗﻄﺒﻴﻘﺎﺕ ﺑﻌﺪﺓ ﻟﻐﺎﺕ ﻭﻳﺴﻤﺢ ﳍﺎ ﺑﺎﻻﺗﺼﺎﻝ ﻓﻴﻤﺎ ﺑﻴﻨﻬﺎ‪.‬‬
‫ﺟﺮﻯ ﺗﻄﻮﻳﺮ ﻟﻐﺔ ‪ C#‬ﺧﺼﻴﺼﹰﺎ ﻣﻦ ﺃﺟﻞ ﲤﻜﲔ ﺍﳌﱪﳎﲔ ﺍﻻﻧﺘﻘﺎﻝ ﺑﺴﻬﻮﻟﺔ ﺇﱃ ﺑﻴﺌﺔ ﺍﻟﻌﻤﻞ ‪ ،.Net‬ﻭﻳﻌﺰﺯ‬
‫ﻫﺬﺍ ﺍﻻﻋﺘﻘﺎﺩ ﻛﻮﻥ ﻫﺬﻩ ﺍﻟﻠﻐﺔ ﳍﺎ ﺟﺬﻭﺭ ﰲ ﻟﻐﺎﺕ ‪ C‬ﻭ‪ C++‬ﻭ‪ Java‬ﻭﺫﻟﻚ ﺑﻌﺪ ﻣﻼﺋﻤﺔ ﻣﺎ ﺗﺘﺼﻒ ﺑﻪ‬
‫ﻫﺬﻩ ﺍﻟﻠﻐﺎﺕ ﻣﻦ ﻣﺰﺍﻳﺎ ﺣﺴﻨﺔ ﻭﺇﺿﺎﻓﺔ ﻣﻴﺰﺍﺕ ﺟﻴﺪﺓ ﺃﺧﺮﻯ ﳑﻴﺰﺓ ﻟﻠﻐﺔ ‪ .C#‬ﻭﻋﻠﻰ ﺍﻋﺘﺒﺎﺭ ﺃﻧﻪ ﺟﺮﻯ ﺑﻨﺎﺀ‬
‫ﻭﺗﻄﻮﻳﺮ ﻟﻐﺔ ‪ C#‬ﺍﻋﺘﻤﺎﺩﹰﺍ ﻋﻠﻰ ﻟﻐﺎﺕ ﺑﺮﳎﺔ ﺟﻴﺪﺓ ﻭﻭﺍﺳﻌﺔ ﺍﻻﻧﺘﺸﺎﺭ ﻓﺈﻥ ﺫﻟﻚ ﺳﻴﺠﻌﻞ ﻣﻨﻬﺎ ﻟﻐﺔ ﺳﻬﻠﺔ‬
‫ﻭﳑﺘﻌﺔ‪.‬‬
‫ﺗﻌﺘﱪ ﻟﻐﺔ ‪ C#‬ﻟﻐﺔ ﻣﻘﺎﺩﺓ ﺑﺎﻷﺣﺪﺍﺙ ﻭﻟﻐﺔ ﻏﺮﺿﻴﺔ ﺍﻟﺘﻮﺟﻪ ﻛﺎﻣﻠﺔ ﻭﻟﻐﺔ ﺑﺮﳎﺔ ﻣﺮﺋﻴﺔ ﰲ ﻧﻔﺲ ﺍﻟﻮﻗﺖ‪.‬‬
‫ﻭﳚﺮﻱ ﺑﻨﺎﺀ ﺍﻟﱪﺍﻣﺞ ﻣﻦ ﺧﻼﳍﺎ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺑﻴﺌﺔ ﺍﻟﻌﻤﻞ ﺍﳌﺘﻜﺎﻣﻠﺔ ﻣﻌﻬﺎ ‪(IDE) Integrated Development‬‬
‫‪ Environment‬ﻭﺍﻟﱵ ﺗﺴﻤﻰ ‪ .Visual Studio.Net‬ﳝﻜﻦ ﻣﻦ ﺧﻼﻝ ﺍﻟﺒﻴﺌﺔ )‪ (IDE‬ﺑﻨﺎﺀ ﻭﺗﺸﻐﻴﻞ ﻭﻓﺤﺺ‬
‫ﻭﺗﺪﻗﻴﻖ ﺑﺮﺍﻣﺞ ‪ C#‬ﺑﻜﻞ ﺳﻬﻮﻟﺔ ﻭﺩﻭﻥ ﺇﺿﺎﻓﺔ ﺍﻟﻮﻗﺖ ﻹﳒﺎﺯ ﺫﻟﻚ ﰲ ﺣﺎﻝ ﻋﺪﻡ ﺗﻮﻓﺮ ﻣﺜﻞ ﺗﻠﻚ ﺍﻟﺒﻴﺌﺔ‪.‬‬
‫ﺗﺴﻤﻰ ﻫﺬﻩ ﺍﻟﻌﻤﻠﻴﺔ ﺍﻟﺴﺮﻳﻌﺔ ﰲ ﺍﻟﺘﻄﻮﻳﺮ ﺍﻟﱪﳎﻲ ﺑﺎﺳﺘﺨﺪﺍﻡ ‪ IDE‬ﺑﺎﻟﺘﻄﻮﻳﺮ ﺍﻟﱪﳎﻲ ﺍﻟﺴﺮﻳﻊ ‪(RAD) Rapid‬‬
‫‪.Application Development‬‬
‫ﺗﺴﺎﻫﻢ ﻟﻐﺔ ‪ C#‬ﰲ ﻇﻬﻮﺭ ﺷﻜﻞ ﺟﺪﻳﺪ ﻟﻠﺘﺒﺎﺩﻝ ﺑﲔ ﻟﻐﺎﺕ ﺍﻟﱪﳎﺔ ﺍﳌﺨﺘﻠﻔﺔ‪ .‬ﳝﻜﻦ ﻟﻠﻤﻜﻮﻧﺎﺕ ﺍﻟﱪﳎﻴﺔ‬
‫ﻣﻦ ﻋﺪﺓ ﻟﻐﺎﺕ ﺃﻥ ﺗﺘﻔﺎﻋﻞ ﻓﻴﻤﺎ ﺑﻴﻨﻬﺎ ﺑﻄﺮﻳﻘﺔ ﱂ ﺗﻜﻦ ﻣﻌﺮﻭﻓﺔ ﻣﻦ ﻗﺒﻞ‪ .‬ﳝﻜﻦ ﺃﻳﻀﹰﺎ ﻟﻠﻤﻄﻮﺭﻳﻦ ﺃﻥ‬
‫ﻳﺘﻌﺎﻣﻠﻮﺍ ﰲ ﺑﺮﺍﳎﻬﻢ ﺍﳉﺪﻳﺪﺓ ﺑﻠﻐﺔ ‪ C#‬ﻣﻊ ﺍﻟﱪﺍﻣﺞ ﺍﻟﻘﺪﳝﺔ‪ .‬ﻛﻤﺎ ﳝﻜﻦ ﻟﱪﺍﻣﺞ ‪ C#‬ﺃﻥ ﳚﺮﻱ ﺍﻟﺘﻌﺎﻣﻞ‬
‫ﻣﻌﻬﺎ ﻣﻦ ﺧﻼﻝ ﺷﺒﻜﺔ ﺍﻹﻧﺘﺮﻧﺖ‪.‬‬

‫ﻟﻐﺎت اﻟﺒﺮﻣﺠﺔ ﻋﺎﻟﻴﺔ اﻟﻤﺴﺘﻮى اﻷﺥﺮى‬ ‫‪11-1‬‬


‫ﰎ ﺗﻄﻮﻳﺮ ﺍﳌﺌﺎﺕ ﻣﻦ ﻟﻐﺎﺕ ﺍﻟﱪﳎﺔ ﻋﺎﻟﻴﺔ ﺍﳌﺴﺘﻮﻯ ﻟﻜﻦ ﺍﻟﻘﻠﻴﻞ ﻣﻨﻬﺎ ﺣﻘﻖ ﺇﻧﺘﺸﺎﺭﹰﺍ ﻭﺍﺳﻌﹰﺎ‪ .‬ﻓﻠﻘﺪ ﰎ‬
‫ﺗﻄﻮﻳﺮ ﻟﻐﺔ ‪ (FORmula TRANslator) FORTRAN‬ﻣﻦ ﻗﺒﻞ ﺷﺮﻛﺔ ‪ IBM‬ﺧﻼﻝ ﺍﻟﻔﺘﺮﺓ ﺍﳌﻤﺘﺪﺓ ﻣﻦ ﻋﺎﻡ ‪1954‬‬
‫ﺣﱴ ﺍﻟﻌﺎﻡ ‪ 1957‬ﻭﺫﻟﻚ ﻣﻦ ﺃﺟﻞ ﺍﺳﺘﺨﺪﺍﻣﻬﺎ ﰲ ﺍﻟﺘﻄﺒﻴﻘﺎﺕ ﺍﻟﻌﻠﻤﻴﺔ ﻭﺍﳍﻨﺪﺳﻴﺔ ﺍﻟﱵ ﺗﺘﻄﻠﺐ ﺣﺴﺎﺑﺎﺕ‬
‫اﻟﻔﺼﻞ اﻷول‬ ‫‪٣٤‬‬

‫ﺭﻳﺎﺿﻴﺔ ﻣﻌﻘﺪﺓ‪ .‬ﺑﻘﻴﺖ ﻟﻐﺔ ‪ FORTRAN‬ﻟﻐﺔ ﺑﺮﳎﺔ ﻣﻨﺘﺸﺮﺓ ﺑﻜﺜﺮﺓ ﻭﺧﺼﻮﺻﹰﺎ ﻣﻊ ﺍﻟﺘﻄﺒﻴﻘﺎﺕ ﺍﳍﻨﺪﺳﻴﺔ‪.‬‬
‫ﺃﻣﺎ ﻟﻐﺔ ‪ (COmmon Business Oriented Langague) COBOL‬ﻓﻘﺪ ﰎ ﺗﻄﻮﻳﺮﻫﺎ ﺳﻨﺔ ‪1959‬‬
‫ﻣﻦ ﻗﺒﻞ ﳎﻤﻮﻋﺔ ﻣﻦ ﻣﺼﻨﻌﻲ ﺍﳊﻮﺍﺳﺐ ﻭﻣﺴﺘﺨﺪﻣﻴﻬﺎ ﻣﻦ ﺍﻟﻌﺎﻣﻠﲔ ﰲ ﺍﻟﺼﻨﺎﻋﺔ ﺃﻭ ﻋﻨﺪ ﺍﳊﻜﻮﻣﺔ‪ .‬ﰎ‬
‫ﺍﺳﺘﺨﺪﺍﻡ ﻟﻐﺔ ‪ COBOL‬ﺑﺸﻜﻞ ﺃﺳﺎﺳﻲ ﻣﻦ ﺃﺟﻞ ﺍﻟﺘﻄﺒﻴﻘﺎﺕ ﺍﻟﺘﺠﺎﺭﻳﺔ ﺍﻟﱵ ﺗﺘﻄﻠﺐ ﺩﻗﺔ ﻭﻓﻌﺎﻟﻴﺔ ﰲ‬
‫ﺍﻟﺘﻌﺎﻣﻞ ﻣﻊ ﺍﻟﻜﻤﻴﺎﺕ ﺍﻟﻜﺒﲑﺓ ﻣﻦ ﺍﳌﻌﻄﻴﺎﺕ‪ .‬ﻳﻮﺟﺪ ﺣﱴ ﻳﻮﻣﻨﺎ ﻫﺬﺍ ﺃﻛﺜﺮ ﻣﻦ ﻧﺼﻒ ﺑﺮﳎﻴﺎﺕ‬
‫ﳎﺎﻝ ﺇﺩﺍﺭﺓ ﺍﻷﻋﻤﺎﻝ ﻣﻜﺘﻮﺏ ﺑﻠﻐﺔ ﺍﻟـ ‪ .COBOL‬ﻭﻫﻨﺎﻙ ﺣﻮﺍﱄ ﻣﻠﻴﻮﻥ ﺷﺨﺺ ﺗﻘﺮﻳﺒﹰﺎ ﻳﻌﻤﻠﻮﻥ ﺑﻨﺸﺎﻁ‬
‫ﻟﻜﺘﺎﺑﺔ ﺑﺮﺍﻣﺞ ﺑﻠﻐﺔ ‪.COBOL‬‬
‫ﰎ ﺗﺼﻤﻴﻢ ﻟﻐﺔ ‪ Pascal‬ﺗﻘﺮﻳﺒﹰﺎ ﰲ ﻧﻔﺲ ﺍﻟﻔﺘﺮﺓ ﺍﻟﱵ ﺑﺪﺃ ﻓﻴﻬﺎ ﺗﺼﻤﻴﻢ ﻟﻐﺔ ‪ .C‬ﻗﺎﻡ ﺑﺒﻨﺎﺀ ﻟﻐﺔ ‪ Pascal‬ﺍﻷﺳﺘﺎﺫ‬
‫‪ Nicklaus Wirth‬ﻭﻛﺎﻧﺖ ﳐﺼﺼﺔ ﻟﻼﺳﺘﺨﺪﺍﻡ ﺍﻷﻛﺎﺩﳝﻲ‪ .‬ﻭﺳﻮﻑ ﻧﺘﺤﺪﺙ ﻋﻦ ﻫﺬﻩ ﺍﻟﻠﻐﺔ ﺑﺸﻜﻞ ﺃﻛﱪ‬
‫ﰲ ﺍﳌﻘﻄﻊ ﺍﻟﺘﺎﱄ‪.‬‬

‫اﻟﺒﺮﻣﺠﺔ اﻟﻬﻴﻜﻠﻴﺔ‬ ‫‪12-1‬‬


‫ﺧﻼﻝ ﻓﺘﺮﺓ ﺍﻟﺴﺘﻴﻨﺎﺕ‪ ،‬ﺑﺮﺯﺕ ﺍﻟﻌﺪﻳﺪ ﻣﻦ ﺍﻟﻌﻘﺒﺎﺕ ﺍﻟﻘﺎﺳﻴﺔ ﰲ ﻃﺮﻳﻖ ﺗﻄﻮﻳﺮ ﺑﺮﳎﻴﺎﺕ ﺿﺨﻤﺔ‪ .‬ﳑﺎ ﻛﺎﻥ‬
‫ﻳﺆﺩﻱ ﺇﱃ ﺗﺄﺧﺮ ﰲ ﻣﻮﺍﻋﻴﺪ ﺇﳒﺎﺯ ﺍﻷﻋﻤﺎﻝ ﺍﳌﻄﻠﻮﺑﺔ ﻭﺇﱃ ﺗﻜﺎﻟﻴﻒ ﻣﺎﻟﻴﺔ ﻛﺒﲑﺓ ﺗﺘﺠﺎﻭﺯ ﺍﳌﻴﺰﺍﻧﻴﺎﺕ ﺍﳌﺨﺼﺼﺔ‬
‫ﻭﺇﱃ ﺍﳋﺮﻭﺝ ﲟﻨﺘﺞ ﺑﺮﳎﻲ ﻏﲑ ﻣﻮﺛﻮﻕ‪ .‬ﳑﺎ ﺩﻋﻰ ﺇﱃ ﺍﻟﺘﺄﻛﺪ ﻣﻦ ﺃﻥ ﻋﻤﻠﻴﺔ ﺍﻟﺘﻄﻮﻳﺮ ﺍﻟﱪﳎﻲ ﻫﻲ ﻋﻤﻠﻴﺔ ﺃﻛﺜﺮ‬
‫ﺗﻌﻘﻴﺪﹰﺍ ﳑﺎ ﻛﺎﻧﻮﺍ ﻳﻌﺘﻘﺪﻭﻥ ﺳﺎﺑﻘﹰﺎ‪ .‬ﻭﻟﻘﺪ ﺃﲦﺮﺕ ﺟﻬﻮﺩ ﺍﻟﺒﺤﺚ ﺍﻟﻌﻠﻤﻲ ﰲ ﺗﻠﻚ ﺍﻟﻔﺘﺮﺓ ﻋﻦ ﺗﻄﻮﻳﺮ ﺃﺳﻠﻮﺏ‬
‫ﺍﻟﱪﳎﺔ ﺍﳍﻴﻜﻠﻴﺔ ﺍﻟﺬﻱ ﻫﻮ ﻋﺒﺎﺭﺓ ﻋﻦ ﻃﺮﻳﻘﺔ ﻟﻜﺘﺎﺑﺔ ﺑﺮﺍﻣﺞ ﺃﻛﺜﺮ ﻭﺿﻮﺣﹰﺎ ﻣﻦ ﻣﺜﻴﻼﻬﺗﺎ ﻏﲑ ﺍﳍﻴﻜﻠﻴﺔ ﻭﺃﻛﺜﺮ‬
‫ﻗﺎﺑﻠﻴﺔ ﻟﻠﻔﺤﺺ ﻭﺍﻟﺘﺼﺤﻴﺢ ﻭﺍﻟﺘﻌﺪﻳﻞ‪ .‬ﻧﻮﺿﺢ ﰲ ﺍﻟﻔﺼﻞ ﺍﻟﺜﺎﱐ ﺍﳌﺒﺎﺩﺉ ﺍﻷﺳﺎﺳﻴﺔ ﻟﻠﱪﳎﺔ ﺍﳍﻴﻜﻠﻴﺔ ﰲ ﺣﲔ‬
‫ﳒﺪ ﰲ ﺍﻟﻔﺼﻮﻝ ﻣﻦ )‪ (3‬ﺣﱴ )‪(5‬ﺗﻄﻮﻳﺮﹰﺍ ﻟﻠﻌﺪﻳﺪ ﻣﻦ ﺍﻟﱪﺍﻣﺞ ﺍﳍﻴﻜﻠﻴﺔ‪.‬‬
‫‪Nicklaus‬‬ ‫ﺗﺘﻤﺜﻞ ﺇﺣﺪﻯ ﺃﺑﺮﺯ ﺍﻟﻨﺘﺎﺋﺞ ﺍﳌﻠﻤﻮﺳﺔ ﻟﻸﲝﺎﺙ ﺍﻟﺴﺎﺑﻘﺔ ﰲ ﺗﻄﻮﻳﺮ ﻟﻐﺔ ﺍﻟﱪﳎﺔ ‪ Pascal‬ﻣﻦ ﻗﺒﻞ‬
‫‪ Wirth‬ﺳﻨﺔ ‪ .1971‬ﰎ ﺗﺼﻤﻴﻢ ﻟﻐﺔ ‪ Pascal‬ﺍﻟﱵ ﲢﻤﻞ ﺍﺳﻢ ﺭﻳﺎﺿﻲ ﻭﻓﻴﻠﺴﻮﻑ ﺍﻟﻘﺮﻥ ﺍﻟﺴﺎﺑﻊ ﻋﺸﺮ‬
‫‪ Blaise Pascal‬ﻣﻦ ﺃﺟﻞ ﺗﻌﻠﻴﻢ ﺍﻟﱪﳎﺔ ﺍﳍﻴﻜﻠﻴﺔ ﰲ ﺍﳌﺆﺳﺴﺎﺕ ﺍﻟﺘﻌﻠﻴﻤﻴﺔ ﻭﺍﻷﻛﺎﺩﳝﻴﺔ ﻟﻜﻨﻬﺎ ﺳﺮﻋﺎﻥ ﻣﺎ‬
‫ﺃﺻﺒﺤﺖ ﺍﻟﻠﻐﺔ ﺍﳌﻔﻀﻠﺔ ﺍﻷﻭﱃ ﰲ ﻣﻌﻈﻢ ﺍﳉﺎﻣﻌﺎﺕ‪ .‬ﻟﻜﻦ ﺗﻌﺎﱐ ﻫﺬﻩ ﺍﻟﻠﻐﺔ ﻭﻟﺴﻮﺀ ﺍﳊﻆ ﻣﻦ ﺿﻌﻒ ﰲ‬
‫ﺍﻟﻌﺪﻳﺪ ﻣﻦ ﺍﻻﻣﻜﺎﻧﺎﺕ ﺍﻟﻼﺯﻣﺔ ﺣﱴ ﺗﺼﺒﺢ ﻣﻔﻴﺪﺓ ﲡﺎﺭﻳﹰﺎ ﺃﻭ ﺻﻨﺎﻋﻴﹰﺎ ﺃﻭ ﻋﻠﻰ ﻧﻄﺎﻕ ﺍﻟﺘﻄﺒﻴﻘﺎﺕ ﺍﳊﻜﻮﻣﻴﺔ‬
‫ﳑﺎ ﺟﻌﻠﻬﺎ ﻏﲑ ﻣﻘﺒﻮﻟﺔ ﺿﻤﻦ ﻫﺬﻩ ﺍﻷﻭﺳﺎﻁ‪.‬‬
‫ﰎ ﺗﻄﻮﻳﺮ ﻟﻐﺔ ﺍﻟﱪﳎﺔ ‪ ADA‬ﺑﺪﻋﻢ ﻣﻦ ﻭﺯﺍﺭﺓ ﺍﻟﺪﻓﺎﻉ ﰲ ﺍﻟﻮﻻﻳﺎﺕ ﺍﳌﺘﺤﺪﺓ ﺍﻷﻣﲑﻳﻜﻴﺔ ﺧﻼﻝ ﺍﻟﻔﺘﺮﺓ‬
‫ﺍﳌﻤﺘﺪﺓ ﻣﻦ ﺑﺪﺍﻳﺔ ﺍﻟﺴﺒﻌﻴﻨﺎﺕ ﺣﱴ ﺑﺪﺍﻳﺔ ﺍﻟﺜﻤﺎﻧﻴﻨﺎﺕ‪ .‬ﰎ ﺍﺳﺘﺨﺪﺍﻡ ﻣﺌﺎﺕ ﺍﻟﻠﻐﺎﺕ ﺍﻟﱵ ﻻ ﻳﻮﺟﺪ ﺃﻱ ﻋﻼﻗﺔ‬
‫ﻓﻴﻤﺎ ﺑﻴﻨﻬﺎ ﻣﻦ ﺃﺟﻞ ﺗﻄﻮﻳﺮ ﺃﻧﻈﻤﺔ ﺍﻷﻭﺍﻣﺮ ﻭﺍﻟﺘﺤﻜﻢ ﺍﻟﻀﺨﻤﺔ ﺍﳋﺎﺻﺔ ﺑﻮﺯﺍﺭﺓ ﺍﻟﺪﻓﺎﻉ ﺍﻷﻣﲑﻳﻜﻴﺔ ﺍﻟﱵ‬
‫ﻛﺎﻧﺖ ﺗﺒﺤﺚ ﻋﻦ ﻟﻐﺔ ﻭﺣﻴﺪﺓ ﺗﻠﱯ ﻣﻌﻈﻢ ﺍﺣﺘﻴﺎﺟﺎﻬﺗﺎ‪ .‬ﰎ ﺑﻌﺪ ﺫﻟﻚ ﺗﺴﻤﻴﺔ ﻫﺬﻩ ﺍﻟﻠﻐﺔ ﺑﺎﺳﻢ "ﺍﻟﺴﻴﺪﺓ‬
‫‪ "Ada Lovelace‬ﺍﺑﻨﺔ ﺍﻟﺸﺎﻋﺮ ‪ Lord Byron‬ﻭﺍﻟﱵ ﺍﺷﺘﻬﺮﺕ ﰲ ﺍﻟﻌﺎﱂ ﻋﻠﻰ ﺃﻬﻧﺎ ﺃﻭﻝ ﻣﻦ ﻛﺘﺐ ﺑﺮﻧﺎﳎﹰﺎ ﰲ‬
‫ﺑﺪﺍﻳﺔ ﺍﻟﻘﺮﻥ ﺍﻟﺘﺎﺳﻊ ﻋﺸﺮ )ﻣﻦ ﺃﺟﻞ ﺍﳉﻬﺎﺯ ﺍﳌﻴﻜﺎﻧﻴﻜﻲ ﻟﻠﺤﺴﺎﺏ ﺫﻭ ﺍﶈﺮﻙ ﺍﻟﺘﺤﻠﻴﻠﻲ ﺍﳌﺼﻤﻢ ﻣﻦ ﻗﺒﻞ‬
‫‪٣٥‬‬ ‫‪ .1‬ﻣﻘﺪﻣﺔ ﺣﻮل اﻟﺤﻮاﺳﻴﺐ واﻟﺒﺮﻣﺠﺔ ﺑﻠﻐﺔ ‪C++‬‬

‫‪ .(Charles Babbage‬ﺗﻌﺘﱪ ﺧﺎﺻﻴﺔ ﺗﻌﺪﺩ ﺍﳌﻬﺎﻡ ‪ multitasking‬ﺇﺣﺪﻯ ﺃﺑﺮﺯ ﻣﻘﺪﺭﺍﺕ ﻟﻐﺔ ‪ Ada‬ﻭﺍﻟﱵ‬
‫ﺗﺴﻤﺢ ﻟﻠﻤﱪﳎﲔ ﺑﺘﻮﺻﻴﻒ ﻋﺪﺓ ﻣﻬﺎﻡ ﳝﻜﻦ ﺃﻥ ﺗﻨﻔﺬ ﻋﻠﻰ ﺍﻟﺘﻮﺍﺯﻱ‪ .‬ﰲ ﺣﲔ ﺗﺴﻤﺢ ﻟﻐﺎﺕ ﺍﻟﱪﳎﺔ‬
‫ﺍﻷﺧﺮﻯ ﺍﻟﱵ ﻗﻤﻨﺎ ﺑﺎﳊﺪﻳﺚ ﻋﻨﻬﺎ ﲟﺎ ﰲ ﺫﻟﻚ ﻟﻐﺔ ‪ C‬ﻭﻟﻐﺔ ‪ C++‬ﻟﻠﻤﱪﳎﲔ ﺑﻜﺘﺎﺑﺔ ﺑﺮﺍﻣﺞ ﺗﻨﻔﺬ ﻣﻬﻤﺔ‬
‫ﻭﺍﺣﺪﺓ ﻋﻠﻰ ﺍﻷﻛﺜﺮ ﰲ ﻧﻔﺲ ﺍﻟﻮﻗﺖ‪.‬‬
‫اﻟﺘﻮﺝﻪ اﻷﺳﺎﺳﻲ ﻟﻠﺒﺮﻣﺠﻴﺎت‪ :‬ﺗﻘﻨﻴﺔ اﻟﻌﺮض‬ ‫‪13-1‬‬
‫ﻳﺘﺬﻛﺮ ﺃﺣﺪ ﻣﺆﻟﻔﻲ ﺍﻟﻜﺘﺎﺏ )ﻭﻫﻮ ‪ (H.M.Deitel‬ﺍﻹﺣﺒﺎﻁ ﺍﻟﻜﺒﲑ ﺍﻟﺬﻱ ﻛﺎﻧﺖ ﺗﻌﺎﱐ ﻣﻨﻪ ﻫﻴﺌﺎﺕ ﺗﻄﻮﻳﺮ‬
‫ﺍﻟﱪﳎﻴﺎﺕ ﰲ ﺳﻨﻮﺍﺕ ﺍﻟﺴﺘﻴﻨﺎﺕ ﻭﺧﺎﺻﺔ ﺗﻠﻚ ﺍﻟﱵ ﻛﺎﻧﺖ ﺗﻘﻮﻡ ﺑﺘﻄﻮﻳﺮ ﺑﺮﳎﻴﺎﺕ ﻛﺒﲑﺓ‪ .‬ﺍﺳﺘﻔﺎﺩ ﺍﻟﺴﻴﺪ‬
‫‪ H.M.Deitel‬ﺧﻼﻝ ﺍﻟﺴﻨﻮﺍﺕ ﺍﻟﱵ ﺳﺒﻘﺖ ﲣﺮﺟﻪ ﻣﻦ ﻣﻴﺰﺓ ﻋﻤﻠﻪ ﰲ ﺍﻟﺼﻴﻒ ﻣﻊ ﻓﺮﻳﻖ ﻳﻘﻮﻡ ﺑﺘﻄﻮﻳﺮ‬
‫ﺃﻧﻈﻤﺔ ﺗﺸﻐﻴﻞ ﻣﻌﺘﻤﺪﺓ ﻋﻠﻰ ﺗﻘﺴﻴﻢ ﺍﻟﺰﻣﻦ ﻭﻋﻠﻰ ﺍﺳﺘﺨﺪﺍﻡ ﺍﻟﺬﺍﻛﺮﺓ ﺍﻟﻈﺎﻫﺮﻳﺔ ﻟﺪﻯ ﺇﺣﺪﻯ ﻛﱪﻳﺎﺕ‬
‫ﺍﻟﺸﺮﻛﺎﺕ ﺍﻟﺮﺍﺋﺪﺓ ﰲ ﳎﺎﻝ ﻋﻠﻮﻡ ﺍﳊﺎﺳﻮﺏ‪ .‬ﻛﺎﻧﺖ ﻫﺬﻩ ﲡﺮﺑﺔ ﻋﻈﻴﻤﺔ ﺑﺎﻟﻨﺴﺒﺔ ﻟﻄﺎﻟﺐ‪ .‬ﻭﻟﻜﻦ ﻇﻬﺮﺕ‬
‫ﺍﳊﻘﻴﻘﺔ ﺟﻠﻴﺔ ﰲ ﺻﻴﻒ ﻋﺎﻡ ‪ 1967‬ﻋﻨﺪﻫﺎ ﻗﺮﺭﺕ ﺍﻟﺸﺮﻛﺔ ﺍﻟﺘﻨﺼﻞ ﻣﻦ ﺇﻧﺘﺎﺝ ﻧﻈﺎﻡ ﺍﻟﺘﺸﻐﻴﻞ ﺍﻟﺬﻱ ﺃﺷﺮﻧﺎ‬
‫ﺇﻟﻴﻪ ﻓﻴﻤﺎ ﺳﺒﻖ‪ ،‬ﻋﻠﻰ ﺍﻟﺮﻏﻢ ﻣﻦ ﻣﺸﺎﺭﻛﺔ ﻣﺌﺎﺕ ﺍﻷﺷﺨﺎﺹ ﰲ ﺍﻟﻌﻤﻞ ﺑﻪ ﻟﻌﺪﺓ ﺳﻨﻮﺍﺕ ﲝﺠﺔ ﺃﻧﻪ ﻣﻦ‬
‫ﺍﻟﺼﻌﺐ ﺇﳒﺎﺯ ﺍﻟﻨﻈﺎﻡ ﺍﳌﻄﻠﻮﺏ ﺑﺸﻜﻞ ﺻﺤﻴﺢ‪.‬‬
‫ﺑﺪﺃﺕ ﺍﻟﺘﺤﺴﻴﻨﺎﺕ ﻋﻠﻰ ﻣﺴﺘﻮﻯ ﺗﻘﻨﻴﺎﺕ ﺍﻟﺘﻄﻮﻳﺮ ﺍﻟﱪﳎﻲ ﺑﺎﻟﻈﻬﻮﺭ ﺑﻌﺪ ﺍﻟﺘﺄﻛﺪ ﻣﻦ ﻓﻮﺍﺋﺪ ﺍﻟﱪﳎﺔ‬
‫ﺍﳌﻬﻴﻜﻠﺔ ‪) Structured Programming‬ﻭﻣﺎ ﺍﺭﺗﺒﻂ ﻬﺑﺎ ﻣﻦ ﻣﻨﻬﺠﻴﺎﺕ ﺍﻟﺘﺼﻤﻴﻢ ﻭﺍﻟﺘﺤﻠﻴﻞ ﻟﻸﻧﻈﻤﺔ‬
‫ﺍﳌﻬﻴﻜﻠﺔ( ﰲ ﺑﺪﺍﻳﺔ ﺍﻟﺴﺒﻌﻴﻨﺎﺕ‪ .‬ﻭﻟﻜﻦ ﱂ ﻳﻈﻬﺮ ﺫﻟﻚ ﺟﻠﻴﹰﺎ ﺇﻻ ﺑﻌﺪ ﺍﺳﺘﺨﺪﺍﻡ ﺗﻘﻨﻴﺎﺕ ﺍﻟﱪﳎﺔ ﻏﺮﺿﻴﺔ‬
‫ﺍﻟﺘﻮﺟﻪ ﺑﺸﻜﻞ ﻭﺍﺳﻊ ﺧﻼﻝ ﻓﺘﺮﺓ ﺍﻟﺘﺴﻌﻴﻨﺎﺕ ﻭﺫﻟﻚ ﻋﻨﺪﻣﺎ ﺷﻌﺮ ﺍﳌﱪﳎﻮﻥ ﺃﻬﻧﻢ ﳝﺘﻠﻜﻮﻥ ﻓﻌﻠﻴﹰﺎ ﺍﻷﺩﻭﺍﺕ‬
‫ﺍﻟﻼﺯﻣﺔ ﻟﺒﻨﺎﺀ ﺑﺮﳎﻴﺎﺕ ﻣﺘﻴﻨﺔ‪.‬‬
‫ﺗﻌﻮﺩ ﺗﻘﻨﻴﺔ ﺍﻟﻐﺮﺽ ﰲ ﻭﺍﻗﻊ ﺍﻷﻣﺮ ﺇﱃ ﻓﺘﺮﺓ ﻣﻨﺘﺼﻒ ﺍﻟﺴﺘﻴﻨﺎﺕ‪ .‬ﻭﻟﻘﺪ ﺟﺮﻯ ﺗﻄﻮﻳﺮ ﻟﻐﺔ ﺍﻟﱪﳎﺔ ‪ C++‬ﰲ‬
‫ﺷﺮﻛﺔ ‪ AT & T‬ﻣﻦ ﻗﺒﻞ ‪ Bjorne Stroustup‬ﰲ ﺑﺪﺍﻳﺔ ﺍﻟﺜﻤﺎﻧﻴﻨﺎﺕ ﻭﺫﻟﻚ ﺍﻋﺘﻤﺎﺩﹰﺍ ﻋﻠﻰ ﻟﻐﺘﲔ ﳘﺎ‪ :‬ﻟﻐﺔ ‪C‬‬

‫ﺍﻟﱵ ﺟﺮﻯ ﺗﻄﻮﻳﺮﻫﺎ ﰲ ﺷﺮﻛﺔ ‪ AT & T‬ﻟﺘﻄﻮﻳﺮ ﻧﻈﺎﻡ ﺍﻟﺘﺸﻐﻴﻞ ‪ Unix‬ﰲ ﺑﺪﺍﻳﺔ ﺍﻟﺴﺒﻌﻴﻨﻴﺎﺕ‪ ،‬ﻭﻟﻐﺔ ‪Sinula‬‬
‫‪ 67‬ﺍﻟﱵ ﻃﻮﺭﺕ ﰲ ﺃﻭﺭﺑﺎ ﻭﻇﻬﺮﺕ ﺇﱃ ﺍﻟﻮﺟﻮﺩ ﻋﺎﻡ ‪ .1967‬ﺍﺳﺘﻮﻋﺒﺖ ﻟﻐﺔ ‪ C++‬ﻣﺰﺍﻳﺎ ﻟﻐﺔ ‪ C‬ﻭﺃﺿﺎﻓﺖ‬
‫ﺇﻟﻴﻬﺎ ﻗﺪﺭﺍﺕ ‪ Sinula‬ﻣﻦ ﺃﺟﻞ ﺇﻧﺸﺎﺀ ﺍﻷﻏﺮﺍﺽ ﻭﺍﻟﺘﻌﺎﻣﻞ ﻣﻌﻬﺎ‪ .‬ﻭﱂ ﻳﻜﻦ ﻭﻗﺘﻬﺎ ﻣﻘﺪﺭﹰﺍ ﻟﻠﻐﺔ ‪ C‬ﺃﻭ ﻟﻠﻐﺔ‬
‫‪ C++‬ﺑﺄﻥ ﺗﺴﺘﺨﺪﻣﺎ ﺧﺎﺭﺝ ﳐﺎﺑﺮ ﺍﻟﺒﺤﺚ ﺍﻟﻌﻠﻤﻲ ﺍﳋﺎﺹ ﺑﺸﺮﻛﺔ ‪ AT & T‬ﻭﻟﻜﻦ ﺳﺮﻋﺎﻥ ﻣﺎ ﺑﺪﺃﺕ‬
‫ﺟﺬﻭﺭ ﻫﺎﺗﲔ ﺍﻟﻠﻐﺘﲔ ﺑﺎﻟﻈﻬﻮﺭ ﻭﺍﻟﺘﻄﻮﺭ‪.‬‬
‫ﻣﺎ ﻫﻲ ﺍﻷﻏﺮﺍﺽ ﻭﳌﺎﺫﺍ ﻟﺪﻳﻬﺎ ﻫﺬﻩ ﺍﳋﺼﻮﺻﻴﺔ؟ ﺗﻌﺘﱪ ﺗﻘﻨﻴﺔ ﺍﻟﻐﺮﺽ ﺗﻘﻨﻴﺔ ﻣﺴﺎﻋﺪﺓ ﰲ ﻋﻤﻠﻴﺔ ﺍﻟﺘﻀﻤﲔ‬
‫ﻭﻫﻲ ﺗﺴﺎﻋﺪ ﻋﻠﻰ ﺇﻧﺸﺎﺀ ﻭﺣﺪﺍﺕ ﺑﺮﳎﻴﺔ ﻣﻌﱪﺓ ﺫﺍﺕ ﻋﻼﻗﺔ ﲜﺰﺀ ﳏﺪﺩ ﻣﻦ ﺍﻟﺘﻄﺒﻴﻖ ﺍﳌﺮﺍﺩ ﺗﻄﻮﻳﺮﻩ‪ .‬ﻳﻮﺟﺪ‬
‫ﻼ ﺃﻏﺮﺍﺽ ﳍﺎ ﻋﻼﻗﺔ ﺑﺎﻟﺘﺎﺭﻳﺦ ﻭﺍﻟﻮﻗﺖ ﻭﺩﻓﻊ ﺍﻟﺸﺒﻜﺎﺕ ﻭﺍﻟﻔﻮﺍﺗﲑ ﻭﺍﻟﺼﻮﺕ ﻭﺍﻟﺼﻮﺭﺓ ﻭﺍﳌﻠﻔﺎﺕ‬‫ﻟﺪﻳﻨﺎ ﻣﺜ ﹰ‬
‫ﻭﺍﻟﺴﺠﻼﺕ ﻭﻏﲑ ﺫﻟﻚ‪ .‬ﳝﻜﻦ ﻣﻦ ﻭﺍﻗﻊ ﺍﻷﻣﺮ ﲤﺜﻴﻞ ﺃﻱ ﺍﺳﻢ ﺗﻘﺮﻳﺒﹰﺎ ﻋﻠﻰ ﺷﻜﻞ ﻏﺮﺽ‪.‬‬
‫ﳓﻦ ﻧﻌﻴﺶ ﰲ ﻋﺎﱂ ﻣﻜﻮﻥ ﻣﻦ ﺍﻷﻏﺮﺍﺽ‪ .‬ﺍﻧﻈﺮ ﺣﻮﻟﻚ ﻟﺘﺮﻯ ﺍﻟﺴﻴﺎﺭﺍﺕ ﻭﺍﻟﻄﺎﺋﺮﺍﺕ ﻭﺍﻷﺷﺨﺎﺹ‬
‫ﻭﺍﳊﻴﻮﺍﻧﺎﺕ ﻭﺍﻷﺑﻨﻴﺔ ﻭﺇﺷﺎﺭﺍﺕ ﺍﳌﺮﻭﺭ ﻭﺍﳌﺼﺎﻋﺪ ﻭﻏﲑ ﺫﻟﻚ‪ .‬ﻗﺒﻞ ﻇﻬﻮﺭ ﻟﻐﺎﺕ ﺍﻟﱪﳎﺔ ﻏﺮﺿﻴﺔ ﺍﻟﺘﻮﺟﻪ‪،‬‬
‫اﻟﻔﺼﻞ اﻷول‬ ‫‪٣٦‬‬

‫ﻛﺎﻧﺖ ﻟﻐﺎﺕ ﺍﻟﱪﳎﺔ ﺍﻷﺧﺮﻯ )ﻣﺜﻞ ﻟﻐﺎﺕ ‪ Fostran‬ﻭ‪ Pascal‬ﻭ‪ Basic‬ﻭ‪ (C‬ﺗﺮﻛﺰ ﺑﺸﻜﻞ ﺃﺳﺎﺳﻲ ﻋﻠﻰ‬
‫ﺍﻷﻓﻌﺎﻝ ﺃﻭ ﺍﻹﺟﺮﺍﺀﺍﺕ ﻋﻮﺿﹰﺎ ﻋﻦ ﺍﻷﲰﺎﺀ ﺃﻭ ﺍﻷﻏﺮﺍﺽ‪ .‬ﻛﺎﻥ ﺍﳌﱪﳎﻮﻥ ﻳﺮﻛﺰﻭﻥ ﰲ ﻋﻤﻠﻬﻢ ﻋﻠﻰ‬
‫ﺍﻷﻓﻌﺎﻝ ﺿﻤﻦ ﻋﺎﱂ ﻣﻠﻲﺀ ﺑﺎﻷﻏﺮﺍﺽ‪ .‬ﺍﻧﻌﻜﺲ ﺫﻟﻚ ﻋﻠﻰ ﻃﺮﻳﻘﺔ ﻛﺘﺎﺑﺘﻬﻢ ﻟﻠﱪﺍﻣﺞ‪ .‬ﻭﻟﻜﻦ ﺑﻌﺪ ﻇﻬﻮﺭ‬
‫ﻟﻐﺎﺕ ﺍﻟﱪﳎﺔ ﻏﺮﺿﻴﺔ ﺍﻟﺘﻮﺟﻪ ﻣﺜﻞ ﻟﻐﱵ ‪ C++‬ﻭ‪ ،Java‬ﺗﺎﺑﻊ ﺍﳌﱪﳎﻮﻥ ﺃﺳﻠﻮﺏ ﺣﻴﺎﻬﺗﻢ ﺍﻟﻌﺎﺩﻱ ﺿﻤﻦ‬
‫ﻋﺎﱂ ﻣﻠﻲﺀ ﺑﺎﻷﻏﺮﺍﺽ ﻭﺃﺻﺒﺢ ﲟﻘﺪﻭﺭﻫﻢ ﻛﺘﺎﺑﺔ ﺑﺮﺍﻣﺞ ﻏﺮﺿﻴﺔ ﺍﻟﺘﻮﺟﻪ ﺑﺸﻜﻞ ﺃﻛﺜﺮ ﺳﻬﻮﻟﺔ ﻭﻋﻔﻮﻳﺔ‪.‬‬
‫ﻳﻌﺘﱪ ﺫﻟﻚ ﻃﺮﻳﻘﺔ ﻃﺒﻴﻌﻴﺔ ﺇﺫﺍ ﻣﺎ ﻗﻮﺭﻧﺖ ﻣﻊ ﺃﺳﻠﻮﺏ ﺍﻟﱪﳎﺔ ﺍﻹﺟﺮﺍﺋﻴﺔ‪ ،‬ﻭﻟﻘﺪ ﻛﺎﻥ ﰲ ﺫﻟﻚ ﺯﻳﺎﺩﺓ‬
‫ﺍﻹﻧﺘﺎﺟﻴﺔ ﺍﻟﱪﳎﻴﺔ ﺑﺸﻜﻞ ﻣﻠﺤﻮﻅ‪.‬‬
‫ﺗﻜﻤﻦ ﺍﳌﺸﻜﻠﺔ ﺍﻟﺮﺋﻴﺴﻴﺔ ﻟﻠﱪﳎﺔ ﺍﻹﺟﺮﺍﺋﻴﺔ ﰲ ﻗﺼﻮﺭ ﻫﺬﺍ ﺍﻷﺳﻠﻮﺏ ﰲ ﻋﻜﺲ ﺍﻟﻌﺎﱂ ﺍﳋﺎﺭﺟﻲ ﺿﻤﻦ‬
‫ﺍﻟﻮﺣﺪﺍﺕ ﺍﻟﱪﳎﻴﺔ ﺍﳌﺨﺘﻠﻔﺔ ﺍﳌﺆﻟﻔﺔ ﻟﻠﻨﻈﺎﻡ ﺍﳌﺮﺍﺩ ﺗﻄﻮﻳﺮﻩ‪ .‬ﻭﻳﺆﺩﻱ ﺫﻟﻚ ﺇﱃ ﺧﻔﺾ ﺍﻟﻘﺪﺭﺓ ﻋﻠﻰ ﺇﻋﺎﺩﺓ‬
‫ﺍﺳﺘﺨﺪﺍﻡ ﻫﺬﻩ ﺍﻟﻮﺣﺪﺍﺕ ﺍﻟﱪﳎﻴﺔ ﻣﻊ ﺑﺮﺍﻣﺞ ﺃﺧﺮﻯ‪ .‬ﻭﳚﺐ ﻋﻠﻰ ﺍﳌﱪﻣﺞ ﰲ ﺍﻟﻜﺜﲑ ﻣﻦ ﺍﳊﺎﻻﺕ ﺇﻋﺎﺩﺓ‬
‫ﻛﺘﺎﺑﺔ ﻫﺬﻩ ﺍﻟﻮﺣﺪﺍﺕ ﻋﻨﺪ ﺍﻟﺒﺪﺀ ﺑﺘﻄﻮﻳﺮ ﺑﺮﻧﺎﻣﺞ ﺟﺪﻳﺪ‪.‬‬
‫ﻳﺸﻜﻞ ﺫﻟﻚ ﺇﺿﺎﻋﺔ ﻟﻠﻮﻗﺖ ﻭﺍﳌﺎﻝ ﺃﺛﻨﺎﺀ ﳏﺎﻭﻟﺔ ﺍﳌﱪﳎﲔ ﰲ ﻛﻞ ﻣﺮﺓ "ﺇﻋﺎﺩﺓ ﺍﺧﺘﺮﺍﻉ ﺍﻟﺪﻭﻻﺏ"‪ .‬ﻋﻨﺪ‬
‫ﺍﻟﺘﻌﺎﻣﻞ ﻣﻊ ﺗﻘﻨﻴﺔ ﺍﻟﻐﺮﺽ‪ ،‬ﺗﺴﻤﻰ ﺍﻟﻮﺣﺪﺓ ﺍﻟﱪﳎﻴﺔ ﺑﺎﻟﺼﻒ "‪ ."Class‬ﻭﺇﺫﺍ ﻛﺎﻧﺖ ﻫﺬﻩ ﺍﻟﻮﺣﺪﺓ ﻣﺼﻤﻤﺔ‬
‫ﻼ‪.‬‬
‫ﺟﻴﺪﹰﺍ ﻓﺈﻥ ﺫﻟﻚ ﻳﺴﺎﻋﺪ ﻋﻠﻰ ﺇﻋﺎﺩﺓ ﺍﺳﺘﺨﺪﺍﻣﻬﺎ ﻣﺴﺘﻘﺒ ﹰ‬
‫ﻳﺴﺎﻋﺪ ﺍﺳﺘﺨﺪﺍﻡ ﻣﻜﺘﺒﺎﺕ ﺍﳌﻜﻮﻧﺎﺕ ﺍﻟﻘﺎﺑﻠﺔ ﻹﻋﺎﺩﺓ ﺍﻻﺳﺘﺨﺪﺍﻡ ﻣﺜﻞ ﺻﻔﻮﻑ ﻣﺎﻳﻜﺮﻭﺳﻮﻓﺖ ﺍﻟﺘﺄﺳﻴﺴﻴﺔ‬
‫‪ (MFC) Microsoft Foundation Classes‬ﻭﺗﻠﻚ ﺍﳌﻨﺘﺠﺔ ﻣﻦ ﻗﺒﻞ ﺷﺮﻛﺔ ‪ Rogue Wave‬ﻭﻏﲑﻫﺎ ﻣﻦ ﺍﳌﻜﺘﺒﺎﺕ ﺍﻟﱵ‬
‫ﻗﺪﻣﺘﻬﺎ ﺷﺮﻛﺎﺕ ﺍﻟﺘﻄﻮﻳﺮ ﺍﻟﱪﳎﻲ‪ ،‬ﻋﻠﻰ ﺍﻟﺘﻘﻠﻴﻞ ﺇﱃ ﺣﺪ ﻛﺒﲑ ﻣﻦ ﺟﻬﻮﺩ ﺍﻟﺘﻄﻮﻳﺮ ﺍﳌﻄﻠﻮﺑﺔ ﻟﺒﻨﺎﺀ ﺑﻌﺾ ﺃﻧﻮﺍﻉ‬
‫ﺍﻷﻧﻈﻤﺔ )ﻣﻘﺎﺭﻧﺔ ﻣﻊ ﺍﳉﻬﻮﺩ ﺍﳌﻄﻠﻮﺑﺔ ﻹﻋﺎﺩﺓ ﺍﺧﺘﺮﺍﻉ ﻫﺬﻩ ﺍﻟﻘﺪﺭﺍﺕ ﰲ ﺍﳌﺸﺎﺭﻳﻊ ﺍﳉﺪﻳﺪﺓ(‪.‬‬
‫ﺗﺸﲑ ﺑﻌﺾ ﺍﳌﺆﺳﺴﺎﺕ ﻭﺍﳌﻨﻈﻤﺎﺕ ﺇﱃ ﺃﻥ ﺍﻻﺳﺘﻔﺎﺩﺓ ﻣﻦ ﻗﺎﺑﻠﻴﺔ ﺇﻋﺎﺩﺓ ﺍﺳﺘﺨﺪﺍﻡ ﺍﻟﱪﳎﻴﺎﺕ ﻟﻴﺴﺖ ﰲ‬
‫ﻭﺍﻗﻊ ﺍﻷﻣﺮ ﺍﻟﻔﺎﺋﺪﺓ ﺍﻷﺳﺎﺳﻴﺔ ﺍﻷﻭﱃ ﺍﻟﱵ ﳓﺼﻞ ﻋﻠﻴﻬﺎ ﺑﻔﻀﻞ ﺃﺳﻠﻮﺏ ﺍﻟﱪﳎﺔ ﻏﺮﺿﻴﺔ ﺍﻟﺘﻮﺟﻪ‪ .‬ﻭﺇﳕﺎ‬
‫ﳝﻜﻦ ﺃﻥ ﻧﺮﻯ ﻫﺬﻩ ﺍﻟﻔﺎﺋﺪﺓ ﰲ ﺍﻟﻘﺪﺭﺓ ﻋﻠﻰ ﻓﻬﻢ ﻭﺍﺳﺘﻴﻌﺎﺏ ﺍﻷﻧﻈﻤﺔ ﺍﳌﻄﻮﺭﺓ‪ .‬ﻭﻳﻨﻌﻜﺲ ﺫﻟﻚ ﺑﺎﻟﺘﺎﱄ ﰲ‬
‫ﺍﻟﻘﺪﺭﺓ ﻋﻠﻰ ﺻﻴﺎﻧﺔ ﻭﺗﻌﺪﻳﻞ ﻭﺗﺪﻗﻴﻖ ﺍﻟﱪﳎﻴﺎﺕ ﻋﻨﺪ ﺍﳊﺎﺟﺔ ﻟﺬﻟﻚ ﺑﻜﻞ ﺳﻬﻮﻟﺔ ﻭﺗﻨﻈﻴﻢ‪ .‬ﺇﻥ ﻟﺬﻟﻚ ﺩﻻﻟﺔ‬
‫ﻋﻈﻴﻤﺔ ﺧﺎﺻﺔ ﺇﺫﺍ ﻋﻠﻤﻨﺎ ﺃﻥ ﺍﻟﺪﺭﺍﺳﺎﺕ ﺗﺪﻝ ﻋﻠﻰ ﺃﻥ ﺣﻮﺍﱄ ‪ 80%‬ﻣﻦ ﻛﻠﻔﺔ ﺑﻨﺎﺀ ﺍﻟﱪﳎﻴﺎﺕ ﻟﻴﺴﺖ‬
‫ﻣﺮﺗﺒﻄﺔ ﲜﻬﻮﺩ ﺍﻟﺘﻄﻮﻳﺮ ﺍﻷﻭﱃ ﻭﺇﳕﺎ ﺑﻌﻤﻠﻴﺎﺕ ﻣﺘﺎﺑﻌﺔ ﺍﻟﺘﻘﻴﻴﻢ ﻭﺍﻟﺼﻴﺎﻧﺔ ﺍﻟﱵ ﲤﺮ ﻬﺑﺎ ﺍﻟﱪﳎﻴﺎﺕ ﻃﻴﻠﺔ ﻓﺘﺮﺓ‬
‫ﺍﺳﺘﺨﺪﺍﻣﻬﺎ‪.‬‬
‫ﻣﻬﻤﺎ ﺗﻜﻦ ﺍﻟﻔﻮﺍﺋﺪ ﺍﻟﱵ ﳝﻜﻦ ﺃﻥ ﳒﻨﻴﻬﺎ ﻣﻦ ﺍﻟﱪﳎﺔ ﻏﺮﺿﻴﺔ ﺍﻟﺘﻮﺟﻪ‪ ،‬ﻓﺈﻧﻪ ﻣﻦ ﺍﻟﻮﺍﺿﺢ ﺃﻬﻧﺎ ﺳﺘﻜﻮﻥ‬
‫ﺍﻟﻄﺮﻳﻘﺔ ﺍﳌﺜﻠﻰ ﻟﻠﻌﻤﻞ ﺍﻟﱪﳎﻲ ﺧﻼﻝ ﺍﻟﻌﻘﻮﺩ ﺍﻟﺘﺎﻟﻴﺔ‪.‬‬
‫ﺗﻜﻤﻦ ﺍﳌﻴﺰﺓ ﺍﻟﺮﺋﻴﺴﻴﺔ ﰲ ﺇﻧﺸﺎﺋﻚ ﻟﻨﺼﻮﺻﻚ ﺍﻟﱪﳎﻴﺔ ﰲ ﻣﻌﺮﻓﺘﻚ ﺍﳉﻴﺪﺓ ﳍﺎ ﻭﻗﺪﺭﺗﻚ ﺑﺎﻟﺘﺎﱄ ﻋﻠﻰ‬
‫ﻼ ﻭﺑﺬﻟﺖ ﺟﻬﺪﹰﺍ ﻛﺒﲑﹰﺍ ﻟﺘﻄﻮﻳﺮ ﻫﺬﻩ ﺍﻟﱪﺍﻣﺞ‬‫ﺗﻔﺤﺼﻬﺎ‪ .‬ﻭﻟﻜﻦ ﻻﺑﺪ ﻭﺃﻧﻚ ﺳﺘﻜﻮﻥ ﻗﺪ ﺿﻴﻌﺖ ﻭﻗﺘﹰﺎ ﻃﻮﻳ ﹰ‬
‫ﺍﳉﺪﻳﺪﺓ‪.‬‬
‫‪٣٧‬‬ ‫‪ .1‬ﻣﻘﺪﻣﺔ ﺣﻮل اﻟﺤﻮاﺳﻴﺐ واﻟﺒﺮﻣﺠﺔ ﺑﻠﻐﺔ ‪C++‬‬

‫ﻣﻼﺣﻈﺔ ﺥﺎﺹﺔ ﺑﻬﻨﺪﺳﺔ اﻟﺒﺮﻣﺠﻴﺎت‬ ‫‪3-1‬‬


‫ﺕﺘﻮﻓﺮ آﻤﻴﺔ ﻣﻦ ﻣﻜﺘﺒﺎت اﻟﺼﻔﻮف ﻟﻤﻜﻮﻧﺎت ﻗﺎﺑﻠﺔ ﻹﻋﺎدة اﻻﺳﺘﺨﺪام ﻋﻠﻰ‬
‫ﺵﺒﻜﺔ اﻹﻧﺘﺮﻧﺖ واﻟﻮیﺐ‪ .‬ویﻤﻜﻦ اﻟﺤﺼﻮل ﻋﻠﻰ اﻟﻜﺜﻴﺮ ﻣﻨﻬﺎ ﻣﺠﺎﻧًﺎ‪.‬‬

‫اﻟﻤﻜﻮﻥﺎت اﻷﺳﺎﺳﻴﺔ ﻟﺒﻴﺌﺔ ﻋﻤﻞ ‪ C++‬ﻣﺜﺎﻟﻴﺔ‬ ‫‪14-1‬‬


‫ﺗﺘﺄﻟﻒ ﻧﻈﻢ ‪ C++‬ﺑﺸﻜﻞ ﻋﺎﻡ ﻣﻦ ﻋﺪﺓ ﺃﺟﺰﺍﺀ ﻫﻲ‪ :‬ﺑﻴﺌﺔ ﺍﻟﻌﻤﻞ ‪ ، environment‬ﺍﻟﻠﻐﺔ‪ ،‬ﺍﳌﻜﺘﺒﺔ ﺍﳌﻌﻴﺎﺭﻳﺔ‬
‫ﺍﳋﺎﺻﺔ ﺑـ ‪ C‬ﻭﺍﻟﻌﺪﻳﺪ ﻣﻦ ﻣﻜﺘﺒﺎﺕ ﺍﻟﺼﻔﻮﻑ‪ .‬ﺳﻮﻑ ﻧﻮﺿﺢ ﻓﻴﻤﺎ ﻳﻠﻲ ﻣﺎﻫﻴﺔ ﺑﻴﺌﺔ ﺍﻟﻌﻤﻞ ﺍﳌﺜﺎﻟﻴﺔ‬
‫ﻟﺘﻄﻮﻳﺮ ﺑﺮﺍﻣﺞ ‪ C++‬ﻭﺍﳌﺒﻴﻨﺔ ﰲ ﺍﻟﺸﻜﻞ ‪.1-1‬‬
‫ﲤﺮ ﺑﺮﺍﻣﺞ ‪ C++‬ﺑﺴﺖ ﻣﺮﺍﺣﻞ ﻗﺒﻞ ﺃﻥ ﻳﺘﻢ ﺗﻨﻔﻴﺬﻫﺎ )ﺍﻧﻈﺮ ﺍﻟﺸﻜﻞ ‪ (1-1‬ﻭﻫﻲ‪:‬‬
‫ﺍﻟﻜﺘﺎﺑﺔ ‪ ،edit‬ﻣﺎ ﻗﺒﻞ ﺍﻟﺘﺮﲨﺔ ‪ ،Preprocess‬ﺍﻟﺘﺮﲨﺔ ‪ ،Compile‬ﺍﻟﻮﺻﻞ ‪ ،Link‬ﺍﻟﺸﺤﻦ ‪ ،Load‬ﻭﺍﻟﺘﻨﻔﻴﺬ‬
‫‪ .Execute‬ﺗﻌﱪ ﺍﳌﺮﺍﺣﻞ ﺍﻟﺴﺎﺑﻘﺔ ﻋﻦ ﺑﻴﺌﺔ ﺗﻄﻮﻳﺮ ﻟـ ‪ C++‬ﳝﻜﻦ ﺃﻥ ﳒﺪﻫﺎ ﲢﺖ ﻧﻈﺎﻡ ﺍﻟﺘﺸﻐﻴﻞ ‪.Unix‬‬
‫ﺑﺎﻟﺘﺎﱄ ﺇﺫﺍ ﻛﻨﺖ ﺗﺴﺘﺨﺪﻡ ﻫﺬﺍ ﺍﻟﻨﻈﺎﻡ ﺍﻧﻈﺮ ﰲ ﺍﻟﻜﺘﻴﺒﺎﺕ ‪ manuals‬ﺍﳋﺎﺻﺔ ﺑﻨﻈﺎﻣﻚ ﺃﻭ ﺍﺳﺄﻝ ﻣﻌﻠﻤﻚ‬
‫ﻋﻦ ﻛﻴﻔﻴﺔ ﺇﳒﺎﺯ ﻫﺬﻩ ﺍﳌﺮﺍﺣﻞ ﺿﻤﻦ ﺑﻴﺌﺔ ﻋﻤﻠﻚ‪.‬‬
‫اﻟﻔﺼﻞ اﻷول‬ ‫‪٣٨‬‬

‫<<‬

‫]‪< <íéÖ^nÚ<C++<ØÛÂ<íòée<<V1-1<ØÓÖ‬‬

‫ﻬﺗﺪﻑ ﺍﳌﺮﺣﻠﺔ ﺍﻷﻭﱃ ﺇﱃ ﻛﺘﺎﺑﺔ ﻧﺺ ﺍﻟﱪﻧﺎﻣﺞ ﻭﳝﻜﻦ ﺃﻥ ﻳﺘﻢ ﺫﻟﻚ ﺑﻮﺍﺳﻄﺔ ﳏﺮﺭ ﻟﻠﻨﺼﻮﺹ ﺍﻟﺬﻱ‬
‫ﻳﺴﺘﺨﺪﻣﻪ ﺍﳌﱪﻣﺞ ﻟﻜﺘﺎﺑﺔ ﺑﺮﻧﺎﳎﻪ ﺑﻠﻐﺔ ‪ C++‬ﻭﺍﻟﻘﻴﺎﻡ ﺑﺎﻟﺘﺼﺤﻴﺤﺎﺕ ﰲ ﺣﺎﻝ ﺍﻟﻀﺮﻭﺭﺓ‪ .‬ﺑﻌﺪﻫﺎ ﻳﺘﻢ‬
‫ﲣﺰﻳﻦ ﺍﻟﱪﻧﺎﻣﺞ ﻋﻠﻰ ﻭﺣﺪﺓ ﲣﺰﻳﻦ ﺛﺎﻧﻮﻳﺔ ﻣﺜﻞ ﺍﻷﻗﺮﺍﺹ‪ .‬ﻧﻌﻄﻲ ﻋﺎﺩ ﹰﺓ "ﺑﺮﺍﻣﺞ ‪ C++‬ﺃﲰﺎﺀ" ﺗﻨﺘﻬﻲ‬
‫ﺑﺎﻹﻣﺘﺪﺍﺩ ‪) .C‬ﻻﺣﻆ ﺃﻥ ‪ C‬ﻫﻲ ﻋﺒﺎﺭﺓ ﻋﻦ ﺣﺮﻑ ﻛﺒﲑ‪ .‬ﰲ ﺑﻌﺾ ﺑﻴﺌﺎﺕ ﺍﻟﻌﻤﻞ ﺍﻷﺧﺮﻯ ﻳﺘﻢ ﺍﺳﺘﺨﺪﺍﻡ‬
‫ﺍﻣﺘﺪﺍﺩﺍﺕ ﺃﺧﺮﻯ ﻣﺜﻞ ‪ .cpp‬ﺃﻭ ‪ ..cxx‬ﺍﻧﻈﺮ ﺍﳌﺮﺍﺟﻊ ﺍﳌﺮﺍﻓﻘﺔ ﻟﺒﻴﺌﺔ ﻋﻤﻠﻚ ﺍﳋﺎﺻﺔ ﺑـ ‪ C++‬ﻣﻦ ﺃﺟﻞ‬
‫ﺍﳌﺰﻳﺪ ﻣﻦ ﺍﳌﻌﻠﻮﻣﺎﺕ(‪ .‬ﲢﺖ ‪ ،Unix‬ﻳﺘﻢ ﺍﺳﺘﺨﺪﺍﻡ ﳏﺮﺭﻱ ﺍﻟﻨﺼﻮﺹ ‪ vi‬ﻭ‪ emacs‬ﺑﺸﻜﻞ ﻛﺒﲑ ﰲ ﺣﲔ‬
‫ﲢﺘﻮﻱ ﺑﺮﳎﻴﺎﺕ ‪ C++‬ﻣﺜﻞ ‪ Borland C++‬ﻭ ‪ Microsoft C/C++‬ﺍﳋﺎﺻﺔ ﺑﺎﳊﻮﺍﺳﺐ ﺍﻟﺸﺨﺼﻴﺔ ﻋﻠﻰ‬
‫ﳏﺮﺭﺍﺕ ﻟﻠﻨﺼﻮﺹ ﺗﻨﻀﻮﻱ ﺿﻤﻦ ﺑﻴﺌﺔ ﺍﻟﻌﻤﻞ ﻭﺍﻟﺘﻄﻮﻳﺮ ﺍﻟﱪﳎﻲ‪ .‬ﳓﻦ ﻧﻔﺘﺮﺽ ﺃﻥ ﺍﻟﻘﺎﺭﺉ ﻳﻌﺮﻑ ﻛﻴﻒ‬
‫ﻳﻘﻮﻡ ﺑﻜﺘﺎﺑﺔ ﺑﺮﻧﺎﳎﻪ ﺑﺎﺳﺘﺨﺪﺍﻡ ﳏﺮﺭ ﻟﻠﻨﺼﻮﺹ‪.‬‬
‫‪C++‬‬ ‫ﻟﻠﱪﻧﺎﻣﺞ‪ .‬ﻓﻴﻘﻮﻡ ﺍﳌﺘﺮﺟﻢ ﺑﺘﺮﲨﺔ ﺑﺮﻧﺎﻣﺞ ﺍﻟـ‬ ‫‪Compile‬‬ ‫ﻳﻘﻮﻡ ﺍﳌﱪﻣﺞ ﺑﻌﺪﻫﺎ ﺑﻄﻠﺐ ﺃﻣﺮ ﺍﻟﺘﺮﲨﺔ‬
‫‪٣٩‬‬ ‫‪ .1‬ﻣﻘﺪﻣﺔ ﺣﻮل اﻟﺤﻮاﺳﻴﺐ واﻟﺒﺮﻣﺠﺔ ﺑﻠﻐﺔ ‪C++‬‬

‫ﺇﱃ ﻟﻐﺔ ﺍﻵﻟﺔ )ﺍﻟﱵ ﺗﺴﻤﻰ ﺃﺣﻴﺎﻧﹰﺎ ‪ .(object code‬ﻗﺒﻞ ﺍﻟﺒﺪﺀ ﲟﺮﺣﻠﺔ ﺍﻟﺘﺮﲨﺔ ﻳﺘﻢ ﺗﻨﻔﻴﺬ ﻣﺮﺣﻠﺔ ﻣﺎ ﻗﺒﻞ‬
‫ﺍﻟﺘﺮﲨﺔ ﺍﻟﱵ ﻬﺗﺪﻑ ﺇﱃ ﺍﻟﺘﻌﺎﻣﻞ ﻣﻊ ﺃﻭﺍﻣﺮ ﺧﺎﺻﺔ ﺗﺴﻤﻰ ﺑﺘﻮﺟﻴﻬﺎﺕ ﻣﺎ ﻗﺒﻞ ﺍﻟﺘﺮﲨﺔ ‪Preprocessor‬‬
‫‪ .directives‬ﲢﺪﺩ ﻫﺬﻩ ﺍﻟﺘﻮﺟﻴﻬﺎﺕ ﲨﻠﺔ ﻣﻦ ﺍﳌﻌﺎﳉﺎﺕ ﻭﺍﻹﺟﺮﺍﺀﺍﺕ ﺍﻟﻮﺍﺟﺐ ﺗﻨﻔﻴﺬﻫﺎ ﻋﻠﻰ ﻧﺺ‬
‫ﺍﻟﱪﻧﺎﻣﺞ ﻗﺒﻞ ﻋﻤﻠﻴﺔ ﺍﻟﺘﺮﲨﺔ ﺍﳊﻘﻴﻘﻴﺔ‪ .‬ﻣﻦ ﺑﲔ ﻫﺬﻩ ﺍﻹﺟﺮﺍﺀﺍﺕ‪ ،‬ﳒﺪ ﻋﺎﺩ ﹰﺓ ﻋﻤﻠﻴﺎﺕ ﺍﻻﺣﺘﻮﺍﺀ ﻟﻨﺼﻮﺹ‬
‫ﻣﻠﻔﺎﺕ ﺃﺧﺮﻯ ﺿﻤﻦ ﺍﳌﻠﻒ ﺍﳌﻄﻠﻮﺏ ﺗﺮﲨﺘﻪ ﺑﺎﻹﺿﺎﻓﺔ ﺇﱃ ﺍﻟﻘﻴﺎﻡ ﲜﻤﻠﺔ ﻣﻦ ﺍﻟﺘﻌﻮﻳﻀﺎﺕ ﻟﻌﺒﺎﺭﺍﺕ ﺿﻤﻦ‬
‫ﻧﺺ ﺍﻟﱪﻧﺎﻣﺞ‪ .‬ﺳﻮﻑ ﻧﻨﺎﻗﺶ ﰲ ﺍﻟﻔﺼﻮﻝ ﺍﻷﻭﱃ ﺍﻟﺘﺎﻟﻴﺔ ﻣﻌﻈﻢ ﺗﻮﺟﻴﻬﺎﺕ ﻣﺎ ﻗﺒﻞ ﺍﻟﺘﺮﲨﺔ ﰲ ﺣﲔ ﳝﻜﻦ‬
‫ﺃﻥ ﳒﺪ ﺣﻮﳍﺎ ﰲ ﺍﳌﻠﺤﻘﺎﺕ ﺗﻔﺼﻴﻼﺕ ﺃﺧﺮﻯ ﲜﻤﻴﻊ ﺍﻟﺘﻮﺟﻴﻬﺎﺕ ﺍﳌﻤﻜﻦ ﺍﺳﺘﺨﺪﺍﻣﻬﺎ‪ .‬ﻳﺘﻢ ﺍﺳﺘﺪﻋﺎﺀ‬
‫ﻣﺮﺣﻠﺔ ﻣﺎ ﻗﺒﻞ ﺍﻟﺘﺮﲨﺔ ﻣﻦ ﻗﺒﻞ ﺍﳌﺘﺮﺟﻢ ﻧﻔﺴﻪ ﻗﺒﻞ ﻋﻤﻠﻴﺔ ﲢﻮﻳﻞ ﺍﻟﱪﻧﺎﻣﺞ ﺇﱃ ﻟﻐﺔ ﺍﻵﻟﺔ‪.‬‬
‫ﺗﺴﻤﻰ ﺍﳌﺮﺣﻠﺔ ﺍﻟﻼﺣﻘﺔ ﻟﺬﻟﻚ "ﲟﺮﺣﻠﺔ ﺍﻟﻮﺻﻞ" ‪ .linking‬ﻓﱪﺍﻣﺞ ‪ C++‬ﺗﺘﻀﻤﻦ ﺍﺳﺘﺪﻋﺎﺀﺍﺕ ﻟﺘﻮﺍﺑﻊ ﰎ‬
‫ﺗﻌﺮﻳﻔﻬﺎ ﰲ ﻣﻜﺎﻥ ﺁﺧﺮ ﻣﺜﻞ ﺍﳌﻜﺘﺒﺎﺕ ﺍﳌﻌﻴﺎﺭﻳﺔ ﺃﻭ ﺍﳌﻜﺘﺒﺎﺕ ﺍﳋﺎﺻﺔ ﲟﺠﻤﻮﻋﺔ ﻣﻦ ﺍﳌﱪﳎﲔ ﺍﻟﻌﺎﻣﻠﲔ‬
‫ﺿﻤﻦ ﻣﺸﺮﻭﻉ ﻣﻌﲔ‪ .‬ﳛﺘﻮﻱ ﺍﻟﻨﺺ ﺍﻟﻨﺎﺗﺞ ﲟﻮﺟﺐ ﻋﻤﻠﻴﺔ ﺍﻟﺘﺮﲨﺔ ﻋﻠﻰ "ﻓﺠﻮﺍﺕ" ﺑﺴﺒﺐ ﻫﺬﻩ ﺍﻷﺟﺰﺍﺀ‬
‫ﺍﻟﻨﺎﻗﺼﺔ‪ .‬ﻳﻘﻮﻡ ﺍﻟﻮﺍﺻﻞ ‪ linker‬ﺑﻮﺻﻞ ﺍﳌﻠﻒ ﺍﻟﺴﺎﺑﻖ ﻣﻊ ﻧﺼﻮﺹ ﺍﻟﺘﻮﺍﺑﻊ ﺍﻟﻨﺎﻗﺼﺔ ﻣﻦ ﺃﺟﻞ ﺍﻟﻮﺻﻮﻝ ﺇﱃ‬
‫ﺻﻮﺭﺓ ﻗﺎﺑﻠﺔ ﻟﻠﺘﻨﻔﻴﺬ )ﺩﻭﻥ ﺃﻳﺔ ﺃﺟﺰﺍﺀ ﻧﺎﻗﺼﺔ(‪.‬‬
‫ﺇﺫﺍ ﲤﺖ ﻋﻤﻠﻴﺔ ﺍﻟﺘﺮﲨﺔ ﻭﺍﻟﻮﺻﻞ ﻟﻠﱪﻧﺎﻣﺞ ﺑﺸﻜﻞ ﺻﺤﻴﺢ ﻳﻨﺘﺞ ﻟﺪﻳﻨﺎ ﻣﻠﻔﹰﺎ ﺗﻨﻔﻴﺬﻳﹰﺎ‪ .‬ﻳﺸﻜﻞ ﻫﺬﺍ ﺍﳌﻠﻒ‬
‫ﺍﻟﺼﻮﺭﺓ ﺍﻟﺘﻨﻔﻴﺬﻳﺔ ﻟﱪﻧﺎﳎﻨﺎ ‪.Welcome.c‬‬
‫ﺗﺘﻤﺜﻞ ﺍﳋﻄﻮﺓ ﺍﻟﺘﺎﻟﻴﺔ ﰲ ﻣﺮﺣﻠﺔ ﺍﻟﺸﺤﻦ ‪ ،loading‬ﻓﻘﺒﻞ ﺗﻨﻔﻴﺬ ﺍﻟﱪﻧﺎﻣﺞ ﳚﺐ ﺃﻭ ﹰﻻ ﻭﺿﻌﻪ ﰲ ﺍﻟﺬﺍﻛﺮﺓ ﻭﺫﻟﻚ‬
‫ﻳﺘﻢ ﺑﻮﺍﺳﻄﺔ ﺍﻟﺸﺎﺣﻦ ‪ loader‬ﺍﻟﺬﻱ ﻳﻘﻮﻡ ﺑﺄﺧﺬ ﺍﳌﻠﻒ ﺍﻟﺘﻨﻔﻴﺬﻱ ﻭﻳﻨﻘﻠﻪ ﺇﱃ ﺍﻟﺬﺍﻛﺮﺓ‪ .‬ﺃﺧﲑﺍﹰ‪ ،‬ﻳﺒﺪﺃ ﺍﳊﺎﺳﺐ‬
‫ﺗﻨﻔﻴﺬ ﺍﻟﱪﻧﺎﻣﺞ ﺗﻌﻠﻴﻤﺔ ﻓﺘﻌﻠﻴﻤﺔ ﲢﺖ ﺇﺷﺮﺍﻑ ﻭﺳﻴﻄﺮﺓ ﻭﺣﺪﺓ ﺍﻟﺘﺤﻜﻢ ﻭﺍﳌﻌﺎﳉﺔ ‪.CPU‬‬
‫ﻣﻦ ﺍﻟﻨﺎﺩﺭ ﺃﻥ ﺗﻌﻤﻞ ﺍﻟﱪﺍﻣﺞ ﺑﺸﻜﻞ ﺻﺤﻴﺢ ﻣﻦ ﺍﶈﺎﻭﻟﺔ ﺍﻷﻭﱃ ﺣﻴﺚ ﳝﻜﻦ ﺃﻥ ﺗﻔﺸﻞ ﺇﺣﺪﻯ ﺍﳌﺮﺍﺣﻞ‬
‫ﺍﻟﺴﺎﺑﻘﺔ ﺑﺴﺒﺐ ﻋﺪﺓ ﺃﻧﻮﺍﻉ ﻣﻦ ﺍﻷﺧﻄﺎﺀ ﺍﻟﱵ ﺳﻮﻑ ﻧﻨﺎﻗﺸﻬﺎ ﻣﻦ ﺧﻼﻝ ﻫﺬﺍ ﺍﻟﻜﺘﺎﺏ‪ .‬ﻋﻠﻰ ﺳﺒﻴﻞ‬
‫ﺍﳌﺜﺎﻝ‪ ،‬ﳝﻜﻦ ﺃﻥ ﳛﺎﻭﻝ ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﻘﻴﺎﻡ ﺑﻌﻤﻠﻴﺔ ﺗﻘﺴﻴﻢ ﻋﻠﻰ ﺻﻔﺮ )ﻭﻫﻲ ﻋﻤﻠﻴﺔ ﻏﲑ ﺻﺤﻴﺤﺔ ﺑﺎﻟﻨﺴﺒﺔ‬
‫ﻟﻠﺤﻮﺍﺳﺐ ﻛﻤﺎ ﻫﻮ ﺍﳊﺎﻝ ﺑﺎﻟﻨﺴﺒﺔ ﻟﻠﻤﻨﻄﻖ ﺍﳊﺴﺎﰊ( ﳑﺎ ﻳﺪﻓﻊ ﺍﳊﺎﺳﺐ ﺇﱃ ﻃﺒﺎﻋﺔ ﺭﺳﺎﻟﺔ ﺧﻄﺄ‪ .‬ﺑﻌﺪﻫﺎ‬
‫ﳚﺐ ﻋﻠﻰ ﺍﳌﱪﻣﺞ ﺍﻟﻌﻮﺩﺓ ﺇﱃ ﻣﺮﺣﻠﺔ ﻛﺘﺎﺑﺔ ﺍﻟﱪﻧﺎﻣﺞ ﻭﲢﺮﻳﺮﻩ ﻟﻠﻘﻴﺎﻡ ﺑﺎﻟﺘﻌﺪﻳﻼﺕ ﺍﻟﻼﺯﻣﺔ ﻭﻟﻴﻤﺮ ﺑﻌﺪ‬
‫ﺫﻟﻚ ﺑﺎﳌﺮﺍﺣﻞ ﺍﳌﺘﺒﻘﻴﺔ ﺍﻟﺘﺎﻟﻴﺔ ﻣﺮﺓ ﺃﺧﺮﻯ ﺣﱴ ﻳﺘﺤﻘﻖ ﻣﻦ ﻫﺬﻩ ﺍﻟﺘﻌﺪﻳﻼﺕ ﺗﻌﻤﻞ ﺑﺸﻜﻞ ﺳﻠﻴﻢ‪.‬‬
‫أﺥﻄﺎء ﺑﺮﻣﺠﻴﺔ ﺵﺎﺉﻌﺔ‬ ‫‪1-1‬‬

‫ﺕﺤﺪث اﻷﺥﻄﺎء ﻣﺜﻞ ﺕﻠﻚ اﻟﻨﺎﺕﺠﺔ ﻋﻠﻰ ﻋﻤﻠﻴﺔ اﻟﺘﻘﺴﻴﻢ ﻋﻠﻰ ﺹﻔﺮ ﻋﻨﺪ ﺕﻨﻔﻴﺬ‬
‫اﻟﺒﺮﻧﺎﻣﺞ ﻟﺬﻟﻚ ﺕﺴﻤﻰ هﺬﻩ اﻷﺥﻄﺎء " ﺑﺄﺥﻄﺎء زﻣﻦ اﻟﺘﻨﻔﻴﺬ" ‪run-time error‬‬
‫أو ‪ .execution-time errors‬یُﻌﺪ ﺥﻄﺄ اﻟﺘﻘﺴﻴﻢ ﻋﻠﻰ ﺹﻔﺮ ﻣﻦ اﻷﺥﻄﺎء اﻟﻘﺎﺕﻠﺔ‬
‫‪7‬‬
‫‪ Fatal errors‬أي أن هﺬا اﻟﺨﻄﺄ یﺴﺒﺐ إﻧﺘﻬﺎء اﻟﺒﺮﻧﺎﻣﺞ ﻣﺒﺎﺵﺮة ﺑﺪون إﺕﻤﺎم‬
‫ﻣﻬﺎﻣﻪ ﺑﻨﺠﺎح‪ .‬ﻓﻲ ﺣﻴﻦ یﺘﺎﺑﻊ اﻟﺒﺮﻧﺎﻣﺞ ﺕﻨﻔﻴﺬﻩ ﺣﺘﻰ اﻟﻨﻬﺎیﺔ ﻣﻊ اﻷﺥﻄﺎء ﻏﻴﺮ‬
‫اﻟﻘﺎﺕﻠﺔ وﻟﻜﻦ یﻌﻄﻲ ﻧﺘﺎﺋﺞ ﻏﻴﺮ ﺹﺤﻴﺤﺔ‪.‬‬
‫اﻟﻔﺼﻞ اﻷول‬ ‫‪٤٠‬‬

‫ﺗﻘﻮﻡ ﻣﻌﻈﻢ ﺑﺮﺍﻣﺞ ‪ C++‬ﺑﺄﺧﺬ ﻭ‪/‬ﺃﻭ ﺇﻋﻄﺎﺀ ﻣﻌﻄﻴﺎﺕ‪ .‬ﻓﺒﻌﺾ ﺗﻮﺍﺑﻊ ‪ C++‬ﺗﺄﺧﺬ ﺩﺧﻠﻬﺎ ﻣﻦ ‪) Cin‬ﻣﻦ‬
‫ﳎﺮﻯ ﺍﻟﺪﺧﻞ ﺍﳌﻌﻴﺎﺭﻱ ‪ standard input stream‬ﻭﺗﻠﻔﻆ’’‪ ("see-in‬ﺍﻟﺬﻱ ﻫﻮ ﻋﺎﻣ ﹰﺔ ﻋﺒﺎﺭﺓ ﻋﻦ ﻟﻮﺣﺔ ﺍﳌﻔﺎﺗﻴﺢ‬
‫ﻟﻜﻦ ﳝﻜﻦ ﺭﺑﻄﻪ ﺑﺄﻱ ﺟﻬﺎﺯ ﺁﺧﺮ‪ .‬ﻳﺘﻢ ﺇﺧﺮﺍﺝ ﺍﳌﻌﻄﻴﺎﺕ ﺇﱃ ‪) cout‬ﺇﱃ ﳎﺮﻯ ﺍﳋﺮﺝ ﺍﳌﻌﻴﺎﺭﻱ ‪standard‬‬
‫‪ output stream‬ﻭﺗﻠﻔﻆ ”‪ (“see-out‬ﺍﻟﺬﻱ ﻫﻮ ﻋﺎﺩﺓ ﻋﺒﺎﺭﺓ ﻋﻦ ﺷﺎﺷﺔ ﺍﳊﺎﺳﺐ ﻭﻟﻜﻦ ﳝﻜﻦ ﺭﺑﻄﻪ ﺇﱃ ﺃﻱ‬
‫ﺟﻬﺎﺯ ﺧﺮﺝ ﺁﺧﺮ‪ .‬ﻓﻌﻨﺪﻣﺎ ﻧﻘﻮﻝ ﺃﻥ ﺑﺮﻧﺎﳎﹰﺎ ﻣﺎ ﻳﻘﻮﻡ ﺑﻄﺒﺎﻋﺔ ﻧﺘﺎﺋﺠﻪ ﻓﺈﻧﻨﺎ ﻧﻘﺼﺪ ﺑﺬﻟﻚ ﺃﻧﻪ ﻳﺘﻢ ﺇﻇﻬﺎﺭ‬
‫ﺍﻟﻨﺘﺎﺋﺞ ﻋﻠﻰ ﺍﻟﺸﺎﺷﺔ‪ .‬ﳝﻜﻦ ﺇﺧﺮﺍﺝ ﺍﻟﻨﺘﺎﺋﺞ ﻋﻠﻰ ﺃﺟﻬﺰﺓ ﺃﺧﺮﻯ ﻣﺜﻞ ﺍﻷﻗﺮﺍﺹ ﺃﻭ ﺍﻟﻄﺎﺑﻌﺎﺕ‪ .‬ﻳﻮﺟﺪ ﺃﻳﻀﹰﺎ‬
‫ﻣﺎ ﻳﺴﻤﻰ ﺑـ "ﳎﺮﻯ ﺍﻷﺧﻄﺎﺀ ﺍﳌﻌﻴﺎﺭﻱ" ‪ standard error stream‬ﺍﻟﺬﻱ ﻧﺮﻣﺰ ﻟﻪ ﺑـ ‪ Cerr‬ﺍﻟﺬﻱ ﻳﺴﺘﺨﺪﻡ‬
‫ﻋﺎﺩﺓ ﻣﻦ ﺃﺟﻞ ﺇﻇﻬﺎﺭ ﺭﺳﺎﺋﻞ ﺍﳋﻄﺄ )ﻭﻫﻮ ﻣﺮﺗﺒﻂ ﻋﺎﺩﺓ ﺑﺎﻟﺸﺎﺷﺔ(‪ .‬ﻣﻦ ﺍﻟﺸﺎﺋﻊ ﺃﻥ ﻳﻘﻮﻡ ﺍﳌﱪﳎﻮﻥ ﺑﺈﺭﺳﺎﻝ‬
‫ﻣﻌﻄﻴﺎﺕ ﺍﳋﺮﺝ )ﺃﻱ ﺗﻮﺟﻴﻪ ‪ (cout‬ﺇﱃ ﺃﻱ ﺟﻬﺎﺯ ﺁﺧﺮ ﻏﲑ ﺍﻟﺸﺎﺷﺔ ﺍﻟﱵ ﺗﺒﻘﻰ ﻣُﻮﺻّﻠﺔ ﻣﻊ ‪ cerr‬ﻣﻦ ﺃﺟﻞ‬
‫ﺇﺧﺒﺎﺭ ﺍﳌﺴﺘﺨﺪﻡ ﺑﺎﻷﺧﻄﺎﺀ ﺍﻟﱵ ﲢﺪﺙ ﻣﺒﺎﺷﺮﺓ‪.‬‬

‫ﺗﻮﺝﻬﺎت اﻟﺒﻨﻰ اﻟﺼﻠﺒﺔ‬ ‫‪15-1‬‬


‫ﻳﺰﺩﻫﺮ ﳎﺘﻤﻊ ﺍﻟﱪﳎﺔ ﻭﻳﻨﻤﻮ ﺑﺎﺳﺘﻤﺮﺍﺭ ﺑﺘﺄﺛﲑ ﺍﻟﺘﺤﺴﻴﻨﺎﺕ ﺍﳌﺪﺧﻠﺔ ﻋﻠﻰ ﺍﻟﺒﲎ ﺍﻟﺼﻠﺒﺔ ﻭﺗﻘﻨﻴﺎﺕ ﺍﻻﺗﺼﺎﻻﺕ‬
‫ﻭﺍﻟﱪﳎﻴﺎﺕ‪ .‬ﰲ ﻛﻞ ﻋﺎﻡ‪ ،‬ﻳﺘﻮﻗﻊ ﺍﻟﻨﺎﺱ ﺃﻬﻧﻢ ﺳﻴﺪﻓﻌﻮﻥ ﺃﻛﺜﺮ ﻣﻦ ﺃﺟﻞ ﺍﳊﺼﻮﻝ ﻋﻠﻰ ﻣﻌﻈﻢ ﺍﳌﻨﺘﺠﺎﺕ‬
‫ﻭﺍﳋﺪﻣﺎﺕ‪ .‬ﺑﺎﳌﻘﺎﺭﻧﺔ ﳛﺪﺙ ﺍﻟﻌﻜﺲ ﲤﺎﻣﹰﺎ ﻋﻨﺪﻣﺎ ﻳﺮﺗﺒﻂ ﺍﻷﻣﺮ ﺑﺎﳊﻮﺍﺳﻴﺐ ﻭﻗﻄﺎﻉ ﺍﻻﺗﺼﺎﻻﺕ ﺧﺎﺻﺔ‬
‫ﻓﻴﻤﺎ ﺇﺫﺍ ﺃﺧﺬﻧﺎ ﺑﻌﲔ ﺍﻻﻋﺘﺒﺎﺭ ﺗﻜﺎﻟﻴﻒ ﺍﻟﺒﲎ ﺍﻟﺼﻠﺒﺔ ﺍﻟﻼﺯﻣﺔ ﻟﺪﻋﻢ ﺗﻘﻨﻴﺎﺕ ﻫﺬﻳﻦ ﺍﺠﻤﻟﺎﻟﲔ‪ .‬ﻻﺣﻈﻨﺎ ﺧﻼﻝ‬
‫ﺍﻟﻌﻘﻮﺩ ﺍﳌﺎﺿﻴﺔ ﻛﻴﻒ ﺍﳓﺪﺭﺕ ﺍﻟﺘﻜﺎﻟﻴﻒ ﺍﳌﺮﺗﺒﻄﺔ ﺑﺎﻟﺒﲎ ﺍﻟﺼﻠﺒﺔ ﻭﻟﻴﺲ ﻣﻦ ﺍﳌﺘﻮﻗﻊ ﺃﻥ ﺗﺘﻐﲑ ﻫﺬﻩ ﺍﻟﺼﻮﺭﺓ‬
‫ﰲ ﺍﳌﺴﺘﻘﺒﻞ‪ .‬ﻭﻳﺸﻜﻞ ﺫﻟﻚ ﻇﺎﻫﺮﺓ ﺗﻜﻨﻮﻟﻮﺟﻴﺔ‪ .‬ﺗﺘﻐﲑ ﻛﻞ ﺳﻨﺔ ﺃﻭ ﺳﻨﺘﲔ ﻗﺪﺭﺍﺕ ﺍﳊﻮﺍﺳﻴﺐ ﺧﺎﺻﺔ‬
‫ﻋﻨﺪﻣﺎ ﻳﺮﺗﺒﻂ ﺍﻷﻣﺮ ﺑﺎﻟﺬﻭﺍﻛﺮ ﺍﻟﱵ ﳓﺘﺎﺟﻬﺎ ﻟﺘﻨﻔﻴﺬ ﺍﻟﱪﺍﻣﺞ ﻭﺑﺴﻌﺎﺕ ﺍﻟﺘﺨﺰﻳﻦ ﻋﻠﻰ ﺍﻷﻗﺮﺍﺹ ﺍﻟﺜﺎﻧﻮﻳﺔ‬
‫)ﻣﺜﻞ ﺃﻗﺮﺍﺹ ﺍﻟﺘﺨﺰﻳﻦ( ﺍﻟﱵ ﳓﺘﺎﺟﻬﺎ ﻟﺘﺨﺰﻳﻦ ﺍﻟﱪﺍﻣﺞ ﻭﺍﳌﻌﻄﻴﺎﺕ ﻭﺑﺴﺮﻋﺎﺕ ﺍﳌﻌﺎﳉﺎﺕ )ﺍﻟﺴﺮﻋﺔ ﺍﻟﱵ‬
‫ﻳﻨﻔﺬ ﻬﺑﺎ ﺍﳊﺎﺳﻮﺏ ﺑﺮﺍﳎﻪ( ﺣﻴﺚ ﺗﺰﺩﺍﺩ ﲟﻘﺪﺍﺭ ﺍﻟﻀﻌﻒ‪ .‬ﺷﻬﺪﻧﺎ ﻧﻔﺲ ﺍﻟﺸﻲﺀ ﰲ ﻗﻄﺎﻉ ﺍﻻﺗﺼﺎﻻﺕ‬
‫ﺧﺎﺻﺔ ﰲ ﺍﻟﺴﻨﻮﺍﺕ ﺍﻷﺧﲑﺓ ﺍﻟﱵ ﲤﻴﺰﺕ ﺑﻈﻬﻮﺭ ﻃﻠﺐ ﻛﺒﲑ ﻭﻣﻨﺎﻓﺴﺔ ﻋﺎﻟﻴﺔ‪ .‬ﻭﻟﺴﻨﺎ ﻧﻌﻠﻢ ﺑﻮﺟﻮﺩ‬
‫ﳎﺎﻻﺕ ﺃﺧﺮﻯ ﻟﻠﺘﻜﻨﻮﻟﻮﺟﻴﺎ ﲤﻴﺰﺕ ﺑﺎﳊﺮﻛﺔ ﻭﺍﻟﺘﻄﻮﺭ ﺍﻟﺴﺮﻳﻌﲔ ﻣﻊ ﺗﺪﻫﻮﺭ ﺍﻟﺘﻜﺎﻟﻴﻒ ﺑﺸﻜﻞ ﻛﺒﲑ‬
‫ﻭﺣﺎﺩ‪.‬‬
‫ﻋﻨﺪﻣﺎ ﺍﻧﺘﺸﺮ ﺍﺳﺘﺨﺪﺍﻡ ﺍﳊﻮﺍﺳﻴﺐ ﰲ ﺍﻟﺴﺘﻴﻨﺎﺕ ﻭﺍﻟﺴﺒﻌﻴﻨﺎﺕ‪ ،‬ﻛﺎﻥ ﺍﳊﺪﻳﺚ ﳚﺮﻱ ﻋﻦ ﺍﻟﺘﺤﺴﻴﻨﺎﺕ‬
‫ﺍﻟﻜﺒﲑﺓ ﻭﺍﻟﻀﺨﻤﺔ ﺍﻟﱵ ﺳﺘﺠﻠﺒﻬﺎ ﺍﳊﻮﺍﺳﻴﺐ ﻭﺍﻻﺗﺼﺎﻻﺕ ﻋﻠﻰ ﺇﻧﺘﺎﺟﻴﺔ ﺍﻟﻨﺎﺱ‪ .‬ﻟﻜﻦ ﻫﺬﻩ ﺍﻟﺘﺤﺴﻴﻨﺎﺕ‬
‫ﱂ ﺗﺘﺠﺴﺪ ﺑﺸﻜﻞ ﺟﻠﻲ‪ .‬ﻓﻘﺪ ﻛﺎﻧﺖ ﺍﳌﺆﺳﺴﺎﺕ ﻭﺍﳍﻴﺌﺎﺕ ﺗﺼﺮﻑ ﻣﺒﺎﻟﻎ ﻛﺒﲑﺓ ﻋﻠﻰ ﺍﳊﻮﺍﺳﻴﺐ‬
‫ﻭﺍﺳﺘﺨﺪﺍﻣﻬﺎ ﺑﺸﻜﻞ ﻓﻌﺎﻝ ﻭﻟﻜﻦ ﺩﻭﻥ ﲢﻘﻴﻖ ﺍﻟﺮﺑﺢ ﺍﳌﺘﻮﻗﻊ ﻋﻠﻰ ﻣﺴﺘﻮﻯ ﺍﻹﻧﺘﺎﺟﻴﺔ‪ .‬ﻟﻜﻦ ﺍﺧﺘﺮﺍﻉ‬
‫ﺍﻟﺪﺍﺭﺍﺕ ﺍﳌﺘﻜﺎﻣﻠﺔ ﻟﻠﻤﻌﺎﳉﺎﺕ ﻭﺍﻧﺘﺸﺎﺭﻫﺎ ﺍﻟﻜﺒﲑ ﰲ ﻬﻧﺎﻳﺔ ﺍﻟﺴﺒﻌﻴﻨﺎﺕ ﻭﺍﻟﺜﻤﺎﻧﻴﻨﺎﺕ‪ ،‬ﺃﺩﻯ ﺇﱃ ﺗﺄﺳﻴﺲ‬
‫ﻟﻈﻬﻮﺭ ﺍﻟﺘﺤﺴﻴﻨﺎﺕ ﻋﻠﻰ ﻣﺴﺘﻮﻯ ﺍﻹﻧﺘﺎﺟﻴﺔ ﰲ ﻓﺘﺮﺓ ﺍﻟﺘﺴﻌﻴﻨﺎﺕ ﻭﺑﺪﺍﻳﺔ ﺍﻷﻟﻔﻴﺔ ﺍﳉﺪﻳﺪﺓ‪.‬‬
‫‪٤١‬‬ ‫‪ .1‬ﻣﻘﺪﻣﺔ ﺣﻮل اﻟﺤﻮاﺳﻴﺐ واﻟﺒﺮﻣﺠﺔ ﺑﻠﻐﺔ ‪C++‬‬

‫ﺗﺎریﺦ ﺵﺒﻜﺔ اﻹﻥﺘﺮﻥﺖ‬ ‫‪16-1‬‬


‫ﰲ ﻬﻧﺎﻳﺔ ﻓﺘﺮﺓ ﺍﻟﺴﺘﻴﻨﺎﺕ‪ ،‬ﻛﺎﻥ ﺇﺣﺪﻯ ﻣﺆﻟﻔﻲ ﻫﺬﺍ ﺍﻟﻜﺘﺎﺏ )‪ (H.M.Deitel‬ﻳﻌﻤﻞ ﰲ ﻣﻌﻬﺪ ‪ MIT‬ﺑﻌﺪ ﲣﺮﺟﻪ‬
‫ﰲ ﺍﳌﺸﺮﻭﻉ ‪) Mac‬ﺍﻟﺬﻱ ﻳﺴﻤﻰ ﺣﺎﻟﻴﹰﺎ ﳐﱪ ﻋﻠﻮﻡ ﺍﻟﻜﻤﺒﻴﻮﺗﺮ‪ -‬ﻣﻘﺮ ﻣﻨﺘﺪﻯ ﺷﺒﻜﺔ ﺍﻟﻮﻳﺐ ﺍﻟﻌﺎﳌﻴﺔ( ﺍﳌﻤﻮﻝ‬
‫ﻣﻦ ﻗﺒﻞ ‪ (Advanced Research Projects Agency) ARPA‬ﰲ ﻭﺯﺍﺭﺓ ﺍﻟﺪﻓﺎﻉ ﺍﻷﻣﲑﻛﻴﺔ‪ .‬ﰲ ﺗﻠﻚ ﺍﻟﻔﺘﺮﺓ‬
‫ﻗﺎﻣﺖ ‪ ARPA‬ﺑﺘﻤﻮﻳﻞ ﻣﺆﲤﺮ ﺩﻋﻲ ﺇﻟﻴﻪ ﺑﻀﻌﺔ ﻋﺸﺮﺍﺕ ﻣﻦ ﺍﳋﺮﳚﲔ ﺍﻟﻌﺎﻣﻠﲔ ﻋﻠﻰ ﺷﺒﻜﺔ ‪ ARPA‬ﺇﱃ ﺟﺎﻣﻌﺔ‬
‫‪ Illinois‬ﻟﻠﺘﻘﺎﺑﻞ ﻭﺍﻟﺘﺸﺎﺭﻙ ﺑﺎﻷﻓﻜﺎﺭ‪ .‬ﺑﺮﺯﺕ ﺧﻼﻝ ﺃﻋﻤﺎﻝ ﻫﺬﺍ ﺍﳌﺆﲤﺮ ﻓﻜﺮﺓ ﺍﻟﻮﺻﻞ ﺍﻟﺸﺒﻜﻲ ﻟﻌﺸﺮﺍﺕ‬
‫ﺍﳌﻮﺍﻗﻊ ﺍﳉﺎﻣﻌﻴﺔ ﺍﻟﺘﺎﺑﻌﺔ ﻟـ ‪ ARPA‬ﻭﺍﳌﻮﺟﻮﺩﺓ ﰲ ﻋﺪﺓ ﺟﺎﻣﻌﺎﺕ ﻭﻣﺆﺳﺴﺎﺕ‪ .‬ﻛﺎﻥ ﳚﺐ ﻭﺻﻞ ﻫﺬﻩ‬
‫ﺍﳌﻮﺍﻗﻊ ﲞﻄﻮﻁ ﺍﺗﺼﺎﻝ ﺫﺍﺕ ﺳﺮﻋﺔ ﻟﻠﻨﻘﻞ ﺗﺼﻞ ﺣﱴ ‪ 56Kbps‬ﰲ ﺍﻟﻮﻗﺖ ﺍﻟﺬﻱ ﻛﺎﻧﺖ ﺣﻮﺍﺳﻴﺐ ﺍﻟﺒﻌﺾ‬
‫ﻣﺘﺼﻠﺔ ﻣﻊ ﺑﻌﻀﻬﻢ ﺍﻟﺒﻌﺾ ﻣﻦ ﺧﻼﻝ ﺧﻄﻮﻁ ﺗﻠﻔﻮﻧﻴﺔ ﺫﺍﺕ ﺳﺮﻋﺔ ﻟﻠﻨﻘﻞ ﺗﺼﻞ ﺣﱴ ‪ .110 bps‬ﻣﺎ ﻳﺰﺍﻝ‬
‫‪ H.M.Deitel‬ﻳﺘﺬﻛﺮ ﺣﱴ ﺍﻵﻥ ﺍﳊﻤﺎﺱ ﺍﻟﺬﻱ ﺳﺮﻯ ﺑﲔ ﺍﳌﺸﺎﺭﻛﲔ ﰲ ﺍﳌﺆﲤﺮ ﻟﺪﻯ ﲰﺎﻋﻬﻢ ﻬﺑﺬﻩ ﺍﻟﻔﻜﺮﺓ‪.‬‬
‫ﲢﺪﺙ ﺑﻌﺾ ﺍﻟﺒﺎﺣﺜﲔ ﰲ ﺟﺎﻣﻌﺔ ‪ Harward‬ﻋﻦ ﻋﻤﻠﻴﺎﺕ ﺍﻻﺗﺼﺎﻝ ﻣﻊ ﺍﳊﺎﺳﺐ ﺍﻟﻌﻤﻼﻕ ‪Univac 1108‬‬
‫ﻋﱪ ﺍﻟﺒﻼﺩ ﻭﺻﻮ ﹰﻻ ﺇﱃ ﺟﺎﻣﻌﺔ ‪ Utah‬ﻟﺘﻨﻔﻴﺬ ﺣﺴﺎﺑﺎﺕ ﻣﺮﺗﺒﻄﺔ ﺑﺄﲝﺎﺛﻬﻢ ﺍﻷﻛﺎﺩﳝﻴﺔ ﰲ ﺗﻠﻚ ﺍﻟﻔﺘﺮﺓ ﻭﺍﻟﱵ‬
‫ﻋﻠﻰ ﻭﺷﻚ ﺃﻥ ﺗﻘﻮﻡ ﺑﻘﻔﺰﺓ ﳓﻮ ﺍﻷﻣﺎﻡ‪.‬‬
‫ﺑﻌﺪ ﺍﳌﺆﲤﺮ ﺑﻔﺘﺮﺓ ﻗﺼﲑﺓ‪ ،‬ﺑﺪﺃﺕ ‪ ARPA‬ﺑﺒﻨﺎﺀ ﻣﺎ ﲰﻲ ﺑﻌﺪ ﺫﻟﻚ ﺑﺸﺒﻜﺔ ‪ ARPA net‬ﺍﳉﺪ ﺍﻷﻭﻝ ﳌﺎ ﻳﻌﺮﻑ‬
‫ﺍﻟﻴﻮﻡ ﺑﺸﺒﻜﺔ ﺍﻹﻧﺘﺮﻧﺖ‪.‬‬
‫ﺟﺮﺕ ﺍﻷﻣﻮﺭ ﺑﻌﺪ ﺫﻟﻚ ﺑﺸﻜﻞ ﳐﺘﻠﻒ ﻋﻤﺎ ﻛﺎﻥ ﳐﻄﻄﹰﺎ ﳍﺎ‪ .‬ﻓﺒﺪ ﹰﻻ ﻣﻦ ﺃﻥ ﺗﻜﻮﻥ ﺍﻟﻔﺎﺋﺪﺓ ﺍﻟﺮﺋﻴﺴﻴﺔ ﻟﻠﺸﺒﻜﺔ‬
‫ﰲ ﲤﻜﲔ ﺍﻟﺒﺎﺣﺜﲔ ﰲ ﻣﺸﺎﺭﻛﺔ ﺣﻮﺍﺳﺒﻬﻢ‪ ،‬ﻇﻬﺮ ﺟﻠﻴﹰﺎ ﻭﺳﺮﻳﻌﹰﺎ ﺃﻥ ﳎﺮﺩ ﲤﻜﲔ ﺍﻟﺒﺎﺣﺜﲔ ﻣﻦ ﺍﻻﺗﺼﺎﻝ ﻓﻴﻤﺎ‬
‫ﺑﻴﻨﻬﻢ ﺑﺴﺮﻋﺔ ﻭﺳﻬﻮﻟﺔ ﺑﻮﺍﺳﻄﺔ ﻣﺎ ﺃﺻﺒﺢ ﻳﻌﺮﻑ ﰲ ﻳﻮﻣﻨﺎ ﻫﺬﺍ ﺑﺎﻟﱪﻳﺪ ﺍﻹﻟﻜﺘﺮﻭﱐ ‪(e- mail) electronic mail‬‬
‫ﻫﻲ ﺍﻟﻔﺎﺋﺪﺓ ﺍﻟﺮﺋﻴﺴﻴﺔ ﻟﺸﺒﻜﺔ ‪ .ARPA net‬ﻫﺬﺍ ﺻﺤﻴﺢ ﺣﱴ ﰲ ﻳﻮﻣﻨﺎ ﻫﺬﺍ ﺑﺎﻟﻨﺴﺒﺔ ﻟﺸﺒﻜﺔ ﺍﻹﻧﺘﺮﻧﺖ ﺍﻟﱵ‬
‫ﲤﻜﻦ ﻣﻼﻳﲔ ﺍﻷﺷﺨﺎﺹ ﻣﻦ ﺍﻻﺗﺼﺎﻝ ﻓﻴﻤﺎ ﺑﻴﻨﻬﻢ ﺑﻮﺍﺳﻄﺔ ﺍﻟﱪﻳﺪ ﺍﻹﻟﻜﺘﺮﻭﱐ‪.‬‬
‫ﻛﺎﻥ ﺃﺣﺪ ﺍﻷﻫﺪﺍﻑ ﺍﻟﺮﺋﻴﺴﻴﺔ ﻟـ ‪ ARPA‬ﻣﻦ ﺍﻟﺸﺒﻜﺔ ﺍﻟﱵ ﻗﺎﻣﺖ ﺑﺒﻨﺎﺋﻬﺎ ﻫﻮ ﺍﻟﺴﻤﺎﺡ ﻟﻠﻤﺴﺘﺨﺪﻣﲔ ﺇﺭﺳﺎﻝ‬
‫ﻭﺍﺳﺘﻘﺒﺎﻝ ﺍﳌﻌﻠﻮﻣﺎﺕ ﰲ ﻧﻔﺲ ﺍﻟﻮﻗﺖ ﻭﻋﻠﻰ ﻧﻔﺲ ﻣﺴﺎﺭﺍﺕ ﺍﻻﺗﺼﺎﻝ )ﻛﻤﺎ ﻫﻮ ﺍﳊﺎﻝ ﺑﺎﻟﻨﺴﺒﺔ ﻟﻠﺨﻄﻮﻁ‬
‫ﺍﳍﺎﺗﻔﻴﺔ(‪ .‬ﻋﻤﻠﺖ ﺍﻟﺸﺒﻜﺔ ﻭﻓﻘﹰﺎ ﻟﺘﻘﻨﻴﺔ ﺍﻟﺘﺒﺪﻳﻞ ﺑﺎﻟﻄﺮﻭﺩ‪/‬ﺍﻟﺮﺯﻡ ‪ Packet Switching‬ﻭﺍﻟﱵ ﺗﻌﺘﻤﺪ ﻋﻠﻰ ﺇﺭﺳﺎﻝ‬
‫ﺍﳌﻌﻄﻴﺎﺕ ﺍﻟﺮﻗﻤﻴﺔ ﻋﻠﻰ ﺷﻜﻞ ﺣﺰﻡ ﺻﻐﲑﺓ ﺗﺪﻋﻰ ﻃﺮﻭﺩ‪/‬ﺭﺯﻡ ‪ .Packet‬ﺗﺘﻀﻤﻦ ﻫﺬﻩ ﺍﻟﺮﺯﻡ ﺍﳌﻌﻄﻴﺎﺕ‬
‫ﻭﻣﻌﻠﻮﻣﺎﺕ ﺍﻟﻌﻨﺎﻭﻳﻦ ﻭﻣﻌﻠﻮﻣﺎﺕ ﺍﻟﺘﺤﻜﻢ ﺑﺎﻷﺧﻄﺎﺀ ﻭﻣﻌﻠﻮﻣﺎﺕ ﺍﻟﺘﺴﻠﺴﻞ ﺍﳌﻄﻠﻮﺏ ﻻﺳﺘﻘﺒﺎﻝ ﺍﻟﺮﺯﻡ‪.‬‬
‫ﺍﺳﺘﺨﺪﻣﺖ ﻣﻌﻠﻮﻣﺎﺕ ﺍﻟﻌﻨﺎﻭﻳﻦ ﻣﻦ ﺃﺟﻞ ﺗﻮﺟﻴﻪ ﺍﻟﻄﺮﻭﺩ ﺑﺎﲡﺎﻩ ﻫﺪﻓﻬﺎ‪ .‬ﺃﻣﺎ ﻣﻌﻠﻮﻣﺎﺕ ﺍﻟﺘﺴﻠﺴﻞ ﻓﻘﺪ ﻛﺎﻧﺖ‬
‫ﻣﻔﻴﺪﺓ ﻣﻦ ﺃﺟﻞ ﲡﻤﻴﻊ ﺍﻟﻄﺮﻭﺩ )ﺍﻟﱵ ﳝﻜﻦ ﺃﻥ ﺗﺼﻞ ﺇﱃ ﻫﺪﻓﻬﺎ ﻏﲑ ﻣﺮﺗﺒﺔ ﺑﺴﺒﺐ ﺃﺳﺎﻟﻴﺐ ﺍﻟﺘﻮﺟﻴﻪ ﺍﳌﻌﻘﺪﺓ‬
‫ﺍﳌﻤﻜﻦ ﺍﺳﺘﺨﺪﺍﻣﻬﺎ( ﰲ ﺗﺮﺗﻴﺒﻬﺎ ﺍﻷﺻﻠﻲ ﻟﻌﺮﺿﻬﺎ ﻋﻠﻰ ﺍﳌﺴﺘﻘﺒﻞ‪.‬‬
‫ﻭﺑﺎﻟﺘﺎﱄ ﳝﻜﻦ ﺃﻥ ﺗﺴﲑ ﺑﺎﻟﺘﺎﱄ ﺍﻟﺮﺯﻡ ﺍﳋﺎﺻﺔ ﺑﻌﺪﺓ ﺃﺷﺨﺎﺹ ﻋﻠﻰ ﻧﻔﺲ ﺍﳋﻄﻮﻁ‪ .‬ﺳﺎﻋﺪﺕ ﺗﻘﻨﻴﺔ‬
‫ﺍﻟﺘﺒﺪﻳﻞ ﺑﺎﻟﻄﺮﻭﺩ ﺑﺸﻜﻞ ﻛﺒﲑ ﻋﻠﻰ ﺍﻟﺘﺨﻔﻴﻒ ﻣﻦ ﻛﻠﻒ ﺍﻹﺭﺳﺎﻝ ﻣﻘﺎﺭﻧﺔ ﻣﻊ ﺧﻄﻮﻁ ﺍﻻﺗﺼﺎﻝ ﺍﶈﺠﻮﺯﺓ‬
‫ﺃﻭ ﺍﳌﺨﺼﺼﺔ‪.‬‬
‫اﻟﻔﺼﻞ اﻷول‬ ‫‪٤٢‬‬

‫ﺻُﻤﻤﺖ ﺍﻟﺸﺒﻜﺔ ﻟﺘﻌﻤﻞ ﺑﺪﻭﻥ ﲢﻜﻢ ﻣﺮﻛﺰﻱ‪ .‬ﻭﻫﺬﺍ ﻳﻌﲏ ﺃﻧﻪ ﰲ ﺣﺎﻝ ﺗﻌﻄﻞ ﺟﺰﺀ ﻣﻨﻬﺎ‪ ،‬ﺗﺒﻘﻰ ﺑﻘﻴﺔ‬
‫ﺍﻷﺟﺰﺍﺀ ﻗﺎﺩﺭﺓ ﻋﻠﻰ ﺗﻮﺟﻴﻪ ﺍﻟﻄﺮﻭﺩ ﻣﻦ ﺍﳌﺮﺳﻞ ﺇﱃ ﺍﳌﺴﺘﻘﺒﻞ ﻋﻦ ﻃﺮﻳﻖ ﻣﺴﺎﺭﺍﺕ ﺑﺪﻳﻠﺔ‪.‬‬
‫ﺃﺻﺒﺤﺖ ﺍﻟﱪﻭﺗﻮﻛﻮﻻﺕ ﺍﻟﱵ ﺍﺳﺘﺨﺪﻣﺖ ﰲ ﺷﺒﻜﺔ ‪ ARPA net‬ﺗﻌﺮﻑ ﺑﺎﺳﻢ ‪Transmission Control TCP‬‬
‫‪ .Protocol‬ﺿﻤﻦ ﺍﻟﱪﺗﻮﻛﻮﻝ ‪ TCP‬ﺗﻮﺟﻴﻪ ﺍﻟﺮﺳﺎﺋﻞ ﻣﻦ ﺍﳌﺮﺳﻞ ﺇﱃ ﺍﳌﺴﺘﻘﺒﻞ ﺑﺸﻜﻞ ﺻﺤﻴﺢ ﻭﺩﻭﻥ ﺃﺧﻄﺎﺀ‪.‬‬
‫ﻋﻠﻰ ﺍﻟﺘﻮﺍﺯﻱ ﻣﻊ ﺍﻟﺘﻄﻮﺭ ﺍﳌﺒﻜﺮ ﻟﺸﺒﻜﺔ ﺍﻹﻧﺘﺮﻧﺖ‪ ،‬ﻛﺎﻧﺖ ﺗﻘﻮﻡ ﻣﻨﻈﻤﺎﺕ ﻋﺎﳌﻴﺔ ﺑﺘﻄﻮﻳﺮ ﺷﺒﻜﺎﻬﺗﺎ ﳊﺎﺟﺎﺕ‬
‫ﺩﺍﺧﻠﻴﺔ ﻣﺮﺗﺒﻄﺔ ﺑﺎﳌﻨﻈﻤﺔ ﻧﻔﺴﻬﺎ ﺃﻭ ﲝﺎﺟﺎﺕ ﺭﺑﻂ ﺑﲔ ﻫﺬﻩ ﺍﳌﻨﻈﻤﺎﺕ‪ .‬ﺳﺎﻋﺪ ﺫﻟﻚ ﻋﻠﻰ ﻇﻬﻮﺭ ﺑﲎ ﻣﺮﻧﺔ‬
‫ﻭﺻﻠﺒﺔ ﺷﺒﻜﻴﺔ ﺷﺪﻳﺪﺓ ﺍﻟﺘﻨﻮﻉ‪ .‬ﻭﻛﺎﻥ ﺍﻟﺘﺤﺪﻱ ﰲ ﺟﻌﻞ ﻫﺬﻩ ﺍﻟﺸﺒﻜﺎﺕ ﻗﺎﺩﺭﺓ ﻋﻠﻰ ﺍﻻﺗﺼﺎﻝ ﻓﻴﻤﺎ ﺑﻴﻨﻬﺎ‪.‬‬
‫ﻗﺎﻣﺖ ‪ ARPA‬ﺑﺈﳒﺎﺯ ﺫﻟﻚ ﻣﻦ ﺧﻼﻝ ﺗﻄﻮﻳﺮﻫﺎ ﻟﻠﱪﻭﺗﻮﻛﻮﻝ ‪ (Internet Protocol) IP‬ﺍﻟﺬﻱ ﺳﺎﻋﺪ ﻋﻠﻰ ﺑﻨﺎﺀ‬
‫ﺷﺒﻜﺔ ﻣﻦ ﺍﻟﺸﺒﻜﺎﺕ‪ ،‬ﻭﺍﻟﱵ ﺗﺸﻜﻞ ﺣﺎﻟﻴﹰﺎ ﺍﻟﺒﻨﻴﺔ ﺍﻷﺳﺎﺳﻴﺔ ﻟﻺﻧﺘﺮﻧﺖ‪ ،‬ﺗُﻌﺮﻑ ﺍﺠﻤﻟﻤﻮﻋﺔ ﺍﳉﺎﻣﻌﺔ ﻟﻜﻼ‬
‫ﺍﻟﱪﻭﺗﻮﻛﻮﻟﲔ ﺍﻟﺴﺎﺑﻘﲔ ﺑﺎﺳﻢ ‪.TCP/IP‬‬
‫ﻛﺎﻥ ﺍﺳﺘﺨﺪﺍﻡ ﺍﻹﻧﺘﺮﻧﺖ ﳏﺼﻮﺭﹰﺍ ﰲ ﺍﻟﺒﺪﺍﻳﺔ ﺿﻤﻦ ﺍﳉﺎﻣﻌﺎﺕ ﻭﺍﳌﺆﺳﺴﺎﺕ ﺍﻟﺒﺤﺜﻴﺔ‪ .‬ﰒ ﺃﺻﺒﺢ ﺍﻟﻌﺴﻜﺮﻳﻮﻥ‬
‫ﺃﺣﺪ ﺃﻛﱪ ﺍﳌﺴﺘﺨﺪﻣﲔ ﳍﺎ‪ .‬ﻗﺎﻣﺖ ﺑﻌﺪﻫﺎ ﺍﳊﻜﻮﻣﺔ ﺑﺎﻟﺴﻤﺎﺡ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺍﻹﻧﺘﺮﻧﺖ ﻷﻏﺮﺍﺽ ﲡﺎﺭﻳﺔ‪ .‬ﰲ‬
‫ﺍﻟﺒﺪﺍﻳﺔ ﻛﺎﻥ ﻫﻨﺎﻙ ﺍﺳﺘﻴﺎﺀ ﻣﻦ ﻗﺒﻞ ﺍﻟﻌﺴﻜﺮﻳﲔ ﻭﺍﻟﺒﺎﺣﺜﲔ ﺑﺴﺒﺐ ﺍﻟﻘﻴﺎﻡ ﻬﺑﺬﻩ ﺍﳋﻄﻮﺓ‪ ،‬ﻷﻬﻧﻢ ﻛﺎﻧﻮﺍ‬
‫ﻳﻌﺘﻘﺪﻭﻥ ﺃﻥ ﺯﻣﻦ ﺍﻻﺳﺘﺠﺎﺑﺔ ﺳﻴﺘﺄﺛﺮ ﺑﺸﻜﻞ ﻛﺒﲑ ﺑﺴﺒﺐ ﺇﺷﺒﺎﻉ ﺍﻟﺸﺒﻜﺔ ﺑﻌﺪﺩ ﻛﺒﲑ ﻣﻦ ﺍﳌﺴﺘﺜﻤﺮﻳﻦ‪.‬‬
‫ﻟﻜﻦ ﺣﺪﺙ ﺍﻟﻌﻜﺲ ﻣﻦ ﺫﻟﻚ ﲤﺎﻣﹰﺎ‪ .‬ﻻﺣﻆ ﻣﺪﺭﺍﺀ ﺍﻷﻋﻤﺎﻝ ﺃﻧﻪ ﳝﻜﻦ ﻟﻌﻤﻠﻴﺎﻫﻢ ﺃﻥ ﺗﻜﻮﻥ ﻣﻀﺒﻮﻃﺔ‬
‫ﻭﳝﻜﻦ ﳍﻢ ﺗﻘﺪﱘ ﺧﺪﻣﺎﺕ ﺟﺪﻳﺪﺓ ﻭﺃﻛﺜﺮ ﺟﻮﺩﺓ ﰲ ﺣﺎﻝ ﻗﺎﻣﻮﺍ ﺑﺎﺳﺘﺜﻤﺎﺭ ﺍﻟﺸﺒﻜﺔ ﺑﺸﻜﻞ ﻓﻌﺎﻝ‪ ،‬ﳑﺎ ﺩﻓﻊ‬
‫ﺍﻟﻔﻌﺎﻟﻴﺎﺕ ﺍﻻﻗﺘﺼﺎﺩﻳﺔ ﺇﱃ ﺻﺮﻑ ﻣﺒﺎﻟﻎ ﻛﺒﲑﺓ ﻟﺘﻄﻮﻳﺮ ﺷﺒﻜﺔ ﺍﻹﻧﺘﺮﻧﺖ ﻭﲢﺪﻳﺜﻬﺎ‪ ،‬ﳑﺎ ﺃﻧﺘﺞ ﻣﻨﺎﻓﺴﺔ‬
‫ﺿﺎﺭﻳﺔ ﺑﲔ ﻣﺰﻭﺩﻱ ﺧﻄﻮﻁ ﺍﻻﺗﺼﺎﻝ ﻭﺍﻟﺒﲎ ﺍﻟﺼﻠﺒﺔ ﻭﺍﳌﺮﻧﺔ ﻟﻠﺘﺠﺎﻭﺏ ﻣﻊ ﻫﺬﺍ ﺍﻟﻄﻠﺐ ﺍﻟﻜﺒﲑ‪ .‬ﺃﺩﻯ‬
‫ﺫﻟﻚ ﺇﱃ ﺯﻳﺎﺩﺓ ﻋﺮﺽ ﺍﳊﺰﻣﺔ ‪ bandwidth‬ﺍﳌﺘﺎﺣﺔ ﻟﻼﺗﺼﺎﻝ ﻋﻠﻰ ﺍﻹﻧﺘﺮﻧﺖ ﺑﺸﻜﻞ ﺭﻫﻴﺐ ﻭﺗﻨﺎﻗﺼﺖ‬
‫ﺍﻷﺳﻌﺎﺭ ﺑﺸﻜﻞ ﺳﺮﻳﻊ ﺟﺪﹰﺍ‪.‬‬
‫ﺗﺎریﺦ ﺵﺒﻜﺔ اﻟﻮیﺐ اﻟﻌﺎﻟﻤﻴﺔ‬ ‫‪17-1‬‬
‫ﺗﺴﻤﺢ ﺷﺒﻜﺔ ﺍﻟﻮﻳﺐ ﺍﻟﻌﺎﳌﻴﺔ ﳌﺴﺘﺨﺪﻣﻲ ﺍﳊﻮﺍﺳﻴﺐ ﺑﺎﻟﺒﺤﺚ ﻭﺗﺼﻔﺢ ﻭﺛﺎﺋﻖ ﻣﺘﻌﺪﺩﺓ ﺍﻟﻮﺳﺎﺋﻂ )ﻣﺜﻞ‬
‫ﺍﻟﻮﺛﺎﺋﻖ ﺍﻟﻨﺼﻴﺔ ﻭﺗﻠﻚ ﺍﳌﺰﻭﺩﺓ ﺑﺎﻟﺮﺳﻮﻡ ﺍﻟﺒﻴﺎﻧﻴﺔ ﻭﺍﻟﺮﺳﻮﻡ ﺍﳌﺘﺤﺮﻛﺔ ﻭﻣﻠﻔﺎﺕ ﺍﻟﺼﻮﺕ ﻭﺍﻟﻔﻴﺪﻳﻮ( ﺫﺍﺕ‬
‫ﺍﻟﺼﻠﺔ‪ .‬ﻭﻋﻠﻰ ﺍﻟﺮﻏﻢ ﻣﻦ ﺃﻥ ﺗﻄﻮﻳﺮ ﺷﺒﻜﺔ ﺍﻹﻧﺘﺮﻧﺖ ﻳﻌﻮﺩ ﺇﱃ ﺣﻮﺍﱄ ﺛﻼﺛﺔ ﻋﻘﻮﺩ ﻣﺎﺿﻴﺔ ﺃﻻ ﺃﻥ ﻇﻬﻮﺭ‬
‫ﺚ ﻧﺴﺒﻴﹰﺎ‪ .‬ﻗﺎﻡ ‪ Tim Berners- Lee‬ﰲ ‪) CERN‬ﺍﳌﻨﻈﻤﺔ ﺍﻷﻭﺭﻭﺑﻴﺔ ﻟﻠﺒﺤﻮﺙ‬
‫ﺷﺒﻜﺔ ﺍﻟﻮﻳﺐ ﺍﻟﻌﺎﳌﻴﺔ ﺣﺪﻳ ﹲ‬
‫ﺍﻟﻨﻮﻭﻳﺔ( ﺑﺘﻄﻮﻳﺮ ﺷﺒﻜﺔ ﺍﻟﻮﻳﺐ ﺍﻟﻌﺎﳌﻴﺔ ﻭﺍﻟﱪﻭﺗﻮﻛﻼﺕ ﺍﻟﱵ ﺗﺸﻜﻞ ﻋﻤﻮﺩﻫﺎ ﺍﻟﻔﻘﺮﻱ ﻋﺎﻡ ‪.1990‬‬
‫ﻼ ﺗﺴﺠﻴﻞ ﺍﻹﻧﺘﺮﻧﺖ ﻭﺷﺒﻜﺔ ﺍﻟﻮﻳﺐ ﺍﻟﻌﺎﳌﻴﺔ ﻣﻦ ﺩﻭﻥ ﺷﻚ ﻋﻠﻰ ﺃﻬﻧﻤﺎ ﻣﻦ‬ ‫ﻻﺑﺪ ﻣﻦ ﺃﻧﻪ ﺳﻴﺠﺮﻱ ﻣﺴﺘﻘﺒ ﹰ‬
‫ﺃﻫﻢ ﺍﻹﳒﺎﺯﺍﺕ ﺍﻟﱵ ﻗﺎﻣﺖ ﻬﺑﺎ ﺍﻟﺒﺸﺮﻳﺔ‪ .‬ﰲ ﺍﳌﺎﺿﻲ‪ ،‬ﻛﺎﻥ ﳚﺮﻱ ﺗﻨﻔﻴﺬ ﺍﻟﺘﻄﺒﻴﻘﺎﺕ ﻋﻠﻰ ﺍﳊﻮﺍﺳﻴﺐ‬
‫ﺍﳌﻨﻔﺮﺩﺓ ‪ Stand- alone Computers‬ﻏﲑ ﺍﳌﺘﺼﻠﺔ ﺑﻐﲑﻫﺎ ﻣﻦ ﺍﳊﻮﺍﺳﻴﺐ‪ .‬ﺃﻣﺎ ﺍﻟﺘﻄﺒﻴﻘﺎﺕ ﺍﳊﺎﻟﻴﺔ ﻓﻴﻤﻜﻦ‬
‫ﺗﻄﻮﻳﺮﻫﺎ ﻟﺘﻘﻮﻡ ﺑﺎﻻﺗﺼﺎﻝ ﻭﺍﻟﺘﻌﺎﻣﻞ ﻣﻊ ﻣﺌﺎﺕ ﺍﳌﻼﻳﲔ ﻣﻦ ﺍﳊﻮﺍﺳﻴﺐ ﺍﳌﻨﺘﺸﺮﺓ ﰲ ﺍﻟﻌﺎﱂ ﻛﻠﻪ‪ .‬ﺗﻘﻮﻡ‬
‫ﺷﺒﻜﺔ ﺍﻹﻧﺘﺮﻧﺖ ﺑﺎﳌﺰﺝ ﺑﲔ ﺗﻘﻨﻴﺎﺕ ﺍﳊﺎﺳﺐ ﻭﺍﻻﺗﺼﺎﻝ ﳑﺎ ﻳﺴﺎﻋﺪ ﻋﻠﻰ ﺗﺴﻬﻴﻞ ﻋﻤﻠﻨﺎ‪ .‬ﻛﻤﺎ ﺃﻬﻧﺎ ﲡﻌﻞ‬
‫‪٤٣‬‬ ‫‪ .1‬ﻣﻘﺪﻣﺔ ﺣﻮل اﻟﺤﻮاﺳﻴﺐ واﻟﺒﺮﻣﺠﺔ ﺑﻠﻐﺔ ‪C++‬‬

‫ﺍﳌﻌﻠﻮﻣﺎﺕ ﻣﺘﺎﺣﺔ ﺁﻧﻴﹰﺎ ﻭﺑﺸﻜﻞ ﻣﻼﺋﻢ ﻋﻠﻰ ﻣﺴﺘﻮﻯ ﺍﻟﻌﺎﱂ ﺃﲨﻊ‪ .‬ﺗﺴﺎﻫﻢ ﺃﻳﻀﹰﺎ ﰲ ﺗﻮﻓﲑ ﺍﻟﻔﺮﺻﺔ ﻟﻸﻓﺮﺍﺩ‬
‫ﻭﺍﻷﻋﻤﺎﻝ ﺍﻟﺼﻐﲑﺓ ﺑﺎﻻﻧﺘﺸﺎﺭ ﻋﺎﳌﻴﹰﺎ‪ .‬ﻓﻬﺬﻩ ﺍﻟﺸﺒﻜﺔ ﺗﺴﺎﻫﻢ ﺣﺘﻤﹰﺎ ﰲ ﺗﻐﻴﲑ ﻃﺮﻳﻘﺔ ﺗﻨﻔﻴﺬ ﺍﻷﻋﻤﺎﻝ‬
‫ﻭﺇﳒﺎﺯﻫﺎ‪ .‬ﳝﻜﻦ ﻟﻠﻨﺎﺱ ﺍﻟﺒﺤﺚ ﻋﻦ ﺃﻓﻀﻞ ﺍﻷﺳﻌﺎﺭ ﻷﻱ ﻣﻨﺘﺞ ﺃﻭ ﻷﻱ ﺧﺪﻣﺔ‪ .‬ﻛﻤﺎ ﳝﻜﻦ ﺃﻳﻀﹰﺎ‬
‫ﻟﻠﺒﺎﺣﺜﲔ ﺍﳊﺼﻮﻝ ﻋﻠﻰ ﺁﺧﺮ ﻣﺎ ﰎ ﺍﻟﺘﻮﺻﻞ ﺇﻟﻴﻪ ﻋﺎﳌﻴﹰﺎ‪ .‬ﺗﺘﻀﻤﻦ ﻫﺬﻩ ﺍﻟﻄﺒﻌﺔ ﻣﻦ ﻫﺬﺍ ﺍﻟﻜﺘﺎﺏ ﺍﻟﻔﺼﻞ‬
‫ﺍﻟﺴﺎﺩﺱ ﻋﺸﺮ‪ :‬ﺑﺮﳎﺔ ﺍﻟﻮﻳﺐ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺍﻟـ ‪ (Web Programming With CGI) CGI‬ﺍﻟﺬﻱ ﺳﻴﺴﺎﻋﺪﻙ‬
‫ﺣﺘﻤﹰﺎ ﻋﻠﻰ ﺗﻄﻮﻳﺮ ﺗﻄﺒﻴﻘﺎﺕ ﳝﻜﻦ ﺗﻨﻔﻴﺬﻫﺎ ﻋﻠﻰ ﺷﺒﻜﺔ ﺍﻟﻮﻳﺐ ﺍﻟﻌﺎﳌﻴﺔ‪.‬‬

‫ﻣﻨﺘﺪى ﺵﺒﻜﺔ اﻟﻮیﺐ اﻟﻌﺎﻟﻤﻴﺔ‬ ‫‪18-1‬‬


‫ﺃﺳﺲ ‪ Tim Berness- Lee‬ﰲ ﻋﺎﻡ ‪ 1994‬ﻣﺆﺳﺴﺔ ﺃﲰﺎﻫﺎ ﻣﻨﺘﺪﻯ ﺷﺒﻜﺔ ﺍﻟﻮﻳﺐ ﺍﻟﻌﺎﳌﻴﺔ ﻭﺣﺼﺮﺕ ﻣﻬﻤﺘﻪ‬
‫ﰲ ﺗﻄﻮﻳﺮ ﺗﻘﻨﻴﺎﺕ ﺍﻟﺘﺸﻐﻴﻞ ﺍﻟﻼﺯﻣﺔ ﳍﺬﻩ ﺍﻟﺸﺒﻜﺔ‪ .‬ﻭﻳﺘﻤﺜﻞ ﺃﺣﺪ ﺃﻫﻢ ﺃﻫﺪﺍﻑ ﻫﺬﺍ ﺍﳌﻨﺘﺪﻯ ﰲ ﺟﻌﻞ‬
‫ﺍﻟﻮﻳﺐ ﻣﺘﺎﺣﹰﺎ ﻋﺎﳌﻴﹰﺎ ﺑﻐﺾ ﺍﻟﻨﻈﺮ ﻋﻦ ﺍﻟﻠﻐﺔ ﻭﺍﻟﺜﻘﺎﻓﺔ‪.‬‬
‫ﺗﻌﺘﱪ ‪ W3C‬ﻫﻴﺌﺔ ﻟﻮﺿﻊ ﺍﳌﻌﺎﻳﲑ ﻭﻫﻲ ﺗﻀﻢ ﺛﻼﺛﺔ ﻓﻘﺮﺍﺕ ﻭﻫﻲ‪ HIT :‬ﰲ ﺍﻟﻮﻻﻳﺎﺕ ﺍﳌﺘﺤﺪﺓ ﺍﻷﻣﲑﻳﻜﻴﺔ‬
‫ﻭ‪ INRIA‬ﰲ ﻓﺮﻧﺴﺎ ﻭﺟﺎﻣﻌﺔ ‪ Keis‬ﰲ ﺍﻟﻴﺎﺑﺎﻥ ﺇﺿﺎﻓﺔ ﺇﱃ ﺣﻮﺍﱄ ‪ 400‬ﻋﻀﻮ ﲟﺎ ﻓﻴﻬﻢ ﻣﺆﺳﺴﺔ ‪ .Deitel‬ﻳﻮﻓﺮ‬
‫ﺍﻷﻋﻀﺎﺀ ﺍﻟﺘﻤﻮﻳﻞ ﺍﻟﺮﺋﻴﺴﻲ ﻟﻠﻤﻨﺘﺪﻯ ﻭﻳﺴﺎﻋﺪﻭﻥ ﰲ ﲢﺪﻳﺪ ﺍﻻﲡﺎﻩ ﺍﻻﺳﺘﺮﺍﺗﻴﺠﻲ ﻟﻪ‪ .‬ﳌﺰﻳﺪ ﻣﻦ ﺍﳌﻌﻠﻮﻣﺎﺕ‬
‫ﺣﻮﻝ ﺍﳌﻨﺘﺪﻯ ﳝﻜﻨﻚ ﺯﻳﺎﺭﺓ ﺍﳌﻮﻗﻊ‪.www.w3.org :‬‬
‫ﺗﺴﻤﻰ ﺗﻘﻨﻴﺎﺕ ﺍﻟﻮﻳﺐ ﺍﻟﱵ ﲣﻀﻊ ﺇﱃ ﺍﻟﺘﻘﻴﻴﺲ ﻣﻦ ﻗﺒﻞ ‪ W3C‬ﺑﺎﻟﺘﻮﺻﻴﺎﺕ ‪.Reconmendations‬‬
‫ﺗﺘﻀﻤﻦ ﺍﻟﺘﻮﺻﻴﺎﺕ ﺍﳊﺎﻟﻴﺔ ﳍﺬﺍ ﺍﳌﻨﺘﺪﻯ ﻟﻐﺔ ‪(Extensible Hypertext Markup Language) XHTML‬‬
‫ﻭ‪ (Cascading Style Sheets) CSS‬ﻭﻟﻐﺔ ‪ .(Extensible Markup Language) XML‬ﻟﻴﺴﺖ ﺍﻟﺘﻮﺻﻴﺎﺕ‬
‫ﻣﻨﺘﺠﺎﺕ ﺑﺮﳎﻴﺔ ﻓﻌﻠﻴﺔ ﻭﻟﻜﻨﻬﺎ ﻭﺛﺎﺋﻖ ﲢﺪﺩ ﺩﻭﺭ ﻭﻗﻮﺍﻋﺪ ﺗﻘﻨﻴﺔ ﻣﺎ‪.‬‬
‫ﻭﻗﺒﻞ ﺃﻥ ﺗﺼﺒﺢ ﺍﻟﻮﺛﻴﻘﺔ ﺗﻮﺻﻴﺔ ﻓﺈﻬﻧﺎ ﲤﺮ ﺑﺜﻼﺛﺔ ﻣﺮﺍﺣﻞ ﺭﺋﻴﺴﻴﺔ ﻫﻲ‪ :‬ﻭﺛﻴﻘﺔ ﻋﻤﻞ ﻣﺆﻗﺖ ‪Working Draft‬‬
‫ﻭﻭﺛﻴﻘﺔ ﺍﻟﺘﺮﺷﻴﺢ ﻟﺘﻮﺻﻴﺔ ‪ ،Candidate Recommendation‬ﻭﻫﻲ ﻭﺛﻴﻘﺔ ﻣﺴﺘﻘﺮﺓ ﻭﳝﻜﻦ ﺑﺪﺀ ﺍﻟﻌﻤﻞ‬
‫ﲟﻀﻤﻮﻬﻧﺎ‪ .‬ﰒ ﻟﺪﻳﻨﺎ ﺃﺧﲑﹰﺍ ﺍﻟﻮﺛﻴﻘﺔ ﻣﻘﺘﺮﺡ ﺍﻟﺘﻮﺻﻴﺔ ‪ Proposed Recommendation‬ﻭﻫﻲ ﻣﺮﺣﻠﺔ ﺍﻟﻨﻀﻮﺝ‬
‫ﺍﻟﱵ ﳝﻜﻦ ﺃﻥ ﺗﺼﻞ ﺇﻟﻴﻬﺎ ﺍﻟﻮﺛﻴﻘﺔ )ﺃﻱ ﺃﻧﻪ ﺟﺮﻯ ﺑﻨﺎﺀ ﻭﺗﻄﻮﻳﺮ ﻣﻀﻮﻬﻧﺎ ﻋﻠﻰ ﺷﻜﻞ ﻣﻨﺘﺞ ﻭﺟﺮﻯ ﺍﻟﺘﺤﻘﻖ‬
‫ﻣﻨﻪ ﺧﻼﻝ ﻓﺘﺮﺓ ﻣﻦ ﺍﻟﺰﻣﻦ( ﻭﺗﻌﺪ ﺟﺎﻫﺰﺓ ﻟﺘﺼﺒﺢ ﻋﻠﻰ ﺷﻜﻞ ﺗﻮﺻﻴﺔ‪.‬‬
‫ﳌﺰﻳﺪ ﻣﻦ ﺍﳌﻌﻠﻮﻣﺎﺕ ﺣﻮﻝ ﺗﻮﺻﻴﺎﺕ ‪ W3C‬ﻭﻣﺮﺍﺣﻞ ﺗﻄﻮﺭﻫﺎ‪ ،‬ﳝﻜﻨﻚ ﺍﻟﻌﻮﺩﺓ ﺇﱃ ﺍﳌﻮﻗﻊ ﺍﻟﺘﺎﱄ‪:‬‬
‫‪www.w3.org/consortium/Process/Process-19991111/process.html#RecsCR‬‬

‫ﻣﻼﺣﻈﺎت ﻋﺎﻣﺔ ﺣﻮل ‪ C++‬وﺣﻮل هﺬا اﻟﻜﺘﺎب‬ ‫‪19-1‬‬


‫ﺗﻌﺪ ﻟﻐﺔ ‪ C++‬ﻣﻦ ﺍﻟﻠﻐﺎﺕ ﺍﻟﺼﻌﺒﺔ‪ .‬ﻭﻗﺪ ﻳﺼﻴﺐ ﺍﳌﱪﳎﻮﻥ ﺍﳌﺨﻀﺮﻣﻮﻥ ﺑﻠﻐﺔ ‪ C++‬ﺃﺣﻴﺎﻧﹰﺎ ﺷﻲﺀ ﻣﻦ‬
‫ﺍﻟﻐﺮﻭﺭ ﺑﺴﺒﺐ ﻗﺪﺭﻬﺗﻢ ﻋﻠﻰ ﺧﻠﻖ ﺍﺳﺘﻌﻤﺎﻻﺕ ﻋﺠﻴﺒﺔ ﻟﻠﻐﺔ‪ ،‬ﻣﻠﺘﻔﺔ ﻭﻣﺘﺸﺎﺑﻜﺔ‪ .‬ﺗﻌﺘﱪ ﺗﻠﻚ ﺍﳌﻤﺎﺭﺳﺔ ﳑﺎﺭﺳﺔ‬
‫اﻟﻔﺼﻞ اﻷول‬ ‫‪٤٤‬‬

‫ﺑﺮﳎﻴﺔ ﺿﻴﻘﺔ ﺍﻷﻓﻖ ﻷﻬﻧﺎ ﲡﻌﻞ ﺍﻟﱪﺍﻣﺞ ﺻﻌﺒﺔ ﺍﻟﻘﺮﺍﺀﺓ ﻏﲑ ﻣﻀﻤﻮﻧﺔ ﺍﻟﺴﻠﻮﻙ ﻭﺻﻌﺒﺔ ﺍﻟﻔﺤﺺ ﻭﺍﻟﺘﺪﻗﻴﻖ‬
‫ﺑﺎﻹﺿﺎﻓﺔ ﺇﱃ ﺍﻟﺼﻌﻮﺑﺔ ﺍﻟﻜﺒﲑﺓ ﳌﻼﺀﻣﺘﻬﺎ ﻣﻊ ﺗﻐﲑ ﺍﳌﺘﻄﻠﺒﺎﺕ‪ .‬ﰲ ﻛﺘﺎﺑﻨﺎ ﻫﺬﺍ ﺍﳌﻌﺪ ﻟﻠﻤﱪﳎﲔ ﺍﳌﺒﺘﺪﺋﲔ‪،‬‬
‫ﻧﺆﻛﺪ ﻋﻠﻰ ﺿﺮﻭﺭﺓ ﻭﺿﻮﺡ ﺍﻟﱪﺍﻣﺞ ﻭﺍﻟﱵ ﺗُﻌﺪ ﺃﻭﻝ ﺍﻟﻌﺎﺩﺍﺕ ﺍﻟﱪﳎﻴﺔ ﺍﳉﻴﺪﺓ ﺍﻟﱵ ﻧﻨﺼﺢ ﻬﺑﺎ‪.‬‬
‫ﻋﺎدات ﺑﺮﻣﺠﻴﺔ ﺝﻴﺪة‬ ‫‪1-1‬‬

‫أآﺘﺐ ﺑﺮاﻣﺠﻚ ﺑﻠﻐﺔ ‪ C++‬ﺑﺄﺳﻠﻮب ﺑﺴﻴﻂ وﻣﺒﺎﺵﺮ‪ .‬ﻧﺮﻣﺰ أﺣﻴﺎﻧًﺎ ﻟﻠﻨﺼﻴﺤﺔ‬


‫اﻟﺴﺎﺑﻘﺔ ﺑﺎﻟﺮﻣﺰ ‪ KIS‬اﻟﺘﻲ ﺝﺎءت ﻣﻦ ﻣﻘﻮﻟﺔ‪ :‬أﺑﻘﻪ ﺑﺴﻴﻄًﺎ "‪ ”keep it simple‬وﻻ‬
‫ﺕﺤﺎول اﻟﺸﻄﻂ ﻓﻲ اﻟﻠﻐﺔ ﺑﻤﺤﺎوﻟﺔ اﺳﺘﺨﺪام اﺳﺘﻌﻤﺎﻻت ﻏﺮیﺒﺔ‪.‬‬

‫ﻻﺑﺪ ﺃﻧﻚ ﲰﻌﺖ ﺃﻥ ﺍﻟﻠﻐﺘﲔ ‪ C‬ﻭ ‪ C++‬ﳘﺎ ﻟﻐﺘﺎﻥ ﻗﺎﺑﻠﺘﺎﻥ ﻟﻠﻨﻘﻞ ﻭﺃﻥ ﺍﻟﱪﺍﻣﺞ ﺍﳌﻜﺘﻮﺑﺔ ﻬﺑﻤﺎ ﳝﻜﻦ ﺃﻥ‬
‫ﺗﻨﻔﺬ ﻋﻠﻰ ﺃﻧﻮﺍﻉ ﻣﺘﻌﺪﺩﺓ ﻣﻦ ﺍﳊﺎﺳﺒﺎﺕ‪ .‬ﻟﻜﻦ ﻣﻔﻬﻮﻡ ﺍﶈﻤﻮﻟﻴﺔ ﻫﻮ ﻣﻔﻬﻮﻡ ﳏﲑ‪ .‬ﲢﺘﻮﻱ ﺍﻟﻮﺛﺎﺋﻖ ﺍﳌﻌﻴﺎﺭﻳﺔ‬
‫ﻟﻠﻐﺔ ‪ (AM90) ANSI C‬ﻋﻠﻰ ﻗﺎﺋﻤﺔ ﻣﻄﻮﻟﺔ ﺣﻮﻝ ﻣﻮﺍﺿﻴﻊ ﺍﶈﻤﻮﻟﻴﺔ‪ ،‬ﻭﻟﻘﺪ ﺟﺮﻯ ﺗﺄﻟﻴﻒ ﻛﺘﺐ ﻛﺎﻣﻠﺔ‬
‫ﺗﺘﺤﺪﺙ ﻋﻦ ﻣﻮﺿﻮﻉ ﺍﶈﻤﻮﻟﻴﺔ‪.‬‬
‫ﺗﻠﻤﻴﺢ ﻟﺘﺤﺴﻴﻦ اﻟﻤﺤﻤﻮﻟﻴﺔ‬ ‫‪3-1‬‬

‫ﺑﺎﻟﺮﻏﻢ ﻣﻦ أﻧﻪ ﻣﻦ اﻟﻤﻤﻜﻦ آﺘﺎﺑﺔ ﺑﺮاﻣﺞ ﻗﺎﺑﻠﺔ ﻟﻠﻨﻘﻞ إﻻ أن هﻨﺎك اﻟﻌﺪیﺪ ﻣﻦ‬
‫اﻟﻤﺸﺎآﻞ ﺑﻴﻦ اﻟﻨﺴﺦ اﻟﻤﺨﺘﻠﻔﺔ ﻟﻤﺘﺮﺝﻤﺎت ‪ C‬و‪ C++‬وﺑﻴﻦ اﻷﻧﻮاع اﻟﻤﺨﺘﻠﻔﺔ‬
‫ﻟﻠﺤﺎﺳﺒﺎت اﻟﺘﻲ ﺕﺠﻌﻞ ﻣﻦ ﻣﺴﺄﻟﺔ اﻟﻤﺤﻤﻮﻟﻴﺔ ﻣﺴﺄﻟﺔ ﺹﻌﺒﺔ اﻟﺤﻞ‪ .‬ﻓﺒﻜﻞ‬
‫ﺑﺴﺎﻃﺔ اﺳﺘﺨﺪام ﻟﻐﺘﻲ ‪ C‬و‪ C++‬ﻟﻜﺘﺎﺑﺔ اﻟﺒﺮاﻣﺞ ﻻ یﻀﻤﻦ ﻗﺎﺑﻠﻴﺔ ﻧﻘﻠﻬﺎ‪ .‬ﻓﻌﻠﻰ‬
‫ﻋﺎﺕﻖ اﻟﻤﺒﺮﻣﺞ ﺕﻘﻊ ﻣﺴﺆوﻟﻴﺔ اﻟﺘﻌﺎﻣﻞ ﻣﻊ اﻻﺥﺘﻼﻓﺎت ﺑﻴﻦ اﻟﻤﺘﺮﺝﻤﺎت وأﻧﻮاع‬
‫اﻟﺤﻮاﺳﺐ اﻟﻤﺨﺘﻠﻔﺔ‪.‬‬

‫ﻟﻘﺪ ﻗﻤﻨﺎ ﺑﻔﺤﺺ ﻣﺘﺄﻥ ﻟﻠﻮﺛﺎﺋﻖ ﺍﳌﻌﻴﺎﺭﻳﺔ ﺍﳋﺎﺻﺔ ﺑﺘﻄﻮﻳﺮ ﻟﻐﺔ ‪ ANSI C++‬ﰒ ﻗﻤﻨﺎ ﺑﻌﺪﻫﺎ ﺑﺘﺪﻗﻴﻖ ﻋﺮﺿﻨﺎ ﳍﺬﻩ‬
‫ﺍﻟﻠﻐﺎﺕ ﻣﻘﺎﺭﻧﺔ ﲟﺎ ﺟﺎﺀ ﰲ ﺍﻟﻮﺛﺎﺋﻖ ﺍﳌﻌﻴﺎﺭﻳﺔ ﻣﻦ ﺃﺟﻞ ﲢﻘﻴﻖ ﻣﺰﻳﺪ ﻣﻦ ﺍﻟﺸﻤﻮﻟﻴﺔ ﻭﺍﻟﺪﻗﺔ‪ .‬ﻋﻠﻰ ﻛﻞ ﺣﺎﻝ‪،‬‬
‫ﺗﻌﺘﱪ ﻟﻐﺔ ‪ C++‬ﻟﻐﺔ ﻏﻨﻴﺔ ﻭﻟﻘﺪ ﺑﻘﻴﺖ ﺑﻌﺾ ﺍﳉﻮﺍﻧﺐ ﺍﻟﺬﻛﻴﺔ ﻭﺑﻌﺾ ﺍﳌﻮﺍﺿﻴﻊ ﺍﳌﺘﻘﺪﻣﺔ ﺍﻟﱵ ﱂ ﻧﻘﻢ ﺑﺘﻐﻄﻴﺘﻬﺎ‪.‬‬
‫ﻓﺈﺫﺍ ﺍﺣﺘﺠﺖ ﺇﱃ ﻣﺰﻳﺪ ﻣﻦ ﺍﻟﺘﻔﺎﺻﻴﻞ ﺍﻟﺘﻘﻨﻴﺔ ﺣﻮﻝ ‪ C++‬ﻓﺈﻧﻨﺎ ﻧﻨﺼﺤﻚ ﺑﺎﻟﺮﺟﻮﻉ ﺇﱃ ﺍﻟﻮﺛﺎﺋﻖ ﺍﳌﻌﻴﺎﺭﻳﺔ ﻟﻠﻐﺔ‬
‫‪ .ANSI C++‬ﳝﻜﻨﻚ ﻃﻠﺐ ﻫﺬﻩ ﺍﻟﻮﺛﺎﺋﻖ ﻣﻦ ﻣﻮﻗﻊ ﺍﻟﻮﻳﺐ ﺍﳋﺎﺹ ﺑـ ‪ ANSI‬ﺍﻟﺘﺎﱄ‪:‬‬
‫‪Webstore.ansi.org/ansidoctore/default.asp‬‬

‫ﻭﺭﻗﻤﻬﺎ‬ ‫"‪"Information Technology- Programming Languages- C++‬‬ ‫ﻭﻋﻨﻮﺍﻥ ﺍﻟﻮﺛﻴﻘﺔ ﺍﳌﻄﻠﻮﺑﺔ ﻫﻮ‪:‬‬
‫ﻫﻮ‪.INCITS/ISO/IEC 14882-1998 :‬‬
‫ﻳﻮﺟﺪ ﰲ ﺍﻟﻘﺮﺹ ﺍﳌﻀﻐﻮﻁ ﺍﳌﻠﺤﻖ ﻬﺑﺬﺍ ﺍﻟﻜﺘﺎﺏ ﺗﻌﺪﺍﺩﹰﺍ ﻟﻠﻜﺜﲑ ﻣﻦ ﺍﻟﻜﺘﺐ ﻭﺍﳌﻘﺎﻻﺕ ﺣﻮﻝ ﻟﻐﺔ ‪ C++‬ﻭﺍﻟﱪﳎﺔ‬
‫ﻏﺮﺿﻴﺔ ﺍﻟﺘﻮﺟﻪ‪ .‬ﻛﻤﺎ ﺫﻛﺮ ﻓﻴﻪ ﺍﻟﻌﺪﻳﺪ ﻣﻦ ﻣﺼﺎﺩﺭ ﻟﻐﺔ ‪ C++‬ﺍﳌﺘﻮﻓﺮﺓ ﻋﻠﻰ ﺷﺒﻜﺔ ﺍﻹﻧﺘﺮﻧﺖ ﻭﺍﻟﻮﻳﺐ‪.‬‬
‫‪٤٥‬‬ ‫‪ .1‬ﻣﻘﺪﻣﺔ ﺣﻮل اﻟﺤﻮاﺳﻴﺐ واﻟﺒﺮﻣﺠﺔ ﺑﻠﻐﺔ ‪C++‬‬

‫ﻫﻨﺎﻙ ﺍﻟﻌﺪﻳﺪ ﻣﻦ ﺇﻣﻜﺎﻧﻴﺎﺕ ﺍﻟﻨﺴﺦ ﺍﳊﺎﻟﻴﺔ ﻟـ ‪ C++‬ﺍﻟﱵ ﻫﻲ ﻏﲑ ﻣﺘﻮﺍﻓﻘﺔ ﻣﻦ ﺍﻟﻨﺴﺦ ﺍﻟﻘﺪﳝﺔ ﳍﺬﻩ ﺍﻟﻠﻐﺔ‬
‫ﻟﺬﻟﻚ ﳝﻜﻦ ﺃﻥ ﳒﺪ ﺃﻥ ﺑﻌﺾ ﺍﻟﱪﺍﻣﺞ ﺍﳌﻌﺮﻭﺿﺔ ﰲ ﻫﺬﺍ ﺍﻟﻜﺘﺎﺏ ﻻ ﳝﻜﻦ ﺃﻥ ﺗﻌﻤﻞ ﻣﻊ ﺍﻟﻨﺴﺦ ﺍﻟﻘﺪﳝﺔ‬
‫ﳌﺘﺮﲨﺎﺕ ‪.C++‬‬
‫ﻋﺎدات ﺑﺮﻣﺠﻴﺔ ﺝﻴﺪة‬ ‫‪2-1‬‬

‫اﻗﺮأ أدﻟﺔ اﻻﺳﺘﺜﻤﺎر اﻟﺨﺎﺹﺔ ﺑﺎﻟﻨﺴﺨﺔ اﻟﺘﻲ ﺕﺴﺘﺨﺪﻣﻬﺎ ﻣﻦ ‪ .C++‬وﻋﺪ إﻟﻴﻬﺎ‬


‫ﺑﺸﻜﻞ ﻣﺴﺘﻤﺮ ﻣﻦ أﺝﻞ اﻟﺘﺄآﺪ ﻣﻦ أﻧﻚ ﻣﺘﻄﻠﻊ ﻋﻠﻰ اﻹﻣﻜﺎﻧﻴﺎت اﻟﻜﺒﻴﺮة ﻟـ‬
‫‪ C++‬وﻣﻦ أﻧﻚ ﺕﻘﻮم ﺑﺎﺳﺘﺨﺪاﻣﻬﺎ ﺑﺎﻟﺸﻜﻞ اﻟﺼﺤﻴﺢ‪.‬‬

‫ﻋﺎدات ﺑﺮﻣﺠﻴﺔ ﺝﻴﺪة‬ ‫‪3-1‬‬

‫إن ﺣﺎﺳﺒﻚ وﻣﺘﺮﺝﻤﻚ هﻤﺎ ﻣﻌﻠﻤﺎن ﺝﻴﺪان‪ .‬ﻓﺈذا ﺣﺪث أﻧﻚ ﻟﻢ ﺕﺘﻮﺹﻞ إﻟﻰ‬
‫ﻓﻬﻢ آﻴﻒ ﺕﻌﻤﻞ إﺣﺪى إﻣﻜﺎﻧﻴﺎت اﻟﻠﻐﺔ ﺑﻌﺪ اﻟﻘﺮاءة ﻋﻨﻬﺎ ﻓﻲ اﻟﻤﺮاﺝﻊ‬
‫اﻟﻤﺮﻓﻘﺔ ﻓﻤﺎ ﻋﻠﻴﻚ إﻻ أن ﺕﺠﺮﺑﻬﺎ ﺑﺎﺳﺘﺨﺪام أﻣﺜﻠﺔ ﺑﺮﻣﺠﻴﺔ ﺹﻐﻴﺮة وﺕﺮى‬
‫ﻣﺎذا یﺤﺪث‪ .‬اﺥﺘﺮ ﺑﺎﻟﻨﺴﺒﺔ ﻟﻤﺘﺮﺝﻤﻚ اﻟﺨﻴﺎر اﻟﺬي یﻌﻄﻲ أآﺒﺮ ﻗﺪر ﻣﻤﻜﻦ ﻣﻦ‬
‫رﺳﺎﺋﻞ اﻟﺘﺤﺬیﺮ ‪ .maximum warnings‬وادرس آﻞ رﺳﺎﻟﺔ ﺕﻈﻬﺮ ﻟﻚ أﺛﻨﺎء‬
‫اﻟﺘﺮﺝﻤﺔ ﻟﺒﺮاﻣﺠﻚ ﺛﻢ ﻗﻢ ﺑﺘﺼﺤﻴﺤﻬﺎ ﻣﻦ أﺝﻞ ﺣﺬف هﺬﻩ اﻟﺮﺳﺎﺋﻞ‪.‬‬

‫‪ 20-1‬ﻣﻘﺪﻣﺔ ﻓﻲ اﻟﺒﺮﻣﺠﺔ ﺑﻠﻐﺔ ‪C++‬‬


‫ﺗﺴﻬﻞ ﻟﻐﺔ ‪ C++‬ﺍﻷﺳﻠﻮﺏ ﺍﳌﻬﻴﻜﻞ ﻭﺍﳌﻨﻬﺠﻲ ﻟﻌﻤﻠﻴﺔ ﺗﺼﻤﻴﻢ ﺍﻟﱪﺍﻣﺞ‪ .‬ﺳﻮﻑ ﻧﻘﻮﻡ ﺍﻵﻥ ﺑﺘﻘﺪﱘ ﻟﻐﺔ ‪C++‬‬
‫ﻭﺳﻮﻑ ﻧﻌﺮﺽ ﺑﻌﺾ ﺍﻷﻣﺜﻠﺔ ﺍﻟﱵ ﺗﻮﺿﺢ ﻋﺪﺓ ﺇﻣﻜﺎﻧﻴﺎﺕ ﻫﺎﻣﺔ ﳍﺬﻩ ﺍﻟﻠﻐﺔ‪ .‬ﺳﻮﻑ ﻧﻘﻮﻡ ﺑﺘﺤﻠﻴﻞ ﻛﻞ ﻣﺜﺎﻝ‬
‫ﺗﻌﻠﻴﻤﺔ ﻓﺘﻌﻠﻴﻤﺔ‪ .‬ﻭﺳﻮﻑ ﻧﻌﺮﺽ ﰲ ﺍﻟﻔﺼﻞ ﺍﻟﺜﺎﱐ ﻣﻌﺎﳉﺔ ﻣﻔﺼﻠﺔ ﳌﻔﻬﻮﻡ ﺍﻟﱪﳎﺔ ﺍﳌﻬﻴﻜﻠﺔ ﺑﻠﻐﺔ ‪ .C++‬ﺑﻌﺪﻫﺎ‬
‫ﺳﻨﻘﺪﻡ ﺍﻷﺳﻠﻮﺏ ﺍﳍﻴﻜﻠﻲ ﰲ ﺍﻟﺘﺼﻤﻴﻢ ﺣﱴ ﺍﻟﻔﺼﻞ ﺍﳋﺎﻣﺲ‪ .‬ﺳﻨﻘﻮﻡ ﺍﺑﺘﺪﺍ ًﺀ ﻣﻦ ﺍﻟﻔﺼﻞ ﺍﻟﺴﺎﺩﺱ ﺑﺪﺭﺍﺳﺔ‬
‫ﺃﺳﻠﻮﺏ ﺍﻟﱪﳎﺔ ﻏﺮﺿﻴﺔ ﺍﻟﺘﻮﺟﻪ‪ .‬ﻭﺑﺴﺒﺐ ﻛﻮﻥ ﻫﺬﻩ ﺍﻟﺪﺭﺍﺳﺔ ﻫﻲ ﺍﶈﻮﺭ ﺍﻷﺳﺎﺳﻲ ﳍﺬﺍ ﺍﻟﻜﺘﺎﺏ‪ ،‬ﻧﻌﻮﺩ‬
‫ﻟﻨﻜﺮﺭ ﺃﻧﻪ ﻳﻮﺟﺪ ﰲ ﻬﻧﺎﻳﺎﺕ ﺍﻟﻔﺼﻮﻝ ﺍﳋﻤﺴﺔ ﺍﻷﻭﱃ ﻣﻘﺎﻃﻊ ﺑﻌﻨﻮﺍﻥ‪" :‬ﻣﺎﺫﺍ ﻋﻦ ﺍﻷﻏﺮﺍﺽ"‪ .‬ﺗﻘﻮﻡ ﻫﺬﻩ‬
‫ﺍﳌﻘﺎﻃﻊ ﺑﺎﻟﺘﻤﻬﻴﺪ ﻟﻠﻤﻔﺎﻫﻴﻢ ﺍﳌﺘﻌﻠﻘﺔ ﺑﺄﺳﻠﻮﺏ ﺍﻟﱪﳎﺔ ﻏﺮﺿﻴﺔ ﺍﻟﺘﻮﺟﻪ‪.‬‬

‫ﻣﺜﺎل ﺑﺴﻴﻂ‪ :‬ﻃﺒﺎﻋﺔ ﻥﺺ ﻣﺆﻟﻒ ﻣﻦ ﺳﻄﺮ‬ ‫‪21-1‬‬


‫ﺗﺴﺘﺨﺪﻡ ﻟﻐﺔ ‪ C++‬ﻣﺼﻄﻠﺤﺎﺕ ﻭﺭﻣﻮﺯ ﻗﺪ ﺗﺒﺪﻭ ﻏﺮﻳﺒﺔ ﻟﻐﲑ ﺍﳌﱪﳎﲔ‪ .‬ﺳﻮﻑ ﻧﺒﺪﺃ ﻣﻊ ﻟﻐﺔ ‪ C++‬ﻣﻊ‬
‫ﻣﺜﺎﻝ ﺑﺴﻴﻂ ﻟﻄﺒﺎﻋﺔ ﻧﺺ ﻣﺆﻟﻒ ﻣﻦ ﺳﻄﺮ ﻭﺍﺣﺪ‪ .‬ﻳﻮﺿﺢ ﺍﻟﺸﻜﻞ ‪ 2-1‬ﻧﺺ ﻫﺬﺍ ﺍﻟﱪﻧﺎﻣﺞ ﻣﻊ ﺧﺮﺟﻪ‬
‫ﻋﻠﻰ ﺍﻟﺸﺎﺷﺔ‪.‬‬
‫ﻳﻈﻬﺮ ﻫﺬﺍ ﺍﻟﱪﻧﺎﻣﺞ ﻋﺪﺓ ﺇﻣﻜﺎﻧﻴﺎﺕ ﻫﺎﻣﺔ ﰲ ﻟﻐﺔ ‪ .C++‬ﻣﻦ ﺃﺟﻞ ﲢﺪﻳﺪﻫﺎ ﺳﻮﻑ ﻧﺘﻨﺎﻭﻝ ﺍﻟﱪﻧﺎﻣﺞ‬
‫ﺳﻄﺮﹰﺍ ﻓﺴﻄﺮﹰﺍ‪.‬‬
‫اﻟﻔﺼﻞ اﻷول‬ ‫‪٤٦‬‬

‫ﻳﺪﻝ ﺍﻟﺴﻄﺮﺍﻥ ‪ 1‬ﻭ‪: 2‬‬


‫‪// Fig, 1.2: fig01- 02.cpp‬‬
‫‪// A first program in C++‬‬

‫ﺍﻟﻠﺬﺍﻥ ﻳﺒﺪﺃﻥ ﺑﺈﺷﺎﺭﺓ ‪ //‬ﻋﻠﻰ ﺃﻥ ﺍﻟﺒﺎﻗﻲ ﺍﳌﻜﺘﻮﺏ ﺧﻠﻒ ﻫﺬﻩ ﺍﻹﺷﺎﺭﺓ ﻫﻮ ﻋﺒﺎﺭﺓ ﻋﻦ ﺗﻌﻠﻴﻖ‪ ،‬ﺣﻴﺚ ﳛﻖ‬
‫ﻟﻠﻤﱪﳎﲔ ﺇﺩﺭﺍﺝ ﺗﻌﻠﻴﻘﺎﻬﺗﻢ ﺿﻤﻦ ﻧﺺ ﺍﻟﱪﻧﺎﻣﺞ ﻭﲢﺴﲔ ﺍﻟﻘﺪﺭﺓ ﻋﻠﻰ ﻗﺮﺍﺀﺗﻪ ﺑﺎﻟﻨﺘﻴﺠﺔ‪ .‬ﺗﺴﺎﻋﺪ‬
‫ﺍﻟﺘﻌﻠﻴﻘﺎﺕ ﺍﻵﺧﺮﻳﻦ ﻋﻠﻰ ﻗﺮﺍﺀﺓ ﻭﻓﻬﻢ ﺑﺮﻧﺎﳎﻚ ﻭﻫﻲ ﻻﺗﻄﻠﺐ ﻣﻦ ﺍﳊﺎﺳﺐ ﺍﻟﻘﻴﺎﻡ ﺑﺄﻱ ﻓﻌﻞ ﻋﻨﺪ ﺗﻨﻔﻴﺬ‬
‫ﺍﻟﱪﻧﺎﻣﺞ‪ .‬ﻓﺎﳌﺘﺮﺟﻢ ﻳﻘﻮﻡ ﺑﺘﺠﺎﻫﻠﻬﺎ ﺃﺛﻨﺎﺀ ﻋﻤﻠﻴﺔ ﺗﻮﻟﻴﺪ ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺘﻨﻔﻴﺬﻱ ﺍﳌﻘﺎﺑﻞ ﻟﻠﱪﻧﺎﻣﺞ ﺍﳌﻜﺘﻮﺏ ﺑﻠﻐﺔ‬
‫‪ .C++‬ﺃﻣﺎ ﺍﻟﺴﻄﺮ ﺍﳌﻜﺘﻮﺏ ﺑﻌﺪ ﺇﺷﺎﺭﺓ ﺑﺪﺀ ﺍﻟﺘﻌﻠﻴﻖ ‪) //‬ﺍﻟﱵ ﺗﺴﻤىﺒﺈﺷﺎﺭﺓ ﺍﻟﺘﻌﻠﻴﻖ ﺍﳌﺆﻟﻒ ﻣﻦ ﺳﻄﺮ‬
‫ﻭﺍﺣﺪ ‪ ،single-line comment‬ﻷﻥ ﺍﻟﺘﻌﻠﻴﻖ ﻳﺒﺪﺃ ﺑﻌﺪﻫﺎ ﻭﻳﻨﺘﻬﻲ ﻣﻊ ﻬﻧﺎﻳﺔ ﺍﻟﺴﻄﺮ( ﻓﻬﻮ ﻳﻌﱪ ﻋﻦ ﻫﺪﻑ‬
‫ﺍﻟﱪﻧﺎﻣﺞ‪.‬‬
‫ﻣﻼﺣﻈﺔ‬ ‫‪2-1‬‬

‫یﻤﻜﻦ ﻟﻠﻐﺔ ‪ C++‬اﺳﺘﺨﺪام أﺳﻠﻮب ﻟﻐﺔ ‪ C‬ﻓﻲ ذآﺮ اﻟﺘﻌﻠﻴﻘﺎت اﻟﺘﻲ یﻤﻜﻦ أن‬
‫ﺕﺘﻀﻤﻦ ﻋﺪة أﺳﻄﺮ‪ .‬یﻤﻜﻦ أن یﺒﺪأ اﻟﺘﻌﻠﻴﻖ ﺑﺈﺵﺎرة *‪ /‬ویﻨﺘﻬﻲ ﺑﺎﻹﺵﺎرة ‪.*/‬‬
‫ﻟﻜﻨﻨﺎ ﻻ ﻧﻨﺼﺢ ﺑﻬﺬﻩ اﻟﻄﺮیﻘﺔ أﺑﺪًا‪.‬‬

‫ﻋﺎدات ﺑﺮﻣﺠﻴﺔ ﺝﻴﺪة‬ ‫‪4-1‬‬

‫یﺠﺐ أن یﺒﺪأ آﻞ ﺑﺮﻧﺎﻣﺞ ﺑﺘﻌﻠﻴﻖ یﺤﺪد اﻟﻬﺪف ﻣﻨﻪ واﻟﻤﺆﻟﻒ واﻟﺘﺎریﺦ‬


‫واﻟﻮﻗﺖ‪.‬‬

‫‪1.‬‬ ‫‪// Fig. 1.2: fig01_02.cpp‬‬


‫‪2.‬‬ ‫‪// A first program in C.++‬‬
‫‪3.‬‬ ‫>‪#include <iostream‬‬
‫‪‬‬
‫‪4.‬‬
‫‪5.‬‬ ‫‪// function main begins program execution‬‬
‫‪6.‬‬ ‫)(‪int main‬‬
‫‪7.‬‬ ‫{‬
‫‪8.‬‬ ‫;"‪std::cout << "Welcome to C++!\n‬‬
‫‪9.‬‬
‫‪10.‬‬ ‫;‪return 0‬‬ ‫‪// indicate that program ended successfully‬‬
‫‪11.‬‬
‫‪12.‬‬ ‫‪} //‬‬ ‫‪end function main‬‬

‫!‪Welcome to C++‬‬

‫]‪< <äq†}æ<íÂ^fŞÖ]<sÚ^Þ†e<“Þ<<<V2-1<ØÓÖ‬‬
‫‪٤٧‬‬ ‫‪ .1‬ﻣﻘﺪﻣﺔ ﺣﻮل اﻟﺤﻮاﺳﻴﺐ واﻟﺒﺮﻣﺠﺔ ﺑﻠﻐﺔ ‪C++‬‬

‫ﻳﻌﱪ ﺍﻟﺴﻄﺮ ﺍﻟﺜﺎﻟﺚ‪:‬‬


‫>‪#include <iostream‬‬

‫ﻋﻦ ﺗﻮﺟﻴﻪ ﳌﺮﺣﻠﺔ ﻣﺎ ﻗﺒﻞ ﺍﻟﺘﺮﲨﺔ‪ .‬ﺗﺘﻢ ﻣﻌﺎﳉﺔ ﺍﻷﺳﻄﺮ ﺍﻟﱵ ﺗﺒﺪﺃ ﺑـ ‪ #‬ﻣﻦ ﻗﺒﻞ ﻣﺮﺣﻠﺔ ﻣﺎ‬
‫ﻗﺒﻞ ﺍﻟﺘﺮﲨﺔ ﺃﻭ ﺍﻟﺘﺮﲨﺔ‪ .‬ﳜﱪ ﺍﻟﺴﻄﺮ ﺍﻟﺴﺎﺑﻖ ﻣﺮﺣﻠﺔ ﻣﺎ ﻗﺒﻞ ﺍﻟﺘﺮﲨﺔ ﺑﻀﻢ ﳏﺘﻮﻯ ﺍﳌﻠﻒ ﺍﻟﺮﺃﺳﻲ )ﺫﻭ‬
‫ﺍﻻﻣﺘﺪﺍﺩ ‪ (.h‬ﺍﳊﺎﻭﻱ ﻋﻠﻰ ﺍﻟﻌﻤﻠﻴﺎﺕ ﺍﳋﺎﺻﺔ ﺑﺎﻟﺪﺧﻞ‪/‬ﺧﺮﺝ ﺇﱃ ﻧﺺ ﺍﻟﱪﻧﺎﻣﺞ‪ .‬ﳚﺐ ﺿﻢ ﻫﺬﺍ ﺍﳌﻠﻒ ﺇﱃ‬
‫ﺃﻱ ﺑﺮﻧﺎﻣﺞ ﳛﻮﻱ ﻋﻠﻰ ﻋﻤﻠﻴﺎﺕ ﺧﺮﺝ ﻟﻠﻤﻌﻄﻴﺎﺕ ﻋﻠﻰ ﺍﻟﺸﺎﺷﺔ ﺃﻭ ﺩﺧﻞ ﳍﺎ ﻣﻦ ﻟﻮﺣﺔ ﺍﳌﻔﺎﺗﻴﺢ ﺑﺎﺳﺘﺨﺪﺍﻡ‬
‫ﺃﺳﻠﻮﺏ ‪ C++‬ﰲ ﺍﻟﺪﺧﻞ ﻭﺍﳋﺮﺝ‪ .‬ﳜﺮﺝ ﺍﻟﱪﻧﺎﻣﺞ ﰲ ﺍﻟﺸﻜﻞ ‪ 2-1‬ﺍﳌﻌﻄﻴﺎﺕ ﻋﻠﻰ ﺍﻟﺸﺎﺷﺔ ﻛﻤﺎ ﺳﻮﻑ‬
‫ﻧﻔﺼﻞ ﺑﻌﺪ ﻗﻠﻴﻞ‪ .‬ﺳﻮﻑ ﻳﺘﻢ ﺷﺮﺡ ﳏﺘﻮﻯ ﺍﳌﻠﻒ ‪ iostream‬ﺑﺎﻟﺘﻔﺼﻴﻞ ﻓﻴﻤﺎ ﺑﻌﺪ‪.‬‬
‫أﺥﻄﺎء ﺑﺮﻣﺠﻴﺔ ﺵﺎﺉﻌﺔ‬ ‫‪2-1‬‬

‫یﺆدي ﻋﺪم اﻟﻘﻴﺎم ﺑﻌﻤﻠﻴﺔ إدراج ﻟﻠﻤﻠﻒ >‪ <iostream‬ﺿﻤﻦ ﻣﻠﻒ ﻧﺺ ﺑﺮﻧﺎﻣﺞ‬
‫یﻘﻮم ﺑﻌﻤﻠﻴﺎت دﺥﻞ ﻟﻠﻤﻌﻄﻴﺎت ﻣﻦ ﻟﻮﺣﺔ اﻟﻤﻔﺎﺕﻴﺢ وﺥﺮج ﻟﻬﺎ ﻋﻠﻰ اﻟﺸﺎﺵﺔ‪،‬‬ ‫‪7‬‬
‫إﻟﻰ إﻇﻬﺎر اﻟﻤﺘﺮﺝﻢ ﻟﺮﺳﺎﻟﺔ ﺥﻄﺄ‪.‬‬

‫ﺃﻣﺎ ﺍﻟﺴﻄﺮ‪:‬‬
‫) (‪int main‬‬

‫ﻓﻴﻌﺘﱪ ﺟﺰﺀﹰﺍ ﻣﻦ ﺃﻱ ﺑﺮﻧﺎﻣﺞ ‪ .C++‬ﻭﻳﻌﲏ ﺍﻟﻘﻮﺳﺎﻥ ﺑﻌﺪ ﻛﻠﻤﺔ ‪ main‬ﺃﻥ ‪ main‬ﻋﺒﺎﺭﺓ ﻋﻦ ﻛﺘﻠﺔ ﺑﺮﳎﻴﺔ‬
‫ﺗﺴﻤﻰ ﺑﺘﺎﺑﻊ ‪ .function‬ﲢﺘﻮﻱ ﺑﺮﺍﻣﺞ ‪ C++‬ﻋﻠﻰ ﺗﺎﺑﻊ ﺃﻭ ﺃﻛﺜﺮ‪ ،‬ﺃﺣﺪﻫﺎ ﳚﺐ ﺃﻥ ﻳﻜﻮﻥ ﺍﻟﺘﺎﺑﻊ ‪.main‬‬
‫ﻓﻌﻠﻰ ﺳﺒﻴﻞ ﺍﳌﺜﺎﻝ ﳛﺘﻮﻱ ﺍﻟﱪﻧﺎﻣﺞ ﰲ ﺍﻟﺸﻜﻞ ‪ 2-1‬ﻋﻠﻰ ﺗﺎﺑﻊ ﻭﺣﻴﺪ‪ .‬ﻳﺒﺪﺃ ﺗﻨﻔﻴﺬ ﺑﺮﻧﺎﻣﺞ ‪ C++‬ﻋﺎﺩ ﹰﺓ ﻣﻦ‬
‫ﺍﻟﺘﺎﺑﻊ ‪ main‬ﺣﱴ ﻟﻮ ﱂ ﻳﻜﻦ ﻫﺬﺍ ﺍﻟﺘﺎﺑﻊ ﻫﻮ ﺍﻟﺘﺎﺑﻊ ﺍﻷﻭﻝ ﰲ ﻣﻠﻒ ﺍﻟﱪﻧﺎﻣﺞ‪ .‬ﺗﻔﻴﺪ ﺍﻟﻜﻠﻤﺔ ﺍﳌﻔﺘﺎﺣﻴﺔ ‪int‬‬
‫ﺍﳌﻮﺟﻮﺩﺓ ﻋﻠﻰ ﻳﺴﺎﺭ ‪ main‬ﰲ ﺍﻟﺪﻻﻟﺔ ﻋﻠﻰ ﺃﻥ ﻫﺬﺍ ﺍﻟﺘﺎﺑﻊ ﺳﻴﻌﻴﺪ ﻣﻦ ﺍﻟﻨﻤﻂ ‪ .int‬ﺳﻮﻑ ﻧﻮﺿﺢ ﰲ‬
‫ﺍﻟﻔﺼﻞ ﺍﻟﺜﺎﻟﺚ ﻣﺎ ﻣﻌﲎ ﺃﻧﻪ ﻳﻘﻮﻡ ﺑﺈﻋﺎﺩﺓ ﻗﻴﻤﺔ ﻋﻨﺪﻣﺎ ﺳﻨﺘﺤﺪﺙ ﻋﻦ ﺍﻟﺘﻮﺍﺑﻊ ﺑﺎﻟﺘﻔﺼﻴﻞ‪ .‬ﻭﳝﻜﻨﻚ‬
‫ﺍﻻﻛﺘﻔﺎﺀ ﺣﺎﻟﻴﹰﺎ ﺑﺬﻛﺮ ﺍﻟﻜﻠﻤﺔ ﺍﳌﻔﺘﺎﺣﻴﺔ ‪ int‬ﻋﻠﻰ ﻳﺴﺎﺭ ‪ main‬ﰲ ﻛﺎﻓﺔ ﺑﺮﺍﳎﻚ‪ .‬ﻳﻌﱪ ﺍﻟﻘﻮﺱ ﺍﻟﻜﺒﲑ‬
‫ﺍﻷﻳﺴﺮ } ﻋﻦ ﺑﺪﺍﻳﺔ ﺟﺴﻢ ﺃﻱ ﺗﺎﺑﻊ‪ .‬ﰲ ﺣﲔ ﻳﻌﱪ ﺍﻟﻘﻮﺱ ﺍﻟﻜﺒﲑ ﺍﻷﳝﻦ { ﻋﻦ ﻬﻧﺎﻳﺔ ﻫﺬﺍ ﺍﻟﺘﺎﺑﻊ‪.‬‬
‫ﻳﻌﻄﻲ ﺍﻟﺴﻄﺮ ﺍﻟﺜﺎﻣﻦ‬
‫;"‪std::cout << "welcome to C++!\n‬‬

‫ﺍﻷﻣﺮ ﻟﻠﺤﺎﺳﺐ ﻟﻄﺒﺎﻋﺔ ﺍﻟﺴﻠﺴﻠﺔ ﺍﳌﻮﺟﻮﺩﺓ ﺑﲔ ﻋﻼﻣﱵ ﺍﻻﻗﺘﺒﺎﺱ )"( ‪ .quotation markes‬ﻧﺴﻤﻲ‬
‫ﺍﻟﺴﻄﺮ ﺑﺄﻛﻤﻠﻪ ﺑﺎﻟﺘﻌﻠﻴﻤﺔ ‪ statement‬ﲟﺎ ﰲ ﺫﻟﻚ ‪ cout‬ﻭﺍﻟﻌﻤﻠﻴﺔ << ﻭﺍﻟﺴﻠﺴﻠﺔ ‪“Welcome to‬‬

‫;”‪ C++!\n‬ﻭﺍﻟﻔﺎﺻﻠﺔ ﺍﳌﻨﻘﻮﻃﺔ );(‪ .‬ﳚﺐ ﺃﻥ ﻧﻨﻬﻲ ﻛﻞ ﺗﻌﻠﻴﻤﺔ ﺑﻔﺎﺻﻠﺔ ﻣﻨﻘﻮﻃﺔ )ﺍﻟﱵ ﺗﺴﻤﻰ ﺃﺣﻴﺎﻧﹰﺎ‬
‫ﲟﺆﺷﺮ ﻬﻧﺎﻳﺔ ﺍﻟﺘﻌﻠﻴﻤﺔ ‪ .(statement terminator‬ﻳﺘﻢ ﺇﳒﺎﺯ ﻋﻤﻠﻴﺎﺕ ﺍﻟﺪﺧﻞ ﻭﺍﳋﺮﺝ ﰲ ﻟﻐﺔ ‪ C++‬ﺑﻮﺍﺳﻄﺔ‬
‫ﳎﺎﺭﻱ ‪ streams‬ﻟﻠﺤﺮﻭﻑ‪ .‬ﻟﺬﻟﻚ ﻋﻨﺪﻣﺎ ﻳﺘﻢ ﺗﻨﻔﻴﺬ ﺍﻟﺘﻌﻠﻴﻤﺔ ﺍﻟﺴﺎﺑﻘﺔ ﻓﺈﻬﻧﺎ ﺗﺮﺳﻞ ﳎﺮﻯ ﺍﳊﺮﻭﻑ‬
‫!‪ Welcome to C++‬ﺇﱃ ﻏﺮﺽ ﳎﺮﻯ ﺍﳋﺮﺝ ﺍﳌﻌﻴﺎﺭﻱ ‪ standard output stream object-‬ﻭﻫﻮ ‪std::cout‬‬
‫اﻟﻔﺼﻞ اﻷول‬ ‫‪٤٨‬‬

‫ﰲ ﺍﻟﻔﺼﻞ ﺍﻟﺜﺎﱐ ﻋﺸﺮ‬ ‫‪std::cout‬‬ ‫ﻼ ﻋﺎﺩ ﹰﺓ ﺑﺎﻟﺸﺎﺷﺔ‪ .‬ﺳﻮﻑ ﻧﺘﺤﺪﺙ ﺑﺎﻟﺘﻔﺼﻴﻞ ﻋﻦ‬
‫ﺍﻟﺬﻱ ﻳﻜﻮﻥ ﻣﺘﺼ ﹰ‬
‫"ﳎﺎﺭﻱ ﺍﻟﺪﺧﻞ‪ /‬ﺧﺮﺝ"‪.‬‬
‫ﻻﺣﻆ ﺃﻧﻨﺎ ﻭﺿﻌﻨﺎ ‪ std::‬ﻗﺒﻞ ‪ .cout‬ﳚﺐ ﻋﻠﻴﻨﺎ ﻓﻌﻞ ﺫﻟﻚ ﺇﺫﺍ ﺃﺭﺩﻧﺎ ﺍﻟﺘﻌﺎﻣﻞ ﻣﻊ ﺍﻟﺘﻮﺟﻴﻪ ﺍﳋﺎﺹ ﲟﺮﺣﻠﺔ‬
‫ﻣﺎ ﻗﺒﻞ ﺍﻟﺘﺮﲨﺔ >‪ .#include < iostream‬ﻳﻔﻴﺪ ﺍﻟﺘﻌﺒﲑ ‪ std::cout‬ﰲ ﺍﻟﺪﻻﻟﺔ ﻋﻠﻰ ﺃﻧﻨﺎ ﻧﺴﺘﺨﺪﻡ ﺍﻻﺳﻢ‬
‫‪ cout‬ﺍﻟﺬﻱ ﻳﻨﺘﻤﻲ ﺇﱃ ﻓﻀﺎﺀ ﺍﻷﲰﺎﺀ ‪ .std‬ﻳﻌﺘﱪ ﻓﻀﺎﺀ ﺍﻷﲰﺎﺀ ﺃﺣﺪ ﺍﳌﻴﺰﺍﺕ ﺍﳌﺘﻘﺪﻣﺔ ﺍﳌﺘﻮﻓﺮﺓ ﰲ ﻟﻐﺔ‬
‫‪ .C++‬ﺳﻮﻑ ﻧﺘﺤﺪﺙ ﻋﻦ ﻫﺬﻩ ﺍﳌﻴﺰﺓ ﰲ ﺍﻟﻔﺼﻞ ﺍﻟﺜﺎﱐ ﻭﺍﻟﻌﺸﺮﻭﻥ ﻣﻦ ﻫﺬﺍ ﺍﻟﻜﺘﺎﺏ‪ .‬ﳚﺐ ﻋﻠﻴﻚ‬
‫ﺣﺎﻟﻴﹰﺎ ﻗﺒﻞ ﺍﻟﻮﺻﻮﻝ ﺇﱃ ﺗﻠﻚ ﺍﳌﺮﺣﻠﺔ‪ ،‬ﺃﻥ ﺗﺘﺬﻛﺮ ﺃﻧﻪ ﳚﺐ ﺍﺳﺘﺨﺪﺍﻡ ‪ std::‬ﻗﺒﻞ ﺃﻱ ﺫﻛﺮ ﻟـ ‪ cout‬ﺃﻭ‬
‫‪ cin‬ﺃﻭ ‪ cerr‬ﰲ ﺑﺮﺍﳎﻚ‪ .‬ﻗﻤﻨﺎ ﰲ ﺍﻟﺸﻜﻞ )‪ (14-1‬ﺑﺎﺳﺘﺨﺪﺍﻡ ﺍﻟﺘﻌﻠﻴﻤﺔ ‪ using‬ﺍﻟﱵ ﺳﺘﺴﺎﻋﺪﻧﺎ ﻋﻠﻰ ﺣﺬﻑ‬
‫‪ std::‬ﻗﺒﻞ ﺃﻱ ﺍﺳﺘﺨﺪﺍﻡ ﻻﺳﻢ ﻳﻨﺘﻤﻲ ﺇﱃ ﻓﻀﺎﺀ ﺍﻷﲰﺎﺀ ‪.std‬‬
‫ﺗﺮﻣﺰ ﺍﻟﻌﻤﻠﻴﺔ << ﺇﱃ ﻋﻤﻠﻴﺔ ﺍﻹﺩﺧﺎﻝ ﺿﻤﻦ ﺍﺠﻤﻟﺮﻯ‪ .‬ﻋﻨﺪ ﺗﻨﻔﻴﺬ ﺍﻟﱪﻧﺎﻣﺞ ﻳﺘﻢ ﺇﺩﺧﺎﻝ ﻗﻴﻤﺔ ﺍﳌﻌﺎﻣﻞ‬
‫ﺍﻟﻴﻤﻴﲏ ﻟﻠﻌﻤﻠﻴﺔ ﺍﻟﺴﺎﺑﻘﺔ ﰲ ﳎﺮﻯ ﺍﳋﺮﺝ‪ .‬ﻳﺘﻢ ﻋﺎﺩ ﹰﺓ ﻃﺒﺎﻋﺔ ﺍﳊﺮﻭﻑ ﺍﳌﻮﺟﻮﺩﺓ ﰲ ﺍﳌﻌﺎﻣﻞ ﺍﻟﻴﻤﻴﲏ ﻛﻤﺎ‬
‫ﻫﻲ ﻣﻮﺟﻮﺩﺓ ﺑﲔ ﺇﺷﺎﺭﰐ ﺍﻻﻗﺘﺒﺎﺱ‪ .‬ﻟﻜﻦ ﻻﺣﻆ ﺃﻥ ﺍﳊﺮﻑ ‪ \n‬ﻟﻦ ﻳﻄﺒﻊ ﻋﻠﻰ ﺍﻟﺸﺎﺷﺔ‪ .‬ﻓﺎﳊﺮﻑ )\(‬
‫‪ backslash‬ﻳﺴﻤﻰ ﲝﺮﻑ ﺍﳍﺮﻭﺏ ‪ escape character‬ﻭﻫﻮ ﻳﺪﻝ ﻋﻠﻰ ﺃﻥ ﻫﻨﺎﻙ ﺣﺮﻑ ﺧﺎﺹ ﳚﺐ‬
‫ﺇﻇﻬﺎﺭﻩ‪ .‬ﻋﻨﺪﻣﺎ ﻳﻜﻮﻥ ﺣﺮﻑ ﺍﳍﺮﻭﺏ ﻣﺘﺒﻮﻋﹰﺎ ﺑﺴﻠﺴﻠﺔ ﻣﻦ ﺍﳊﺮﻭﻑ ﻳﺘﻢ ﺩﻣﺞ ﺍﳊﺮﻑ ﺍﻟﺘﺎﱄ ﻟﻪ ﻟﻴﺸﻜﻞ‬
‫ﻣﻌﻪ ﻣﺎ ﻳﺴﻤﻰ ﺑﺴﻠﺴﻠﺔ ﺍﳍﺮﻭﺏ ‪ .escape sequence‬ﺗﻌﲏ ﺳﻠﺴﻠﺔ ﺍﳍﺮﻭﺏ ‪ \n‬ﺳﻄﺮ ﺟﺪﻳﺪ ‪newline‬‬
‫ﻭﻫﻲ ﺗﺴﺒﺐ ﺣﺮﻛﺔ ﺍﳌﺆﺷﺮ ‪ cursor‬ﺇﱃ ﺑﺪﺍﻳﺔ ﺳﻄﺮ ﺟﺪﻳﺪ ﻋﻠﻰ ﺍﻟﺸﺎﺷﺔ‪ .‬ﻳﺒﲔ ﺍﻟﺸﻜﻞ ‪ 3-1‬ﺑﻌﻀﹰﺎ ﻣﻦ‬
‫ﺳﻼﺳﻞ ﺍﳍﺮﻭﺏ ﺍﻟﺸﺎﺋﻌﺔ‪.‬‬
‫أﺥﻄﺎء ﺑﺮﻣﺠﻴﺔ ﺵﺎﺉﻌﺔ‬ ‫‪3-1‬‬

‫إن ﺣﺬف اﻟﻔﺎﺹﻠﺔ اﻟﻤﻨﻘﻮﻃﺔ ﻣﻦ ﻧﻬﺎیﺔ اﻟﺘﻌﻠﻴﻤﺔ هﻮ ﻋﺒﺎرة ﻋﻦ ﺥﻄﺄ ﻗﻮاﻋﺪي‬


‫‪ syntax error‬وهﺬا اﻟﺨﻄﺄ یﻤﻨﻊ اﻟﻤﺘﺮﺝﻢ ﻣﻦ ﺕﻤﻴﻴﺰ اﻟﺘﻌﻠﻴﻤﺔ‪ .‬ﻣﻦ أﺝﻞ ﺕﺤﺪیﺪ‬
‫ﻣﻜﺎن اﻟﺨﻄﺄ ﺑﻐﻴﺔ ﺕﺼﺤﻴﺤﻪ‪ ،‬یﻘﻮم اﻟﻤﺘﺮﺝﻢ ﺑﺈرﺳﺎل رﺳﺎﻟﺔ ﺥﻄﺄ إﻟﻰ‬
‫‪7‬‬
‫اﻟﻤﺒﺮﻣﺞ‪ .‬ﺕﺴﻤﻰ اﻷﺥﻄﺎء اﻟﻘﻮاﻋﺪیﺔ ﺑﺄﺥﻄﺎء اﻟﺘﺮﺝﻤﺔ أیﻀﺎً‪ ،‬أو أﺥﻄﺎء زﻣﻦ‬
‫اﻟﺘﺮﺝﻤﺔ ﻷﻧﻬﺎ ﺕﻈﻬﺮ ﺥﻼل ﻓﺘﺮة اﻟﺘﺮﺝﻤﺔ ﻟﻠﺒﺮﻧﺎﻣﺞ‪.‬‬

‫ﻳﻌﱪ ﺍﻟﺴﻄﺮ ﺍﻟﻌﺎﺷﺮ‬


‫‪return 0; // indicate that program ended successfully‬‬

‫ﻋﻦ ﻬﻧﺎﻳﺔ ﺍﻟﺘﺎﺑﻊ ‪ main‬ﻓﺎﻟﻜﻠﻤﺔ ﺍﳌﻔﺘﺎﺡ ‪ return‬ﺗﻌﺘﱪ ﺃﺣﺪ ﺍﻟﻄﺮﻕ ﺍﳌﺴﺘﺨﺪﻣﺔ ﻟﻠﺨﺮﻭﺝ ﻣﻦ ﺍﻟﺘﺎﺑﻊ‪.‬‬
‫ﺗﻌﱪ ﺍﻟﻘﻴﻤﺔ ‪ 0‬ﻋﻦ ﺍﻧﺘﻬﺎﺀ ﺍﻟﱪﻧﺎﻣﺞ ﺑﺸﻜﻞ ﺻﺤﻴﺢ‪ .‬ﺳﻮﻑ ﻧﺘﺤﺪﺙ ﰲ ﺍﻟﻔﺼﻞ ﺍﻟﺜﺎﻟﺚ ﻭﺑﺎﻟﺘﻔﺼﻴﻞ ﻋﻦ‬
‫ﻣﻔﻬﻮﻡ ﺍﻟﺘﻮﺍﺑﻊ ﻭﺑﺎﻟﺘﺎﱄ ﺳﻮﻑ ﺗﺼﺒﺢ ﺃﺳﺒﺎﺏ ﺍﺳﺘﺨﺪﺍﻡ ﺗﻌﻠﻴﻤﺔ ‪ return‬ﺃﻛﺜﺮ ﻭﺿﻮﺣﹰﺎ‪ .‬ﻭﻟﻜﻦ ﺣﺎﻟﻴﹰﺎ ﻗﻢ‬
‫ﺑﺈﺿﺎﻓﺔ ﻫﺬﻩ ﺍﻟﺘﻌﻠﻴﻤﺔ ﻣﻊ ﻛﻞ ﺑﺮﻧﺎﻣﺞ ﺗﻜﺘﺒﻪ ﻭﺇﻻ ﺳﻮﻑ ﻳﺮﺳﻞ ﻟﻚ ﺍﳌﺘﺮﺟﻢ ﺭﺳﺎﻟﺔ ﲢﺬﻳﺮ‪.‬‬
‫‪٤٩‬‬ ‫‪ .1‬ﻣﻘﺪﻣﺔ ﺣﻮل اﻟﺤﻮاﺳﻴﺐ واﻟﺒﺮﻣﺠﺔ ﺑﻠﻐﺔ ‪C++‬‬

‫ﻳﺪﻝ ﺍﻟﻘﻮﺱ ﺍﻟﻜﺒﲑ ﺍﻷﳝﻦ { ﻋﻠﻰ ﻬﻧﺎﻳﺔ ﺍﻟﺘﺎﺑﻊ ‪.main‬‬

‫اﻟﻤﻌﻨﻰ‬ ‫ﺳﻠﺴﻠﺔ‬
‫اﻟﻬﺮوب‬

‫ﺳﻄﺮ ﺝﺪیﺪ‪ .‬وﺿﻊ اﻟﻤﺆﺵﺮ ﻓﻲ ﺑﺪایﺔ اﻟﺴﻄﺮ اﻟﺘﺎﻟﻲ‬ ‫‪\n‬‬

‫ﻣﺴﺎﻓﺔ اﻟﺠﺪوﻟﺔ اﻷﻓﻘﻴﺔ‪ .‬ﺕﺤﺮیﻚ اﻟﻤﺆﺵﺮ ﻣﺴﺎﻓﺔ اﻟﺠﺪوﻟﺔ‬ ‫‪\t‬‬


‫اﻷﻓﻘﻴﺔ اﻟﺘﺎﻟﻴﺔ‬
‫إﻋﺎدة اﻟﻤﺆﺵﺮ ‪ .Carrige return‬وﺿﻊ اﻟﻤﺆﺵﺮ ﻋﻠﻰ ﺑﺪایﺔ‬ ‫‪\r‬‬
‫اﻟﺴﻄﺮ اﻟﺤﺎﻟﻲ دون اﻟﺘﻘﺪم إﻟﻰ اﻟﺴﻄﺮ اﻟﺘﺎﻟﻲ‬
‫ﺕﻨﺒﻴﻪ ‪ .Alert‬ﻗﺮع ﺝﺮس اﻟﻨﻈﺎم‬ ‫‪\a‬‬

‫اﻟﺸﻖ اﻟﻤﻌﻜﻮس ‪ .backslash‬وﺕﺴﺘﺨﺪم ﻟﻄﺒﺎﻋﺔ ﺣﺮف‬ ‫\\‬


‫اﻟﺸﻖ اﻟﻤﻌﻜﻮس‬
‫ﻋﻼﻣﺔ اﻗﺘﺒﺎس‪ .‬وﺕﺴﺘﺨﺪم ﻟﻄﺒﺎﻋﺔ ﺣﺮف ﻋﻼﻣﺔ اﻗﺘﺒﺎس‬ ‫"\‬

‫]‪< <íÃñ^Ö]<hæ†]<؉ø‰<˜Ãe<<V3-1<ØÓÖ‬‬

‫ﻋﺎدات ﺑﺮﻣﺠﻴﺔ ﺝﻴﺪة‬ ‫‪5-1‬‬

‫یﺠﺐ أن یﻜﻮن اﻟﺤﺮف اﻷﺥﻴﺮ اﻟﻮاﺝﺐ ﻃﺒﺎﻋﺘﻪ ﻷي ﺕﺎﺑﻊ یﻘﻮم ﺑﻌﻤﻠﻴﺔ‬


‫اﻟﻄﺒﺎﻋﺔ هﻮ اﻟﺤﺮف )‪" (\n‬ﺳﻄﺮ ﺝﺪیﺪ"‪ .‬هﺬا یﺠﻌﻠﻨﺎ ﻣﺘﺄآﺪیﻦ ﻣﻦ أن اﻟﺘﺎﺑﻊ‬
‫ﺳﻮف یﻀﻊ اﻟﻤﺆﺵﺮ ﻋﻠﻰ ﺑﺪایﺔ ﺳﻄﺮ ﺝﺪیﺪ‪ .‬یﺘﻤﺜﻞ اﻟﻬﺪف ﻣﻦ اﻟﺘﻮﺝﻴﻪ‬
‫اﻟﺴﺎﺑﻖ ﻓﻲ ﻗﺎﺑﻠﻴﺔ إﻋﺎدة اﺳﺘﺨﺪام اﻟﺒﺮﻧﺎﻣﺞ اﻟﺘﻲ ﺕﻌﺪ هﺪﻓًﺎ أﺳﺎﺳﻴًﺎ ﻓﻲ ﻋﻤﻠﻴﺔ‬
‫اﻟﺘﻄﻮیﺮ اﻟﺒﺮﻣﺠﻲ‪.‬‬

‫ﻋﺎدات ﺑﺮﻣﺠﻴﺔ ﺝﻴﺪة‬ ‫‪6-1‬‬

‫اﺕﺮك ﻣﺴﺎﻓﺔ ﺝﺪوﻟﺔ أﻓﻘﻴﺔ واﺣﺪة ﺑﻴﻦ ﺝﺴﻢ اﻟﺘﺎﺑﻊ وﺑﻴﻦ اﻷﻗﻮاس اﻟﻜﺒﻴﺮة اﻟﺘﻲ‬
‫ﺕﻌﺮف ﺑﺪایﺔ وﻧﻬﺎیﺔ ﺝﺴﻢ اﻟﺘﺎﺑﻊ‪ .‬ﻣﻤﺎ یﺠﻌﻞ ﺑﻨﻴﺔ اﻟﺒﺮﻧﺎﻣﺞ واﺿﺤﺔ وأﺳﻬﻞ‬
‫ﻟﻠﻘﺮاءة‪.‬‬
‫اﻟﻔﺼﻞ اﻷول‬ ‫‪٥٠‬‬

‫ﻋﺎدات ﺑﺮﻣﺠﻴﺔ ﺝﻴﺪة‬ ‫‪7-1‬‬

‫ﺣﺪد ﻃﻮل ﻣﻌﻴﻦ ﻟﻤﺴﺎﻓﺔ اﻟﺠﺪوﻟﺔ اﻷﻓﻘﻴﺔ ﺕﻔﻀﻠﻪ وﺕﺼﻄﻠﺢ ﻋﻠﻰ اﺳﺘﺨﺪاﻣﻬﺎ‬
‫ﺑﺸﻜﻞ ﻣﻨﺘﻈﻢ ﻣﻊ ﺑﺮاﻣﺠﻚ‪ .‬یﻤﻜﻦ أن ﻧﺴﺘﺨﺪم ﻣﺴﺎﻓﺔ اﻟﺠﺪوﻟﺔ ‪ tab‬آﻤﺴﺎﻓﺔ‬
‫ﺝﺪوﻟﺔ أﻓﻘﻴﺔ ﻟﻜﻦ ﻧﻌﻠﻢ أن ﻃﻮل هﺬﻩ اﻟﻤﺴﺎﻓﺔ ﻗﺎﺑﻞ ﻟﻠﺘﻐﻴﻴﺮ‪ .‬ﻧﺤﻦ ﻧﻨﺼﺢ‬
‫ﺑﺎﺳﺘﺨﺪام إﻣﺎ ﻣﺴﺎﻓﺔ اﻟــ ‪ 1/4‬إﻧﺶ ﻹﺵﺎرات ﺕﻮﻗﻒ ‪ tab‬أو ﻣﺴﺎﻓﺔ ﺛﻼث‬
‫ﻓﺮاﻏﺎت ﻟﻠﺴﻴﺮ ﻣﺴﺎﻓﺔ ﺝﺪوﻟﺔ أﻓﻘﻴﺔ واﺣﺪة‪.‬‬

‫ﳝﻜﻦ ﻃﺒﺎﻋﺔ ﺍﻟﺴﻠﺴﻠﺔ !‪ Welcome to C++‬ﺑﻌﺪﺓ ﻃﺮﻕ‪ .‬ﻓﻌﻠﻰ ﺳﺒﻴﻞ ﺍﳌﺜﺎﻝ‪ ،‬ﻳﺴﺘﺨﺪﻡ ﺍﻟﱪﻧﺎﻣﺞ ﰲ‬
‫ﺍﻟﺸﻜﻞ ‪ 4-1‬ﻋﺪﺓ ﺗﻌﻠﻴﻤﺎﺕ ﺠﻤﻟﺎﺭﻱ ﺇﺧﺮﺍﺝ ﻭﺍﻟﱵ ﺗﻌﻄﻲ ﻧﻔﺲ ﻧﺘﻴﺠﺔ ﺍﳋﺮﺝ ﺍﳌﻤﺎﺛﻠﺔ ﻟﱪﻧﺎﻣﺞ ﺍﻟﺸﻜﻞ ‪.2-1‬‬
‫ﺣﺼﻠﻨﺎ ﻋﻠﻰ ﻧﻔﺲ ﺍﻟﻨﺘﻴﺠﺔ ﻷﻥ ﺗﻌﻠﻴﻤﺔ ﺍﻻﺩﺭﺍﺝ ﰲ ﳎﺮﻯ ﺍﳋﺮﺝ ﺗﺒﺪﺃ ﻋﻤﻠﻬﺎ ﰲ ﻃﺒﺎﻋﺔ ﺍﳋﺮﺝ ﺍﻧﻄﻼﻗﹰﺎ‬
‫ﻣﻦ ﺍﳌﻜﺎﻥ ﺍﻟﺬﻱ ﺗﻮﻗﻔﺖ ﻋﻨﺪﻩ ﺍﻟﺘﻌﻠﻴﻤﺔ ﺍﻟﺴﺎﺑﻘﺔ ﻟﻄﺒﺎﻋﺔ ﺍﳋﺮﺝ‪.‬‬

‫‪1.‬‬ ‫‪// Fig. 1.4: fig01_04.cpp‬‬


‫‪2.‬‬ ‫‪// Printing a line with multiple statements.‬‬
‫‪3.‬‬ ‫>‪#include <iostream‬‬
‫‪4.‬‬
‫‪5.‬‬ ‫‪// function main begins program execution‬‬
‫‪6.‬‬ ‫)(‪int main‬‬
‫‪7.‬‬ ‫{‬
‫‪8.‬‬ ‫;"‪std::cout << "Welcome‬‬
‫‪9.‬‬ ‫;"‪std::cout << "to C++!\n‬‬
‫‪10.‬‬
‫‪11.‬‬ ‫;‪return 0‬‬ ‫‪// indicate that program ended successfully‬‬
‫‪12.‬‬
‫‪13.‬‬ ‫‪} //‬‬ ‫‪end function main‬‬

‫‪Welcome to C!++‬‬

‫]‪< <<Jí×’ËßÚ<cout<l^Ûé×Ãi<ì‚Â<Ý]‚~j‰^e<‚u]æ<†Ş‰<àÚ<ÌÖöÚ<“Þ<íÂ^f<<<V4-1<ØÓÖ‬‬

‫ﻣﺘﺒﻮﻋﺔ ﻣﺒﺎﺷﺮﺓ ﺑﻔﺮﺍﻍ ﰒ ﺗﺘﺎﺑﻊ ﺍﻟﺘﻌﻠﻴﻤﺔ ﺍﻟﺜﺎﻧﻴﺔ‬ ‫ﺗﻘﻮﻡ ﺍﻟﺘﻌﻠﻴﻤﺔ ﺍﻷﻭﱃ ﻟﻠﺨﺮﺝ ﺑﻄﺒﺎﻋﺔ ﻛﻠﻤﺔ‬
‫‪Welcome‬‬

‫ﻋﻤﻠﻴﺔ ﺍﻟﻄﺒﺎﻋﺔ ﺑﻌﺪ ﺍﻟﻔﺮﺍﻍ ﺍﻟﺴﺎﺑﻖ‪.‬‬


‫ﺗﺴﻤﺢ ﻟﻐﺔ ‪ C++‬ﺑﺸﻜﻞ ﻋﺎﻡ ﻟﻠﻤﱪﻣﺞ ﺑﺎﻟﺘﻌﺒﲑ ﻋﻦ ﺍﻟﺘﻌﻠﻴﻤﺎﺕ ﺑﻄﺮﻕ ﻣﺘﻨﻮﻋﺔ‪ .‬ﳝﻜﻦ ﻟﺘﻌﻠﻴﻤﺔ ﻭﺍﺣﺪﺓ ﺃﻥ‬
‫ﺗﻄﺒﻊ ﻋﺪﺓ ﺃﺳﻄﺮ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺣﺮﻭﻑ "ﺍﻟﺴﻄﺮ ﺍﳉﺪﻳﺪ" ﻛﻤﺎ ﻫﻮ ﻣﺒﲔ ﰲ ﺍﻟﺸﻜﻞ ‪ .5-1‬ﻓﻔﻲ ﻛﻞ ﻣﺮﺓ‬
‫ﺗﻈﻬﺮ ﻓﻴﻬﺎ ﺳﻠﺴﻠﺔ ﺍﳍﺮﻭﺏ )‪ (\n‬ﰲ ﻧﺺ ﺍﻟﺴﻠﺴﻠﺔ ﺍﳌﻄﻠﻮﺏ ﻃﺒﺎﻋﺘﻬﺎ‪ ،‬ﻳﺘﻢ ﻭﺿﻊ ﺍﳌﺆﺷﺮ ﰲ ﺑﺪﺍﻳﺔ ﺍﻟﺴﻄﺮ‬
‫ﺍﻟﺘﺎﱄ‪ .‬ﻣﻦ ﺃﺟﻞ ﺍﳊﺼﻮﻝ ﻋﻠﻰ ﺳﻄﺮ ﻓﺎﺭﻍ‪ ،‬ﻧﻘﻮﻡ ﺑﻜﻞ ﺑﺴﺎﻃﺔ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺣﺮﰲ "ﺳﻄﺮ ﺟﺪﻳﺪ" ﺧﻠﻒ‬
‫ﺑﻌﻀﻬﻤﺎ ﺍﻟﺒﻌﺾ‪.‬‬
٥١ C++ ‫ ﻣﻘﺪﻣﺔ ﺣﻮل اﻟﺤﻮاﺳﻴﺐ واﻟﺒﺮﻣﺠﺔ ﺑﻠﻐﺔ‬.1

1. // Fig. 1.5: fig01_05.cpp


2. // Printing multiple lines with a single statement.
3. #include <iostream>
4.
5. // function main begins program execution
6. int main()
7. {
8. std::cout << "Welcome\nto\n\nC++!\n";
9.
10. return 0; // indicate that program ended successfully
11.
12. } // end function main

Welcome
to

C++!

< <ì‚u]æ<cout íÛé×Ãi<Ý]‚~j‰^e<†Ş‰_<ì‚Â<àÚ<ÌÖöÚ<“Þ<íÂ^f<<<V5-1<ØÓÖ]

‫ ﺝﻤﻊ ﻋﺪدیﻦ ﺹﺤﻴﺤﻴﻦ‬:‫ﻣﺜﺎل ﺁﺥﺮ ﺑﺴﻴﻂ‬ 22-1


‫( ﻭﻋﻤﻠﻴﺔ ﺍﻻﺳﺘﺨﺮﺍﺝ ﻣﻦ ﳎﺮﻯ‬input stream object) cin ‫ﻳﺴﺘﺨﺪﻡ ﺑﺮﻧﺎﳎﻨﺎ ﺍﻟﺘﺎﱄ ﻏﺮﺽ ﳎﺮﻯ ﺍﻟﺪﺧﻞ‬
.‫ﺍﻟﺪﺧﻞ >> ﻣﻦ ﺃﺟﻞ ﺍﳊﺼﻮﻝ ﻋﻠﻰ ﻋﺪﺩﻳﻦ ﺻﺤﻴﺤﲔ ﻣﺪﺧﻠﲔ ﻣﻦ ﻗﺒﻞ ﺍﳌﺴﺘﺨﺪﻡ ﺑﻮﺍﺳﻄﺔ ﻟﻮﺣﺔ ﺍﳌﻔﺎﺗﻴﺢ‬
.‫ ﺍﻟﱪﻧﺎﻣﺞ ﻣﻊ ﺧﺮﺟﻪ‬6-1 ‫ ﻳﻮﺿﺢ ﺍﻟﺸﻜﻞ‬.cout ‫ﰒ ﳓﺴﺐ ﳎﻤﻮﻉ ﻗﻴﻤﺘﻴﻬﻤﺎ ﻭﻧﻌﻴﺪ ﺍﻟﻨﺘﻴﺠﺔ ﻣﻦ ﺧﻼﻝ‬

1. // Fig. 1.6: fig01_06.cpp


2. // Addition program.
3. #include <iostream>
4.
5. // function main begins program execution
6. int main()
7. {
8. int integer1; // first number to be input by user
9. int integer2; // second number to be input by user
10. int sum; // variable in which sum will be stored
11.
12. std::cout << "Enter first integer\n"; // prompt
13. std::cin >> integer1; // read an integer
١٤.
15. std::cout << "Enter second integer\n"; // prompt
16. std::cin >> integer2; // read an integer
17.
18. sum = integer1 + integer2; // assignment result to sum

‫اﻟﻔﺼﻞ اﻷول‬ ‫‪٥٢‬‬

‫‪19.‬‬
‫‪20.‬‬ ‫‪std::cout << "Sum is " << sum << std::endl; // print sum‬‬
‫‪21.‬‬
‫‪22.‬‬ ‫;‪return 0‬‬ ‫‪// indicate that program ended successfully‬‬
‫‪23.‬‬
‫‪24. } // end function main‬‬

‫‪Enter first integer‬‬


‫‪٤٥‬‬
‫‪Enter second integer‬‬
‫‪٧٢‬‬
‫‪Sum is 117‬‬

‫]‪< <°vév‘<àè‚Â<Ķ<sÚ^Þ†e<<<V6-1<ØÓÖ‬‬

‫ﻳﻮﺿﺢ ﺍﻟﺘﻌﻠﻴﻖ‬
‫‪// Fig. 1.6: fig01- 06.cpp‬‬
‫‪// Addition Program‬‬
‫ﺍﳍﺪﻑ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ‪ .‬ﺃﻣﺎ ﺳﻄﺮ ﺍﻟﺘﻮﺟﻴﻪ ﳌﺮﺣﻠﺔ ﻣﺎ ﻗﺒﻞ ﺍﻟﺘﺮﲨﺔ‪:‬‬
‫>‪#include <iostream‬‬

‫ﻓﻴﻘﻮﻡ ﺑﺘﻀﻤﲔ ﳏﺘﻮﻯ ﺍﳌﻠﻒ ﺍﻟﺮﺃﺳﻲ ‪ iostream:‬ﺇﱃ ﻣﻠﻒ ﺍﻟﱪﻧﺎﻣﺞ‪ .‬ﻛﻤﺎ ﺑﻴﻨﺎ ﺳﺎﺑﻘﺎﹰ‪ ،‬ﻳﺒﺪﺃ ﺗﻨﻔﻴﺬ ﻛﻞ‬
‫ﺑﺮﻧﺎﻣﺞ ﻣﻦ ﺍﻟﺘﺎﺑﻊ ‪ mian‬ﺣﻴﺚ ﳛﺪﺩ ﺍﻟﻘﻮﺱ ﺍﻟﻜﺒﲑ ﺍﻷﻳﺴﺮ ﺿﻤﻦ ‪ mian‬ﺑﺪﺍﻳﺔ ﺟﺴﻢ ﻫﺬﺍ ﺍﻟﺘﺎﺑﻊ ﻭﳛﺪﺩ‬
‫ﺍﻟﻘﻮﺱ ﺍﻟﻜﺒﲑ ﺍﻷﳝﻦ ﺍﳌﻮﺍﻓﻖ ﻟﻠﻘﻮﺱ ﺍﻟﺴﺎﺑﻖ ﻬﻧﺎﻳﺘﻪ‪.‬‬
‫ﺗﻌﱪ ﺍﻷﺳﻄﺮ ‪:10-8‬‬
‫;‪int integer1‬‬
‫;‪int integer2‬‬
‫;‪int sum‬‬

‫ﻋﻦ ﻃﺮﻳﻘﺔ ﺍﻟﺘﺼﺮﻳﺢ ‪ declaration‬ﻋﻦ ﺍﳌﺘﺤﻮﻻﺕ‪ .‬ﻓﺎﻟﻜﻠﻤﺎﺕ ‪ integer1‬ﻭ‪ integer2‬ﻭ‪ sum‬ﻫﻲ ﻋﺒﺎﺭﺓ ﻋﻦ‬
‫ﺃﲰﺎﺀ ﻣﺘﺤﻮﻻﺕ‪ .‬ﻧﻘﺼﺪ ﺑﺎﳌﺘﺤﻮﻝ ﻋﻤﻠﻴﺔ ﲢﺪﻳﺪ ﻣﻮﺿﻊ ﰲ ﺫﺍﻛﺮﺓ ﺣﻴﺚ ﳝﻜﻦ ﺃﻥ ﳔﺰﻥ ﻓﻴﻪ ﻗﻴﻤﺔ ﻟﻴﺘﻢ‬
‫ﺍﺳﺘﺨﺪﺍﻣﻬﺎ ﻣﻦ ﻗﺒﻞ ﺑﺮﻧﺎﻣﺞ ﻣﺎ‪ .‬ﳜﺼﺺ ﺍﻟﺘﺼﺮﻳﺢ ﺍﻟﺴﺎﺑﻖ ﺍﳌﺘﺤﻮﻻﺕ ‪ integer1‬ﻭ‪ integer2‬ﻭ‪ sum‬ﻋﻠﻰ‬
‫ﺃﻬﻧﺎ ﻣﻌﻄﻴﺎﺕ ﻣﻦ ﺍﻟﻨﻤﻂ ‪ int‬ﻭﻫﺬﺍ ﻳﻌﲏ ﺗﻠﻚ ﺍﳌﺘﺤﻮﻻﺕ ﺳﻮﻑ ﲢﺘﻮﻱ ﻋﻠﻰ ﻗﻴﻢ ﺻﺤﻴﺤﺔ ‪ integer‬ﻣﺜﻞ‬
‫ﺍﻷﻋﺪﺍﺩ‪ .31914, 0, -11, 7 :‬ﳚﺐ ﺍﻟﺘﺼﺮﻳﺢ ﻋﻦ ﻛﻞ ﺍﳌﺘﺤﻮﻻﺕ ﺑﺘﺤﺪﻳﺪ ﺃﲰﺎﺋﻬﺎ ﻭﳕﻂ ﺍﳌﻌﻄﻴﺎﺕ ﺍﻟﱵ‬
‫ﺳﻮﻑ ﲣﺰﻥ ﻓﻴﻬﺎ ﻭﺫﻟﻚ ﻗﺒﻞ ﺃﻥ ﻳﺘﻢ ﺍﺳﺘﺨﺪﺍﻣﻬﺎ ﰲ ﺍﻟﱪﻧﺎﻣﺞ‪ .‬ﳝﻜﻦ ﺍﻟﺘﺼﺮﻳﺢ ﻋﻦ ﻋﺪﺓ ﻣﺘﺤﻮﻻﺕ ﻣﻦ‬
‫ﻧﻔﺲ ﺍﻟﻨﻤﻂ ﺑﻮﺍﺳﻄﺔ ﻋﻤﻠﻴﺔ ﺗﺼﺮﻳﺢ ﻭﺍﺣﺪﺓ ﺃﻭ ﻋﺪﺓ ﻋﻤﻠﻴﺎﺕ ﺗﺼﺮﻳﺢ‪ .‬ﻛﺎﻥ ﺑﺈﻣﻜﺎﻧﻨﺎ ﻛﺘﺎﺑﺔ ﻋﻤﻠﻴﺔ ﺗﺼﺮﻳﺢ‬
‫ﻭﺍﺣﺪﺓ ﻟﻠﻤﺘﺤﻮﻻﺕ ﺍﳌﺬﻛﻮﺭﺓ ﺃﻋﻼﻩ ﺍﺧﺘﺼﺎﺭﹰﺍ‪:‬‬
‫;‪int integer1, int integer2, int sum‬‬
‫‪٥٣‬‬ ‫‪ .1‬ﻣﻘﺪﻣﺔ ﺣﻮل اﻟﺤﻮاﺳﻴﺐ واﻟﺒﺮﻣﺠﺔ ﺑﻠﻐﺔ ‪C++‬‬

‫ﳚﻌﻞ ﺫﻟﻚ ﺍﻟﱪﻧﺎﻣﺞ ﺃﻗﻞ ﻗﺎﺑﻠﻴﺔ ﻟﻠﻘﺮﺍﺀﺓ ﻭﳝﻨﻌﻨﺎ ﻣﻦ ﻛﺘﺎﺑﺔ ﺍﻟﺘﻌﻠﻴﻘﺎﺕ ﺍﻟﱵ ﺗﺼﻒ ﺍﻟﻐﺎﻳﺔ ﻣﻦ ﻛﻞ ﻣﺘﺤﻮﻝ‬
‫ﺿﻤﻦ ﺍﻟﱪﻧﺎﻣﺞ‪ .‬ﺇﺫﺍ ﺟﺮﻯ ﺍﻟﺘﺼﺮﻳﺢ ﻋﻦ ﺃﻛﺜﺮ ﻣﻦ ﻣﺘﺤﻮﻝ ﻭﺍﺣﺪ ﺿﻤﻦ ﻧﻔﺲ ﺳﻄﺮ ﺍﻟﺘﺼﺮﻳﺢ ﺍﻟﻮﺍﺣﺪ‬
‫)ﻛﻤﺎ ﻫﻮ ﻣﺒﲔ ﺃﻋﻼﻩ( ﻓﺈﻧﻪ ﳚﺐ ﺍﻟﻔﺼﻞ ﺑﲔ ﺃﲰﺎﺀ ﺍﳌﺘﺤﻮﻻﺕ ﺑﻔﻮﺍﺻﻞ )‪ (,‬ﻭﺗﺴﻤﻰ ﺑﻘﺎﺋﻤﺔ ﺍﻷﲰﺎﺀ‬
‫ﺍﳌﻔﺼﻮﻟﺔ ﺑﻔﻮﺍﺻﻞ ‪.Comma- Separated list‬‬
‫ﻋﺎدات ﺑﺮﻣﺠﻴﺔ ﺝﻴﺪة‬ ‫‪8-1‬‬

‫یﻔﻀﻞ ﺑﻌﺾ اﻟﻤﺒﺮﻣﺠﻴﻦ اﻟﺘﺼﺮیﺢ ﻋﻦ آﻞ ﻣﺘﺤﻮل ﺿﻤﻦ ﺳﻄﺮ ﻣﻨﻔﺼﻞ‪.‬‬


‫ﺕﺴﺎﻋﺪ هﺬﻩ اﻟﺼﻴﻐﺔ ﻋﻠﻰ ﺳﻬﻮﻟﺔ إﺿﺎﻓﺔ ﺕﻌﻠﻴﻖ إﻟﻰ ﺝﺎﻧﺐ آﻞ ﺕﺼﺮیﺢ‪.‬‬

‫ﺳﻮﻑ ﻧﻨﺎﻗﺶ ﻓﻴﻤﺎ ﻳﻠﻲ ﺃﳕﺎﻁ ﺍﳌﻌﻄﻴﺎﺕ ‪) double‬ﻣﻦ ﺃﺟﻞ ﺍﻟﺘﻌﺎﻣﻞ ﻣﻊ ﺍﻷﻋﺪﺍﺩ ﺍﳊﻘﻴﻘﻴﺔ ﺃﻱ ﺍﻷﻋﺪﺍﺩ ﺍﻟﱵ‬
‫ﲢﺘﻮﻱ ﻋﻠﻰ ﺃﺟﺰﺍﺀ ﻋﺸﺮﻳﺔ ﻣﺜﻞ‪ ( -11.19, 0.0, 3.4 :‬ﻭ‪) char‬ﻣﻦ ﺃﺟﻞ ﺍﻟﺘﻌﺎﻣﻞ ﻣﻊ ﺍﳊﺮﻭﻑ؛ ﳝﻜﻦ ﳌﺘﺤﻮﻝ‬
‫ﻣﻦ ﳕﻂ ‪ char‬ﺃﻥ ﳛﻮﻱ ﻋﻠﻰ ﺣﺮﻑ ﻭﺍﺣﺪ ﺻﻐﲑ ـ ﺑﺎﻟﻨﺴﺒﺔ ﻟﻠﺤﺮﻭﻑ ﺍﻟﻼﺗﻴﻨﻴﺔ ـ ﺃﻭ ﺣﺮﻑ ﻭﺍﺣﺪ ﻛﺒﲑ‬
‫ﺃﻭ ﻋﻠﻰ ﺍﻷﺭﻗﺎﻡ ﻣﻦ ‪ 0‬ﺇﱃ ‪ 9‬ﺃﻭ ﻋﻠﻰ ﺃﺣﺪ ﺍﳊﺮﻭﻑ ﺍﳋﺎﺻﺔ ﻣﺜﻞ *‪.......$ ،‬ﻭﻏﲑﻫﺎ(‪.‬‬
‫ﻋﺎدات ﺑﺮﻣﺠﻴﺔ ﺝﻴﺪة‬ ‫‪9-1‬‬

‫ﺿﻊ ﻓﺮاﻏًﺎ ﺑﻌﺪ آﻞ إﺵﺎرة ﻓﺎﺹﻠﺔ )‪ (,‬ﻟﻴﺼﺒﺢ اﻟﺒﺮﻧﺎﻣﺞ أآﺜﺮ ﻗﺎﺑﻠﻴﺔ ﻟﻠﻘﺮاءة‪.‬‬

‫ﳝﻜﻦ ﻻﺳﻢ ﺍﳌﺘﺤﻮﻝ ﺃﻥ ﻳﻜﻮﻥ ﺃﻱ ﻣُﻌﺮﻑ ‪ identifier‬ﺻﺤﻴﺢ‪ .‬ﻧﻘﺼﺪ ﺑﺎﳌﹸﻌﺮﻑ ﺍﻟﺼﺤﻴﺢ ﺃﻳﺔ ﳎﻤﻮﻋﺔ‬
‫ﻻﺗﺒﺪﺃ ﺑﺮﻗﻢ ﻭﺗﺘﺄﻟﻒ ﻣﻦ ﺃﻱ ﻋﺪﺩ ﻣﻦ ﺍﳊﺮﻭﻑ ﻭﺍﻷﺭﻗﺎﻡ ﻭﺇﺷﺎﺭﺍﺕ ﲢﺖ ﺍﻟﺴﻄﺮ )‪ .(-‬ﲤﺴﺢ ﻟﻐﺔ ‪C++‬‬

‫ﺑﺎﺳﺘﺨﺪﺍﻡ ﻣُﻌﺮﻓﺎﺕ ﻣﻦ ﺃﻱ ﻃﻮﻝ ﻛﺎﻥ ﻟﻜﻦ ﳝﻜﻦ ﻟﻠﻨﻈﺎﻡ ﺍﻟﺬﻱ ﺗﻌﻤﻞ ﲢﺘﻪ ﺃﻭ ﻟﻨﺴﺨﻪ ‪ C++‬ﺍﳌﺴﺘﺨﺪﻣﺔ‬
‫ﺃﻥ ﻳﻔﺮﺿﺎ ﻧﻮﻋﹰﺎ ﻣﻦ ﺍﻟﺘﺤﺪﻳﺪ ﻟﻄﻮﻝ ﺍﳌﻌﺮﻓﺎﺕ‪.‬‬
‫ﳚﺐ ﺍﻻﻧﺘﺒﺎﻩ ﺃﻥ ﻟﻐﺔ ‪ C++‬ﺗﺘﺤﺴﺲ ﳊﺎﻟﺔ ﺍﳊﺮﻭﻑ ‪ ،case sensitive‬ﺃﻱ ﺃﻥ ﺍﳊﺮﻭﻑ ﺍﻟﻼﺗﻴﻨﻴﺔ ﺍﻟﻜﺒﲑﺓ‬
‫ﻭﺍﻟﺼﻐﲑﺓ ﻫﻲ ﺣﺮﻭﻑ ﳐﺘﻠﻔﺔ ﻓﺈﺫﺍ ﻛﺘﺒﻨﺎ ‪ a1‬ﻭ‪ A1‬ﻓﻬﻤﺎ ﺗﻌﱪﺍﻥ ﻋﻦ ﻣﻌﺮﻓﲔ ﳐﺘﻠﻔﲔ‪.‬‬
‫ﺗﻠﻤﻴﺢ ﻟﺘﺤﺴﻴﻦ اﻟﻤﺤﻤﻮﻟﻴﺔ‬ ‫‪4-1‬‬

‫ﺕﺴﻤﺢ ﻟﻐﺔ ‪ C++‬ﺑﺎﺳﺘﺨﺪام ﻣﻌﺮﻓﺎت ﻣﻦ أي ﻃﻮل‪ ،‬ﻟﻜﻦ یﻤﻜﻦ ﻟﻨﻈﺎم‬


‫اﻻﺳﺘﺜﻤﺎر اﻟﻤﺴﺘﺨﺪم أو ﻟﻨﺴﺨﺔ ﻣﺘﺮﺝﻢ ﻟﻐﺔ ‪ C++‬أن یﻔﺮﺿﺎ ﺑﻌﺾ اﻟﺤﺪود‪.‬‬
‫ﻗﻢ ﺑﺎﺳﺘﺨﺪام ﻣﻌﺮﻓﺎت ذات ﻃﻮل ﻻ یﺘﺠﺎوز اﻟﻮاﺣﺪ واﻟﺜﻼﺛﻴﻦ ﺣﺮﻓًﺎ ﻟﺘﺤﺴﻴﻦ‬
‫اﻟﻤﺤﻤﻮﻟﻴﺔ‪.‬‬

‫ﻋﺎدات ﺑﺮﻣﺠﻴﺔ ﺝﻴﺪة‬ ‫‪10-1‬‬

‫إن اﺥﺘﻴﺎر أﺳﻤﺎء ﻣﻌﺒﺮة ﻟﻠﻤﺘﺤﻮﻻت اﻟﻤﺴﺘﺨﺪﻣﺔ یﻤﻜﻦ أن یﺠﻌﻞ اﻟﺒﺮﻧﺎﻣﺞ‬


‫أآﺜﺮ ﺕﻌﺒﻴﺮًا ﻋﻦ ﻣﻀﻤﻮﻧﻪ أي أﻧﻪ یﺼﺒﺢ أآﺜﺮ ﺳﻬﻮﻟﺔ ﻟﻠﻔﻬﻢ ﺑﻤﺠﺮد ﻗﺮاءﺕﻪ‬
‫اﻟﻔﺼﻞ اﻷول‬ ‫‪٥٤‬‬

‫ﻻ ﻣﻦ اﻟﺮﺝﻮع إﻟﻰ اﻟﻤﺮاﺝﻊ أو اﺳﺘﺨﺪام ﺕﻌﻠﻴﻘﺎت زاﺋﺪة ﻋﻦ اﻟﺤﺪ‪.‬‬


‫ﺑﺪ ً‬

‫ﻋﺎدات ﺑﺮﻣﺠﻴﺔ ﺝﻴﺪة‬ ‫‪11-1‬‬

‫ﺕﺠﻨﺐ اﺳﺘﺨﺪام اﻟﻤُﻌﺮﻓﺎت اﻟﺘﻲ ﺕﺒﺪأ ﺑﺄﺵﺎرة ﺕﺤﺖ اﻟﺴﻄﺮ )‪ (-‬ﻷﻧﻪ یﻤﻜﻦ‬
‫ﻟﻠﻤﺘﺮﺝﻢ أن یﺴﺘﺨﺪم أﺳﻤﺎء ﻣﺸﺎﺑﻬﺔ ﻣﻦ ﺥﻼل ﻋﻤﻠﻪ ﻣﻤﺎ یﺴﺎﻋﺪك ﻋﻠﻰ‬
‫ﺕﺠﺎوز أي ﻣﺸﻜﻠﺔ ﺥﻠﻂ ﺑﻴﻦ اﻷﺳﻤﺎء اﻟﺘﻲ ﺕﺴﺘﺨﺪﻣﻬﺎ أو ﺕﻠﻚ اﻟﺘﻲ یﺴﺘﺨﺪﻣﻬﺎ‬
‫اﻟﻤﺘﺮﺝﻢ‪.‬‬

‫ﳝﻜﻦ ﻭﺿﻊ ﺍﻟﺘﺼﺮﳛﺎﺕ ﰲ ﺃﻱ ﻣﻜﺎﻥ ﰲ ﺟﺴﻢ ﺍﻟﺘﺎﺑﻊ‪ .‬ﻟﻜﻦ ﻋﻠﻰ ﻛﺎﻓﺔ ﺍﻷﺣﻮﺍﻝ‪ ،‬ﳚﺐ ﺃﻥ ﻳﻈﻬﺮ‬
‫ﺍﻟﺘﺼﺮﻳﺢ ﻋﻦ ﺍﳌﺘﺤﻮﻝ ﻗﺒﻞ ﺍﺳﺘﺨﺪﺍﻣﻪ ﰲ ﺍﻟﱪﻧﺎﻣﺞ‪ .‬ﻓﻌﻠﻰ ﺳﺒﻴﻞ ﺍﳌﺜﺎﻝ‪ ،‬ﳝﻜﻦ ﰲ ﺑﺮﻧﺎﻣﺞ ﺍﻟﺸﻜﻞ ‪،6-1‬‬
‫ﺍﺳﺘﺨﺪﺍﻡ ﺛﻼﺙ ﺗﺼﺮﳛﺎﺕ ﺑﺪ ﹰﻻ ﻣﻦ ﺍﺳﺘﺨﺪﺍﻡ ﺗﺼﺮﻳﺢ ﻭﺍﺣﺪ ﻋﻠﻰ ﺍﻟﺸﻜﻞ ﺍﻟﺘﺎﱄ‪:‬‬
‫ﳝﻜﻦ ﻭﺿﻊ ﺍﻟﺘﺼﺮﻳﺢ‪:‬‬
‫;‪int integer1‬‬

‫ﻣﺒﺎﺷﺮﺓ ﻗﺒﻞ ﺍﻟﺴﻄﺮ‪:‬‬


‫;‪std::cin >> integer1‬‬

‫ﻭﳝﻜﻦ ﻭﺿﻊ ﺍﻟﺘﺼﺮﻳﺢ‪:‬‬


‫;‪int integer2‬‬

‫ﻣﺒﺎﺷﺮﺓ ﻗﺒﻞ ﺍﻟﺴﻄﺮ‪:‬‬


‫;‪std::cin >> integer2‬‬

‫ﻭﳝﻜﻦ ﺃﺧﲑﹰﺍ ﻭﺿﻊ ﺍﻟﺘﺼﺮﻳﺢ‪:‬‬


‫;‪int sum‬‬

‫ﻣﺒﺎﺷﺮﺓ ﻗﺒﻞ ﺍﻟﺴﻄﺮ‪:‬‬


‫;‪sum = integer1 + integer2‬‬

‫ﻋﺎدات ﺑﺮﻣﺠﻴﺔ ﺝﻴﺪة‬ ‫‪12-1‬‬

‫ﺿﻊ داﺋﻤًﺎ ﺳﻄﺮًا ﻓﺎرﻏًﺎ ﻗﺒﻞ أي ﺕﺼﺮیﺢ ﻣﻮﺝﻮد ﺿﻤﻦ ﻣﺠﻤﻮﻋﺔ ﻣﻦ‬
‫اﻟﺘﻌﻠﻴﻤﺎت ﻓﻬﺬا یﺠﻌﻞ ﻣﻦ اﻟﺘﺼﺮیﺤﺎت ﻇﺎهﺮة ﻧﺺ اﻟﺒﺮﻧﺎﻣﺞ ویﺴﺎهﻢ‬
‫ﺑﺎﻟﺘﺎﻟﻲ ﻓﻲ وﺿﻮح ﻧﺺ اﻟﺒﺮﻧﺎﻣﺞ‪.‬‬

‫ﻋﺎدات ﺑﺮﻣﺠﻴﺔ ﺝﻴﺪة‬ ‫‪13-1‬‬

‫إذا آﻨﺖ ﺕﻔﻀﻞ وﺿﻊ اﻟﺘﺼﺮیﺤﺎت ﻓﻲ ﺑﺪایﺔ ﺝﺴﻢ اﻟﺘﺎﺑﻊ‪ ،‬إﻓﺼﻞ ﺑﻴﻨﻬﺎ وﺑﻴﻦ‬
‫ﻣﺠﻤﻮﻋﺔ اﻟﺘﻌﻠﻴﻤﺎت اﻟﻤﻮﺝﻮدة ﺿﻤﻦ اﻟﺘﺎﺑﻊ ﺑﻮاﺳﻄﺔ ﺳﻄﺮ ﻓﺎرغ ﻣﻦ أﺝﻞ‬
‫إﻇﻬﺎر ﻧﻘﻄﺔ ﻧﻬﺎیﺔ اﻟﺘﺼﺮیﺤﺎت وﻧﻘﻄﺔ ﺑﺪایﺔ اﻟﺘﻌﻠﻴﻤﺎت‪.‬‬
‫‪٥٥‬‬ ‫‪ .1‬ﻣﻘﺪﻣﺔ ﺣﻮل اﻟﺤﻮاﺳﻴﺐ واﻟﺒﺮﻣﺠﺔ ﺑﻠﻐﺔ ‪C++‬‬

‫ﺗﻘﻮﻡ ﺍﻟﺘﻌﻠﻴﻤﺔ ﰲ ﺍﻟﺴﻄﺮ ﺍﻟﺜﺎﱐ ﻋﺸﺮ‪:‬‬


‫‪std::cout << "Enter first integer\n"; // Prompt‬‬

‫ﺑﻄﺒﺎﻋﺔ ﺍﳉﻤﻠﺔ ‪ Enter first integer‬ﻋﻠﻰ ﺍﻟﺸﺎﺷﺔ ﻟﻴﻘﻒ ﺍﳌﺆﺷﺮ ﺑﻌﺪﻫﺎ ﰲ ﺑﺪﺍﻳﺔ ﺍﻟﺴﻄﺮ ﺍﻟﺘﺎﱄ‪ .‬ﻫﺬﻩ ﺍﻟﺮﺳﺎﻟﺔ‬
‫ﻫﻲ ﻋﺒﺎﺭﺓ ﻋﻦ ﺇﺷﺎﺭﺓ ﺟﺎﻫﺰﻳﺔ ‪ prompt‬ﻷﻬﻧﺎ ﲣﱪ ﺍﳌﺴﺘﺨﺪﻡ ﲜﺎﻫﺰﻳﺔ ﺍﻟﱪﻧﺎﻣﺞ ﻟﺘﻘﺒﻞ ﺍﻟﻘﻴﺎﻡ ﺑﻔﻌﻞ ﻣﻌﲔ‪.‬‬
‫ﻳﻔﻀﻞ ﺃﻥ ﺗﻘﺮﺃ ﺍﻟﺘﻌﻠﻴﻤﺔ ﺍﻟﺴﺎﺑﻘﺔ ﻋﻠﻰ ﺍﻟﺸﻜﻞ ﺍﻟﺘﺎﱄ‪" :‬ﻳﺄﺧﺬ ‪ cout‬ﺳﻠﺴﻠﺔ ﺍﳊﺮﻭﻑ ‪."Enter first integer\n‬‬
‫ﺗﺴﺘﺨﺪﻡ ﺍﻟﺘﻌﻠﻴﻤﺔ ﰲ ﺍﻟﺴﻄﺮ ﺍﻟﺜﺎﻟﺚ ﻋﺸﺮ‪:‬‬
‫;‪std::cin >> integer1‬‬

‫ﻏﺮﺽ ﳎﺮﻯ ﺍﻟﺪﺧﻞ ;‪ (cin) input stream object‬ﺍﻟﺘﺎﺳﻊ ﻟﻔﻀﺎﺀ ﺍﻷﲰﺎﺀ ‪ std‬ﻭﻋﻤﻠﻴﺔ ﺍﻻﺳﺘﺨﺮﺍﺝ ﻣﻦ‬
‫ﳎﺮﻯ ﺍﻟﺪﺧﻞ )>>( ‪ stream extraction operator‬ﻣﻦ ﺃﺟﻞ ﺍﳊﺼﻮﻝ ﻋﻠﻰ ﺍﻟﻘﻴﻤﺔ ﺍﳌﹸﺪﺧﻠﺔ ﻣﻦ ﻗﺒﻞ‬
‫ﺍﳌﺴﺘﺨﺪﻡ‪ .‬ﻳﺄﺧﺬ ﺍﺠﻤﻟﺮﻯ ‪ cin‬ﺩﺧﻠﻪ ﻋﺎﺩ ﹰﺓ ﻣﻦ ﻟﻮﺣﺔ ﺍﳌﻔﺎﺗﻴﺢ ﻭﻳﻔﻀﻞ ﻗﺮﺍﺀﺓ ﺍﻟﺘﻌﻠﻴﻤﺔ ﺍﻟﺴﺎﺑﻘﺔ ﻋﻠﻰ ﺍﻟﺸﻜﻞ‬
‫ﺍﻟﺘﺎﱄ‪" :‬ﻳﻌﻄﻲ ‪ std::cin‬ﺍﻟﻘﻴﻤﺔ ﺍﳌﹸﺪﺧﻠﺔ ﺇﱃ ﺍﳌﺘﺤﻮﻝ ‪."integer1‬‬
‫ﻋﻨﺪﻣﺎ ﻳﻨﻔﺬ ﺍﳊﺎﺳﺐ ﺍﻟﺘﻌﻠﻴﻤﺔ ﺍﻟﺴﺎﺑﻘﺔ ﻓﺈﻧﻪ ﻳﻨﺘﻈﺮ ﺍﳌﺴﺘﺨﺪﻡ ﺣﱴ ﻳﻘﻮﻡ ﺑﺈﺩﺧﺎﻝ ﻗﻴﻤﺔ ﻟﻠﻤﺘﺤﻮﻝ ‪.integer1‬‬
‫ﻳﺴﺘﺠﻴﺐ ﺍﳌﺴﺘﺨﺪﻡ ﻟﻠﺘﻌﻠﻴﻤﺔ ﺍﻟﺴﺎﺑﻘﺔ ﻟﻜﺘﺎﺑﺔ ﻋﺪﺩ ﺻﺤﻴﺢ ﰒ ﺑﻜﺒﺲ ﺯﺭ ﺍﻹﺩﺧﺎﻝ ‪) return key‬ﻭﻧﺴﻤﻴﻪ‬
‫ﺃﺣﻴﺎﻧﹰﺎ ‪ (enter key‬ﻣﻦ ﺃﺟﻞ ﺇﺭﺳﺎﻝ ﺍﻟﻌﺪﺩ ﺇﱃ ﺍﳊﺎﺳﺐ‪ .‬ﺑﻌﺪﻫﺎ ﻳﻘﻮﻡ ﺍﳊﺎﺳﺐ ﺑﺈﺳﻨﺎﺩ ﻫﺬﺍ ﺍﻟﻌﺪﺩ ﺃﻭ‬
‫ﻗﻴﻤﺘﻪ ﺇﱃ ﺍﳌﺘﺤﻮﻝ ‪ .integer1‬ﻭﻳﺮﻣﺰ ﺃﻱ ﻭﺭﻭﺩ ﻟﻠﻤﺘﺤﻮﻝ ‪ integer1‬ﺿﻤﻦ ﻧﺺ ﺍﻟﱪﻧﺎﻣﺞ ﻻﺳﺘﺨﺪﺍﻡ‬
‫ﺍﻟﻘﻴﻤﺔ ﺍﻟﺴﺎﺑﻘﺔ‪.‬‬
‫ﺗﺴﺎﻋﺪ ﺍﻷﻏﺮﺍﺽ ‪ std::cin‬ﻭ ‪ std::cout‬ﻋﻠﻰ ﺍﻟﺘﻔﺎﻋﻞ ﻣﺎ ﺑﲔ ﺍﳌﺴﺘﺨﺪﻡ ﻭﺍﳊﺎﺳﺐ‪ .‬ﻭﻋﻠﻰ ﺍﻋﺘﺒﺎﺭ ﺃﻥ ﻫﺬﺍ‬
‫ﺍﻟﺘﻔﺎﻋﻞ ﻳﺸﺒﻪ ﻋﻤﻠﻴﺔ ﺍﳊﻮﺍﺭ ﻟﺬﻟﻚ ﻧﺴﻤﻴﻪ ﺃﺣﻴﺎﻧﹰﺎ "ﺑﺎﻟﱪﳎﺔ ﺍﻟﺘﺨﺎﻃﺒﻴﺔ" ‪.interactive computing‬‬
‫ﺗﻄﺒﻊ ﺍﻟﺘﻌﻠﻴﻤﺔ ﰲ ﺍﻟﺴﻄﺮ ‪:15‬‬
‫‪std::cout << "Enter second integer\n"; //prompt‬‬

‫ﺍﻟﺮﺳﺎﻟﺔ ‪ Enter second integer‬ﻋﻠﻰ ﺍﻟﺸﺎﺷﺔ ﻟﻴﻘﻒ ﺍﳌﺆﺷﺮ ﺑﻌﺪﻫﺎ ﰲ ﺑﺪﺍﻳﺔ ﺍﻟﺴﻄﺮ ﺍﻟﺘﺎﱄ‪.‬‬
‫ﺗﻌﱪ ﺍﻟﺘﻌﻠﻴﻤﺔ ﺍﻟﺴﺎﺑﻘﺔ ﻋﻦ ﺍﳉﺎﻫﺰﻳﺔ ﻟﺘﻘﺒﻞ ﻓﻌﻞ ﳏﺪﺩ‪ .‬ﰲ ﺣﲔ ﺗﺴﺎﻋﺪ ﺍﻟﺘﻌﻠﻴﻤﺔ ﰲ ﺍﻟﺴﻄﺮ ‪:16‬‬
‫‪std::cin >> integer2; //read on integer‬‬

‫ﻋﻠﻰ ﺍﳊﺼﻮﻝ ﻋﻠﻰ ﺍﻟﻘﻴﻤﺔ ﺍﳌﹸﺪﺧﻠﺔ ﻣﻦ ﻗﺒﻞ ﺍﳌﺴﺘﺨﺪﻡ ﻟﻠﻤﺘﺤﻮﻝ ‪.integer2‬‬


‫ﺗﻘﻮﻡ ﺍﻟﺘﻌﻠﻴﻤﺔ ﰲ ﺍﻟﺴﻄﺮ ‪:18‬‬
‫‪sum = integer1 + integer2; //assignment of sum‬‬

‫ﲝﺴﺎﺏ ﳎﻤﻮﻉ ﻗﻴﻤﱵ ﺍﳌﺘﺤﻮﻟﲔ ‪ integer1‬ﻭ ‪ integer2‬ﻭﺑﺈﺳﻨﺎﺩ ﻧﺘﻴﺠﺔ ﺍﺠﻤﻟﻤﻮﻉ ﻟﻠﻤﺘﺤﻮﻝ ‪ sum‬ﺑﺎﺳﺘﺨﺪﺍﻡ‬
‫ﻋﻤﻠﻴﺔ ﺍﻹﺳﻨﺎﺩ )=(‪ .‬ﳝﻜﻦ ﻗﺮﺍﺀﺓ ﺍﻟﺘﻌﻠﻴﻤﺔ ﺍﻟﺴﺎﺑﻘﺔ ﻋﻠﻰ ﺍﻟﺸﻜﻞ ﺍﻟﺘﺎﱄ‪" :‬ﻳﺄﺧﺬ ﺍﳌﺘﺤﻮﻝ ‪ sum‬ﻗﻴﻤﺔ ﺍﺠﻤﻟﻤﻮﻉ‬
‫‪ ."integer1+integer2‬ﺗﺘﻢ ﻣﻌﻈﻢ ﺍﳊﺴﺎﺑﺎﺕ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺗﻌﻠﻴﻤﺎﺕ ﺍﻹﺳﻨﺎﺩ‪ .‬ﺗﺴﻤﻰ ﺍﻟﻌﻤﻠﻴﺘﺎﻥ )=( ﻭ )‪(+‬‬
‫ﻼ ﻣﻨﻬﺎ ﳛﺘﺎﺝ ﺇﱃ ﻣﻌﺎﻣﻠﲔ ‪ .two operands‬ﻓﻔﻲ ﺣﺎﻟﺔ‬ ‫"ﺑﻌﻤﻠﻴﺘﲔ ﺛﻨﺎﺋﻴﺘﲔ" ‪ binary operators‬ﻷﻥ ﻛ ﹰ‬
‫اﻟﻔﺼﻞ اﻷول‬ ‫‪٥٦‬‬

‫ﺍﻟﻌﻤﻠﻴﺔ )‪ (+‬ﻳﺸﻜﻞ ﺍﳌﺘﺤﻮﻻﻥ ‪ integer2,integer1‬ﺍﳌﻌﺎﻣﻠﲔ ﺍﳋﺎﺻﲔ ﻬﺑﺎ ﺃﻣﺎ ﰲ ﺣﺎﻝ ﺍﻟﻌﻤﻠﻴﺔ )=(‪،‬‬
‫ﻓﻴﺸﻜﻞ ﺍﳌﺘﺤﻮﻝ ‪ sum‬ﻭﻗﻴﻤﺔ ﺍﻟﻌﺒﺎﺭﺓ ‪ integer1+integer2‬ﺍﳌﻌﺎﻣﻠﲔ ﺍﳋﺎﺻﲔ ﺑﺘﻠﻚ ﺍﻟﻌﻤﻠﻴﺔ‪.‬‬
‫ﻋﺎدات ﺑﺮﻣﺠﻴﺔ ﺝﻴﺪة‬ ‫‪14-1‬‬

‫ﺿﻊ ﻓﺮاﻏًﺎ ﻋﻠﻰ ﻃﺮﻓﻲ آﻞ ﻋﻤﻠﻴﺔ ﺛﻨﺎﺋﻴﺔ‪ .‬ﻣﻤﺎ یﺒﺮز هﺬﻩ اﻟﻌﻤﻠﻴﺔ ویﺠﻌﻞ‬
‫اﻟﺒﺮﻧﺎﻣﺞ أآﺜﺮ ﻗﺎﺑﻠﻴﺔ ﻟﻠﻘﺮاءة‪.‬‬

‫ﺗﻘﻮﻡ ﺍﻟﺘﻌﻠﻴﻤﺔ ﰲ ﺍﻟﺴﻄﺮ ‪:20‬‬


‫‪std::cout << "sum is " << sum << std::endl; //print sum‬‬

‫‪std::endl‬‬ ‫ﺑﻄﺒﺎﻋﺔ ﺳﻠﺴﻠﺔ ﺍﳊﺮﻭﻑ ‪ sum is‬ﻣﺘﺒﻮﻋﺔ ﺑﺎﻟﻘﻴﻤﺔ ﺍﻟﻌﺪﺩﻳﺔ ﻟﻠﻤﺘﺤﻮﻝ ‪ sum‬ﺍﳌﺘﺒﻮﻋﺔ ﺑﺪﻭﺭﻫﺎ ﺑـ‬
‫)ﺍﺧﺘﺼﺎﺭ ﳊﺮﻑ ﻬﻧﺎﻳﺔ ﺍﻟﺴﻄﺮ ”‪ “end line‬ﺍﻟﺘﺎﺑﻊ ﻟﻔﻀﺎﺀ ﺍﻷﲰﺎﺀ ‪ (std‬ﺍﻟﱵ ﻧﺴﻤﻴﻬﺎ ؛ "ﻣﺘﺤﻜﻢ ﺑﺎﺠﻤﻟﺮﻯ"‬
‫‪ .stream manipulator‬ﻳﻘﻮﻡ ﺍﳌﺘﺤﻜﻢ ‪ std::endl‬ﺑﺈﺧﺮﺍﺝ "ﻬﻧﺎﻳﺔ ﺳﻄﺮ" ﻭﺇﻓﺮﺍﻍ ﳐﺰﻥ ﺍﳋﺮﺝ ‪output‬‬

‫‪ .buffer‬ﻫﺬﺍ ﻳﻌﲏ ﺃﻧﻪ ﺑﺎﻟﻨﺴﺒﺔ ﻟﺒﻌﺾ ﺍﻷﻧﻈﻤﺔ ﺣﻴﺚ ﻳﺘﻢ ﲡﻤﻴﻊ ﻋﻤﻠﻴﺎﺕ ﺍﳋﺮﺝ ﰲ ﳐﺰﻥ ﺣﱴ ﻳﺼﻞ‬
‫ﻣﺴﺘﻮﺍﻫﺎ ﺇﱃ ﺣﺪ ﻳﺴﺘﺤﻖ ﻋﻨﺎﺀ ﺍﻟﻘﻴﺎﻡ ﺑﻄﺒﺎﻋﺘﻬﺎ ﻋﻠﻰ ﺍﻟﺸﺎﺷﺔ‪ ،‬ﻓﺈﻥ ‪ std::endl‬ﺗﻮﻗﻒ ﻋﻤﻠﻴﺔ ﺍﻟﺘﺠﻤﻴﻊ‬
‫ﻭﲣﺮﺝ ﻛﻞ ﻣﺎ ﰎ ﲡﻤﻴﻌﻪ ﻟﻴﻄﺒﻊ ﻋﻠﻰ ﺍﻟﺸﺎﺷﺔ ﻓﻮﺭﹰﺍ ﺩﻭﻥ ﺃﻱ ﺍﻧﺘﻈﺎﺭ‪.‬‬
‫ﻻﺣﻆ ﺃﻥ ﺍﻟﺘﻌﻠﻴﻤﺔ ﺍﻟﺴﺎﺑﻘﺔ ﺗﺴﺘﺨﺪﻡ ﻋﺪﺓ ﻗﻴﻢ ﻣﻦ ﻋﺪﺓ ﺃﻧﻮﺍﻉ‪ .‬ﻓﻌﻤﻠﻴﺔ ﺍﻹﺩﺧﺎﻝ ﰲ ﳎﺮﻯ ﺍﳋﺮﺝ ﺗﻌﺮﻑ‬
‫ﲤﺎﻣﹰﺎ ﻛﻴﻒ ﳚﺐ ﺇﺧﺮﺍﺝ ﻛﻞ ﺟﺰﺀ ﻣﻦ ﺍﳌﻌﻄﻴﺎﺕ‪ .‬ﻧﺴﻤﻲ ﻋﻤﻠﻴﺔ ﺍﺳﺘﺨﺪﺍﻡ ﻋﺪﺓ ﻋﻤﻠﻴﺎﺕ ﺇﺩﺧﺎﻝ ﰲ‬
‫ﳎﺮﻯ )<<( ﺿﻤﻦ ﺗﻌﻠﻴﻤﺔ ﻭﺍﺣﺪﺓ ﺑﻌﻤﻠﻴﺔ "ﺩﻣﺞ ﻋﻤﻠﻴﺎﺕ ﺍﻹﺩﺧﺎﻝ ﰲ ﳎﺮﻯ ﺍﳋﺮﺝ ‪concatenating‬‬

‫‪ "stream insertion operations‬ﻟﺬﻟﻚ ﻟﻴﺲ ﻣﻦ ﺍﻟﻀﺮﻭﺭﻱ‪ ،‬ﺍﺳﺘﺨﺪﺍﻡ ﺗﻌﻠﻴﻤﺎﺕ ﺧﺮﺝ ﻹﻇﻬﺎﺭ ﻛﻞ ﻧﻮﻉ‬
‫ﻣﻦ ﺃﻧﻮﺍﻉ ﺍﳌﻌﻄﻴﺎﺕ‪.‬‬
‫ﳝﻜﻦ ﺍﻟﻘﻴﺎﻡ ﺑﺎﳊﺴﺎﺑﺎﺕ ﰲ ﺗﻌﻠﻴﻤﺎﺕ ﺍﳋﺮﺝ ﺃﻳﻀﺎﹰ‪ ،‬ﺃﻱ ﳝﻜﻦ ﺃﻥ ﺗﱪﻣﺞ ﺍﻟﺘﻌﻠﻴﻤﺘﺎﻥ ﺍﻟﺴﺎﺑﻘﺘﺎﻥ ﺑﺘﻌﻠﻴﻤﺔ‬
‫ﻭﺍﺣﺪﺓ ﻫﻲ‪:‬‬
‫;‪std::cout << "sum is " << integer1+integer2 << std::endl‬‬

‫ﳜﱪ ﺍﻟﻘﻮﺱ ﺍﻟﻜﺒﲑ ﺍﻷﳝﻦ )}( ﺍﳊﺎﺳﺐ ﺑﺎﻟﻮﺻﻮﻝ ﺇﱃ ﻬﻧﺎﻳﺔ ﺍﻟﺘﺎﺑﻊ ‪.mian‬‬
‫ﺗُﻌﺪ ﺍﻟﻘﺪﺭﺓ ﻋﻠﻰ ﺑﻨﺎﺀ ﺑﲎ ﻟﻠﻤﻌﻄﻴﺎﺕ ﺧﺎﺻﺔ ﺑﺎﳌﺴﺘﺨﺪﻡ ﻫﻲ ﺇﺣﺪﻯ ﺍﳌﻴﺰﺍﺕ ﺍﻟﻘﻮﻳﺔ ﺍﳌﻮﺟﻮﺩﺓ ﰲ ﻟﻐﺔ‬
‫‪) C++‬ﻛﻤﺎ ﺳﻴﺘﻢ ﺗﺒﻴﺎﻧﻪ ﰲ ﺍﻟﻔﺼﻞ ‪ .(6‬ﻛﻤﺎ ﳝﻜﻦ ﻟﻠﻤﺴﺘﺨﺪﻣﲔ "ﺗﻌﻠﻴﻢ" ‪ C++‬ﻛﻴﻒ ﳝﻜﻦ ﺇﺩﺧﺎﻝ‬
‫ﻭﺇﺧﺮﺍﺝ ﺍﳌﻌﻄﻴﺎﺕ ﺇﱃ ﻭﻣﻦ ﺍﻟﺒﲎ ﺍﻟﺴﺎﺑﻘﺔ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺍﻟﻌﻤﻠﻴﺘﲔ <<ﻭ>> )ﺗﺴﻤﻰ ﻫﺬﻩ ﺍﻟﻄﺮﻳﻘﺔ ﺑـ‬
‫"ﺍﻟﺘﺤﻤﻴﻞ ﺍﻟﺰﺍﺋﺪ ﻟﻠﻌﻤﻠﻴﺎﺕ" ‪ operator overloading‬ﻛﻤﺎ ﺳﻮﻑ ﻧﺮﻯ ﰲ ﺍﻟﻔﺼﻞ ‪.(8‬‬

‫ﻣﻔﺎهﻴﻢ ﻟﻬﺎ ﻋﻼﻗﺔ ﺑﺎﻟﺬاآﺮة‬ ‫‪23-1‬‬


‫ﺗﺮﻣﺰ ﺃﲰﺎﺀ ﺍﳌﺘﺤﻮﻻﺕ ‪ integer1‬ﻭ‪ integer2‬ﻭ‪ sum‬ﰲ ﻭﺍﻗﻊ ﺍﻷﻣﺮ ﺇﱃ ﻣﻮﺍﺿﻊ ﰲ ﺫﺍﻛﺮﺓ ﺍﳊﺎﺳﺐ‪ .‬ﻓﻜﻞ‬
‫‪٥٧‬‬ ‫‪ .1‬ﻣﻘﺪﻣﺔ ﺣﻮل اﻟﺤﻮاﺳﻴﺐ واﻟﺒﺮﻣﺠﺔ ﺑﻠﻐﺔ ‪C++‬‬

‫ﻣﺘﺤﻮﻝ ﻟﻪ ﺍﺳﻢ ‪ name‬ﻭﳕﻂ ‪ type‬ﻭﺣﺠﻢ ‪ size‬ﻭﻗﻴﻤﺔ ‪.value‬‬


‫ﻋﻨﺪﻣﺎ ﳚﺮﻱ ﺗﻨﻔﻴﺬ ﺍﻟﺘﻌﻠﻴﻤﺔ‪:‬‬
‫;‪std::cin >> integer1‬‬

‫ﰲ ﺑﺮﻧﺎﻣﺞ ﺍﳉﻤﻊ ﺍﳌﺒﲔ ﰲ ﺍﻟﺸﻜﻞ ‪ ،6-1‬ﻓﺈﻥ ﺍﻟﻘﻴﻤﺔ ﺍﳌﹸﺪﺧﻠﺔ ﻣﻦ ﻗﺒﻞ ﺍﳌﺴﺘﺨﺪﻡ ﺗُﻮﺿﻊ ﰲ ﻣﻮﺿﻊ‬
‫ﺍﻟﺬﺍﻛﺮﺓ ﺍﳌﺨﺼﺺ ﻣﻦ ﻗﺒﻞ ﺍﳌﺘﺮﺟﻢ ﻟﻠﻤﺘﺤﻮﻝ ‪ .integer1‬ﻓﺈﺫﺍ ﺍﻓﺘﺮﺿﻨﺎ ﺃﻥ ﺍﳌﺴﺘﺨﺪﻡ ﻛﺎﻥ ﻗﺪ ﺃﺩﺧﻞ‬
‫ﺍﻟﻘﻴﻤﺔ ‪ 45‬ﻛﻘﻴﻤﺔ ﻟﻠﻤﺘﺤﻮﻝ ‪ integer1‬ﻓﺴﻴﻘﻮﻡ ﺍﳊﺎﺳﺐ ﺑﻮﺿﻊ ﺍﻟﻘﻴﻤﺔ ‪ 45‬ﰲ ﻣﻮﺿﻊ ﺍﻟﺬﺍﻛﺮﺓ ﺍﳌﺨﺼﺺ‬
‫ﻟـ ‪ ineger1‬ﻛﻤﺎ ﻫﻮ ﻣﺒﲔ ﰲ ﺍﻟﺸﻜﻞ ‪.7-1‬‬
‫ﻋﻨﺪ ﻭﺿﻊ ﻗﻴﻤﺔ ﻣﺎ ﰲ ﻣﻜﺎﻥ ﰲ ﺍﻟﺬﺍﻛﺮﺓ ﻓﺈﻥ ﻫﺬﻩ ﺍﻟﻘﻴﻤﺔ ﺳﻮﻑ ﲢﻞ ﳏﻞ ﺍﻟﻘﻴﻤﺔ ﺍﻟﻘﺪﳝﺔ ﺍﳌﻮﺟﻮﺩﺓ ﰲ‬
‫ﺫﻟﻚ ﺍﳌﻜﺎﻥ ﻭﺍﻟﱵ ﺳﻮﻑ ﻳﺘﻢ ﺗﺪﻣﲑﻫﺎ‪.‬‬
‫ﺇﺫﺍ ﻋﺪﻧﺎ ﺛﺎﻧﻴﺔ ﺇﱃ ﺑﺮﻧﺎﻣﺞ ﺍﳉﻤﻊ‪ ،‬ﻓﻌﻨﺪ ﺗﻨﻔﻴﺬ ﺍﻟﺘﻌﻠﻴﻤﺔ‪:‬‬
‫‪std::cin >> integer2‬‬

‫ﻣﻊ ﺇﻓﺘﺮﺍﺽ ﺃﻥ ﺍﳌﺴﺘﺨﺪﻡ ﺳﻮﻑ ﻳﺪﺧﻞ ﺍﻟﻘﻴﻤﺔ ‪ 72‬ﺳﻮﻑ ﻳﺘﻢ ﲣﺰﻳﻦ ﻫﺬﻩ ﺍﻟﻘﻴﻤﺔ ﰲ ﺍﳌﻮﺿﻊ‬
‫‪integer2‬‬
‫ﻭﺳﻮﻑ ﺗﺒﺪﻭ ﺍﻟﺬﺍﻛﺮﺓ ﻛﻤﺎ ﻫﻮ ﻣﻮﺿﺢ ﰲ ﺍﻟﺸﻜﻞ ‪ 8-1‬ﻣﻊ ﻣﻼﺣﻈﺔ ﺃﻥ ﻫﺬﻩ ﺍﳌﻮﺍﺿﻊ ﻻ ﲢﺘﺎﺝ‬
‫ﺑﺎﻟﻀﺮﻭﺭﺓ ﺃﻥ ﺗﻜﻮﻥ ﺟﻨﺒﹰﺎ ﺇﱃ ﺟﻨﺐ ﰲ ﺍﻟﺬﺍﻛﺮﺓ‪.‬‬

‫‪Integer1‬‬ ‫‪45‬‬

‫]‪< <<Jinteger1<äe<¼fi†¹]<Ùçvj¹]<íÛéÎæ<܉]<†Òƒ<ÄÚ<ì†Ò]„Ö]<»<Ä•çÚ<<V7-1<ØÓÖ‬‬

‫‪Integer1‬‬ ‫‪45‬‬
‫‪< <Integer2‬‬ ‫‪72‬‬

‫]‪< <<Jinteger2æ<integer1<°Öçvj¹^e<°jÏ×ÃjÚ<°jÛÎ<Ù^}c<‚Ãe<ì†Ò]„Ö]<»<á^ÕçÚ<V8-1<ØÓÖ‬‬

‫ﻓﺈﻧﻪ ﻳﻘﻮﻡ ﺑﻌﻤﻠﻴﺔ ﺍﳉﻤﻊ ﻭﻳﻀﻊ‬ ‫‪integer2‬‬ ‫ﻭ‬ ‫‪integer1‬‬ ‫ﺑﻌﺪ ﺃﻥ ﳛﺼﻞ ﺍﻟﱪﻧﺎﻣﺞ ﻋﻠﻰ ﻗﻴﻤﱵ ﺍﳌﺘﺤﻮﻟﲔ‬
‫ﺍﻟﻨﺘﻴﺠﺔ ﰲ ﺍﳌﺘﺤﻮﻝ ‪ .sum‬ﻓﺎﻟﺘﻌﻠﻴﻤﺔ‪:‬‬
‫; ‪sum = integer1 + integer2‬‬

‫ﺗﻨﻔﺬ ﻋﻤﻠﻴﺔ ﺍﳉﻤﻊ ﻭﺗﺆﺩﻱ ﺇﱃ ﺗﺪﻣﲑ ﺍﻟﻘﻴﻤﺔ ﺍﻟﺴﺎﺑﻘﺔ ﺍﳌﻮﺟﻮﺩﺓ ﰲ ‪ sum‬ﻭﳛﺼﻞ ﻫﺬﺍ ﺑﻌﺪ ﻭﺿﻊ ﻗﻴﻤﺔ‬
‫ﺍﳉﻤﻊ ﻟـ ‪ integer1‬ﻭ ‪ integer2‬ﰲ ﻣﻮﺿﻊ ﺍﻟﺬﺍﻛﺮﺓ ﺍﳌﺨﺼﺺ ﻟـ ‪) sum‬ﺩﻭﻥ ﺃﺧﺬ ﺃﻱ ﺍﻋﺘﺒﺎﺭ ﻟﻠﻘﻴﻤﺔ‬
‫اﻟﻔﺼﻞ اﻷول‬ ‫‪٥٨‬‬

‫ﺍﳌﻤﻜﻦ ﻭﺟﻮﺩﻫﺎ ﰲ ‪ .(sum‬ﺑﻌﺪ ﺍﻟﻘﻴﺎﻡ ﺑﻌﻤﻠﻴﺔ ﺍﳉﻤﻊ‪ ،‬ﺗﺒﺪﻭ ﺍﻟﺬﺍﻛﺮﺓ ﻛﻤﺎ ﻫﻮ ﻣﺒﲔ ﰲ ﺍﻟﺸﻜﻞ ‪.9-1‬‬

‫‪45‬‬
‫‪Integer1‬‬
‫‪Integer2‬‬ ‫‪72‬‬
‫<<‬ ‫‪sum‬‬
‫‪117‬‬

‫]‪< <íË×j~¹]<h^Š£]<l^é×ÛÃe<Ý^éÏÖ]<‚Ãe<íË×j~¹]<ì†Ò]„Ö]<Ä•]çÚ<< V9-1<ØÓÖ‬‬

‫ﻻﺣﻆ ﺑﻘﺎﺀ ﻣﻮﺿﻌﻲ ﺍﻟﺬﺍﻛﺮﺓ ﺍﳌﺨﺼﺼﲔ ﻟـ ‪ integer1‬ﻭ ‪ integer2‬ﻋﻠﻰ ﺷﻜﻠﻬﻤﺎ ﺍﻟﺴﺎﺑﻖ ﻗﺒﻞ ﺍﻟﻘﻴﺎﻡ‬
‫ﺑﻌﻤﻠﻴﺔ ﺍﳉﻤﻊ ﺍﳌﺮﺗﺒﻄﺔ ﺑﺎﳌﺘﺤﻮﻝ ‪ sum‬ﺣﻴﺚ ﰎ ﺍﺳﺘﺨﺪﺍﻡ ﻗﻴﻤﻬﻤﺎ ﻭﻟﻜﻦ ﱂ ﳚ ِﺮ ﺗﺪﻣﲑﻫﺎ‪ .‬ﻓﺒﺎﻟﺘﺎﱄ ﻻ‬
‫ﺗﺆﺩﻱ ﻋﻤﻠﻴﺔ ﻗﺮﺍﺀﺓ ﻗﻴﻤﺔ ﳐﺰﻧﺔ ﰲ ﻣﻮﺿﻊ ﰲ ﺍﻟﺬﺍﻛﺮﺓ ﺇﱃ ﺗﺪﻣﲑ ﺗﻠﻚ ﺍﻟﻘﻴﻤﺔ ﻭﺿﻴﺎﻋﻬﺎ‪.‬‬

‫اﻟﻌﻤﻠﻴﺎت اﻟﺤﺴﺎﺑﻴﺔ‬ ‫‪24-1‬‬


‫ﺗﻨﻔﺬ ﻣﻌﻈﻢ ﺍﻟﱪﺍﻣﺞ ﻋﻤﻠﻴﺎﺕ ﺣﺴﺎﺑﻴﺔ ﻭﻳﻠﺨﺺ ﺍﻟﺸﻜﻞ ‪ 10-1‬ﲨﻴﻊ ﺍﻟﻌﻤﻠﻴﺎﺕ ﺍﳊﺴﺎﺑﻴﺔ ﺍﳌﺴﺘﺨﺪﻣﺔ‬
‫ﺣﻴﺚ ﻧﻼﺣﻆ ﻭﺟﻮﺩ ﻟﺮﻣﻮﺯ ﻋﻤﻠﻴﺎﺕ ﻏﲑ ﻣﺴﺘﺨﺪﻣﺔ ﺟﱪﻳﹰﺎ‪ .‬ﻓﺎﻟﺮﻣﺰ )*( ﻳﺪﻝ ﻋﻠﻰ ﻋﻤﻠﻴﺔ ﺍﻟﻀﺮﺏ‪ ،‬ﺃﻣﺎ‬
‫ﺍﻟﻨﺴﺒﺔ ﺍﳌﺌﻮﻳﺔ )‪ (%‬ﻓﺘﺪﻝ ﻋﻠﻰ ﺑﺎﻗﻲ ﺍﻟﻘﺴﻤﺔ ﺍﻟﺼﺤﻴﺤﺔ ‪ modulus‬ﺍﻟﱵ ﺳﻮﻑ ﻧﺘﻌﺮﺽ ﳍﺎ ﻓﻴﻤﺎ ﻳﻠﻲ‪ .‬ﺇﻥ‬
‫ﲨﻴﻊ ﺍﻟﻌﻤﻠﻴﺎﺕ ﺍﳊﺴﺎﺑﻴﺔ ﺍﳌﻮﺟﻮﺩﺓ ﰲ ﺍﻟﺸﻜﻞ ‪ 10-1‬ﻫﻲ ﻋﻤﻠﻴﺎﺕ ﺛﻨﺎﺋﻴﺔ‪ .‬ﻓﻌﻠﻰ ﺳﺒﻴﻞ ﺍﳌﺜﺎﻝ‪ ،‬ﲢﺘﻮﻱ‬
‫ﺍﻟﻌﺒﺎﺭﺓ ‪ integer1 + integer2‬ﻋﻠﻰ ﺍﻟﻌﻤﻠﻴﺔ ﺍﻟﺜﻨﺎﺋﻴﺔ ‪ +‬ﻭﻋﻠﻰ ﺍﳌﻌﺎﻣﻠﲔ ‪ integer1‬ﻭ‪ integer2‬ﺍﳌﺮﺗﺒﻄﲔ ﻬﺑﺎ‪.‬‬
‫ﺗﻌﻄﻲ ﻋﻤﻠﻴﺔ ﺍﻟﺘﻘﺴﻴﻢ ﻟﻸﻋﺪﺍﺩ ﺍﻟﺼﺤﻴﺤﺔ ﻛﻨﺘﻴﺠﺔ ﻋﺪﺩﹰﺍ ﺻﺤﻴﺤﹰﺎ‪ .‬ﻓﻌﻠﻰ ﺳﺒﻴﻞ ﺍﳌﺜﺎﻝ ﺇﻥ ﻧﺘﻴﺠﺔ ﺍﻟﻘﺴﻤﺔ‬
‫ﰲ ﺍﻟﻌﺒﺎﺭﺓ ‪ 7/4‬ﺗﺴﺎﻭﻱ ‪ 1‬ﻭﻧﺘﻴﺠﺔ ﺍﻟﻘﺴﻤﺔ ﰲ ﺍﻟﻌﺒﺎﺭﺓ ‪ 17/5‬ﺗﺴﺎﻭﻱ ‪ .3‬ﻻﺣﻆ ﺃﻧﻪ ﰎ ﺍﺳﺘﺒﻌﺎﺩ ﺃﻱ ﺟﺰﺀ‬
‫ﻋﺸﺮﻱ ﺃﺛﻨﺎﺀ ﺣﺴﺎﺏ ﻧﺘﻴﺠﺔ ﻗﺴﻤﺔ ﻋﺪﺩﻳﻦ ﺻﺤﻴﺤﲔ‪ .‬ﻳﻮﺟﺪ ﰲ ‪ C++‬ﺍﻟﻌﻤﻠﻴﺔ )‪ (%‬ﺍﻟﱵ ﺗﻌﻄﻲ ﻛﻨﺘﻴﺠﺔ‬
‫ﺑﺎﻗﻲ ﻗﺴﻤﺔ ﻋﺪﺩﻳﻦ ﺻﺤﻴﺤﲔ ﻋﻠﻰ ﺷﻜﻞ ﻋﺪﺩ ﺻﺤﻴﺢ ﻭﻫﻲ ﻻﺗﺴﺘﻌﻤﻞ ﺇﻻ ﻣﻊ ﺍﻷﻋﺪﺍﺩ ﺍﻟﺼﺤﻴﺤﺔ‪.‬‬
‫ﺗﻌﻄﻲ ﺍﻟﻌﺒﺎﺭﺓ ‪ y%x‬ﺑﺎﻗﻲ ﺍﻟﻘﺴﻤﺔ ﻟـ ‪ x‬ﻋﻠﻰ ‪ ،y‬ﻓﻨﺘﻴﺠﺔ ﺍﻟﻌﺒﺎﺭﺓ ‪ 7%4‬ﻫﻲ ‪ ،3‬ﺃﻣﺎ ﻧﺘﻴﺠﺔ ﺍﻟﻌﺒﺎﺭﺓ ‪17%5‬‬
‫ﻫﻲ ‪ .2‬ﺳﻮﻑ ﻧﺴﺘﻌﺮﺽ ﰲ ﺍﻟﻔﺼﻮﻝ ﺍﻟﺘﺎﻟﻴﺔ ﻋﺪﺩﹰﺍ ﻣﻦ ﺍﻻﺳﺘﺨﺪﺍﻣﺎﺕ ﺍﳌﻬﻤﺔ ﻟﻌﻤﻠﻴﺔ ﺣﺴﺎﺏ ﺑﺎﻗﻲ‬
‫ﺍﻟﻘﺴﻤﺔ ﺍﻟﺼﺤﻴﺤﺔ ﻣﺜﻞ ﲢﺪﻳﺪ ﻓﻴﻤﺎ ﺇﺫﺍ ﻛﺎﻥ ﻋﺪﺩ ﻣﺎ ﻣﻦ ﻣﻀﺎﻋﻔﺎﺕ ﻋﺪﺩ ﺁﺧﺮ‪.‬‬

‫ﻃﺮیﻘﺔ اﻟﺘﻌﺒﻴﺮ ﺣﺴﺐ‬ ‫ﻃﺮیﻘﺔ اﻟﺘﻌﺒﻴﺮ اﻟﺠﺒﺮي‬ ‫اﻟﺮﻣﺰ‬ ‫اﺳﻢ اﻟﻌﻤﻠﻴﺔ‬


‫ﻟﻐﺔ ‪C++‬‬ ‫اﻟﺤﺴﺎﺑﻲ‬

‫‪f+7‬‬ ‫‪f+7‬‬ ‫‪+‬‬ ‫اﻟﺠﻤﻊ‬


‫‪p-c‬‬ ‫‪p-c‬‬ ‫‪-‬‬ ‫اﻟﻄﺮح‬
‫‪٥٩‬‬ ‫‪ .1‬ﻣﻘﺪﻣﺔ ﺣﻮل اﻟﺤﻮاﺳﻴﺐ واﻟﺒﺮﻣﺠﺔ ﺑﻠﻐﺔ ‪C++‬‬

‫ﻃﺮیﻘﺔ اﻟﺘﻌﺒﻴﺮ ﺣﺴﺐ‬ ‫ﻃﺮیﻘﺔ اﻟﺘﻌﺒﻴﺮ اﻟﺠﺒﺮي‬ ‫اﻟﺮﻣﺰ‬ ‫اﺳﻢ اﻟﻌﻤﻠﻴﺔ‬


‫ﻟﻐﺔ ‪C++‬‬ ‫اﻟﺤﺴﺎﺑﻲ‬

‫‪b*m‬‬ ‫‪bm‬‬ ‫*‬ ‫اﻟﻀﺮب‬


‫‪x‬‬
‫‪x/y‬‬ ‫‪x÷y‬‬ ‫أو‬ ‫‪ x/y‬أو‬ ‫‪/‬‬ ‫اﻟﻘﺴﻤﺔ‬
‫‪y‬‬
‫‪r%s‬‬ ‫‪r mod s‬‬ ‫‪%‬‬ ‫اﻟﻘﺴﻤﺔ‬ ‫ﺑﺎﻗﻲ‬
‫اﻟﺼﺤﻴﺤﺔ‬

‫]‪< << íée^Šu<l^é×ÛÂ<V10-1<ØÓÖ‬‬

‫أﺥﻄﺎء ﺑﺮﻣﺠﻴﺔ ﺵﺎﺉﻌﺔ‬ ‫‪4-1‬‬

‫ﻣﻊ اﻷﻋﺪاد ﻏﻴﺮ اﻟﺼﺤﻴﺤﺔ‬ ‫یﻌﺘﺒﺮ اﺳﺘﺨﺪام ﻋﻤﻠﻴﺔ ﺑﺎﻗﻲ اﻟﻘﺴﻤﺔ اﻟﺼﺤﻴﺤﺔ‬
‫‪7‬‬
‫‪%‬‬
‫ﺥﻄًﺄ ﻗﻮاﻋﺪیًﺎ‪.‬‬

‫ﳚﺐ ﻛﺘﺎﺑﺔ ﺍﻟﺘﻌﺎﺑﲑ ﺍﳊﺴﺎﺑﻴﺔ ﰲ ﻟﻐﺔ ‪ C++‬ﻋﻠﻰ ﺧﻂ ﻣﺴﺘﻘﻴﻢ ‪ straight-line form‬ﻓﻴﺠﺐ ﻋﻠﻰ ﺳﺒﻴﻞ ﺍﳌﺜﺎﻝ‬
‫ﻛﺘﺎﺑﺔ ﺍﻟﻌﺒﺎﺭﺓ "ﻗﺴﻤﺔ ‪ a‬ﻋﻠﻰ ‪ "b‬ﻋﻠﻰ ﺍﻟﺸﻜﻞ ﺍﻟﺘﺎﱄ‪ a/b :‬ﺣﻴﺚ ﺗﻈﻬﺮ ﻛﺎﻓﺔ ﺍﻟﺜﻮﺍﺑﺖ ﻭﺍﳌﺘﺤﻮﻻﺕ‬
‫ﻭﺍﻟﻌﻤﻠﻴﺎﺕ ﻋﻠﻰ ﻧﻔﺲ ﺍﻟﺴﻄﺮ‪ .‬ﺃﻣﺎ ﺍﻟﺸﻜﻞ ﺍﳉﱪﻱ ‪ ba‬ﻓﻬﻮ ﻏﲑ ﻣﻘﺒﻮﻝ ﻣﻦ ﻗﺒﻞ ﺍﳌﺘﺮﺟﻢ‪ .‬ﻭﻟﻜﻨﻬﺎ ﻣﺘﻮﻓﺮﺓ ﰲ‬
‫ﺑﻌﺾ ﺍﻟﻨﻈﻢ ﺍﻟﱪﳎﻴﺔ ﺍﻟﱵ ﺗﺪﻋﻢ ﺍﻟﺘﻌﺎﻣﻞ ﺑﺎﻟﺸﻜﻞ ﺍﻟﻄﺒﻴﻌﻲ ﺧﺼﻮﺻﹰﺎ ﻓﻴﻤﺎ ﻳﺘﻌﻠﻖ ﺑﺎﻟﻌﺒﺎﺭﺍﺕ ﺍﻟﺮﻳﺎﺿﻴﺔ ﺍﳌﻌﻘﺪﺓ‪.‬‬
‫ﳝﻜﻦ ﺍﺳﺘﺨﺪﺍﻡ ﺍﻷﻗﻮﺍﺱ ﰲ ﺍﻟﻌﺒﺎﺭﺍﺕ ﺍﳊﺴﺎﺑﻴﺔ ﺍﳌﻜﺘﻮﺑﺔ ﺑﻠﻐﺔ ‪ C++‬ﺑﻨﻔﺲ ﺍﻟﻄﺮﻳﻘﺔ ﺍﻟﱵ ﻧﺴﺘﻌﻤﻠﻬﺎ ﻬﺑﺎ ﰲ‬
‫ﺍﻟﻌﺒﺎﺭﺍﺕ ﺍﳉﱪﻳﺔ‪ .‬ﻋﻠﻰ ﺳﺒﻴﻞ ﺍﳌﺜﺎﻝ ﺃﺭﺩﻧﺎ ﺣﺴﺎﺏ ﻧﺘﻴﺠﺔ ﺿﺮﺏ ‪ a‬ﺑﺎﻟﻜﻤﻴﺔ ‪ b+c‬ﳚﺐ ﺃﻥ ﻧﻜﺘﺐ‪:‬‬
‫)‪a*(b+c‬‬

‫ﺗﻘﻮﻡ ‪ C++‬ﺑﺘﻄﺒﻴﻖ ﺍﻟﻌﻤﻠﻴﺎﺕ ﰲ ﺍﻟﻌﺒﺎﺭﺍﺕ ﺍﳊﺴﺎﺑﻴﺔ ﺣﺴﺐ ﺗﺮﺗﻴﺐ ﻣﻌﲔ ﳏﺪﺩ ﺗﺒﻌﹰﺎ ﻟﻘﻮﺍﻋﺪ ﺍﻷﻭﻟﻮﻳﺔ ﺑﲔ‬
‫ﺍﻟﻌﻤﻠﻴﺎﺕ ‪ rules of operator precedence‬ﺍﻟﱵ ﲤﺎﺛﻞ ﻗﻮﺍﻋﺪ ﺍﻷﻭﻟﻮﻳﺔ ﺍﳌﺴﺘﺨﺪﻣﺔ ﰲ ﺍﳉﱪ‪:‬‬
‫‪ .1‬ﳚﺮﻱ ﺃﻭ ﹰﻻ ﺇﳒﺎﺯ ﺍﳊﺴﺎﺑﺎﺕ ﺑﺎﻟﻨﺴﺒﺔ ﻟﻸﺯﻭﺍﺝ ﺍﳌﻮﺟﻮﺩﺓ ﺑﲔ ﻗﻮﺳﲔ‪ .‬ﻟﺬﻟﻚ ﺗﺴﺘﺨﺪﻡ ﺍﻷﻗﻮﺍﺱ‬
‫ﻟﺘﺤﺪﻳﺪ ﺗﺮﺗﻴﺐ ﺣﺴﺎﺏ ﺍﻟﻌﻤﻠﻴﺎﺕ ﺍﻟﺬﻱ ﻧﺮﻏﺐ ﺑﻪ ﻛﻤﱪﳎﲔ‪ .‬ﻧﻘﻮﻝ ﻋﻦ ﺍﻷﻗﻮﺍﺱ ﺃﻬﻧﺎ ﲢﺪﺩ‬
‫"ﺃﻋﻠﻰ ﻣﺴﺘﻮﻯ ﻟﻸﻭﻟﻮﻳﺔ" ﰲ ﺣﺎﻝ ﻭﺟﻮﺩ ﳎﻤﻮﻋﺎﺕ ﻟﻸﻗﻮﺍﺱ ﻣﺘﺪﺍﺧﻠﺔ ﺑﻌﻀﻬﺎ ﺑﺒﻌﺾ‪ ،‬ﻓﺈﻥ‬
‫ﻋﻤﻠﻴﺔ ﺍﳊﺴﺎﺏ ﺗﺒﺪﺃ ﺍﻧﻄﻼﻗﹰﺎ ﻣﻦ ﺍﻟﺰﻭﺝ ﺍﻟﺪﺍﺧﻠﻲ ﺍﻷﻭﻝ ﺍﻟﺬﻱ ﻻ ﳛﻮﻱ ﺃﻱ ﳎﻤﻮﻋﺔ ﻟﻸﻗﻮﺍﺱ‬
‫ﺿﻤﻨﻪ‪.‬‬
‫‪ .2‬ﺑﻌﺪﻫﺎ ﻳﺘﻢ ﺣﺴﺎﺏ ﻋﻤﻠﻴﺎﺕ ﺍﻟﻀﺮﺏ ﻭﺍﻟﻘﺴﻤﺔ ﻭﺑﺎﻗﻲ ﺍﻟﻘﺴﻤﺔ ﺍﻟﺼﺤﻴﺤﺔ‪ .‬ﺇﺫﺍ ﻛﺎﻧﺖ ﺍﻟﻌﺒﺎﺭﺓ‬
‫ﲢﺘﻮﻱ ﻋﻠﻰ ﻋﺪﺓ ﻋﻤﻠﻴﺎﺕ ﺿﺮﺏ ﺃﻭ ﺗﻘﺴﻴﻢ ﺃﻭ ﺣﺴﺎﺏ ﻟﺒﺎﻗﻲ ﺍﻟﻘﺴﻤﺔ ﺍﻟﺼﺤﻴﺤﺔ ﻓﻴﺠﺮﻱ‬
‫اﻟﻔﺼﻞ اﻷول‬ ‫‪٦٠‬‬

‫ﺣﺴﺎﻬﺑﺎ ﻣﻦ ﺍﻟﻴﺴﺎﺭ ﺇﱃ ﺍﻟﻴﻤﲔ‪ .‬ﻧﻘﻮﻝ ﻋﻦ ﻋﻤﻠﻴﺎﺕ ﺍﻟﻀﺮﺏ ﻭﺍﻟﻘﺴﻤﺔ ﻭﺑﺎﻗﻲ ﺍﻟﻘﺴﻤﺔ ﺍﻟﺼﺤﻴﺤﺔ‬
‫ﺃﻬﻧﺎ ﻣﻦ ﻧﻔﺲ ﻣﺴﺘﻮﻯ ﺍﻷﻭﻟﻮﻳﺔ‪.‬‬
‫‪ .3‬ﺃﺧﲑﹰﺍ ﻧﻘﻮﻡ ﲝﺴﺎﺏ ﻋﻤﻠﻴﺎﺕ ﺍﳉﻤﻊ ﻭﺍﻟﻄﺮﺡ‪ .‬ﺇﺫﺍ ﺣﻮﺕ ﺍﻟﻌﺒﺎﺭﺓ ﻋﻠﻰ ﻋﺪﺓ ﻋﻤﻠﻴﺎﺕ ﲨﻊ ﺃﻭ‬
‫ﻃﺮﺡ ﻋﻨﺪﻫﺎ ﺗﺒﺪﺃ ﻋﻤﻠﻴﺔ ﺍﳊﺴﺎﺏ ﻣﻦ ﺍﻟﻴﺴﺎﺭ ﺇﱃ ﺍﻟﻴﻤﲔ‪ .‬ﻧﻘﻮﻝ ﺃﻳﻀﹰﺎ ﺃﻥ ﻋﻤﻠﻴﱵ ﺍﳉﻤﻊ ﻭﺍﻟﻄﺮﺡ‬
‫ﳍﻤﺎ ﻧﻔﺲ ﻣﺴﺘﻮﻯ ﻟﻸﻭﻟﻮﻳﺔ‪.‬‬
‫ﺗﺴﻤﺢ ﻗﻮﺍﻋﺪ ﺍﻷﻭﻟﻮﻳﺔ ﺍﻟﺴﺎﺑﻘﺔ ﻟـ ‪ C++‬ﲝﺴﺎﺏ ﺍﻟﻌﺒﺎﺭﺍﺕ ﺍﳊﺴﺎﺑﻴﺔ ﺣﺴﺐ ﺍﻟﺘﺴﻠﺴﻞ ﺍﻟﺼﺤﻴﺢ‬
‫ﻟﻠﻌﻤﻠﻴﺎﺕ ﺍﳊﺴﺎﺑﻴﺔ‪ .‬ﻋﻨﺪﻣﺎ ﻧﻘﻮﻝ ﺃﻥ ﺗﻄﺒﻴﻖ ﺍﻟﻌﻤﻠﻴﺎﺕ ﳚﺮﻱ ﻣﻦ ﺍﻟﻴﺴﺎﺭ ﺇﱃ ﺍﻟﻴﻤﲔ ﻓﺈﻧﻨﺎ ﻧﺴﺘﻌﲔ ﻟﺬﻟﻚ‬
‫ﺑﺎﳋﺎﺻﺔ ﺍﻟﺘﺠﻤﻴﻌﻴﺔ ﻟﻠﻌﻤﻠﻴﺎﺕ ‪ .associativity‬ﺳﻮﻑ ﻧﺮﻯ ﻻﺣﻘﹰﺎ ﺃﻥ ﻫﺬﻩ ﺍﻟﻌﻤﻠﻴﺎﺕ ﻧﻔﺴﻬﺎ ﻫﻲ‬
‫ﻋﻤﻠﻴﺎﺕ ﲡﻤﻴﻌﻴﺔ ﻣﻦ ﺍﻟﻴﻤﲔ ﺇﱃ ﺍﻟﻴﺴﺎﺭ ﺃﻳﻀﹰﺎ‪ .‬ﻳﻠﺨﺺ ﺍﻟﺸﻜﻞ ‪ 11-1‬ﻗﻮﺍﻋﺪ ﺍﻷﻭﻟﻮﻳﺔ ﺍﻟﺴﺎﺑﻘﺔ‪ .‬ﺳﻮﻑ‬
‫ﻳﺘﻢ ﺗﻌﺪﻳﻞ ﻫﺬﺍ ﺍﳉﺪﻭﻝ ﻻﺣﻘﹰﺎ ﻋﻨﺪ ﺇﺿﺎﻓﺔ ﻋﻤﻠﻴﺎﺕ ﺃﺧﺮﻯ ﺧﺎﺻﺔ ﺑـ ‪ .C++‬ﲢﺘﻮﻱ ﺍﳌﻼﺣﻖ ﻋﻠﻰ‬
‫ﻼ ﻟﻸﻭﻟﻮﻳﺔ ﺑﲔ ﻋﻤﻠﻴﺎﺕ ‪.C++‬‬ ‫ﳐﻄﻄﹰﺎ ﻛﺎﻣ ﹰ‬

‫ﺗﺮﺗﻴﺐ ﻋﻤﻠﻴﺔ اﻟﺘﻘﻴﻴﻢ )اﻷوﻟﻮیﺔ(‬ ‫اﺳﻢ اﻟﻌﻤﻠﻴﺔ‬ ‫اﻟﻌﻤﻠﻴﺔ‬


‫ﻻ‪ .‬إذا وﺝﺪ ﻓﻲ اﻟﻌﺒﺎرات اﻟﺤﺴﺎﺑﻴﺔ أﻗﻮاس‬
‫ﺕﻘﻴﻢ أو ً‬ ‫اﻷﻗﻮاس‬ ‫)(‬
‫ﻣﺘﺪاﺥﻠﺔ ﺿﻤﻦ ﺑﻌﻀﻬﺎ اﻟﺒﻌﺾ ﻓﺎﻟﺤﺴﺎب یﺒﺪأ‬
‫اﻧﻄﻼﻗًﺎ ﻣﻦ أول ﻣﺠﻤﻮﻋﺔ ﻓﻲ اﻟﺪاﺥﻞ‪ .‬أﻣﺎ إذا آﺎن‬
‫ﻟﺪیﻨﺎ ﻣﺠﻤﻮﻋﺔ ﻣﻦ اﻷﻗﻮاس ﺝﺎﻧﺐ ﺑﻌﻀﻬﺎ اﻟﺒﻌﺾ‬
‫وﻋﻠﻰ ﻧﻔﺲ اﻟﻤﺴﺘﻮى ﻋﻨﺪهﺎ یﺒﺪأ اﻟﺤﺴﺎب ﻣﻦ‬
‫اﻟﻴﺴﺎر إﻟﻰ اﻟﻴﻤﻴﻦ‪.‬‬
‫ﺕﻘﻴﻢ ﺛﺎﻧﻴًﺎ‪ .‬وإذا وﺝﺪت ﻋﻠﻰ ﻧﻔﺲ اﻟﻤﺴﺘﻮى ﻓﺈﻧﻬﺎ‬ ‫اﻟﻀﺮب‪ ،‬اﻟﻘﺴﻤﺔ أو‬ ‫*‪ / ،‬أو ‪%‬‬
‫ﺕﻘﻴﻢ‬ ‫اﻟﻘﺴﻤﺔ‬ ‫ﺑﺎﻗﻲ‬
‫ﻣﻦ اﻟﻴﺴﺎر إﻟﻰ اﻟﻴﻤﻴﻦ‪.‬‬ ‫اﻟﺼﺤﻴﺤﺔ‬
‫ﺕﻘﻴﻢ ﻓﻲ اﻟﻨﻬﺎیﺔ‪ ،‬إذا وﺝﺪت ﻋﺪة ﻋﻤﻠﻴﺎت ﻣﻨﻬﺎ ﻋﻠﻰ‬ ‫اﻟﺠﻤﻊ أو اﻟﻄﺮح‬ ‫‪ +‬أو ‪-‬‬
‫ﻧﻔﺲ اﻟﻤﺴﺘﻮى ﻓﺈﻧﻬﺎ ﺕﻘﻴﻢ ﻣﻦ اﻟﻴﺴﺎر إﻟﻰ اﻟﻴﻤﻴﻦ‪.‬‬

‫]‪< <íée^Š£]<l^é×ÛÃÖ]<°e<íèçÖæù]<V11-1<ØÓÖ‬‬

‫ﻟﻨﺤﺎﻭﻝ ﺍﻵﻥ ﺗﻄﺒﻴﻖ ﻗﻮﺍﻋﺪ ﺍﻷﻭﻟﻮﻳﺔ ﺍﻟﺴﺎﺑﻘﺔ ﻋﻠﻰ ﳎﻤﻮﻋﺔ ﻣﻦ ﺍﻷﻣﺜﻠﺔ ﻭﺍﻟﺘﻌﺎﺑﲑ ﺍﳊﺴﺎﺑﻴﺔ‪.‬‬
‫ﻛﻞ ﻣﺜﺎﻝ ﻣﻦ ﻫﺬﻩ ﺍﻷﻣﺜﻠﺔ ﻳﺘﻀﻤﻦ ﺍﻟﺸﻜﻞ ﺍﳉﱪﻱ ﻟﻠﻌﺒﺎﺭﺓ ﺍﳌﺴﺘﺨﺪﻣﺔ ﺑﺎﻹﺿﺎﻓﺔ ﺇﱃ ﻃﺮﻳﻘﺔ ﺍﻟﺘﻌﺒﲑ ﻋﻨﻬﺎ‬
‫ﺍﳌﻜﺎﻓﺌﺔ ﺣﺴﺐ ﻟﻐﺔ ‪.C++‬‬
‫ﻼ ﺇﺫﺍ ﺃﺭﺩﻧﺎ ﺣﺴﺎﺏ ﺍﳌﺘﻮﺳﻂ ﺍﳊﺴﺎﰊ ﳋﻤﺴﺔ ﺣﺪﻭﺩ ﻓﻠﺪﻳﻨﺎ‪:‬‬ ‫ﻣﺜ ﹰ‬
‫‪٦١‬‬ ‫‪ .1‬ﻣﻘﺪﻣﺔ ﺣﻮل اﻟﺤﻮاﺳﻴﺐ واﻟﺒﺮﻣﺠﺔ ﺑﻠﻐﺔ ‪C++‬‬

‫=‪m‬‬
‫‪a +b +c +d +e‬‬
‫ﺟﱪﻳﹰﺎ‪:‬‬
‫‪5‬‬

‫;‪m= (a+b+c+d+e)/5‬‬ ‫ﺣﺴﺐ ﻟﻐﺔ ‪:C++‬‬

‫ﻣﻦ ﺍﻟﻀﺮﻭﺭﻱ ﻭﺿﻊ ﺩﺍﺧﻞ ﺍﻷﻗﻮﺍﺱ ﻃﺮﻳﻘﺔ ﺍﻟﺘﻌﺒﲑ ﺣﺴﺐ ﻟﻐﺔ ‪ C++‬ﻷﻥ ﻋﻤﻠﻴﺔ ﺍﻟﻘﺴﻤﺔ ﳍﺎ ﺃﻭﻟﻮﻳﺔ‬
‫ﺍﻟﺘﻨﻔﻴﺬ ﻋﻠﻰ ﻋﻤﻠﻴﺔ ﺍﳉﻤﻊ ﻭﺑﺎﻟﺘﺎﱄ ﻳﻌﲏ ﻭﺟﻮﺩﻫﺎ ﺣﺴﺎﺏ ﻧﺎﺗﺞ ﻗﺴﻤﺔ ﺍﻟﻜﻤﻴﺔ )‪ (a+b+c+d+e‬ﻋﻠﻰ‬
‫ﺍﻟﻜﻤﻴﺔ ‪ .5‬ﺃﻣﺎ ﻏﻴﺎﻬﺑﺎ ﻓﻴﻌﲏ ﺣﺴﺎﺏ ﺍﻟﻌﺒﺎﺭﺓ ﺍﻟﺘﺎﻟﻴﺔ ‪ a+b+c+d+e/5‬ﺃﻱ ﺍﻟﻌﺒﺎﺭﺓ‪:‬‬
‫‪e‬‬
‫‪a+b+c+d+‬‬
‫‪5‬‬
‫ﻭﻫﺬﺍ ﻻ ﻳﺘﻔﻖ ﻣﻊ ﻣﺎﻫﻮ ﻣﻄﻠﻮﺏ ﺣﺴﺎﺑﻪ‪.‬‬
‫ﻟﻨﺄﺧﺬ ﻋﻠﻰ ﺳﺒﻴﻞ ﺍﳌﺜﺎﻝ ﻣﻌﺎﺩﻟﺔ ﺧﻂ ﻣﺴﺘﻘﻴﻢ ﺍﻟﱵ ﻧﻌﱪ ﻋﻨﻬﺎ‬
‫‪y=mx + b‬‬ ‫ﺟﱪﻳﺎﹰ‪ ،‬ﺑﺎﻟﺸﻜﻞ ‪:‬‬
‫;‪y=m*x + b‬‬ ‫ﺣﺴﺐ ﻟﻐﺔ ‪ ،C++‬ﺑﺎﻟﺸﻜﻞ‪:‬‬
‫ﻻﺣﻆ ﺃﻧﻪ ﻻ ﺣﺎﺟﺔ ﻫﻨﺎ ﻻﺳﺘﺨﺪﺍﻡ ﺍﻷﻗﻮﺍﺱ ﺣﻴﺚ ﻳﺘﻢ ﺃﻭ ﹰﻻ ﺣﺴﺎﺏ ﻋﻤﻠﻴﺔ ﺍﻟﻀﺮﺏ ﻷﻥ ﳍﺎ ﺍﻷﻭﻟﻮﻳﺔ‬
‫ﻋﻠﻰ ﺍﳉﻤﻊ‪.‬‬
‫ﺃﻣﺎ ﺍﳌﺜﺎﻝ ﺍﻟﺘﺎﱄ ﻓﻬﻮ ﳛﺘﻮﻱ ﻋﻠﻰ ﻋﻤﻠﻴﺎﺕ ﺣﺴﺎﺏ ﺑﺎﻗﻲ ﺍﻟﻘﺴﻤﺔ ﺍﻟﺼﺤﻴﺤﺔ ﻭﺍﻟﻀﺮﺏ ﻭﺍﻟﻘﺴﻤﺔ ﻭﺍﳉﻤﻊ‬
‫ﻭﺍﻟﻄﺮﺡ‪:‬‬
‫‪Z = pr % q+w/x - y‬‬ ‫ﺟﱪﻳﹰﺎ‪:‬‬
‫;‪Z= p*r % q+ w / x - y‬‬ ‫ﺣﺴﺐ ﻟﻐﺔ ‪:C++‬‬
‫‪6‬‬ ‫‪١‬‬ ‫‪٢‬‬ ‫‪٤‬‬ ‫‪٣‬‬ ‫‪٥‬‬

‫ﺗﺒﲔ ﺍﻷﺭﻗﺎﻡ ﺍﳌﻜﺘﻮﺑﺔ ﺿﻤﻦ ﺩﻭﺍﺋﺮ ﺗﺮﺗﻴﺐ ﺗﻄﺒﻴﻖ ﺍﻟﻌﻤﻠﻴﺎﺕ‪ .‬ﻳﺄﰐ ﺃﻭ ﹰﻻ ﺍﻟﻀﺮﺏ‪ ،‬ﻓﺤﺴﺎﺏ‬
‫ﺑﺎﻗﻲ ﺍﻟﻘﺴﻤﺔ ﺍﻟﺼﺤﻴﺤﺔ‪ ،‬ﻓﻌﻤﻠﻴﺔ ﺍﻟﻘﺴﻤﺔ ﺍﻧﻄﻼﻗﹰﺎ ﻣﻦ ﺍﻟﻴﺴﺎﺭ ﺇﱃ ﺍﻟﻴﻤﲔ )ﻣﺴﺘﻔﻴﺪﻳﻦ ﺑﺎﻟﺘﺎﱄ ﻣﻦ ﺍﳋﺎﺻﺔ‬
‫ﺍﻟﺘﺠﻤﻴﻌﻴﺔ ﳍﺬﻩ ﺍﻟﻌﻤﻠﻴﺎﺕ ﻣﻦ ﺍﻟﻴﺴﺎﺭ ﺇﱃ ﺍﻟﻴﻤﲔ( ﻋﻠﻰ ﺍﻋﺘﺒﺎﺭ ﺃﻬﻧﺎ ﺫﺍﺕ ﺃﻭﻟﻮﻳﺔ ﺃﻋﻠﻰ ﻣﻦ ﺗﻠﻚ ﺍﳋﺎﺻﺔ‬
‫ﺑﻌﻤﻠﻴﱵ ﺍﳉﻤﻊ ﻭﺍﻟﻄﺮﺡ ﺍﻟﻠﺘﲔ ﻳﺘﻢ ﺗﻄﺒﻴﻘﻬﻤﺎ ﺑﻌﺪ ﺫﻟﻚ ﻭﻣﻦ ﺍﻟﻴﺴﺎﺭ ﺇﱃ ﺍﻟﻴﻤﲔ ﺃﻳﻀﹰﺎ‪.‬‬
‫ﻻ ﲢﺘﻮﻱ ﲨﻴﻊ ﺍﻟﻌﺒﺎﺭﺍﺕ ﺍﳊﺴﺎﺑﻴﺔ ﻋﻠﻰ ﺃﺟﺰﺍﺀ ﳏﺼﻮﺭﺓ ﺿﻤﻦ ﺃﻗﻮﺍﺱ ﻣﺘﺪﺍﺧﻠﺔ ﻭﺇﻥ ﺣﻮﺕ ﻋﻠﻰ ﺃﺯﻭﺍﺝ‬
‫ﺩﺍﺧﻞ ﺃﻗﻮﺍﺱ ﻣﻦ ﺍﳌﻌﺎﻣﻼﺕ ﻟﻌﻤﻠﻴﺎﺕ ﺛﻨﺎﺋﻴﺔ‪ .‬ﻓﻌﻠﻰ ﺳﺒﻴﻞ ﺍﳌﺜﺎﻝ‪ ،‬ﻻﲢﺘﻮﻱ ﺍﻟﻌﺒﺎﺭﺓ ﺍﻟﺘﺎﻟﻴﺔ‪:‬‬
‫‪a*(b+c)+c*(d+e)7‬‬

‫ﻋﻠﻰ ﺃﻗﻮﺍﺱ ﻣﺘﺪﺍﺧﻠﺔ ﻟﻜﻨﻬﺎ ﺗﺘﻀﻤﻦ ﳎﻤﻮﻋﺔ ﻣﻦ ﺍﻷﻗﻮﺍﺱ ﺍﳌﻮﺟﻮﺩﺓ ﻋﻠﻰ ﻧﻔﺲ ﺍﳌﺴﺘﻮﻯ‪.‬‬
‫اﻟﻔﺼﻞ اﻷول‬ ‫‪٦٢‬‬

‫ﺣﱴ ﻧﺘﻮﺻﻞ ﺇﱃ ﻓﻬﻢ ﺃﻓﻀﻞ ﻟﻘﻮﺍﻋﺪ ﺍﻷﻭﻟﻮﻳﺔ ﺑﲔ ﺍﻟﻌﻤﻠﻴﺎﺕ ﺍﳌﺬﻛﻮﺭﺓ ﺃﻋﻼﻩ‪ ،‬ﻟﻨﺄﺧﺬ ﻣﻌﺎﺩﻟﺔ ﻛﺜﲑ‬
‫ﺣﺪﻭﺩ ﻣﻦ ﺍﻟﺪﺭﺟﺔ ﺍﻟﺜﺎﻧﻴﺔ‪:‬‬
‫;‪y = a * x * x + b * x + c‬‬

‫‪6‬‬ ‫‪١‬‬ ‫‪٢‬‬ ‫‪٤‬‬ ‫‪٣‬‬ ‫‪٥‬‬

‫ﺗﻮﺿﺢ ﺍﻷﺭﻗﺎﻡ ﺍﳌﻮﺟﻮﺩﺓ ﺿﻤﻦ ﺍﻟﺪﻭﺍﺋﺮ ﻋﻠﻰ ﺗﺴﻠﺴﻞ ﺣﺴﺎﺏ ﺍﻟﻌﻤﻠﻴﺎﺕ ﺍﻟﺬﻱ ﺗﻄﺒﻘﻪ ﻟﻐﺔ ‪ C++‬ﻋﻠﻴﻬﺎ‪.‬‬
‫ﻻ ﻳﻮﺟﺪ ﰲ ﻟﻐﺔ ‪ C++‬ﻋﻤﻠﻴﺔ ﺣﺴﺎﺑﻴﺔ ﺧﺎﺻﺔ ﺑﻌﻤﻠﻴﺔ ﺍﻟﺮﻓﻊ ﺇﱃ ﻗﻮﺓ ‪ exponentiation‬ﻟﺬﻟﻚ ﻗﻤﻨﺎ ﺑﺘﻤﺜﻴﻞ‬
‫ﺍﳊﺪ ‪ x‬ﻋﻠﻰ ﺍﻟﺸﻜﻞ ‪ .x*x‬ﺳﻮﻑ ﻧﺘﺤﺪﺙ ﻓﻴﻤﺎ ﺑﻌﺪ ﻋﻦ ﺍﻟﺘﺎﺑﻊ ‪ (“power”) pow‬ﺍﻟﺬﻱ ﳛﻘﻖ ﻋﻤﻠﻴﺔ‬ ‫‪2‬‬

‫ﺍﻟﺮﻓﻊ ﺇﱃ ﻗﻮﺓ‪ .‬ﻭﻟﻜﻦ ﺑﺴﺒﺐ ﺑﻌﺾ ﺍﻷﻣﻮﺭ ﺍﻟﺪﻗﻴﻘﺔ ﺍﳌﺘﻌﻠﻘﺔ ﺑﺄﳕﺎﻁ ﺍﳌﻌﻄﻴﺎﺕ ﺍﻟﱵ ﻳﺴﺘﺨﺪﻣﻬﺎ ﺍﻟﺘﺎﺑﻊ ‪،pow‬‬
‫ﺳﻮﻑ ﻧﺆﺟﻞ ﺷﺮﺡ ﺍﻟﺘﻔﺼﻴﻼﺕ ﺍﳌﺘﻌﻠﻘﺔ ﻬﺑﺬﺍ ﺍﻟﺘﺎﺑﻊ ﺣﱴ ﺍﻟﻔﺼﻞ ‪.3‬‬
‫أﺥﻄﺎء ﺑﺮﻣﺠﻴﺔ ﺵﺎﺉﻌﺔ‬ ‫‪5-1‬‬

‫ﻟﻠﺘﻌﺒﻴﺮ ﻋﻦ ﻋﻤﻠﻴﺔ اﻟﺮﻓﻊ إﻟﻰ‬ ‫ﺕﺴﺘﺨﺪم ﺑﻌﺾ ﻟﻐﺎت اﻟﺒﺮﻣﺠﺔ اﻟﻌﻤﻠﻴﺔ‬


‫أو‬
‫‪7‬‬
‫^‬ ‫**‬
‫ﻗﻮة‪.‬‬
‫ﻻ ﺕﺪﻋﻢ ﻟﻐﺔ ‪ C++‬هﺎﺕﻴﻦ اﻟﻌﻤﻠﻴﺘﻴﻦ اﻟﺘﻲ یﺆدي اﺳﺘﺨﺪاﻣﻬﻤﺎ إﻟﻰ ﺣﺪوث ﺥﻄﺄ‬
‫ﻗﻮاﻋﺪي‪.‬‬

‫ﺑﻔﺮﺽ ﺃﻧﻨﺎ ﻧﻌﻄﻲ ﻟﻠﻤﺘﺤﻮﻻﺕ ‪ c, b, a‬ﻭ ‪ x‬ﻗﻴﻤﹰﺎ ﺍﺑﺘﺪﺍﺋﻴﺔ ﲝﻴﺚ‪ a=2 :‬ﻭ ‪ b=3‬ﻭ ‪ c=7‬ﻭ ‪ .x=5‬ﻳﺒﲔ ﺍﻟﺸﻜﻞ‬
‫‪ 12-1‬ﺗﺮﺗﻴﺐ ﺗﻄﺒﻴﻖ ﺍﻟﻌﻤﻠﻴﺎﺕ ﰲ ﻋﻤﻠﻴﺔ ﺣﺴﺎﺏ ﻛﺜﲑ ﺍﳊﺪﻭﺩ ﻣﻦ ﺍﻟﺪﺭﺟﺔ ﺍﻟﺜﺎﻧﻴﺔ ﺍﳌﺬﻛﻮﺭ ﺃﻋﻼﻩ‪.‬‬
‫ﻧﻌﻠﻢ ﺃﻧﻪ ﻣﻦ ﺍﳌﻤﻜﻦ ﺇﺿﺎﻓﺔ ﺃﻗﻮﺍﺱ ﻏﲑ ﺿﺮﻭﺭﻳﺔ ﺇﱃ ﺍﻟﻌﺒﺎﺭﺍﺕ ﺍﳊﺴﺎﺑﻴﺔ ﻟﻨﺠﻌﻞ ﻣﻨﻬﺎ ﺗﻌﺎﺑﲑ ﺃﻭﺿﺢ‪.‬‬
‫ﻧﺴﻤﻲ ﻋﺎﺩ ﹰﺓ ﻫﺬﻩ ﺍﻷﻗﻮﺍﺱ ﻏﲑ ﺍﻟﻀﺮﻭﺭﻳﺔ ﺑـ "ﺃﻗﻮﺍﺱ ﺯﺍﺋﺪﺓ"‪ .‬ﻋﻠﻰ ﺳﺒﻴﻞ ﺍﳌﺜﺎﻝ‪ ،‬ﳝﻜﻦ ﻛﺘﺎﺑﺔ ﻣﻌﺎﺩﻟﺔ‬
‫ﻛﺜﲑ ﺍﳊﺪﻭﺩ ﻣﻦ ﺍﻟﺪﺭﺟﺔ ﺍﻟﺜﺎﻧﻴﺔ ﺍﻟﺴﺎﺑﻘﺔ ﻋﻠﻰ ﺍﻟﺸﻜﻞ ﺍﻟﺘﺎﱄ‪:‬‬
‫;‪y=(a*x*x) + (b*x) + c‬‬

‫ﻋﺎدات ﺑﺮﻣﺠﻴﺔ ﺝﻴﺪة‬ ‫‪15-1‬‬

‫ﻧﻌﻤﺪ أﺣﻴﺎﻧًﺎ ﻓﻲ اﻟﺘﻌﺎﺑﻴﺮ اﻟﺠﺒﺮیﺔ إﻟﻰ إﺿﺎﻓﺔ أﻗﻮاس زاﺋﺪة ﻟﺠﻌﻞ هﺬﻩ‬
‫اﻟﺘﻌﺎﺑﻴﺮ أآﺜﺮ وﺿﻮﺣًﺎ‪ .‬یﻤﻜﻨﻨﺎ اﻟﻘﻴﺎم ﺑﺬﻟﻚ ﻋﻨﺪ آﺘﺎﺑﺔ هﺬﻩ اﻟﺘﻌﺎﺑﻴﺮ ﺑﻠﻐﺔ ‪.C++‬‬
‫آﻤﺎ ویﻔﻀﻞ أﺣﻴﺎﻧًﺎ ﻟﺰیﺎدة اﻟﻮﺿﻮح ﺕﻘﺴﻴﻢ اﻟﺘﻌﺎﺑﻴﺮ اﻟﺤﺴﺎﺑﻴﺔ اﻟﻤﻌﻘﺪة إﻟﻰ‬
‫أﺝﺰاء أﺹﻐﺮ وأﺳﻬﻞ ﻟﻠﻘﺮاءة‪.‬‬

‫إﺗﺨﺎذ اﻟﻘﺮار‪ :‬ﻋﻤﻠﻴﺎت اﻟﻤﺴﺎواة واﻟﻤﻘﺎرﻥﺔ‬ ‫‪25-1‬‬


‫ﻭﺍﻟﱵ ﺗﺴﻤﺢ ﻟﻠﱪﻧﺎﻣﺞ ﺑﺎﲣﺎﺫ ﻗﺮﺍﺭ ﻳﻌﺘﻤﺪ ﻋﻠﻰ‬ ‫‪if‬‬ ‫ﻧﻌﺮﺽ ﰲ ﻫﺬﺍ ﺍﳌﻘﻄﻊ ﻧﺴﺨﺔ ﻣﺒﺴﻄﺔ ﻟﺒﻨﻴﺔ ﺗﻌﻠﻴﻤﺔ‬
‫‪٦٣‬‬ ‫‪ .1‬ﻣﻘﺪﻣﺔ ﺣﻮل اﻟﺤﻮاﺳﻴﺐ واﻟﺒﺮﻣﺠﺔ ﺑﻠﻐﺔ ‪C++‬‬

‫ﺻﺤﺔ ﺃﻭ ﻋﺪﻡ ﺻﺤﺔ ﺷﺮﻁ ﻣﺎ‪ .‬ﻋﻨﺪ ﲢﻘﻖ ﺍﻟﺸﺮﻁ ﺍﳌﻔﺮﻭﺽ‪ ،‬ﻳﺒﺪﺃ ﺗﻨﻔﻴﺬ ﺍﻟﺘﻌﻠﻴﻤﺔ ﺍﳌﻮﺟﻮﺩﺓ ﰲ ﺟﺴﻢ‬
‫ﺑﻨﻴﺔ ‪ .if‬ﻭﰲ ﺣﺎﻝ ﻋﺪﻡ ﲢﻘﻘﻪ ﻻﻳﺘﻢ ﺗﻨﻔﻴﺬ ﻫﺬﺍ ﺍﳉﺰﺀ‪ .‬ﻛﻤﺎ ﺳﻨﺮﻯ ﰲ ﺍﳌﺜﺎﻝ ﺍﳌﺒﲔ ﻓﻴﻤﺎ ﻳﻠﻲ‪.‬‬
‫ﳝﻜﻦ ﺻﻴﺎﻏﺔ ﺍﻟﺸﺮﻭﻁ ﺍﳋﺎﺻﺔ ﺑﺎﻟﺒﲎ ﺍﻟﱵ ﺗﻌﺘﻤﺪ ﻋﻠﻰ ﺗﻌﻠﻴﻤﺔ ‪ if‬ﺑﺎﺳﺘﺨﺪﺍﻡ ﻋﻤﻠﻴﺎﺕ ﺍﳌﺴﺎﻭﺍﺓ ﻭﺍﳌﻘﺎﺭﻧﺔ‬
‫ﺍﳌﻠﺨﺼﺔ ﰲ ﺍﻟﺸﻜﻞ ‪ .13-1‬ﻟﻜﻞ ﻋﻤﻠﻴﺎﺕ ﺍﳌﻘﺎﺭﻧﺔ ﻧﻔﺲ ﺍﳌﺴﺘﻮﻯ ﻣﻦ ﺍﻷﻭﻟﻮﻳﺔ ﻭﻫﻲ ﲡﻤﻴﻌﻴﺔ ﻣﻦ ﺍﻟﻴﺴﺎﺭ‬
‫ﺇﱃ ﺍﻟﻴﻤﲔ‪ ،‬ﺃﻣﺎ ﻓﻠﻌﻤﻠﻴﱵ ﺍﳌﺴﺎﻭﺍﺓ ﻧﻔﺲ ﺍﳌﺴﺘﻮﻯ ﻣﻦ ﺍﻷﻭﻟﻮﻳﺔ ﺃﻳﻀﹰﺎ ﻟﻜﻨﻪ ﺃﺧﻔﺾ ﻣﻦ ﻣﺴﺘﻮﻯ ﺃﻭﻟﻮﻳﺔ‬
‫ﻋﻤﻠﻴﺎﺕ ﺍﳌﻘﺎﺭﻧﺔ ﻭﻫﻲ ﻛﺬﻟﻚ ﲡﻤﻴﻌﻴﺔ ﻣﻦ ﺍﻟﻴﺴﺎﺭ ﺇﱃ ﺍﻟﻴﻤﲔ‪.‬‬

‫]‪< <íéÞ^nÖ]<íq…‚Ö]<àÚ<æ‚u<nÒ<íÛéÎ<h^Š£<l^é×ÛÃÖ]<h^Šu<؊׊i<<V12-1<ØÓÖ‬‬

‫ﻣﻌﻨﻰ اﻟﺸﺮط‬ ‫ﻣﺜﺎل ﻣﻜﺘﻮب ﺑﻠﻐﺔ‬ ‫اﻟﺸﻜﻞ اﻟﻤﻮاﻓﻖ‬ ‫اﻟﺸﻜﻞ اﻟﺠﺒﺮي‬


‫ﺣﺴﺐ ﻟﻐﺔ ‪C++‬‬ ‫‪C++‬‬ ‫ﺣﺴﺐ ﻟﻐﺔ ‪C++‬‬ ‫ﻟﻌﻤﻠﻴﺎت اﻟﻤﺴﺎواة‬
‫أو ﻟﻌﻤﻠﻴﺎت‬
‫اﻟﻤﻘﺎرﻥﺔ‬
‫ﻋﻤﻠﻴﺎت اﻟﻤﺴﺎواة‬
‫‪ x‬ﺕﺴﺎوي ‪.y‬‬ ‫‪x==y‬‬ ‫==‬ ‫=‬
‫اﻟﻔﺼﻞ اﻷول‬ ‫‪٦٤‬‬

‫ﻣﻌﻨﻰ اﻟﺸﺮط‬ ‫ﻣﺜﺎل ﻣﻜﺘﻮب ﺑﻠﻐﺔ‬ ‫اﻟﺸﻜﻞ اﻟﻤﻮاﻓﻖ‬ ‫اﻟﺸﻜﻞ اﻟﺠﺒﺮي‬


‫‪C++‬‬ ‫ﺣﺴﺐ ﻟﻐﺔ‬ ‫‪C++‬‬ ‫‪C++‬‬ ‫ﺣﺴﺐ ﻟﻐﺔ‬ ‫ﻟﻌﻤﻠﻴﺎت اﻟﻤﺴﺎواة‬
‫أو ﻟﻌﻤﻠﻴﺎت‬
‫اﻟﻤﻘﺎرﻥﺔ‬
‫‪ x‬ﻻﺕﺴﺎوي ‪.y‬‬ ‫‪x !=y‬‬ ‫=!‬ ‫≠‬

‫ﻋﻤﻠﻴﺎت اﻟﻤﻘﺎرﻧﺔ‬
‫‪ x‬أآﺒﺮ ﻣﻦ‬
‫‪y‬‬ ‫‪x>y‬‬ ‫>‬ ‫>‬

‫‪ x‬أﺹﻐﺮ ﻣﻦ ‪y‬‬ ‫‪x<y‬‬ ‫<‬ ‫<‬

‫‪ x‬أآﺒﺮ أو ﺕﺴﺎوي ‪y‬‬ ‫‪x>=y‬‬ ‫=>‬ ‫≥‬

‫‪ x‬أﺹﻐﺮ أو ﺕﺴﺎوي‬ ‫‪x<=y‬‬ ‫=<‬ ‫≤‬


‫‪y‬‬

‫]‪< <íÞ…^Ϲ]æ<ì]æ^Š¹]<l^é×ÛÂ<Ùæ‚q<<V13-1<ØÓÖ‬‬

‫أﺥﻄﺎء ﺑﺮﻣﺠﻴﺔ ﺵﺎﺉﻌﺔ‬ ‫‪6-1‬‬

‫یﻤﻜﻦ أن یﺤﺪث ﺥﻄﺄ ﻗﻮاﻋﺪي ﻋﻨﺪﻣﺎ ﻧﻀﻊ ﻓﺮاﻏﺎت ﺑﻴﻦ اﻟﺮﻣﻮز اﻟﻤﻌﺒﺮة‬
‫ﻋﻦ اﻟﻌﻤﻠﻴﺎت اﻟﺘﺎﻟﻴﺔ‪.<= ،>= ،!= ،== :‬‬ ‫‪7‬‬
‫أﺥﻄﺎء ﺑﺮﻣﺠﻴﺔ ﺵﺎﺉﻌﺔ‬ ‫‪7-1‬‬

‫ﺕﺴﺒﺐ اﻟﻜﺘﺎﺑﺔ اﻟﻤﻌﻜﻮﺳﺔ ﻟﻠﻌﻤﻠﻴﺎت =!‪ >= ،‬و =< ﻋﻠﻰ اﻟﺸﻜﻞ !=‪ => ،‬و‬
‫<= ﻋﻠﻰ اﻟﺘﺮﺕﻴﺐ‪ ،‬ﺥﻄًﺄ ﻗﻮاﻋﺪیًﺎ‪ .‬ﻓﻲ ﺑﻌﺾ اﻟﺤﺎﻻت‪ ،‬ﻻ ﺕﺴﺒﺐ اﻟﻜﺘﺎﺑﺔ‬ ‫‪7‬‬
‫ﻟﻠﻌﻤﻠﻴﺔ =! ﻋﻠﻰ اﻟﺸﻜﻞ != ﺥﻄﺄ ﻗﻮاﻋﺪیًﺎ ﻟﻜﻨﻬﺎ ﺕﺴﺒﺐ ﺣﺘﻤًﺎ ﺥﻄًﺄ ﻣﻨﻄﻘﻴًﺎ ذو‬
‫ﺕﺄﺛﻴﺮ ﻋﻠﻰ ﻣﺠﺮى ﺕﻨﻔﻴﺬ اﻟﺒﺮﻧﺎﻣﺞ‪.‬‬

‫أﺥﻄﺎء ﺑﺮﻣﺠﻴﺔ ﺵﺎﺉﻌﺔ‬ ‫‪8-1‬‬

‫ﻣﻦ اﻷﺥﻄﺎء اﻟﺒﺮﻣﺠﻴﺔ اﻟﺸﺎﺋﻌﺔ هﻨﺎك ﻣﺸﻜﻠﺔ اﻟﺨﻠﻂ ﻣﺎ ﺑﻴﻦ ﻋﻤﻠﻴﺔ اﻟﻤﺴﺎواة‬
‫)==( وﻋﻤﻠﻴﺔ اﻷﺳﻨﺎد )=(‪ .‬یﺠﺐ أن ﻧﻘﺮأ ﻋﻤﻠﻴﺔ اﻟﻤﺴﺎواة ﻋﻠﻰ اﻟﺸﻜﻞ‬
‫"اﻟﻤﻌﺎﻣﻞ اﻷول یﺴﺎوي اﻟﻤﻌﺎﻣﻞ اﻟﺜﺎﻧﻲ" ﻓﻲ ﺣﻴﻦ یﺠﺐ أن ﻧﻘﺮأ ﻋﻤﻠﻴﺔ‬
‫‪7‬‬
‫اﻻﺳﻨﺎد ﻋﻠﻰ اﻟﺸﻜﻞ اﻟﺘﺎﻟﻲ "اﻟﻤﻌﺎﻣﻞ اﻷول یﺄﺥﺬ ﻗﻴﻤﺔ اﻟﻤﻌﺎﻣﻞ اﻟﺜﺎﻧﻲ"‪ .‬آﻤﺎ‬
‫ﺳﻨﺮى ﻻﺣﻘﺎً‪ ،‬إن ﻋﻤﻠﻴﺔ اﻟﺨﻠﻂ ﺑﻴﻦ اﻟﻌﻤﻠﻴﺘﻴﻦ اﻟﺴﺎﺑﻘﺘﻴﻦ ﻻﺕﺴﺒﺐ ﺑﺎﻟﻀﺮورة‬
‫ﺥﻄًﺄ ﻗﻮاﻋﺪیًﺎ ﺳﻬﻞ اﻻآﺘﺸﺎف وأﻧﻤﺎ یﻤﻜﻦ أن ﺕﺴﺒﺐ ﺕﻐﻴﻴﺮًا ﺝﺬریًﺎ ﻓﻲ ﻣﻨﻄﻖ‬
‫اﻟﺒﺮﻧﺎﻣﺞ‪.‬‬
٦٥ C++ ‫ ﻣﻘﺪﻣﺔ ﺣﻮل اﻟﺤﻮاﺳﻴﺐ واﻟﺒﺮﻣﺠﺔ ﺑﻠﻐﺔ‬.1

‫ ﻋﻨﺪ‬.‫( ﻟﻠﻤﻘﺎﺭﻧﺔ ﺑﲔ ﺭﻗﻤﲔ ﻣﺪﺧﻠﲔ ﻣﻦ ﻗﺒﻞ ﺍﳌﺴﺘﺨﺪﻡ‬if ) ‫ﻳﺴﺘﺨﺪﻡ ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺘﺎﱄ ﺳﺘﺔ ﺗﻌﻠﻴﻤﺎﺕ‬
.‫ﲢﻘﻖ ﺍﻟﺸﺮﻁ ﺍﳌﺮﺍﻓﻖ ﻷﻱ ﻣﻦ ﺍﻟﺘﻌﻠﻴﻤﺎﺕ ﺍﻟﺴﺎﺑﻖ ﻳﺘﻢ ﺗﻨﻔﻴﺬ ﺗﻌﻠﻴﻤﺔ ﺍﳋﺮﺝ ﺍﳌﺮﺍﻓﻘﺔ ﻟﺘﻠﻚ ﺍﻟﺘﻌﻠﻴﻤﺔ‬
‫ ﻧﺺ ﺍﻟﱪﻧﺎﻣﺞ ﺍﳊﺎﻭﻱ ﻋﻠﻰ ﺍﻟﺘﻌﻠﻴﻤﺎﺕ ﺍﳌﺬﻛﻮﺭﺓ ﺑﺎﻹﺿﺎﻓﺔ ﺇﱃ ﺫﻛﺮ ﺛﻼﺛﺔ ﺃﺷﻜﺎﻝ‬14-1 ‫ﻳﻮﺿﺢ ﺍﻟﺸﻜﻞ‬
.‫ﳐﺘﻠﻔﺔ ﳋﺮﺝ ﻫﺬﺍ ﺍﻟﱪﻧﺎﻣﺞ‬

1. // Fig. 1.14: fig01_14.cpp


2. // Using if statements, relational
3. // operators, and equality operators.
4. #include <iostream>
5.
6. using std::cout; // program uses cout
7. using std::cin; // program uses cin
8. using std::endl; // program uses endl
9.
10. // function main begins program execution
11. int main()
12. {
13. int num1; // first number to be read from user
14. int num2; // second number to be read from user
15.
16. cout << "Enter two integers, and I will tell you\n"

17. <<" the relationships they satisfy‫ "؛‬:
18. cin >> num1 >> num2; // read two integers
19.
20. if ( num1 == num2)
21. cout << num1 << " is equal to " << num2 << endl;
22.
23. if ( num1 != num2)
24. cout << num1 << " is not equal to " << num2 << endl;
25.
26. if ( num1 < num2)
27. cout << num1 << " is less than " << num2 << endl;
28.
29. if ( num1 > num2)
30. cout << num1 << " is greater than " << num2 << endl;
31.
32. if ( num1 <= num2)
33. cout << num1 << " is less than or equal to"
34. <<num2 << endl;
35.
36. if ( num1 >= num2)
37. cout << num1 << " is greater than or equal to"
38. <<num2 << endl;
39.
40. return 0; // indicate that program ended successfully
41.
42. } // end function main
‫اﻟﻔﺼﻞ اﻷول‬ ٦٦

Enter two integers, and I will tell you


the relationships they satisfy: 3 7
٣ is not equal to 7
٣ is less than 7
٣ is less than or equal to 7

Enter two integers, and I will tell you


the relationships they satisfy: 22 12
٢٢ is not equal to 12
٢٢ is greater than 12
٢٢ is greater than or equal to 12

Enter two integers, and I will tell you


the relationships they satisfy: 7 7
٧ is equal to 7
٧ is less than or equal to 7
٧ is greater than or equal to 7

< <íÞ…^Ϲ]æ<ì]æ^Š¹]<l^é×ÛÂ<Ý]‚~j‰]<V14-1<ØÓÖ]

:8-6 ‫ﺗﺘﻀﻤﻦ ﺍﻷﺳﻄﺮ‬


Using std::cout; //program uses cout
Using std::cin; //program uses cin
Using std::endl; //program uses endl

‫ ﰲ ﻛﻞ ﻣﺮﺓ ﻧﺮﻳﺪ ﻓﻴﻬﺎ ﺍﻟﺘﻌﺎﻣﻞ‬std: : ‫ ﺍﻟﱵ ﺗﻔﻴﺪ ﰲ ﺇﻟﻐﺎﺀ ﺍﳊﺎﺟﺔ ﺇﱃ ﺍﺳﺘﺨﺪﺍﻡ ﺍﻟﺒﺎﺩﺋﺔ‬Using ‫ﺗﻌﻠﻴﻤﺎﺕ‬
‫ ﺩﻭﻥ ﺍﳊﺎﺟﺔ ﺇﱃ‬cout ‫ ﺑﻌﺪ ﺫﻛﺮ ﻫﺬﻩ ﺍﻟﺘﻌﻠﻴﻤﺎﺕ ﳝﻜﻨﻨﺎ ﺫﻛﺮ‬.‫ﺧﺮﺝ‬/‫ﻣﻊ ﻣﺘﺤﻜﻤﺎﺕ ﳎﺎﺭﻱ ﺍﻟﺪﺧﻞ‬
.endl‫ ﻭ‬cin ‫ ﻛﺬﻟﻚ ﺍﻷﻣﺮ ﺑﺎﻟﻨﺴﺒﺔ ﻟـ‬.std: :cout :‫ﺍﻟﻜﺘﺎﺑﺔ ﻋﻠﻰ ﺍﻟﺸﻜﻞ ﺍﻟﺘﺎﱄ‬
‫ﻣﻼﺣﻈﺔ‬ 2-1

‫ ﺳﻮف ﺕﻼﺣﻆ أن اﻷﻣﺜﻠﺔ اﻟﺒﺮﻣﺠﻴﺔ اﻟﻤﺬآﻮرة ﺕﺘﻀﻤﻦ‬،ً‫ﻣﻦ اﻵن ﻓﺼﺎﻋﺪا‬


.‫ أو أآﺜﺮ‬using ‫ﺕﻌﻠﻴﻤﺔ‬

‫ﻋﺎدات ﺑﺮﻣﺠﻴﺔ ﺝﻴﺪة‬ 16-1

.‫ ﻣﺒﺎﺵﺮة‬include ‫ وأذآﺮهﺎ ﺑﻌﺪ أﺳﻄﺮ‬using ‫اﺳﺘﺨﺪم ﺕﻌﻠﻴﻤﺎت‬

:14‫ ﻭ‬13 ‫ﻳﻔﻴﺪ ﺍﻟﺴﻄﺮﺍﻥ‬


int num1; //first number to be read from user
int num2; //second number to be read from user
‫‪٦٧‬‬ ‫‪ .1‬ﻣﻘﺪﻣﺔ ﺣﻮل اﻟﺤﻮاﺳﻴﺐ واﻟﺒﺮﻣﺠﺔ ﺑﻠﻐﺔ ‪C++‬‬

‫ﰲ ﺍﻟﺘﺼﺮﻳﺢ ﻋﻦ ﺍﳌﺘﺤﻮﻻﺕ ﺍﳌﺴﺘﺨﺪﻣﺔ ﺿﻤﻦ ﻧﺺ ﺍﻟﱪﻧﺎﻣﺞ‪ .‬ﺗﺬﻛﺮ ﺃﻧﻪ ﳝﻜﻦ ﺫﻛﺮ ﺍﻟﺘﺼﺮﳛﺎﺕ ﻋﻠﻰ‬
‫ﺷﻜﻞ ﺃﺳﻄﺮ ﻣﻨﻔﺼﻠﺔ ﺃﻭ ﺳﻄﺮ ﻭﺍﺣﺪ‪.‬‬
‫ﻻﺣﻆ ﺃﻥ ﺍﻟﱪﻧﺎﻣﺞ ﰲ ﺍﻟﺸﻜﻞ ‪ 14-1‬ﻳﺴﺘﺨﺪﻡ ﺃﺳﻠﻮﺏ ﺍﻹﺳﺘﺨﺮﺍﺝ ﺍﳌﺘﻌﺪﺩ ﻣﻦ ﳎﺮﻯ ﺍﻟﺪﺧﻞ ﻹﺩﺧﺎﻝ‬
‫ﻋﺪﺩﻳﻦ ﺻﺤﻴﺤﲔ ﺣﻴﺚ ﻳﺘﻢ ﻗﺮﺍﺀﺓ ﺍﻟﻘﻴﻤﺔ ﺍﻷﻭﱃ ﻟﻮﺿﻌﻬﺎ ﰲ ﺍﳌﺘﺤﻮﻝ ‪ num1‬ﰒ ﺗُﻘﺮﺃ ﺑﻌﺪﻫﺎ ﺍﻟﻘﻴﻤﺔ‬
‫ﺍﻟﺜﺎﻧﻴﺔ ﻟﺘﻮﺿﻊ ﰲ ﺍﳌﺘﺤﻮﻝ ‪) num2‬ﺍﻟﺴﻄﺮ ‪.(18‬‬
‫ﻻﺣﻆ ﻃﺮﻳﻘﺔ ﺍﻹﺯﺍﺣﺔ ﺍﻟﱵ ﻛﺘﺐ ﻬﺑﺎ ﺟﺴﻢ ﺗﻌﻠﻴﻤﺔ ‪ if‬ﰲ ﺍﻟﱪﻧﺎﻣﺞ ﺍﳌﺒﲔ ﰲ ﺍﻟﺸﻜﻞ ‪ .14-1‬ﺗﺴﺎﻋﺪ ﻫﺬﻩ‬
‫ﺍﻟﻄﺮﻳﻘﺔ ﻋﻠﻰ ﺯﻳﺎﺩﺓ ﺍﻟﻘﺪﺭﺓ ﻋﻠﻰ ﻗﺮﺍﺀﺓ ﺍﻟﱪﻧﺎﻣﺞ‪ .‬ﻳﺘﺄﻟﻒ ﺟﺴﻢ ﺗﻌﻠﻴﻤﺎﺕ ‪ if‬ﺍﻟﺴﺎﺑﻘﺔ ﻣﻦ ﺗﻌﻠﻴﻤﺔ ﻭﺍﺣﺪﺓ‬
‫ﻭﺳﻮﻑ ﻧﺮﻯ ﰲ ﺍﻟﻔﺼﻞ ‪ 2‬ﻛﻴﻔﻴﺔ ﻛﺘﺎﺑﺔ ﺟﺴﻢ ﻟﺘﻌﻠﻴﻤﺔ ‪ ‘if‬ﻣﺆﻟﻒ ﻣﻦ ﻋﺪﺓ ﺗﻌﻠﻴﻤﺎﺕ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺍﻷﻗﻮﺍﺱ } {‪.‬‬
‫ﻋﺎدات ﺑﺮﻣﺠﻴﺔ ﺝﻴﺪة‬ ‫‪17-1‬‬

‫ﺕﺒﺮز ذﻟﻚ اﻟﺠﺰء ﻣﻦ اﻟﺘﻌﻠﻴﻤﺔ‬ ‫‪if‬‬ ‫إن إزاﺣﺔ اﻟﺘﻌﻠﻴﻤﺎت داﺥﻞ ﺝﺴﻢ ﺕﻌﻠﻴﻤﺔ‬
‫ویﺰیﺪ ﻣﻦ اﻟﻘﺪرة ﻋﻠﻰ ﻗﺮاءة اﻟﺒﺮﻧﺎﻣﺞ‪.‬‬

‫ﻋﺎدات ﺑﺮﻣﺠﻴﺔ ﺝﻴﺪة‬ ‫‪18-1‬‬

‫ﻻ یﺠﺐ وﺿﻊ أآﺜﺮ ﻣﻦ ﺕﻌﻠﻴﻤﺔ واﺣﺪة ﻓﻲ آﻞ ﺳﻄﺮ ﻣﻦ أﺳﻄﺮ اﻟﺒﺮﻧﺎﻣﺞ‪.‬‬

‫أﺥﻄﺎء ﺑﺮﻣﺠﻴﺔ ﺵﺎﺉﻌﺔ‬ ‫‪9-1‬‬

‫إن وﺿﻊ ﻓﺎﺹﻠﺔ ﻣﻨﻘﻮﻃﺔ );( ﺑﻌﺪ اﻟﻘﻮس اﻷیﻤﻦ اﻟﺬي یﺤﺪد ﻧﻬﺎیﺔ ﺕﻌﻠﻴﻤﺔ‬
‫‪if‬‬
‫هﻮ ﻣﻦ اﻷﺥﻄﺎء اﻟﺒﺮﻣﺠﻴﺔ اﻟﺸﺎﺋﻌﺔ‪ .‬آﻤﺎ أن وﺿﻌﻬﺎ ﺑﻌﺪ اﻟﺸﺮط اﻟﺨﺎص‬
‫ﺑﻬﺬﻩ اﻟﺘﻌﻠﻴﻤﺔ یﺆدي إﻟﻰ ﺕﻨﻔﻴﺬهﺎ دون اﻟﻘﻴﺎم ﺑﺄي ﻓﻌﻞ ﺑﻐﺾ اﻟﻨﻈﺮ ﻋﻦ آﻮن‬
‫‪7‬‬
‫اﻟﺸﺮط ﻣﺤﻘﻖ أم ﻻ واﻻﺳﻮء ﻣﻦ ذﻟﻚ أن ﺝﺴﻢ ﺕﻌﻠﻴﻤﺔ یﻨﻔﺼﻞ ﺑﻨﺘﻴﺠﺔ ذﻟﻚ‬
‫ﻋﻦ اﻟﺘﻌﻠﻴﻤﺔ ویﺘﻢ ﺕﻨﻔﻴﺬﻩ داﺋﻤًﺎ‪.‬‬

‫ﻻﺣﻆ ﻭﺟﻮﺩ ﺍﻟﻔﻮﺍﺻﻞ ﺑﲔ ﺍﻟﺘﻌﻠﻴﻤﺎﺕ ﰲ ﻧﺺ ﺍﻟﱪﻧﺎﻣﺞ ﺍﳌﻮﺿﺢ ﰲ ﺍﻟﺸﻜﻞ ‪ .14-1‬ﻣﻦ ﻫﺬﻩ ﺍﻟﻔﻮﺍﺻﻞ‬
‫ﻟﺪﻳﻨﺎ ﺇﺷﺎﺭﺍﺕ ﺍﳉﺪﻭﻟﺔ ‪ tabs‬ﻭﺍﻷﺳﻄﺮ ﺍﳉﺪﻳﺪﺓ ‪ newlines‬ﻭﺍﻟﻔﺮﺍﻏﺎﺕ ‪ spaces‬ﻭﺍﻟﱵ ﻳﺘﻢ ﲡﺎﻫﻠﻬﺎ ﻋﺎﺩ ﹰﺓ‬
‫ﻣﻦ ﻗﺒﻞ ﺍﳌﺘﺮﺟﻢ‪ .‬ﻟﺬﻟﻚ ﻣﻦ ﺍﳌﻤﻜﻦ ﲡﺰﺋﺔ ﺍﻟﺘﻌﻠﻴﻤﺎﺕ ﻋﻠﻰ ﻋﺪﺓ ﺃﺳﻄﺮ ﻭﳝﻜﻦ ﺃﻳﻀﹰﺎ ﻭﳝﻜﻦ ﺃﻳﻀﹰﺎ ﻭﺿﻊ‬
‫ﺃﺟﺰﺍﺀﻫﺎ ﻋﻠﻰ ﺍﻟﺸﻜﻞ ﺍﻟﺬﻱ ﻳﻔﻀﻠﻪ ﺍﳌﱪﻣﺞ ﻭﻟﻜﻦ ﳚﺐ ﺍﻻﻧﺘﺒﺎﻩ ﺇﱃ ﺃﻥ ﲡﺰﺋﺔ ﺍﳌﹸﻌﺮﻓﺎﺕ ‪ identifiers‬ﻫﻲ‬
‫ﻋﻤﻠﻴﺔ ﻏﲑ ﺻﺤﻴﺤﺔ‪.‬‬
‫أﺥﻄﺎء ﺑﺮﻣﺠﻴﺔ ﺵﺎﺉﻌﺔ‬ ‫‪10-1‬‬

‫ﺕﺴﺒﺐ ﺕﺠﺰﺋﺔ اﻟﻤُﻌﺮﻓﺎت إﻟﻰ أﺝﺰاء ﺑﻌﺪ وﺿﻊ ﻓﻮاﺹﻞ ﺿﻤﻨﻬﺎ‪ ،‬ﺥﻄ ًﺄ‬
‫ﻗﻮاﻋﺪیًﺎ )ﻣﺜﺎل‪ :‬آﺘﺎﺑﺔ ‪ main‬ﻋﻠﻰ اﻟﺸﻜﻞ ‪.(ma in‬‬ ‫‪7‬‬
‫اﻟﻔﺼﻞ اﻷول‬ ‫‪٦٨‬‬

‫ﻋﺎدات ﺑﺮﻣﺠﻴﺔ ﺝﻴﺪة‬ ‫‪19-1‬‬

‫یﻤﻜﻦ أن ﺕﺸﻐﻞ ﺕﻌﻠﻴﻤﺔ ﻃﻮیﻠﺔ ﻋﺪة أﺳﻄﺮ‪ .‬ﻟﺬﻟﻚ إذا ﻣﺎ ﺹﺎدﻓﺘﻨﺎ ﺕﻠﻚ اﻟﺤﺎﻟﺔ یﺠﺐ‬
‫ﺕﺠﺰﺋﺔ اﻟﺘﻌﻠﻴﻤﺔ ﻋﻠﻰ ﻋﺪة أﺳﻄﺮ وﻧﺨﺘﺎر آﻨﻘﺎط ﺕﺠﺰﺋﺔ ﻟﻬﺬﻩ اﻟﺘﻌﻠﻴﻤﺔ اﻟﻤﻮاﺿﻊ‬
‫اﻟﺘﻲ ﻟﻬﺎ ﻣﻌﻨﻰ ﻓﻲ ﻧﺺ اﻟﺘﻌﻠﻴﻤﺔ ﻣﺜﻞ اﻟﻔﻮاﺹﻞ )‪) (,‬ﻓﻲ ﺣﺎﻟﺔ وﺝﻮد ﻗﺎﺋﻤﺔ ﻣﻦ‬
‫اﻟﻌﻨﺎﺹﺮ( أو اﻟﻌﻤﻠﻴﺎت ﻓﻲ اﻟﻌﺒﺎرات اﻟﻄﻮیﻠﺔ‪ .‬ﻋﻨﺪ ﺕﺠﺰﺋﺔ اﻟﺘﻌﻠﻴﻤﺔ ﻋﻠﻰ ﻋﺪة‬
‫أﺳﻄﺮ یﺠﺐ إزاﺣﺔ أﺳﻄﺮهﺎ ﻣﻘﺎرﻧﺔ ﺑﺎﻟﻨﺴﺒﺔ ﻟﻠﺴﻄﺮ اﻷول‪.‬‬

‫ﻳﺒﲔ ﺍﻟﺸﻜﻞ ‪ 15-1‬ﺍﻷﻭﻟﻮﻳﺔ ﺑﲔ ﺍﻟﻌﻤﻠﻴﺎﺕ ﺍﳌﺨﺘﻠﻔﺔ ﺍﻟﱵ ﰎ ﻋﺮﺿﻬﺎ ﰲ ﺍﻟﻔﺼﻞ‪ .‬ﻭﻫﻲ ﻣﺒﻴﻨﺔ ﺣﺴﺐ‬
‫ﺗﺴﻠﺴﻞ ﺗﺮﺗﻴﺒﻬﺎ ﺍﻟﺘﻨﺎﺯﱄ‪ .‬ﻻﺣﻆ ﺃﻥ ﲨﻴﻊ ﻫﺬﻩ ﺍﻟﻌﻤﻠﻴﺎﺕ‪ ،‬ﻣﺎ ﻋﺪﺍ ﻋﻤﻠﻴﺔ ﺍﻹﺳﻨﺎﺩ )=( ﻫﻲ ﻋﻤﻠﻴﺎﺕ‬
‫ﲡﻤﻴﻌﻴﺔ ﻣﻦ ﺍﻟﻴﺴﺎﺭ ﺇﱃ ﺍﻟﻴﻤﲔ‪ .‬ﻓﻌﻤﻠﻴﺔ ﺍﳉﻤﻊ ﻫﻲ ﻋﻤﻠﻴﺔ ﲡﻤﻴﻌﻴﺔ ﻣﻦ ﺍﻟﻴﺴﺎﺭ ﻟﺬﻟﻚ ﻳﺘﻢ ﺣﺴﺎﺏ ﻗﻴﻤﺔ‬
‫ﺍﻟﻌﺒﺎﺭﺓ ‪ x+y+z‬ﻛﻤﺎ ﻟﻮ ﺃﻧﻨﺎ ﻛﺘﺒﻨﺎﻫﺎ ﻋﻠﻰ ﺍﻟﺸﻜﻞ ﺍﻟﺘﺎﱄ‪ .(x+y)+z :‬ﺃﻣﺎ ﺗﻌﻠﻴﻤﺔ ﺍﻹﺳﻨﺎﺩ )=( ﻓﻬﻲ‬
‫ﲡﻤﻴﻌﻴﺔ ﻣﻦ ﺍﻟﻴﻤﲔ ﺇﱃ ﺍﻟﻴﺴﺎﺭ‪ ،‬ﻟﺬﻟﻚ ﺗﻜﺎﻓﺊ ﺍﻟﻌﺒﺎﺭﺓ ‪ x=y=0‬ﺍﻟﻌﺒﺎﺭﺓ ﺍﻟﺘﺎﻟﻴﺔ‪ x=(y=0) :‬ﺣﻴﺚ ﻧﺴﻨﺪ‬
‫ﺃﻭ ﹰﻻ ﺍﻟﻘﻴﻤﺔ ‪ 0‬ﺇﱃ ‪ y‬ﰒ ﻧﺴﻨﺪ ﺍﻟﻨﺘﻴﺠﺔ )ﺍﻟﱵ ﻫﻲ ‪ (0‬ﺇﱃ ‪.x‬‬
‫ﻋﺎدات ﺑﺮﻣﺠﻴﺔ ﺝﻴﺪة‬ ‫‪20-1‬‬

‫ﻋﺪ إﻟﻰ ﺝﺪول أوﻟﻮیﺔ اﻟﻌﻤﻠﻴﺎت ﻋﻨﺪ آﺘﺎﺑﺔ اﻟﻌﺒﺎرات اﻟﺤﺎویﺔ ﻋﻠﻰ ﻋﺪة ﻋﻤﻠﻴﺎت‪.‬‬
‫ﺕﺄآﺪ ﻣﻦ أن ﺕﻨﻔﻴﺬ اﻟﻌﻤﻠﻴﺎت یﺘﻢ ﺣﺴﺐ اﻟﺘﺮﺕﻴﺐ اﻟﺬي ﺕﺘﻮﻗﻌﻪ‪ .‬إذا ﻟﻢ ﺕﻜﻦ ﻣﺘﺄآﺪًا‬
‫ﻣﻦ ﺕﺮﺕﻴﺐ ﺣﺴﺎب اﻟﻌﻤﻠﻴﺎت ﻓﻲ اﻟﻌﺒﺎرات اﻟﻤﻌﻘﺪة‪ ،‬ﻋﻠﻴﻚ ﺑﺎﺳﺘﺨﺪام اﻷﻗﻮاس‬
‫ﻟﺘﺤﺪیﺪ ﺕﺮﺕﻴﺐ ﺕﺴﻠﺴﻞ اﻟﻌﻤﻠﻴﺎت ﺕﻤﺎﻣًﺎ آﻤﺎ یﻤﻜﻦ أن ﻧﺠﺪﻩ ﻓﻲ اﻟﺸﻜﻞ اﻟﺠﺒﺮي‬
‫ﻟﻠﻌﺒﺎرات‪ .‬آﻦ ﻣﺘﺄآﺪًا ﻣﻦ ﻣﺮاﻋﺎة أن ﺑﻌﺾ اﻟﻌﻤﻠﻴﺎت ﻣﺜﻞ ﻋﻤﻠﻴﺔ اﻹﺳﻨﺎد )=(‬
‫ﻻ ﻣﻦ اﻟﻴﺴﺎر إﻟﻰ اﻟﻴﻤﻴﻦ‪.‬‬
‫هﻲ ﻋﻤﻠﻴﺔ ﺕﺠﻤﻌﻴﺔ ﻣﻦ اﻟﻴﻤﻴﻦ إﻟﻰ اﻟﻴﺴﺎر ﺑﺪ ً‬

‫ﻗﻤﻨﺎ ﰲ ﻫﺬﺍ ﺍﻟﻔﺼﻞ ﺑﺘﻘﺪﱘ ﺍﻟﻌﺪﻳﺪ ﻣﻦ ﺍﻻﻣﻜﺎﻧﺎﺕ ﺍﳍﺎﻣﺔ ﺍﳌﺘﻮﻓﺮﺓ ﰲ ﻟﻐﺔ ‪ C++‬ﲟﺎ ﰲ ﺫﻟﻚ ﺇﻣﻜﺎﻧﻴﺎﺕ‬
‫ﻃﺒﺎﻋﺔ ﺍﳌﻌﻄﻴﺎﺕ ﻋﻠﻰ ﺍﻟﺸﺎﺷﺔ ﺃﻭ ﺇﺩﺧﺎﳍﺎ ﻣﻦ ﻟﻮﺣﺔ ﺍﳌﻔﺎﺗﻴﺢ ﻭﺇﻣﻜﺎﻧﻴﺎﺕ ﺗﻨﻔﻴﺬ ﺍﳊﺴﺎﺑﺎﺕ ﻭﺍﲣﺎﺫ‬
‫ﺍﻟﻘﺮﺍﺭﺍﺕ‪ .‬ﰲ ﺍﻟﻔﺼﻞ ﺍﻟﺜﺎﱐ‪ ،‬ﺳﻮﻑ ﻧﻌﺘﻤﺪ ﻋﻠﻰ ﻫﺬﻩ ﺍﻟﺘﻘﻨﻴﺎﺕ ﻋﻨﺪ ﻋﺮﺿﻨﺎ ﻷﺳﻠﻮﺏ ﺍﻟﱪﳎﺔ ﺍﳌﻬﻴﻜﻠﺔ‬
‫‪ .structured programming‬ﳑﺎ ﺳﻴﺠﻌﻠﻚ ﺃﻛﺜﺮ ﻣﻌﺮﻓﺔ ﺑﻄﺮﻕ ﺗﻨﺴﻴﻖ ﻧﺼﻮﺹ ﺍﻟﱪﺍﻣﺞ‪ .‬ﻛﻤﺎ ﺃﻧﻨﺎ ﺳﻮﻑ‬
‫ﻧﺪﺭﺱ ﻛﻴﻔﻴﺔ ﲢﺪﻳﺪ ﻭﺗﻐﻴﲑ ﺍﻟﺘﺮﺗﻴﺐ ﺍﻟﺬﻱ ﻳﺘﻢ ﺗﻨﻔﻴﺬ ﺍﻟﺘﻌﻠﻴﻤﺎﺕ ﻭﻓﻘﹰﺎ ﻟﻪ‪ .‬ﻳﺴﻤﻰ ﻫﺬﺍ ﺍﻟﺘﺮﺗﻴﺐ ﺑـ‬
‫"ﺟﺮﻳﺎﻥ ﺍﻟﺘﺤﻜﻢ" ‪.flow of control‬‬

‫اﻟﻨﻮع أو اﻟﺘﺴﻤﻴﺔ‬ ‫اﻟﺘﺠﻤﻴﻌﻴﺔ‬ ‫اﻟﻌﻤﻠﻴﺎت‬


‫اﻷﻗﻮاس‬ ‫ﻣﻦ اﻟﻴﺴﺎر إﻟﻰ اﻟﻴﻤﻴﻦ‬ ‫)(‬
‫اﻟﻀﺮب‬ ‫"‬ ‫"‬ ‫"‬ ‫"‬ ‫‪% / .‬‬

‫اﻟﺠﻤﻊ واﻟﻄﺮح‬ ‫"‬ ‫"‬ ‫"‬ ‫"‬ ‫‪-+‬‬


‫‪٦٩‬‬ ‫‪ .1‬ﻣﻘﺪﻣﺔ ﺣﻮل اﻟﺤﻮاﺳﻴﺐ واﻟﺒﺮﻣﺠﺔ ﺑﻠﻐﺔ ‪C++‬‬

‫اﻟﻨﻮع أو اﻟﺘﺴﻤﻴﺔ‬ ‫اﻟﺘﺠﻤﻴﻌﻴﺔ‬ ‫اﻟﻌﻤﻠﻴﺎت‬


‫إدﺥﺎل‪ /‬إﺥﺮاج‬ ‫"‬ ‫"‬ ‫"‬ ‫"‬ ‫>> <<‬

‫اﻟﻤﻘﺎرﻧﺔ‬ ‫"‬ ‫"‬ ‫"‬ ‫"‬ ‫>‬ ‫=>‬ ‫<‬ ‫=<‬

‫اﻟﻤﺴﺎواة‬ ‫"‬ ‫"‬ ‫"‬ ‫"‬ ‫== =!‬


‫اﻻﺳﻨﺎد‬ ‫ﻣﻦ اﻟﻴﻤﻴﻦ إﻟﻰ اﻟﻴﺴﺎر‬ ‫=‬

‫]‪< <íË×j~¹]<l^é×ÛÃÖ]<°e<íéÃéÛrjÖ]æ<íèçÖæù]<<V15-1<ØÓÖ‬‬

‫ﻣﺎذا ﻋﻦ اﻷﻏﺮاض‪ :‬ﻣﻘﺪﻣﺔ ﺣﻮل ﺗﻘﻨﻴﺔ اﻟﻐﺮض وﻟﻐﺔ‬ ‫‪26-1‬‬


‫اﻟﻨﻤﺬﺝﺔ اﻟﻤﻮﺣﺪة‬
‫ﺳﻮﻑ ﻧﺒﺪﺃ ﺍﻵﻥ ﻋﺮﺿﻨﺎ ﻷﺳﻠﻮﺏ ﺍﻟﺘﻔﻜﲑ ﻏﺮﺿﻲ ﺍﻟﺘﻮﺟﻪ‪ .‬ﻛﻤﺎ ﺳﻨﺮﻯ ﻻﺣﻘﹰﺎ ﺃﻥ ﻫﺬﺍ ﺍﻷﺳﻠﻮﺏ ﻫﻮ‬
‫ﺃﺳﻠﻮﺏ ﻃﺒﻴﻌﻲ ﻟﻠﺘﻔﻜﲑ ﺑﺎﻟﻌﺎﱂ ﻭﺑﻄﺮﻳﻘﺔ ﻛﺘﺎﺑﺔ ﺍﻟﱪﺍﻣﺞ‪.‬‬
‫ﳌﺎﺫﺍ ﺇﺫﹰﺍ ﱂ ﻧﺒﺪﺃ ﺑﻪ ﻣﻦ ﺍﻟﺼﻔﺤﺔ ﺍﻷﻭﱃ ﻟﻠﻜﺘﺎﺏ؟ ﻭﳌﺎﺫﺍ ﺃﺧﺮﻧﺎ ﻋﺮﺽ ﻣﻔﻬﻮﻡ ﺍﻟﱪﳎﺔ ﻏﺮﺿﻴﺔ ﺍﻟﺘﻮﺟﻪ ﺑﻠﻐﺔ‬
‫‪ c++‬ﺣﱴ ﺍﻟﻔﺼﻞ ﺍﻟﺴﺎﺩﺱ؟ ﺍﳉﻮﺍﺏ ﻋﻠﻰ ﻫﺬﻳﻦ ﺍﻟﺴﺆﺍﻟﲔ ﻫﻮ ﺃﻥ ﺍﻷﻏﺮﺍﺽ ﺍﻟﱵ ﳓﺘﺎﺟﻬﺎ ﺳﺘﻜﻮﻥ‬
‫ﻣﺆﻟﻔﺔ ﰲ ﺃﺟﺰﺍﺀ ﻣﻨﻬﺎ ﻣﻦ ﻗﻄﻊ ﳍﺎ ﻋﻼﻗﺔ ﺑﺎﻟﱪﺍﻣﺞ ﺍﳌﻬﻴﻜﻠﺔ‪ .‬ﻟﺬﻟﻚ ﳓﻦ ﳓﺘﺎﺝ ﺃﻭ ﹰﻻ ﺇﱃ ﺑﻨﺎﺀ ﻗﺎﻋﺪﺓ ﰲ‬
‫ﺍﻟﱪﳎﺔ ﺍﳌﻬﻴﻜﻠﺔ‪.‬‬
‫ﺳﻨﻘﻮﻡ ﺇﺫﺍﹰ ﺑﺈﻬﻧﺎﺀ ﻛﻞ ﻓﺼﻞ ﺑﺎﳌﻘﻄﻊ "ﻣﺎﺫﺍ ﻋﻦ ﺍﻷﻏﺮﺍﺽ" ﺍﻟﺬﻱ ﻧﻌﺮﺽ ﻓﻴﻪ ﻣﻘﺪﻣﺔ ﻋﻦ ﻣﻔﻬﻮﻡ‬
‫ﺍﻟﻐﺮﺽ‪ .‬ﻬﻧﺪﻑ ﻣﻦ ﺧﻼﻝ ﺫﻟﻚ ﻣﺴﺎﻋﺪﺓ ﺍﻟﻘﺎﺭﺉ ﻋﻠﻰ ﺗﻄﻮﻳﺮ ﻃﺮﻳﻘﺔ ﺗﻔﻜﲑ ﻏﺮﺿﻴﺔ ﺍﻟﺘﻮﺟﻪ‬
‫ﻻﺳﺘﺜﻤﺎﺭﻫﺎ ﻣﺒﺎﺷﺮﺓ ﺍﻋﺘﺒﺎﺭﺍﹰ ﻣﻦ ﺍﻟﻔﺼﻞ ﺍﻟﺴﺎﺩﺱ‪ .‬ﺳﻨﻘﻮﻡ ﺃﻳﻀﺎﹰ ﺑﻌﺮﺽ ﻣﻘﺪﻣﺔ ﺣﻮﻝ ﻟﻐﺔ ﺍﻟﻨﻤﺬﺟﺔ‬
‫ﺍﳌﻮﺣﺪﺓ ‪ (UML) Unified Modeling Language‬ﺍﻟﱵ ﺗﺴﻤﺢ ﻟﻠﻤﺼﻤﻤﲔ ﺑﺎﺳﺘﺨﺪﺍﻡ ﻗﺪﺭﺍﻬﺗﺎ ﺍﻟﺒﻴﺎﻧﻴﺔ ﻣﻦ‬
‫ﺃﺟﻞ ﺑﻨﺎﺀ ﺗﺼﻤﻴﻢ ﻏﺮﺿﻲ ﺍﻟﺘﻮﺟﻪ ﻟﻠﻨﻈﺎﻡ ﺍﳌﺮﺍﺩ ﺗﻄﻮﻳﺮﻩ‪.‬‬
‫ﺳﻮﻑ ﻳﺮﺗﻜﺰ ﻋﻤﻠﻨﺎ ﰲ ﺑﺪﺍﻳﺔ ﺍﻟﻔﺼﻮﻝ ﺍﳋﻤﺴﺔ ﺍﻷﻭﱃ ﻣﻦ ﺍﻟﻜﺘﺎﺏ ﻋﻠﻰ ﺍﻷﺳﻠﻮﺏ ﺍﻟﺘﻘﻠﻴﺪﻱ ﻟﻠﱪﳎﺔ‬
‫ﺍﳌﻬﻴﻜﻠﺔ‪ .‬ﻭﺳﻮﻑ ﻧﻨﻬﻲ ﻫﺬﻩ ﺍﻟﻔﺼﻮﻝ ﺑﻌﺮﺽ ﻣﺘﺘﺎﺑﻊ ﻷﺳﻠﻮﺏ ﺍﻟﺘﻔﻜﲑ ﻏﺮﺿﻲ ﺍﻟﺘﻮﺟﻪ‪ .‬ﻣﺎ ﻫﻲ‬
‫ﺍﻻﺳﺘﺮﺍﺗﻴﺠﻴﺔ ﺍﻟﱵ ﺍﺗﺒﻌﻨﺎﻫﺎ ﰲ ﻫﺬﻩ ﺍﻟﻔﻘﺮﺍﺕ ﺣﻮﻝ ﺍﻷﺳﻠﻮﺏ ﺍﻟﺴﺎﺑﻖ ﻣﻦ ﺍﻟﻔﺼﻮﻝ ﺍﳋﻤﺴﺔ ﺍﻷﻭﱃ؟‪ .‬ﰲ‬
‫ﺍﻟﻔﺼﻞ ﺍﻷﻭﻝ‪ ،‬ﳒﺪ ﻋﺮﺿﹰﺎ ﻟﻠﻤﻔﺎﻫﻴﻢ ﺍﻷﺳﺎﺳﻴﺔ )"ﻣﺎﺫﺍ ﻋﻦ ﺍﻟﻐﺮﺽ"( ﻭﻟﻠﻤﺼﻄﻠﺤﺎﺕ ﺍﳌﺴﺘﺨﺪﻣﺔ ﻣﻊ‬
‫ﺍﻷﻏﺮﺍﺽ )ﻣﺜﻞ "ﺍﻟﻐﺮﺽ ﻳﺘﻜﻠﻢ"‪ .( object speak‬ﺃﻣﺎ ﰲ ﺍﻟﻔﺼﻮﻝ ﻣﻦ ‪ 2‬ﺣﱴ ‪ 5‬ﺳﻮﻑ ﻧﺘﺤﺪﺙ ﻋﻦ‬
‫ﺃﻣﻮﺭ ﻭﻣﻔﺎﻫﻴﻢ ﺟﻮﻫﺮﻳﺔ ﺃﺧﺮﻯ ﻟﻨﻘﻮﻡ ﺑﻌﺪﻫﺎ ﲟﺠﺎﻬﺑﺔ ﺍﳌﺸﺎﻛﻞ ﺍﻟﱵ ﺗﻮﺍﺟﻬﻨﺎ ﺃﺛﻨﺎﺀ ﻋﻤﻠﻴﺔ ﺍﻟﺘﺼﻤﻴﻢ‬
‫ﻏﺮﺿﻲ ﺍﻟﺘﻮﺟﻪ ‪ .(OOD) object-oriented design‬ﺳﻮﻑ ﻧﻘﻮﻡ ﺑﺘﺤﻠﻴﻞ ﻣﺴﺄﻟﺔ ﳕﻮﺫﺟﻴﺔ ﺗﺘﻄﻠﺐ ﺑﻨﺎﺀ‬
‫ﻧﻈﺎﻡ‪ ،‬ﻛﻤﺎ ﺗﺘﻄﻠﺐ ﲢﺪﻳﺪ ﺍﻷﻏﺮﺍﺽ ﺍﻟﱵ ﳛﺘﺎﺟﻬﺎ ﺑﻨﺎﺀ ﺍﻟﻨﻈﺎﻡ ﻭﲢﺪﻳﺪ ﺍﳋﺼﺎﺋﺺ ﺍﳌﺮﺗﺒﻄﺔ ﻬﺑﺎ ﺑﺎﻹﺿﺎﻓﺔ‬
‫ﺇﱃ ﲢﺪﻳﺪ ﺳﻠﻮﻛﻬﺎ ﻭﻛﻴﻔﻴﺔ ﺗﻔﺎﻋﻠﻬﺎ ﻓﻴﻤﺎ ﺑﻴﻨﻬﺎ ﻣﻦ ﺃﺟﻞ ﺇﳒﺎﺯ ﺍﻷﻫﺪﺍﻑ ﺍﳌﻄﻠﻮﺏ ﲢﻘﻴﻘﻬﺎ ﻣﻦ ﻗﺒﻞ‬
‫اﻟﻔﺼﻞ اﻷول‬ ‫‪٧٠‬‬

‫ﺍﻟﻨﻈﺎﻡ‪ .‬ﺳﻮﻑ ﻧﻘﻮﻡ ﺑﻜﻞ ﺫﻟﻚ ﻣﻦ ﺃﺟﻞ ﻣﺴﺄﻟﺔ ﳍﺎ ﻋﻼﻗﺔ ﺑﺎﻟﻮﺍﻗﻊ ﺍﻟﻌﻤﻠﻲ ﻭﻫﻲ ﻟﻴﺴﺖ ﻣﺴﺄﻟﺔ ﻣُﺼﻄﻨﻌﺔ‬
‫ﻭﻣﻄﺮﻭﺣﺔ ﻋﻠﻰ ﺳﺒﻴﻞ ﺍﳌﺜﺎﻝ‪ .‬ﺳﻴﺘﻢ ﺫﻟﻚ ﻛﻠﻪ ﻗﺒﻞ ﺃﻥ ﻧﺘﻌﻠﻢ ﻛﻴﻒ ﻧﻜﺘﺐ ﺑﺮﻧﺎﳎﹰﺎ ﻏﺮﺿﻲ ﺍﻟﺘﻮﺟﻪ ﺑﻠﻐﺔ‬
‫‪ .C++‬ﻭﻋﻨﺪﻣﺎ ﻧﺼﻞ ﺇﱃ ﺍﻟﻔﺼﻞ ﺍﻟﺴﺎﺩﺱ‪ ،‬ﺳﻮﻑ ﻧﻜﻮﻥ ﺟﺎﻫﺰﻳﻦ ﻟﻠﺒﺪﺀ ﺑﺘﻄﻮﻳﺮ ﻧﻈﻢ ﻏﺮﺿﻴﺔ ﺍﻟﺘﻮﺟﻪ‬
‫ﺑﻠﻐﺔ ‪ .C++‬ﰲ ﺍﳌﻘﺎﻃﻊ ﺍﻻﺧﺘﻴﺎﺭﻳﺔ "ﻣﺎﺫﺍ ﻋﻦ ﺍﻷﻏﺮﺍﺽ" ﺍﳌﻮﺟﻮﺩﺓ ﰲ ﻬﻧﺎﻳﺔ ﺍﻟﻔﺼﻮﻝ‪ 6 :‬ﻭ‪ 7‬ﻭ‪ ،9‬ﺳﻮﻑ‬
‫ﻧﺘﻌﺮﺽ ﻟﻜﻴﻔﻴﺔ ﻛﺘﺎﺑﺔ ﺍﻟﻨﻈﺎﻡ ﻏﺮﺿﻲ ﺍﻟﺘﻮﺟﻪ ﺍﻟﺬﻱ ﲢﺪﺛﻨﺎ ﻋﻨﻪ ﰲ ﺍﻟﻔﺼﻮﻝ ﺍﻟﺴﺎﺑﻘﺔ ﺑﻠﻐﺔ ‪.C++‬‬
‫ﺳﺘﺴﺎﻋﺪﻧﺎ ﻫﺬﻩ ﺍﳊﺎﻟﺔ ﺍﻟﺪﺭﺍﺳﻴﺔ ﻋﻠﻰ ﻋﺮﺽ ﺍﻟﻌﺎﺩﺍﺕ ﻭﺍﻟﺘﺼﺮﻓﺎﺕ ﺍﻟﱵ ﳝﻜﻦ ﺃﻥ ﺗﻮﺍﺟﻬﻚ ﰲ ﻋﺎﱂ‬
‫ﺍﻟﻌﻤﻠﻲ ﺍﳊﻘﻴﻘﻲ‪ .‬ﺗﺘﻤﻴﺰ ﺣﺎﻟﺘﻨﺎ ﺍﻟﺪﺭﺍﺳﻴﺔ ﺑﻜﻮﻬﻧﺎ ﻧﺴﺨﺔ ﻣﺼﻐﺮﺓ ﻋﻦ ﻣﺴﺄﻟﺔ ﻣﻮﺟﻮﺩﺓ ﰲ ﺍﻟﻌﺎﱂ ﺍﳊﻘﻴﻘﻲ‪،‬‬
‫ﻭﻋﻠﻰ ﺍﻟﺮﻏﻢ ﻣﻦ ﺫﻟﻚ ﻓﺈﻧﻨﺎ ﻟﻦ ﳒﺪ ﺻﻌﻮﺑﺔ ﻟﻌﺮﺽ ﺍﻟﻌﺪﻳﺪ ﻣﻦ ﺍﻟﻌﺎﺩﺍﺕ ﻭﺍﻟﺘﺼﺮﻓﺎﺕ ﺍﻟﱵ ﳚﺐ ﺃﻥ‬
‫ﳝﺘﻠﻜﻬﺎ ﺍﳌﱪﻣﺞ ﻟﻠﺘﻌﺎﻣﻞ ﻣﻊ ﻫﻜﺬﺍ ﻣﺴﺎﺋﻞ‪ .‬ﺇﺫﺍ ﻛﻨﺖ ﻃﺎﻟﺒﹰﺎ ﻭﱂ ﻳﻘﻢ ﻣﺪﺭﺳﻚ ﺑﺄﺧﺬ ﻫﺬﻩ ﺍﳊﺎﻟﺔ‬
‫ﺍﻟﺪﺭﺍﺳﻴﺔ ﺑﻌﲔ ﺍﻻﻋﺘﺒﺎﺭ ﻋﻨﺪ ﺗﺪﺭﻳﺴﻚ ﻟﻠﻐﺔ ‪ ،C++‬ﻓﺈﻧﻨﺎ ﻧﻨﺼﺤﻚ ﺑﻘﻮﺓ ﺑﺎﻟﺪﺧﻮﻝ ﰲ ﻫﺬﻩ ﺍﻟﺘﺠﺮﺑﺔ‪.‬‬
‫ﻷﻬﻧﺎ ﺳﺘﺴﺎﻋﺪﻙ ﻋﻠﻰ ﺗﻌﻠﻢ ﺍﻟﺘﺼﻤﻴﻢ ﻏﺮﺿﻲ ﺍﻟﺘﻮﺟﻪ ﺑﺎﺳﺘﺨﺪﺍﻡ ‪ UML‬ﻭﺳﻮﻑ ﺗﻘﻮﻱ ﻗﺪﺭﺗﻚ ﻋﻠﻰ ﻗﺮﺍﺀﺓ‬
‫ﺍﻟﻨﺼﻮﺹ ﺍﻟﱪﳎﻴﺔ ﺍﻟﱵ ﻳﺒﻠﻎ ﻃﻮﳍﺎ ﺣﻮﺍﱄ ‪ 1200‬ﺳﻄﺮ ﺑﺮﳎﻲ ﻣﻜﺘﻮﺑﺔ ﺑﻠﻐﺔ ‪.C++‬‬
‫ﻟﻨﺒﺪﺃ ﺑﻌﺮﺽ ﺑﻌﺾ ﺍﳌﺼﻄﻠﺤﺎﺕ ﺍﳋﺎﺻﺔ ﺑﺄﺳﻠﻮﺏ ﺍﻟﺘﻔﻜﲑ ﻏﺮﺿﻲ ﺍﻟﺘﻮﺟﻪ‪ .‬ﺍﻧﻈﺮ ﺣﻮﻟﻚ ﰲ ﺍﻟﻌﺎﱂ‬
‫ﺍﶈﻴﻂ ﺑﻚ ﺳﻮﻑ ﲡﺪﻩ ﺣﻮﻟﻚ ﺣﻴﺜﻤﺎ ﻧﻈﺮﺕ ﺇﻬﻧﺎ ﺍﻷﻏﺮﺍﺽ ‪ .objects‬ﻧﺬﻛﺮ ﻣﻨﻬﺎ ﻋﻠﻰ ﺳﺒﻴﻞ ﺍﳌﺜﺎﻝ‪:‬‬
‫ﺍﻟﺒﺸﺮ‪ ،‬ﺍﳊﻴﻮﺍﻧﺎﺕ‪ ،‬ﺍﻟﻨﺒﺎﺗﺎﺕ‪ ،‬ﺍﻟﺴﻴﺎﺭﺍﺕ‪ ،‬ﺍﻟﻄﺎﺋﺮﺍﺕ‪ ،‬ﺍﻷﺑﻨﻴﺔ‪ ،‬ﺁﻻﺕ ﺟﺰ ﺍﻟﻌﺸﺐ‪ ،‬ﺍﳊﺎﺳﺒﺎﺕ ﻭﻏﲑﻫﺎ‪.‬‬
‫ﻳﻌﺘﻤﺪ ﺃﺳﻠﻮﺏ ﺗﻔﻜﲑ ﺍﻟﻜﺎﺋﻨﺎﺕ ﺍﻟﺒﺸﺮﻳﺔ ﻋﻠﻰ ﺍﻷﻏﺮﺍﺽ ﻓﻨﺤﻦ ﳕﺘﻠﻚ ﺗﻠﻚ ﺍﻟﻘﺪﺭﺓ ﺍﳋﺎﺭﻗﺔ ﻋﻠﻰ ﺍﻟﺘﺠﺮﻳﺪ‬
‫‪ abstraction‬ﺍﻟﱵ ﺗﺴﻤﺢ ﻟﻨﺎ ﺑﺎﻟﻨﻈﺮ ﺇﱃ ﺍﻟﺼﻮﺭ ﺍﳌﻌﺮﻭﺿﺔ ﻋﻠﻰ ﺃﻬﻧﺎ ﳎﻤﻮﻋﺔ ﻣﻦ ﺍﻷﻏﺮﺍﺽ ﻣﺜﻞ ﺍﻟﺒﺸﺮ‪،‬‬
‫ﺍﻟﻄﺎﺋﺮﺍﺕ‪ ،‬ﺍﻷﺷﺠﺎﺭ‪ ،‬ﺑﺪ ﹰﻻ ﻣﻦ ﺃﻬﻧﺎ ﳎﻤﻮﻋﺔ ﻣﻦ ﺍﻟﺒﻘﻊ ﺍﳌﻨﻔﺼﻠﺔ ﻭﺍﳌﻠﻮﻧﺔ‪ .‬ﻛﻤﺎ ﳝﻜﻨﻨﺎ ﺇﺫﺍ ﺃﺭﺩﻧﺎ ﺃﻥ ﻧﻔﻜﺮ‬
‫ﻼ ﺑﺎﻟﺸﻮﺍﻃﺊ ﺑﺪ ﹰﻻ ﻣﻦ ﺣﺒﺎﺕ ﺍﻟﺮﻣﻞ‪ ،‬ﺑﺎﻟﻐﺎﺑﺎﺕ ﺑﺪ ﹰﻻ‬ ‫ﺑﺎﻋﺘﻤﺎﺩ ﻣﺴﺘﻮﻯ ﺃﻋﻠﻰ ﻣﻦ ﺍﻟﺘﺠﺮﻳﺪ ﺑﺄﻥ ﻧﻔﻜﺮ ﻣﺜ ﹰ‬
‫ﻣﻦ ﺍﻷﺷﺠﺎﺭ‪ .‬ﺑﺎﻟﺒﻴﻮﺕ ﺑﺪ ﹰﻻ ﻣﻦ ﺍﻟﻠﺒﻨﺎﺕ ﺍﳌﺆﻟﻔﺔ ﻣﻨﻬﺎ ﻭﺑﺎﻟﺒﻴﻮﺕ ﺑﺪ ﹰﻻ ﻣﻦ ﺍﻟﻠﺒﻨﺎﺕ ﺍﳌﺆﻟﻔﺔ ﳍﺎ‪.‬‬
‫ﳓﻦ ﳕﻴﻞ ﺇﱃ ﺗﻘﺴﻴﻢ ﺍﻷﻏﺮﺍﺽ ﺇﱃ ﻓﺌﺘﲔ‪ :‬ﺍﻷﻏﺮﺍﺽ ﺍﳊﻴﺔ ﻭﺍﻷﻏﺮﺍﺽ ﺍﳉﺎﻣﺪﺓ‪ .‬ﻓﺎﻷﻏﺮﺍﺽ ﺍﳊﻴﺔ ﺗﺘﻤﺘﻊ‬
‫ﺑﻨﻮﻉ ﻣﻦ ﺍﳊﻴﺎﺓ ﻓﻬﻲ ﻗﺎﺩﺭﺓ ﻋﻠﻰ ﺍﻟﺘﺤﺮﻙ ﻭﻋﻠﻰ ﺍﻟﻘﻴﺎﻡ ﺑﺄﺷﻴﺎﺀ ﻋﺪﻳﺪﺓ‪ .‬ﺃﻣﺎ ﺍﻷﻏﺮﺍﺽ ﺍﳉﺎﻣﺪﺓ ﻣﺜﻞ‬
‫ﺍﳌﻨﺎﺷﻒ‪ ،‬ﻓﻬﻲ ﺗﺒﺪﻭ ﻏﲑ ﻗﺎﺩﺭﺓ ﻋﻠﻰ ﺍﻟﻘﻴﺎﻡ ﺑﺄﻱ ﺷﺊ‪ .‬ﻭﻫﻲ ﻣﻦ ﻧﻔﺲ ﻧﻮﻉ ﺍﻷﻏﺮﺍﺽ ﺍﶈﻴﻄﺔ ﺑﻨﺎ‪ .‬ﻟﺪﻯ‬
‫ﲨﻴﻊ ﺍﻷﻏﺮﺍﺽ ﺍﻟﺴﺎﺑﻘﺔ ﺍﳊﻴﺔ ﻭﺍﳉﺎﻣﺪﺓ ﺑﻌﺾ ﺍﻷﺷﻴﺎﺀ ﺍﳌﺸﺘﺮﻛﺔ‪ .‬ﻓﻠﻬﺎ ﺻﻔﺎﺕ ‪ attributes‬ﻣﺜﻞ ﺍﳊﺠﻢ‪،‬‬
‫ﺍﻟﺸﻜﻞ‪ ،‬ﺍﻟﻠﻮﻥ‪ ،‬ﺍﻟﻮﺯﻥ ﻭﻏﲑﻫﺎ ﻣﻦ ﺍﻟﺼﻔﺎﺕ‪ .‬ﺑﺎﻹﺿﺎﻓﺔ ﺇﱃ ﺫﻟﻚ ﻓﻬﻲ ﺗُﻈﻬﺮ ﺍﻟﻌﺪﻳﺪ ﻣﻦ ﺍﻟﺘﺼﺮﻓﺎﺕ‬
‫ﻼ ﳝﻜﻦ ﺃﻥ ﺗﺘﺪﺣﺮﺝ ﻭﺗﺮﺗﺪ ﻭﺃﻥ ﺗﻨﺘﻔﺦ ﺃﻭ ﺗﻔﺮﻍ ﻣﻦ ﺍﳍﻮﺍﺀ‪ .‬ﻛﻤﺎ ﳝﻜﻦ ﻟﻠﻄﻔﻞ‬ ‫‪ .behaviors‬ﻓﺎﻟﻜﺮﺓ ﻣﺜ ﹰ‬
‫ﺍﻟﺮﺿﻴﻊ ﺃﻥ ﻳﺒﻜﻲ ﻭﻳﻨﺎﻡ ﻭﻳﺪﺏ ﻭﳝﺸﻲ ﻭﻳﺮﻣﺶ ﺑﻌﻴﻨﻴﻪ‪ .‬ﻭﳝﻜﻦ ﻟﻠﺴﻴﺎﺭﺓ ﺃﻳﻀﹰﺎ ﺃﻥ ﺗﺘﺴﺎﺭﻉ ﻭﺃﻥ ﺗﻔﺮﻣﻞ‬
‫ﻭﺃﻥ ﺗﻌﻤﻞ ﻏﲑ ﺫﻟﻚ‪.‬‬
‫ﻳﺘﻌﻠﻢ ﺍﻟﺒﺸﺮ ﻋﻦ ﺍﻷﻏﺮﺍﺽ ﻣﻦ ﺧﻼﻝ ﺩﺭﺍﺳﺔ ﺻﻔﺎﻬﺗﺎ ﻭﻣﻦ ﺧﻼﻝ ﻣﻼﺣﻈﺔ ﺗﺼﺮﻓﺎﻬﺗﺎ‪ .‬ﳝﻜﻦ ﺃﻥ ﻳﻜﻮﻥ‬
‫ﻟﻌﺪﺓ ﺃﻏﺮﺍﺽ ﳐﺘﻠﻔﺔ ﺍﻟﻜﺜﲑ ﻣﻦ ﺍﻟﺼﻔﺎﺕ ﺍﳌﺸﺘﺮﻛﺔ ﺑﺎﻹﺿﺎﻓﺔ ﺇﱃ ﺇﻇﻬﺎﺭﻫﺎ ﻟﻨﻔﺲ ﺍﻟﺘﺼﺮﻓﺎﺕ‪ .‬ﻭﳝﻜﻦ‬
‫ﺑﺎﻟﺘﺎﱄ ﺃﻥ ﻧﻘﺎﺭﻥ ﻋﻠﻰ ﺳﺒﻴﻞ ﺍﳌﺜﺎﻝ ﻣﺎ ﺑﲔ ﺍﻷﻃﻔﺎﻝ ﺍﻟﺮﺿﻊ ﻭﺍﻟﻜﺒﺎﺭ‪ ،‬ﻣﺎ ﺑﲔ ﺍﻟﺒﺸﺮ ﻭﻗﺮﻭﺩ ﺍﻟﺸﻤﺒﺎﻧﺰﻱ‪.‬‬
‫‪٧١‬‬ ‫‪ .1‬ﻣﻘﺪﻣﺔ ﺣﻮل اﻟﺤﻮاﺳﻴﺐ واﻟﺒﺮﻣﺠﺔ ﺑﻠﻐﺔ ‪C++‬‬

‫ﻛﻤﺎ ﳝﻜﻦ ﺃﻥ ﳒﺪ ﺍﻟﻜﺜﲑ ﻣﻦ ﺍﻷﺷﻴﺎﺀ ﺍﳌﺸﺘﺮﻛﺔ ﻣﺎ ﺑﲔ ﺍﻟﺴﻴﺎﺭﺍﺕ ﻭﺍﻟﺸﺎﺣﻨﺎﺕ ﻭﻋﺮﺑﺎﺕ ﺍﻟﻨﻘﻞ ﺍﻟﺼﻐﲑﺓ‬
‫ﺍﳊﻤﺮﺍﺀ ﻭﺃﺣﺬﻳﺔ ﺍﻟﺘﺰﰿ ﺍﳌﺰﻭﺩﺓ ﺑﺪﻭﺍﻟﻴﺐ‪.‬‬
‫ﺗﻘﻮﻡ ﺍﻟﱪﳎﺔ ﻏﺮﺿﻴﺔ ﺍﻟﺘﻮﺟﻪ ‪ (OOP) object-oriented programming‬ﺑﻨﻤﺬﺟﺔ ﺃﻏﺮﺍﺽ ﺍﻟﻌﺎﱂ ﺍﳊﻘﻴﻘﻲ ﻣﻦ‬
‫ﺧﻼﻝ ﺗﻄﻮﻳﺮ ﺑﲎ ﻣﺮﻧﺔ )ﻧﻈﻢ ﻭﺑﺮﺍﻣﺞ( ﳑﺎﺛﻠﺔ ﳍﺎ‪ .‬ﻓﻬﻲ ﺗﺴﺘﻔﻴﺪ ﻣﻦ ﻣﻴﺰﺍﺕ ﺍﻟﻌﻼﻗﺎﺕ ﺑﲔ ﺍﻷﻏﺮﺍﺽ ﺍﻟﱵ‬
‫ﺗﻨﺘﻤﻲ ﺇﱃ ﻭﺻﻒ ﻣﻌﲔ ﻓﻌﻠﻰ ﺳﺒﻴﻞ ﺍﳌﺜﺎﻝ‪ ،‬ﺗﺘﻤﺘﻊ ﺍﻷﻏﺮﺍﺽ ﺍﻟﱵ ﺗﻨﺘﻤﻲ ﺇﱃ ﺻﻒ ﻭﺍﺣﺪ‪-‬ﻣﺜﻞ ﺻﻒ‬
‫ﺍﻟﺴﻴﺎﺭﺍﺕ ﺑﻨﻔﺲ ﺍﳋﻮﺍﺹ‪ .‬ﻛﻤﺎ ﺃﻬﻧﺎ ﺗﺴﺘﻔﻴﺪ ﻣﻦ ﻋﻼﻗﺎﺕ ﺍﻟﺘﻮﺭﻳﺚ ‪ inheritance relationships‬ﻭﺣﱴ ﻣﻦ‬
‫ﻋﻼﻗﺎﺕ ﺍﻟﺘﻮﺭﻳﺚ ﺍﳌﺘﻌﺪﺩ ‪ multiple inheritance relationships‬ﺣﻴﺚ ﳚﺮﻱ ﺫﻟﻚ ﺑﺄﻥ ﺗﺮﺙ ﺍﻟﺼﻔﻮﻑ‬
‫ﺻﻔﺎﺕ ﺍﻟﺼﻔﻮﻑ ﺍﳌﻮﺟﻮﺩﺓ ﻣﺴﺒﻘﹰﺎ ﺑﺎﻹﺿﺎﻓﺔ ﺇﱃ ﺍﻟﺼﻔﺎﺕ ﺍﳋﺎﺻﺔ ﺍﻟﱵ ﺗﺘﻤﺘﻊ ﻬﺑﺎ ﺍﻷﻏﺮﺍﺽ ﺍﻟﱵ ﻬﻧﺘﻢ‬
‫ﻬﺑﺎ‪ .‬ﻓﺄﻏﺮﺍﺽ ﺻﻒ ﺍﻟﺴﻴﺎﺭﺍﺕ ﺫﺍﺕ ﺍﻟﺴﻘﻒ ﺍﻟﻘﺎﺑﻞ ﻟﻠﻄﻲ ﳍﺎ ﻧﻔﺲ ﺧﺼﺎﺋﺺ ﺃﻏﺮﺍﺽ ﺻﻒ ﺍﻟﺴﻴﺎﺭﺍﺕ‬
‫ﺍﻟﻌﺎﻡ ﺑﺎﻹﺿﺎﻓﺔ ﺇﱃ ﻛﻮﻥ ﺳﻘﻔﻬﺎ ﻗﺎﺑﻞ ﻟﻠﻄﻲ‪.‬‬
‫ﺗﻌﻄﻴﻨﺎ ﺍﻟﱪﳎﺔ ﻏﺮﺿﻴﺔ ﺍﻟﺘﻮﺟﻪ ﺃﺳﻠﻮﺑﹰﺎ ﺃﻛﺜﺮ ﻃﺒﻴﻌﻴﺔ ﻭﺃﻛﺜﺮ ﻓﻄﺮﻳﺔ ﰲ ﺍﻟﺘﻌﺎﻣﻞ ﻣﻊ ﻋﻤﻠﻴﺔ ﺍﻟﱪﳎﺔ ﻭﺫﻟﻚ ﻣﻦ‬
‫ﺧﻼﻝ ﳕﺬﺟﺘﻬﺎ ﻷﻏﺮﺍﺽ ﺍﻟﻌﺎﱂ ﺍﳊﻘﻴﻘﻲ ﻭﺧﺼﺎﺋﺼﻬﺎ ﻭﺳﻠﻮﻛﻬﺎ‪ .‬ﻛﻤﺎ ﺃﻬﻧﺎ ﺗﻘﻮﻡ ﺑﻨﻤﺬﺟﺔ ﺍﻻﺗﺼﺎﻻﺕ ﻣﺎ‬
‫ﺑﲔ ﺍﻷﻏﺮﺍﺽ ﲤﺎﻣﹰﺎ ﻛﻤﺎ ﻳﻔﻌﻞ ﺍﻟﺒﺸﺮ ﻋﻨﺪﻣﺎ ﻳﻘﻮﻣﻮﻥ ﺑﺈﺭﺳﺎﻝ ﺍﻟﺮﺳﺎﺋﻞ ﺑﻌﻀﻬﻢ ﻟﺒﻌﺾ‪) ،‬ﻛﻤﺎ ﰲ ﺣﺎﻟﺔ‬
‫ﺿﺎﺑﻂ ﻳﺄﻣﺮ ﺟﻨﻮﺩﻩ ﺑﺎﻟﻮﻗﻮﻑ ﰲ ﺣﺎﻟﺔ ﺍﻧﺘﺒﺎﻩ( ﻓﺎﻷﻏﺮﺍﺽ ﺗﺘﺨﺎﻃﺐ ﻓﻴﻤﺎ ﺑﻴﻨﻬﺎ ﺑﻮﺍﺳﻄﺔ ﺍﻟﺮﺳﺎﺋﻞ‪.‬‬
‫ﺗﻘﻮﻡ ﺍﻟﱪﳎﺔ ﻏﺮﺿﻴﺔ ﺍﻟﺘﻮﺟﻪ ﺇﺫﹰﺍ ﺑﺘﻐﻠﻴﻒ ‪ encapsulation‬ﺍﳌﻌﻄﻴﺎﺕ )ﺍﳋﺼﺎﺋﺺ ﻭﺍﻟﺼﻔﺎﺕ( ﻭﺍﻟﺘﻮﺍﺑﻊ‬
‫)ﺍﻟﺘﺼﺮﻓﺎﺕ ﻭﺍﻟﺴﻠﻮﻙ( ﺑﻮﺣﺪﺍﺕ ﻧﺴﻤﻴﻬﺎ "ﺍﻷﻏﺮﺍﺽ" ﲟﻌﲎ ﺃﻥ ﺍﳌﻌﻄﻴﺎﺕ ﻭﺍﻟﺘﻮﺍﺑﻊ ﺍﳋﺎﺻﺔ ﺑﻐﺮﺽ ﻣﺎ ﻫﻲ‬
‫ﻋﺒﺎﺭﺓ ﻋﻦ ﻋﻨﺎﺻﺮ ﻣﺮﺗﺒﻄﺔ ﻣﻊ ﺑﻌﻀﻬﺎ ﺍﻟﺒﻌﺾ ﺑﺸﻜﻞ ﻭﺛﻴﻖ‪ .‬ﲤﺘﻠﻚ ﺍﻷﻏﺮﺍﺽ ﺃﻳﻀﹰﺎ ﺧﺎﺻﺔ ﺇﺧﻔﺎﺀ ﺍﳌﻌﻠﻮﻣﺎﺕ‬
‫‪ .information hiding‬ﻫﺬﺍ ﻳﻌﲏ ﺃﻥ ﺍﻷﻏﺮﺍﺽ ﺗﻌﺮﻑ ﻛﻴﻒ ﺗﺘﺨﺎﻃﺐ ﻓﻴﻤﺎ ﺑﻴﻨﻬﺎ ﻣﻦ ﺧﻼﻝ ﻭﺍﺟﻬﺎﺕ‬
‫‪ interfaces‬ﻣُﻌﺮﻓﺔ ﺟﻴﺪﺍﹰ‪ ،‬ﻻ ﻳُﺴﻤﺢ ﻋﺎﺩﺓ ﻟﻸﻏﺮﺍﺽ ﺃﻥ ﺗﻌﺮﻑ ﻛﻴﻒ ﰎ ﺑﻨﺎﺀ ﺍﻷﻏﺮﺍﺽ ﺍﻷﺧﺮﻯ )ﳚﺮﻱ‬
‫ﺇﺧﻔﺎﺀ ﺗﻔﺎﺻﻴﻞ ﻋﻤﻠﻴﺔ ﺍﻟﺒﻨﺎﺀ ﺑﻮﺍﺳﻄﺔ ﺍﻷﻏﺮﺍﺽ ﻧﻔﺴﻬﺎ(‪ .‬ﳝﻜﻦ ﻟﻨﺎ ﺑﺎﻟﺘﺄﻛﻴﺪ ﻗﻴﺎﺩﺓ ﺳﻴﺎﺭﺓ ﺩﻭﻥ ﺃﻥ ﻧﻌﺮﻑ‬
‫ﻛﻴﻒ ﻳﻌﻤﻞ ﳏﺮﻛﻬﺎ ﺩﺍﺧﻠﻴﹰﺎ ﻭﻛﻴﻒ ﺗﺘﻢ ﻋﻤﻠﻴﺔ ﻧﻘﻞ ﺍﳊﺮﻛﺔ ﻭﻧﻔﺚ ﺍﻟﻐﺎﺯﺍﺕ ﻣﻦ ﺧﻼﻝ ﺍﻟﻌﺎﺩﻡ‪ .‬ﺳﻮﻑ ﻧﺮﻯ‬
‫ﻻﺣﻘﹰﺎ ﳌﺎﺫﺍ ﺗﻔﻴﺪ ﻋﻤﻠﻴﺔ ﺇﺧﻔﺎﺀ ﺍﳌﻌﻠﻮﻣﺎﺕ ﰲ ﻋﻤﻠﻴﺔ ﻫﻨﺪﺳﺔ ﺍﻟﱪﳎﻴﺎﺕ‪.‬‬
‫ﲤﻴﻞ ﺍﻟﱪﳎﺔ ﺑﻠﻐﺔ ‪ C‬ﻭﻏﲑﻫﺎ ﻣﻦ ﺍﻟﻠﻐﺎﺕ ﺍﻹﺟﺮﺍﺋﻴﺔ ‪ procedural programming languages‬ﺃﻥ ﺗﻜﻮﻥ‬
‫ﻣﻮﺟﻬﺔ ﺑﺎﻷﻓﻌﺎﻝ ‪ action-oriented‬ﰲ ﺣﲔ ﺃﻬﻧﺎ ﻣﻊ ‪ C++‬ﻣﻮﺟﻬﺔ ﺑﺎﻷﻏﺮﺍﺽ‪ .‬ﻓﻤﻊ ‪ ،C‬ﺗﻌﺪ ﺍﻟﺘﻮﺍﺑﻊ‬
‫‪ functions‬ﻫﻲ ﻭﺣﺪﺓ ﺍﻟﺒﻨﺎﺀ ﺍﻷﺳﺎﺳﻴﺔ ﻟﻠﱪﺍﻣﺞ‪ .‬ﺃﻣﺎ ﻣﻊ ‪ ،C++‬ﳒﺪ ﺃﻥ ﺍﻟﺼﻔﻮﻑ ‪ classes‬ﺍﻟﱵ ﻧﺸﺘﻖ‬
‫ﻣﻨﻬﺎ ﻧﺴﺦ ﻋﻠﻰ ﺷﻜﻞ ﺃﻏﺮﺍﺽ‪ ،‬ﺗﺸﻜﻞ ﻭﺣﺪﺓ ﺍﻟﺒﻨﺎﺀ ﺍﻟﺮﺋﻴﺴﻴﺔ‪.‬‬
‫ﻳﺮﻛﺰ ﺍﳌﱪﳎﻮﻥ ﺑﻠﻐﺔ ‪ C‬ﺍﻫﺘﻤﺎﻣﻬﻢ ﻋﻠﻰ ﻛﺘﺎﺑﺔ ﺍﻟﺘﻮﺍﺑﻊ ﺍﻟﱵ ﺗﺘﺄﻟﻒ ﻣﻦ ﳎﻤﻮﻋﺔ ﺍﻷﻓﻌﺎﻝ ﺍﻟﱵ ﺗﺸﺘﺮﻙ ﻟﺘﻨﻔﻴﺬ‬
‫ﻣﻬﻤﺔ ﻣﺸﺘﺮﻛﺔ‪ .‬ﻭﻳﺘﻢ ﲡﻤﻴﻊ ﺍﻟﺘﻮﺍﺑﻊ ﻟﺘﺸﻜﻞ ﺑﺮﻧﺎﳎﹰﺎ‪ .‬ﻣﻦ ﺍﻟﻄﺒﻴﻌﻲ ﺃﻥ ﺗﻜﻮﻥ ﺍﳌﻌﻄﻴﺎﺕ ﻣﻬﻤﺔ ﺟﺪﺍﹰ‪،‬‬
‫ﺑﺎﻟﻨﺴﺒﺔ ﻟﻠﱪﺍﻣﺞ ﺍﳌﻜﺘﻮﺑﺔ ﺑﻠﻐﺔ ‪ C‬ﻭﻟﻜﻦ ﻳُﻨﻈﺮ ﺇﻟﻴﻬﺎ ﻋﻠﻰ ﺃﻬﻧﺎ ﻣﻮﺟﻮﺩﺓ ﻟﺘﺪﻋﻢ ﺍﻷﻓﻌﺎﻝ ﺍﻟﱵ ﺗﻘﻮﻡ ﻬﺑﺎ‬
‫ﺍﻟﺘﻮﺍﺑﻊ‪ .‬ﺗﺴﺎﻋﺪ ﺍﻷﻓﻌﺎﻝ ‪ verbs‬ﺍﻟﻮﺍﺭﺩ ﺫﻛﺮﻫﺎ ﰲ ﻧﺼﻮﺹ ﺗﻌﺮﻳﻒ ﺗﻮﺻﻴﻒ ﻧﻈﺎﻡ ﻣﺎ‪ ،‬ﻣﱪﳎﻲ ﻟﻐﺔ ‪C‬‬

‫ﻋﻠﻰ ﲢﺪﻳﺪ ﳎﻤﻮﻋﺔ ﺍﻟﺘﻮﺍﺑﻊ ﺍﻟﻮﺍﺟﺐ ﻛﺘﺎﺑﺘﻬﺎ ﻣﻦ ﺃﺟﻞ ﺗﻄﻮﻳﺮ ﺍﻟﻨﻈﺎﻡ ﻛﻜﻞ‪.‬‬
‫اﻟﻔﺼﻞ اﻷول‬ ‫‪٧٢‬‬

‫ﻳﺮﻛﺰ ﺍﳌﱪﳎﻮﻥ ﺑﻠﻐﺔ ‪ C++‬ﺍﻫﺘﻤﺎﻣﻬﻢ ﻋﻠﻰ ﺧﻠﻖ ﺍﻷﳕﺎﻁ ﺍﳌﹸﻌﺮﻓﺔ ﻣﻦ ﻗﺒﻠﻬﻢ ‪ user-defined types‬ﻭﺍﻟﱵ‬
‫ﻧﺴﻤﻴﻬﺎ ﺻﻔﻮﻑ ‪ .classes‬ﳛﺘﻮﻱ ﻛﻞ ﺻﻒ ﻣﻦ ﺍﻟﺼﻔﻮﻑ ﻋﻠﻰ ﻣﻌﻄﻴﺎﺕ ﻭﻋﻠﻰ ﳎﻤﻮﻋﺔ ﻣﻦ ﺍﻟﺘﻮﺍﺑﻊ‬
‫ﻟﻠﺘﻌﺎﻣﻞ ﻣﻌﻬﺎ‪ .‬ﻧﺴﻤﻲ ﺍﳌﻌﻄﻴﺎﺕ ﺍﻟﺪﺍﺧﻠﺔ ﰲ ﺗﺮﻛﻴﺐ ﺍﻟﺼﻒ ﺑـ "ﺍﻟﺘﻮﺍﺑﻊ ﺍﻟﺪﺍﺧﻠﻴﺔ" ‪ data-members‬ﰲ‬
‫ﺣﲔ ﻧﺴﻤﻲ ﺍﻟﺘﻮﺍﺑﻊ ﺍﻟﺪﺍﺧﻠﺔ ﰲ ﺗﺮﻛﻴﺐ ﺍﻟﺼﻒ ﺑـ "ﺍﻟﺘﻮﺍﺑﻊ ﺍﻟﺪﺍﺧﻠﻴﺔ" ‪ .member functions‬ﲤﺎﻣﹰﺎ ﻛﻤﺎ‬
‫ﻟﻮ ﻛﻨﺎ ﳔﻠﻖ ﻧﺴﺨﺔ ﻣﻦ ﺍﻟﻨﻤﻂ ﺍﻷﺳﺎﺳﻲ ‪ int‬ﻭﺍﻟﱵ ﻧﺴﻤﻴﻬﺎ ﻣﺘﺤﻮﻝ ‪ variable‬ﳝﻜﻦ ﻟﻨﺎ ﺃﻥ ﳔﻠﻖ ﻧﺴﺨﺔ‬
‫ﻣﻦ ﳕﻂ ﻣُﻌﺮﻑ ﻣﻦ ﻗﺒﻞ ﺍﳌﺴﺘﺨﺪﻡ )ﺃﻱ ﺻﻒ( ﻭﻧﺴﻤﻴﻪ ﰲ ﻫﺬﻩ ﺍﳊﺎﻟﺔ ﻏﺮﺽ ‪ .object‬ﻳﺴﺘﺨﺪﻡ ﺍﳌﱪﻣﺞ‬
‫ﺍﻷﳕﺎﻁ ﺍﻷﺳﺎﺳﻴﺔ ﺍﳉﺎﻫﺰﺓ ﻋﻠﻰ ﺃﻬﻧﺎ ﻭﺣﺪﺍﺕ ﺑﻨﺎﺀ ﻟﺘﺮﻛﻴﺐ ﺃﳕﺎﻁ ﻣﻌﺮﻓﺔ ﻣﻦ ﻗﺒﻠﻪ )ﺃﻱ ﺍﻟﺼﻔﻮﻑ(‪.‬‬
‫ﺳﻮﻑ ﻧﺮﻛﺰ ﺍﻫﺘﻤﺎﻣﻨﺎ ﻣﻊ ‪ C++‬ﻋﻠﻰ ﺍﻷﻏﺮﺍﺽ ﺃﻛﺜﺮ ﻣﻦ ﺍﻷﻓﻌﺎﻝ‪ .‬ﻭﻣﻦ ﺍﳉﺪﻳﺮ ﺫﻛﺮﻩ ﺃﻥ ﺍﻷﲰﺎﺀ‬
‫‪ nouns‬ﺍﻟﻮﺍﺭﺩ ﺫﻛﺮﻫﺎ ﰲ ﻧﺼﻮﺹ ﺗﻌﺮﻳﻒ ﺗﻮﺻﻴﻒ ﻧﻈﺎﻡ ﻣﺎ ﺗﺴﺎﻋﺪ ﺍﳌﱪﳎﲔ ﺑﻠﻐﺔ ‪ C++‬ﻋﻠﻰ ﲢﺪﻳﺪ‬
‫ﳎﻤﻮﻋﺔ ﺍﻟﺼﻔﻮﻑ ﺍﻟﱵ ﺳﻴﻨﺤﺪﺭ ﻣﻨﻬﺎ ﺍﻷﻏﺮﺍﺽ ﺍﻟﻼﺯﻣﺔ ﻟﺒﻨﺎﺀ ﺍﻟﻨﻈﺎﻡ‪.‬‬
‫ﳝﻜﻦ ﺗﺸﺒﻴﻪ ﺍﻟﺼﻔﻮﻑ ﺑﺎﻟﻨﺴﺒﺔ ﻟﻸﻏﺮﺍﺽ ﻛﻤﺎ ﻟﻮ ﺃﻬﻧﺎ ﺍﳌﺨﻄﻄﺎﺕ ﺍﳌﻌﻤﺎﺭﻳﺔ ﺍﻟﺰﺭﻗﺎﺀ ﺑﺎﻟﻨﺴﺒﺔ ﻟﻸﺑﻨﻴﺔ‪.‬‬
‫ﳝﻜﻨﻨﺎ ﺑﻨﺎﺀ ﻋﺪﺓ ﺃﺑﻨﻴﺔ ﺍﻧﻄﻼﻗﹰﺎ ﻣﻦ ﺍﳌﺨﻄﻄﺎﺕ ﺍﳌﻌﻤﺎﺭﻳﺔ ﻛﻤﺎ ﳝﻜﻨﻨﺎ ﺍﺷﺘﻘﺎﻕ ﻋﺪﺓ ﺃﻏﺮﺍﺽ ﻣﻦ ﺻﻒ‬
‫ﻼ ﰲ ﺍﻟﺘﺼﻤﻴﻢ ﻏﺮﺿﻲ ﺍﻟﺘﻮﺟﻪ‬ ‫ﻭﺍﺣﺪ‪ .‬ﳝﻜﻦ ﺃﻥ ﻳﻜﻮﻥ ﻟﻠﺼﻔﻮﻑ ﻋﻼﻗﺔ ﺑﺼﻔﻮﻑ ﺃﺧﺮﻯ‪ .‬ﳝﻜﻦ ﻣﺜ ﹰ‬
‫ﻟﻠﺒﻨﻚ ﺃﻥ ﳛﺘﺎﺝ ﺍﻟﺼﻒ ‪ BankTeller‬ﺃﻥ ﻳﻜﻮﻥ ﻣﺮﺗﺒﻄﹰﺎ ﺑﺎﻟﺼﻒ ‪ .BankAccount‬ﺗﺴﻤﻰ ﺃﺑﺴﻂ ﺃﻧﻮﺍﻉ‬
‫ﻫﺬﻩ ﺍﻟﻌﻼﻗﺎﺕ ﺑﺎﻻﺭﺗﺒﺎﻁ ‪.Association‬‬
‫ﺳﻮﻑ ﻧﺮﻯ ﻻﺣﻘﹰﺎ ﺃﻥ ﺍﻟﱪﳎﻴﺎﺕ ﺍﳌﺮﺗﺒﺔ ﻋﻠﻰ ﺷﻜﻞ ﺻﻔﻮﻑ‪ ،‬ﳝﻜﻦ ﺇﻋﺎﺩﺓ ﺍﺳﺘﺨﺪﺍﻣﻬﺎ ﰲ ﺍﳌﺴﺘﻘﺒﻞ ﻟﺒﻨﺎﺀ‬
‫ﺃﻧﻈﻤﺔ ﺑﺮﳎﻴﺔ ﺃﺧﺮﻯ‪ .‬ﺗُﺤﺰﻡ ﻋﺎﺩﺓ ﺍﻟﺼﻔﻮﻑ ﺍﳌﺮﺗﺒﻄﺔ ﺑﻌﻀﻬﺎ ﺑﺒﻌﺾ ﻟﺘﺸﻜﻞ ﻣﺎ ﻳﺴﻤﻰ ﺑﺎﳌﻜﻮﻧﺎﺕ‬
‫‪ .Compnents‬ﻭﻧﺆﻛﺪ ﻫﻨﺎ ﻋﻠﻰ ﺿﺮﻭﺭﺓ ﺍﻟﺘﻔﻜﲑ ﺩﺍﺋﻤﹰﺎ ﺑﺈﻋﺎﺩﺓ ﺍﺳﺘﺨﺪﺍﻡ ﺍﻟﱪﳎﻴﺎﺕ ﻷﻧﻨﺎ ﻧﻌﺘﻘﺪ ﺃﻥ‬
‫ﻣﺴﺘﻘﺒﻞ ﺍﻟﺘﻄﻮﻳﺮ ﺍﻟﱪﳎﻲ ﻣﻌﺘﻤﺪ ﺑﺸﻜﻞ ﻛﺒﲑ ﻋﻠﻰ ﻫﺬﻩ ﺍﻟﻨﻘﻄﺔ‪.‬‬
‫ﻧﻘﻮﻡ ﺑﺒﻨﺎﺀ ﻣﻌﻈﻢ ﺍﻟﱪﳎﻴﺎﺕ ﺍﳌﺴﺘﻘﺒﻠﻴﺔ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺍﻟﺘﻘﻨﻴﺎﺕ ﻏﺮﺿﻴﺔ ﺍﻟﺘﻮﺟﻪ ﻣﻦ ﺧﻼﻝ ﲡﻤﻴﻊ ﺍﻷﺟﺰﺍﺀ‬
‫ﺍﳌﻌﻴﺎﺭﻳﺔ ﻏﲑ ﺍﳌﺘﻐﲑﺓ ﺍﻟﱵ ﻧﺴﻤﻴﻬﺎ ﺍﻟﺼﻔﻮﻑ‪ .‬ﻳﻌﻠﻤﻚ ﻫﺬﺍ ﺍﻟﻜﺘﺎﺏ ﻛﻴﻒ ﳝﻜﻦ ﺑﻨﺎﺀ ﺻﻔﻮﻑ ﻗﺎﺑﻠﺔ‬
‫ﻹﻋﺎﺩﺓ ﺍﻻﺳﺘﺨﺪﺍﻡ‪ .‬ﳝﻜﻦ ﻷﻱ ﺻﻒ ﺗﻘﻮﻡ ﺑﺈﻧﺸﺎﺋﻪ ﺃﻥ ﻳﺼﺒﺢ ﺑﺮﳎﻴﺔ ﻣﻬﻤﺔ ﻣﺴﺎﻋﺪﺓ ﺑﺎﻟﻨﺴﺒﺔ ﻟﻚ ﺃﻭ‬
‫ﻼ‪.‬‬
‫ﻟﻐﲑﻙ ﻣﻦ ﺃﺟﻞ ﺍﻟﺘﻘﻠﻴﻞ ﻣﻦ ﺟﻬﻮﺩ ﺍﻟﺘﻄﻮﻳﺮ ﺍﻟﱪﳎﻲ ﻣﺴﺘﻘﺒ ﹰ‬

‫ﻣﻘﺪﻣﺔ ﺣﻮل اﻟﺘﺤﻠﻴﻞ واﻟﺘﺼﻤﻴﻢ ﻏﺮﺿﻲ اﻟﺘﻮﺝﻪ وﻟﻐﺔ ‪UML‬‬


‫ﻻﺑﺪ ﻭﺃﻧﻚ ﻗﻤﺖ ﺣﱴ ﺍﻵﻥ ﺑﻜﺘﺎﺑﺔ ﻧﺼﻮﺹ ﺑﺮﳎﻴﺔ ﺻﻐﲑﺓ ﺑﻠﻐﺔ ‪ .C++‬ﻛﻴﻒ ﻛﻨﺖ ﺗﻘﻮﻡ ﺑﻜﺘﺎﺑﺔ‬
‫ﺍﻟﻨﺼﻮﺹ ﺍﻟﱪﳎﻴﺔ ﻟﱪﺍﳎﻚ؟ ﺇﺫﺍ ﻛﻨﺖ ﺃﺣﺪ ﺃﻭﻟﺌﻚ ﺍﳌﺒﺘﺪﺋﲔ ﰲ ﻋﺎﱂ ﺍﻟﱪﳎﺔ‪ ،‬ﻓﻼﺑﺪ ﻭﺃﻧﻚ ﺗﻘﻮﻡ ﺑﺎﳉﻠﻮﺱ‬
‫ﻣﺒﺎﺷﺮﺓ ﺇﱃ ﺣﺎﺳﺒﻚ ﻭﺗﺒﺪﺃ ﺑﻜﺘﺎﺑﺔ ﺍﻟﱪﻧﺎﻣﺞ‪ .‬ﳝﻜﻦ ﻟﻸﺳﻠﻮﺏ ﺍﻟﺴﺎﺑﻖ ﺃﻥ ﻳﻨﺼﺢ ﻣﻦ ﺃﺟﻞ ﺍﳌﺸﺎﺭﻳﻊ‬
‫ﺍﻟﺼﻐﲑﺓ‪ .‬ﻟﻜﻦ ﻣﺎﺫﺍ ﳚﺐ ﻋﻠﻴﻚ ﺃﻥ ﺗﻔﻌﻞ ﺇﺫﺍ ﻃﹸﻠﺐ ﻣﻨﻚ ﺑﻨﺎﺀ ﻧﻈﺎﻡ ﻟﻠﺘﺤﻜﻢ ﺑﺂﻻﺕ ﺍﻟﺼﺮﻑ ﺍﻵﱄ‬
‫ﻟﺒﻨﻚ ﻣﻦ ﺍﻟﺒﻨﻮﻙ؟ ﻫﺬﺍ ﺍﳌﺸﺮﻭﻉ ﺃﻛﱪ ﻭﺃﻋﻘﺪ ﻣﻦ ﺃﻥ ﲡﻠﺲ ﻭﺗﺒﺪﺃ ﺑﻜﺘﺎﺑﺔ ﺍﻟﱪﻧﺎﻣﺞ ﺍﳌﻄﻠﻮﺏ ﻣﺒﺎﺷﺮﺓ‪.‬‬
‫‪٧٣‬‬ ‫‪ .1‬ﻣﻘﺪﻣﺔ ﺣﻮل اﻟﺤﻮاﺳﻴﺐ واﻟﺒﺮﻣﺠﺔ ﺑﻠﻐﺔ ‪C++‬‬

‫ﻟﻠﺤﺼﻮﻝ ﻋﻠﻰ ﺃﻓﻀﻞ ﺍﳊﻠﻮﻝ‪ ،‬ﳚﺐ ﻋﻠﻴﻚ ﺇﺗﺒﺎﻉ ﺃﺳﻠﻮﺏ ﺗﻔﺼﻴﻠﻲ ﻟﺘﺤﻠﻴﻞ ﻣﺘﻄﻠﺒﺎﺕ ﺍﳌﺸﺮﻭﻉ ﻭﺗﻄﻮﻳﺮ‬
‫ﺗﺼﻤﻴﻢ ﻟﺘﻠﺒﻴﺔ ﻫﺬﻩ ﺍﳌﺘﻄﻠﺒﺎﺕ‪ .‬ﺗﻘﻮﻡ ﺑﻌﺪ ﺍﳊﺼﻮﻝ ﻋﻠﻰ ﻧﺘﺎﺋﺞ ﻫﺬﺍ ﺍﻷﺳﻠﻮﺏ ﺑﺘﻮﺛﻴﻖ ﺍﻟﻨﺘﺎﺋﺞ ﻟﻌﺮﺿﻬﺎ‬
‫ﻋﻠﻰ ﺭﺅﺳﺎﺋﻚ ﰲ ﺍﻟﻌﻤﻞ ﻟﻠﻤﻮﺍﻓﻘﺔ ﻋﻠﻴﻬﺎ ﻗﺒﻞ ﻛﺘﺎﺑﺔ ﺃﻱ ﻧﺺ ﺑﺮﳎﻲ ﰲ ﻣﺸﺮﻭﻋﻚ‪ .‬ﺇﺫﺍ ﻛﺎﻥ ﺍﻷﺳﻠﻮﺏ‬
‫ﺍﻟﺬﻱ ﺍﺗﺒﻌﺘﻪ ﻳﺘﻀﻤﻦ ﻃﺮﻳﻘﺔ ﻟﻠﺘﺤﻠﻴﻞ ﻭﺍﻟﺘﺼﻤﻴﻢ ﻣﻦ ﻭﺟﻬﺔ ﻧﻈﺮ ﻏﺮﺿﻴﺔ ﺍﻟﺘﻮﺟﻪ ﻓﺈﻧﻨﺎ ﻧﺴﻤﻲ ﺫﻟﻚ‬
‫ﺃﺳﻠﻮﺏ ﺍﻟﺘﺤﻠﻴﻞ ﻭﺍﻟﺘﺼﻤﻴﻢ ﻏﺮﺿﻲ ﺍﻟﺘﻮﺟﻪ )‪ .(OOAD‬ﻳﻌﺮﻑ ﺍﳌﱪﳎﻮﻥ ﺍﳋﱪﺍﺀ ﺃﻧﻪ ﻣﻬﻤﺎ ﺑﺪﺕ ﺍﳌﺴﺄﻟﺔ‬
‫ﺍﳌﻄﻠﻮﺏ ﺍﻟﺘﻌﺎﻣﻞ ﻣﻌﻬﺎ ﺳﻬﻠﺔ‪ ،‬ﻓﺈﻥ ﺍﻟﻮﻗﺖ ﺍﻟﺬﻱ ﳕﻀﻴﻪ ﻟﺘﺤﻠﻴﻞ ﻭﺗﺼﻤﻴﻢ ﺍﳊﻞ ﳍﺎ ﳝﻜﻦ ﺃﻥ ﻳﻮﻓﺮ ﻋﻠﻴﻨﺎ‬
‫ﺳﺎﻋﺎﺕ ﻛﺜﲑﺓ ﳝﻜﻦ ﺃﻥ ﻧﻀﻴﻌﻬﺎ ﺇﺫﺍ ﺍﺗﺒﻌﻨﺎ ﻃﺮﻳﻘﺔ ﺳﻴﺌﺔ ﻟﺘﺼﻤﻴﻢ ﺍﻟﻨﻈﺎﻡ ﺍﳌﻄﻠﻮﺏ ﻗﺒﻞ ﺍﻟﺒﺪﺀ ﺑﺘﻄﻮﻳﺮﻩ‪.‬‬
‫ﺇﻥ ﺍﻟﺘﻌﺒﲑ ‪ OOAD‬ﻫﻮ ﺍﻟﺘﻌﺒﲑ ﺍﻟﺬﻱ ﻳﻌﱪ ﻋﻦ ﺍﻟﻔﻜﺮﺓ ﺍﻟﻜﺎﻣﻨﺔ ﻭﺭﺍﺀ ﺍﻷﺳﻠﻮﺏ ﺍﻟﺬﻱ ﺳﻨﺴﺘﺨﺪﻣﻪ ﻟﺘﺤﻠﻴﻞ‬
‫ﺍﳌﺴﺎﺋﻞ ﻭﺗﻄﻮﻳﺮ ﺣﻠﻮﻝ ﳍﺎ‪ .‬ﻻ ﺗﺘﻄﻠﺐ ﺍﳌﺴﺎﺋﻞ ﺍﻟﺼﻐﲑﺓ ﺍﳌﻮﺟﻮﺩﺓ ﰲ ﺍﻟﻔﺼﻮﻝ ﺍﻷﻭﱃ ﺃﺳﻠﻮﺑﹰﺎ ﻣﻌﻘﺪﹰﺍ‬
‫ﳊﻠﻬﺎ‪ .‬ﻳﻜﻔﻲ ﺃﻥ ﻧﻘﻮﻡ ﺑﻜﺘﺎﺑﺔ ﻓﻜﺮﺓ ﺣﻠﻬﺎ ﺑﻮﺍﺳﻄﺔ ﻟﻐﺔ ﺍﳋﻮﺍﺭﺯﻣﻴﺎﺕ ‪ Pseudo Code‬ﻗﺒﻞ ﻛﺘﺎﺑﺔ‬
‫ﺍﻟﻨﺼﻮﺹ ﻓﻌﻠﻴﹰﺎ‪ .‬ﺗﻌﺘﱪ ﻟﻐﺔ ﺍﳋﻮﺍﺭﺯﻣﻴﺎﺕ ﺍﻟﻄﺮﻳﻘﺔ ﻟﻐﺔ ﻏﲑ ﺭﲰﻴﺔ ﻟﻜﺘﺎﺑﺔ ﺍﻟﻨﺼﻮﺹ ﺍﻟﱪﳎﻴﺔ‪ .‬ﺳﻮﻑ‬
‫ﻧﺘﺤﺪﺙ ﻋﻦ ﻫﺬﻩ ﺍﻟﻠﻐﺔ ﺑﺎﻟﺘﻔﺼﻴﻞ ﰲ ﺍﻟﻔﺼﻞ ﺍﻟﺜﺎﱐ‪.‬‬
‫ﳝﻜﻦ ﺃﻥ ﺗﻜﻮﻥ ﻟﻐﺔ ﺍﳋﻮﺍﺭﺯﻣﻴﺎﺕ ﻛﺎﻓﻴﺔ ﻣﻦ ﺃﺟﻞ ﺍﳌﺴﺎﺋﻞ ﺍﻟﺼﻐﲑﺓ ﻭﻟﻜﻦ ﻋﻨﺪﻣﺎ ﻳﺰﺩﺍﺩ ﻋﺪﺩ ﺍﳌﺴﺎﺋﻞ ﻭﺣﺠﻢ‬
‫ﳎﻤﻮﻋﺎﺕ ﺍﻟﻌﻤﻞ ﺍﳌﺸﺘﺮﻛﺔ ﰲ ﺣﻠﻬﺎ ﻓﺈﻧﻪ ﳚﺐ ﺍﺳﺘﺨﺪﺍﻡ ﺗﻘﻨﻴﺎﺕ ﳍﺎ ﻋﻼﻗﺔ ﺑﺎﻷﺳﻠﻮﺏ ‪ .OOAD‬ﻣﻦ ﺍﻟﺒﺪﻳﻬﻲ‬
‫ﺃﻧﻪ ﳚﺐ ﻋﻠﻰ ﳎﻤﻮﻋﺎﺕ ﺍﻟﻌﻤﻞ ﺃﻥ ﺗﺘﻔﻖ ﺣﻮﻝ ﺍﻷﺳﻠﻮﺏ ﺍﻟﺪﻗﻴﻖ ﳊﻞ ﺍﳌﺴﺄﻟﺔ ﻭﻃﺮﻳﻘﺔ ﺗﺒﺎﺩﻝ ﺍﻟﻨﺘﺎﺋﺞ ﺑﲔ‬
‫ﺇﺟﺮﺍﺀ ﻭﺁﺧﺮ‪ .‬ﻳﻮﺟﺪ ﻋﺪﺓ ﺃﺳﺎﻟﻴﺐ ‪ OOAD‬ﻭﻫﻨﺎﻙ ﻟﻐﺔ ﻟﺘﻮﺻﻴﻒ ﻃﺮﻳﻘﺔ ﺗﺒﺎﺩﻝ ﺍﻟﻨﺘﺎﺋﺞ ﺑﲔ ﺍﻹﺟﺮﺍﺀﺍﺕ ﻭﻫﻲ‬
‫ﻟﻐﺔ )‪ .(UML‬ﻃﻮﺭﺕ ﻫﺬﻩ ﺍﻟﻠﻐﺔ ﰲ ﻣﻨﺘﺼﻒ ﺍﻟﺘﺴﻌﻴﻨﺎﺕ ﺑﺈﺷﺮﺍﻑ ﺛﻼﺛﺔ ﺃﺷﺨﺎﺹ ﻋﺎﻣﻠﲔ ﰲ ﻣﻨﻬﺠﻴﺎﺕ‬
‫ﺍﻟﺘﻄﻮﻳﺮ ﺍﻟﱪﳎﻲ ﻭﻫﻢ‪ Grady Booch :‬ﻭ‪ James Rumesaugh‬ﻭ‪.Ivar Jacobson‬‬
‫ﻥﺒﺬة ﺗﺎریﺨﻴﺔ ﺣﻮل ﻟﻐﺔ ‪UML‬‬
‫ﰲ ﻓﺘﺮﺓ ﺍﻟﺜﻤﺎﻧﻴﻨﺎﺕ‪ ،‬ﺗﺰﺍﻳﺪ ﻋﺪﺩ ﺍﳌﻨﻈﻤﺎﺕ ﻭﺍﳌﺆﺳﺴﺎﺕ ﺍﻟﱵ ﺑﺪﺃﺕ ﺗﺴﺘﺨﺪﻡ ﺃﺳﻠﻮﺏ ﺍﻟﱪﳎﺔ ﻏﺮﺿﻲ‬
‫ﺍﻟﺘﻮﺟﻪ ﰲ ﺗﻄﻮﻳﺮ ﺗﻄﺒﻴﻘﺎﻬﺗﺎ ﻭﻇﻬﺮﺕ ﺍﳊﺎﺟﺔ ﺇﱃ ﺗﻄﻮﻳﺮ ﺃﺳﻠﻮﺏ ‪ .OOAD‬ﻗﺎﻡ ﺍﻟﻌﺪﻳﺪ ﻣﻦ ﺍﻟﻌﺎﻣﻠﲔ ﰲ‬
‫ﳎﺎﻝ ﻣﻨﻬﺠﻴﺎﺕ ﺍﻟﺘﻄﻮﻳﺮ ﺍﻟﱪﳎﻲ ﺑﺒﻨﺎﺀ ﺃﺳﺎﻟﻴﺐ ﳐﺘﻠﻔﺔ ﻟﺘﻠﺒﻴﺔ ﻫﺬﻩ ﺍﳊﺎﺟﺔ‪ .‬ﻭﻟﻘﺪ ﻛﺎﻥ ﻟﻜﻞ ﺃﺳﻠﻮﺏ ﻣﻨﻬﺎ‬
‫ﺭﻣﻮﺯﻩ ﺍﳋﺎﺻﺔ ﺃﻭ ﻟﻐﺘﻪ ﻟﻠﻮﺻﻮﻝ ﺇﱃ ﻧﺘﺎﺋﺞ ﻋﻤﻠﻴﺎﺕ ﺍﻟﺘﺤﻠﻴﻞ ﻭﺍﻟﺘﺼﻤﻴﻢ‪.‬‬
‫ﰲ ﺑﺪﺍﻳﺔ ﺍﻟﺘﺴﻌﻴﻨﺎﺕ‪ ،‬ﻭﺻﻞ ﺍﻷﻣﺮ ﺇﱃ ﺩﺭﺟﺔ ﻛﺒﲑﺓ ﻣﻦ ﺍﻟﺘﻨﻮﻉ ﻣﻦ ﺍﻷﺳﺎﻟﻴﺐ ﻭﺍﻟﺮﻣﻮﺯ ﺍﳌﺴﺘﺨﺪﻣﺔ‬
‫ﻣﻌﻬﺎ‪ .‬ﻭﱂ ﻳﻜﻦ ﺑﺎﻹﻣﻜﺎﻥ ﺇﻧﺘﺎﺝ ﺃﺩﻭﺍﺕ ﺑﺮﳎﻴﺔ ﻟﻠﺘﻌﺒﲑ ﻋﻦ ﻫﺬﻩ ﺍﻷﺳﺎﻟﻴﺐ‪ .‬ﻛﻞ ﺫﻟﻚ ﺃﺑﺮﺯ ﺍﳊﺎﺟﺔ ﺇﱃ‬
‫ﺇﳚﺎﺩ ﺃﺳﺎﻟﻴﺐ ﻭﺭﻣﻮﺯ ﻣﻌﻴﺎﺭﻳﺔ‪.‬‬
‫ﰲ ﻋﺎﻡ ‪ ،1994‬ﺍﻧﻀﻢ ‪ James Rumbaugh‬ﺇﱃ ‪ Grady Booch‬ﰲ ﺷﺮﻛﺔ ‪Rational Software Cosporation‬‬

‫ﻭﺑﺪﺃ ﺍﻟﻌﻤﻞ ﻣﻦ ﺃﺟﻞ ﺗﻮﺣﻴﺪ ﺃﺳﺎﻟﻴﺐ ﺍﻟﻌﻤﻞ ﺍﳋﺎﺻﺔ ﻬﺑﺎ‪ .‬ﺳﺮﻋﺎﻥ ﻣﺎ ﺍﻧﻀﻢ ﺇﻟﻴﻬﺎﻣﺎ ‪ .Ivar Jacobson‬ﻗﺎﻣﺖ‬
‫ﳎﻤﻮﻋﺔ ﺍﻟﻌﻤﻞ ﻫﺬﻩ ﺑﺈﻃﻼﻕ ﺃﻭﻝ ﻧﺴﺨﺔ ﻣﻦ ‪ UML‬ﻋﺎﻡ ‪ 1996‬ﻭﻃﻠﺒﺖ ﻣﻦ ﳎﺘﻤﻊ ﻫﻨﺪﺳﺔ ﺍﻟﱪﳎﻴﺎﺕ‬
‫ﺭﺃﻳﻬﻢ ﺣﻮﳍﺎ‪ .‬ﰲ ﺗﻠﻚ ﺍﻟﻔﺘﺮﺓ ﺗﻘﺮﻳﺒﺎﹰ‪ ،‬ﺩﻋﺖ ﺇﺣﺪﻯ ﺍﳌﺆﺳﺴﺎﺕ ﻭﻫﻲ ﻣﺆﺳﺴﺔ ‪Object Management‬‬
‫اﻟﻔﺼﻞ اﻷول‬ ‫‪٧٤‬‬

‫)‪ Group (OMG‬ﺇﱃ ﻃﺮﺡ ﻭﺑﻨﺎﺀ ﻟﻐﺎﺕ ﳕﺬﺟﺔ ﻣﺸﺘﺮﻛﺔ‪ .‬ﻭﳌﺎ ﻛﺎﻧﺖ ‪ OMG‬ﻋﺒﺎﺭﺓ ﻋﻦ ﻣﺆﺳﺴﺔ ﻏﲑ ﺭﲝﻴﺔ‬
‫ﻓﻘﺪ ﻛﺎﻧﺖ ﺗﻘﻮﻡ ﺑﺎﻟﺘﺮﻭﻳﺞ ﻻﺳﺘﺨﺪﺍﻡ ﺗﻘﻨﻴﺎﺕ ﺍﻟﱪﳎﺔ ﻏﺮﺿﻴﺔ ﺍﻟﺘﻮﺟﻪ ﻣﻦ ﺧﻼﻝ ﺇﺻﺪﺍﺭﻫﺎ ﳌﻮﺍﺻﻔﺎﺕ‬
‫ﻭﺗﻮﺟﻴﻬﺎﺕ ﻋﺎﻣﺔ ﺣﻮﻝ ﻫﺬﻩ ﺍﻟﺘﻘﻨﻴﺎﺕ‪ .‬ﻟﻜﻦ ﺍﻟﻌﺪﻳﺪ ﻣﻦ ﺍﻟﺸﺮﻛﺎﺕ )ﺍﻟﱵ ﻧﺬﻛﺮ ﻣﻦ ﺑﻴﻨﻬﺎ‪ HP :‬ﻭ‪IBM‬‬

‫ﻭ‪ Microsoft‬ﻭ‪ Oracle‬ﻭ‪ (Rational Software‬ﻛﺎﻧﺖ ﻗﺪ ﺍﻟﺘﻘﻄﺖ ﺍﳊﺎﺟﺔ ﺇﱃ ﺗﻄﻮﻳﺮ ﻟﻐﺔ ﺍﻟﻨﻤﺬﺟﺔ‬
‫ﺍﳌﺸﺘﺮﻛﺔ ﺍﳌﻄﻠﻮﺑﺔ‪ .‬ﺷﻜﻠﺖ ﻫﺬﻩ ﺍﻟﺸﺮﻛﺎﺕ ﻣﺎ ﻳﺴﻤﻰ ﺑﺸﺮﻛﺎﺀ ‪ UML‬ﺃﻭ ‪ UML Partners‬ﺍﺳﺘﺠﺎﺑﺔ‬
‫ﻟﻄﻠﺐ ‪ OMG‬ﻟﺘﻘﺪﱘ ﺍﳌﻘﺘﺮﺣﺎﺕ‪ ،‬ﻗﺎﻡ ﻫﺬﺍ ﺍﻟﺘﺠﻤﻊ ﺑﺒﻨﺎﺀ ﺍﻟﻨﺴﺨﺔ ‪ 1.1‬ﻣﻦ ‪ UML‬ﻭﺗﻘﺪﳝﻬﺎ ﺇﱃ ‪ .OMG‬ﰲ‬
‫ﻋﺎﻡ ‪ ،1997‬ﻗﺒﻠﺖ ‪ OMG‬ﺍﳌﻘﺘﺮﺡ ﻭﺗﺒﻨﺖ ﺍﳌﺴﺆﻭﻟﻴﺔ ﺣﻮﻝ ﻣﺘﺎﺑﻌﺔ ﺍﻟﺼﻴﺎﻧﺔ ﻭﺍﳌﺮﺍﺟﻌﺔ ﻟﻠﻐﺔ ‪ .UML‬ﰲ ﻋﺎﻡ‬
‫‪ ،2001‬ﺃﺻﺪﺭﺕ ‪ OMG‬ﺍﻟﻨﺴﺨﺔ ‪ 1.4‬ﻣﻦ ﻟﻐﺔ ‪) UML‬ﻭﺍﻟﻨﺴﺨﺔ ﺍﳌﻮﺟﻮﺩﺓ ﺣﺎﻟﻴﹰﺎ ﻫﻲ ﺍﻟﻨﺴﺨﺔ ‪ 2.0‬ﺍﻟﱵ‬
‫ﺻﺪﺭﺕ ﰲ ﻬﻧﺎﻳﺔ ﺍﻟﻌﺎﻡ ‪ .(2002‬ﺗﻌﻤﻞ ﺣﺎﻟﻴﹰﺎ ‪ OMG‬ﻋﻠﻰ ﺍﻟﻨﺴﺨﺔ ‪ 2.0‬ﻭﲣﻄﻂ ﻹﺻﺪﺍﺭﻫﺎ‪ .‬ﺗﻌﺘﱪ ‪OMG‬‬

‫ﻭﺍﺣﺪﺓ ﻣﻦ ﺃﻛﱪ ﺍﻟﺘﺠﻤﻌﺎﺕ ﺍﻟﻌﻠﻤﻴﺔ ﰲ ﺍﻟﻌﺎﱂ ﻭﻫﻲ ﺗﻀﻢ ﺣﻮﺍﱄ ‪ 800‬ﻣﺆﺳﺴﺔ ﺃﻭ ﻫﻴﺌﺔ ﻛﺄﻋﻀﺎﺀ ﺗﺎﺑﻌﲔ‬
‫ﳍﺎ‪.‬‬

‫ﻣﺎ هﻲ ﻟﻐﺔ ‪UML‬؟‬


‫ﺗﻌﺘﱪ ﻟﻐﺔ ﺍﻟﻨﻤﺬﺟﺔ ﺍﳌﻮﺣﺪﺓ ‪ UML‬ﺃﺣﺪ ﺃﻛﺜﺮ ﻟﻐﺎﺕ ﺍﻟﻌﺮﺽ ﺍﻟﺒﻴﺎﱐ ﺍﺳﺘﺨﺪﺍﻣﹰﺎ ﻟﻨﻤﺬﺟﺔ ﺍﻟﻨﻈﻢ ﻏﺮﺿﻴﺔ‬
‫ﺍﻟﺘﻮﺟﻪ‪ .‬ﻗﺎﻣﺖ ﻫﺬﻩ ﺍﻟﻠﻐﺔ ﺑﺘﻮﺣﻴﺪ ﳐﻄﻄﺎﺕ ﺍﻟﻨﻤﺬﺟﺔ ﺍﻟﱵ ﻛﺎﻧﺖ ﻣﻮﺟﻮﺩﺓ ﰲ ﻓﺘﺮﺓ ﻬﻧﺎﻳﺔ ﺍﻟﺜﻤﺎﻧﻴﻨﺎﺕ‪.‬‬
‫ﻳﻘﻮﻡ ﻣﺼﻤﻤﻮ ﺍﻟﻨﻈﻢ ﺑﺎﺳﺘﺨﺪﺍﻡ ﻫﺬﻩ ﺍﻟﻠﻐﺔ )ﻟﺘﻜﻮﻳﻦ ﳐﻄﻄﺎﺕ( ﻣﻦ ﺃﺟﻞ ﳕﺬﺟﺔ ﻧﻈﻤﻬﻢ‪.‬‬
‫ﺗﺘﻤﻴﺰ ﻟﻐﺔ ‪ UML‬ﺑﺎﳌﺮﻭﻧﺔ ﺍﻟﻌﺎﻟﻴﺔ ﻭﻫﻲ ﻗﺎﺑﻠﺔ ﻟﻠﺘﻮﺳﻴﻊ‪ ،‬ﺇﺿﺎﻓﺔ ﺇﱃ ﺍﺳﺘﻘﻼﻟﻴﺘﻬﺎ ﻋﻦ ﺍﻟﻌﺪﻳﺪ ﻣﻦ ﺃﺳﺎﻟﻴﺐ‬
‫‪ .OOAD‬ﳝﻜﻦ ﳌﺴﺘﺨﺪﻣﻲ ‪ UML‬ﺗﻄﻮﻳﺮ ﻧﻈﻤﻬﻢ ﻭﻓﻘﹰﺎ ﻷﺳﺎﻟﻴﺐ ﳐﺘﻠﻔﺔ ﻭﻟﻜﻨﻬﻢ ﻳﺴﺘﻄﻴﻌﻮﻥ ﺍﻟﺘﻌﺒﲑ ﻋﻨﻬﺎ‬
‫ﻭﻓﻘﹰﺎ ﳌﻌﻴﺎﺭ ﻭﺍﺣﺪ ﻭﺭﻣﻮﺯ ﻣﺸﺘﺮﻛﺔ‪.‬‬
‫‪ UML‬ﻫﻲ ﻟﻐﺔ ﻣﻌﻘﺪﺓ ﻭﻏﻨﻴﺔ ﺑﻴﺎﻧﻴﺎﹰ‪ ،‬ﻭﺳﻮﻑ ﻧﺘﻌﺮﺽ ﰲ ﻓﻘﺮﺍﺗﻨﺎ "ﻣﺎﺫﺍ ﻋﻦ ﺍﻷﻏﺮﺍﺽ" ﺇﱃ ﺑﻌﺾ ﻣﻴﺰﺍﺕ‬
‫ﺍﻟﻠﻐﺔ ﺍﳌﺒﺴﻄﺔ ﺍﻟﱵ ﺳﻨﺴﺘﺨﺪﻣﻬﺎ ﻟﺘﻮﺟﻴﻪ ﺍﻟﻘﺎﺭﺉ ﺍﳌﺒﺘﺪﺉ ﰲ ﳎﺎﻝ ﺍﻟﺘﺼﻤﻴﻢ ﻭﺍﻟﺘﺤﻠﻴﻞ ﻏﺮﺿﻲ ﺍﻟﺘﻮﺟﻴﻪ ﺇﱃ‬
‫ﻛﻴﻔﻴﺔ ﺍﺳﺘﺨﺪﺍﻡ ‪.UML‬‬
‫ﻣﻦ ﺃﺟﻞ ﻣﻌﻠﻮﻣﺎﺕ ﺃﻭﻓﺮ ﺣﻮﻝ ﻟﻐﺔ ‪ UML‬ﳝﻜﻦ ﺍﻟﻌﻮﺩﺓ ﺇﱃ ﻣﻮﻗﻊ ‪ (www.omg.org) OMG‬ﻭﺇﱃ ﺍﻟﻮﺛﻴﻘﺔ‬
‫ﺍﻟﺮﲰﻴﺔ ﺍﳋﺎﺻﺔ ﲟﻮﺍﺻﻔﺎﺕ ﺍﻟﻨﺴﺨﺔ ‪ 1.4‬ﻣﻦ ‪ .(www.omg.org/uml) UML‬ﻳﻌﺘﱪ ﺩﻟﻴﻞ ﺍﳌﺴﺘﺨﺪﻡ ﻟﻐﺔ‬
‫‪ (The Unified Modeling Language User Guide) UML‬ﺃﺣﺪ ﺃﻫﻢ ﺍﳌﺮﺍﺟﻊ ﺣﻮﻝ ﺍﺳﺘﺨﺪﺍﻡ ﻫﺬﻩ ﺍﻟﻠﻐﺔ‪.‬‬
‫ﻳﺘﻮﻓﺮ ﺃﻳﻀﹰﺎ ﺍﻟﻌﺪﻳﺪ ﻣﻦ ﺍﻷﺩﻭﺍﺕ ﺍﻟﱪﳎﻴﺔ ﺍﻟﱵ ﻃﻮﺭﺕ ﺧﺼﻴﺼﹰﺎ ﳌﺴﺎﻋﺪﺓ ﺍﳌﺼﻤﻤﲔ ﻋﻠﻰ ﺑﻨﺎﺀ ﺃﻧﻈﻤﺘﻬﻢ‬
‫ﺑﻮﺍﺳﻄﺔ ‪.UML‬‬
‫ﺃﺻﺒﺢ ﻭﺟﻮﺩ ﺍﻟﺘﻘﻨﻴﺔ ﻏﺮﺿﻴﺔ ﺍﻟﺘﻮﺟﻪ ﻃﺎﻏﻴﹰﺎ ﻭﻛﺬﻟﻚ ﺍﻷﻣﺮ ﺑﺎﻟﻨﺴﺒﺔ ﻟﻠﻐﺔ ‪ UML‬ﺍﻟﱵ ﺑﺪﺃﺕ ﺗﺄﺧﺬ ﻫﺬﺍ‬
‫ﺍﳌﻨﺤﻰ ﺃﻳﻀﹰﺎ‪ .‬ﻭﳓﻦ ﻬﻧﺪﻑ ﻣﻦ ﺧﻼﻝ ﺍﳌﻘﺎﻃﻊ "ﻣﺎﺫﺍ ﻋﻦ ﺍﻷﻏﺮﺍﺽ" ﺍﻋﺘﺒﺎﺭﹰﺍ ﻣﻦ ﺍﻟﻔﺼﻞ ﺍﻟﺜﺎﱐ‪ ،‬ﺇﱃ‬
‫ﻣﺴﺎﻋﺪﺗﻚ ﻋﻠﻰ ﺗﻄﺒﻴﻖ ﺗﻘﻨﻴﺎﺕ ﺍﻷﻏﺮﺍﺽ ﻟﺒﻨﺎﺀ ﺣﻞ ﻟﻠﻤﺴﺄﻟﺔ ﺍﻟﱵ ﻗﻤﻨﺎ ﺑﺎﺧﺘﻴﺎﺭﻫﺎ‪ .‬ﳓﻦ ﻧﺘﻤﲎ ﺃﻥ ﻳﻜﻮﻥ‬
‫ﺍﳌﺸﺮﻭﻉ ﺍﳌﺨﺘﺎﺭ ﻣﺴﻠﻴﹰﺎ ﻭﻣﻔﻴﺪﹰﺍ ﻭﻣﻨﺎﺳﺒﹰﺎ ﻟﻌﺮﺽ ﺃﺳﻠﻮﺏ ﺍﻟﺘﺼﻤﻴﻢ ﻏﺮﺿﻲ ﺍﻟﺘﻮﺟﻪ ﺑﺎﺳﺘﺨﺪﺍﻡ ‪UML‬‬
‫‪٧٥‬‬ ‫‪ .1‬ﻣﻘﺪﻣﺔ ﺣﻮل اﻟﺤﻮاﺳﻴﺐ واﻟﺒﺮﻣﺠﺔ ﺑﻠﻐﺔ ‪C++‬‬

‫ﻭﻟﻌﺮﺽ ﺃﻓﻜﺎﺭ ﺍﻟﱪﳎﺔ ﻏﺮﺿﻴﺔ ﺍﻟﺘﻮﺟﻪ‪.‬‬

‫ﺝﻮﻟﺔ ﻓﻲ اﻟﻜﺘﺎب‬ ‫‪27-1‬‬


‫ﻼ ﻣﻊ ﺍﻟﺘﺮﻛﻴﺰ ﻋﻠﻰ ﺍﳌﻔﺎﻫﻴﻢ ﺍﳌﺮﺗﺒﻄﺔ ﺑﻠﻐﺔ‬
‫ﻼ ﻓﺼ ﹰ‬ ‫ﺳﻨﻘﻮﻡ ﰲ ﻫﺬﻩ ﺍﻟﻔﻘﺮﺓ ﺑﺎﺳﺘﻌﺮﺍﺽ ﳏﺘﻮﻳﺎﺕ ﺍﻟﻜﺘﺎﺏ ﻓﺼ ﹰ‬
‫‪ C++‬ﺍﻟﱵ ﺗﺘﻌﺮﺽ ﳍﺎ ﻫﺬﻩ ﺍﻟﻔﺼﻮﻝ‪.‬‬
‫ﻳﻌﺮﺽ ﺍﻟﻔﺼﻞ ﺍﻷﻭﻝ ﻭﻋﻨﻮﺍﻧﻪ "ﻣﻘﺪﻣﺔ ﺣﻮﻝ ﻟﻐﺔ ‪ "C++‬ﻓﻜﺮﺓ ﺣﻮﻝ ﻃﺒﻴﻌﺔ ﺍﳊﻮﺍﺳﺐ ﻭﻳﺒﲔ ﻛﻴﻒ ﺗﻌﻤﻞ‬
‫ﻭﻛﻴﻒ ﻳﺘﻢ ﺑﺮﳎﺘﻬﺎ‪ .‬ﻛﻤﺎ ﺃﻧﻪ ﻳﻌﺮﺽ ﻣﻔﻬﻮﻡ ﺍﻟﱪﳎﺔ ﺍﳌﹸﻬﻴﻜﻠﺔ ‪ structured programming‬ﻭﻳﺸﺮﺡ ﳌﺎﺫﺍ‬
‫ﺷﺠﻌﺖ ﺗﻘﻨﻴﺎﺕ ﻫﺬﺍ ﺍﻷﺳﻠﻮﺏ ﻋﻠﻰ ﺍﻟﻘﻴﺎﻡ ﺑﺜﻮﺭﺓ ﰲ ﻃﺮﻳﻘﺔ ﻛﺘﺎﺑﺔ ﺍﻟﱪﺍﻣﺞ‪ .‬ﻳﻘﺪﻡ ﺍﻟﻔﺼﻞ ﺃﻳﻀﹰﺎ ﻧﺒﺬﺓ ﺗﺎﺭﳜﻴﺔ‬
‫ﳐﺘﺼﺮﺓ ﺣﻮﻝ ﺗﻄﻮﺭ ﻟﻐﺎﺕ ﺍﻟﱪﳎﺔ ﺍﻧﻄﻼﻗﹰﺎ ﻣﻦ ﻟﻐﺎﺕ ﺍﻵﻟﺔ ‪ machine languages‬ﻣﺮﻭﺭﹰﺍ ﺑﻠﻐﺎﺕ ﺍﺠﻤﻟﻤﻊ‬
‫‪ assembly languages‬ﻭﺻﻮ ﹰﻻ ﺇﱃ ﻟﻐﺎﺕ ﺍﻟﱪﳎﺔ ﻋﺎﻟﻴﺔ ﺍﳌﺴﺘﻮﻯ ‪ high-level languages‬ﺃﻱ ﺃﻧﻨﺎ ﰲ ﻫﺬﺍ‬
‫ﺍﻟﻔﺼﻞ ﺳﻮﻑ ﻧﺘﺤﺪﺙ ﻋﻦ ﺃﺻﻞ ﻟﻐﺔ ﺍﻟﱪﳎﺔ ‪ .C++‬ﺇﺿﺎﻓﺔ ﺇﱃ ﺫﻟﻚ ﻳﺘﻀﻤﻦ ﺍﻟﻔﺼﻞ ﻣﻘﺪﻣﺔ ﺣﻮﻝ ﺑﻴﺌﺔ‬
‫ﻋﻤﻞ ﳕﻮﺫﺟﻴﺔ ﺧﺎﺻﺔ ﺑﻠﻐﺔ ‪ C++‬ﻭﻳﻌﻄﻲ ﻣﻘﺪﻣﺔ ﳐﺘﺼﺮﺓ ﺣﻮﻝ ﻛﺘﺎﺑﺔ ﺑﺮﺍﻣﺞ ﺑﻠﻐﺔ ‪ .C++‬ﻳﻌﺮﺽ ﻫﺬﺍ‬
‫ﺍﻟﻔﺼﻞ ﺃﻳﻀﹰﺎ ﻭﺑﺸﻜﻞ ﻣﻔﺼﻞ ﻃﺮﻳﻘﺔ ﺍﲣﺎﺫ ﺍﻟﻘﺮﺍﺭ ‪ decision making‬ﻭﺍﺳﺘﺨﺪﺍﻡ ﺍﻟﻌﻤﻠﻴﺎﺕ ﺍﳊﺴﺎﺑﻴﺔ‬
‫ﺍﳋﺎﺻﺔ ﺑـ ‪ .C++‬ﺑﻌﺪ ﺍﻻﻧﺘﻬﺎﺀ ﻣﻦ ﺩﺭﺍﺳﺔ ﻫﺬﺍ ﺍﻟﻔﺼﻞ‪ ،‬ﺳﻮﻑ ﻳﺴﺘﻮﻋﺐ ﺍﻟﻄﺎﻟﺐ ﻛﻴﻔﻴﺔ ﻛﺘﺎﺑﺔ ﺑﺮﺍﻣﺞ‬
‫ﺑﺴﻴﻄﺔ ﻭﻟﻜﻦ ﻣﻜﺘﻤﻠﺔ ﻭﺫﻟﻚ ﺑﻠﻐﺔ ‪.C++‬‬
‫ﻳﻘﺪﻡ ﺍﻟﻔﺼﻞ ﺍﻟﺜﺎﱐ "ﺑﲎ ﺍﻟﺘﺤﻜﻢ" ﻣﻔﺎﻫﻴﻢ ﳍﺎ ﻋﻼﻗﺔ ﺑﺎﳋﻮﺍﺭﺯﻣﻴﺔ ﺍﻟﻼﺯﻣﺔ ﳊﻞ ﻣﺴﺄﻟﺔ ﻣﺎ ﺣﻴﺚ ﳚﺮﻱ‬
‫ﺷﺮﺡ ﺃﳘﻴﺔ ﺍﺳﺘﺨﺪﺍﻡ ﺑﲎ ﲢﻜﻢ ﻓﻌﺎﻟﺔ ﻣﻦ ﺃﺟﻞ ﺗﻄﻮﻳﺮ ﺑﺮﺍﻣﺞ ﻗﺎﺑﻠﺔ ﻟﻠﻔﻬﻢ ﻭﺗﺴﻬﻞ ﻋﻤﻠﻴﺔ ﻛﺸﻒ‬
‫ﺍﻷﺧﻄﺎﺀ ﺍﻟﻮﺍﺭﺩﺓ ﻓﻴﻬﺎ )‪ (debuggable‬ﻭﻗﺎﺑﻠﺔ ﻟﻠﺼﻴﺎﻧﺔ ﺑﺎﻹﺿﺎﻓﺔ ﺇﱃ ﺃﻬﻧﺎ ﻗﺎﺩﺭﺓ ﻋﻠﻰ ﺃﻥ ﺗﻌﻤﻞ ﺑﺸﻜﻞ‬
‫ﺟﻴﺪ ﻣﻦ ﺍﶈﺎﻭﻟﺔ ﺍﻷﻭﱃ‪ .‬ﻓﻬﺬﺍ ﺍﻟﻔﺼﻞ ﻳﺸﺮﺡ ﺑﻨﻴﺔ ﺍﻟﺘﺴﻠﺴﻞ ‪ Sequences structure‬ﻭﺑﲎ ﺍﻻﺧﺘﻴﺎﺭ )‪،if‬‬
‫‪ ،if/else‬ﻭ‪ (while‬ﻭﺍﻟﺒﲎ ﺍﻟﺘﻜﺮﺍﺭﻳﺔ )‪ do /while ،do‬ﻭ‪ (while‬ﺍﻟﱵ ﻳﺘﻢ ﺗﻔﺼﻴﻠﻬﺎ ﻭﻣﻘﺎﺭﻧﺘﻬﺎ ﻣﻊ ﺍﳊﻠﻘﺎﺕ‬
‫)‪ (loops‬ﺍﻟﱵ ﺗﻌﺘﻤﺪ ﻋﻠﻰ ﺍﻟﻌﺪﺍﺩﺍﺕ ﻣﻦ ﺃﺟﻞ ﲢﺪﻳﺪ ﺷﺮﻁ ﺗﻮﻗﻔﻬﺎ ﻭﺗﻠﻚ ﺍﻟﱵ ﺗﺴﺘﺨﺪﻡ ﺷﺮﻭﻁ ﺗﻮﻗﻒ‬
‫ﺃﺧﺮﻯ‪ .‬ﻳﺸﺮﺡ ﺍﻟﻔﺼﻞ ﺍﻟﻄﺮﻳﻘﺔ ﺍﻟﺘﻨﺎﺯﻟﻴﺔ ‪ top-down‬ﺍﻟﺘﺪﺭﺟﻴﺔ ﺍﳌﺴﺘﺨﺪﻣﺔ ﻣﻦ ﺃﺟﻞ ﺗﻄﻮﻳﺮ ﺑﺮﺍﻣﺞ‬
‫ﻣُﻬﻴﻜﻠﺔ ﺑﺎﻹﺿﺎﻓﺔ ﺇﱃ ﺃﻧﻪ ﻳﻌﺮﺽ ﺍﻷﺩﺍﺓ ﺍﻷﻛﺜﺮ ﺍﻧﺘﺸﺎﺭﹰﺍ ﻭﺍﳌﺴﺎﻋﺪﺓ ﰲ ﻋﻤﻠﻴﺔ ﺗﺼﻤﻴﻢ ﺍﻟﱪﺍﻣﺞ ﻭﻫﻲ ﻃﺮﻳﻘﺔ‬
‫ﺍﻟﻜﺘﺎﺑﺔ ﺑﺄﺳﻠﻮﺏ ﻟﻐﺔ ﺍﳋﻮﺍﺭﺯﻣﻴﺎﺕ ‪ . Pseudocode‬ﻫﺬﺍ ﳚﺐ ﺃﻥ ﻧﺸﲑ ﺇﱃ ﺃﻥ ﺍﻟﻄﺮﻕ ﻭﺍﻷﺳﺎﻟﻴﺐ‬
‫ﺍﳌﺴﺘﺨﺪﻣﺔ ﰲ ﺍﻟﻔﺼﻞ ﺍﻟﺜﺎﱐ ﻗﺎﺑﻠﺔ ﻟﻠﺘﻄﺒﻴﻖ ﻋﻠﻰ ﺑﲎ ﺍﻟﺘﺤﻜﻢ ﻷﻳﺔ ﻟﻐﺔ ﺑﺮﳎﺔ ﺃﺧﺮﻯ ﻭﻟﻴﺲ ﻣﻦ ﺃﺟﻞ ‪C++‬‬
‫ﻓﻘﻂ‪ .‬ﻓﺒﺎﻟﺘﺎﱄ ﻳﺴﺎﻋﺪ ﻫﺬﺍ ﺍﻟﻔﺼﻞ ﺍﻟﻄﻠﺒﺔ ﻋﻠﻰ ﺍﻣﺘﻼﻙ ﻋﺎﺩﺍﺕ ﺑﺮﳎﻴﺔ ﺻﺤﻴﺤﺔ ﰲ ﻃﺮﻳﻘﻬﻢ ﳓﻮ ﺍﻟﺘﻌﺎﻣﻞ ﻣﻊ‬
‫ﻣﻬﺎﻡ ﺑﺮﳎﻴﺔ ﺃﻋﻘﺪ ﺳﻮﻑ ﻳﺘﻢ ﻋﺮﺿﻬﺎ ﰲ ﺑﻘﻴﺔ ﻓﺼﻮﻝ ﺍﻟﻜﺘﺎﺏ‪ .‬ﻳﻨﺘﻬﻲ ﺍﻟﻔﺼﻞ ﺑﻌﺮﺽ ﻟﻠﻌﻤﻠﻴﺎﺕ ﺍﳌﻨﻄﻘﻴﺔ‬
‫&& )‪.(not) !, (or) ||, (and‬‬
‫ﻳﻌﺮﺽ ﺍﻟﻔﺼﻞ ﺍﻟﺜﺎﻟﺚ "ﺍﻟﺘﻮﺍﺑﻊ ‪ "Functions‬ﻃﺮﻳﻘﺔ ﺗﺼﻤﻴﻢ ﻭﺑﻨﺎﺀ ﺍﻟﱪﳎﻴﺎﺕ ﻭﺍﻟﺘﻄﺒﻴﻘﺎﺕ‪ .‬ﺗﺸﻤﻞ‬
‫ﻣﻘﺪﺭﺍﺕ ﻟﻐﺔ ‪ C++‬ﺍﳌﻌﺘﻤﺪﺓ ﻋﻠﻰ ﺍﻟﺘﻮﺍﺑﻊ ﺇﻣﻜﺎﻧﻴﺔ ﺍﻟﺘﻌﺎﻣﻞ ﻣﻊ ﺗﻮﺍﺑﻊ ﺍﳌﻜﺘﺒﺎﺕ ﺍﳌﻌﻴﺎﺭﻳﺔ ﺃﻭ ﻣﻊ ﺍﻟﺘﻮﺍﺑﻊ‬
‫ﺍﳌﺼﻤﻤﺔ ﻣﻦ ﻗﺒﻞ ﺍﳌﱪﳎﲔ ﻋﻠﻰ ﺣﺪ ﺳﻮﺍﺀ‪ .‬ﻧﺘﺤﺪﺙ ﰲ ﻫﺬﺍ ﺍﻟﻔﺼﻞ ﻋﻦ ﺍﺳﺘﺪﻋﺎﺀ ﻫﺬﻩ ﺍﻟﺘﻮﺍﺑﻊ ﺑﺎﻟﻘﻴﻤﺔ‬
‫اﻟﻔﺼﻞ اﻷول‬ ‫‪٧٦‬‬

‫‪ call-by-value‬ﺃﻭ ﺑﺎﻟﻌﻨﻮﺍﻥ ‪ .call-by-reference‬ﻬﺗﺪﻑ ﺍﻟﺘﻘﻨﻴﺎﺕ ﺍﳌﻌﺮﻓﺔ ﺇﱃ ﺗﻌﺮﻳﻒ ﺍﳌﱪﳎﲔ ﻋﻠﻰ ﻃﺮﻳﻘﺔ‬


‫ﺍﻻﺳﺘﺨﺪﺍﻡ ﺍﻟﺼﺤﻴﺢ ﻟﻠﺘﻮﺍﺑﻊ ﰲ ﻋﺎﱂ ﺍﻟﱪﳎﺔ ﺍﳌﻬﻴﻜﻠﺔ‪ .‬ﻳﺘﺤﺪﺙ ﺍﻟﻔﺼﻞ ﺃﻳﻀﹰﺎ ﻋﻦ ﺍﻹﺿﺎﻓﺎﺕ ﺍﳌﺮﺗﺒﻄﺔ‬
‫ﺑﻠﻐﺔ ‪ C++‬ﻭﺍﳌﺮﺗﺒﻄﺔ ﲟﻔﻬﻮﻡ ﺍﻟﺘﻮﺍﺑﻊ ﻣﻘﺎﺭﻧﺔ ﺑﻠﻐﺔ ‪.C‬‬
‫ﻧﺘﺤﺪﺙ ﰲ ﺍﻟﻔﺼﻞ ﺍﻟﺮﺍﺑﻊ "ﺍﳌﺼﻔﻮﻓﺎﺕ ‪ "Arrays‬ﻋﻦ ﲡﻤﻴﻊ ﻟﻌﻨﺎﺻﺮ ﻣﻦ ﺍﳌﻌﻄﻴﺎﺕ ﻭﺍﻟﱵ ﳍﺎ ﻧﻔﺲ ﺍﻟﻨﻤﻂ‬
‫ﺿﻤﻦ ﻣﺎ ﻧﺴﻤﻴﻪ ﺑﺎﳌﺼﻔﻮﻓﺎﺕ‪ .‬ﻳﻌﺮﺽ ﺍﻟﻔﺼﻞ ﻋﺪﺩﹰﺍ ﻣﻦ ﺍﻷﻣﺜﻠﺔ ﳌﺼﻔﻮﻓﺎﺕ ﺫﺍﺕ ﺑﻌﺪ ﻭﺍﺣﺪ‬
‫ﻭﳌﺼﻔﻮﻓﺎﺕ ﺫﺍﺕ ﺑﻌﺪﻳﻦ‪ ،‬ﻭﺗﺒﲔ ﻫﺬﻩ ﺍﻷﻣﺜﻠﺔ ﻋﺪﺩﹰﺍ ﻣﻦ ﺍﻻﺳﺘﻌﻤﺎﻻﺕ ﺍﳍﺎﻣﺔ ﻟﻠﻤﺼﻔﻮﻓﺎﺕ ﰲ ﻓﺮﺯ‬
‫ﺍﳌﻌﻄﻴﺎﺕ ﻭﲤﺮﻳﺮﻫﺎ ﺇﱃ ﺍﻟﺘﻮﺍﺑﻊ ﻛﻮﺳﻄﺎﺀ ﳍﺎ‪ ....‬ﻭﻏﲑﻫﺎ‪ .‬ﳚﺮﻱ ﰲ ﻫﺬﺍ ﺍﻟﻔﺼﻞ ﻋﺮﺽ ﻟﺒﻌﺾ ﺗﻘﻨﻴﺎﺕ‬
‫ﺍﻟﻔﺮﺯ ﻭﺍﻟﺒﺤﺚ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺍﳌﺼﻔﻮﻓﺎﺕ ﻭﻳﺘﻌﺮﺽ ﺑﺸﻜﻞ ﺧﺎﺹ ﻟﻌﻤﻠﻴﺔ ﺍﻟﺒﺤﺚ ﺍﻟﺜﻨﺎﺋﻲ ‪Binary‬‬
‫‪ Searching‬ﻭﻳﺒﲔ ﺍﻟﺘﺤﺴﻴﻨﺎﺕ ﺍﻟﱵ ﺗﺪﺧﻠﻬﺎ ﻫﺬﻩ ﺍﻟﻌﻤﻠﻴﺔ ﻣﻘﺎﺭﻧﺔ ﻣﻊ ﻃﺮﻕ ﺍﻟﺒﺤﺚ ﺍﳋﻄﻲ ‪Linear‬‬
‫‪ .Searching‬ﻛﻤﺎ ﺗﺘﻀﻤﻦ ﺍﻟﺘﻤﺎﺭﻳﻦ ﺍﻟﻨﻬﺎﺋﻴﺔ ﻟﻠﻔﺼﻞ )‪ 38‬ﲤﺮﻳﻨﹰﺎ( ﻋﺪﺩﹰﺍ ﻫﺎﻣﹰﺎ ﻣﻦ ﺍﳌﺴﺎﺋﻞ ﺍﳌﺘﻌﻠﻘﺔ ﺑﺄﺳﺎﻟﻴﺐ‬
‫ﺍﻟﻔﺮﺯ ﻭﺃﺳﺎﻟﻴﺐ ﺗﺼﻤﻴﻢ ﻧﻈﺎﻡ ﺣﺠﺰ ﺃﻣﺎﻛﻦ ﺍﻟﺴﻔﺮ ﻟﺸﺮﻛﺔ ﻃﲑﺍﻥ‪ .‬ﻭﳚﺮﻱ ﻋﺮﺽ ﺑﻌﺾ ﺍﳌﻔﺎﻫﻴﻢ ﺍﳍﺎﻣﺔ‬
‫ﺑﺎﻟﻌﺮﺽ ﺑﺎﻟﺒﻴﺎﱐ ﻭﻣﺴﺎﺋﻞ ﺍﳌﻠﻜﺎﺕ ﺍﻟﺜﻤﺎﻧﻴﺔ ‪ .Eight Queens‬ﻭﻏﲑﻫﺎ ﻣﻦ ﺗﻘﻨﻴﺎﺕ ﺍﻟﱪﳎﻴﺔ ﺍﻟﺘﻘﺪﻳﺮﻳﺔ ﺍﳍﺎﻣﺔ‬
‫ﰲ ﺣﻘﻞ ﺍﻟﺬﻛﺎﺀ ﺍﻟﺼﻨﻌﻲ‪ .‬ﻫﺬﺍ ﺑﺎﻹﺿﺎﻓﺔ ﺇﱃ ﲤﺎﺭﻳﻦ ﳍﺎ ﻋﻼﻗﺔ ﺑﺎﳌﺴﺎﺋﻞ ﺍﻟﻌﻮﺩﻳﺔ ﻭﻏﲑﻫﺎ‪.‬‬
‫ﳒﺪ ﰲ ﺍﻟﻔﺼﻞ ﺍﳋﺎﻣﺲ "ﺍﳌﺆﺷﺮﺍﺕ ﻭﺳﻼﺳﻞ ﺍﳊﺮﻭﻑ ‪ "Pointers and Strings‬ﻋﺮﺿﹰﺎ ﻷﻫﻢ ﻭﻷﻗﻮﻯ‬
‫ﺍﻹﻣﻜﺎﻧﻴﺎﺕ ﺍﳌﺘﻮﻓﺮﺓ ﰲ ﻟﻐﺔ ‪ C++‬ﻭﺍﻟﱵ ﳍﺎ ﻋﻼﻗﺔ ﺑﺎﻟﻌﻤﻠﻴﺎﺕ ﻋﻠﻰ ﺍﳌﺆﺷﺮﺍﺕ ﻭﺍﺳﺘﺪﻋﺎﺀ ﺍﻟﺘﻮﺍﺑﻊ ﻣﻊ‬
‫ﲤﺮﻳﺮ ﻟﻠﻮﺳﻄﺎﺀ ﺑﺎﻟﻌﻨﺎﻭﻳﻦ‪ ،‬ﻭﺗﻌﺎﺑﲑ ﺍﳌﺆﺷﺮﺍﺕ‪ ،‬ﻭﺍﻟﻌﻤﻠﻴﺎﺕ ﺍﳊﺴﺎﺑﻴﺔ ﻋﻠﻰ ﺍﳌﺆﺷﺮﺍﺕ ﻭﺍﻟﻌﻼﻗﺔ ﺑﲔ‬
‫ﺍﳌﺆﺷﺮﺍﺕ ﻭﺍﳌﺼﻔﻮﻓﺎﺕ‪ ،‬ﻭﻣﺼﻔﻮﻓﺎﺕ ﺍﳌﺆﺷﺮﺍﺕ ﻭﺍﳌﺆﺷﺮﺍﺕ ﻋﻠﻰ ﺍﻟﺘﻮﺍﺑﻊ‪.‬‬
‫ﺃﻣﺎ ﰲ ﺍﻟﻔﺼﻞ ﺍﻟﺴﺎﺩﺱ "ﺍﻟﺼﻔﻮﻑ ﻭﲡﺮﻳﺪ ﺍﳌﻌﻄﻴﺎﺕ ‪ "Classes and Data Abstraction‬ﻓﻨﺒﺪﺃ ﻓﻌﻠﻴﹰﺎ‬
‫ﺑﺎﳊﺪﻳﺚ ﻋﻦ ﺍﻷﻏﺮﺍﺽ ﻣﻦ ﺧﻼﻝ ﺍﻟﻌﺮﺽ ﳌﻔﻬﻮﻡ ﲡﺮﻳﺪ ﺍﳌﻌﻄﻴﺎﺕ ﻭﻛﻴﻔﻴﺔ ﺑﻨﺎﺀ ﺑﲎ ﻟﻠﻤﻌﻄﻴﺎﺕ ﳎﺮﺩﺓ‬
‫ﺑﺎﺳﺘﺨﺪﺍﻡ ﺍﻟﺼﻔﻮﻑ‪ .‬ﳚﺮﻯ ﺍﺳﺘﺨﺪﺍﻡ ﻣﻔﻬﻮﻡ ﲡﺮﻳﺪ ﺍﳌﻌﻄﻴﺎﺕ ﺑﺸﻜﻞ ﺃﺳﺎﺳﻲ ﰲ ﺍﻟﻔﺼﻮﻝ ‪ 7,6‬ﻭ‪.8‬‬
‫ﻳﺘﺤﺪﺙ ﺍﻟﻔﺼﻞ ﺍﻟﺴﺎﺩﺱ ﺃﻳﻀﹰﺎ ﻋﻠﻰ ﺍﻟﺴﺠﻼﺕ )ﺍﻟﺒﲎ ‪ (structs‬ﻭﻛﻴﻔﻴﺔ ﺑﻨﺎﺀ ﺍﻟﺼﻔﻮﻑ ﻭﺍﻟﻮﺻﻮﻝ ﺇﱃ‬
‫ﺃﻋﻀﺎﺋﻬﺎ ﺳﻮﺍﺀ ﻛﺎﻧﺖ ﻣﻌﻄﻴﺎﺕ ﺃﻡ ﺗﻮﺍﺑﻊ‪ ،‬ﻭﻛﻴﻔﻴﺔ ﲤﺮﻳﺮ ﻗﻴﻢ ﺍﺑﺘﺪﺍﺋﻴﺔ ﻷﻏﺮﺍﺽ ﺍﻟﺼﻔﻮﻑ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺍﻟﺘﻮﺍﺑﻊ‬
‫ﺍﻟﺒﻨﺎﺀﺓ ﻭﺗﺪﻣﲑ ﻫﺬﻩ ﺍﻷﻏﺮﺍﺽ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺍﻟﺘﻮﺍﺑﻊ ﺍﳌﺪﻣﺮﺓ‪...‬ﻭﻏﲑ ﺫﻟﻚ ﻣﻦ ﺍﳌﻔﺎﻫﻴﻢ ﺍﻟﱵ ﳍﺎ ﻋﻼﻗﺔ ﺑﺄﺳﻠﻮﺏ‬
‫ﺇﻋﺎﺩﺓ ﺍﺳﺘﺨﺪﺍﻡ ﺍﻟﱪﳎﻴﺎﺕ ﺍﳌﺘﺒﻊ ﺣﺎﻟﻴﹰﺎ ﻟﺘﻄﻮﻳﺮ ﺍﻟﱪﳎﻴﺎﺕ ﺍﳊﺪﻳﺜﺔ‪.‬‬
‫ﻳﺘﺎﺑﻊ ﺍﻟﻔﺼﻞ ﺍﻟﺴﺎﺑﻊ "ﺍﻟﺼﻔﻮﻑ ﺍﳉﺰﺀ ‪ "II‬ﺍﳊﺪﻳﺚ ﻋﻦ ﺍﻟﺼﻔﻮﻑ ﻭﲡﺮﻳﺪ ﺍﳌﻌﻄﻴﺎﺕ‪ .‬ﳚﺮﻱ ﺍﻟﺘﻌﺮﺽ ﰲ‬
‫ﻫﺬﺍ ﺍﻟﻔﺼﻞ ﻷﺳﺎﻟﻴﺐ ﺍﻟﺘﺼﺮﻳﺢ ﻋﻦ ﺍﻷﻏﺮﺍﺽ ﺍﻟﺴﺎﻛﻨﺔ‪ ،‬ﻭﺍﻟﺘﻮﺍﺑﻊ ﺍﻷﻋﻀﺎﺀ ﺍﻟﺴﺎﻛﻨﺔ‪ ،‬ﻭﺍﻟﺘﺮﻛﻴﺐ‪،‬‬
‫ﻭﺍﻟﺘﻮﺍﺑﻊ ﺍﻷﺻﺪﻗﺎﺀ‪ ،‬ﻭﺍﻟﺼﻔﻮﻑ ﺍﻷﺻﺪﻗﺎﺀ‪ ،‬ﻭﺍﳌﺆﺷﺮ ‪ ،this‬ﻭﺍﳊﺠﺰ ﺍﻟﺪﻳﻨﺎﻣﻴﻜﻲ ﻟﻠﺬﺍﻛﺮﺓ‪ ،‬ﻭﺃﻋﻀﺎﺀ‬
‫ﺍﻟﺼﻔﻮﻑ ﻣﻦ ﺍﻟﻨﻤﻂ ‪ static‬ﺑﺎﻹﺿﺎﻓﺔ ﺇﱃ ﺍﻟﺘﻌﺮﺽ ﻷﳕﺎﻁ ﺍﳌﻌﻄﻴﺎﺕ ﺍﻟﺸﺎﺋﻌﺔ )ﻣﺜﻞ ﺍﳌﺼﻔﻮﻓﺎﺕ ﻭﺳﻼﺳﻞ‬
‫ﺍﳊﺮﻭﻑ ﻭﺻﻔﻮﻑ ﺍﻻﻧﺘﻈﺎﺭ( ﻭﺻﻔﻮﻑ ﺍﻟﺘﺨﺰﻳﻦ ﻭﺍﻟﺼﻔﻮﻑ ﺍﻟﺘﻜﺮﺍﺭﻳﺔ‪.‬‬
‫ﻳﻨﺎﻗﺶ ﺍﻟﻔﺼﻞ ﺍﻟﺜﺎﻣﻦ "ﺍﻟﺘﺤﻤﻴﻞ ﺍﻟﺰﺍﺋﺪ ﻟﻠﻌﻤﻠﻴﺎﺕ ‪ "Operator Overloading‬ﻭﺍﺣﺪﹰﺍ ﻣﻦ ﺍﳌﻮﺍﺿﻴﻊ ﺍﳍﺎﻣﺔ‬
‫ﻭﺍﳌﺮﺗﺒﻄﺔ ﺑﻠﻐﺔ ‪ C++‬ﻭﻫﻮ ﻣﻮﺿﻮﻉ ﲢﻤﻴﻞ ﺍﻟﻌﻤﻠﻴﺎﺕ ﺍﻟﻌﺎﺩﻳﺔ ﻟﻘﺪﺭﺍﺕ ﺟﺪﻳﺪﺓ ﲝﻴﺚ ﺗﺼﺒﺢ ﻗﺎﺩﺭﺓ ﻋﻠﻰ‬
‫‪٧٧‬‬ ‫‪ .1‬ﻣﻘﺪﻣﺔ ﺣﻮل اﻟﺤﻮاﺳﻴﺐ واﻟﺒﺮﻣﺠﺔ ﺑﻠﻐﺔ ‪C++‬‬

‫ﺍﻟﺘﻌﺎﻣﻞ ﻣﻊ ﺃﳕﺎﻁ ﺟﺪﻳﺪﺓ ﻟﻠﻤﻌﻄﻴﺎﺕ ﻣﻦ ﺃﺟﻞ ﺗﻨﻔﻴﺬ ﺍﻟﻮﻇﺎﺋﻒ ﺍﳌﻄﻠﻮﺑﺔ ﻣﻨﻬﺎ‪ .‬ﳚﺮﻱ ﻣﻨﺎﻗﺸﺔ‬
‫ﺍﻟﺘﻔﺼﻴﻼﺕ ﺍﳌﺘﻌﻠﻘﺔ ﺑﺬﻟﻚ ﰲ ﻫﺬﺍ ﺍﻟﻔﺼﻞ ﺑﺎﻹﺿﺎﻓﺔ ﺇﱃ ﻋﺮﺽ ﺍﻟﻘﻴﻮﺩ ﺍﳌﺮﺗﺒﻄﺔ ﲟﺜﻞ ﻫﺬﻩ ﺍﻟﻌﻤﻠﻴﺔ‪ .‬ﻛﻤﺎ‬
‫ﻳﻌﺮﺽ ﺍﻟﻔﺼﻞ ﺑﻌﺾ ﺍﳊﺎﻻﺕ ﺍﻟﺪﺭﺍﺳﻴﺔ ﺍﳌﺘﻌﻠﻘﺔ ﺑﺼﻔﻮﻑ ﺍﳌﺼﻔﻮﻓﺎﺕ ﻭﺳﻼﺳﻞ ﺍﳊﺮﻭﻑ ﻭﺍﻟﺘﺎﺭﻳﺦ‬
‫ﻭﺍﻷﺭﻗﺎﻡ ﺍﻟﺼﺤﻴﺤﺔ ﺍﻟﻜﺒﲑﺓ ﻭﺍﻷﻋﺪﺍﺩ ﺍﻟﻌﻘﺪﻳﺔ‪.‬‬
‫ﻳﺘﻌﺎﻣﻞ ﺍﻟﻔﺼﻞ ﺍﻟﺘﺎﺳﻊ "ﺍﻟﻮﺭﺍﺛﺔ ‪ "Inheritance‬ﻣﻊ ﺗﻘﻨﻴﺎﺕ ﺍﺷﺘﻘﺎﻕ ﺍﻟﺼﻔﻮﻑ ﺍﳌﺮﺗﺒﻄﺔ ﺑﺸﻜﻞ ﺃﺳﺎﺳﻲ ﻣﻊ‬
‫ﺍﻟﱪﳎﺔ ﻏﺮﺿﻴﺔ ﺍﻟﺘﻮﺟﻪ‪ ،‬ﻭﺫﻟﻚ ﻣﻦ ﺧﻼﻝ ﻋﺮﺽ ﺍﳌﻔﺎﻫﻴﻢ ﺍﳌﺮﺗﺒﻄﺔ ﺑﺎﻟﺼﻔﻮﻑ ﺍﻷﺳﺎﺳﻴﺔ ﻭﺍﻟﺼﻔﻮﻑ‬
‫ﺍﳌﺸﺘﻘﺔ ﻭﺍﻷﻋﻀﺎﺀ ﺍﶈﻤﻴﺔ ﻭﺃﺳﻠﻮﺏ ﺍﻟﻮﺭﺍﺛﺔ ﺍﻟﻌﺎﻣﺔ ﻭﺍﳋﺎﺻﺔ ﻭﺍﶈﻤﻴﺔ‪ ....‬ﻭﻏﲑﻫﺎ ﻣﻦ ﺍﳌﻔﺎﻫﻴﻢ ﺍﻷﺧﺮﻯ‪.‬‬
‫ﻳﺘﻀﻤﻦ ﺍﻟﻔﺼﻞ ﺃﻳﻀﹰﺎ ﺑﻌﺾ ﻣﻦ ﺍﳊﺎﻻﺕ ﺍﻟﺪﺭﺍﺳﻴﺔ ﺍﳌﺘﻌﻠﻘﺔ ﺑﺪﺭﺍﺳﺔ ﺑﻨﻴﺔ ﺍﻟﺸﺠﺮﺓ ﺍﻟﻮﺭﺍﺛﻴﺔ ﻟﺼﻔﻮﻑ‬
‫ﺍﻟﻨﻘﻄﺔ ﻭﺍﻟﺪﺍﺋﺮﺓ ﻭﺍﻷﺳﻄﻮﺍﻧﺔ‪ .‬ﻳﻨﺘﻬﻲ ﺍﻟﻔﺼﻞ ﺑﻔﻘﺮﺓ ﺣﻮﻝ ﺃﺳﻠﻮﺏ ﺍﻟﻮﺭﺍﺛﺔ ﺍﳌﺘﻌﺪﺩﺓ‪.‬‬
‫ﺃﻣﺎ ﺍﻟﻔﺼﻞ ﺍﻟﻌﺎﺷﺮ "ﻣﺘﻌﺪﺩﺍﺕ ﺍﻷﺷﻜﺎﻝ ‪ "Polymorphism‬ﻓﻴﺘﻌﺮﺽ ﻟﺒﻌﺾ ﺍﳌﻘﺪﺭﺍﺕ ﺍﻷﺧﺮﻯ ﺍﳋﺎﺻﺔ‬
‫ﺑﺎﻟﱪﳎﺔ ﻏﺮﺿﻴﺔ ﺍﻟﺘﻮﺟﻪ ﻭﺍﻟﱵ ﳍﺎ ﻋﻼﻗﺔ ﺑﺎﻟﺴﻠﻮﻙ ﻣﺘﻌﺪﺩ ﺍﻷﺷﻜﺎﻝ ﻣﻦ ﺧﻼﻝ ﺍﻟﺘﻌﺎﻣﻞ ﻣﻊ ﻏﺮﺽ ﻣﻦ‬
‫ﺍﻏﺮﺍﺽ ﺃﺣﺪ ﺍﻟﺼﻔﻮﻑ ﺍﳌﺸﺘﻘﺔ ﻋﻠﻰ ﺃﻧﻪ ﻏﺮﺽ ﻣﻦ ﺃﻏﺮﺍﺽ ﺍﻟﺼﻒ ﺍﻷﺳﺎﺳﻲ ﺃﻳﻀﹰﺎ‪ .‬ﻳﺴﺎﻋﺪ ﺫﻟﻚ ﻋﻠﻰ‬
‫ﻛﺘﺎﺑﺔ ﺑﺮﺍﻣﺞ ﻣﺴﺘﻘﻠﺔ ﻋﻦ ﺍﻷﳕﺎﻁ ﺍﶈﺪﺩﺓ ﻷﻏﺮﺍﺽ ﺍﻟﺼﻔﻮﻑ ﺍﳌﺸﺘﻘﺔ‪ .‬ﻛﻤﺎ ﺗﺴﺎﻋﺪ ﻣﺘﻌﺪﺩﺍﺕ ﺍﻻﺷﻜﺎﻝ‬
‫ﻋﻠﻰ ﺇﺯﺍﻟﺔ ﺍﳌﻨﻄﻖ ﺍﳌﺮﺗﺒﻂ ﺑﺎﻟﺘﻌﻠﻴﻤﺔ ‪ switch‬ﻟﺼﺎﱀ ﻣﻨﻄﻖ ﻣﺒﺎﺷﺮ ﺃﻛﺜﺮ ﺑﺴﺎﻃﺔ‪ .‬ﻭﳚﺮﻱ ﺍﻟﺘﻌﺮﺽ ﳌﺪﻳﺮ‬
‫ﺷﺎﺷﺔ ﺇﻇﻬﺎﺭ ﻟﺘﻮﺿﻴﺢ ﻫﺬﻩ ﺍﻟﻔﻜﺮﺓ‪ .‬ﻳﻘﻮﻡ ﺍﻟﻔﺼﻞ ﺃﻳﻀﹰﺎ ﺑﺘﻮﺿﻴﺢ ﺍﻟﻔﺮﻭﻗﺎﺕ ﺑﲔ ﺍﻟﺼﻔﻮﻑ ﺍﺠﻤﻟﺮﺩﺓ‬
‫ﻭﺍﻟﺼﻔﻮﻑ ﺍﺠﻤﻟﺴﺪﺓ ﻭﺍﻟﻔﻮﺍﺋﺪ ﺍﳌﻤﻜﻨﺔ ﻣﻦ ﺍﺳﺘﺨﺪﺍﻣﻬﺎ‪ .‬ﻳﻮﺟﺪ ﺿﻤﻦ ﺍﻟﻔﺼﻞ ﺣﺎﻟﺘﲔ ﺩﺭﺍﺳﻴﺘﲔ ﻫﺎﻣﺘﲔ‪،‬‬
‫ﳍﻤﺎ ﻋﻼﻗﺔ ﺑﻨﻈﺎﻡ ﺩﻓﻊ ﺭﻭﺍﺗﺐ ﻋﻤﺎﻝ ﺷﺮﻛﺔ ﻭﺍﻟﺸﺠﺮﺓ ﺍﻟﻮﺭﺍﺛﻴﺔ ﻟﺼﻔﻮﻑ ﺍﻷﺷﻜﺎﻝ‪ :‬ﺍﻟﻨﻘﻄﺔ‪ ،‬ﺍﻟﺪﺍﺋﺮﺓ‪،‬‬
‫ﻭﺍﻷﺳﻄﻮﺍﻧﺔ‪.‬‬
‫ﳚﺮﻱ ﰲ ﺍﻟﻔﺼﻞ ﺍﳊﺎﺩﻱ ﻋﺸﺮ "ﺍﻟﻘﻮﺍﻟﺐ ‪ "Templates‬ﺍﳊﺪﻳﺚ ﻋﻦ ﻗﻮﺍﻟﺐ ﺍﻟﺘﻮﺍﺑﻊ ﻭﺍﻟﺼﻔﻮﻑ ﻭﺍﻟﱵ‬
‫ﺗﺪﻋﻢ ﺑﺸﻜﻞ ﺃﺳﺎﺳﻲ ﻓﻜﺮﺓ ﲡﺮﻳﺪ ﺍﳌﻌﻄﻴﺎﺕ ﺍﳌﺮﺗﺒﻄﺔ ﺑﻠﻐﺎﺕ ﺍﻟﱪﳎﻴﺔ ﻏﺮﺿﻴﺔ ﺍﻟﺘﻮﺟﻪ‪ ،‬ﻭﺫﻟﻚ ﻬﺑﺪﻑ‬
‫ﺇﻧﺸﺎﺀ ﺃﳕﺎﻁ ﺟﺪﻳﺪﺓ ﻟﻠﻤﻌﻄﻴﺎﺕ ﳎﺮﺩﺓ )ﻣﺜﻞ ﺍﳌﻜﺪﺳﺎﺕ ﻭﺍﳌﺼﻔﻮﻓﺎﺕ ﻭﺻﻔﻮﻑ ﺍﻹﻧﺘﻈﺎﺭ(‪.‬‬
‫ﻳﺘﻀﻤﻦ ﺍﻟﺜﺎﱐ ﺍﳊﺎﺩﻱ ﻋﺸﺮ "ﳎﺎﺭﻱ ﺍﻟﺪﺧﻞ‪/‬ﺧﺮﺝ ‪ "Stream Input/Output‬ﻣﻌﺎﳉﺔ ﻟﺘﻘﻨﻴﺎﺕ‬
‫ﺍﻟﺪﺧﻞ‪/‬ﺧﺮﺝ ﺍﳉﺪﻳﺪﺓ ﻭﺍﻟﱵ ﳍﺎ ﻋﻼﻗﺔ ﺑﻠﻐﺔ ‪ .C++‬ﳚﺮﻱ ﺍﻟﺘﻌﺮﺽ ﻟﻌﻤﻠﻴﱵ ﺍﻹﺩﺧﺎﻝ ﻭﺍﻻﺳﺘﺨﺮﺍﺝ ﺇﱃ‬
‫ﻭﻣﻦ ﳎﺮﻯ ﺍﻟﺪﺧﻞ ﺃﻭ ﺍﳋﺮﺝ‪ ،‬ﻭﻟﻌﻤﻠﻴﺎﺕ ﺍﻟﺪﺧﻞ‪/‬ﺧﺮﺝ ﻭﻓﻘﹰﺎ ﻟﺼﻴﻐﺔ ﳏﺪﺩﺓ ﻣﺴﺒﻘﹰﺎ ﻭﻋﻤﻠﻴﺎﺕ ﺍﺠﻤﻟﺎﺭﻱ‬
‫ﻟﻀﺒﻂ ﻗﺎﻋﺪﺓ ﺍﺠﻤﻟﺮﻯ ﺃﻭ ﻋﺮﺽ ﺍﳊﻘﻞ‪ ...‬ﻭﻏﲑ ﺫﻟﻚ ﻣﻦ ﺍﻟﻌﻤﻠﻴﺎﺕ ﺍﻟﱵ ﺗﻌﺘﻤﺪ ﻋﻠﻰ ﻗﻴﻢ ﺧﺎﻧﺎﺕ‬
‫ﺍﻟﺘﺤﻜﻢ ﺍﳌﺘﻌﻠﻘﺔ ﺑﺎﺠﻤﻟﺮﻯ‪.‬‬
‫ﻳﻨﺎﻗﺶ ﺍﻟﻔﺼﻞ ﺍﻟﺜﺎﻟﺚ ﻋﺸﺮ "ﻣﻌﺎﳉﺔ ﺍﻻﺳﺘﺜﻨﺎﺀﺍﺕ ‪ "Exception Handling‬ﻭﺍﺣﺪﺓ ﻣﻦ ﺍﻹﺿﺎﻓﺎﺕ ﺍﳍﺎﻣﺔ‬
‫ﺍﳋﺎﺻﺔ ﺑﻠﻐﺔ ‪ C++‬ﻭﺍﻟﱵ ﺗﺴﺎﻋﺪ ﺍﳌﱪﻣﺞ ﻋﻠﻰ ﻛﺘﺎﺑﺔ ﺑﺮﺍﻣﺞ ﺃﻛﺜﺮ ﻣﺘﺎﻧﺔ ﻭﻣﻘﺎﻭﻣﺔ ﻟﻸﻋﻄﺎﻝ ﻻﺳﺘﺨﺪﺍﻣﻬﺎ‬
‫ﰲ ﺇﳒﺎﺯ ﺍﳌﻬﺎﻡ ﺍﳊﺴﺎﺳﺔ‪ .‬ﳚﺮﻱ ﺍﻟﺘﺤﺪﺙ ﻋﻦ ﺍﻟﻜﺘﻞ ‪ Try‬ﻭﺗﻌﻠﻴﻤﺎﺕ ﺇﻟﻘﺎﺀ ﺍﻻﺳﺘﺜﻨﺎﺀ ‪ throw‬ﻭﻛﺘﻞ‬
‫ﺍﻟﺘﻘﺎﻁ ﺍﻻﺳﺘﺜﻨﺎﺀ ﻭﻣﻌﺎﳉﺘﻪ ‪.catch‬‬
‫ﺃﻣﺎ ﺍﻟﻔﺼﻞ ﺍﻟﺮﺍﺑﻊ ﻋﺸﺮ "ﺍﻟﺘﻌﺎﻣﻞ ﻣﻊ ﺍﳌﻠﻔﺎﺕ ‪ ،"File Processing‬ﻓﻴﺘﻀﻤﻦ ﻣﻌﻠﻮﻣﺎﺕ ﻟﻠﺘﻌﺎﻣﻞ ﻣﻊ ﺍﳌﻠﻔﺎﺕ‬
‫اﻟﻔﺼﻞ اﻷول‬ ‫‪٧٨‬‬

‫ﺍﻟﺘﺴﻠﺴﻠﻴﺔ ﻭﻣﻠﻔﺎﺕ ﺍﻟﻮﺻﻮﻝ ﺍﻟﻌﺸﻮﺍﺋﻲ‪ .‬ﻳﺒﺪﺃ ﺍﻟﻔﺼﻞ ﲟﻘﺪﻣﺔ ﺣﻮﻝ ﺍﻟﺒﻨﻴﺔ ﺍﳍﺮﻣﻴﺔ ﻟﻠﻤﻌﻄﻴﺎﺕ ﺍﺑﺘﺪﺍ ًﺀ ﻣﻦ‬
‫ﺍﳋﺎﻧﺎﺕ ﺣﱴ ﻧﺼﻞ ﺇﱃ ﺍﳌﻠﻔﺎﺕ‪ .‬ﰒ ﳚﺮﻱ ﻋﺮﺽ ﻃﺮﻳﻘﺔ ﺍﻟﺘﻌﺎﻣﻞ ﻣﻊ ﺍﳌﻠﻔﺎﺕ ﺍﻟﺘﺴﻠﺴﻠﻴﺔ ﻭﻣﻠﻔﺎﺕ‬
‫ﺍﻟﻮﺻﻮﻝ ﺍﻟﻌﺸﻮﺍﺋﻲ ﻣﻦ ﺧﻼﻝ ﺍﻷﻣﺜﻠﺔ ﺑﺎﻹﺿﺎﻓﺔ ﺇﱃ ﺗﻮﺿﻴﺢ ﻃﺮﻳﻘﺔ ﺇﺩﺧﺎﻝ ﺍﳌﻌﻄﻴﺎﺕ ﺿﻤﻦ ﻣﺼﻔﻮﻓﺎﺕ‬
‫ﺣﺮﻭﻑ ﰲ ﺍﻟﺬﺍﻛﺮﺓ ﻭﺇﺧﺮﺍﺟﻬﺎ ﻣﻨﻬﺎ‪.‬‬
‫ﻳﻨﺎﻗﺶ ﺍﻟﻔﺼﻞ ﺍﳋﺎﻣﺲ ﻋﺸﺮ "ﺍﻟﺼﻒ ‪ string‬ﻭﻣﻌﺎﳉﺔ ﺳﻼﺳﻞ ﺍﳊﺮﻭﻑ‬
‫‪Class string and String‬‬

‫‪ "Stream Processing‬ﻛﻴﻔﻴﺔ ﺇﺩﺧﺎﻝ ﺍﳌﻌﻄﻴﺎﺕ ﺇﱃ ﺍﻟﺬﺍﻛﺮﺓ ﻭﻛﻴﻔﻴﺔ ﺇﺧﺮﺍﺟﻬﺎ ﻣﻨﻬﺎ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺳﻼﺳﻞ‬
‫ﺍﳊﺮﻭﻑ‪ .‬ﻳﺮﺗﺒﻂ ﺍﻟﺼﻒ ‪ string‬ﺍﳌﻌﺮﻭﺽ ﰲ ﻫﺬﺍ ﺍﻟﻔﺼﻞ ﺑﺎﳌﻜﺘﺒﺔ ﺍﳌﻌﻴﺎﺭﻳﺔ ﻟﻠﻐﺔ ‪.C++‬‬
‫‪ "Web Programming With CGI‬ﻓﻴﻌﺮﺽ‬ ‫‪CGI‬‬‫ﺃﻣﺎ ﺍﻟﻔﺼﻞ ﺍﻟﺴﺎﺩﺱ ﻋﺸﺮ "ﺑﺮﳎﺔ ﺍﻟﻮﺏ ﺑﺎﺳﺘﺨﺪﺍﻡ‬
‫ﻭﻳﺘﻌﺮﺽ ﺃﻳﻀﹰﺎ ﳌﻔﻬﻮﻡ ﺍﻟﺘﻄﺒﻴﻘﺎﺕ ﻣﺘﻌﺪﺩﺓ‬ ‫ﺍﳌﻔﺎﻫﻴﻢ ﺍﻷﺳﺎﺳﻴﺔ ﻟﺒﻨﺎﺀ ﺑﺮﺍﻣﺞ ‪ CGI‬ﺑﺎﺳﺘﺨﺪﺍﻡ ﻟﻐﺔ ‪C++‬‬

‫ﺍﻟﻄﺒﻘﺎﺕ ‪.M-tier applications‬‬


‫ﻧﻨﺎﻗﺶ ﰲ ﺍﻟﻔﺼﻞ ﺍﻟﺴﺎﺑﻊ ﻋﺸﺮ "ﺑﲎ ﺍﳌﻌﻄﻴﺎﺕ ‪ "Data Structures‬ﺍﻟﺘﻘﻨﻴﺎﺕ ﺍﳌﺴﺘﺨﺪﻣﺔ ﻟﻠﺘﻌﺎﻣﻞ ﻣﻊ ﺑﲎ‬
‫ﺍﳌﻌﻄﻴﺎﺕ ﺍﻟﺪﻳﻨﺎﻣﻴﻜﻴﺔ‪ ،‬ﺣﻴﺚ ﻳﺒﺪﺃ ﺍﻟﻔﺼﻞ ﺑﺎﳊﺪﻳﺚ ﻋﻦ ﺻﻔﻮﻑ ﺍﻟﺘﺄﺷﲑ ﺍﻟﺬﺍﰐ ﻭﺍﳊﺠﺮ ﺍﻟﺪﻳﻨﺎﻣﻴﻜﻲ‬
‫ﻟﻠﺬﺍﻛﺮﺓ‪ ،‬ﰒ ﻳﺒﲔ ﻛﻴﻔﻴﺔ ﺍﻟﺘﻌﺎﻣﻞ ﻣﻊ ﺍﻟﻘﻮﺍﺋﻢ ﺍﳌﺮﺗﺒﻄﺔ ﻭﺻﻔﻮﻑ ﺍﻻﻧﺘﻈﺎﺭ ﻭﺍﳌﻜﺪﺳﺎﺕ ﻭﺍﻷﺷﺠﺎﺭ‪.‬‬
‫ﻳﻌﺮﺽ ﺍﻟﻔﺼﻞ ﺍﻟﺜﺎﻣﻦ ﻋﺸﺮ "ﺍﳋﺎﻧﺎﺕ ﻭﺳﻼﺳﻞ ﺍﳊﺮﻭﻑ ﻭﺍﻟﺴﺠﻼﺕ‬
‫‪Bits, Characters, Strings, and‬‬

‫‪ "Structures‬ﺍﻹﻣﻜﺎﻧﻴﺎﺕ ﺍﳌﺘﻮﻓﺮﺓ ﰲ ﻟﻐﺔ ‪ C++‬ﻟﺘﻄﻮﻳﺮ ﺑﺮﺍﻣﺞ ﻗﺎﺩﺭﺓ ﻋﻠﻰ ﺍﻟﺘﻌﺎﻣﻞ ﺍﳌﺒﺎﺷﺮ ﻣﻊ ﺍﻟﺒﻨﻴﺔ‬
‫ﺍﻟﺼﻠﺒﺔ ﻟﻠﺤﺎﺳﺐ ﻭﺍﻟﱵ ﻫﻲ ﻋﻠﻰ ﻣﺴﺘﻮﻯ ﺍﳋﺎﻧﺎﺕ‪ .‬ﻛﻤﺎ ﻳﻮﺿﺢ ﻃﺮﻳﻘﺔ ﺍﻟﺘﻌﺎﻣﻞ ﻣﻊ ﺳﻼﺳﻞ ﺍﳊﺮﻭﻑ‬
‫ﻣﻦ ﺧﻼﻝ ﺍﻟﺘﻮﺍﺑﻊ ﺍﳌﺘﻮﻓﺮﺓ ﰲ ﻣﻜﺘﺒﺔ ﺍﻟﺘﻌﺎﻣﻞ ﻣﻊ ﺳﻼﺳﻞ ﺍﳊﺮﻭﻑ‪ ،‬ﰒ ﻳﺒﲔ ﻛﻴﻔﻴﺔ ﺍﻟﺘﻌﺎﻣﻞ ﻣﻊ‬
‫ﺍﻟﺴﺠﻼﺕ ﻭﺍﺳﺘﺨﺪﺍﻣﻬﺎ ﻣﻊ ﺍﳌﺆﺷﺮﺍﺕ ﻭﺃﺳﺎﻟﻴﺐ ﺍﳊﺠﺰ ﺍﻟﺪﻳﻨﺎﻣﻴﻜﻲ ﻟﻠﺬﺍﻛﺮﺓ‪ .‬ﻳﺘﻀﻤﻦ ﺍﻟﻔﺼﻞ ﻋﺮﺿﹰﺎ‬
‫ﻟﱪﻧﺎﻣﺞ ﳏﺎﻛﻲ ﻋﺎﱄ ﺍﻷﺩﺍﺀ ﻟﻌﻤﻠﻴﺔ ﺧﻠﻂ ﺃﻭﺭﺍﻕ ﺍﻟﻠﻌﺐ ﻭﺗﻮﺯﻳﻌﻬﺎ‪.‬‬
‫ﻳﻨﺎﻗﺶ ﺍﻟﻔﺼﻞ ﺍﻟﺘﺎﺳﻊ ﻋﺸﺮ "ﻣﺮﺣﻠﺔ ﻣﺎ ﻗﺒﻞ ﺍﻟﺘﺮﲨﺔ ‪ "The Preprocessor‬ﻃﺮﻳﻘﺔ ﺍﻟﺘﻌﺎﻣﻞ ﻣﻊ ﺍﻟﺘﻮﺟﻴﻬﺎﺕ‬
‫ﺍﳌﻮﺟﻮﺩﺓ ﺿﻤﻦ ﻧﺼﻮﺹ ﺍﻟﱪﺍﻣﺞ ﻭﺍﳌﺘﻌﻠﻘﺔ ﺑﻌﻤﻠﻴﺎﺕ ﺇﺩﺭﺍﺝ ﺍﳌﻠﻔﺎﺕ ﺍﻟﺮﺃﺳﻴﺔ ﻭﺗﻌﺮﻳﻒ ﺍﻟﺜﻮﺍﺑﺖ ﺍﻟﺮﻣﺰﻳﺔ‬
‫ﻭﺍﳌﺎﻛﺮﻭ ﻭﺍﻟﺘﺮﲨﺔ ﺍﻟﺸﺮﻃﻴﺔ‪.‬‬
‫ﻳﻌﺮﺽ ﺍﻟﻔﺼﻞ ﺍﻟﻌﺸﺮﻭﻥ "ﻣﻮﺍﺿﻴﻊ ﻣﺮﺗﺒﻄﺔ ﺑﻠﻐﺔ ‪ "C Legacy-code Topics C‬ﺑﻌﺾ ﺍﳌﻮﺍﺿﻴﻊ ﺍﻹﺿﺎﻓﻴﺔ‬
‫ﺍﳌﺮﺗﺒﻄﺔ ﺑﻌﻤﻠﻴﺎﺕ ﺇﻋﺎﺩﺓ ﺗﻮﺟﻴﻪ ﺍﻟﺪﺧﻞ ﻣﻦ ﻣﻠﻒ ﺃﻭ ﺍﳋﺮﺝ ﺇﱃ ﻣﻠﻒ ﺃﻭ ﻟﻴﺼﺒﺢ ﻛﺪﺧﻞ ﻟﱪﻧﺎﻣﺞ ﺁﺧﺮ‪.‬‬
‫ﻭﻧﺒﲔ ﻛﻴﻔﻴﺔ ﲤﺮﻳﺮ ﻭﺳﻄﺎﺀ ﺇﱃ ﺍﻟﺘﺎﺑﻊ ﺍﻟﺮﺋﻴﺴﻲ ‪ main‬ﻭﻛﻴﻔﻴﺔ ﺗﺮﲨﺔ ﺑﺮﻧﺎﻣﺞ ﻣﻮﺯﻉ ﺇﱃ ﻋﺪﺓ ﻣﻠﻔﺎﺕ‪....‬‬
‫ﻭﻏﲑ ﺫﻟﻚ ﻣﻦ ﺍﳌﻮﺍﺿﻴﻊ ﺍﻷﺧﺮﻯ ﺍﳌﺘﻘﺪﻣﺔ ﻭﺍﻟﱵ ﱂ ﻧﺘﻌﺮﺽ ﳍﺎ ﰲ ﺍﻟﻔﺼﻮﻝ ﺍﻷﺧﺮﻯ‪.‬‬
‫ﺃﻣﺎ ﺍﻟﻔﺼﻞ ﺍﳊﺎﺩﻱ ﻭﺍﻟﻌﺸﺮﻭﻥ "ﻣﻜﺘﺒﺔ ﺍﻟﻘﻮﺍﻟﺐ ﺍﳌﻌﻴﺎﺭﻳﺔ ‪ "Standrad Template Library‬ﻓﻴﻘﻮﻡ ﺑﻌﺮﺽ‬
‫ﻣﻜﺘﺒﺔ ﺍﻟﻘﻮﺍﻟﺐ ‪ STD‬ﻭﻳﻮﺿﺢ ﻃﺮﻳﻖ ﺍﻟﺘﻌﺎﻣﻞ ﻣﻌﻬﺎ ﻭﺍﻻﺳﺘﻔﺎﺩﺓ ﻣﻨﻬﺎ ﻟﺒﻨﺎﺀ ﺗﻄﺒﻴﻘﺎﺕ ﻓﻌﺎﻟﺔ‪.‬‬
‫ﺃﺧﲑﹰﺍ‪ ،‬ﻧﻘﺪﻡ ﰲ ﺍﻟﻔﺼﻞ ﺍﻟﺜﺎﱐ ﻭﺍﻟﻌﺸﺮﻭﻥ ﻭﺍﻷﺧﲑ "ﻣﻮﺍﺿﻴﻊ ﺃﺧﺮﻯ ‪ "Other Topics‬ﳎﻤﻮﻋﺔ ﻣﻦ‬
‫‪٧٩‬‬ ‫‪ .1‬ﻣﻘﺪﻣﺔ ﺣﻮل اﻟﺤﻮاﺳﻴﺐ واﻟﺒﺮﻣﺠﺔ ﺑﻠﻐﺔ ‪C++‬‬

‫ﺍﳌﺘﻔﺮﻗﺎﺕ ﺣﻮﻝ ﻟﻐﺔ ‪ .C++‬ﻭﻳﻌﺮﺽ ﻫﺬﺍ ﺍﻟﻔﺼﻞ ﻋﻤﻠﻴﱵ ﺍﻟﻘﺴﺮ ‪ cost-cast‬ﻭ‪ .reinterpret-cast‬ﻛﻤﺎ‬
‫ﻧﻨﺎﻗﺶ ﻓﻴﻪ ﻣﻔﻬﻮﻡ ﻓﻀﺎﺀﺍﺕ ﺍﻷﲰﺎﺀ ‪ namespaces‬ﻭﺍﻟﻔﺎﺋﺪﺓ ﻣﻨﻬﺎ‪ .‬ﻳﻌﺮﺽ ﺍﻟﻔﺼﻞ ﺃﻳﻀﹰﺎ ﺍﻟﻜﻠﻤﺔ ﺍﳌﻔﺘﺎﺣﻴﺔ‬
‫‪ explicit‬ﻭﺷﺮﻭﻁ ﺍﺳﺘﺨﺪﺍﻣﻬﺎ‪ .‬ﻛﺬﻟﻚ ﻳﺘﺤﺪﺙ ﺍﻟﻔﺼﻞ ﻋﻦ ﺍﻟﻜﻠﻤﺔ ﺍﳌﻔﺘﺎﺣﻴﺔ ‪ mutable‬ﻭﻋﻦ ﺍﻟﻮﺭﺍﺛﺔ‬
‫ﺍﳌﺘﻌﺪﺩﺓ ﻭﺍﻟﺼﻔﻮﻑ ﺍﻷﺳﺎﺳﻴﺔ ﺍﻟﻈﺎﻫﺮﻳﺔ ‪.virtnal‬‬
‫ﳒﺪ ﰲ ﻬﻧﺎﻳﺔ ﺍﻟﻜﺘﺎﺏ ﺍﳌﻼﺣﻖ ﺍﻟﺘﺎﻟﻴﺔ‪ :‬ﺍﳌﻠﺤﻖ )‪ (A‬ﻭﻳﺘﻀﻤﻦ ﺟﺪﻭ ﹰﻻ ﻷﻭﻟﻮﻳﺎﺕ ﻛﺎﻓﺔ ﺍﻟﻌﻤﻠﻴﺎﺕ‬
‫ﺍﳌﺴﺘﺨﺪﻣﺔ ﻣﻊ ﻟﻐﺔ ‪ ،C++‬ﻭﺍﳌﻠﺤﻖ )‪ (B‬ﺍﻟﺬﻱ ﻳﻌﺮﺽ ﳎﻤﻮﻋﺔ ﺍﳊﺮﻭﻑ ‪ ASCII‬ﻭﻗﻴﻤﻬﺎ ﺍﳌﺨﺘﻠﻔﺔ‪ ،‬ﻭﻧﺒﲔ‬
‫ﺃﺧﲑﹰﺍ ﰲ ﺍﳌﻠﺤﻖ )‪ (C‬ﻧﻈﻢ ﺍﻟﻌﺪ ﺍﻟﺜﻨﺎﺋﻲ ﻭﺍﻟﺜﻤﺎﱐ ﻭﺍﻟﺴﺖ ﻋﺸﺮﻱ ﺍﻟﻌﺸﺮﻱ ﻭﻛﻴﻔﻴﺔ ﲢﻮﻳﻞ ﺍﻷﻋﺪﺍﺩ ﻣﻦ‬
‫ﺃﻱ ﻧﻈﺎﻡ ﻣﻨﻬﺎ ﺇﱃ ﻧﻈﺎﻡ ﺁﺧﺮ‪ .‬ﻧﻌﺮﺽ ﰲ ﺍﳌﻠﺤﻖ )‪ (D‬ﻋﺪﺩﹰﺍ ﻣﻦ ﺍﳌﺼﺎﺩﺭ ﺍﳌﺘﻮﻓﺮﺓ ﻋﻠﻰ ﺍﻻﻧﺘﺮﻧﺖ ﻭﺍﻟﻮﺏ‬
‫ﺣﻮﻝ ﻟﻐﺔ ‪ .C++‬ﻳﻨﺘﻬﻲ ﺍﻟﻜﺘﺎﺏ ﺑﻌﺪﻫﺎ ﺑﺬﻛﺮ ﻟﻌﺪﺩ ﻣﻦ ﺃﻫﻢ ﺍﳌﺮﺍﺟﻊ ﻭﺍﳌﺼﺎﺩﺭ ﺍﳍﺎﻣﺔ ﻭﺍﳌﺮﺗﺒﻄﺔ ﺑﻠﻐﺔ‬
‫‪.C++‬‬

‫ﺗﻤﺎریﻦ اﻟﻤﺮاﺝﻌﺔ اﻟﺬاﺗﻴﺔ‬


‫ﺍﻣﻸ ﺍﻟﻔﺮﺍﻏﺎﺕ ﺑﺎﻟﻜﻠﻤﺎﺕ ﺍﳌﻨﺎﺳﺒﺔ‬ ‫‪1-1‬‬

‫‪.‬‬ ‫ﺗﺪﻋﻰ ﺍﻟﺸﺮﻛﺔ ﺍﻟﱵ ﻗﺎﻣﺖ ﺑﻨﺸﺮ ﺍﳊﻮﺍﺳﺐ ﺍﻟﺸﺨﺼﻴﺔ ﺑﺸﺮﻛﺔ‬ ‫ﺃ(‬
‫ﺏ( ﻳُﺴﻤﻰ ﺍﳊﺎﺳﺐ ﺍﻟﺬﻱ ﺟﻌﻞ ﻣﻦ ﺍﳊﻮﺍﺳﺐ ﺍﻟﺸﺨﺼﻴﺔ ﻣﻘﺒﻮﻟﺔ ﰲ ﺇﺩﺍﺭﺓ ﺍﻷﻋﻤﺎﻝ ﻭﰲ‬
‫ﺍﻟﺼﻨﺎﻋﺔ ﺑـ ـــــ‪.‬‬
‫ﺝ( ﺗﻌﺎﰿ ﺍﳊﻮﺍﺳﺐ ﺍﳌﻌﻄﻴﺎﺕ ﲢﺖ ﺍﺷﺮﺍﻑ ﳎﻤﻮﻋﺔ ﻣﻦ ﺍﻟﺘﻌﻠﻴﻤﺎﺕ ﺍﻟﱵ ﺗﺴﻤﻰ‬
‫‪.‬‬ ‫ﺑـ‬
‫‪.‬‬ ‫ﺩ( ﻳﺘﺄﻟﻒ ﺍﳊﺎﺳﺐ ﻣﻦ ﺳﺘﺔ ﺃﺟﺰﺍﺀ ﻣﻨﻄﻘﻴﺔ ﻫﻲ‪:‬‬
‫‪.‬‬ ‫‪،‬‬ ‫‪،‬‬ ‫ﻫـ( ﺗﺆﻟﻒ ﻟﻐﺎﺕ ﺍﻟﱪﳎﺔ ﺛﻼﺛﺔ ﻓﺌﺎﺕ ﰎ ﺫﻛﺮﻫﺎ ﰲ ﺍﻟﻔﺼﻞ ﻭﻫﻲ‪:‬‬
‫ﻭ( ﻧﺴﻤﻲ ﺍﻟﱪﺍﻣﺞ ﺍﻟﱵ ﺗﻘﻮﻡ ﺑﺘﺮﲨﺔ ﺍﻟﱪﺍﻣﺞ ﻣﻦ ﻟﻐﺔ ﻋﺎﻟﻴﺔ ﺍﳌﺴﺘﻮﻯ ﺇﱃ ﻟﻐﺔ ﺍﻵﻟﺔ ﺑﺎﻟـ ‪.‬‬
‫‪.‬‬ ‫ﺯ( ﻋُﺮﻓﺖ ‪ C‬ﻋﻠﻰ ﺃﻬﻧﺎ ﻟﻐﺔ ﺍﻟﺘﻄﻮﻳﺮ ﺍﳌﺴﺘﺨﺪﻣﺔ ﻟﺒﻨﺎﺀ ﻧﻈﺎﻡ ﺍﻟﺘﺸﻐﻴﻞ‬
‫ﻣﻦ ﻗﺒﻞ ‪ Wirth‬ﻣﻦ ﺃﺟﻞ ﺗﻌﻠﻴﻢ ﺃﺳﻠﻮﺏ ﺍﻟﱪﳎﺔ ﺍﳌﻬﻴﻜﻠﺔ‬ ‫ﺡ( ﰎ ﺗﻄﻮﻳﺮ ﻟﻐﺔ‬
‫ﰲ ﺍﳉﺎﻣﻌﺎﺕ‪.‬‬
‫ﻁ( ﻗﺎﻣﺖ ﻭﺯﺍﺭﺓ ﺍﻟﺪﻓﺎﻉ ﺍﻻﻣﲑﻳﻜﻴﺔ ﺑﺘﻄﻮﻳﺮ ﻟﻐﺔ ‪ Ada‬ﻭﺯﻭﺩﻬﺗﺎ ﺑﺈﻣﻜﺎﻧﻴﺔ ﺍﻟـ ﺍﻟﱵ ﺗﺴﻤﺢ‬
‫ﻟﻠﻤﱪﻣﺞ ﺑﺘﻨﻔﻴﺬ ﻋﺪﺓ ﻣﻬﺎﻡ ﻋﻠﻰ ﺍﻟﺘﻮﺍﺯﻱ‪.‬‬

‫ﺍﻣﻸ ﺍﻟﻔﺮﺍﻏﺎﺕ ﺍﻟﻮﺍﺭﺩﺓ ﰲ ﺍﳉﻤﻞ ﺍﻟﺘﺎﻟﻴﺔ ﻭﺍﻟﱵ ﺗﺘﻌﻠﻖ ﺑﺒﻴﺌﺔ ﺍﻟﻌﻤﻞ ﺍﳋﺎﺻﺔ ﺑـ ‪:C++‬‬ ‫‪2-1‬‬

‫‪.‬‬ ‫ﺗﺘﻢ ﻋﺎﺩﺓ ﻋﻤﻠﻴﺔ ﺇﺩﺧﺎﻝ ﺑﺮﺍﻣﺞ ‪ C++‬ﺇﱃ ﺍﳊﺎﺳﺐ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺑﺮﺍﻣﺞ‬ ‫ﺃ(‬
‫اﻟﻔﺼﻞ اﻷول‬ ‫‪٨٠‬‬

‫ﻗﺒﻞ ﺃﻥ ﺗﺒﺪﺃ ﻣﺮﺣﻠﺔ ﺍﻟﺘﺮﲨﺔ‪.‬‬ ‫ﺏ( ﻣﻊ ﻟﻐﺔ ‪ ،C++‬ﻳﺘﻢ ﺗﻨﻔﻴﺬ ﺑﺮﻧﺎﻣﺞ‬


‫ﺝ( ﻳﻘﻮﻡ ﺑﺮﻧﺎﻣﺞ ﺑﺮﺑﻂ ﺧﺮﺝ ﺍﳌﺘﺮﺟﻢ ﻣﻊ ﺗﻮﺍﺑﻊ ﺍﳌﻜﺘﺒﺎﺕ ﺍﳌﺴﺘﺨﺪﻣﺔ ﻣﻦ ﺃﺟﻞ ﺇﺧﺮﺍﺝ‬
‫ﺻﻮﺭﺓ ﺃﻭ ﻣﻠﻒ ﻗﺎﺑﻞ ﻟﻠﺘﻨﻔﻴﺬ‪.‬‬
‫ﺩ( ﻳﻘﻮﻡ ﺑﺮﻧﺎﻣﺞ ﺑﻨﻘﻞ ﺍﻟﺼﻮﺭﺓ ﺍﻟﻘﺎﺑﻠﺔ ﻟﻠﺘﻨﻔﻴﺬ ﻟﱪﻧﺎﻣﺞ ‪ C++‬ﻣﻦ ﺍﻟﻘﺮﺹ ﺇﱃ ﺍﻟﺬﺍﻛﺮﺓ‪.‬‬

‫ﺍﻣﻸ ﺍﻟﻔﺮﺍﻏﺎﺕ ﺑﺎﻟﻜﻠﻤﺎﺕ ﺍﳌﻨﺎﺳﺒﺔ‪:‬‬ ‫‪3-1‬‬

‫‪.‬‬ ‫ﻳﺒﺪﺃ ﺗﻨﻔﻴﺬ ﺃﻱ ﺑﺮﻧﺎﻣﺞ ﻣﻜﺘﻮﺏ ﺑﻠﻐﺔ ‪ C++‬ﻣﻦ ﺍﻟﺘﺎﺑﻊ‬ ‫ﺃ(‬


‫‪.‬‬ ‫ﻭﻳﻨﺘﻬﻲ ﺑﺎﻹﺷﺎﺭﺓ‬ ‫ﺏ( ﻳﺒﺪﺃ ﺟﺴﻢ ﺃﻱ ﺗﺎﺑﻊ ﺑﺎﻹﺷﺎﺭﺓ‬
‫‪.‬‬ ‫ﺝ( ﺗﻨﺘﻬﻲ ﻛﻞ ﺗﻌﻠﻴﻤﺔ ﺑﺎﻹﺷﺎﺭﺓ‬
‫ﺩ( ﲤﺜﻞ ﺳﻠﺴﻠﺔ ﺍﳍﺮﻭﺏ ‪ \n‬ﺣﺮﻑ ﻭﻫﻲ ﺗﺴﺒﺐ ﻧﻘﻞ ﺍﳌﺆﺷﺮ ﺇﱃ ﺑﺪﺍﻳﺔ ﺍﻟﺴﻄﺮ ﺍﻟﺘﺎﱄ‬
‫ﻋﻠﻰ ﺍﻟﺸﺎﺷﺔ‪.‬‬
‫ﻣﻦ ﺃﺟﻞ ﺇﲣﺎﺫ ﺍﻟﻘﺮﺍﺭﺍﺕ‪.‬‬ ‫ﻫـ( ﺗﺴﺘﺨﺪﻡ ﺗﻌﻠﻴﻤﺔ‬

‫ﻼ ﳑﺎ ﻳﻠﻲ ﺻﺤﻴﺤﹰﺎ ﺃﻡ ﻻ‪ .‬ﻭﺇﺫﺍ ﱂ ﻳﻜﻦ ﺻﺤﻴﺤﹰﺎ ﺇﺷﺮﺡ ﳌﺎﺫﺍ‪:‬‬


‫ﺣﺪﺩ ﻓﻴﻤﺎ ﺇﺫﺍ ﻛﺎﻥ ﻛ ﹰ‬ ‫‪4-1‬‬

‫ﺃ( ﻋﻨﺪ ﺗﻨﻔﻴﺬ ﺍﻟﱪﻧﺎﻣﺞ‪ ،‬ﺗﻘﻮﻡ ﺍﻟﺘﻌﻠﻴﻘﺎﺕ ﺑﻄﺒﺎﻋﺔ ﺍﻟﻨﺺ ﺍﳌﺬﻛﻮﺭ ﺑﻌﺪ ﺇﺷﺎﺭﺓ ‪ //‬ﻋﻠﻰ ﺍﻟﺸﺎﺷﺔ‪.‬‬
‫ﺏ( ﺗﺴﺒﺐ ﺳﻠﺴﻠﺔ ﺍﳍﺮﻭﺏ ‪ \n‬ﻋﻨﺪ ﺍﺳﺘﺨﺪﺍﻣﻬﺎ ﻣﻊ ‪ cout‬ﺇﻧﺘﻘﺎﻝ ﺍﳌﺆﺷﺮ ﺇﱃ ﺑﺪﺍﻳﺔ ﺍﻟﺴﻄﺮ‬
‫ﺍﻟﺘﺎﱄ ﻋﻠﻰ ﺍﻟﺸﺎﺷﺔ‪.‬‬
‫ﺝ( ﳚﺐ ﺍﻟﺘﺼﺮﻳﺢ ﻋﻦ ﻛﻞ ﺍﳌﺘﺤﻮﻻﺕ ﻗﺒﻞ ﺍﺳﺘﺨﺪﺍﻣﻬﺎ‪.‬‬
‫ﺩ( ﳚﺐ ﲢﺪﻳﺪ ﳕﻂ ﺍﳌﺘﺤﻮﻻﺕ ﻋﻨﺪ ﺍﻟﺘﺼﺮﻳﺢ ﻋﻨﻬﺎ‪.‬‬
‫ﻫـ( ﺗﻌﺘﱪ ﻟﻐﺔ ‪ C++‬ﺍﳌﺘﺤﻮﻟﲔ ‪ number‬ﻭ ‪ NuMbEr‬ﻋﻠﻰ ﺃﻬﻧﺎ ﻧﻔﺲ ﺍﳌﺘﺤﻮﻝ‪.‬‬
‫ﻭ( ﳝﻜﻦ ﻟﻠﺘﺼﺮﳛﺎﺕ ﺃﻥ ﺗﻈﻬﺮ ﰲ ﺃﻱ ﻣﻜﺎﻥ ﻣﻦ ﺟﺴﻢ ﺍﻟﺘﺎﺑﻊ ﺍﳌﻜﺘﻮﺏ ﺑﻠﻐﺔ ‪.C++‬‬
‫ﺯ( ﺗﺴﺘﺨﺪﻡ ﻋﻤﻠﻴﺔ ﺍﻟﻘﺴﻤﺔ ﺍﻟﺼﺤﻴﺤﺔ )÷( ﻣﻊ ﺍﳌﻌﺎﻣﻼﺕ ﺍﻟﺼﺤﻴﺤﺔ ﻓﻘﻂ‪.‬‬
‫ﺡ( ﺗﺘﻤﺘﻊ ﺍﻟﻌﻤﻠﻴﺎﺕ ﺍﳊﺴﺎﺑﻴﺔ * ﻭ‪ /‬ﻭ‪ %‬ﻭ‪ +‬ﻭ‪ -‬ﺑﻨﻔﺲ ﻣﺴﺘﻮﻯ ﺍﻷﻭﻟﻮﻳﺔ‪.‬‬
‫ﻁ( ﳚﺐ ﺃﻥ ﳛﺘﻮﻱ ﺑﺮﻧﺎﻣﺞ ‪ C++‬ﺍﻟﺬﻱ ﻳﻘﻮﻡ ﺑﻄﺒﺎﻋﺔ ﺛﻼﺛﺔ ﺃﺳﻄﺮ ﻋﻠﻰ ﺍﳋﺮﺝ‪ ،‬ﻋﻠﻰ ﺛﻼﺙ‬
‫ﺗﻌﻠﻴﻤﺎﺕ ﺧﺮﺝ ﺑﺎﺳﺘﺨﺪﺍﻡ ‪.cout‬‬
‫ﺃﻛﺘﺐ ﺗﻌﻠﻴﻤﺔ ﻭﺍﺣﺪﺓ ﺑﻠﻐﺔ ‪ C++‬ﻟﻠﻘﻴﺎﻡ ﲟﺎ ﻳﻠﻲ‪:‬‬ ‫‪5-1‬‬

‫ﺍﻟﺘﺼﺮﻳﺢ ﻋﻦ ﺍﳌﺘﺤﻮﻻﺕ‪ C :‬ﻭ‪ thisIsAVariable‬ﻭ‪ q76354‬ﻭ‪ number‬ﻋﻠﻰ ﺃﻬﻧﺎ ﻣﻦ‬ ‫ﺃ(‬


‫‪٨١‬‬ ‫‪ .1‬ﻣﻘﺪﻣﺔ ﺣﻮل اﻟﺤﻮاﺳﻴﺐ واﻟﺒﺮﻣﺠﺔ ﺑﻠﻐﺔ ‪C++‬‬

‫ﺍﻟﻨﻤﻂ ‪.int‬‬
‫ﺏ( ﺍﻟﻄﻠﺐ ﻣﻦ ﺍﳌﺴﺘﺨﺪﻡ ﺇﺩﺧﺎﻝ ﻋﺪﺩ ﺻﺤﻴﺢ‪ .‬ﻋﻠﻰ ﺃﻥ ﺗﻨﺘﻬﻲ ﺭﺳﺎﻟﺔ ﺍﻟﻄﻠﺐ ﺑﺈﺷﺎﺭﺓ )‪(:‬‬
‫ﻣﺘﺒﻮﻋﺔ ﺑﻔﺮﺍﻍ ﻭﻳﺒﻘﻰ ﺍﳌﺆﺷﺮ ﰲ ﻣﻜﺎﻧﻪ ﺑﻌﺪ ﺍﻟﻔﺮﺍﻍ‪.‬‬
‫ﺝ( ﻗﺮﺍﺀﺓ ﻋﺪﺩ ﺻﺤﻴﺢ ﻣُﺪﺧﻞ ﺑﻮﺍﺳﻄﺔ ﻟﻮﺣﺔ ﺍﳌﻔﺎﺗﻴﺢ ﻭﲣﺰﻥ ﻗﻴﻤﺘﻪ ﰲ ﺍﳌﺘﺤﻮﻝ ‪ agc‬ﻣﻦ‬
‫ﺍﻟﻨﻤﻂ ‪.int‬‬
‫ﺩ( ﺇﺫﺍ ﻛﺎﻧﺖ ﻗﻴﻤﺔ ﺍﳌﺘﺤﻮﻝ ‪ number‬ﻻﺗﺴﺎﻭﻱ ‪ ،7‬ﺍﻃﺒﻊ ﺍﻟﺮﺳﺎﻟﺔ‪:‬‬
‫‪"The variable number is not equal to 7".‬‬

‫ﻫـ( ﺃﻃﺒﻊ ﺍﻟﺮﺳﺎﻟﺔ ”‪ “This is a C++ program‬ﻋﻠﻰ ﺳﻄﺮ ﻭﺍﺣﺪ‪.‬‬


‫ﻭ( ﺃﻃﺒﻊ ﺍﻟﺮﺳﺎﻟﺔ ”‪ “This is a C++ program‬ﻋﻠﻰ ﺳﻄﺮﻳﻦ ﺣﻴﺚ ﻳﻨﺘﻬﻲ ﺍﻟﺴﻄﺮ‬
‫ﺍﻷﻭﻝ ﺑـ ‪.C++‬‬
‫ﺯ( ﺃﻃﺒﻊ ﺍﻟﺮﺳﺎﻟﺔ ”‪ “This is a C++ program‬ﻋﻠﻰ ﺃﻥ ﺗﻀﻊ ﻛﻞ ﻛﻠﻤﺔ ﻋﻠﻰ ﺳﻄﺮ ﻣﺴﺘﻘﻞ‪.‬‬
‫ﺡ( ﺃﻃﺒﻊ ﺍﻟﺮﺳﺎﻟﺔ ”‪ “This is a C++ program‬ﻋﻠﻰ ﺃﻥ ﻳﻔﺼﻞ ﺑﲔ ﺍﻟﻜﻠﻤﺎﺕ ﻣﺴﺎﻓﺔ‬
‫ﺟﺪﻭﻟﺔ )‪.(tab‬‬

‫ﺃﻛﺘﺐ ﺗﻌﻠﻴﻤﺔ )ﺃﻭ ﺗﻌﻠﻴﻘﹰﺎ( ﻟﻠﻘﻴﺎﻡ ﲟﺎ ﻳﻠﻲ‪:‬‬ ‫‪6-1‬‬

‫ﺑﲔ ﺃﻥ ﺍﻟﱪﻧﺎﻣﺞ ﺳﻮﻑ ﻳﻘﻮﻡ ﲝﺴﺎﺏ ﺟﺪﺍﺀ ﺛﻼﺛﺔ ﺃﻋﺪﺍﺩ ﺻﺤﻴﺤﺔ‪.‬‬ ‫ﺃ(‬
‫ﺏ( ﺻﺮﺡ ﻋﻦ ﺍﳌﺘﺤﻮﻻﺕ ‪ x, y, z‬ﻭ ‪ result‬ﻋﻠﻰ ﺃﻬﻧﺎ ﻣﻦ ﺍﻟﻨﻤﻂ ‪.int‬‬
‫ﺝ( ﺇﻃﻠﺐ ﻣﻦ ﺍﳌﺴﺘﺨﺪﻡ ﺇﺩﺧﺎﻝ ﺛﻼﺛﺔ ﺃﻋﺪﺍﺩ ﺻﺤﻴﺤﺔ‪.‬‬
‫ﺩ( ﺇﻗﺮﺃ ﺛﻼﺛﺔ ﺃﻋﺪﺍﺩ ﺻﺤﻴﺤﺔ ﻣُﺪﺧﻠﺔ ﺑﻮﺍﺳﻄﺔ ﻟﻮﺣﺔ ﺍﳌﻔﺎﺗﻴﺢ ﻭﺧﺰﻬﻧﺎ ﰲ ﺍﳌﺘﺤﻮﻻﺕ ‪.z, y, x‬‬
‫ﻫـ( ﻗﻢ ﲝﺴﺎﺏ ﺟﺪﺍﺀ ﺍﻷﻋﺪﺍﺩ ﺍﻟﺼﺤﻴﺤﺔ ﺍﳌﻮﺟﻮﺩﺓ ﰲ ﺍﳌﺘﺤﻮﻻﺕ ‪ y, x‬ﻭ ‪ y‬ﻭﺿﻊ ﺍﻟﻨﺘﻴﺠﺔ‬
‫ﰲ ﺍﳌﺘﺤﻮﻝ ‪.result‬‬
‫ﻭ( ﺇﻃﺒﻊ ﺍﻟﺮﺳﺎﻟﺔ ”‪ “The product is‬ﻣﺘﺒﻮﻋﺔ ﲟﺤﺘﻮﻯ ﺍﳌﺘﺤﻮﻝ ‪.result‬‬
‫ﺯ( ﺃﻋﺪ ﻗﻴﻤﺔ ﻣﻦ ﺧﻼﻝ ﺍﻟﺘﺎﺑﻊ ‪ main‬ﺗﺪﻝ ﻋﻠﻰ ﻬﻧﺎﻳﺔ ﺗﻨﻔﻴﺬ ﺍﻟﱪﻧﺎﻣﺞ ﺑﻨﺠﺎﺡ‪.‬‬
‫ﺍﺳﺘﺨﺪﺍﻡ ﺍﻟﺘﻌﻠﻴﻤﺎﺕ ﺍﻟﱵ ﻛﺘﺒﺘﻬﺎ ﻣﻊ ﺍﻟﺘﻤﺮﻳﻦ ‪ ،6-1‬ﻭﺫﻟﻚ ﻣﻦ ﺃﺟﻞ ﻛﺘﺎﺑﺔ ﺑﺮﻧﺎﻣﺞ ﻛﺎﻣﻞ ﻳﻘﻮﻡ‬ ‫‪7-1‬‬
‫ﲝﺴﺎﺏ ﺟﺪﺍﺀ ﺛﻼﺛﺔ ﺃﻋﺪﺍﺩ ﺻﺤﻴﺤﺔ‪.‬‬
‫ﺣﺪﺩ ﺍﻷﺧﻄﺎﺀ ﻭﻗﻢ ﺑﺘﺼﺤﻴﺤﻬﺎ ﰲ ﻛ ٍﻞ ﻣﻦ ﺍﻟﺘﻌﻠﻴﻤﺎﺕ ﺍﻟﺘﺎﻟﻴﺔ )ﺑﻔﺮﺽ ﺃﻧﻨﺎ ﻧﺴﺘﺨﺪﻡ ﺍﻟﺘﻌﻠﻴﻤﺔ‬ ‫‪8-1‬‬
‫;‪ Using std::cout‬ﻣﻦ ﻗﺒﻞ(‪:‬‬
‫ﺃ(‬
‫;)‪if (c<7‬‬
‫اﻟﻔﺼﻞ اﻷول‬ ‫‪٨٢‬‬

‫;"‪cout << "C is less than 7\n‬‬


‫ﺏ(‬
‫)‪if (c=>7‬‬
‫;"‪cout << "is equal to or greater than 7\n‬‬

‫ﺍﻣﻸ ﺍﻟﻔﺮﺍﻏﺎﺕ ﰲ ﺍﳉﻤﻞ ﺍﻟﺘﺎﻟﻴﺔ ﲟﺎ ﻳﺘﻼﺀﻡ ﻣﻦ ﺍﻟﺘﻌﺎﺑﲑ ﺍﳌﺴﺘﺨﺪﻣﺔ ﻣﻊ ﺍﻷﻏﺮﺍﺽ‪:‬‬ ‫‪9-1‬‬

‫ﻫﻞ ﻳﺮﻯ ﺍﻟﺒﺸﺮ ﺷﺎﺷﺔ ﺍﻟﺘﻠﻔﺰﻳﻮﻥ ﻋﻠﻰ ﺃﻬﻧﺎ ﳎﺮﺩ ﻣﺴﺎﺣﺔ ﻣﺆﻟﻔﺔ ﻣﻦ ﺍﻟﺒﻘﻊ ﺍﳌﻠﻮﻧﺔ‪ .‬ﺃﻡ ﺃﻬﻧﻢ‬ ‫ﺃ(‬
‫ﻳﺴﺘﻄﻴﻌﻮﻥ ﲤﻴﻴﺰ ﺛﻼﺛﺔ ﺃﺷﺨﺎﺹ ﺟﺎﻟﺴﲔ ﺇﱃ ﻃﺎﻭﻟﺔ‪ .‬ﻫﺬﺍ ﻣﺜﺎﻝ ﻋﻠﻰ ﻣﻘﺪﺭﺓ ﻣﺘﻮﻓﺮﺓ ﻋﻦ‬
‫‪.‬‬ ‫ﺍﻟﺒﺸﺮ ﻭﺗﺴﻤﻰ ﺑـ‬
‫ﺏ( ﺇﺫﺍ ﻧﻈﺮﻧﺎ ﺇﱃ ﺍﻟﺴﻴﺎﺭﺓ ﻋﻠﻰ ﺃﻬﻧﺎ "ﻏﺮﺽ" ﻓﺒﺎﻟﺘﺎﱄ ﻫﻞ ﻧﻌﺘﱪ ﺍﳊﻘﻴﻘﺔ ﺍﻟﻘﺎﺋﻠﺔ ﺃﻥ ﺳﻘﻔﻬﺎ‬
‫ﺧﺎﺹ ﺃﻭ ﺧﺎﺻﺔ ﻬﺑﺬﺍ ﺍﻟﻐﺮﺽ‪.‬‬ ‫ﻗﺎﺑﻞ ﻟﻠﻄﻲ ﻫﻲ ﻋﺒﺎﺭﺓ ﻋﻦ ﺻﻔﺔ ﺃﻡ ﺳﻠﻮﻙ‬
‫ﺝ( ﺗﻌﺘﱪ ﺍﳊﻘﺎﺋﻖ ﺍﻟﱵ ﺗﻌﱪ ﻋﻦ ﻛﻮﻥ ﺍﻟﺴﻴﺎﺭﺓ ﻗﺎﺩﺭﺓ ﻋﻠﻰ ﺍﻟﺘﺴﺎﺭﻉ ﺃﻭ ﺍﻟﺘﺒﺎﻃﺊ ﺃﻭ ﺍﻟﺪﻭﺭﺍﻥ‬
‫ﲣﺺ‬ ‫ﺍﻟﱵ‬ ‫ﳝﻴﻨﹰﺎ ﺃﻭ ﻳﺴﺎﺭﹰﺍ ﺃﻭ ﺍﻟﺴﲑ ﺇﱃ ﺍﻷﻣﺎﻡ ﺃﻭ ﺇﱃ ﺍﳋﻠﻒ ﺃﻣﺜﻠﺔ ﻋﻦ ﺍﻟـ‬
‫ﺍﻟﺴﻴﺎﺭﺓ ﻣﺄﺧﻮﺫﺓ ﻛﻐﺮﺽ‪.‬‬
‫ﺩ( ﻋﻨﺪﻣﺎ ﻳﺄﺧﺬ ﳕﻂ ﺟﺪﻳﺪ ﻣﻦ ﺍﻟﺼﻔﻮﻑ ﺧﻮﺍﺻﻪ ﻭﺻﻔﺎﺗﻪ ﻣﻦ ﻋﺪﺓ ﺃﻧﻮﺍﻉ ﳐﺘﻠﻔﺔ ﻟﺼﻔﻮﻑ‬
‫‪.‬‬ ‫ﻣﻮﺟﻮﺩﺓ ﻣﺴﺒﻘﺎﹰ‪ ،‬ﻧﺴﻤﻲ ﻫﺬﻩ ﺍﻟﻌﻤﻠﻴﺔ ﺑﻌﻤﻠﻴﺔ ﺗﻮﺭﻳﺚ‬
‫‪.‬‬ ‫ﻫـ( ﺗﺘﺨﺎﻃﺐ ﺍﻷﻏﺮﺍﺽ ﻓﻴﻤﺎ ﺑﻴﻨﻬﺎ ﺑﻮﺍﺳﻄﺔ‬
‫ﻭ( ﺗﺘﺨﺎﻃﺐ ﺍﻷﻏﺮﺍﺽ ﻓﻴﻤﺎ ﺑﻴﻨﻬﺎ ﻣﻦ ﺧﻼﻝ ﻣُﻌﺮﻓﺔ ﺟﻴﺪﹰﺍ‪.‬‬
‫ﺯ( ﻻ ﻳُﺴﻤﺢ ﻋﺎﺩ ﹰﺓ ﻷﻱ ﻏﺮﺽ ﺃﻥ ﻳﻌﺮﻑ ﻛﻴﻒ ﰎ ﺑﻨﺎﺀ ﺍﻷﻏﺮﺍﺽ ﺍﻷﺧﺮﻯ‪ ،‬ﻧﺴﻤﻲ ﺍﳋﺎﺻﺔ‬
‫‪.‬‬ ‫ﺍﻟﺴﺎﺑﻘﺔ ﺧﺎﺻﺔ‬
‫ﺍﻟﻮﺍﺭﺩﺓ ﰲ ﻧﺼﻮﺹ ﺗﻮﺻﻴﻒ ﻧﻈﺎﻡ ﻣﺎ‪ ،‬ﺍﳌﱪﳎﲔ ﻟﻪ ﺑﻠﻐﺔ‬ ‫ﺡ( ﺗﺴﺎﻋﺪ‬
‫‪ C++‬ﻋﻠﻰ ﲢﺪﻳﺪ ﺍﻟﺼﻔﻮﻑ ﺍﻟﻼﺯﻣﺔ ﻟﺒﻨﺎﺀ ﻫﺬﺍ ﺍﻟﻨﻈﺎﻡ‪.‬‬
‫ﻭﻧﺴﻤﻲ ﺍﻟﺘﻮﺍﺑﻊ ﺍﻟﺪﺍﺧﻠﺔ ﰲ‬ ‫ﻁ( ﻧﺴﻤﻲ ﺍﳌﻌﻄﻴﺎﺕ ﺍﻟﺪﺍﺧﻠﺔ ﰲ ﺑﻨﺎﺀ ﺍﻟﺼﻒ ﺑـ‬
‫‪.‬‬ ‫ﺑﻨﺎﺀﻩ ﺃﻳﻀﹰﺎ ﺑـ‬
‫ﻧﺴﻤﻲ ﺍﻟﻨﺴﺨﺔ ﺍﳌﺄﺧﻮﺫﺓ ﻋﻦ ﺃﻱ ﳕﻂ ﻣﻌﺮﻑ ﻣﻦ ﻗﺒﻞ ﺍﳌﺴﺘﺨﺪﻡ ‪user-defined type‬‬ ‫ﻱ(‬
‫‪.‬‬ ‫ﺑـ‬

‫أﺝﻮﺑﺔ أﺳﺌﻠﺔ اﻟﻤﺮاﺝﻌﺔ اﻟﺬاﺗﻴﺔ‬


‫‪1-1‬‬

‫‪.Apple‬‬ ‫ﺃ(‬
‫‪٨٣‬‬ ‫‪ .1‬ﻣﻘﺪﻣﺔ ﺣﻮل اﻟﺤﻮاﺳﻴﺐ واﻟﺒﺮﻣﺠﺔ ﺑﻠﻐﺔ ‪C++‬‬

‫ﺏ( ﺣﺎﺳﺐ ‪ IBM‬ﺍﻟﺸﺨﺼﻲ‪.‬‬


‫ﺝ( ﺍﻟﱪﺍﻣﺞ‪.‬‬
‫ﺩ( ﻭﺣﺪﺓ ﺍﻟﺪﺧﻞ‪ ،‬ﻭﺣﺪﺓ ﺍﳋﺮﺝ‪ ،‬ﻭﺣﺪﺓ ﺍﻟﺬﺍﻛﺮﺓ‪ ،‬ﻭﺣﺪﺓ ﺍﳊﺴﺎﺏ ﻭﺍﳌﻨﻄﻖ‪ ،‬ﻭﺣﺪﺓ‬
‫ﺍﳌﻌﺎﳉﺔ ﺍﳌﺮﻛﺰﻳﺔ ﻭﻭﺣﺪﺓ ﺍﻟﺘﺨﺰﻳﻦ ﺍﻟﺜﺎﻧﻮﻳﺔ‪.‬‬
‫ﻫـ( ﻟﻐﺎﺕ ﺍﻵﻟﺔ‪ ،‬ﻟﻐﺎﺕ ﺍﺠﻤﻟﻤﻊ ﻭﻟﻐﺎﺕ ﻋﺎﻟﻴﺔ ﺍﳌﺴﺘﻮﻯ‪.‬‬
‫ﻭ( ﺍﳌﺘﺮﲨﺎﺕ‬
‫ﺯ( ‪.unix‬‬
‫ﺝ( ‪.Pascal‬‬
‫ﻁ( ﺗﻌﺪﺩ ﺍﳌﻬﺎﻡ ‪.multitasking‬‬
‫‪2-1‬‬

‫ﳏﺮﺭﺍﺕ ﺍﻟﻨﺼﻮﺹ ‪.editors‬‬ ‫ﺃ(‬


‫ﺏ( ﻣﺮﺣﻠﺔ ﻣﺎ ﻗﺒﻞ ﺍﳌﻌﺎﳉﺔ ﺃﻭ ﺍﻟﺘﺮﲨﺔ‪.‬‬
‫ﺝ( ﺍﻟﻮﺻﻞ ‪.linker‬‬
‫ﺩ( ﺍﻟﺸﺤﻦ ‪.loader‬‬
‫‪3-1‬‬

‫‪main‬‬ ‫ﺃ(‬
‫ﺏ( ﺍﻟﻘﻮﺱ ﺍﻟﻜﺒﲑ ﺍﻷﻳﺴﺮ ){( ﻭﺍﻟﻘﻮﺱ ﺍﻟﻜﺒﲑ ﺍﻷﳝﻦ )}(‪.‬‬
‫;‬ ‫ﺝ(‬
‫ﺩ( ﺳﻄﺮ ﺟﺪﻳﺪ ‪.newline‬‬
‫ﻫـ( ‪.if‬‬
‫‪4-1‬‬

‫ﺧﻄﺄ‪ .‬ﻻﺗﺴﺒﺐ ﺍﻟﺘﻌﻠﻴﻘﺎﺕ ﺍﻟﻘﻴﺎﻡ ﺑﺄﻱ ﻓﻌﻞ ﻋﻨﺪ ﺗﻨﻔﻴﺬ ﺍﻟﱪﻧﺎﻣﺞ ﻭﻟﻜﻦ ﻳﺘﻢ ﺍﺳﺘﺨﺪﺍﻣﻬﺎ‬ ‫ﺃ(‬
‫ﻣﻦ ﺃﺟﻞ ﺗﻮﺛﻴﻖ ﻋﻤﻞ ﺍﻟﱪﻧﺎﻣﺞ ﻭﺯﻳﺎﺩﺓ ﺍﻟﻘﺪﺭﺓ ﻋﻠﻰ ﻗﺮﺍﺀﺗﻪ‪.‬‬
‫ﺏ( ﺻﺢ‬
‫ﺝ( ﺻﺢ‬
‫ﺩ( ﺻﺢ‬
‫ﻫـ( ﺧﻄﺄ‪ .‬ﻷﻥ ﻟﻐﺔ ‪ C++‬ﻟﻐﺔ ﺣﺴﺎﺳﺔ ﳊﺎﻟﺔ ﺍﳊﺮﻭﻑ‪ ،‬ﻟﺬﻟﻚ ﻓﻬﻲ ﺗﻌﺘﱪ ﺍﳌﺘﺤﻮﻟﲔ‬
‫اﻟﻔﺼﻞ اﻷول‬ ٨٤

.‫ﺍﳌﺬﻛﻮﺭﻳﻦ ﻋﻠﻰ ﺃﻬﻧﻤﺎ ﻣﺘﺤﻮﻟﲔ ﳐﺘﻠﻔﲔ‬


‫ﺻﺢ‬ (‫ﻭ‬
‫ﺻﺢ‬ (‫ﺯ‬
‫ ﺗﺘﻤﺘﻊ ﺑﻨﻔﺲ ﻣﺴﺘﻮﻯ ﺍﻷﻭﻟﻮﻳﺔ ﰲ ﺣﲔ ﺗﺘﻤﺘﻊ ﺍﻟﻌﻤﻠﻴﺘﺎﻥ‬%‫ ﻭ‬/‫ ﻷﻥ ﺍﻟﻌﻤﻠﻴﺎﺕ * ﻭ‬.‫ﺧﻄﺄ‬ (‫ﺡ‬
.‫ ﲟﺴﺘﻮﻯ ﺃﻗﻞ ﻟﻸﻭﻟﻮﻳﺔ ﻣﻘﺎﺭﻧﺔ ﺑﺎﻟﻌﻤﻠﻴﺎﺕ ﺍﻟﺴﺎﺑﻘﺔ‬- ‫ ﻭ‬+
cout ‫ ﳝﻜﻦ ﺍﻟﻄﺒﺎﻋﺔ ﻋﻠﻰ ﻋﺪﺓ ﺃﺳﻄﺮ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺗﻌﻠﻴﻤﺔ ﺧﺮﺝ ﻭﺍﺣﺪﺓ ﺗﺘﻀﻤﻦ‬.‫ﺧﻄﺄ‬ (‫ﻁ‬
.\n ‫ﻭﻋﺪﺓ ﺳﻼﺳﻞ ﻫﺮﻭﺏ‬
5-1

int C, thisIsAvariable, q76354, number; (‫ﺃ‬


std::cout << "Enter an integer :"; (‫ﺏ‬
std::cin >> age; (‫ﺝ‬
if (number !=7) (‫ﺩ‬
std::cout << "the variable number is not equal to 7.\n";

std::cout << "this is a C++ program.(2.10)n" (‫ﻫـ‬


std::cout << "this is a C++ \n program.\n" (‫ﻭ‬
std::cout << "this \t is \t a\t C++ \t program.\n" (‫ﺯ‬
6-1

// calculate the product of three integers (‫ﺃ‬


int x, y, z, result; (‫ﺏ‬
cout << "Enter three integers:"; (‫ﺝ‬
cin >> x >> y >> z; (‫ﺩ‬
result = x * y * z; (‫ﻫـ‬
cout << "the product is " << result << '\n'; (‫ﻭ‬
return 0; (‫ﺯ‬

7-1
// calculate the product of three integers
# indude < io
‫‪٨٥‬‬ ‫‪ .1‬ﻣﻘﺪﻣﺔ ﺣﻮل اﻟﺤﻮاﺳﻴﺐ واﻟﺒﺮﻣﺠﺔ ﺑﻠﻐﺔ ‪C++‬‬

‫>‪stream‬‬
‫;‪using std::cout‬‬
‫;‪using std::cin‬‬
‫;‪using std::endl‬‬
‫) ( ‪main‬‬
‫{‬
‫;‪int x, y, z, result‬‬
‫;" ‪cout << "Enter three integers:‬‬
‫;‪cin >> x >> y >> z‬‬
‫;‪result = x * y * z‬‬
‫;'‪cout << "the product is" << result << '\n‬‬
‫;‪return 0‬‬
‫}‬

‫‪8-1‬‬

‫ﺍﳋﻄﺄ ‪ :‬ﻭﺿﻊ ﺍﻟﻔﺎﺻﻠﺔ ﺍﳌﻨﻘﻮﻃﺔ ; ﺑﻌﺪ ﺍﻟﻘﻮﺱ ﺍﻷﳝﻦ ﻟﻠﺸﺮﻁ ﺍﳌﺘﻌﻠﻖ ﺑﺘﻌﻠﻴﻤﺔ ‪.if‬‬ ‫‪i‬‬ ‫ﺃ(‬
‫ﺍﻟﺘﺼﺤﻴﺢ ‪ :‬ﺣﺬﻑ ﻫﺬﻩ ﺍﻟﻔﺎﺻﻠﺔ ﻣﻦ ﺑﻌﺪ ﺍﻟﻘﻮﺱ ﺍﳌﺬﻛﻮﺭ‪.‬‬ ‫‪i‬‬

‫ﻣﻼﺣﻈﺔ ‪ :‬ﻳﻨﺘﺞ ﻋﻦ ﻫﺬﺍ ﺍﳋﻄﺄ ﺃﻧﻪ ﺳﻮﻑ ﻳﺘﻢ ﺗﻨﻔﻴﺬ ﻋﻤﻠﻴﺔ ﺍﳋﺮﺝ ﺑﻐﺾ ﺍﻟﻨﻈﺮ‬ ‫‪i‬‬
‫ﻋﻦ ﺻﺤﺔ ﺃﻭ ﻋﺪﻡ ﺻﺤﺔ ﺍﻟﺸﺮﻁ ﺍﳌﺮﺍﻓﻖ ﻟﺘﻌﻠﻴﻤﺔ ﺍﻟـ ‪ .if‬ﻳﺪﻝ ﻭﺟﻮﺩ ﺍﻟﻔﺎﺻﻠﺔ‬
‫ﺍﳌﻨﻘﻮﻃﺔ ﺑﻌﺪ ﺍﻟﻘﻮﺱ ﺍﻷﳝﻦ ﻟﻠﺸﺮﻁ ﻋﻠﻰ ﻭﺟﻮﺩ ﻣﺎ ﻧﺴﻤﻴﻪ ﺑﺎﻟﺘﻌﻠﻴﻤﺔ ﺍﻟﻔﺎﺭﻏﺔ‬
‫ﻭﻫﻲ ﺍﻟﺘﻌﻠﻴﻤﺔ ﻻﺗﻘﻮﻡ ﺑﺄﻱ ﺷﻲﺀ ﻛﻤﺎ ﺳﻨﺮﻯ ﻻﺣﻘﹰﺎ‪.‬‬
‫ﺍﳋﻄﺄ ‪ :‬ﻋﻤﻠﻴﺔ ﺍﳌﻘﺎﺭﻧﺔ >= ﻣﻜﺘﻮﺑﺔ ﺑﺸﻜﻞ ﺧﺎﻃﺊ‪.‬‬ ‫‪i‬‬ ‫ﺏ(‬
‫ﺍﻟﺘﺼﺤﻴﺢ ‪ :‬ﳚﺐ ﺃﻥ ﺗﻜﺘﺐ ﻋﻠﻰ ﺍﻟﺸﻜﻞ ﺍﻟﺘﺎﱄ‪.>= :‬‬ ‫‪i‬‬

‫‪9-1‬‬

‫‪abstraction‬‬ ‫ﺍﻟﺘﺠﺮﻳﺪ‬ ‫ﺃ(‬


‫ﺻﻔﺔ ‪attribute‬‬ ‫ﺏ(‬
‫ﺍﻟﺘﺼﺮﻓﺎﺕ ‪behaviors‬‬ ‫ﺝ(‬
‫ﻣﺘﻌﺪﺩ ‪multiple‬‬ ‫ﺩ(‬
‫ﺍﻟﺮﺳﺎﺋﻞ ‪messages‬‬ ‫ﻫـ(‬
‫ﻭﺍﺟﻬﺎﺕ ‪interfaces‬‬ ‫ﻭ(‬
‫ﺇﺧﻔﺎﺀ ﺍﳌﻌﻠﻮﻣﺎﺕ ‪information hiding‬‬ ‫ﺯ(‬
‫ﺍﻷﲰﺎﺀ ‪nouns‬‬ ‫ﺡ(‬
‫ﺍﳌﻌﻄﻴﺎﺕ ﺍﻷﻋﻀﺎﺀ ‪ data members‬ﻭﺍﻟﺘﻮﺍﺑﻊ ﺍﻷﻋﻀﺎﺀ ‪.member functions‬‬ ‫ﻁ(‬
‫ﻏﺮﺽ‪.‬‬ ‫ﻱ(‬
‫اﻟﻔﺼﻞ اﻷول‬ ‫‪٨٦‬‬

‫ﺗﻤﺎریﻦ‬
‫ﺻﻒ ﺍﳌﻜﻮﻧﺎﺕ ﺍﻟﺘﺎﻟﻴﺔ ﻋﻠﻰ ﺃﻬﻧﺎ ﺗﻨﺘﻤﻲ ﺇﱃ ﺍﻟﺒﲎ ﺍﻟﺼﻠﺒﺔ ‪ Hardware‬ﺃﻡ ﺇﱃ ﺍﻟﺒﲎ ﺍﳌﺮﻧﺔ ‪:Software‬‬ ‫‪10-1‬‬

‫ﺏ( ﻣﺘﺮﺟﻢ ﻟﻐﺔ‬


‫‪C++‬‬ ‫ﺃ( ﻭﺣﺪﺓ ﺍﳌﻌﺎﳉﺔ ﺍﳌﺮﻛﺰﻳﺔ ‪.CPU‬‬
‫ﺩ( ﻣﺮﺣﻠﺔ ﻣﺎ ﻗﺒﻞ ﺍﻟﺘﺮﲨﺔ ﺍﳋﺎﺻﺔ ﺑـ ‪C++‬‬ ‫ﺝ( ﻭﺣﺪﺓ ﺍﳊﺴﺎﺏ ﻭﺍﳌﻨﻄﻖ ‪.ALU‬‬
‫ﻭ( ﺑﺮﻧﺎﻣﺞ ﳏﺮﺭ ﻧﺼﻮﺹ‪.‬‬ ‫ﻫـ( ﻭﺣﺪﺓ ﺍﻟﺪﺧﻞ‬
‫ﳌﺎﺫﺍ ﻧﺮﻏﺐ ﺑﻜﺘﺎﺑﺔ ﺑﺮﻧﺎﻣﺞ ﺑﻠﻐﺔ ﻣﺴﺘﻘﻠﺔ ﻋﻦ ﺍﻵﻟﺔ ‪ machine - independent -language‬ﺑﺪ ﹰﻻ‬ ‫‪11-1‬‬
‫ﻣﻦ ﻛﺘﺎﺑﺘﻪ ﺑﻠﻐﺔ ﳍﺎ ﻋﻼﻗﺔ ﺑﺎﻵﻟﺔ ﺍﳌﺴﺘﺨﺪﻣﺔ؟ ﻭﳌﺎﺫﺍ ﺗﻜﻮﻥ ﺍﻟﻠﻐﺎﺕ ﺍﳌﺮﺗﺒﻄﺔ ﺑﺂﻟﺔ ﻣﻌﻴﻨﺔ ﻣﻼﺋﻤﺔ‬
‫ﻟﻜﺘﺎﺑﺔ ﺑﻌﺾ ﺃﻧﻮﺍﻉ ﺍﻟﱪﺍﻣﺞ؟‬
‫ﺍﻣﻸ ﺍﻟﻔﺮﺍﻏﺎﺕ ﺍﻟﻮﺍﺭﺩﺓ ﰲ ﺍﻟﺘﻌﺎﺑﲑ ﺍﻟﺘﺎﻟﻴﺔ‪:‬‬ ‫‪12-1‬‬

‫ﻣﺎ ﻫﻮ ﺍﺳﻢ ﺍﻟﻮﺣﺪﺓ ﺍﳌﻨﻄﻘﻴﺔ ﺍﳌﻮﺟﻮﺩﺓ ﰲ ﺍﳊﺎﺳﺐ ﻭﺍﻟﱵ ﺗﺴﺘﻘﺒﻞ ﺍﳌﻌﻠﻮﻣﺎﺕ ﻣﻦ ﺍﳋﺎﺭﺝ‬ ‫ﺃ(‬
‫ﻟﻴﺘﻢ ﺍﺳﺘﺨﺪﺍﻣﻬﺎ ﺩﺍﺧﻞ ﺍﳊﺎﺳﺐ؟ ‪.‬‬
‫‪.‬‬ ‫ﺏ( ﺗﺴﻤﻰ ﻋﻤﻠﻴﺔ ﺍﻟﻄﻠﺐ ﻣﻦ ﺍﳊﺎﺳﺐ ﳊﻞ ﻣﺸﺎﻛﻞ ﳏﺪﺩﺓ ﺑﻌﻤﻠﻴﺔ ﺍﻟـ‬
‫ﺝ( ﺇﱃ ﺃﻱ ﻓﺌﺔ ﺗﻨﺘﻤﻲ ﻟﻐﺔ ﺍﳊﺎﺳﺐ ﺍﻟﱵ ﺗﺴﺘﺨﺪﻡ ﻣﺼﻄﻠﺤﺎﺕ ﻭﺍﺧﺘﺼﺎﺭﺍﺕ ﻗﺮﻳﺒﺔ ﻣﻦ ﺍﻟﻠﻐﺔ‬
‫‪.‬‬ ‫ﺍﻹﻧﻜﻠﻴﺰﻳﺔ ﻣﻦ ﺃﺟﻞ ﻛﺘﺎﺑﺔ ﺍﻟﺘﻌﻠﻴﻤﺎﺕ؟‬
‫ﺩ( ﻣﺎ ﻫﻮ ﺍﺳﻢ ﺍﻟﻮﺣﺪﺓ ﺍﳌﻨﻄﻘﻴﺔ ﺍﳌﻮﺟﻮﺩﺓ ﰲ ﺍﳊﺎﺳﺐ ﻭﺍﻟﱵ ﺗﻘﻮﻡ ﺑﺈﺭﺳﺎﻝ ﺍﳌﻌﻠﻮﻣﺎﺕ ﺍﻟﱵ‬
‫ﲤﺖ ﻣﻌﺎﳉﺘﻬﺎ ﺇﱃ ﻋﺪﺓ ﺃﺟﻬﺰﺓ ﲡﻌﻞ ﻣﻦ ﺍﳌﻤﻜﻦ ﺍﻻﺳﺘﻔﺎﺩﺓ ﻣﻦ ﻫﺬﻩ ﺍﳌﻌﻠﻮﻣﺎﺕ ﺧﺎﺭﺝ‬
‫‪.‬‬ ‫ﺍﳊﺎﺳﺐ؟‬
‫ﻫـ( ﻣﺎ ﻫﻮ ﺍﺳﻢ ﺍﻟﻮﺣﺪﺓ ﺍﳌﻨﻄﻘﻴﺔ ﺍﳌﻮﺟﻮﺩﺓ ﰲ ﺍﳊﺎﺳﺐ ﺍﻟﱵ ﺗﻘﻮﻡ ﺑﺘﺨﺰﻳﻦ ﺍﳌﻌﻠﻮﻣﺎﺕ؟ ‪.‬‬
‫‪.‬‬ ‫ﻭ( ﻣﺎ ﻫﻮ ﺍﺳﻢ ﺍﻟﻮﺣﺪﺓ ﺍﳌﻨﻄﻘﻴﺔ ﺍﳌﻮﺟﻮﺩﺓ ﰲ ﺍﳊﺎﺳﺐ ﺍﻟﱵ ﺗﻘﻮﻡ ﺑﺎﳊﺴﺎﺑﺎﺕ؟‬
‫ﺯ( ﻣﺎ ﻫﻮ ﺍﺳﻢ ﺍﻟﻮﺣﺪﺓ ﺍﳌﻨﻄﻘﻴﺔ ﺍﳌﻮﺟﻮﺩﺓ ﰲ ﺍﳊﺎﺳﺐ ﺍﻟﱵ ﺗﻘﻮﻡ ﺑﺎﲣﺎﺫ ﻗﺮﺍﺭﺍﺕ‬
‫‪.‬‬ ‫ﻣﻨﻄﻘﻴﺔ؟‬
‫ﻫﻲ ﺃﻛﺜﺮ ﺍﻟﻠﻐﺎﺕ ﻣﻼﺋﻤﺔ ﻟﻠﻤﱪﻣﺞ‬ ‫ﺡ( ﺗﻌﺘﱪ ﺍﻟﻠﻐﺎﺕ ﺍﻟﱵ ﺗﻨﺘﻤﻲ ﺇﱃ ﻓﺌﺔ ﺍﻟﻠﻐﺎﺕ‬
‫ﺣﱴ ﻳﺴﺘﻄﻴﻊ ﻛﺘﺎﺑﺔ ﺑﺮﺍﳎﻪ ﺑﺴﺮﻋﺔ ﻭﻳﺴﺮ‪.‬‬
‫ﺍﳋﺎﺻﺔ ﺑﻪ‪.‬‬ ‫ﻁ( ﺗﺴﻤﻰ ﺍﻟﻠﻐﺔ ﺍﻟﱵ ﻳﺴﺘﻄﻴﻊ ﺍﳊﺎﺳﺐ ﻓﻬﻤﻬﺎ ﻣﺒﺎﺷﺮﺓ ﺑـ‬
‫ﻱ( ﻣﺎ ﻫﻮ ﺍﺳﻢ ﺍﻟﻮﺣﺪﺓ ﺍﳌﻨﻄﻘﻴﺔ ﺍﳌﻮﺟﻮﺩﺓ ﰲ ﺍﳊﺎﺳﺐ ﻭﺍﻟﱵ ﺗﻘﻮﻡ ﲟﻬﻤﺔ ﺍﻟﺘﺤﻜﻢ ﻭﺍﻟﺘﻮﺍﻓﻘﻴﺔ‬
‫‪.‬‬ ‫ﺑﲔ ﳐﺘﻠﻒ ﺍﻟﻮﺣﺪﺍﺕ ﺍﻷﺧﺮﻯ؟‬
‫‪٨٧‬‬ ‫‪ .1‬ﻣﻘﺪﻣﺔ ﺣﻮل اﻟﺤﻮاﺳﻴﺐ واﻟﺒﺮﻣﺠﺔ ﺑﻠﻐﺔ ‪C++‬‬

‫ﺑﲔ ﻣﻌﲎ ﺍﻷﻏﺮﺍﺽ ﺍﻟﺘﺎﻟﻴﺔ‪:‬‬ ‫‪13-1‬‬

‫‪std::cin‬‬ ‫ﺃ(‬
‫‪std::cout‬‬ ‫ﺏ(‬
‫‪.std::cerr‬‬ ‫ﺝ(‬

‫ﳌﺎﺫﺍ ﻳﻨﺼﺐ ﺣﺎﻟﻴﹰﺎ ﺍﻻﻫﺘﻤﺎﻡ ﺍﻷﻛﱪ ﺣﻮﻝ ﺃﺳﻠﻮﺏ ﺍﻟﱪﳎﺔ ﻏﺮﺿﻴﺔ ﺍﻟﺘﻮﺟﻪ ﻋﺎﻣ ﹰﺔ ﻭﺣﻮﻝ ﺍﻟﱪﳎﺔ‬ ‫‪14-1‬‬
‫ﺑﻠﻐﺔ ‪ C++‬ﺧﺎﺻ ﹰﺔ ؟‬

‫ﺍﻟﺘﺎﻟﻴﺔ‪-:‬‬ ‫ﺍﻣﻸ ﺍﻟﻔﺮﺍﻏﺎﺕ ﺍﻟﻮﺍﺭﺩﺓ ﰲ ﺍﳉﻤﻞ‬ ‫‪15-1‬‬

‫ﺿﻤﻦ ﻧﺺ ﺍﻟﱪﻧﺎﻣﺞ ﻣﻦ ﺃﺟﻞ ﺗﻮﺛﻴﻖ ﻋﻤﻠﻪ ﻭﲢﺴﲔ ﺍﻟﻘﺪﺭﺓ‬ ‫ﻳﺘﻢ ﺍﺳﺘﺨﺪﺍﻡ‬ ‫ﺃ(‬
‫ﻋﻠﻰ ﻗﺮﺍﺀﺗﻪ‪.‬‬
‫ﻣﻦ ﺃﺟﻞ ﻃﺒﺎﻋﺔ ﺍﳌﻌﻠﻮﻣﺎﺕ ﻋﻠﻰ ﺍﻟﺸﺎﺷﺔ‪.‬‬ ‫ﺏ( ﻧﺴﺘﺨﺪﻡ ﺍﻟﻐﺮﺽ‬
‫ﻫﻲ ﺗﻌﻠﻴﻤﺔ ‪ C++‬ﺍﻟﱵ ﺗﺴﺎﻋﺪ ﻋﻠﻰ ﺍﲣﺎﺫ ﺍﻟﻘﺮﺍﺭﺍﺕ‪.‬‬ ‫ﺝ( ﺗﻌﺘﱪ ﺗﻌﻠﻴﻤﺔ‬
‫‪.‬‬ ‫ﻫـ( ﺗﺘﻢ ﺍﳊﺴﺎﺑﺎﺕ ﻋﺎﺩﺓ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺗﻌﻠﻴﻤﺎﺕ‬
‫ﺑﺈﺩﺧﺎﻝ ﺍﳌﻌﻄﻴﺎﺕ ﻣﻦ ﻟﻮﺣﺔ ﺍﳌﻔﺎﺗﻴﺢ ﺇﱃ ﺍﳊﺎﺳﺐ‪.‬‬ ‫ﻭ( ﻳﻘﻮﻡ ﺍﻟﻐﺮﺽ‬
‫ﺍﻛﺘﺐ ﺗﻌﻠﻴﻤﺔ ‪ C++‬ﻭﺍﺣﺪﺓ )ﺃﻭ ﺳﻄﺮ ﻭﺍﺣﺪﹰﺍ( ﻟﻠﻘﻴﺎﻡ ﺑﺎﻷﻋﻤﺎﻝ ﺍﻟﺘﺎﻟﻴﺔ‪:‬‬ ‫‪16-1‬‬

‫ﺃﻃﺒﻊ ﺍﻟﺮﺳﺎﻟﺔ "‪."Enter two numbers‬‬ ‫ﺃ(‬


‫ﺏ( ﺃﺳﻨﺪ ﻗﻴﻤﺔ ﺟﺪﺍﺀ ﺍﳌﺘﺤﻮﻟﲔ ‪ b‬ﻭ‪ c‬ﺇﱃ ﺍﳌﺘﺤﻮﻝ ‪.a‬‬
‫ﺝ( ﻭﺛﻖ ﺃﻥ ﺍﻟﱪﻧﺎﻣﺞ ﻳﻘﻮﻡ ﲝﺴﺎﺏ ﺑﺴﻴﻂ ﻣﻦ ﺣﺴﺎﺑﺎﺕ ﺍﻟﺮﻭﺍﺗﺐ‪.‬‬
‫ﺩ( ﺃﺩﺧﻞ ﺛﻼﺛﺔ ﻗﻴﻢ ﺻﺤﻴﺤﺔ ﺑﻮﺍﺳﻄﺔ ﻟﻮﺣﺔ ﺍﳌﻔﺎﺗﻴﺢ ﻭﺧﺰﻬﻧﺎ ﰲ ﺍﳌﺘﺤﻮﻻﺕ ﺍﻟﺼﺤﻴﺤﺔ‬
‫‪.a, b, c‬‬

‫ﻱ ﻣﻦ ﺍﳉﻤﻞ ﺍﻟﺘﺎﻟﻴﺔ ﺻﺤﻴﺢ ﻭﺃﻳﱡﻬﺎ ﺧﻄﺄ‪ .‬ﺃﺷﺮﺡ ﺟﻮﺍﺑﻚ‪:‬‬ ‫ﺑﲔ ﺃ ﱡ‬ ‫‪17-1‬‬

‫ﺗﺘﻢ ﻋﻤﻠﻴﺔ ﺗﻘﻴﻴﻢ ﺍﻟﻌﻤﻠﻴﺎﺕ ﰲ ﻟﻐﺔ ‪ C++‬ﻣﻦ ﺍﻟﻴﺴﺎﺭ ﺇﱃ ﺍﻟﻴﻤﲔ‪.‬‬ ‫ﺃ(‬


‫ﺍﻷﲰﺎﺀ ﺍﻟﺘﺎﻟﻴﺔ ﻫﻲ ﺗﺴﻤﻴﺎﺕ ﺻﺤﻴﺤﺔ ﳌﺘﺤﻮﻻﺕ‪z2, z, c, b, a, his_account_total, :‬‬ ‫ﺏ(‬
‫_‪.her_sales, j7, t5, m928134, _under_bar‬‬
‫ﺝ( ﺗﻌﺘﱪ ﺍﻟﺘﻌﻠﻤﻴﺔ ;";‪ cout << "a=5‬ﻣﺜﺎ ﹰﻻ ﳕﻮﺫﺟﻴﹰﺎ ﻻﺳﺘﺨﺪﺍﻡ ﺗﻌﻠﻴﻤﺔ ﺍﻻﺳﻨﺎﺩ‪.‬‬
‫ﺩ( ﻳﺘﻢ ﺗﻘﻴﻴﻢ ﺃﻱ ﻋﺒﺎﺭﺓ ﺣﺴﺎﺑﻴﺔ ﺻﺤﻴﺤﺔ ﻣﻜﺘﻮﺑﺔ ﺑﻠﻐﺔ ‪ C++‬ﺑﺪﻭﻥ ﺃﻗﻮﺍﺱ ﻣﻦ ﺍﻟﻴﺴﺎﺭ ﺇﱃ‬
‫ﺍﻟﻴﻤﲔ‪.‬‬
‫اﻟﻔﺼﻞ اﻷول‬ ‫‪٨٨‬‬

‫ﻫـ( ﺍﻻﲰﺎﺀ ﺍﻟﺘﺎﻟﻴﺔ ﻫﻲ ﺃﲰﺎﺀ ﻏﲑ ﺻﺤﻴﺤﺔ ﳌﺘﺤﻮﻻﺕ‪.2h, h22, 67h2, 87, 3g:‬‬

‫ﺇﻣﻸ ﺍﻟﻔﺮﺍﻏﺎﺕ ﺍﻟﻮﺍﺭﺩﺓ ﰲ ﺍﳉﻤﻞ ﺍﻟﺘﺎﻟﻴﺔ‪:‬‬ ‫‪18-1‬‬

‫ﻣﺎ ﻫﻲ ﺍﻟﻌﻤﻠﻴﺎﺕ ﺍﳊﺴﺎﺑﻴﺔ ﺍﻟﱵ ﳍﺎ ﻧﻔﺲ ﻣﺴﺘﻮﻯ ﺍﻷﻭﻟﻮﻳﺔ ﺍﳌﻤﺎﺛﻞ ﻟﻌﻤﻠﻴﺔ ﺍﻟﻀﺮﺏ؟ ‪.‬‬ ‫ﺍ(‬
‫ﺏ( ﻋﻨﺪﻣﺎ ﻳﻜﻮﻥ ﻟﺪﻳﻨﺎ ﺃﻗﻮﺍﺱ ﻣﺘﺪﺍﺧﻠﺔ ﰲ ﻋﺒﺎﺭﺓ ﺣﺴﺎﺑﻴﺔ ﻣﺎ‪ ،‬ﺍﻧﻄﻼﻗﹰﺎ ﻣﻦ ﺃﻳﺔ ﳎﻤﻮﻋﺔ‬
‫‪.‬‬ ‫ﻟﻸﻗﻮﺍﺱ ﻳﺒﺪﺃ ﺗﻘﻴﻴﻢ ﺍﻟﻌﺒﺎﺭﺓ؟‬
‫ﺝ( ﻧﺴﻤﻲ ﺍﳌﻮﺿﻊ ﰲ ﺫﺍﻛﺮﺓ ﺍﳊﺎﺳﺐ ﺍﻟﺬﻱ ﳝﻜﻦ ﺃﻥ ﳛﺘﻮﻱ ﻋﻠﻰ ﻗﻴﻢ ﳐﺘﻠﻔﺔ ﺧﻼﻝ‬
‫‪.‬‬ ‫ﳊﻈﺎﺕ ﺗﻨﻔﻴﺬ ﺍﻟﱪﻧﺎﻣﺞ ﺍﳌﺨﺘﻠﻔﺔ ﺑـ‬

‫ﻣﺎ ﺍﻟﺬﻱ ﻳﺘﻢ ﻃﺒﺎﻋﺘﻪ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺍﻟﺘﻌﻠﻴﻤﺎﺕ ﺍﻟﺘﺎﻟﻴﺔ ﺍﳌﻜﺘﻮﺑﺔ ﺑﻠﻐﺔ ‪C++‬؟ ﺇﺫﺍ ﻛﺎﻧﺖ ﺍﻟﺘﻌﻠﻴﻤﺔ‬ ‫‪19-1‬‬
‫ﻻﺗﻘﻮﻡ ﺑﺄﻳﺔ ﻃﺒﺎﻋﺔ ﺃﺟﺐ ﺑﻜﻠﻤﺔ "ﻻﺷﻴﺊ" ﻣﻊ ﺍﻻﻓﺘﺮﺍﺽ ﺃﻥ ‪ x=2 :‬ﻭ ‪.y=3‬‬
‫;‪cout << x‬‬ ‫ﺃ(‬
‫;‪cout << x+x‬‬ ‫ﺏ(‬
‫;"=‪cout << "x‬‬ ‫ﺝ(‬
‫;‪cout << "x=" << x‬‬ ‫ﺩ(‬
‫;‪cout << x+y << "=" << y+x‬‬ ‫ﻫـ(‬
‫;‪z=x+y‬‬ ‫ﻭ(‬
‫;‪cin >> x >> y‬‬ ‫ﺯ(‬
‫;‪//cout << "x+y=" << x+y‬‬ ‫ﺡ(‬
‫;"‪cout << "\n‬‬ ‫ﻁ(‬

‫ﺃﻱ ﻣﻦ ﺍﻟﺘﻌﻠﻴﻤﺎﺕ ﺍﻟﺘﺎﻟﻴﺔ ﲢﺘﻮﻱ ﻋﻠﻰ ﻣﺘﺤﻮﻻﺕ ﻳﺘﻢ ﺗﺪﻣﲑ ﳏﺘﻮﺍﻫﺎ ﲟﻮﺟﺐ ﻫﺬﻩ ﺍﻟﺘﻌﻠﻴﻤﺎﺕ‪:‬‬ ‫‪20-1‬‬

‫;‪cin >> b >> c >> d >> e >> f‬‬ ‫ﺃ(‬


‫;‪p= i+j+k+7‬‬ ‫ﺏ(‬
‫;"‪cout << "variables whose values are destroyed‬‬ ‫ﺝ(‬
‫;"‪cout << "a=5‬‬ ‫ﺩ(‬

‫ﺗﻌﱪ ﻋﻦ‬ ‫‪C++‬‬ ‫ﺇﺫﺍ ﻛﺎﻥ ﻟﺪﻳﻨﺎ ﺍﳌﻌﺎﺩﻟﺔ ‪ ،y=ax3+7‬ﻓﺄﻱ ﻣﻦ ﺍﻟﻌﺒﺎﺭﺍﺕ ﺍﻟﺘﺎﻟﻴﺔ ﺍﳌﻜﺘﻮﺑﺔ ﺑﻠﻐﺔ‬ ‫‪21-1‬‬
‫ﺍﳌﻌﺎﺩﻟﺔ ﺍﻟﺴﺎﺑﻘﺔ‪:‬‬
‫‪٨٩‬‬ ‫‪ .1‬ﻣﻘﺪﻣﺔ ﺣﻮل اﻟﺤﻮاﺳﻴﺐ واﻟﺒﺮﻣﺠﺔ ﺑﻠﻐﺔ ‪C++‬‬

‫;‪y=a*x*x*x+7‬‬ ‫ﺃ(‬
‫;)‪y=a*x*x*(x+7‬‬ ‫ﺏ(‬
‫;)‪y=(a*x)*x*(x+7‬‬ ‫ﺝ(‬
‫;‪y=(a*x)*x*x+7‬‬ ‫ﺩ(‬
‫;‪y=a*(x*x*x)+7‬‬ ‫ﻫـ(‬
‫;)‪y=a*x*(x*x+7‬‬ ‫ﻭ(‬

‫ﺃﻛﺘﺐ ﺑﺮﻧﺎﳎﹰﺎ ﻳﻘﻮﻡ ﺑﺎﻟﻄﻠﺐ ﻣﻦ ﺍﳌﺴﺘﺨﺪﻡ ﺇﺩﺧﺎﻝ ﻋﺪﺩﻳﻦ ﰒ ﻗﻢ ﺑﺄﺧﺬ ﻫﺬﻳﻦ ﺍﻟﻌﺪﺩﻳﻦ ﻟﻴﻄﺒﻊ‬ ‫‪22-1‬‬
‫ﳎﻤﻮﻋﻬﻤﺎ ﻭﺟﺪﺍﺀﳘﺎ ﻭﻓﺮﻗﻬﻤﺎ ﻭﻧﺎﺗﺞ ﻗﺴﻤﺘﻬﻤﺎ‪.‬‬

‫ﺑﲔ ﺗﺮﺗﻴﺐ ﺗﻘﻴﻴﻢ ﺍﻟﻌﻤﻠﻴﺎﺕ ﺍﻟﻮﺍﺭﺩﺓ ﰲ ﻛﻞ ﻣﻦ ﺍﻟﺘﻌﻠﻴﻤﺎﺕ ﺍﻟﺘﺎﻟﻴﺔ ﺍﳌﻜﺘﻮﺑﺔ ﺑﻠﻐﺔ ‪ .C++‬ﻭﻭﺿﺢ‬ ‫‪23-1‬‬
‫ﻗﻴﻤﺔ ‪ x‬ﰲ ﻬﻧﺎﻳﺔ ﺗﻨﻔﻴﺬ ﻛﻞ ﻣﻨﻬﻤﺎ‪.‬‬
‫;‪x=7+3*6/2-1‬‬ ‫ﺃ(‬
‫;‪x=2%2+2*2-2/2‬‬ ‫ﺏ(‬
‫;))))‪x=(3*9*(3+(9*3/(3‬‬ ‫ﺝ(‬
‫ﺃﻛﺘﺐ ﺑﺮﻧﺎﳎﹰﺎ ﻳﻘﻮﻡ ﺑﻄﺒﺎﻋﺔ ﺍﻷﻋﺪﺍﺩ ﻣﻦ ‪ 1‬ﺇﱃ ‪ 4‬ﻋﻠﻰ ﻧﻔﺲ ﺍﻟﺴﻄﺮ ﻋﻠﻰ ﺃﻥ ﻳﻔﺼﻞ ﺑﲔ ﻛﻞ‬ ‫‪24-1‬‬
‫ﺭﻗﻤﲔ ﻣﺘﺠﺎﻭﺭﻳﻦ ﻓﺮﺍﻍ ﻭﺍﺣﺪ ﻓﻘﻂ‪ .‬ﺃﺳﺘﺨﺪﻡ ﻟﻜﺘﺎﺑﺔ ﺍﻟﱪﻧﺎﻣﺞ ﺍﻷﺳﺎﻟﻴﺐ ﺍﻟﺘﺎﻟﻴﺔ‪:‬‬
‫ﺍﺳﺘﺨﺪﻡ ﺗﻌﻠﻴﻤﺔ ﺧﺮﺝ ﻭﺍﺣﺪﺓ ﻣﻊ ﻋﻤﻠﻴﺔ ﳎﺮﻯ ﺇﺩﺧﺎﻝ ﻭﺍﺣﺪﺓ‪.‬‬ ‫ﺃ(‬
‫ﺏ( ﺍﺳﺘﺨﺪﻡ ﺗﻌﻠﻴﻤﺔ ﺧﺮﺝ ﻭﺍﺣﺪﺓ ﻣﻊ ﺃﺭﺑﻌﺔ ﻋﻤﻠﻴﺎﺕ ﳎﺮﻯ ﺇﺩﺧﺎﻝ‪.‬‬
‫ﺝ( ﺍﺳﺘﺨﺪﻡ ﺃﺭﺑﻌﺔ ﺗﻌﻠﻴﻤﺎﺕ ﺧﺮﺝ‪.‬‬

‫ﺃﻛﺘﺐ ﺑﺮﻧﺎﳎﹰﺎ ﻳﻄﻠﺐ ﻣﻦ ﺍﳌﺴﺘﺨﺪﻡ ﺇﺩﺧﺎﻝ ﻋﺪﺩﻳﻦ ﺻﺤﻴﺤﲔ‪ .‬ﰒ ﻳﺄﺧﺬ ﻫﺬﻳﻦ ﺍﻟﻌﺪﺩﻳﻦ ﻟﻴﻄﺒﻊ‬ ‫‪25-1‬‬
‫ﺍﻟﻌﺪﺩ ﺍﻷﻛﱪ ﺑﻴﻨﻬﻤﺎ ﻣﺘﺒﻮﻋﹰﺎ ﺑﺎﻟﺮﺳﺎﻟﺔ ”‪ .“is larger.‬ﺇﺫﺍ ﻛﺎﻥ ﺍﻟﻌﺪﺩﺍﻥ ﻣﺘﺴﺎﻭﻳﲔ‪ ،‬ﻋﻨﺪﻫﺎ ﻳﻄﺒﻊ‬
‫ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺮﺳﺎﻟﺔ ”‪.“there numbers are equal‬‬
‫ﺃﻛﺘﺐ ﺑﺮﻧﺎﳎﹰﺎ ﻳﺄﺧﺬ ﻛﺪﺧﻞ ﺛﻼﺙ ﺃﻋﺪﺍﺩ ﺻﺤﻴﺤﺔ ﻣﻦ ﻟﻮﺣﺔ ﺍﳌﻔﺎﺗﻴﺢ ﰒ ﻳﻄﺒﻊ ﳎﻤﻮﻋﻬﻤﺎ‬ ‫‪26-1‬‬
‫ﻭﻣﺘﻮﺳﻄﻬﺎ ﻭﻧﺎﺗﺞ ﺟﺪﺍﺀﻫﺎ ﻭﻗﻴﻤﺔ ﺃﺻﻐﺮ ﻋﺪﺩ ﻭﻗﻴﻤﺔ ﺃﻛﱪ ﻋﺪﺩ ﻣﻦ ﺑﻴﻨﻬﺎ‪ .‬ﳚﺐ ﺃﻥ ﳓﺼﻞ ﰲ‬
‫ﺍﳋﺮﺝ ﻋﻠﻰ ﺍﻟﺸﺎﺷﺔ ﺍﻟﺘﺎﻟﻴﺔ‪:‬‬
‫‪Input three different integers: 13 27 14‬‬
‫‪Sum is 54‬‬
‫‪Average is 18‬‬
‫‪Product is 4914‬‬
‫اﻟﻔﺼﻞ اﻷول‬ ‫‪٩٠‬‬

‫‪Smallest is 13‬‬
‫‪Largest is 27‬‬

‫ﺃﻛﺘﺐ ﺑﺮﻧﺎﳎﹰﺎ ﻳﻘﺮﺃ ﻧﺼﻒ ﻗﻄﺮ ﺩﺍﺋﺮﺓ ﰒ ﻳﻄﺒﻊ ﻗﻴﻤﺔ ﻗﻄﺮ ﺍﻟﺪﺍﺋﺮﺓ‪ ،‬ﳏﻴﻄﻬﺎ ﻭﻣﺴﺎﺣﺘﻬﺎ‪ .‬ﺍﺳﺘﺨﺪﺍﻡ‬ ‫‪27-1‬‬
‫ﺍﻟﻘﻴﻤﺔ ‪ 3.14159‬ﻛﻘﻴﻤﺔ ﻟـ ‪ .π‬ﻗﻢ ﻬﺑﺬﻩ ﺍﳊﺴﺎﺑﺎﺕ ﺿﻤﻦ ﺗﻌﻠﻴﻤﺎﺕ ﺍﳋﺮﺝ‪.‬‬
‫)ﻣﻼﺣﻈﺔ‪ :‬ﻗﻤﻨﺎ ﻓﻲ هﺬا اﻟﻔﺼﻞ ﺑﻤﻨﺎﻗﺸﺔ اﻟﻤﺘﺤﻮﻻت واﻟﺜﻮاﺑﺖ ذات اﻟﻘﻴﻤﺔ اﻟﺼﺤﻴﺤﺔ‪.‬‬
‫وﺳﻮف ﻧﺘﻌﺮض ﻓﻲ اﻟﻔﺼﻞ ﻟﻤﻨﺎﻗﺸﺔ اﻷﻋﺪاد ذات اﻟﻔﺎﺹﻠﺔ اﻟﻌﺎﺋﻤﺔ ‪floating point‬‬
‫‪ numbers‬أي اﻟﻘﻴﻢ اﻟﺘﻲ ﻟﻬﺎ ﺝﺰء ﻋﺸﺮي(‪.‬‬

‫ﺃﻛﺘﺐ ﺑﺮﻧﺎﳎﹰﺎ ﻳﻘﻮﻡ ﺑﻄﺒﺎﻋﺔ ﻣﺴﺘﻄﻴﻞ‪ ،‬ﻭﺷﻜﻞ ﺑﻴﻀﻮﻱ ﻭﺳﻬﻢ ﻭﻣﻌﲔ ﻋﻠﻰ ﺍﻟﺸﻜﻞ ﺍﻟﺘﺎﱄ‪:‬‬ ‫‪28-1‬‬

‫**********‬ ‫***‬ ‫*‬ ‫*‬


‫*‬ ‫*‬ ‫*‬ ‫*‬ ‫***‬ ‫* *‬
‫*‬ ‫*‬ ‫*‬ ‫*‬ ‫*****‬ ‫*‬ ‫*‬
‫*‬ ‫*‬ ‫*‬ ‫*‬ ‫*‬ ‫*‬ ‫*‬
‫*‬ ‫*‬ ‫*‬ ‫*‬ ‫*‬ ‫*‬ ‫*‬
‫*‬ ‫*‬ ‫*‬ ‫*‬ ‫*‬ ‫*‬ ‫*‬
‫*‬ ‫*‬ ‫*‬ ‫*‬ ‫*‬ ‫*‬ ‫*‬
‫*‬ ‫*‬ ‫*‬ ‫*‬ ‫*‬ ‫* *‬
‫*‬ ‫*‬ ‫*‬ ‫*‬ ‫*‬ ‫*‬
‫**********‬ ‫**‬ ‫*‬

‫ﻣﺎﺫﺍ ﺗﻄﺒﻊ ﺍﻟﺘﻌﻠﻤﻴﺔ ﺍﻟﺘﺎﻟﻴﺔ‪:‬‬ ‫‪29-1‬‬


‫;"‪cout << "*\n**\n***\n****\n*****\n‬‬

‫ﺃﻛﺘﺐ ﺑﺮﻧﺎﳎﹰﺎ ﻳﻘﺮﺃ ﲬﺴﺔ ﺃﻋﺪﺍﺩ ﺻﺤﻴﺤﺔ ﰒ ﳛﺪﺩ ﻭﻳﻄﺒﻊ ﺃﻛﱪﻫﺎ ﻭﺃﺻﻐﺮﻫﺎ‪ .‬ﺍﺳﺘﺨﺪﺍﻡ ﻓﻘﻂ‬ ‫‪30-1‬‬
‫ﺍﻷﺳﺎﻟﻴﺐ ﺍﻟﱵ ﺗﻌﻠﻤﺘﻬﺎ ﰲ ﻫﺬﺍ ﺍﻟﻔﺼﻞ‪.‬‬
‫ﺃﻛﺘﺐ ﺑﺮﻧﺎﳎﹰﺎ ﻳﻘﺮﺃ ﻋﺪﺩﹰﺍ ﺻﺤﻴﺤﹰﺎ ﰒ ﳛﺪﺩ ﻭﻳﻄﺒﻊ ﻓﻴﻤﺎ ﺇﺫﺍ ﻛﺎﻥ ﻫﺬﺍ ﺍﻟﻌﺪﺩ ﺯﻭﺟﻴﹰﺎ ﺃﻡ ﻓﺮﺩﻳﹰﺎ‪.‬‬ ‫‪31-1‬‬

‫)ﺗﻮﺝﻴﻪ‪ :‬اﺳﺘﺨﺪام ﻋﻤﻠﻴﺔ ﺑﺎﻗﻲ اﻟﻘﺴﻤﺔ اﻟﺼﺤﻴﺤﺔ‪ .‬ﻧﻘﻮل ﻋﻦ ﻋﺪد ﻣﺎ أﻧﻪ زوﺝﻲ إذا‬
‫آﺎن ﻣﻦ ﻣﻀﺎﻋﻔﺎت اﻟﻌﺪد ‪ .2‬وﺑﺎﻗﻲ ﻗﺴﻤﺔ أي ﻋﺪد ﻣﻦ ﻣﻀﺎﻋﻔﺎت اﻟﻌﺪد ‪ 2‬ﻋﻠﻰ اﻟﻌﺪد ‪2‬‬
‫هﻮ ﺹﻔﺮ(‪.‬‬

‫ﺃﻛﺘﺐ ﺑﺮﻧﺎﳎﹰﺎ ﻳﻘﺮﺃ ﻋﺪﺩﻳﻦ ﺻﺤﻴﺤﲔ ﰒ ﳛﺪﺩ ﻭﻳﻄﺒﻊ ﻓﻴﻤﺎ ﺇﺫﺍ ﻛﺎﻥ ﺍﻷﻭﻝ ﻣﻦ ﻣﻀﺎﻋﻔﺎﺕ ﺍﻟﺜﺎﱐ‪.‬‬ ‫‪32-1‬‬

‫)ﺗﻮﺝﻴﻪ‪ :‬اﺳﺘﺨﺪم ﻋﻤﻠﻴﺔ ﺑﺎﻗﻲ اﻟﻘﺴﻤﺔ اﻟﺼﺤﻴﺤﺔ(‪.‬‬

‫ﺃﻇﻬﺮ ﺭﻗﻌﺔ ﺍﻟﺪﺍﻣﺎ ﺍﳌﺒﻴﻨﺔ ﰲ ﺍﻟﺸﻜﻞ ﻭﺫﻟﻚ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺗﺴﻌﺔ ﺗﻌﻠﻴﻤﺎﺕ ﻟﻠﺨﺮﺝ‪ ،‬ﰒ ﺣﺎﻭﻝ ﺇﻇﻬﺎﺭ‬ ‫‪33-1‬‬
‫ﻧﻔﺲ ﺍﻟﺸﻜﻞ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺃﻗﻞ ﻋﺪﺩ ﳑﻜﻦ ﻣﻦ ﺗﻌﻠﻴﻤﺎﺕ ﺍﳋﺮﺝ‪.‬‬
‫‪٩١‬‬ ‫‪ .1‬ﻣﻘﺪﻣﺔ ﺣﻮل اﻟﺤﻮاﺳﻴﺐ واﻟﺒﺮﻣﺠﺔ ﺑﻠﻐﺔ ‪C++‬‬

‫**************‬
‫**************‬
‫**************‬
‫**************‬
‫**************‬
‫**************‬
‫**************‬
‫**************‬

‫ﻣﺎ ﻫﻮ ﺍﻟﻔﺮﻕ ﺑﲔ ﺧﻄﺄ ﻓﺎﺩﺡ ‪ fatal error‬ﻭﺧﻄﺄ ﻏﲑ ﻓﺎﺩﺡ؟ ﻭﳌﺎﺫﺍ ﻳﻔﻀﻞ ﺍﳌﱪﻣﺞ ﺍﻟﺘﻌﺎﻣﻞ ﻣﻊ‬ ‫‪34-1‬‬
‫ﺍﻷﺧﻄﺎﺀ ﺍﻟﻔﺎﺩﺣﺔ ﻋﻠﻰ ﻏﲑﻫﺎ ﻣﻦ ﺍﻷﺧﻄﺎﺀ؟‬
‫ﻟﻨﺤﺎﻭﻝ ﺍﺧﺘﻼﺱ ﺍﻟﻨﻈﺮ ﻗﺪﻣﹰﺎ ﺣﻮﻝ ﺍﳌﻮﺍﺿﻴﻊ ﺍﻟﱵ ﺳﻮﻑ ﻧﻌﺎﳉﻬﺎ ﻓﻴﻤﺎ ﺑﻌﺪ‪ .‬ﻟﻘﺪ ﺗﻌﻠﻤﺖ ﰲ ﻫﺬﺍ‬ ‫‪35-1‬‬
‫ﺍﻟﻔﺼﻞ ﻛﻴﻒ ﺗﺘﻌﺎﻣﻞ ﻣﻊ ﺍﻷﻋﺪﺍﺩ ﺍﻟﺼﺤﻴﺤﺔ ﻭﻣﻊ ﺍﻟﻨﻤﻂ ‪ .int‬ﻟﻜﻦ ﻟﻐﺔ ‪ C++‬ﺗﺴﺘﻄﻴﻊ ﲤﺜﻴﻞ‬
‫ﺍﻷﺣﺮﻑ ﺍﻟﻼﺗﻴﻨﻴﺔ ﺍﻟﺼﻐﲑﺓ ﻭﺍﻟﻜﺒﲑﺓ ﺑﺎﻹﺿﺎﻓﺔ ﺇﱃ ﺍﻟﻌﺪﻳﺪ ﻣﻦ ﺍﻟﺮﻣﻮﺯ ﺍﳋﺎﺻﺔ‪ .‬ﻭﻫﻲ )ﺃﻱ ‪(C++‬‬
‫ﺗﺴﺘﺨﺪﻡ ﺃﻋﺪﺍﺩ ﺻﺤﻴﺤﺔ ﺻﻐﲑﺓ ﻟﺘﻤﺜﻞ ﺩﺍﺧﻠﻴﹰﺎ ﻛﻞ ﺣﺮﻑ ﻣﻦ ﺍﳊﺮﻭﻑ‪ .‬ﻧﺴﻤﻲ ﳎﻤﻮﻋﺔ‬
‫ﺍﳊﺮﻭﻑ ﻭﺍﻟﻘﻴﻢ ﺍﻟﺼﺤﻴﺤﺔ ﺍﳌﻮﺍﻓﻘﺔ ﳍﺎ ﲟﺠﻤﻮﻋﺔ ﺣﺮﻭﻑ ﺍﳊﺎﺳﺐ ‪.computer’s character set‬‬
‫ﻭﳝﻜﻦ ﻃﺒﺎﻋﺔ ﺣﺮﻑ ﺑﻮﺿﻊ ﺍﳊﺮﻑ ﺑﲔ ﺇﺷﺎﺭﰐ )‘( ﻭﺃﺭﺳﺎﻟﻪ ﺇﱃ ﺗﻌﻠﻴﻤﺔ ‪ cout‬ﻋﻠﻰ ﺍﻟﺸﻜﻞ‬
‫ﺍﻟﺘﺎﱄ‪:‬‬
‫;'‪cout << 'A‬‬

‫)‪(static_cast‬‬ ‫ﻭﳝﻜﻦ ﻃﺒﺎﻋﺔ ﺍﻟﻘﻴﻤﺔ ﺍﻟﺼﺤﻴﺤﺔ ﺍﳌﻜﺎﻓﺌﺔ ﻟﻠﺤﺮﻑ ﺑﺄﻥ ﻧﻀﻊ ﻗﺒﻞ ﺫﻟﻚ ﺍﳊﺮﻑ ﺍﻟﻌﺒﺎﺭﺓ‬
‫)ﻫﺬﺍ ﻣﺎ ﻧﺴﻤﻴﻪ ﺑﻌﻤﻠﻴﺔ ﺍﻟﻘﺴﺮ ‪ cast‬ـ ﻛﻤﺎ ﺳﻨﺮﻯ ﻻﺣﻘﹰﺎ ﰲ ﺍﻟﻔﺼﻞ ﺍﻟﺜﺎﱐ( ﻛﻤﺎ ﻳﻠﻲ‪:‬‬
‫;)'‪cout << static_cast<int> ('A‬‬

‫ﻋﻨﺪ ﺗﻨﻔﻴﺬ ﺍﻟﺘﻌﻠﻴﻤﺔ ﺍﻟﺴﺎﺑﻘﺔ ﻓﺈﻬﻧﺎ ﺳﻮﻑ ﺗﻄﺒﻊ ﺍﻟﻘﻴﻤﺔ ‪) 65‬ﻫﺬﻩ ﺍﻟﻘﻴﻤﺔ ﺗﻮﺍﻓﻖ ﺍﻟﻨﻈﻢ ﺍﻟﱵ ﺗﺴﺘﺨﺪﻡ‬
‫ﻣﺎ ﻳﺴﻤﻰ ﲟﺠﻤﻮﻋﺔ ﺍﳊﺮﻭﻑ ‪ .(ASCII‬ﺃﻛﺘﺐ ﺑﺮﻧﺎﳎﹰﺎ ﻳﻘﻮﻡ ﺑﻄﺒﺎﻋﺔ ﺍﻷﻋﺪﺍﺩ ﺍﻟﺼﺤﻴﺤﺔ ﺍﳌﻜﺎﻓﺌﺔ‬
‫ﻟﻠﺤﺮﻭﻑ ﺍﻟﻼﺗﻴﻨﻴﺔ ﺍﻟﻜﺒﲑﺓ ﻭﺍﻟﺼﻐﲑﺓ ﻭﺍﻷﺭﻗﺎﻡ ﻭﺍﻟﺮﻣﻮﺯ ﺍﳋﺎﺻﺔ‪ .‬ﺣﺪﺩ ﻛﺤﺪ ﺃﺩﱏ ﺍﻷﻋﺪﺍﺩ‬
‫ﺍﻟﺼﺤﻴﺤﺔ ﺍﳌﻜﺎﻓﺌﺔ ﳌﺎ ﻳﻠﻲ‪ / + * $ 2 1 0 c b a C B A :‬ﻭﺍﻟﻔﺮﺍﻍ‪.‬‬

‫ﺃﻛﺘﺐ ﺑﺮﻧﺎﳎﹰﺎ ﻳﺄﺧﺬ ﻛﺪﺧﻞ ﺭﻗﻤﹰﺎ ﻣﺆﻟﻔﹰﺎ ﻣﻦ ﲬﺴﺔ ﺧﺎﻧﺎﺕ‪ ،‬ﰒ ﻳﻘﻮﻡ ﺑﻔﺼﻞ ﻫﺬﻩ ﺍﳋﺎﻧﺎﺕ ﺇﱃ ﺃﺭﻗﺎﻡ‬ ‫‪36-1‬‬
‫ﻣﻨﻔﺼﻠﺔ ﻟﻴﻄﺒﻌﻬﺎ ﺑﻌﺪ ﺫﻟﻚ ﻋﻠﻰ ﺍﻟﺸﺎﺷﺔ ﻣﻔﺼﻮﻟﺔ ﻋﻦ ﺑﻌﻀﻬﺎ ﺍﻟﺒﻌﺾ ﺑﻮﺍﺳﻄﺔ ﺛﻼﺛﺔ ﻓﺮﺍﻏﺎﺕ‪ .‬ﻋﻠﻰ‬
‫ﺳﺒﻴﻞ ﺍﳌﺜﺎﻝ‪ ،‬ﺇﺫﺍ ﺃﺩﺧﻞ ﺍﳌﺴﺘﺨﺪﻡ ﺍﻟﻌﺪﺩ ‪ 42339‬ﻓﺴﻨﺤﺼﻞ ﰲ ﺍﳋﺮﺝ ﻋﻠﻰ‪:‬‬

‫‪4‬‬ ‫‪2‬‬ ‫‪3‬‬ ‫‪3‬‬ ‫‪9‬‬


‫اﻟﻔﺼﻞ اﻷول‬ ‫‪٩٢‬‬

‫ﺑﺎﺳﺘﺨﺪﺍﻡ ﺍﻟﺘﻘﻨﻴﺎﺕ ﺍﻟﱵ ﺗﻌﻠﻤﺘﻬﺎ ﰲ ﻫﺬﺍ ﺍﻟﻔﺼﻞ‪ ،‬ﺃﻛﺘﺐ ﺑﺮﻧﺎﳎﹰﺎ ﻳﻘﻮﻡ ﲝﺴﺎﺏ ﻣﺮﺑﻊ ﻭﻣﻜﻌﺐ‬ ‫‪37-1‬‬
‫ﺍﻷﻋﺪﺍﺩ ﻣﻦ ‪ 0‬ﺣﱴ ‪ 10‬ﻭﻳﺴﺘﺨﺪﻡ ﺇﺷﺎﺭﺓ ﺍﳉﺪﻭﻟﺔ )‪ (tab‬ﻟﻄﺒﺎﻋﺔ ﺍﻟﻘﻴﻢ ﻛﻤﺎ ﻫﻮ ﻣﺒﲔ ﰲ ﺍﳉﺪﻭﻝ‬
‫ﺍﻟﺘﺎﱄ‪:‬‬

‫‪numbers‬‬ ‫‪sequare‬‬ ‫‪cube‬‬

‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬

‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬

‫‪2‬‬ ‫‪4‬‬ ‫‪8‬‬

‫‪3‬‬ ‫‪9‬‬ ‫‪27‬‬

‫‪4‬‬ ‫‪16‬‬ ‫‪64‬‬

‫‪5‬‬ ‫‪25‬‬ ‫‪125‬‬

‫‪6‬‬ ‫‪36‬‬ ‫‪216‬‬

‫‪7‬‬ ‫‪49‬‬ ‫‪343‬‬

‫‪8‬‬ ‫‪64‬‬ ‫‪512‬‬

‫‪9‬‬ ‫‪81‬‬ ‫‪729‬‬

‫‪10‬‬ ‫‪100‬‬ ‫‪1000‬‬

‫ﺃﻋﻂ ﺟﻮﺍﺑﹰﺎ ﳐﺘﺼﺮﹰﺍ ﻓﻴﻤﺎ ﻳﺘﻌﻠﻖ ﺑﺎﻷﺳﺌﻠﺔ ﺍﻟﺘﺎﻟﻴﺔ ﺣﻮﻝ ﻣﺎﻫﻴﺔ ﺍﻷﻏﺮﺍﺽ‪:‬‬ ‫‪38-1‬‬

‫ﳌﺎﺫﺍ ﺃﺧﺘﺎﺭ ﻫﺬﺍ ﺍﻟﻜﺘﺎﺏ ﺃﺳﻠﻮﺏ ﻣﻨﺎﻗﺸﺔ ﺍﻟﱪﳎﺔ ﺍﳌﻬﻴﻜﻠﺔ ﺑﺎﻟﺘﻔﺼﻴﻞ ﻗﺒﻞ ﺍﳋﻮﺽ‬ ‫ﺃ(‬
‫ﻭﺑﺎﻟﺘﻔﺼﻴﻞ ﰲ ﻣﻌﺎﳉﺔ ﻣﻔﻬﻮﻡ ﺍﻟﱪﳎﺔ ﻏﺮﺿﻴﺔ ﺍﻟﺘﻮﺟﻪ؟‬
‫ﺏ( ﻣﺎﻫﻲ ﺍﳋﻄﻮﺍﺕ ﺍﻟﻨﻤﻮﺫﺟﻴﺔ )ﺍﳌﺬﻛﻮﺭﺓ ﰲ ﺍﻟﻜﺘﺎﺏ( ﻟﻌﻤﻠﻴﺔ ﺍﻟﺘﺼﻤﻴﻢ ﺍﳌﻮﺟﻬﺔ‬
‫ﺑﺎﻷﻏﺮﺍﺽ؟‬
‫ﺝ( ﻛﻴﻒ ﻳﻈﻬﺮ ﺃﻭ ﻳﺘﺠﻠﻰ ﻣﻔﻬﻮﻡ ﺍﻟﺘﻮﺭﻳﺚ ﺍﳌﺘﻌﺪﺩ ﻟﺪﻯ ﺍﻟﺒﺸﺮ؟‬
‫ﺩ( ﻣﺎ ﻫﻲ ﺃﻧﻮﺍﻉ ﺍﻟﺮﺳﺎﺋﻞ ﺍﻟﱵ ﻳﺘﺒﺎﺩﳍﺎ ﺍﻟﺒﺸﺮ ﻓﻴﻤﺎ ﺑﻴﻨﻬﻢ؟‬
‫ﻫـ( ﺗﺮﺳﻞ ﺍﻷﻏﺮﺍﺽ ﺭﺳﺎﺋﻞ ﻓﻴﻤﺎ ﺑﻴﻨﻬﺎ ﻣﻦ ﺧﻼﻝ ﻭﺍﺟﻬﺎﺕ ﻣُﻌﺮﻓﺔ ﺟﻴﺪﹰﺍ‪ .‬ﻣﺎﻫﻲ ﺍﻟﻮﺍﺟﻬﺎﺕ‬
‫ﺍﻟﱵ ﳝﺜﻠﻬﺎ ﺟﻬﺎﺯ ﺭﺍﺩﻳﻮ ﺍﻟﺴﻴﺎﺭﺓ )ﻛﻐﺮﺽ( ﳌﺴﺘﺨﺪﻣﻪ )ﺍﻟﺬﻱ ﻧﻔﺘﺮﺿﻪ ﻏﺮﺽ ﺁﺧﺮ(‪.‬‬

‫ﻣﻦ ﺍﶈﺘﻤﻞ ﺃﻧﻚ ﺗﺮﺗﺪﻱ ﻋﻠﻰ ﻣﻌﺼﻤﻚ ﺃﺣﺪ ﺃﻛﺜﺮ ﺍﻷﻏﺮﺍﺽ ﺷﻴﻮﻋﹰﺎ ﰲ ﺍﻟﻌﺎﱂ ﺃﻻ ﻭﻫﻮ‬ ‫‪39-1‬‬
‫"ﺍﻟﺴﺎﻋﺔ"‪ .‬ﻧﺎﻗﺶ ﻛﻴﻒ ﳝﻜﻦ ﺗﻄﺒﻴﻖ ﻛﻞ ﻣﻦ ﺍﻟﺘﻌﺎﺑﲑ ﻭﺍﳌﻔﺎﻫﻴﻢ ﺍﻟﺘﺎﻟﻴﺔ ﻋﻠﻰ ﻣﻔﻬﻮﻡ ﺍﻟﺴﺎﻋﺔ‪:‬‬
‫ﻼ ﻣﻊ ﺳﺎﻋﺔ‬‫ﻏﺮﺽ‪ ،‬ﺍﳋﺼﺎﺋﺺ ﻭﺍﻟﺼﻔﺎﺕ‪ ،‬ﺍﻟﺘﺼﺮﻓﺎﺕ‪ ،‬ﺻﻒ‪ ،‬ﺍﻟﺘﻮﺭﻳﺚ )ﻋﻠﻰ ﺃﻧﻨﺎ ﻧﺘﻌﺎﻣﻞ ﻣﺜ ﹰ‬
‫ﻣﺰﻭﺩﺓ ﲟﻨﺒﻪ(‪ ،‬ﺍﻟﺘﺠﺮﻳﺪ‪ ،‬ﺍﻟﻨﻤﺬﺟﺔ‪ ،‬ﺍﻟﺮﺳﺎﺋﻞ‪ ،‬ﺍﻟﺘﻀﻤﲔ ‪ ،encapsulation‬ﺍﻟﻮﺍﺟﻬﺎﺕ‪ ،‬ﺇﺧﻔﺎﺀ‬
‫‪٩٣‬‬ ‫‪ .1‬ﻣﻘﺪﻣﺔ ﺣﻮل اﻟﺤﻮاﺳﻴﺐ واﻟﺒﺮﻣﺠﺔ ﺑﻠﻐﺔ ‪C++‬‬

‫ﺍﳌﻌﻠﻮﻣﺎﺕ‪ ،‬ﺍﳌﻌﻄﻴﺎﺕ ﺍﻟﺪﺍﺧﻠﻴﺔ‪ ،‬ﻭﺍﻟﺘﻮﺍﺑﻊ ﺍﻟﺪﺍﺧﻠﻴﺔ‪.‬‬

Potrebbero piacerti anche