Professional Documents
Culture Documents
ﻧﻌﯿﺶ اﻟﯿﻮم ﻗﻲ ﻋﺼﺮ ﺗﺘﺴﺎرع ﺑﮫ اﻟﻌﻠﻮم واﻟﺘﻜﻨﻮﻟﻮﺟﯿﺎ ,وﺗﺘﺴﺎرع ﻣﻌﮭﺎ اﻟﻌﻠﻮم واﻟﻤﻌﺮﻓﺔ اﻹﻧﺴﺎﻧﯿﺔ
ﺑﺸﻜﻞ ﻟﻢ ﯾﺴﺒﻖ ﻟﮫ ﻣﺜﯿﻞ ﻓﻲ ﺗﺎرﯾﺦ اﻹﻧﺴﺎﻧﯿﺔ وﺗﺘﻀﺎﻋﻒ اﻟﻤﻌﺮﻓﺔ ﺣﺎﻟﯿﺎ ﺑﺸﻜﻞ ﻟﻮﻏﺎرﺗﻤﻲ ﻣﻊ ﻣﺮور ﻛﻞ
ﻋﻘﺪ ﻣﻦ اﻟﺰﻣﻦ وأﺻﺒﺤﺖ اﻟﻤﻌﻠﻮﻣﺎت ﺗﺘﺴﻊ واﻟﺒﺤﻮث واﻟﺪراﺳﺎت ﺗﺘﻌﻤﻖ وﺗﺼﺒﺢ أﻛﺜﺮ ﺗﻌﻘﯿﺪاً ﻓﻲ ﻋﺼﺮ
ﺗﻮﺻﻞ اﻟﻌﻘﻞ اﻟﺒﺸﺮي ﻓﯿﮫ إﻟﻰ ﺗﺴﺨﯿﺮ إﻣﻜﺎﻧﺎت اﻵﻟﺔ ﺿﻤﻦ ﻧﻈﺎم ﻣﺤﻜﻢ وﺑﺮﻣﺠﺔ ﻓﺎﻋﻠﺔ ﻟﺘﺄﻣﯿﻦ ﺧﺪﻣﺎت
ﻧﻤﻮه وﺗﻄﻮر ﺣﯿﺎﺗﮫ ﻧﺤﻮ اﻷﻓﻀﻞ.
وﻣﻊ ھﺬا اﻟﺘﻄﻮر واﻟﻨﻤﻮ ﻓﻲ ﺣﯿﺎة اﻹﻧﺴﺎن ﺑﻜﻞ أوﺟﮭﮭﺎ ﺑﺮز اﻟﺤﺎﺳﺐ ﻛﺄھﻢ ﻣﺆﺷﺮ ﻟﮭﺎ اﻟﻨﻤﻮ ,ﺑﻞ أﺻﺒﺢ
اﻟﺤﺎﺳﺐ ﻣﻘﯿﺎﺳﺎً ﻟﺴﻤﺔ ﻋﺼﺮ اﻟﻌﻠﻮم واﻟﺘﻜﻨﻮﻟﻮﺟﯿﺎ وﻣﻮﺟﮭﺎ ﻟﺘﻘﺪم وﺣﻀﺎرة اﻷﻣﺔ ,وﻻ ﯾﻤﻜﻦ ﻷﻣﺔ ﻣﻦ
اﻷﻣﻢ ﻓﻲ ﻋﺼﺮﻧﺎ اﻟﺤﺎﻟﻲ اﻟﻠﺤﺎق ﺑﺮﻛﺐ اﻟﺤﻀﺎرة اﻟﺘﻜﻨﻮﻟﻮﺟﯿﺔ وﺗﺄﻣﯿﻦ ﺣﯿﺎة أﻓﻀﻞ ﻟﺸﻌﻮﺑﮭﺎ دون
اﻟﺴﯿﻄﺮة واﻟﺘﺤﻜﻢ ﻓﻲ ھﻨﺪﺳﺔ اﻟﺤﺎﺳﺐ وﻋﻠﻮم اﻟﺤﺎﺳﺐ اﻻﻟﻜﺘﺮوﻧﻲ.
ﻟﻤﻮاﺟﮭﺔ ذﻟﻚ رأﯾﻨﺎ ﺿﺮورة ﺗﺄﻟﯿﻒ ھﺬا اﻟﻜﺘﺎب ﻓﻠﻘﺪ أﻧﺸﺄﻧﺎ ﺑﺴﺒﺐ ﻗﻠﺔ ﻛﺘﺐ ھﺬه اﻟﻤﺎدة ﺑﺎﻟﻐﺔ اﻟﻌﺮﺑﯿﺔ و
ﺗﯿﺴﯿﺮاُ ﻹﺧﻮاﻧﻨﺎ اﻟﺬﯾﻦ ﺻﻌﺒﺖ ﻋﻠﯿﮭﻢ ﻓﮭﻢ ھﺬه اﻟﻤﺎدة وﺗﺒﺴﯿﻂ ﻟﮭﻢ ﻣﻌﻨﻰ ھﺬه اﻟﻤﺎدة واﻻﺳﺘﻔﺎدة اﻟﻜﺎﻣﻠﺔ
ﻣﻦ اﻹﻣﻜﺎﻧﺎت اﻟﺘﻲ ﺗﻮﻓﺮھﺎ ﻟﻐﺔ Javaواﻋﻠﻤﻮا أن ﻛﻞ ﻣﺎ ﻛﺘﺐ ھﻮ ﺧﻼﺻﺔ وﻟﺐ اﻟﺒﺮﻣﺠﺔ ﺑﻠﻐﺔ Java
وﻗﺪ ﺗﻤﯿﺰ ھﺬا اﻟﻜﺘﺎب
.1ﺳﮭﻮﻟﺔ اﻟﺘﻌﺒﯿﺮ ﺑﺎﻟﻠﻐﺔ اﻟﻌﺮﺑﯿﺔ.
.2إﺛﺒﺎت اﻟﻤﺼﻄﻠﺤﺎت اﻻﻧﺠﻠﯿﺰﯾﺔ ﺣﯿﺜﻤﺎ ﻟﺰم ﻟﺘﻜﻮن ﻋﻮﻧﺎ ﻟﻠﻘﺎرئ ﻋﻨﺪ اﻟﺤﺎﺟﺔ ﻟﻺﻃﻼع ﻋﻠﻰ
ﻛﺘﺐ أﺟﻨﺒﯿﺔ ﻓﻲ ﻣﺠﺎل اﻟﻜﺘﺎب.
.3أﺗﺒﺎع اﻟﺸﻤﻮﻟﯿﺔ ﻓﻲ أﻋﺪاد ﻣﺤﺘﻮى اﻟﻜﺘﺎب واﻟﺘﻮﺿﯿﺢ اﻟﻼزم
.4اﻹﻛﺜﺎر ﻣﻦ اﻷﻣﺜﻠﺔ اﻟﻤﺘﻨﻮﻋﺔ اﻟﻤﺤﻠﻮﻟﺔ ﻟﻤﺎ ﻟﮭﺎ ﻣﻦ أھﻤﯿﺔ ﻓﻲ ﺗﻮﺿﯿﺢ ﻣﻌﺎﻧﻲ اﻟﻤﻔﺎھﯿﻢ اﻟﺘﻲ
ﺗﻀﻤﻨﮭﺎ اﻟﻜﺘﺎب اﻷﻣﺮ اﻟﺬي ﯾﺆدي اﺳﺘﯿﻌﺎب اﻟﻤﻮﺿﻮع اﺳﺘﯿﻌﺎب ﺷﺎﻣﻼً.
وﻟﻘﺪ وﺛﻘﺖ ھﺬه اﻟﻤﻮاﺿﯿﻊ ﺑﺒﺮاﻣﺞ ﻋﻠﻤﯿﺔ ﻃﺒﻘﺖ ﺟﻤﯿﻌﮭﺎ ﻟﻠﺘﺄﻛﺪ ﻣﻦ ﺻﺤﺘﮭﺎ وأﯾﻀﺎً وﺗﻘﺖ ﺑﺎﻟﺮﺳﻮم اﻟﺒﯿﺎﻧﯿﺔ
ﻟﺘﺮﺳﯿﺦ اﻟﻔﻜﺮ ﻓﻲ ذھﻦ اﻟﻘﺎرئ.
وأﺧﯿﺮاُ ﻧﺴﺄل اﷲ أن ﯾﺤﻘﻖ ھﺬا اﻟﻜﺘﺎب اﻟﮭﺪف اﻟﺬي ﻛﺘﺐ ﻷﺟﻠﮫ وﯾﻌﻠﻢ اﷲ أن ﻏﺎﯾﺘﻨﺎ ﻓﻲ ھﺬا أن ﯾﻌﻢ
اﻟﻔﺎﺋﺪة ﻓﻲ أرض اﻟﻤﺴﻠﻤﯿﻦ وﻛﻞ ﻣﺴﻠﻢ وﻣﺴﻠﻤﺔ ﻃﺎﻟﺒﺎُ ﻣﻨﻜﻢ دﻋﻮه ﺻﺎﻟﺤﺔ ﻓﻲ ﻇﮭﺮ اﻟﻐﯿﺐ وان ﺗﺼﻠﻮا
وﺗﺴﻠﻤﻮا ﻋﻠﻰ ﻣﻦ ﻋﻠﻤﻨﺎ وأﻧﺒﺎﻧﺎ ﻧﺒﯿﻨﺎ ﻣﺤﻤﺪ ﺣﺒﯿﺐ ﻗﻠﺒﻨﺎ أﻟﻒ ﻣﻠﯿﻮن ﺻﻼة وﺳﻼم ﻣﻦ رب اﻟﻌﺒﺎد ﻋﺪد
ﺗﺤﺮﯾﺮ اﻟﺴﻄﻮر وﻋﺪد اﻟﻤﺨﻠﻮﻗﺎت واﻟﻤﺨﻠﻮق ﺻﻼه داﺋﻤﺔ ﻣﻦ اﻟﯿﻮم إﻟﻰ ﯾﻮم اﻟﻨﺸﻮر .
واﺳﺄل اﷲ أن ﯾﺒﺎرك ﻟﻨﺎ وﻟﻜﻢ ﻓﻲ ﻛﻞ ﻣﺎ ﻛﺘﺒﻨﺎه و ﺗﻌﻠﻤﻨﺎه وﺗﻌﻠﻤﺘﻤﻮه .
واﻟﺤﻤﺪ ﷲ .....
ﯾﺤﺘﻮي ھﺬا اﻟﻜﺘﺎب ﻋﻠﻰ ___ ﺑﺮﻧﺎﻣﺠﺎً ,وﺳﻮف ﺗﺠﺪ ھﺬه اﻷﻣﺜﻠﺔ ﻗﯿﻤﺔ ﺟﺪاً ﻋﻨﺪﻣﺎ ﺗﺪرس ﻣﻜﻮﻧﺎﺗﮭﺎ
ﺑﺸﻜﻞ ﺟﯿﺪ ,ﻓﻘﺪ ﺷﺮﺣﺖ ﻣﻌﻈﻢ اﻹﺟﺮاءات واﻟﺘﻮاﺑﻊ و اﻟﻌﺒﺎرات اﻟﻤﻜﻮﻧﺔ ﻟﻠﺒﺮاﻣﺞ ﺑﺎﻟﺘﻔﺼﯿﻞ ,إﺿﺎﻓﺔ
إﻟﻰ ذﻟﻚ أ ،اﻟﻜﺘﺎب ﯾﻄﺮح اﻟﻌﺪﯾﺪ ﻣﻦ اﻟﻤﻘﺘﺮﺣﺎت واﻷﻓﻜﺎر واﻷﺧﻄﺎء اﻟﺸﺎﺋﻌﺔ واﻟﻌﺎدات اﻟﺒﺮﻣﺠﯿﺔ اﻟﺠﯿﺪة
اﻟﺘﻲ ﯾﻤﻜﻦ ﻣﻦ ﺧﻼﻟﮭﺎ زﯾﺎدة ﻣﺪى اﻻﺳﺘﻔﺎدة ﻣﻦ اﻷﻣﺜﻠﺔ .
وﺑﻌﺪ أن ﺗﻨﺘﮭﻲ ﻣﻦ ﻗﺮاءة اﻟﻜﺘﺎب ﺳﻮف ﺗﻜﻮن ﻗﺪ ﺗﻌﻠﻤﺖ ﺟﻤﯿﻊ اﻟﺼﯿﻎ اﻟﻜﺘﺎﺑﯿﺔ ﻟﮭﺬت اﻟﻠﻐﺔ وﻛﺬﻟﻚ ﻗﺪ
اﻣﺘﻠﻜﺖ اﻟﺨﺒﺮة اﻟﻜﺎﻓﯿﺔ ودرﺳﺖ اﻟﻄﺮاﺋﻖ اﻟﺼﺤﯿﺤﺔ ﻟﻜﺘﺎﺑﺔ اﻟﺒﺮاﻣﺞ اﻟﺘﻲ ﺗﺮﯾﺪ.
ﻟﻘﺪ ﻧﻈﻢ ھﺬا اﻟﻜﺘﺎب وﻓﻖ ﻃﺮﯾﻘﺔ ﺳﮭﻠﮫ اﻟﻤﺘﺎﺑﻌﺔ ,ﻓﮭﻮ ﻻ ﯾﻔﺘﺮض وﺟﻮد ﺧﺒﺮة ﺑﺮﻣﺠﯿﺔ ﻣﺴﺒﻘﺔ ﻟﺪى
اﻟﻘﺎرئ وﻣﻊ ذﻟﻚ ﻓﮭﻮ ﯾﻄﺮح ﻣﻮاﺿﯿﻊ ﻣﺘﻘﺪﻣﺔ ﺗﺠﻌﻞ ﻣﻦ اﻟﻜﺘﺎب ﺣﺎﺟﺔ ﻟﻠﻤﺒﺘﺪﺋﯿﻦ واﻟﻤﺘﻘﺪﻣﯿﻦ.
وﻟﻘﺪ رﺗﺒﺖ ﻣﻮاﺿﯿﻊ وﻓﺼﻮل اﻟﻜﺘﺎب ﻟﻜﻲ ﺗﺴﯿﺮ ﺑﺎﻟﻘﺎرئ ﺑﺨﻄﻰ ﺛﺎﺑﺘﺔ ﺑﺎﺗﺠﺎه ﺗﻌﻠﻢ ﻟﻐﺔ Javaوﺑﻨﺎ
ﺧﺒﺮات ﺑﺮﻣﺠﯿﺔ ﺗﻌﯿﻨﮫ ﻋﻠﻰ ﻛﺘﺎﺑﺔ ﺑﺮاﻣﺠﮫ ﻻﺣﻘﺎً.
اﻷھﺪاف
ﯾﺒﺪأ ﻛﻞ ﻓﺼﻞ ﺑﻤﺠﻤﻮﻋﺔ ﻣﻦ اﻷھﺪاف اﻟﺘﻲ ﺗﺨﺒﺮ اﻟﻘﺎرئ ﻋﻤﺎ ﯾﺠﺐ أن ﯾﻌﺮﻓﮫ ﻓﻲ ھﺬا اﻟﻔﺼﻞ ﻛﻤﺎ إﻧﮭﺎ
ﺗﻌﻄﯿﮫ اﻟﻔﺮﺻﺔ ﺑﻌﺪ ﻗﺮاءة اﻟﻔﺼﻞ ﺑﺄن ﯾﺤﺪد ﺑﻨﻔﺴﮫ ﻓﯿﻤﺎ إذا ﻛﺎن ﻗﺪ ﺗﻮﺻﻞ ﻓﻌﻠﯿﺎ ﻋﻦ ھﺬه اﻷھﺪاف أم ﻻ.
ﯾﺴﺎﻋﺪ ﺗﺤﺪﯾﺪ ھﺬه اﻷھﺪاف ﻋﻠﻰ ﺑﻨﺎء اﻟﺜﻘﺔ اﻟﺬاﺗﯿﺔ ﻟﻠﻘﺎرئ وﺗﺸﻜﻞ ﻟﮫ ﻣﺼﺪرا إﯾﺠﺎﺑﯿﺎ ﻟﻠﺘﻘﻮﯾﺔ .
ﻟﻘﺪ اﻋﺪ ھﺬا اﻟﻜﺘﺎب ﻟﯿﻠﺒﻲ ﺣﺎﺟﺎت ﻓﺌﺎت اﻟﻘﺮاء اﻟﺜﻼث وﻣﻌﻠﻰ ﻛﺎﻓﺔ ﻣﺴﺘﻮﯾﺎﺗﮭﻢ :
ﻓﺎﻟﻤﺒﺘﺪﺋﻮن اﻟﺬﯾﻦ ﻟﯿﺲ ﻟﮭﻢ ﺳﺎﺑﻖ ﻋﮭﺪ ﻓﻲ اﻟﺒﺮﻣﺠﺔ ,واﻟﺬﯾﻦ ﯾﺮﻏﺒﻮن ﺑﺎﻟﺒﺪء ﺑﺘﻌﻠﻢ ھﺬه اﻟﻠﻐﺔ , -1
ﻓﯿﺘﯿﺢ ﻟﮭﻢ ھﺬا اﻟﻜﺘﺎب ﻓﺮﺻﺔ ﺗﻌﻠﻢ ﻗﻮاﻋﺪ اﻟﺒﺮﻣﺠﺔ اﻟﺼﺤﯿﺤﺔ ,وﺗﻌﻠﻢ ھﺬه اﻟﻠﻐﺔ ﺑﺎﻟﺸﻜﻞ
اﻷﻣﺜﻞ .
أﻣﺎ ﻣﻦ ﻟﮭﻢ ﺳﺎﺑﻖ ﻓﻲ ﻋﮭﺪ اﻟﺒﺮﻣﺠﺔ وﻟﻜﻦ ﻟﯿﺲ ﻟﮭﻢ اﻃﻼع ﻋﻠﻰ ھﺬه اﻟﻠﻐﺔ ﻓﯿﺄﺗﻲ ھﺬا اﻟﻜﺘﺎب -2
دﻟﯿﻼً ﻣﺘﻜﺎﻣﻼً ﯾﺴﺘﻄﯿﻌﻮن اﻟﻤﺘﺎﺑﻌﺔ ﻣﻦ ﺧﻼﻟﮫ ﺑﺨﻄﻮات ﺳﺮﯾﻌﺔ ,ﻓﺘﺘﺸﻜﻞ ﻟﺪﯾﮭﻢ أرﺿﯿﺔ
ﺑﺮﻣﺠﯿﺔ ﺟﯿﺪة ﻣﻦ ﺧﻼل ھﺬا اﻟﻜﺘﺎب.
وﻟﻤﻦ ﻟﮭﻢ ﺳﺎﺑﻖ ﻋﮭﺪ ﺑﻠﻐﺔ Javaﯾﻘﺪم ھﺬا اﻟﻜﺘﺎب ﻟﮭﻢ ﻣﻦ اﻷﻓﻜﺎر واﻟﻤﻮاﺿﯿﻊ اﻟﻤﺘﻘﺪﻣﺔ ﻣﺎ -3
ﯾﻨﺬر أن ﯾﺠﺪوه ﻓﻲ أي ﻛﺘﺎب ,وﺳﯿﺸﻌﺮون ﺑﺎﻟﺤﺎﺟﺔ إﻟﻰ اﻻﺣﺘﻔﺎظ ﺑﻨﺴﺨﺔ اﻟﻜﺘﺎب ﻗﺮﯾﺒﺔ ﻣﻨﮭﻢ
ﻋﻨﺪ ﻛﺘﺎﺑﺔ ﺑﺮاﻣﺠﮭﻢ.
ﯾﻌﺘﻤﺪ اﻟﻜﺘﺎب ﻓﻲ ﻃﺮﺣﮫ ﻟﻠﻤﻮاﺿﯿﻊ ﻋﻠﻰ ﻋﺪة اﻋﺘﺒﺎرات ﯾﻨﺒﻐﻲ ﺗﻮﻓﺮھﺎ ﻋﻨﺪ اﻟﻘﺎرئ ﻟﻜﻲ ﯾﺴﺘﻔﯿﺪ اﺳﺘﻔﺎدة
ﻣُﺜﻠﻰ ﻣﻦ اﻟﻜﺘﺎب .إذ ﯾﻨﺒﻐﻲ أوﻻً ﻗﺮاءة اﻟﻤﻘﺪﻣﺔ اﻟﻨﻈﺮﯾﺔ ﻋﻦ اﻟﻤﻮﺿﻮع ,وﻣﻦ ﺛﻢ ﺗﺠﺮﯾﺐ اﻟﻤﺜﺎل ﻋﻠﻰ
اﻟﺤﺎﺳﺐ ﺿﻤﻦ ﺑﯿﺌﺔ ال , Javaوذﻟﻚ ﻣﻦ ﺧﻼل ﻗﯿﻢ اﻟﺪﺧﻞ اﻟﻤﻘﺘﺮﺣﺔ وﻣﺮاﻗﺒﺔ اﻟﺨﺮج اﻟﻨﺎﺗﺞ وﻣﻦ ﺗﻢ
ﺗﺘﺒﻊ ﺷﺮح اﻟﺒﺮﻧﺎﻣﺞ ﺿﻤﻦ اﻟﻜﺘﺎب .
اﻟﻘﺮص اﻟﻤﺮﻓﻖ
ﻟﻘﺪ أرﻓﻘﻨﺎ اﻟﻜﺘﺎب ﺑﻘﺮص ﯾﺤﻮي ﻣﺎ ﯾﻠﻲ:
-1ﺑﺮاﻣﺞ اﻷﻣﺜﻠﺔ اﻟﻤﺬﻛﻮرة ﻓﻲ اﻟﻜﺘﺎب ﻛﺎﻣﻠﺔ ,ووﺿﻌﺖ اﻟﺒﺮاﻣﺞ ﻓﻲ أدﻟﺔ ﺗﺸﯿﺮ إﻟﻰ رﻗﻢ اﻟﻔﺼﻞ
اﻟﺤﺎوي ﻟﻠﻤﺜﺎل +رﻗﻢ اﻟﻤﺜﺎل ﻓﻲ ذﻟﻚ اﻟﻔﺼﻞ ,ﻓﺎﻟﻤﻠﻒ chp1_1ﯾﺸﯿﺮ إﻟﻰ اﻟﻔﺼﻞ اﻷول اﻟﻤﺜﺎل
اﻷول .
ﺧﺘﺎﻣ ًﺎ
ﻧﺮﺟﻮ ﻣﻦ اﻟﻘﺎرئ اﻟﻜﺮﯾﻢ أن ﻻ ﯾﺒﺨﻞ ﻋﻠﯿﻨﺎ ﺑﺪﻋﻮة ﺻﺎﻟﺤﺔ ﻓﻲ ﻇﮭﺮ اﻟﻐﯿﺐ وﻧﺼﺎﺋﺤﮫ وﻣﻘﺘﺮﺣﺎﺗﮫ ,
ﻓﻨﺤﻦ ﻧﺮﺣﺐ ﺑﻜﻞ ﻣﻘﺘﺮح وﺗﺴﺎؤل ﺳﻌﯿﺎً إﻟﻰ ﺗﺤﻘﯿﻖ اﻟﺘﻮاﺻﻞ اﻷﻣﺜﻞ .
وﺑﻌﺪ أﺗﻤﻨﻰ ﻣﻦ اﷲ ﻧﻜﻮن ﻗﺪ وﻓﻘﻨﺎ ﻓﻲ ﻣﺎ ﻗﻤﻨﺎ ﺑﮫ ﻣﻦ ﻋﻤﻞ ,وأن ﯾﺘﻘﺒﻠﮫ ﻣﻨﺎ إﻧﮫ ﺳﻤﯿﻊ ﻋﻠﯿﻢ وﺻﻠﻰ اﷲ
ﻋﻠﻰ ﺳﯿﺪﻧﺎ ﻣﺤﻤﺪ وﻋﻠﻰ اﻟﮫ وﺻﺤﺒﺔ أﺟﻤﻌﯿﻦ.
اﻟﻤﺆﻟﻒ
1.1ﻤﻘﺩﻤﺔ 44----------------------------------------------------------------------------------------------------
1.2ﺨﺼﺎﺌﺹ ﺍﻟﺤﺎﺴﻭﺏ 44-----------------------------------------------------------------------------------------
1.3ﺘﺼﻨﻴﻑ ﺍﻟﺤﺎﺴﺒﺎﺕ ﺍﻻﻟﻜﺘﺭﻭﻨﻴﺔ 45------------------------------------------------------------------------------
1.3.1ﻤﻥ ﺤﻴﺙ ﻗﺩﺭﺘﻬﺎ ﻋﻠﻰ ﺍﻟﺘﺨﺯﻴﻥ ﻭ ﻜﻔﺎﺀﺘﻬﺎ ﻓﻲ ﺇﻨﺠﺎﺯ ﺍﻟﻤﻬﺎﻡ 45 ---------------------------------------
1.3.2ﻤﻥ ﺤﻴﺙ ﻁﺭﻴﻘﺔ ﺍﻟﻌﻤل 48 ------------------------------------------------------------------------
1.3.3ﻤﻥ ﺤﻴﺙ ﻁﺒﻴﻌﺔ ﺃﻏﺭﺍﺽ ﺍﻻﺴﺘﻌﻤﺎل 49 -----------------------------------------------------------
1.4ﺘﻁﻭﺭ ﺍﻟﺤﺎﺴﻭﺏ49---------------------------------------------------------------------------------------------
1.5ﺃﺠﻴﺎل ﺍﻟﺤﺎﺴﺏ 50----------------------------------------------------------------------------------------------
1.5.1ﺍﻟﺠﻴل ﺍﻷﻭل )50 ------------------------------------------------- (FIRST GENERATION
1.5.2ﺍﻟﺠﻴل ﺍﻟﺜﺎﻨﻲ )51 --------------------------------------------- (SECOND GENERATION
1.5.3ﺍﻟﺠﻴل ﺍﻟﺜﺎﻟﺙ )51 ----------------------------------------------- (THIRD GENERATION
1.5.4ﺍﻟﺠﻴل ﺍﻟﺭﺍﺒﻊ )52 -------------------------------------------- (FOURTH GENERATION
1.5.5ﺍﻟﺠﻴل ﺍﻟﺨﺎﻤﺱ )53 ----------------------------------------------- (GENERATION FIFTY
1.6ﺍﻟﻜﻤﺒﻴﻭﺘﺭ ﻴﺤﺎﻜﻲ ﺍﻹﻨﺴﺎﻥ ..ﻜﻴﻑ ؟ 54-------------------------------------------------------------------------
1.7ﻤﻜﻭﻨﺎﺕ ﻨﻅﺎﻡ ﺍﻟﺤﺎﺴﻭﺏ ﺍﻟﺭﻗﻤﻲ 56-----------------------------------------------------------------------------
1.7.1ﻭﺤﺩﺓ ﺍﻟﻤﻌﺎﻟﺠﺔ ﺍﻟﻤﺭﻜﺯﻴﺔ 58 ------------------------------- -------------------------------- CPU
1.7.2ﻭﺤﺩﺓ ﺍﻟﺤﺴﺎﺏ ﻭ ﺍﻟﻤﻨﻁﻕ 60 ------------------------------- -------------------------------- ALU
1.7.3ﻭﺤﺩﺓ ﺍﻟﺘﺤﻜﻡ )65 ------------------------------------------------------- (CONTROL UNIT
1.7.4ﺘﺭﻜﻴﺏ ﺍﻟﺫﺍﻜﺭﺓ ﺍﻟﺭﺌﻴﺴﻴﺔ 72 ----------------------------------------------------------------------
1.7.5ﻭﺤﺩﺍﺕ ﺍﻹﺩﺨﺎل 90 ---------------------------------------------------------- INPUT UNITE
1.7.6ﺍﻟﻜﺘﺎﺒﺔ ﺒﺎﻟﻘﻠﻡ ﺍﻟﻌﺭﺒﻲ ﺍﻹﻟﻜﺘﺭﻭﻨﻲ 102 ----------------------------- --------------------------------
1.8ﺍﻟﻜﻤﺒﻴﻭﺘﺭ ﻭﻤﺘﺎﻋﺏ ﺍﻟﻤﻬﻨﺔ 103 --------------------------------------------------------------------------------
1.9ﻟﻐﺎﺕ ﺍﻟﺒﺭﻤﺠﻴﺎﺕ 104 ----------------------------------------------------------------- PROGRAMMING
1.9.1ﻨﺒﺫﺓ ﺘﺎﺭﻴﺨﻴﺔ ﻋﻥ Cﻭ 107 --------------------------------------------------------------- C++
1.9.2ﻨﺒﺫﺓ ﺘﺎﺭﻴﺨﻴﺔ ﻋﻥ 110 ------------------ FORTRAN , COBOL , PASCAL AND ADA
1.9.3ﻟﻐﺎﺕ VISUAL BASICﻭ VISUAL C++ﻭ C#ﻭ 112 ------------------------- BASIC
1.10ﻨﻅﻡ ﺍﻟﺘﺸﻐﻴل 115 ------------------------------------------------------------OPERATING SYSTEMS
1.10.1ﺃﻨﻭﺍﻉ ﻨﻅﻡ ﺍﻟﺘﺸﻐﻴل 115 -----------------------------------------------------------------------
ﻤﻬﺎﻡ ﻨﻅﺎﻡ ﺍﻟﺘﺸﻐﻴل 117 ----------------------------------------------------------------------- 1.10.2
1.10.3ﻤﻭﻗﻊ ﻨﻅﺎﻡ ﺍﻟﺘﺸﻐﻴل ﻓﻲ ﺍﻟﺤﺎﺴﺏ 118 -----------------------------------------------------------
1.11ﺨﻁﻭﺍﺕ ﺤل ﻤﺴﺄﻟﺔ ﺒﺎﺴﺘﺨﺩﺍﻡ ﺍﻟﺤﺎﺴﺏ 119 -----------------------------------------------------------------
ﺘﻤﺎﺭﻴﻥ ﺍﻟﻔﺼل 125 --------------------------------------------------------------------------------------------------
857 اﻟﻤﻼﺣﻖ
ھﯿﺎﻛﻞ اﻟﺒﯿﺎﻧﺎت
اﻟﻒ 1
ﻣﻦ اﻟﻤﺄﻟﻮف ﻗﺒﻞ اﻟﺸﺮوع إﻟﻰ ﻓﮭﻢ ﺷﻲء ﯾﺠﺐ ﻣﻌﺮﻓﺔ ﺗﻮاﺑﻌﮫ وﺗﻔﺎﻋﻞ ھﺬه اﻟﻌﻨﺎﺻﺮ ﻣﻊ ﺑﯿﺌﺘﮭﺎ
اﻟﻤﺘﻮاﻓﺮة ﻓﯿﮭﺎ واﻟﻌﻤﻠﯿﺎت اﻟﺘﻲ ﯾﻤﻜﻦ أن ﺗﺤﺪث ﻋﻠﻰ ھﺬه اﻟﻌﻨﺎﺻﺮ اﻟﺘﻲ ﺗﺆﻟﻒ ﻓﯿﻤﺎ ﺑﯿﻨﮭﺎ وﺣﺪة
ﻣﺘﻨﺎﻏﻤﺔ ﻣﺘﺮاﺑﻄﺔ ﻟﻜﻲ ﺗﻮﺻﻞ اﻟﻔﻜﺮة إﻟﻰ اﻟﻌﻘﻞ ﺑﺸﻜﻞ ﺟﯿﺪ وﺳﺮﯾﻊ.
وﻣﻦ اﻷﺷﯿﺎء اﻟﺘﻲ ﯾﺠﺐ ﺗﺤﺪﯾﺪھﺎ ﻛﻤﺘﺨﺼﺼﯿﻦ ﻓﻲ ﻋﻠﻢ اﻟﺤﺎﺳﺐ اﻵﻟﻲ ھﻲ اﻟﺒﯿﺎﻧﺎت DATA
و اﻟﻤﻌﻠﻮﻣﺎت INFORMATIONﻹﻧﮭﺎ ھﻲ أﺳﺎس ﺗﻌﺎﻣﻠﻨﺎ ﻣﻊ اﻟﺤﺎﺳﺐ.
ﻓﻤﺎ ھﻲ اﻟﺒﯿﺎﻧﺎت وﻣﺎ ھﻲ اﻟﻤﻌﻠﻮﻣﺎت وﻛﯿﻒ ﯾﻤﻜﻦ ﻟﻨﺎ أن ﻧﺤﺪدھﺎ ؟
ﻓﺎﻟﺒﯿﺎﻧﺎت /ھﻲ ﻣﺠﻤﻮﻋﺔ ﻣﻦ اﻟﺤﻘﺎﺋﻖ أو اﻷﻓﻜﺎر ﻗﺪ ﺗﻜﻮن ﺣﺮوف أو أرﻗﺎم أو ﺻﻮراُ أو ﺧﻠﯿﻄﺎُ ﻣﻤﺎ
ﺳﺒﻖ.
واﻟﻤﻌﻠﻮﻣﺎت /ﻣﺠﻤﻮﻋﺔ ﻣﻦ اﻟﺤﻘﺎﺋﻖ واﻷﻓﻜﺎر ﻋﻦ ﺷﻲء ﻣﺎ ﺗﻤﺖ ﻣﻌﺎﻟﺠﺘﮭﺎ .
إذن ﻓﺎﻟﺒﯿﺎﻧﺎت ھﻲ اﻟﻤﺎدة اﻟﺨﺎم ﻟﻠﻤﻌﻠﻮﻣﺎت أو أن اﻟﻤﻌﻠﻮﻣﺎت ھﻲ اﻟﺒﯿﺎﻧﺎت ﺑﻌﺪ ﻣﻌﺎﻟﺠﺘﮭﺎ وﻣﻦ اﻟﻮاﺿﺢ
آن اﻟﻔﺮق اﻷﺳﺎﺳﻲ ﺑﯿﻨﮭﻢ ھﻲ اﻟﻤﻌﺎﻟﺠﺔ .
أﻧﻮاع اﻟﻤﻌﺎﻟﺠﺔ ﻋﻠﻰ اﻟﺒﯿﺎﻧﺎت •
.1اﻹﺿﺎﻓﺔ.
.2اﻟﺤﺬف أو اﻹﻟﻐﺎء .
.3اﻟﺪﻣﺞ .
.4اﻟﻔﺮز .
.5اﻟﺘﺤﻠﯿﻞ واﻟﺘﺮﻛﯿﺐ ﺑﺎﺳﺘﺨﺪام اﻟﻌﻤﻠﯿﺎت اﻟﺤﺴﺎﺑﯿﺔ )(/, -,*, +واﻟﻌﻤﻠﯿﺎت اﻟﻤﻨﻄﻘﯿﺔ
)= . (< ,>, <= ,>=, !=,
.6اﻟﻨﺴﺦ اﻻﻟﻜﺘﺮوﻧﻲ ).(SAVE
.7اﻟﺤﻤﺎﯾﺔ واﻟﻔﻚ .
.8اﻻﺳﺘﺮﺟﺎع واﻟﺘﻌﺪﯾﻞ واﻟﺘﺨﺰﯾﻦ .
إذن ﻟﻜﻲ ﻧﺤﺼﻞ ﻋﻠﻰ ﻣﻌﻠﻮﻣﺎت ﻻﺑﺪ ﻣﻦ اﻟﺤﺼﻮل ﻋﻠﻰ ﺑﯿﺎﻧﺎت أوﻻُ ﺛﻢ اﻟﻘﯿﺎم ﺑﻤﻌﺎﻟﺠﺔ ھﺬه اﻟﺒﯿﺎﻧﺎت
ﻣﻌﺎﻟﺠﺔ ﺻﺤﯿﺤﺔ.
• اﻟﺘﺮﻛﯿﺐ اﻟﻔﯿﺰﯾﺎﺋﻲ واﻟﺘﺮﻛﯿﺐ اﻟﻤﻨﻄﻘﻲ ﻟﻠﺒﯿﺎﻧﺎت
ﻧﺠﺪ أن ﺳﺮﻋﺔ ﻣﻌﺎﻟﺠﺔ اﻟﺒﯿﺎﻧﺎت ﺗﻌﺘﻤﺪ ﻛﺜﯿﺮاً ﻋﻠﻰ ﻋﺪة ﻋﻮاﻣﻞ أﺿﺎﻓﮫ إﻟﻰ اﻟﻌﺎﻣﻞ اﻟﺰﻣﻨﻲ اﻟﻼزم
ﻟﻠﻤﻌﺎﻟﺠﺔ وﻣﻦ أھﻤﯿﺘﮭﺎ
üﻋﻮاﻣﻞ ﺗﺤﺪد ﻣﻦ اﻟﺬاﻛﺮة اﻟﺮﺋﯿﺴﯿﺔ.
üﻋﻮاﻣﻞ ﺗﺤﺪد ﻣﻦ وﺣﺪات اﻹدﺧﺎل واﻹﺧﺮاج.
üﻋﻮاﻣﻞ ﺗﺤﺪد ﻣﻦ ﺗﻔﺎﻋﻞ اﻹدﺧﺎل واﻹﺧﺮاج ﻣﻊ اﻟﺬاﻛﺮة اﻟﺮﺋﯿﺴﯿﺔ)ﺗﺒﺎدل اﻟﻤﻌﻠﻮﻣﺎت ﺑﯿﻦ ھﺬه
اﻟﻮﺣﺪات أي ﻋﻤﻠﻲ ﻣﻘﺎﯾﻀﺔ.
ﻧﺠﺪ أن اﻟﻌﺎﻣﻞ اﻷول ﯾﺘﻄﻠﺐ وﺟﻮد ﺑﺮﻧﺎﻣﺞ ﻟﻠﻤﻌﺎﻟﺠﺔ واﻟﻨﺴﺒﺔ ﻟﻠﻌﺎﻣﻞ اﻟﺘﺄﻧﻲ ﻓﺄﻧﺔ ﯾﺘﻄﻠﺐ ﺳﺮﻋﺔ
ﻟﻠﻮﺻﻮل إﻟﻰ اﻟﻤﻌﻠﻮﻣﺎت ﻹﺣﻀﺎرھﺎ ﻣﻦ اﻟﻮﺣﺪات اﻹدﺧﺎل ,واﻟﺬي ﯾﮭﻤﻨﺎ ھﻮ اﻹﻗﻼل ﻣﻦ ﻋﻤﻠﯿﺔ
اﻟﻤﻘﺎﯾﻀﺔ ﺑﯿﻦ اﻟﺬاﻛﺮة اﻟﺮﺋﯿﺴﯿﺔ ووﺣﺪات اﻹدﺧﺎل واﻹﺧﺮاج وﻟﮭﺬا ﻻﺑﺪ ﻣﻦ اﻹﺷﺎرة إﻟﻰ اﻟﺘﺮﻛﯿﺐ
اﻟﻔﯿﺰﯾﺎﺋﻲ واﻟﻤﻨﻄﻘﻲ ﻟﻠﺒﯿﺎﻧﺎت ﺣﯿﺖ ﻧﺠﺪ ﺗﻌﺮﯾﻒ اﻻﺛﻨﯿﻦ ﺑﺎﺧﺘﺼﺎر
اﻟﺘﺮﻛﯿﺐ اﻟﻤﻨﻄﻘﻲ /ھﻮ وﺟﮫ ﻧﻈﺮ اﻟﻤﺒﺮﻣﺞ ﻓﻲ ﺳﯿﺮ اﻟﺒﺮﻧﺎﻣﺞ أي آن ھﺬا ﺗﺮﺗﯿﺐ ﻣﻌﻠﻮﻣﺎت اﻟﺒﺮﻧﺎﻣﺞ
ﺑﺸﻜﻞ ﻣﻌﯿﻦ ﺣﺘﻰ ﯾﺘﻢ ﺗﻨﻔﯿﺬ ھﺬا اﻟﺒﺮﻧﺎﻣﺞ ﺑﻄﺮﯾﻘﺔ ﺻﺤﯿﺤﺔ .
اﻟﺘﺮﻛﯿﺐ اﻟﻔﯿﺰﯾﺎﺋﻲ /وھﻮ ﯾﻌﻨﻲ ﻛﯿﻔﯿﺔ ﺗﺮﺗﯿﺐ اﻟﺒﯿﺎﻧﺎت ﻋﻠﻰ أوﺳﺎط اﻟﺘﺨﺰﯾﻦ ﻣﺜﻞ اﻟﺸﺮﯾﻂ اﻟﻤﻐﻨﺎﻃﯿﺴﻲ
واﻟﻘﺮص اﻟﻤﻐﻨﺎﻃﯿﺴﻲ ﺣﯿﺖ ﺗﺨﺰن اﻟﺒﯿﺎﻧﺎت ﻋﻠﻰ اﻟﻘﺮص اﻟﻤﻐﻨﺎﻃﯿﺴﻲ ﺑﻄﺮﯾﻘﺔ ﻣﺒﺎﺷﺮة أو ﺗﺘﺎﺑﻌﯿﮫ أي
ﺗﺴﻠﺴﻠﯿﺔ ﻣﻔﮭﺮﺳﺔ.
1.4اﻟﻤﻜﺪس )(Stack
وھﻮ ﻋﺒﺎرة ﻋﻦ ﻧﻤﻮذج ﺧﺎص ﻟﺘﺨﺰﯾﻦ اﻟﺒﯿﺎﻧﺎت ﺑﺎﻟﯿﺔ ﺛﺎﺑﺘﺔ وإﺧﺮاﺟﮭﺎ ﺑﺎﻟﯿﮫ ﺛﺎﺑﺘﺔ ﺑﺸﻜﻞ ﻣﺆﻗﺖ وھﻮ
ﻋﺒﺎرة ﻋﻦ ﺻﻨﺪوق ﺗﻮﺿﻊ ﺑﮫ اﻟﺒﯿﺎﻧﺎت ﺑﺎﻟﯿﺔ اﻟﺪاﺧﻞ أوﻻ اﻟﺨﺎرج أﺧﺮا واﻟﺪاﺧﻞ أﺧﺮا اﻟﺨﺎرج أوﻻ
)LIFO (LAST INPUT FIRST OUTPUT
وﻛﻤﺜﺎل ﺑﺴﯿﻂ أﯾﻀﺎ ﻧﺸﺒﮫ ﻋﻤﻠﺔ ﺑﻘﺸﻄﮫ اﻟﻤﺴﺪس اﻟﺮﺻﺎﺻﺔ اﻷوﻟﻰ ﺗﺨﺮج أﺧﺮ ﺷﻲء واﻟﺮﺻﺎﺻﺔ
اﻷﺧﯿﺮة ﺗﺨﺮج أوﻻً وﻟﮭﺬا ﻓﺎن اﻹﺿﺎﻓﺔ ﺗﺘﻢ ﻣﻦ اﻷﻋﻠﻰ واﻟﺤﺬف و ﯾﻮﺟﺪ ﻣﺆﺷﺮ واﺣﺪ ﯾﺴﻤﻰ . top
واﻟﻘﺮاءة أﯾﻀﺎ ﯾﺘﻢ ﻣﻦ اﻷﻋﻠﻰ إي ﻣﻦ ﻃﺮف واﺣﺪ ﻋﻦ ﻃﺮﯾﻖ topﻛﻤﺎ ﻓﻲ اﻟﺸﻜﻞ .15-1
1.4.1ﻓﻮاﺋﺪ اﻟﻤﻜﺪس
üإﯾﺠﺎد ﻗﯿﻢ اﻟﺘﻌﺎﺑﯿﺮ اﻟﺤﺴﺎﺑﯿﺔ
üﯾﺴﺘﺨﺪم ﻟﻐﺎﯾﺎت اﻻﺳﺘﺪﻋﺎء اﻟﺬاﺗﻲ
üﻓﻲ ﻋﻤﻠﯿﺎت اﻻﻋﺘﺮاض واﻟﻤﻘﺎﻃﻌﺔ اﻟﻤﺴﺘﺨﺪﻣﺔ ﺑﺎﻟﻮﯾﻨﺪوز
üاﺳﺘﺪﻋﺎء اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ
وﻣﻦ اﻹﺷﻜﺎل اﻟﺴﺎﺑﻘﺔ ﻧﺠﺪ أن اﻟﻤﻜﺪس ﻻ ﯾﺤﺘﻮي إﻻ ﻋﻠﻰ ﻣﺆﺷﺮ واﺣﺪ ﻓﻘﻂ TOP
ﻓﻌﻨﺪﻣﺎ ﯾﻜﻮن اﻟﻤﻜﺪس ﻓﺎرﻏﺎُ ﻓﺄن TOP=-1وﻋﻨﺪ إدﺧﺎل أول ﻗﯿﻤﺔ ﻓﺈﻧﻨﺎ ﻧﺰﯾﺪ ﻣﻦ
ﻗﯿﻤﺔ ++ TOPوﻛﻞ ﻣﺎ أدﺧﻠﻨﺎ ﻗﯿﻤﺔ ﻓﺎن اﻟﻤﺆﺷﺮ ﯾﺰﯾﺪ ﺑﻤﻘﺪار واﺣﺪ إﻟﻰ أن ﯾﻤﺘﻠﺊ اﻟﻤﻜﺪس
واﻟﺸﻜﻞ 15-2ﯾﺒﯿﻦ ذﻟﻚ.
ﺷﻜﻞ 15-2
وﻋﻤﻠﯿﺔ أﺧﺮاج اﻟﻘﯿﻢ ﻣﻦ اﻟﻤﻜﺪس ﻓﺈﻧﻨﺎ ﻧﻨﻘﺺ اﻟﻤﺆﺷﺮ ﺑﻤﻘﺪار واﺣﺪ أﯾﻀﺎ إﻟﻰ أن ﯾﺼﻞ ﻗﯿﻤﺔ اﻟﻤﺆﺷﺮ
= 1-أو NULLﻓﺒﮭﺎﻛﺪا ﯾﻜﻮن اﻟﻤﻜﺪس ﻓﺎرﻏﺎُ.
15-3 ﺷﻜﻞ
( وإذا أردﻧﺎ إﺧﺮاج ﻗﯿﻤﺔ ﻓﺎن اﻟﻤﻜﺪسX) ( وأدﺧﻠﻨﺎ أﺧﺮ ﻗﯿﻤﺔ4 ) وﻟﻨﻔﺘﺮض أن ﻟﺪﯾﻨﺎ ﻣﺼﻔﻮﻓﺔ ﺣﺠﻢ
15-3 ( ﻛﻤﺎ ﻓﻲ اﻟﺸﻜﻞx) ﺳﯿﻌﻄﻲ ﻟﻨﺎ أﺧﺮ ﻗﯿﻤﺔ دﺧﻠﺖ وھﻲ
وھﺬا أول ﺑﺮﻧﺎﻣﺞ ﻟﮫ ﯾﻌﻤﻞ ﻋﻠﻰ إدﺧﺎل ﻗﯿﻢ داﺧﻞ اﻟﻤﻜﺪس ﺛﻢ ﯾﻘﻮم ﺑﻄﺒﺎﻋﺘﮫ
1. //ArrayStack
2. import java.io.*;
3. class Chp15_1 {
4. static final int CAPACITY = 5;
5. static int[] Stack1 = new int[CAPACITY];
6. static int top = -1;
7.
8. static boolean isEmpty(){return (top < 0);}
9.
10. static boolean isFull() {return (top+1== CAPACITY);}
11.
12. static void push(int element){
13. if (isFull())
14. System.out.println("Stack is full.");
15. else
16. Stack1[++top] = element;
17. }
18.
19. static int pop() {
20.
21. if (isEmpty()){
22. System.out.println("Stack is
empty.");
23. System.exit( 0 );
24. }
25. return Stack1[top--];
26. }
Aldopaee@ho tmail.co m 483 ﻋﻤﺎر ﻣﺤﻤﺪ ﻋﯿﺴﻰ اﻟﺪﺑﻌﻲ/اﻟﻤﮭﻨﺪس
27.
{ 28. public static void main(String args[])throws IOException
;29. String num
= 30. BufferedReader br new BufferedReader(new
;))InputStreamReader(System.in
;) "31. System.out.println( "Enter first integer
))(32. while(!isFull
33. ;)({num=br.readLine
34. ;))push(Integer.parseInt(num
35. }
36.
;)" "37. while(!isEmpty())System.out.println(pop()+
38.
} 39.
} 40.
ﺷﺮح اﻟﻤﺜﺎل:
ﻓﻲ اﻟﺴﻄﺮ 6ﺗﻢ ﺗﻌﺮﯾﻒ Topوﯾﺴﻤﻰ ذﯾﻞ اﻟﻤﻜﺪس وھﻮ ﻣﺘﻐﯿﺮ ﻋﺎم ﺗﺴﺘﻄﯿﻊ اﻟﺪوال اﻟﻮﺻﻮل إﻟﯿﺔ
وﺗﻐﯿﺮ ﻗﯿﻤﺘﮫ .
اﻟﺴﻄﺮ 19داﻟﺔ أﺧﺮاج اﻟﺒﯿﺎﻧﺎت ﻣﻦ اﻟﻤﻜﺪس
اﻟﺴﻄﺮ 12داﻟﺔ إدﺧﺎل اﻟﺒﯿﺎﻧﺎت ﻣﻦ اﻟﻤﻜﺪس وھﻲ ﺗﺄﺧﺬ ﺑﺎ را ﻣﺘﺮ ﻣﻦ ﻧﻮع ﻣﺼﻔﻮﻓﺔ وﻣﻦ ﻧﻮع أﻧﺘﺠﺮ
ﻧﻌﻠﻢ أن اﻟﻤﻜﺪس ﻣﻤﺘﻠﺊ ﻋﻨﺪﻣﺎ ﯾﻜﻮن ﻣﺆﺷﺮ اﻟﺬﯾﻞ أي = topﺣﺠﻢ اﻟﻤﺼﻔﻮﻓﺔ 1-
وإﻻ ﺳﻨﺰﯾﺪ ﻣﻦ اﻟﻤﺆﺷﺮ ﺑﻮاﺣﺪ وﺳﻨﻀﻊ اﻟﻘﯿﻤﺔ ﺑﺪاﺧﻞ اﻟﻤﺼﻔﻮﻓﺔ ﺑﺪاﺧﻞ اﻟﻤﻮﻗﻊ اﻟﺬي ﺗﻜﻮن ﻗﯿﻤﺘﮫ top
STACK TOP ,PUSH,POPﻛﻞ ھﺬه اﻟﺘﻌﺎﺑﯿﺮ ﻋﺒﺎرة ﻋﻦ أﺳﻤﺎء ﻣﺘﻐﯿﺮات وﻟﯿﺲ ﻣﻦ اﻟﻀﺮوري
اﻟﺘﻘﯿﺪ ﺑﮭﺬه اﻷﺳﻤﺎء ﻓﮭﻲ ﻟﯿﺴﺖ دوال .
ﻧﻌﻠﻢ أن اﻟﻤﻜﺪس أﺻﺒﺢ ﻓﺎرﻏﺎً ﻋﻨﺪﻣﺎ ﺗﻜﻮن ﻗﯿﻤﺔ اﻟﻤﺆﺷﺮ 1- = topأي اﻗﻞ ﻣﻦ اﻟﺼﻔﺮ
وإﻻ ﺳﻨﺨﺮج اﻟﻘﯿﻤﺔ ﻣﻦ داﺧﻞ اﻟﻤﺼﻔﻮﻓﺔ اﻟﺘﻲ ﺗﺤﻤﻞ ﻋﻨﻮان ﻗﯿﻤﺔ topوﺳﻨﻄﺮح ﻗﯿﻤﺔ اﻟﻤﺆﺷﺮ ﺑﻮاﺣﺪ .
ﯾﺘﺒﯿﻦ ﻟﻨﺎ إﻟﯿﮫ ﻋﻤﻞ اﻟﻤﻜﺪس ﻓﯿﺎ أﺣﺒﺎﺑﻲ ﻻ ﯾﺨﯿﻔﻜﻢ ھﺬا اﻟﻤﺼﻄﻠﺢ15-4 وﻣﻦ اﻟﻤﺜﺎل اﻟﺴﺎﺑﻖ واﻟﺸﻜﻞ
.ً ﻣﺼﻔﻮﻓﺔ وﻻ ﯾﺨﺘﻠﻒ ﻋﻨﮭﺎ إﻟﻰ ﺑﺸﻲء واﺣﺪ أﻻ وھﻲ إﻟﯿﮫ ﻋﻤﻠﺔ اﻟﺘﻲ ذﻛﺮﻧﺎھﺎ ﺳﺎﺑﻘﺎSTACK اﻟﻐﺮﯾﺐ
pop وﻛﻤﺜﺎل أﺧﺮ ﺳﻨﻘﻮم ﺑﺎﺳﺘﺨﺮاج اﻛﺒﺮ ﻗﯿﻤﺔ ﺑﺎﻟﻤﻜﺪس ﻓﻘﻂ ﺳﯿﻜﻮن اﻟﺘﻐﯿﺮ ﻓﻲ داﻟﺔ أﻹﺧﺮاج
:ﺷﺮح اﻟﻤﺜﺎل
اﻋﺘﻘﺪ أن اﻟﻤﺜﺎل واﺿﺢ وﺑﺴﯿﻂ وﻻ ﯾﻮﺟﺪ ﺑﺔ إي ﺗﻌﻘﯿﺪ ﻓﻘﻂ اﻻﺧﺘﻼف ﺑﯿﻨﺔ وﺑﯿﻦ اﻟﺒﺮﻧﺎﻣﺞ اﻟﺴﺎﺑﻖ ھﻮ
. اﻟﺘﻲ ﺗﻌﯿﺪ ﻟﻨﺎ أﻛﺒﺮ ﻗﯿﻤﺔ ﺑﺪاﺧﻞ اﻟﻤﻜﺪسmax إﺿﺎﻓﺔ ﻣﻨﮭﺎج
اﻵن إذا ﻃﻠﺐ ﻣﻨﻚ إن ﺗﺪﺧﻞ ﺑﯿﺎﻧﺎت إﻟﻰ, إﻻ اﻵن اﻋﺘﻘﺪ ﻗﺪ ﺗﺒﺜﺚ ﻓﻜﺮة اﻟﻤﻜﺪس واﻟﯿﺔ ﻋﻤﻠﺔ ﻓﻲ ذھﻨﻚ
اﻟﻤﻜﺪس وﺗﻌﻜﺲ اﻟﻤﻜﺪس ﻓﻜﯿﻒ ذﻟﻚ ﺳﯿﻜﻮن ﻓﻜﺮ ﻗﻠﯿﻼُ وﺗﺬﻛﺮ إﻟﯿﺔ ﻋﻤﻞ اﻟﻤﻜﺪس وﻻ ﺗﻘﻮل ﻧﻘﻮم ﺑﻄﺒﺎﻋﺔ
..... اﻟﻤﺼﻔﻮﻓﺔ ﻣﻦ اﻟﺒﺪاﯾﺔ ﻓﮭﺬا ﻟﯿﺲ ﺻﺤﯿﺤﺎُ ﻓﻘﺪ ﺧﻠﯿﺖ ﻣﻦ ﻋﻤﻠﺔ
.......ھﺎ ھﻞ أﺗﺖ اﻟﻔﻜﺮة ﺑﻌﻘﻠﻚ ﺣﺎول وﻻ ﺗﺴﺘﻌﺠﻞ
ﯾﺒﺪو ﻟﻲ أن اﻟﻔﻜﺮة ﻟﻢ ﺗﺄﺗﻲ إﻟﯿﻚ إذن ﺻﻠﻲ ﻋﻠﻰ ﻧﺒﯿﻚ وﺗﺘﺒﻊ اﻟﺒﺮﻧﺎﻣﺞ اﻟﺘﺎﻟﻲ ﺑﮭﺪوء
:ﺷﺮح اﻟﻤﺜﺎل
وﻧﻌﺮض اﻵن ﻣﺜﺎل ﯾﺴﺘﺨﺪم ﺟﻤﯿﻊ اﻟﻤﻨﺎھﺞ اﻟﺘﻲ ذﻛﺮت ﻓﻲ اﻟﺠﺪول اﻟﺴﺎﺑﻖ:
ﺷﺮح اﻟﻤﺜﺎل:
ﻓﻲ اﻟﺴﻄﺮ 8ﺗﻢ اﺷﺘﻘﺎق ﺻﻨﻒ ﺟﺪﯾﺪ ﺑﺎﺳﻢ stackﻣﻦ اﻟﻤﻜﺘﺒﺔ اﻟﺨﺎﺻﺔ ﺑﺎﻟﺘﻌﺎﻣﻞ ﻣﻊ اﻟﻤﻜﺪس .وﻓﻲ
اﻟﺴﻄﺮ 13ﺗﻢ إدﺧﺎل إﻟﻰ اﻟﻤﻜﺪس اﻟﻌﻨﺎﺻﺮ ﺑﻮاﺳﻄﺔ اﻟﺘﻌﻠﯿﻤﺔ , pushوﺗﻼﺣﻆ أﻧﻨﺎ ﻗﻤﻨﺎ ﺑﻌﻤﻠﯿﺔ اﻟﺘﺤﻮﯾﺮ
new Integerﻟﻨﺤﺪد ﻧﻮع اﻟﺒﯿﺎﻧﺎت اﻟﺘﻲ ﺳﯿﺨﺰﻧﮭﺎ اﻟﻤﻜﺪس.
ﻓﻲ اﻟﺴﻄﺮ 27ﻧﻔﺲ ﻗﻤﻨﺎ ﺑﺎﻟﺒﺤﺚ ﻋﻦ ﻋﻨﺼﺮ .وﻧﻼﺣﻆ أن اﻟﺘﻌﻠﯿﻤﺔ searchﺗﻌﻄﻲ ﻟﻨﺎ ﻣﻮﻗﻊ اﻟﻌﻨﺼﺮ
إن وﺟﺪ وإﻻ ﺗﻌﯿﺪ اﻟﻘﯿﻤﺔ 1-ﻓﻲ ﺣﺎﻟﺔ إﻧﮭﺎ ﻟﻢ ﺗﺠﺪه.
ﻓﻲ اﻟﺴﻄﺮ 34ﻗﻤﻨﺎ ﺑﺤﺬف ﻗﯿﻤﺔ ﻋﻨﺼﺮ ﺑﻮاﺳﻄﺔ ﻗﯿﻤﺔ اﻟﻤﻮﻗﻊ.
ﻣﻦ اﻷﺧﻄﺎء اﻟﺸﺎﺋﻌﺔ إﻓﺮاغ اﻟﻤﻜﺪس ﺑﻮاﺳﻄﺔ ا ﻟﺘﻌﻠﯿﻤﺔ popوﻣﻦ ﺛﻢ ﻧﻘﻮم اﻟﺒﺤﺚ ﻋﻦ ﻋﻨﺼﺮ أو
ﺣﺬف ﻋﻨﺼﺮ .ﻣﻤﺎ ﯾﺴﺒﺐ ﻟﻨﺎ ﺧﻄﺎء ﻓﻲ زﻣﻦ اﻟﺘﻨﻔﯿﺬ.
ﻋﺪم اﺳﺘﺨﺪام ﻋﻤﻠﯿﺔ ﺗﺤﺪﯾﺪ اﻟﻤﻌﻄﯿﺎت أﺛﻨﺎء إدﺧﺎل اﻟﻘﯿﻢ ﻟﻠﻤﻜﺪس أو ﺑﺤﺚ ﻋﻦ ﻗﯿﻢ ,ﻣﻤﺎ ﯾﺴﺒﺐ
ﻟﻨﺎ ﺧﻄﺎء ﻗﻮاﻋﺪي.
1.5.1أﻧﻮاع اﻟﻄﻮاﺑﯿﺮ
ﻃﺎﺑﻮر ﺧﻄﻲ
وھﻮ ﻟﮫ ﺣﺠﻢ ﻣﺤﺪود وﺷﺮط اﻣﺘﻼﺋﮫ أن ﺗﻜﻮن ﻗﯿﻤﺔ اﻟﺬﯾﻞ ﺗﺴﺎوي ﺣﺠﻢ اﻟﻤﺼﻔﻮﻓﺔ .
ﺷﻜﻞ 15-5
(2ﻃﺎﺑﻮر داﺋﺮي /ﻧﻔﺲ ﺗﻌﺮﯾﻒ اﻟﺴﺎﺑﻖ إﻟﻰ أن ﺷﺮط اﻻﻣﺘﻼء ﯾﺨﺘﻠﻒ ﻋﻦ اﻟﺴﺎﺑﻖ اﻟﺮأس = 1و اﻟﺬﯾﻞ
= ﺣﺠﻢ اﻟﻤﺘﺠﮫ أو اﻟﺮأس=اﻟﺬﯾﻞ 1 +ﻛﻤﺎ ﻓﻲ اﻟﺸﻜﻞ .15-6
ﻧﺠﺪ ﻓﻲ اﻟﺒﺪاﯾﺔ ﯾﻜﻮن اﻟﺮأس واﻟﺬﯾﻞ ﻻ ﯾﺆﺷﺮان ﻷي ﻣﻮﻗﻊ وﻟﻤﻌﺮﻓﺔ أن اﻟﻄﺎﺑﻮر ﻟﻢ ﺗﺪﺧﻞ إﻟﯿﺔ إي ﻗﯿﻤﺔ
ﻋﻨﺪﻣﺎ ﯾﻜﻮن ) if(tail==-1||head==-1واﻟﺸﻜﻞ 15-7ﯾﻮﺿﺢ ذﻟﻚ.
ﺷﻜﻞ 15-7
وﻋﻨﺪ إدﺧﺎل أول ﻗﯿﻤﺔ ﯾﺼﺒﺢ ﻗﯿﻤﺔ اﻟﺮأس واﻟﺬﯾﻞ = 0ﻛﻤﺎ ﻓﻲ اﻟﺸﻜﻞ .15-8
ﺷﻜﻞ 15-8
وﻋﻨﺪ إدﺧﺎل ﺛﺎﻧﻲ ﻗﯿﻤﺔ ﻧﺰﯾﺪ ﻣﻦ ﻗﯿﻤﺔ اﻟﺬﯾﻞ ﺑﻮاﺣﺪ ﻓﻘﻂ أم اﻟﺮأس ﯾﺒﻘﻰ ﻛﻤﺎ ھﻮ ,ﻛﻤﺎ ﻓﻲ اﻟﺸﻜﻞ .15-9
ﺷﻜﻞ 15-9
ﺷﻜﻞ 15-10
ﺷﻜﻞ 15-11
*( اﻟﺒﺤﺚ
ﻧﻔﺲ اﻟﺒﺮﻧﺎﻣﺞ اﻟﺴﺎﺑﻖ إﻟﻰ إﻧﻨﺎ ﻻ ﻧﻘﻮم ﺑﺨﻠﻖ ﻃﺎﺑﻮر وﻧﻘﻞ ﺑﻞ إﻧﻨﺎ ﻧﺒﺤﺚ ﻋﻠﯿﺔ إن وﺟﺪ ﻧﻄﺒﻌﮫ وإﻻ ﻧﻄﺒﻊ
: ﻛﻤﺎ ﯾﻠﻲ. إﻧﻨﺎ ﻟﻢ ﻧﺤﺼﻞ ﻋﻠﯿﺔ
اﻟﻄﺎﺑﻮر اﻟﺪاﺋﺮي
ﻧﻔﺲ اﻟﺒﺮاﻣﺞ اﻟﺘﻲ ذﻛﺮﻧﺎھﺎ ﺳﺎﺑﻘﺎُ واﻻﺧﺘﻼف ﺳﯿﻜﻮن ﻓﻲ أواﻣﺮ اﻟﺸﺮط
. if(head==tail+1) ُﯾﻜﻮن اﻟﻄﺎﺑﻮر ﻓﺎرﻏﺎ
. if(tail!=size&&head=1) ﯾﻜﻮن اﻟﻄﺎﺑﻮر ﻏﯿﺮ ﻣﻤﺘﻠﺊ
.if(head==1&&tail==size) ﯾﻜﻮن اﻟﻄﺎﺑﻮر ﻣﻤﺘﻠﺌﺎ
.وﻧﻔﺲ اﻟﺒﺮاﻣﺞ اﻟﺘﻲ ذﻛﺮﺗﮭﺎ ﺑﺎﻟﻤﻜﺪس ﺗﻄﺒﻖ ﻋﻠﻰ اﻟﻄﻮاﺑﯿﺮ ﺑﺎﻟﯿﺔ اﻟﻄﺎﺑﻮر
أﻧﻮاع اﻟﻘﻮاﺋﻢ
üاﻟﻘﻮاﺋﻢ اﻷﺣﺎدﯾﺔ.
üاﻟﻘﻮاﺋﻢ اﻟﻤﺬﺑﻠﺔ أي اﻟﺜﻨﺎﺋﯿﺔ.
üاﻟﻘﻮاﺋﻢ اﻟﺪاﺋﺮﯾﺔ.
1.6.1اﻟﻘﻮاﺋﻢ اﻷﺣﺎدﯾﺔ
ﺗﺸﺒﮫ ﺣﺒﻞ اﻟﻐﺴﯿﻞ ﺗﻌﻠﻖ ﻋﻠﯿﺔ اﻟﺒﯿﺎﻧﺎت ﺗﺘﺎﻟﯿﺎُ إذا ﻛﺎن اﻹدﺧﺎل ﻓﻲ ﻧﻔﺲ اﻟﻮﻗﺖ وﯾﻮﺟﺪ ﻋﻨﻮان راﺳﻲ
ﯾﺆﺷﺮ إﻟﻰ أول ﻋﻨﺼﺮ ﻣﻦ اﻟﻼﺋﺤﺔ وﯾﺴﻤﻰ headوﯾﻮﺟﺪ ﻋﻨﻮان ﻧﮭﺎﺋﻲ ﯾﺆﺷﺮ إﻟﻰ أﺧﺮ ﻋﻨﺼﺮ
ﻣﻦ اﻟﻼﺋﺤﺔ وﯾﺴﻤﻰ tailوﻛﻞ ﻋﻘﺪة ﺗﺆﺷﺮ إﻟﻰ اﻟﻌﻘﺪة اﻟﺘﺎﻟﯿﺔ وأﺧﺮ ﻋﻘﺪة ﺗﻜﻮن ﻗﯿﻤﺔ اﻟﻤﺆﺷﺮ ﻟﮭﺎ
NULLو ﺗﻜﻮن ﻛﻤﺎ ﻓﻲ اﻟﺸﻜﻞ 15-12
ﺷﻜﻞ 15-12
وﻟﯿﺲ ﻣﻦ اﻟﻀﺮوري أن ﺗﻜﻮن اﻟﻌﻘﺪ ﻣﺮﺗﺒﺔ ﺑﺸﻜﻞ ﻣﺘﺘﺎﻟﻲ ﻓﻲ اﻟﺬاﻛﺮة ﻓﮭﻲ ﺗﻜﻮن ﻣﺒﻌﺜﺮة ﻓﻲ اﻟﺬاﻛﺮة
ﻻن اﻟﺠﮭﺎز اﻟﺬي ﯾﺤﺠﺰھﺎ ﻓﻲ اﻟﺬاﻛﺮة وﻟﯿﺲ اﻟﯿﻮزر ﻟﻜﻨﮭﺎ ﻣﺘﺼﻠﺔ ﻓﯿﻤﺎ ﺑﯿﻨﮭﺎ ﺑﻮاﺳﻄﺔ اﻟﻤﺆﺷﺮات و
اﻟﺸﻜﻞ 15-13ﯾﺒﯿﻦ ﻛﯿﻒ ﺗـﻜﻮن ﺷﻜﻠﮭﺎ .
ﺷﻜﻞ 15-13
:ﺷﺮح اﻟﻤﺜﺎل
: Node ﺳﻨﺒﺪأ ﺑﺸﺮح اﻟﻤﻨﺎھﺞ اﻟﻤﻀﺎﻓﺔ ﻟﻠﺼﻨﻒ
. ﻣﻨﮭﺞ ﯾﻌﯿﺪ ﻟﻨﺎ ﻗﯿﻤﺔ اﻟﻌﻘﺪة38 اﻟﺴﻄﺮ
. ﻣﻨﮭﺞ ﯾﻌﯿﺪ ﻟﻨﺎ ﻣﻮﻗﻊ اﻟﻌﻘﺪة اﻟﺘﺎﻟﯿﺔ40 اﻟﺴﻄﺮ
.element ﻣﻨﮭﺞ ﯾﺨﺰن ﻗﯿﻤﺔ ﻣﺮﺳﻠﺔ ﻟﻠﻌﻘﺪة ﻓﻲ اﻟﻤﺘﺤﻮل43 اﻟﺴﻄﺮ
.next ﻣﻨﮭﺞ ﯾﺨﺰن ﻣﻮﻗﻊ ﻋﻘﺪة ﻣﺮﺳﻠﺔ ﻟﻠﻌﻘﺪة ﻓﻲ اﻟﻤﺘﺤﻮل45 اﻟﺴﻄﺮ
ﻣﻦ ﻧﻮعtail ﻣﺆﺷﺮ ﻟﻌﻘﺪة وھﻮ اﻟﺮأس وNode ﻣﻦ ﻧﻮعhead ( ھﻨﺎ ﻋﺮﻓﻨﺎ6 - 4 ) اﻷﺳﻄﺮ
. ﺳﻨﺴﺘﺨﺪﻣﮫ ﻛﻤﺘﻐﯿﺮ ﻹدﺧﺎل ﺑﯿﺎﻧﺎت اﻟﻌﻘﺪnode ﻣﺆﺷﺮ ﻟﻌﻘﺪة وھﻮ اﻟﺬﯾﻞ وNode
إﻟﻰ اﻟﺘﻮاﺑﻊ اﻟﺨﺎﺻﺔ ﺑﺎﻟﻌﻘﺪة ﻷﻧﺔ ﯾﺠﺐ إﻋﻄﺎء ﻗﯿﻢ اﺑﺘﺪاﺋﯿﺔ ﻟﮭﺎ ﻗﺒﻞ اﻟﺘﻌﺎﻣﻞnull ﻗﻢ ﺑﺈﺳﻨﺎد اﻟﻘﯿﻤﺔ
.ﻣﻌﮭﺎ
ﻋﻨﺪ إﻧﺸﺎء اﻟﻌﻘﺪ ﯾﺠﺐ أن ﺗﻨﺸﺊ أول ﻋﻘﺪة ﺑﻤﻔﺮدھﺎ ﺣﺘﻰ ﯾﺘﻢ ﻣﺴﺎواة اﻟﺮأس واﻟﺬﯾﻞ ﺑﮭﺎ.
اﻷﺳﻄﺮ ) (15 - 10ھﻨﺎ ﺳﻨﻜﻮٌن 4ﻋﻘﺪ أﺿﺎﻓﯿﺔ ﺑﺠﺎﻧﺐ اﻷوﻟﻰ ﻓﯿﻜﻮن ﻟﺪﯾﻨﺎ 5ﻋﻘﺪ .
اﻟﺴﻄﺮ 13ﯾﺒﯿﻦ أن ﺣﻘﻞ اﻟﻌﻘﺪة اﻷوﻟﻰ ﯾﺴﺎوي اﻟﻌﻘﺪة اﻟﺠﺪﯾﺪة .ﻓﺒﮭﺬه اﻟﺤﺎﻟﺔ ﺗﻤﺖ ﻋﻤﻠﯿﺔ اﻟﺮﺑﻂ ﺑﯿﻦ
اﻟﻌﻘﺪﺗﯿﻦ ﺑﻘﻲ ﻋﻠﯿﻨﺎ ﻧﻘﻞ اﻟﺬﯾﻞ إﻟﻰ اﻟﻌﻘﺪة اﻟﺠﺪﯾﺪة tail=nodeﻛﻤﺎ ﻓﻲ اﻟﺴﻄﺮ . 14
وھﻜﺬا ﺑﺒﺎﻗﻲ اﻟﻌﻘﺪ إﻟﻰ أن ﯾﻨﺘﮭﻲ ﻋﻤﻞ اﻟﻠﻮب وﯾﻤﻜﻨﻚ ﺗﻜﻮﯾﻦ ﻣﺌﺎت اﻟﻌﻘﺪ ﺑﮭﺬه اﻟﻄﺮﯾﻘﺔ واﻟﺸﻜﻞ 15-15
ﯾﺒﻦ اﻟﺸﺮح .
اﻷﺳﻄﺮ ) (23 - 17ﻓﻲ ﻋﻤﻠﻲ ﻃﺒﺎﻋﺔ اﻟﻌﻘﺪ أول ﺷﻲ ﯾﺠﺐ أن ﺗﻌﻤﻠﮫ ھﻮ اﻟﻮﺻﻮل ﻷول ﻋﻘﺪة ﻓﻜﯿﻒ
ﺳﺘﻌﻤﻞ ﻟﻮ ﺗﺘﺬﻛﺮ ﻗﻠﯿﻞ أن أول ﻣﺎ أﻧﺸﺎﻧﺎ أول ﻋﻘﺪة ﺳﺎوﯾﻨﺎ اﻟﺮأس واﻟﺬﯾﻞ ﺑﮭﺎ وﺑﻌﺪ ذﻟﻚ ﻛﺎن ﻛﻞ ﻣﺎ أﺿﻔﻨﺎ
ﻋﻘﺪة ﺟﺪﯾﺪة ﺗﺤﺮك ﻣﻌﺎﻧﺎ اﻟﺬﯾﻞ وأﺻﺒﺢ اﻟﺬﯾﻞ ﺑﻤﺆﺧﺮة اﻟﻌﻘﺪ واﻟﺮأس ﻓﻲ ﺑﺪاﯾﺔ اﻟﻌﻘﺪ .إذن =node
headﻓﻨﻜﻮن وﺻﻠﻨﺎ إﻟﻰ أول ﻋﻘﺪة ﻛﻤﺎ ﻓﻲ اﻟﺴﻄﺮ. 17
ﺑﻘﻲ ﻋﻠﯿﻨﺎ ﻃﺒﺎﻋﺔ اﻟﻌﻘﺪ واﻟﺘﻨﻘﻞ إﻟﻰ اﻟﻌﻘﺪة اﻟﺘﺎﻟﯿﺔ ﻛﻤﺎ ﻓﻲ اﻟﺴﻄﺮ .22ﺑﻤﻌﻨﻰ أن اﻟﻌﻘﺪة اﻟﺘﻲ واﻗﻔﯿﻦ ﻋﻠﯿﮭﺎ
ﺗﺴﺎوي ﺣﻘﻞ اﻟﻌﻘﺪة ﻧﻔﺴﮭﺎ اﻟﺘﻲ داﺧﻠﺔ ﻣﻮﻗﻊ اﻟﻌﻘﺪة اﻟﺘﺎﻟﯿﺔ ﻓﺒﺬﻟﻚ ﻧﻜﻮن ﻗﺪ اﻧﺘﻘﻠﻨﺎ إﻟﻰ اﻟﻌﻘﺪة اﻟﺘﺎﻟﯿﺔ وﺗﺴﺘﻤﺮ
ھﺬه اﻟﻌﻤﻠﯿﺔ إﻟﻰ أن ﺗﺴﺎوي اﻟﻌﻘﺪة NULLﻓﯿﻨﺘﮭﻲ ﻋﻤﻞ اﻟﻠﻮب .
ﻟﺸﻜﻞ 15-15
أم اﻹﺿﺎﻓﺔ ﻣﻦ اﻟﯿﺴﺎر ﻧﻔﺲ اﻟﻤﺜﺎل اﻟﺴﺎﺑﻖ إﻻ أن اﻻﺧﺘﻼف ﻓﻘﻂ ﺑﻌﻤﻠﯿﺔ إدﺧﺎل اﻟﻌﻘﺪ اﻟﺜﺎﻧﯿﺔ وﻣﺎ ﺑﻌﺪھﺎ
)for (int i=1;i<size;i++
{
;)node=new Node(i
;)node.setNext(head
;head=node
}
اﻹﺿﺎﻓﺔ ﻣﻦ اﻟﯿﻤﯿﻦ ﯾﻜﻮن اﻟﺮأس ﻣﺘﺤﺮك واﻹﺿﺎﻓﺔ ﻣﻦ اﻟﯿﻤﻦ ﯾﻜﻮن اﻟﺬﯾﻞ ھﻮ اﻟﻤﺘﺤﺮك .
وھﺬا ﻣﺜﺎل ﻋﻠﻰ إﺿﺎﻓﺔ ﻋﻘﺪة ﺑﻌﺪ ﻗﯿﻤﺔ ﻋﻘﺪة ﯾﺮﯾﺪھﺎ اﻟﻤﺴﺘﺨﺪم :
ﺷﺮح اﻟﻤﺜﺎل:
ﺑﻌﺪ إدﺧﺎل اﻟﻌﻘﺪ ﻃﻠﺒﻨﺎ ﻣﻦ اﻟﻤﺴﺘﺨﺪم إدﺧﺎل ﻗﯿﻤﺔ ﻓﺈذا وﺟﺪت ھﺬه اﻟﻘﯿﻤﺔ ﺑﺎﻟﻘﺎﺋﻤﺔ ﺳﻨﻀﻊ اﻟﻌﻘﺪة اﻟﺠﺪﯾﺪة
ﺑﻌﺪھﺎ ﻣﺒﺎﺷﺮة .
ﻓﻌﻤﻠﻨﺎ ﻋﻤﻠﯿﺔ ﺑﺤﺖ ﻋﻦ اﻟﻌﻨﺼﺮ إذا وﺟﺪ ﻓﺈﻧﻨﺎ ﺳﻨﻌﻤﻞ ﻋﻠﻰ إﻧﺸﺎء ﻋﻘﺪة ﺟﺪﯾﺪة وﺳﻨﺪﺧﻞ ﻗﯿﻤﺔ اﻟﻌﻘﺪة
وﺳﻨﺮﺑﻂ ﺣﻘﻞ ﻣﺆﺷﺮ اﻟﻌﻘﺪة اﻟﺠﺪﯾﺪة ﺑﺎﻟﻌﻘﺪة اﻟﺘﻲ ﺑﻌﺪ اﻟﻌﻨﺼﺮ واﻟﻌﻘﺪة اﻟﺘﻲ ﻣﺎزﻟﻨﺎ واﻗﻔﯿﻦ ﻋﻠﯿﮭﺎ ﺗﻢ رﺑﻂ
ﻣﺆﺷﺮھﺎ ﺑﺎﻟﻌﻘﺪة اﻟﺠﺪﯾﺪة ﻛﻤﺎ ﻓﻲ اﻷﺳﻄﺮ ) (44 - 35واﻟﺸﻜﻞ 15-16ﯾﺒﯿﻦ ھﺬه اﻟﻌﻤﻠﯿﺔ .
ﺷﻜﻞ 15-16
ﺗﺤﺪﺛﻨﺎ ﻋﻦ اﻟﮭﯿﺎﻛﻞ اﻹﺳﺘﺎﺗﯿﻜﯿﮫ أي اﻟﺜﺎﺑﺘﺔ وﺗﻜﻠﻤﻨﺎ ﻋﻦ اﻟﻤﻜﺪﺳﺎت واﻟﻄﻮاﺑﯿﺮ ﻟﻨﻌﻤﻞ ﻋﻠﻰ ﺗﻄﺒﯿﻖ ﺗﻠﻚ
اﻟﺨﻮارزﻣﯿﺎت ﺑﺎﻟﻘﻮاﺋﻢ اﻷﺣﺎدﯾﺔ وﻧﺠﻌﻠﮭﺎ ﻣﺘﻐﯿﺮة أي دﯾﻨﺎﻣﯿﻜﯿﺔ وﻧﺘﺨﻠﺺ ﻣﻦ ﺷﻲء أﺳﻤﺔ اﻟﻤﻜﺪس ﻗﺪ اﻣﺘﻠﺊ
أو اﻟﻄﺎﺑﻮر ﻗﺪ اﻣﺘﻠﺊ واﻵن ﺳﻨﻮرد ﻣﺜﺎل ﻋﻦ اﻟﻤﻜﺪس ﺑﺎﺳﺘﺨﺪام اﻟﻘﻮاﺋﻢ اﻷﺣﺎدﯾﺔ واﻟﯿﺔ اﻹدﺧﺎل واﻹﺧﺮاج
ﻗﺪ ﺗﻜﻠﻤﻨﺎ ﻋﻨﮭﺎ ﻓﻲ اﻟﺴﺎﺑﻖ .
واﻟﯿﻜﻢ اﻟﻜﻮد :
• اﻟﺤﺬف )(DELETE
ھﻮ ﻋﻤﻠﯿﺔ ﺑﺴﯿﻄﺔ ﻓﻲ ﻻﺋﺤﺔ اﻟﻮﺻﻞ اﻟﺨﻄﯿﺔ ,ﻓﺘﻮﺻﻞ
وﺻﻠﺔ اﻟﻌﻨﺼﺮ اﻟﺬي ﯾﺄﺗﻲ ﻗﺒﻞ اﻟﻌﻨﺼﺮ اﻟﻤﺮاد ﺣﺬﻓﮫ
ﺑﻌﻨﻮان اﻟﻌﻨﺼﺮ اﻟﺬي ﯾﺮاد ﺣﺬﻓﮫ ﻓﺘﻌﺘﺒﺮ ﻋﻤﻠﯿﺔ ﻋﻜﺴﯿﺔ
ﻟﻌﻤﻠﯿﺔ اﻹﺿﺎﻓﺔ .
ﺷﻜﻞ 15-20
ﺷﻜﻞ 15-21
ﺷﻜﻞ 15-22
وﻣﻦ اﻟﺸﻜﻞ 15-22ﯾﺘﻀﺢ ﻟﻨﺎ ﺷﻜﻞ ھﺬه اﻟﻘﻮاﺋﻢ .وﺳﻨﻘﻮم اﻵن ﺑﺈﻧﺸﺎء ﺻﻨﻒ ﯾﻤﺜﻞ اﻟﻘﻮاﺋﻢ اﻟﻤﺬﺑﻠﺔ:
**1. /
2. * Class binary tree by storing references to
3. * an element, a parent node, a left node, and a right node.
4. */
{5. public class BTNode
;6. private int element // element stored at this
node
7. private BTNode left, right; // adjacent nodes
8. /** Main constructor */
}{)(9. public BTNode
10.
{ )11. public BTNode(int element
;)12. setElement(element
;)13. setLeft(null
;)14. setRight(null
15. }
16. /** Returns the element stored at this position */
.ﻧﻔﺲ اﻟﻌﻤﻠﯿﺎت اﻟﺘﻲ ﻃﺒﻘﺖ ﻋﻠﻰ اﻟﻘﻮاﺋﻢ اﻷﺣﺎدﯾﺔ ﺳﺘﻄﺒﻖ ﻋﻠﻰ اﻟﻘﻮاﺋﻢ اﻟﻤﺬﺑﻠﺔ
ﺷﺮح اﻟﻤﺜﺎل:
اﻷﺳﻄﺮ ) (5-4ﻋﺮﻓﻨﺎ headﻣﻦ ﻧﻮع DNODEﻣﺆﺷﺮ ﻟﺴﺠﻞ وھﻮ اﻟﺮأس و tailﻣﻦ ﻧﻮع
DNODEﻣﺆﺷﺮ ﻟﺴﺠﻞ وھﻮ اﻟﺬﯾﻞ و nodeﺳﻨﺴﺘﺨﺪﻣﮫ ﻛﻤﺘﻐﯿﺮ ﻹدﺧﺎل ﺑﯿﺎﻧﺎت اﻟﻌﻘﺪ .
اﻟﺴﻄﺮ 9ﺧﻄﻮة ﺿﺮورﯾﺔ وﻻﺑﺪ أن ﺗﻜﻮن ﻣﻨﻔﺮدة ﻋﻦ أﺧﻮاﺗﮭﺎ ﻟﻜﻲ ﻧﺴﺎوي اﻟﺮأس واﻟﺬﯾﻞ ﺑﺄول ﻋﻘﺪة .
اﻷﺳﻄﺮ ) (10 - 16ﺳﻨﻜﻮن 4ﻋﻘﺪ أﺿﺎﻓﯿﺔ ﺑﺠﺎﻧﺐ اﻷوﻟﻰ ﻓﯿﻜﻮن ﻟﺪﯾﻨﺎ 5ﻋﻘﺪ .
اﻟﺴﻄﺮ 13ﺗﺤﻮﯾﻞ ﺣﻘﻞ اﻟﺬﯾﻞ ﻣﻦ nullإﻟﻰ ﻋﻨﻮان اﻟﻌﻘﺪة اﻟﺠﺪﯾﺪة.
اﻟﺴﻄﺮ 14ﺣﻘﻞ اﻟﻌﻘﺪة اﻟﺜﺎﻧﯿﺔ ﯾﺴﺎوي اﻟﻌﻘﺪة اﻟﻘﺪﯾﻤﺔ إي اﻟﺬﯾﻞ.
ﻓﺒﮭﺬه اﻟﺤﺎﻟﺔ ﺗﻤﺖ ﻋﻤﻠﯿﺔ اﻟﺮﺑﻂ ﺑﯿﻦ اﻟﻌﻘﺪﺗﯿﻦ ﺑﻘﻲ ﻋﻠﯿﻨﺎ ﻧﻘﻞ اﻟﺬﯾﻞ إﻟﻰ اﻟﻌﻘﺪة اﻟﺠﺪﯾﺪة tail=nodeﻛﻤﺎ
ﻓﻲ اﻟﺴﻄﺮ 15وھﻜﺬا ﺑﺒﺎﻗﻲ اﻟﻌﻘﺪ إﻟﻰ أن ﯾﻨﺘﮭﻲ ﻋﻤﻞ اﻟﻠﻮب وﯾﻤﻜﻨﻚ ﺗﻜﻮﯾﻦ ﻣﺌﺎت اﻟﻌﻘﺪ ﺑﮭﺬه اﻟﻄﺮﯾﻘﺔ
واﻟﺸﻜﻞ 15-23ﯾﺒﻦ اﻟﺸﺮح .
ﺷﻜﻞ 15-23
أم اﻹﺿﺎﻓﺔ ﻣﻦ اﻟﯿﺴﺎر ﻧﻔﺲ اﻟﺴﺎﺑﻖ إﻻ أن اﻻﺧﺘﻼف ﻓﻘﻂ ﺑﻌﻤﻠﯿﺔ إدﺧﺎل اﻟﻌﻘﺪ اﻟﺜﺎﻧﯿﺔ وﻣﺎ ﺑﻌﺪھﺎ ﻛﮭﺬه
اﻟﺸﻔﺮة :
اﻹ ﺿﺎﻓﺔ ﻣﻦ اﻟﯿﻤﯿﻦ ﯾﻜﻮن اﻟﺮأس ﻣﺘﺤﺮﻛﺎ واﻹﺿﺎﻓﺔ ﻣﻦ اﻟﯿﻤﻦ ﯾﻜﻮن اﻟﺬﯾﻞ ھﻮ اﻟﻤﺘﺤﺮك.
ﺷﺮح اﻟﻤﺜﺎل:
اﻟﺴﻄﺮ 27ﻋﺮﻓﻨﺎ ﻣﺘﻐﯿﺮﯾﻦ ﻣﻦ ﻧﻮع DNODEوﺗﻌﺎﻣﻠﻨﺎ ﺑﻌﻤﻠﯿﺔ اﻟﺘﺮﺗﯿﺐ ﻛﺘﺮﺗﯿﺐ ﻣﺼﻔﻮﻓﺔ وھﺬه
اﻟﺨﻮارزﻣﯿﺔ ﻣﻌﺮوﻓﺔ وﻻ ﺟﺪﯾﺪ ﻓﯿﮭﺎ.
ھﻞ اﻛﺘﺸﻔﺖ ﻓﻜﺮة اﻟﺒﺮﻧﺎﻣﺞ ﻓﮭﻲ ﺳﮭﻠﺔ ﺟﺪاً وﻻ ﺗﺤﺘﺎج إﻟﻰ ﺟﮭﺪ وﺿﯿﺎع ﻟﻠﻮﻗﺖ !
إن ﻟﻢ ﺗﺘﻀﺢ ﻟﻚ اﻟﻔﻜﺮة ﯾﺎ ﻋﺰﯾﺰي ﻓﺼﻠﻲ ﻋﻠﻰ ﻣﻌﺪن اﻷﺳﺮار وﻣﻨﺒﻊ اﻵﻧﻮار ﺳﯿﺪﻧﺎ ﻣﺤﻤﺪ وﻋﻠﻰ آﻟﮫ
وﺻﺤﺒﺔ اﻷﻃﮭﺎر وﺗﺘﺒﻊ ھﺬا اﻟﻜﻮد.
ﺑﺮﻧﺎﻣﺞ اﻷﺿﺎﻓﺔ ﻣﻦ اﻟﯿﻤﯿﻦ ﻟﻠﻘﺎﺋﻤﺔ اﻟﺜﻨﺎﺋﯿﺔ*1. /
اﻷﻋﺪاد اﻟﺰوﺟﯿﺔ وﻣﻦ اﻟﯿﺴﺎر اﻷﻋﺪاد اﻟﻔﺮدﯾﺔ 2.
3. */
{ 4. class Chp15_16 extends DNODE
{)][5. public static void main(String args
;6. DNODE head=null // head DNODE of the list
;7. DNODE tail=null // tail DNODE of the list
;8. DNODE node=null
;9. int size=5
10.
;)11. tail=head=node=new DNODE(0
)12. for (int i=1;i<size;i++
{ 13.
14. if(i%2==0){//if number evn
15. ;)node=new DNODE(i
16. ;)tail.setNext(node
17. ;)node.setPrev(tail
18. ;tail=node
19. }
20. else
21. {//if number add
22. ;)node=new DNODE(i
23. ;)node.setNext(head
24. ;)head.setPrev(node
25. ;head=node
26. }
} 27.
28. //print DNODE
;29. node=head
:ﺷﺮح اﻟﻤﺜﺎل
ﻓﻜﺮة اﻟﺒﺮﻧﺎﻣﺞ ھﻲ ﺑﻌﺪ إﻧﺸﺎء أول ﻋﻘﺪة ﯾﺘﻢ إﻧﺸﺎء ﺛﺎﻧﻲ ﻋﻘﺪة وﯾﺘﻢ ﺗﻔﺤﺺ اﻟﻘﯿﻤﺔ ﻓﺈذا ﻛﺎﻧﺖ زوﺟﯿﮫ ﻓﺎن
.(26 - 14) ﻛﻤﺎ ﻓﻲ اﻷﺳﻄﺮ.اﻹﺿﺎﻓﺔ ﺳﺘﻜﻮن ﻣﻦ اﻟﯿﻤﯿﻦ وإﻻ ﺳﺘﻜﻮن اﻹﺿﺎﻓﺔ ﻣﻦ اﻟﯿﺴﺎر
ﻋﻤﻠﯿﺎت اﻟﺤﺬف
. ھﻲ ﻧﻔﺴﮭﺎ ﺗﻨﻔﺬ ﻓﻲ اﻟﻠﻮاﺋﺢ اﻟﺜﻨﺎﺋﯿﺔ,ﻛﻤﺎ ﻧﻔﺬت ﻋﻤﻠﯿﺔ اﻟﺤﺬف ﻓﻲ اﻟﻠﻮاﺋﺢ اﻷﺣﺎدﯾﺔ
اﻟﺸﻲء اﻟﺬي ﻧﺮﯾﺪ ﺗﻮﺿﯿﺤﮫ ھﻮ ﻋﻨﺪﻣﺎ ﯾﺮاد ﻣﻨﻚ ﺣﺬف ﻋﻘﺪة ﻣﻦ أي ﻣﻜﺎن ﻣﻊ اﻻﺣﺘﻔﺎظ ﺑﺮأس اﻟﻼﺋﺤﺔ
. وذﯾﻞ اﻟﻼﺋﺤﺔ
ﺷﺮح اﻟﻤﺜﺎل:
ﻓﻲ اﻟﺴﻄﺮ 37ﻧﺴﺘﻔﺴﺮ إذا ﻛﺎﻧﺖ اﻟﻌﻘﺪة ھﻲ اﻟﺮأس ﻓﺈﻧﮭﺎ ﺣﺎﻟﺔ ﺧﺎﺻﺔ إي اﻟﺤﺬف ﻣﻦ اﻟﺒﺪاﯾﺔ وﺳﺒﻖ وان
ﺗﻜﻠﻤﻨﺎ ﻋﻦ ھﺬه اﻟﺤﺎﻟﺔ وﻓﺎﺋﺪة ھﺬا اﻟﺸﺮط ھﻮ اﻟﺤﻔﺎظ ﻋﻠﻰ ﻣﻜﺎن اﻟﺮأس وھﻮ ﻧﻘﻠﺔ ﺑﻤﻘﺪار واﺣﺪ ﻟﻺﻣﺎم و
ﺑﻌﺪ ذﻟﻚ ﺣﺬف اﻟﻌﻘﺪة.
وﻓﻲ اﻟﺴﻄﺮ 44ﻧﺴﺘﻔﺴﺮ إذا ﻛﺎﻧﺖ اﻟﻌﻘﺪة ھﻲ اﻟﺬﯾﻞ ﻓﺈﻧﮭﺎ ﺣﺎﻟﺔ ﺧﺎﺻﺔ أﯾﻀﺎً إي اﻟﺤﺬف ﻣﻦ اﻟﻨﮭﺎﯾﺔ وﺳﺒﻖ
وان ﺗﻜﻠﻤﻨﺎ ﻋﻦ ھﺬه اﻟﺤﺎﻟﺔ وﻓﺎﺋﺪة ھﺬا اﻟﺸﺮط ھﻮ اﻟﺤﻔﺎظ ﻋﻠﻰ ﻣﻜﺎن اﻟﺬﯾﻞ وھﻮ ﻧﻘﻠﺔ ﺑﻤﻘﺪار واﺣﺪ ﻟﻠﺨﻠﻒ
و ﺑﻌﺪ ذﻟﻚ ﺣﺬف اﻟﻌﻘﺪة.
وإﻻ ﺳﺘﻜﻮن اﻟﻌﻘﺪة ﺑﯿﻦ اﻟﺮأس واﻟﺬﯾﻞ ﻓﺈﻧﮭﺎ ﺣﺎﻟﺔ ﺧﺎﺻﺔ أﯾﻀﺎً ,ﻓﯿﺘﻢ رﺑﻂ ﻣﺆﺷﺮ اﻟﻌﻘﺪة اﻟﺴﺎﺑﻘﺔ ﻣﻊ اﻟﻌﻘﺪة
اﻟﺘﺎﻟﯿﺔ ورﺑﻂ ﻣﺆﺷﺮ اﻟﻌﻘﺪة اﻟﺘﺎﻟﯿﺔ ﻣﻊ اﻟﻌﻘﺪة اﻟﺴﺎﺑﻘﺔ ﻛﻤﺎ ﻓﻲ اﻷﺳﻄﺮ ) (55 - 51واﻟﺸﻜﻞ 15-24ﯾﺒﻦ
ذﻟﻚ .
دﻣﺞ
اﻟﻘﻮا
ﺋﻢ
اﻟﺜﻨﺎ
ﺋﯿﺔ:
ﺑﻌﻤﻞ
ھﺬا
اﻟﻤﺜﺎ
ل
ﻋﻠﻰ
دﻣﺞ
ﻗﺎﺋﻤ
ﺗﯿﻦ
ﺛﻨﺎﺋﯿﺘ
ﻟﺸﻜﻞ 15-24 ﯾﻦ:
ﺷﺮح اﻟﻤﺜﺎل:
اﻷﺳﻄﺮ ) (50 - 53ﺗﻤﺖ دﻣﺞ اﻟﻼﺋﺤﺘﯿﻦ ﻣﻊ ﺑﻌﻀﮭﺎ اﻟﺒﻌﺾ ﻋﻦ ﻃﺮﯾﻖ ﺟﻌﻞ ذﯾﻞ اﻟﻼﺋﺤﺔ اﻷوﻟﻰ ﯾﺆﺷﺮ
إﻟﻰ رأس اﻟﻼﺋﺤﺔ اﻟﺜﺎﻧﯿﺔ ﻛﻤﺎ ﻓﻲ اﻟﺴﻄﺮ .50و ﺟﻌﻞ رأس اﻟﻼﺋﺤﺔ اﻟﺜﺎﻧﯿﺔ ﯾﺆﺷﺮ إﻟﻰ ذﯾﻞ اﻟﻼﺋﺤﺔ اﻷوﻟﻰ
ﻛﻤﺎ ﻓﻲ اﻟﺴﻄﺮ . 51وأﺧﺮ ﻋﻤﻠﯿﺔ ھﻲ ﻣﺴﺎواة ﻣﺆﺷﺮ اﻟﻼﺋﺤﺔ اﻷوﻟﻰ ﺑﻤﺆﺷﺮ اﻟﻼﺋﺤﺔ اﻟﺜﺎﻧﯿﺔ ﻛﻤﺎ ﻓﻲ
اﻟﺴﻄﺮ .52
اﻟﺴﻄﺮ 53ﯾﻌﻤﻞ ﻋﻠﻰ ﺣﺬف اﻟﻤﺆﺷﺮات اﻟﺰاﺋﺪة ﻣﻦ ﻋﻤﻠﯿﺔ اﻟﺪﻣﺞ.
إﻟﻰ ھﻨﺎ ﻗﺪ اﺗﻀﺤﺖ ﻋﻤﻞ اﻟﻘﻮاﺋﻢ اﻟﻤﺬﺑﻠﺔ وھﺬه اﻷﻣﺜﻠﺔ اﻟﺘﻲ ﻛﺘﺒﺖ إذا ﻓﮭﻤﮭﺎ اﻟﻘﺎرئ ﻓﺄﻧﻨﺎ ﻧﻀﻤﻦ ﻟﮫ أن إي
ﺳﺆال ﺳﯿﻮاﺟﮫ ﺳﯿﻌﺮف إﺟﺎﺑﺘﮫ ﺑﻼ ﺗﻌﺐ أو ﻣﺠﮭﻮد.
ﻟﻨﻔﺘﺮض أن ﻟﺪﯾﻨﺎ ﻻﺋﺤﺔ ﺛﻨﺎﺋﯿﺔ داﺋﺮﯾﺔ ﺑﺪاﺧﻠﮭﺎ ھﺬه ﻛﻤﺎ ﻓﻲ اﻟﺸﻜﻞ 15-25
ﺷﻜﻞ 15-25
;))(System.out.println(node.getNext().getNext().getElement
;))(System.out.println(node.getNext().getPrev().getElement
System.out.println(node.getNext().getNext().getNext().getNext().getNext
;))(().getNext().getElement
;))(System.out.println(head.getElement
;))(System.out.println(head.getNext().getElement
System.out.println(tail.getPrev().getPrev().getNext().getElement());
System.out.println(tail.getNext().getPrev().getElement());
ﺷﻜﻞ 15-26
1.7.1ﻣﺼﻄﻠﺤﺎت اﻷﺷﺠﺎر
ﻋﻨﺎﺻﺮ اﻷﺷﺠﺎر ﺗﺴﻤﻰ ﺧﻼﯾﺎ ، Nodesوﻛﻞ ﺧﻠﯿﺔ ﻟﮭﺎ ﻣﺴﺎر Pathواﺣﺪ ﻓﻘﻂ ﯾﻮﺻﻠﮭﺎ
ﺑﺎﻟﺠﺬر .Root
واﻟﻤﺴﺎر ھﻮ ﻋﺒﺎرة ﻋﻦ ﻣﺠﻤﻮﻋﺔ ﺧﻼﯾﺎ ﻣﺘﺘﺎﺑﻌﺔ ﻟﻠﻮﺻﻮل إﻟﻰ ﺧﻠﯿﺔ ﻣﻌﯿﻨﺔ .ﻃﻮل اﻟﻤﺴﺎر Path
Lengthھﻮ ﻋﺒﺎرة ﻋﻦ ﻋﺪد اﻟﻮﺻﻼت ﻣﻦ اﻟﺠﺬر إﻟﻰ اﻟﺨﻠﯿﺔ اﻟﻤﺮاد ﻣﻌﺮﻓﺔ ﻃﻮل ﻣﺴﺎرھﺎ
واﻟﺬي ﯾﺴﺎوي ﻋﺪد اﻟﺨﻼﯾﺎ ﻧﺎﻗﺺ واﺣﺪ.
ﻓﻲ اﻟﺸﺠﺮة اﻟﺘﺎﻟﯿﺔ اﻟﻤﺴﺎر ) (M,H,C,Aﯾﻮﺻﻞ اﻟﺨﻠﯿﺔ Mﺑﺎﻟﺠﺬر Aﻃﻮﻟﮫ .3
ﻋﻤﻖ Depthاﻟﺨﻠﯿﺔ ھﻮ ﻃﻮل ﻣﺴﺎرھﺎ إﻟﻰ اﻟﺠﺬر ،ﻣﺜ ﻼً اﻟﺨﻠﯿﺔ Eﻋﻤﻘﮭﺎ .2اﻟﺠﺬر Aﻋﻤﻘﮫ
.0
اﻟﻤﺴﺘﻮى Levelھﻮ ﻛﻞ اﻟﺨﻼﯾﺎ اﻟﺘﻲ ﻟﮭﺎ ﻧﻔﺲ اﻟﻌﻤﻖ .اﻟﻤﺴﺘﻮى اﻟﺜﺎﻧﻲ ﻋﺒﺎرة ﻋﻦ
}.{E,F,G,H
إرﺗﻔﺎع Heightاﻟﺸﺠﺮة ھﻮ أﻛﺒﺮ ﻋﻤﻖ ﻣﻮﺟﻮد ﻟﻠﺸﺠﺮة ،وﻓﻲ اﻟﺸﺠﺮة اﻟﺴﺎﺑﻘﺔ ﯾﺴﺎوي .3
اﻟﺸﺠﺮة اﻟﺘﻲ ﯾﻮﺟﺪ ﺑﮭﺎ ﺧﻠﯿﺔ واﺣﺪة ﻓﻘﻂ إرﺗﻔﺎﻋﮭﺎ ﯾﺴﺎوي .0واﻟﺸﺠﺮة اﻟﺘﻲ ﻻ ﺗﺤﺘﻮي ﻋﻠﻰ أي
ﺧﻠﯿﺔ ﯾﻌﺮف إرﺗﻔﺎﻋﮭﺎ ).(-1
درﺟﺔ اﻟﺨﻠﯿﺔ Degreeھﻮ ﻋﺪد أﺑﻨﺎﺋﮭﺎ اﻟﺨﻠﯿﺔ Hدرﺟﺘﮭﺎ .5
Aldopaee@ho tmail.co m 523 اﻟﻤﮭﻨﺪس/ﻋﻤﺎر ﻣﺤﻤﺪ ﻋﯿﺴﻰ اﻟﺪﺑﻌﻲ
اﻟﻮرﻗﺔ Leafھﻲ اﻟﺨﻠﯿﺔ اﻟﺘﻲ درﺟﺘﮭﺎ ﺻﻔﺮ أي ﻻﯾﻮﺟﺪ ﻟﮭﺎ أﺑﻨﺎء.
وﻣﻦ اﻟﺸﻜﻞ 15-27ﯾﺘﻀﺢ ﺟﻤﯿﻊ ﻣﺎ ﺳﺒﻖ.
ﺷﻜﻞ 15-27
وﻧﻼﺣ
ظ
ﻣﻦ
اﻟﺸﻜﻞ
اﻟﺴﺎﺑﻖ
أن
ﻛﻠﻤﺎ
اﺗﺠﮭﻨﺎ
إﻟﻰ
اﻟﯿﻤﯿﻦ
ﺷﻜﻞ 15-30 ﯾﻜﻮن
اﻟﻌﺪد
اﻛﺒﺮ ﻣﻦ اﻟﺴﺎﺑﻖ وﻛﻞ ﻣﺎ اﺗﺠﮭﻨﺎ إﻟﻰ اﻟﯿﺴﺎر ﻛﺎن اﻟﻌﺪد اﺻﻐﺮ ﻣﻦ اﻷب أو اﻟﻌﻘﺪة اﻟﺴﺎﺑﻘﺔ وھﻜﺬا
ﺗﻜﻮن اﻷﻋﺪاد ﻣﺮﺗﺒﺔ ﺗﺼﺎﻋﺪﯾﺎً وﺗﻨﺎزﻟﯿﺎً .
وﻧﻜﺮر أن اﻷﻋﺪاد ﻻ ﺗﺘﻜﺮر ﻓﻲ اﻟﺸﺠﺮة اﻟﺜﻨﺎﺋﯿﺔ.
وﻧﻼﺣﻆ أن ﻣﻦ ﻋﯿﻮب ھﺬه اﻟﻄﺮﯾﻘﺔ
ýﺗﺤﺘﻮي ﻋﻠﻰ ﻓﺮاغ ﻓﻲ ﻓﻀﺎء اﻟﺬاﻛﺮة ﻏﯿﺮ ﻣﺴﺘﻌﻤﻞ ﻧﺘﯿﺠﺔ ﻻﺳﺘﺨﺪام ﻣﺆﺷﺮ ﺻﻔﺮﯾﺔ
.NULL
ýﺧﻮارزﻣﯿﺔ اﻟﺘﻄﺒﯿﻖ ﻟﮭﺎ أﺻﻌﺐ اﻟﻠﻐﺎت ﻓﻲ اﻟﻠﻐﺎت اﻟﺘﻲ ﻻ ﺗﻌﻄﻲ ﺗﻘﻨﯿﺔ ذاﻛﺮة ﻣﺘﺤﺮﻛﺔ
)دﯾﻨﺎﻣﯿﻜﯿﺔ ( .
ﻟﺸﺮح ﻛﯿﻔﯿﺔ ﻋﻤﻞ ﻃﺮﯾﻘﺔ Huffmanﻧﻔﺮض اﻧﮫ ﯾﻮﺟﺪ ﻟﺪﯾﻨﺎ ﻣﻠﻒ وﺣﺠﻤﮫ byte1000
ﯾﺤﺘﻮي ﻋﻠﻰ اﻟﺤﺮوف ). (a,b,c,d,e,f,g,i,j
-1ﻧﻘﻮم ﺑﻌﻤﻞ إﺣﺼﺎﺋﯿﺔ ﻋﻦ اﻟﻤﻠﻒ اﻟﻤﺮاد ﺗﻘﻠﯿﺺ ﺣﺠﻤﮫ وذﻟﻚ ﺑﻌﺪّ ﺗﻜﺮار ﻛﻞ ﺣﺮف.
ﺟﺪول 15-2
ﻓﻲ ھﺬا اﻟﻤﺜﺎل ﺣﺮف jوﺣﺮف bﯾﻤﺜﻼن أﻗﻞ ﺗﻜﺮار ،ﻧﻘﻮم ﺑﺘﻮﺻﯿﻠﮭﻤﺎ ﻣﻊ وﺿﻊ ﻣﺠﻤﻮع
ﺗﻜﺮارھﻤﺎ ﻛﻤﺎ ﻓﻲ ﺷﻜﻞ .15-31
171 130 57 52 274 149 92 42 31 2
ا
a h c f e i d g b j ﻵ
ن
33
ﯾ ﺷﻜﻞ 15-31
ﻣﺜﻞ ﻣﺠﻤﻮع ﺣﺮﻓﻲ b,jوﺣﺮف gاﻷﻗﻞ ﺗﻜﺮارا ﻧﻘﻮم ﺑﺘﻮﺻﯿﻠﮭﻤﺎ ﺑﻨﻔﺲ اﻟﺨﻄﻮات اﻟﺴﺎﺑﻘﺔ
171 130 57 52 274 149 92 42 31 ﻋ 2
ﻧ
a h c f e i d g b j د
33
ﻣ
75
ن
ﺷﻜﻞ 15-29
ﺗ
وﺻﯿﻞ ﺟﻤﯿﻊ اﻟﺤﺮوف ﺗﻜﻮن Binary Treeﻛﺎﻟﺸﻜﻞ :15-32
leaves
3
171 130 57 52 274 149 92 42 31 -2
a h c f e i d g b j
ﻧ
33
ﻗ
75
و
م
109
167
ﺑ
ﺗ
239
و
316
ز
ﯾ
410
ع
590
1
1000
ﻋ
Root ﻟ
ﺷﻜﻞى 15-33
171 130 57 52 274 149 92 42 31 2
-4ﻧﻘﻮم
a h c f e i d g b j ﺑﺘﺴﺠﯿﻞ
اﻟﻤﺴﺎرات
0 1
33
0
75
1
اﻟﺘﻲ
0 1 ﺗﻮﺻﻞ إﻟﻰ
109
0 1
ﻛﻞ ﺣﺮف
167 ﻣﻦ
0
239
1
اﻟﺤﺮوف
0 1 اﻷﺻﻠﯿﺔ
0
1
316
ﻟﻠﻤﻠﻒ ،
410 وذﻟﻚ ﺑﺘﺘﺒﻊ
0
590
1
ﻣﺴﺎرات
Binary
0 1
1000
Tree
ﻣﻦ اﻟﺠﺬر
Root
Rootإﻟﻰ
ﺷﻜﻞ 15-33
اﻷوراق
.Leaves
ﺟﺪول 15-3
a b c d e f g h i J
00 111110 0110 1110 10 0111 11110 010 110 111111
ﻋﻨﺪ ﺗﻜﻮﯾﻦ اﻟﻤﻠﻒ اﻟﻤﻀﻐﻮط ﻧﺴﺘﺒﺪل اﻟﺤﺮوف اﻷﺻﻠﯿﺔ ﺑﻤﺴﺎراﺗﮭﺎ اﻟﻤﺤﺴﻮﺑﺔ ﻓﻲ اﻟﺨﻄﻮة رﻗﻢ .4
وﻧﺴﺘﻄﯿﻊ ﺣﺴﺎب ﺣﺠﻢ اﻟﻤﻠﻒ اﻟﺠﺪﯾﺪ وﻧﺴﺒﺔ ﺗﻘﻠﯿﺼﮫ ﺑﻀﺮب ﻃﻮل ﻣﺴﺎر ﻛﻞ ﺣﺮف ﻓﻲ ﺗﻜﺮاره ﻓﻲ اﻟﻤﻠﻒ
ﺟﺪول 15-4
أي أن اﻟﻤﻠﻒ اﻟﺠﺪﯾﺪ ﺳﯿﻜﻮن ﺣﺠﻤﮫ 372 =2970/8ﺑﺎﯾﺖ ،ﺑﻤﻌﻨﻰ أن اﻟﺤﺠﻢ اﻟﺠﺪﯾﺪ ﯾﻌﺎدل %37.2
ﻣﻦ اﻟﺤﺠﻢ اﻷﺻﻠﻲ.
ﻓﻜﺮة ﻋﻤﻞ ھﺬه اﻟﻄﺮﯾﻘﺔ ﺗﺘﻠﺨﺺ ﻓﻲ إﻧﮭﺎ ﺗﺴﺘﻐﻞ اﻟﺤﺮوف اﻟﻤﻮﺟﻮدة ﺑﻜﺜﺮة ﻓﻲ اﻟﻤﻠﻒ وﺗﻀﻌﮭﺎ ﻓﻲ أﻗﺼﺮ
ﻣﺴﺎر ﻓﻲ Binary Treeﻣﻤﺎ ﯾﻌﻨﻲ إﻧﮭﺎ )اﻟﺤﺮوف( ﺳﯿﺘﻢ أﻋﻄﺎﺋﮭﺎ أﻗﻞ ﺣﯿﺰ ﺗﺨﺰﯾﻨﻲ ﻣﻤﻜﻦ.
ﺷﻜﻞ 15-34
ﻟﻘﺪ
ﺑﺪﺋﻨﺎ ﺑﺎﻟﺠﺪر ) (25ﺛﻢ اﻧﺘﻘﻠﻨﺎ إﻟﻰ اﻟﯿﺴﺎر ﺑﺎﻟﻌﺪد 20ﻷﻧﺔ اﺻﻐﺮ ﻣﻦ 25ﺛﻢ اﻧﺘﻘﻠﻨﺎ إﻟﻰ ﯾﺴﺎر 25
و 20ﺑﺎﻟﻌﺪد 7ﻷﻧﺔ أﺻﻐﺮ ﻣﻦ 20ﺛﻢ اﻧﺘﻘﻠﻨﺎ ﺑﺎﻟﻌﺪد 13إﻟﻰ اﻟﯿﺴﺎر ﻣﻦ 25وھﻜﺬا إﻟﻰ ﻧﮭﺎﯾﺔ
اﻷﻋﺪاد .
**1. /
2. * Class binary tree by storing references to
3. * an element, a parent node, a left node, and a right node.
4. */
{5. public class BTNode
;6. private int element // element stored at
this node
7. private BTNode left, right; // adjacent nodes
8. /** Main constructor */
}{)(9. public BTNode
10.
{ )11. public BTNode(int element
ﺷﺮح اﻟﻤﺜﺎل:
اﻷﺳﻄﺮ ) (35 - 18ﻗﻤﻨﺎ ﺑﻌﻤﻠﯿﮫ اﻟﺒﺤﺚ ﻋﻦ اﻟﻤﻮﻗﻊ اﻟﺘﻲ ﺳﻨﻀﻊ اﻟﻌﻘﺪة ﺣﺴﺐ ﺧﻮارزﻣﯿﺔ اﻷﺷﺠﺎر ﻓﺈذا
ﻛﺎﻧﺖ اﻟﻘﯿﻤﺔ اﻛﺒﺮ اﺗﺠﮭﻨﺎ ﯾﺴﺎراً وإﻻ اﺗﺠﮭﻨﺎ ﯾﻤﯿﻨﺎُ إﻟﻰ أن ﯾﺼﻞ s = nullﻛﻤﺎ ﻓﻲ اﻟﺴﻄﺮ .22
ﻓﺎﺋﺪة اﻟﻤﺘﺤﻮل pھﻮ ﻋﺒﺎرة ﻣﺆﺷﺮ ﯾﺆﺷﺮ ﺑﻤﻘﺪار واﺣﺪ ﻟﻠﺨﻠﻒ ﻟﻨﺤﺘﻔﻆ ﺑﻤﻮﻗﻊ أﺧﺮ ﻋﻘﺪة اﻟﻨﺎﺗﺠﺔ ﻣﻦ ﻋﻤﻠﯿﺔ
اﻟﺒﺤﺚ .
ﺑﻌﺪ ﻣﻦ ﺑﺤﺚ اﻟﻤﻮﻗﻊ ﻧﻘﻮم ﺑﻌﻤﻠﯿﮫ اﺳﺘﻔﺴﺎر ﻓﺈذا ﻛﺎﻧﺖ اﻟﻘﯿﻤﺔ اﻛﺒﺮ ﻣﻦ اﻟﻌﻘﺪة اﻟﺘﻲ ﻋﺜﺮﻧﺎ ﻋﻠﯿﮭﺎ ﺑﻮاﺳﻄﺔ p
ﻓﺄﻧﻨﺎ ﻧﻀﻊ اﻟﻌﻘﺪة ﻋﻠﻰ اﻟﯿﻤﯿﻦ وإﻻ ﻧﻀﻌﮭﺎ ﻋﻠﻰ اﻟﯿﺴﺎر وھﻜﺬا ﻟﺒﺎﻗﻲ اﻟﻌﻘﺪ ﻛﻤﺎ ﻓﻲ اﻷﺳﻄﺮ ). (30 – 34
اﻟﺴﻄﺮ 39ﺗﻢ اﺳﺘﺪﻋﺎء ﻣﻨﮭﺞ Printﻟﯿﻘﻮم ﺑﻄﺒﺎﻋﺔ اﻟﺸﺠﺮة .و ھﻨﺎ ﺗﻜﻮن ﻋﻤﻠﯿﺔ اﻟﻄﺒﺎﻋﺔ ﺑﺎﻻﺳﺘﺪﻋﺎء
اﻟﺬاﺗﻲ ﻓﮭﻲ أﺳﮭﻞ .
15-36 ﺷﻜﻞ
ﺷﻜﻞ 15-37
ﯾﻤﻜﻦ إﺳﺘﺮﺟﺎع اﻟﺒﯿﺎﻧﺎت ﻣﻦ اﻟﺮﺳﻢ وذﻟﻚ ﺑﺈﺳﺘﺮﺟﺎع اﻟﺒﯿﺎﻧﺎت اﻟﻤﻮﺟﻮدة ﻓﻲ أﻗﺼﻰ اﻟﯿﺴﺎر ،ﺑﻐﺾ اﻟﻨﻈﺮ
ﻋﻦ اﻟﻤﺴﺘﻮى ...وھﻜﺬا.
ﺷﻜﻞ 15-38
ﺷﻜﻞ 15-39
ﻓﻠﻮ أدﺧﻠﻨﺎ اﻟﺮﻗﻢ 6ﻓﺄﻧﺔ ﺳﻮف ﯾﻄﺒﻊ ﻟﻨﺎ اﻷب وھﻮ 1و ﯾﻄﺒﻊ ﻟﻨﺎ اﻷخ وھﻮ . 2
وھﺬا ﻛﻮد اﻟﺒﺮﻧﺎﻣﺞ:
ﺷﻜﻞ 15-40
ﺷﻜﻞ 15-41
vإذا ﻛﺎن اﻟﻌﺪد اﻟﻤﺮاد ﺣﺬﻓﮫ ﯾﺤﺘﻮي ﻋﻠﻰ ﺷﺠﺮة ﻓﺮﻋﯿﺔ ﻣﺜﻞ اﻟﻌﺪد 70
ﺷﻜﻞ 15-43
ﺷﻜﻞ 15-45
وإﻻ ﻧﺮﺑﻂ ﯾﺴﺎر اﻷب ﺑﯿﻤﯿﻦ اﻻﺑﻦ ,ﺛﻢ ﻧﺤﺬف اﻟﻌﻘﺪة .
vﺑﻘﻲ ﻋﻠﯿﻨﺎ ﺣﺎﻟﺔ وھﻲ أن أراد ﺣﺬف اﻟﺠﺬر ھﻲ ﺑﻌﺾ اﻟﺸﻲء ﻣﺮﺑﻜﺔ إﻻ إﻧﮭﺎ
ﺑﺴﯿﻄﺔ
ýﻧﺒﺤﺚ أوﻻ ﻋﻦ اﺻﻐﺮ ﻋﻘﺪة ﻓﻲ اﻟﺠﺬع اﻷﯾﻤﻦ ﻟﻠﺠﺬر وﻧﻄﺒﻖ ﺟﻤﯿﻊ اﻟﺸﺮوط
اﻟﺘﻲ ذﻛﺮﻧﺎھﺎ ﺳﺎﺑﻘﺎً .
ýوﻧﺄﺧﺬ ﻗﯿﻤﺔ اﻟﻌﻘﺪة وﻧﺴﺎوي ﻗﯿﻤﺔ اﻟﺠﺬر ﺑﮭﺎ ﺛﻢ ﻧﺤﺬف اﻟﻌﻘﺪة اﻟﺘﻲ ﺑﺤﺜﻨﺎ ﻋﻨﮭﺎ
وﺑﮭﺬا ﻧﻜﻮن أﺣﻠﻠﻨﺎ ﻗﯿﻤﺔ اﻟﺠﺬر إي ﺑﻤﺜﺎﺑﺔ ﺣﺬﻓﻨﺎ اﻟﺠﺬر وھﺬا اﻟﺸﻜﻞ ﺳﯿﻨﺘﺞ .
ﺷﻜﻞ 15-46
ýوإن ﻟﻢ ﯾﻮﺟﺪ ﺗﻔﺮع ﯾﻤﯿﻦ ﻟﻠﺠﺬر ﻓﺈﻧﻨﺎ ﻧﻨﻘﻞ اﻟﺠﺬر ﺑﻤﻘﺪار واﺣﺪ ﻟﻠﯿﺴﺎر وﻧﺤﺬف
اﻟﻌﻘﺪة .
وھﺬه ﻛﻞ اﻟﺨﻄﻮات ﯾﻤﻜﻦ دﻣﺠﮭﺎ ﺑﺒﺮﻧﺎﻣﺞ ﺷﺎﻣﻞ ﯾﺴﺘﻄﯿﻊ أن ﯾﺤﺬف ﻣﻦ إي ﻣﻜﺎن .
وﺗﻌﻨﻰ Plexاﻟﺸﺒﻜﺎت )اﻟﺮﺳﻮم ( Graphsﻛﻤﺎ ﺗﺴﻤﻰ ﺑﯿﺎﻧﺎت ﻣﻀﻔﺮة .إذا اﺗﺼﻞ أي ﻋﻨﺼﺮ ﺑﯿﺎن ﻓﻲ
اﻟﻤﺴﺘﻮى اﻷدﻧﻰ ﻣﻦ ھﯿﺎﻛﻞ اﻟﺒﯿﺎﻧﺎت اﻟﺸﺠﺮﯾﺔ ﺑﺄﻛﺜﺮ ﻣﻦ ﻋﻨﺼﺮ ﻓﻲ ﻣﺴﺘﻮى أﻋﻠﻰ ﻓﯿﻄﻠﻖ ﻋﻠﯿﮫ اﺳﻢ ھﯿﺎﻛﻞ
ﺑﯿﺎﻧﺎت ﺷﺒﻜﯿﺔ ،ﺣﺘﻰ
اﻟﺸﻜﻞ 15-46
اﻟﺸﻜﻞ 15-47
اﻟﺸﻜﻞ 15-48
اﻟﺸﻜﻞ 15-49
وﺗﻨﻘﺴﻢ ھﯿﺎﻛﻞ اﻟﺒﯿﺎﻧﺎت اﻟﺸﺠﺮﯾﺔ إﻟﻰ ﻧﻮﻋﯿﻦ ،ﺑﺴﯿﻂ وﻣﻌﻘﺪ ،ﻓﻔﻲ اﻟﻨﻮع اﻟﺒﺴﯿﻂ ﯾﻤﻜﻦ ﺗﺤﺪﯾﺪ ﻣﺴﺘﻮﯾﺎت
اﻟﮭﯿﻜﻞ اﻟﺒﻨﺎﺋﻲ ﻟﻠﺒﯿﺎﻧﺎت أﻣﺎ اﻟﻨﻮع اﻟﻤﻌﻘﺪ ﻓﯿﺼﻌﺐ ذﻟﻚ ﻛﺜﯿﺮاً ﻛﻤﺎ ﻓﻲ اﻟﺸﻜﻞ . 15-50
اﻟﺸﻜﻞ 15-50
.34اﻛﺘﺐ ﺑﺮﻧﺎﻣﺞ ﯾﻘﻮم ﺑﺘﺤﻮﯾﻞ ﺷﺠﺮة ﺛﻨﺎﺋﯿﺔ إﻟﻰ ﻃﺎﺑﻮر ﺑﺸﺮط أن ﺗﺪﺧﻞ اﻟﺒﯿﺎﻧﺎت ﻣﺮﺗﺒﺔ ﻟﻠﻄﺎﺑﻮر
وﺑﺪن اﺳﺘﺨﺪام إي ﺧﻮارزﻣﯿﺔ ﺗﺮﺗﯿﺐ ؟
.35اﻛﺘﺐ ﺑﺮﻧﺎﻣﺞ ﯾﻘﻮم ﺑﺘﺤﻮﯾﻞ ﻃﺎﺑﻮر إﻟﻰ ﺷﺠﺮة ﺛﻨﺎﺋﯿﺔ ﻋﻠﻤﺎُ أن اﻟﺒﯿﺎﻧﺎت ﻓﻲ اﻟﻄﺎﺑﻮر ﻣﺘﻜﺮرة
واﻟﺸﺠﺮة اﻟﺜﻨﺎﺋﯿﺔ ﻻ ﺗﻘﺒﻞ اﻟﻘﯿﻢ اﻟﻤﺘﻜﺮرة ؟
.36ﻟﺪﯾﻚ اﻟﻜﻠﻤﺎت اﻟﺘﺎﻟﯿﺔ ) SAMI , AMMAR , AHMED , BASSAM , SANAD ,
) (MOSTAFA , READ , ALI , KAMAL ,AMINاﻟﻤﻄﻠﻮب ﺗﻜﻮﯾﻦ ﺷﺠﺮة ﺛﻨﺎﺋﯿﺔ
ﻣﺜﻞ اﻟﻤﺜﺎل اﻟﺬي ﺗﻜﻠﻤﻨﺎ ﻋﻠﯿﺔ ﺳﺎﺑﻘﺎُ ؟
.37اﻛﺘﺐ ﺑﺮﻧﺎﻣﺞ ﯾﻘﻮم ﺑﺤﺬف اﻷﻋﺪاد اﻷوﻟﯿﺔ ﻣﻦ اﻟﺸﺠﺮة اﻟﺜﻨﺎﺋﯿﺔ ؟
اﻟﻤﺮاﺟﻊ اﻟﻌﺮﺑﯿﺔ
اﻟﻤﺮاﺟﻊ اﻻﻧﺠﻠﯿﺰﯾﺔ
1- http://www.java.sun.com.
2- http://www.rlg.org/visguides/visguide3.html.
3- http://www.data-compression.com/lossless.html.
4- http://splash.javasoft.com/jdbc.
5- http://www.scism.sbu.ac.uk/jfl/index.html.