Assignment 6.pdf

‫ﺗﻤﺮﻳﻨﺎت ﺳﺮي ﺷﺸﻢ‬
‫آﺧﺮﻳﻦ ﻣﻬﻠﺖ ﺗﺤﻮﻳﻞ ﺳﺎﻋﺖ ‪ 12:00‬ﻇﻬﺮ ﺟﻤﻌﻪ ‪ 30‬آذر ‪86‬‬
‫ﻧﺤﻮه ﺗﺤﻮﻳﻞ‪:‬‬
‫•‬
‫ﻧﺎم ﻓﺎﻳﻞ ﻣﺮﺑﻮط ﺑﻪ ﺑﺮﻧﺎﻣﻪ در اﺑﺘﺪاي ﻫﺮ ﺳﻮال ﻣﺸﺨﺺ ﺷﺪه اﺳﺖ‪ .‬ﻓﻘﻂ ﻫﻤﻴﻦ ﻓﺎﻳﻞ ﻫﺎي ‪ cpp‬ﺧﻮد را در ﻳﻚ‬
‫داﻳﺮﻛﺘﻮري ﺑﻪ ﻧﺎم ﺷﻤﺎره داﻧﺸﺠﻮﻳﻲ ﺧﻮد ﻗﺮار دﻫﻴﺪ‪ ،‬داﻳﺮﻛﺘﻮري را ﺑﻪ ﻫﻤﺎن ﻧﺎم ‪ zip‬ﻛﺮده و آن را ﺑﺎ ﻣﺸﺨﺼﺎت‬
‫زﻳﺮ ‪ email‬ﺑﺰﻧﻴﺪ‪ .‬ﺑﻪ ﺟﺎي ‪ X‬ﻫﺎ ﺷﻤﺎره ي داﻧﺸﺠﻮﻳﻲ ﺧﻮد را ﻗﺮار دﻫﻴﺪ‪ .‬ﺑﻪ ﺑﺮﻧﺎﻣﻪ ﻫﺎﻳﻲ ﻛﻪ ﺑﻪ ﺻﻮرت‬
‫دﻳﮕﺮي ﻓﺮﺳﺘﺎده ﺷﺪه ﺑﺎﺷﻨﺪ ﻧﻤﺮه اي ﺗﻌﻠﻖ ﻧﻤﻲ ﮔﻴﺮد‪.‬‬
‫‪[email protected]‬‬
‫‪HW6-XXXXXXXX‬‬
‫‪XXXXXXXX.zip‬‬
‫‪To:‬‬
‫‪Subject:‬‬
‫‪Attachment:‬‬
‫•‬
‫ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﺧﻮد را ﻣﺮﺗﺐ و ﺧﻮاﻧﺎ ﺑﻨﻮﻳﺴﻴﺪ‪ .‬از اﺳﺎﻣﻲ ﻣﻨﺎﺳﺐ ﺑﺮاي ﻣﺘﻐﻴﺮﻫﺎ و ﺗﻮاﺑﻊ اﺳﺘﻔﺎده ﻛﻨﻴﺪ‪ ،‬ﻋﻼوه ﺑﺮ اﻳﻦ‬
‫ﻗﺒﻞ از ﺑﺪﻧﻪ اﺻﻠﻲ ﻫﺮ ﺗﺎﺑﻊ ﺗﻮﺿﻴﺢ )‪ (Comment‬ﻣﺨﺘﺼﺮي راﺟﻊ ﺑﻪ ﻋﻤﻠﻜﺮد و ورودي و ﺧﺮوﺟﻲ ﻫﺎي آن اراﺋﻪ‬
‫ﻛﻨﻴﺪ‪.‬‬
‫•‬
‫ورودي و ﺧﺮوﺟﻲ ﻫﺎ ﺑﺎﻳﺪ دﻗﻴﻘﺎ ﻣﻄﺎﺑﻖ ﺳﻮال ﺑﺎﺷﻨﺪ‪ .‬ﻧﻮﺷﺘﻦ ﻫﺮ ﮔﻮﻧﻪ ‪ output‬اﺿﺎﻓﻲ در ﺧﺮوﺟﻲ ﺑﺎﻋﺚ‬
‫اﺧﺘﻼل در ﺗﺼﺤﻴﺢ ﺳﻮال ﺧﻮاﻫﺪ ﺷﺪ‪.‬‬
‫ﺳﻮال ‪ -1‬درﺧﺖ ﺟﺴﺘﺠﻮي دودوﻳﻲ )‪(bst.cpp‬‬
‫در اﻳﻦ ﺗﻤﺮﻳﻦ ﺷﻤﺎ ﺑﺎﻳﺪ ﺳﺎﺧﺘﺎر داده اي ﻣﻮﺳﻮم ﺑﻪ ‪ Binary Search Tree‬را ﭘﻴﺎده ﺳﺎزي ﻛﻨﻴﺪ‪ .‬اﻳﻦ درﺧﺖ داراي‬
‫ﺧﻮاص زﻳﺮ اﺳﺖ‪:‬‬
‫•‬
‫ﻫﺮ راس ﻋﻼوه ﺑﺮ ﻳﻚ ﻛﻠﻴﺪ ﻣﺠﺰا )در اﻳﻨﺠﺎ ﻋﺪد ﻃﺒﻴﻌﻲ( داراي ﺳﻪ اﺷﺎره ﮔﺮ ‪ right ،left‬و ‪ p‬اﺳﺖ ﻛﻪ ﺑﻪ‬
‫ﺗﺮﺗﻴﺐ ﻧﻤﺎﻳﺎﻧﮕﺮ ﻓﺮزﻧﺪ ﺳﻤﺖ ﭼﭗ‪ ،‬ﻓﺮزﻧﺪ ﺳﻤﺖ راﺳﺖ و راس ﭘﺪر ﻫﺴﺘﻨﺪ‪.‬‬
‫•‬
‫ﻓﺮض ﻛﻨﻴﺪ ‪ x‬ﻳﻚ راس در ﭼﻨﻴﻦ درﺧﺘﻲ ﺑﺎﺷﺪ‪ .‬اﮔﺮ ‪ y‬ﻳﻚ راس در زﻳﺮدرﺧﺖ ﺳﻤﺖ ﭼﭗ ‪ x‬ﺑﺎﺷﺪ دارﻳﻢ ‪:‬‬
‫ﻫﻤﭽﻨﻴﻦ اﮔﺮ ‪ y‬در زﻳﺮدرﺧﺖ ﺳﻤﺖ راﺳﺖ ‪ x‬ﻗﺮار ﮔﺮﻓﺘﻪ ﺑﺎﺷﺪ دارﻳﻢ‪:‬‬
‫ﺷﻜﻞ زﻳﺮ ﻳﻚ درﺧﺖ ﺟﺴﺘﺠﻮي دودوﻳﻲ را ﻧﺸﺎن ﻣﻲ دﻫﺪ‪:‬‬
‫ﺷﻤﺎ ﺑﺎﻳﺪ ﺑﺮﻧﺎﻣﻪ اي ﺑﻨﻮﻳﺴﻴﺪ ﻛﻪ دو ﻋﻤﻞ ‪ insert‬و ‪ search‬را ﺑﺮاي اﻳﻦ ﺳﺎﺧﺘﺎر داده اي اﻧﺠﺎم دﻫﺪ‪ .‬ﺑﺮاي اﻳﻦ ﻛﺎر ﻫﺮ راس‬
‫را ﺑﻪ ﻛﻤﻚ ﻳﻚ ‪ struct‬ﻣﺪل ﻛﻨﻴﺪ )ﻣﺸﺎﺑﻪ ﻛﺎري ﻛﻪ ﺑﺮاي ‪ linked-list‬اﻧﺠﺎم دادﻳﻢ(‪ .‬ﻫﻤﭽﻨﻴﻦ ﺧﻮد درﺧﺖ را ﻧﻴﺰ ﺑﺎ‬
‫اﺳﺘﻔﺎده از ‪ struct‬ﻣﺪل ﻛﻨﻴﺪ ﻛﻪ داراي اﺷﺎره ﮔﺮي ﺑﻪ رﻳﺸﻪ ي درﺧﺖ )‪ (root‬ﺑﺎﺷﺪ‪ .‬ﻋﻤﻠﻜﺮد ﻫﺮ ﻳﻚ از ﺗﻮاﺑﻊ ‪ search‬و‬
‫‪ insert‬در اداﻣﻪ آﻣﺪه اﺳﺖ‪:‬‬
‫•‬
‫‪ : Search‬ﺑﺎ درﻳﺎﻓﺖ ﻳﻚ ﻋﺪد‪ ،‬آن را در درﺧﺖ ﺟﺴﺘﺠﻮ ﻣﻲ ﻛﻨﺪ‪ .‬در ﺻﻮرت ﭘﻴﺪا ﻛﺮدن ﻛﻠﻴﺪ ﻣﻮرد ﻧﻈﺮ ‪ true‬و‬
‫در ﻏﻴﺮ اﻳﻦ ﺻﻮرت ﻣﻘﺪار ‪ false‬را ﺑﺎز ﻣﻲ ﮔﺮداﻧﺪ‪.‬‬
‫•‬
‫‪ : Insert‬ﺑﺎ درﻳﺎﻓﺖ ﻳﻚ ﻋﺪد آن را در ﺟﺎي ﻣﻨﺎﺳﺒﻲ در درﺧﺖ وارد ﻣﻲ ﻛﻨﺪ‪ .‬دﻗﺖ ﻛﻨﻴﺪ ﻛﻪ ﭘﺲ از وارد ﻛﺮدن‬
‫ﻋﺪد ﺟﺪﻳﺪ‪ ،‬درﺧﺖ ﻫﻤﭽﻨﺎن ﺧﺎﺻﻴﺖ ﻫﺎي ﺧﻮد را ﺣﻔﻆ ﻣﻲ ﻛﻨﺪ‪ .‬ﻫﻤﭽﻨﻴﻦ ﻻزم اﺳﺖ ﺧﺎﻟﻲ ﺑﻮدن ﻳﺎ ﻧﺒﻮدن‬
‫درﺧﺖ را ﭼﻚ ﻛﻨﻴﻢ‪ .‬ﺷﺒﻪ ﻛﺪ ﻋﻤﻞ ‪ insert‬ﺑﻪ ﺻﻮرت زﻳﺮ اﺳﺖ‪:‬‬
‫‪? Tree T was empty‬‬
‫)‪TREE-INSERT(T, z‬‬
‫‪1 y ← NIL‬‬
‫]‪2 x ← root[T‬‬
‫‪NIL‬‬
‫‪3 while x‬‬
‫‪4‬‬
‫‪do y ← x‬‬
‫‪5‬‬
‫]‪if key[z] < key[x‬‬
‫‪6‬‬
‫]‪then x ← left[x‬‬
‫‪7‬‬
‫]‪else x ← right[x‬‬
‫‪8 p[z] ← y‬‬
‫‪9 if y = NIL‬‬
‫‪10‬‬
‫‪then root[T] ← z‬‬
‫‪11‬‬
‫]‪else if key[z] < key[y‬‬
‫‪12‬‬
‫‪then left[y] ← z‬‬
‫‪13‬‬
‫‪else right[y] ← z‬‬
‫ورودي ﺑﺮﻧﺎﻣﻪ ﺑﻪ ﺷﺮح زﻳﺮ اﺳﺖ‪:‬‬
‫•‬
‫اﺑﺘﺪا ﻋﺪد ‪ n‬را در ﺧﻂ اول درﻳﺎﻓﺖ ﻛﻨﻴﺪ‪.‬‬
‫• در ﻫﺮﻳﻚ از ‪ n‬ﺧﻂ ﺑﻌﺪي‪ :‬اﺑﺘﺪا ﻳﻚ ﻛﺎرﻛﺘﺮ ﺑﺨﻮاﻧﻴﺪ‪ ‘I’ .‬ﺑﻪ ﻣﻌﻨﻲ ‪ insert‬و ’‪ ‘s‬ﺑﻪ ﻣﻌﻨﻲ ‪ search‬ﺧﻮاﻫﺪ ﺑﻮد‪.‬‬
‫ﺳﭙﺲ ﻳﻚ ﻋﺪد ﻃﺒﻴﻌﻲ ﻛﻪ در ﺣﺎﻟﺖ اول ﻋﺪدي اﺳﺖ ﻛﻪ ﺑﺎﻳﺪ ﺑﻪ درﺧﺖ اﺿﺎﻓﻪ ﺷﻮد و در ﺣﺎﻟﺖ دوم ﻋﺪدي اﺳﺖ‬
‫ﻛﻪ ﺑﺎﻳﺪ ﻣﻮرد ﺟﺴﺘﺠﻮ ﻗﺮار ﮔﻴﺮد‪.‬‬
‫ﺧﺮوﺟﻲ ﺑﺮﻧﺎﻣﻪ ﺷﺎﻣﻞ دو ﺑﺨﺶ اﺳﺖ‪:‬‬
‫‪ 9‬اﺑﺘﺪا در ﻳﻚ ﺧﻂ ﺗﻤﺎﻣﻲ ﻛﻠﻴﺪﻫﺎي ﻣﻮﺟﻮد در درﺧﺖ را ﭼﺎپ ﻛﻨﻴﺪ‪ .‬ﺗﺮﺗﻴﺐ ﻧﻤﺎﻳﺶ ﻛﻠﻴﺪﻫﺎ ﺑﺎﻳﺪ ﺑﻪ ﻧﺤﻮي ﺑﺎﺷﺪﻛﻪ‪:‬‬
‫‪ .a‬ﻓﺮض ﻛﻨﻴﺪ ‪ x‬ﻳﻚ راس در ﭼﻨﻴﻦ درﺧﺘﻲ ﺑﺎﺷﺪ‪ .‬اﮔﺮ ‪ y‬ﻳﻚ راس در زﻳﺮدرﺧﺖ ﺳﻤﺖ ﭼﭗ ‪ x‬ﺑﺎﺷﺪ‬
‫ﺣﺘﻤﺎ ‪ y‬ﻗﺒﻞ از ‪ x‬ﭼﺎپ ﺷﻮد‪ .‬ﻫﻤﭽﻨﻴﻦ اﮔﺮ ‪ y‬در زﻳﺮدرﺧﺖ ﺳﻤﺖ راﺳﺖ ‪ x‬ﻗﺮار ﮔﺮﻓﺘﻪ ﺑﺎﺷﺪ ﺣﺘﻤﺎ ‪x‬‬
‫ﻗﺒﻞ از ‪ y‬ﭼﺎپ ﺷﻮد‪.‬‬
‫‪ .b‬ﺑﻴﻦ ﻫﺮ دو ﻛﻠﻴﺪ ﻳﻚ ﻓﺎﺻﻠﻪ ﭼﺎپ ﺷﻮد‪.‬‬
‫‪ 9‬ﺑﻪ ازاي ﻫﺮ دﺳﺘﻮر ‪ search‬ﻛﻪ در ورودي ﺧﻮاﻧﺪه ﺷﺪه‪ ،‬ﻳﻚ ﺧﻂ ﺣﺎوي ”‪ “true‬ﻳﺎ ”‪ “false‬ﭼﺎپ ﺷﻮد‪) .‬ﺑﺎ‬
‫ﺣﻔﻆ ﺗﺮﺗﻴﺐ ورودي‪ .‬ﺗﻮﺟﻪ ﻛﻨﻴﺪ ﻛﻪ ﺑﺎﻳﺪ وﺿﻌﻴﺖ درﺧﺖ در ﻫﻨﮕﺎم وارد ﺷﺪن دﺳﺘﻮر ‪ search‬را در ﻧﻈﺮ ﺑﮕﻴﺮﻳﺪ‬
‫و ﻧﻪ وﺿﻌﻴﺖ ﻧﻬﺎﻳﻲ درﺧﺖ را‪(.‬‬
‫ﺳﻮال ‪ -2‬اﻋﺪاد ﻣﺨﺘﻠﻂ )‪(complex.cpp‬‬
‫ﺑﺮﻧﺎﻣﻪ اي ﺑﻨﻮﻳﺴﻴﺪ ﻛﻪ اﻋﻤﺎل رﻳﺎﺿﻲ در داﻣﻨﻪ ي اﻋﺪاد ﻣﺨﺘﻠﻂ را اﻧﺠﺎم دﻫﺪ‪ .‬ﺑﺮاي اﻳﻦ ﻛﺎر‪ ،‬ﻛﻼﺳﻲ ﺑﻪ ﻧﺎم ‪Complex‬‬
‫ﺑﻨﻮﻳﺴﻴﺪ‪ .‬اﻳﻦ ﻛﻼس داراي دو ﻣﺘﻐﻴﺮ ‪ private‬از ﻧﻮع ‪ double‬اﺳﺖ ﻛﻪ ﺑﺨﺶ ﺣﻘﻴﻘﻲ و ﺿﺮﻳﺐ ‪ i‬را در ﺧﻮد ﻧﮕﻪ ﻣﻲدارﻧﺪ‪.‬‬
‫ﻳﻚ ‪ constructor‬ﺑﻨﻮﻳﺴﻴﺪ ﻛﻪ ﺑﺎ اﺳﺘﻔﺎده ار آن ﺑﺘﻮان ‪ Object‬ﻫﺎي ﺟﺪﻳﺪ ﺑﺎ ﻣﻘﺎدﻳﺮ دﻟﺨﻮاه اﻳﺠﺎد ﻛﺮد‪ .‬در ﺻﻮرت‬
‫ﻣﺸﺨﺺ ﻧﻜﺮدن ﻣﻘﺪارﻫﺎ اﻳﻦ ‪ constructor‬ﺑﺎﻳﺪ داراي ﻣﻘﺎدﻳﺮ ﭘﻴﺶ ﻓﺮض ﺑﺮاي ﻣﺘﻐﻴﺮﻫﺎ ﺑﺎﺷﺪ‪ .‬ﻛﻼس ﺷﻤﺎ ﻫﻤﭽﻨﻴﻦ ﺑﺎﻳﺪ‬
‫داراي ﺗﻮاﺑﻊ ‪ public‬ﺑﻪ ﺷﺮح زﻳﺮ ﺑﺎﺷﺪ‪:‬‬
‫‪ .1‬ﺗﺎﺑﻊ ‪ add‬ﻛﻪ ﺑﺎ درﻳﺎﻓﺖ ﻳﻚ ‪ Object‬از ﻧﻮع ‪ ،Complex‬آن را ﺑﺎ ﻧﻤﻮﻧﻪ اﺻﻠﻲ ﺟﻤﻊ ﻛﻨﺪ‪.‬‬
‫‪ .2‬ﺗﺎﺑﻌﻲ ‪ subtract‬ﻛﻪ ﺑﺎ درﻳﺎﻓﺖ ﻳﻚ ‪ Object‬از ﻧﻮع ‪ ،Complex‬آن را از ﻧﻤﻮﻧﻪ اﺻﻠﻲ ﻛﻢ ﻛﻨﺪ‪.‬‬
‫‪ .3‬ﺗﺎﺑﻌﻲ ‪ multiply‬ﻛﻪ ﺑﺎ درﻳﺎﻓﺖ ﻳﻚ ‪ Object‬از ﻧﻮع ‪ ،Complex‬آن را ﺑﺎ ﻧﻤﻮﻧﻪ اﺻﻠﻲ ﺿﺮب ﻛﻨﺪ‪.‬‬
‫‪ .4‬ﺗﺎﺑﻌﻲ ‪ print‬ﻛﻪ ﻋﺪد ﻣﺨﺘﻠﻂ ﻧﻤﻮﻧﻪ اﺻﻠﻲ را ﺑﻪ ﻓﺮم )‪ (a, b‬ﻧﻤﺎﻳﺶ دﻫﺪ‪.‬‬
‫ﻧﻤﻮﻧﻪ اي از ﻛﺎرﻛﺮد اﻳﻦ ﻛﻼس در اداﻣﻪ آﻣﺪه اﺳﺖ‪:‬‬
‫;}…{‪class Complex‬‬
‫{ )(‪void main‬‬
‫;)‪Complex a(2, 5‬‬
‫;)‪Complex b(1, 3‬‬
‫;)‪a.add(b‬‬
‫;)(‪a.print‬‬
‫;)‪b.multiply(b‬‬
‫;)(‪b.print‬‬
‫;)‪a.subtract(b‬‬
‫;)(‪a.print‬‬
‫}‬
‫ﻛﻪ ﺧﺮوﺟﻲ آن ﺑﻪ ﺷﻜﻞ زﻳﺮ ﺧﻮاﻫﺪ ﺑﻮد‪:‬‬
‫)‪(3,8‬‬
‫)‪(-8,8‬‬
‫)‪(11,0‬‬
‫در ﺗﺎﺑﻊ ‪ ،main‬ﻋﻴﻨﺎ ﻫﻤﻴﻦ ﻋﺒﺎرات ﻧﻤﻮﻧﻪ را ﻗﺮار دﻫﻴﺪ‪.‬‬
‫ﻣﻮﻓﻖ ﺑﺎﺷﻴﺪ‬