HW3.pdf

‫ﻣﻬﻠﺖ ﺗﺤﻮﻳﻞ دوﺷﻨﺒﻪ ‪ 5‬ﺁذر ‪1386‬‬
‫ﺗﻤﺮﻳﻦ ﺳﺮﯼ ﺳﻮم ﻣﺒﺎﻧﯽ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﯽ ‪C++‬‬
‫ﺗﻤﺮﻳﻦ هﺎﯼ ﺧﻮد را ﺑﻪ ﻓﺮﻣﺖ ‪ zip‬و ﺑﺎ ﻧﺎم ‪ HW3_StudentID‬ﮐﻪ در ﺁن ‪ StudentID‬ﺷﻤﺎرﻩ داﻧﺸﺠﻮﻳﯽ ﺷﻤﺎﺳﺖ ‪،‬‬
‫ﺗﺎ ﻗﺒﻞ از ﮐﻼس ﺗﻤﺮﻳﻦ ﺑﻪ ﺁدرس ‪ [email protected] :‬ﺑﻔﺮﺳﺘﻴﺪ‪.‬‬
‫ﺗﻮﺟﻪ‪:‬‬
‫در ﺣﻞ ﻣﺴﺎﻟﻪ هﺎﯼ ‪ 2,1‬ﻧﻴﺎز ﺑﻪ ﺗﻮﻟﻴﺪ اﻋﺪاد ﺗﺼﺎدﻓﯽ دارﻳﺪ‪ .‬ﺑﺮاﯼ اﻳﻦ ﻣﻨﻈﻮر ﻣﯽ ﺗﻮاﻧﻴﺪ از ﺗﺎﺑﻊ‬
‫ﻣﻮﺟﻮد اﺳﺖ اﺳﺘﻔﺎدﻩ ﮐﻨﻴﺪ‪ .‬ﻓﺮاﺧﻮاﻧﯽ اﻳﻦ ﺗﺎﺑﻊ ﻋﺪدﯼ ﺗﺼﺎدﻓﯽ و ﻃﺒﻴﻌﯽ در ﺑﺎزﻩ ‪1‬‬
‫_‬
‫_‬
‫ﮐﻪ در ﮐﺘﺎﺑﺨﺎﻧﻪ ‪.‬‬
‫‪ 0‬ﺑﺮﻣﯽ ﮔﺮداﻧﺪ‪ .‬ﮐﻪ در ﺁن‬
‫ﻋﺪدﯼ ﺛﺎﺑﺖ اﺳﺖ‪ .‬ﺑﺮاﯼ ﻣﺜﺎل‪ ،‬ﮐﺪ زﻳﺮ ‪ 10‬ﻋﺪد ﺗﺼﺎدﻓﯽ در اﻳﻦ ﺑﺎزﻩ ﭼﺎپ ﻣﯽ ﮐﻨﺪ‪.‬‬
‫>‪#include <stdlib.h‬‬
‫>‪#include <time.h‬‬
‫>‪#include <iostream.h‬‬
‫)(‪int main‬‬
‫{‬
‫;‪// random integer‬‬
‫;‪int r‬‬
‫‪// control variable‬‬
‫;‪int i = 0‬‬
‫‪// initialise random number generator‬‬
‫;))‪srand(time(0‬‬
‫)‪while (i < 10‬‬
‫{‬
‫‪// gets random int in 0-RAND_MAX‬‬
‫;)(‪r = rand‬‬
‫;‪cout << "Random integer was " << r<<endl‬‬
‫;‪i++‬‬
‫}‬
‫;)‪return (0‬‬
‫}‬
‫دﻗﺖ ﮐﻨﻴﺪ ﮐﻪ ﺗﺎﺑﻊ‬
‫‪0‬‬
‫از ﮐﺘﺎﺑﺨﺎﻧﻪ ‪.‬‬
‫ﺗﻨﻬﺎ ﻳﮏ ﺑﺎر در اﺑﺘﺪاﯼ ﺑﺮﻧﺎﻣﻪ ﻓﺮاﺧﻮاﻧﯽ ﻣﯽ ﺷﻮد ﺗﺎ اﻋﺪاد ﺗﺼﺎدﻓﯽ ﺗﻮﻟﻴﺪ ﺷﺪﻩ در هﺮ‬
‫ﺑﺎر اﺟﺮاﯼ ﺑﺮﻧﺎﻣﻪ ﻣﺘﻔﺎوت ﺑﺎﺷﻨﺪ‪ .‬ﺑﺎ ﮐﻤﯽ ﺗﻐﻴﻴﺮ در ﺑﺮﻧﺎﻣﻪ ﻣﯽ ﺗﻮاﻧﻴﺪ اﻋﺪاد ﺗﺼﺎدﻓﯽ ﻣﻮرد ﻧﻴﺎز در اﻳﻦ دو ﻣﺴﺎﻟﻪ را ﺑﺴﺎزﻳﺪ‪.‬‬
‫ﻣﺴﺎﻟﻪ اول ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬
‫ﺑﺎز هﻢ ﻋﺪد ‪! π‬‬
‫در اﻳﻦ ﺑﺮﻧﺎﻣﻪ ﻣﯽ ﺧﻮاهﻴﻢ ﺗﻘﺮﻳﺒﯽ از ﻋﺪد ‪ π‬ﺑﻪ روش‬
‫‪ Monte Carlo‬ﺑﻪ دﺳﺖ ﺁورﻳﻢ‪ .‬ﺗﺎﺑﻌﯽ ﺑﻨﻮﻳﺴﻴﺪ ﮐﻪ ﻋﺪد ‪ n‬را ﺑﻪ ﻋﻨﻮان‬
‫ورودﯼ ﮔﺮﻓﺘﻪ و ﺑﻪ ﺗﻌﺪاد ‪ n‬ﺑﺎر زوج هﺎﯼ ﻣﺨﺘﺼﺎت ﺗﺼﺎدﻓﯽ‬
‫‪,‬‬
‫ﺑﺎ ﺷﺮط ‪1‬‬
‫‪1‬‬
‫‪,‬‬
‫ﺗﻮﻟﻴﺪ ﮐﺮدﻩ و ﺑﺎ ﺑﺪﺳﺖ ﺁوردن‬
‫ﻧﺴﺒﺖ ﺗﻌﺪاد ﻧﻘﺎﻃﯽ ﮐﻪ در داﺧﻞ داﻳﺮﻩ واﺣﺪ ﻗﺮار ﻣﯽ ﮔﻴﺮﻧﺪ ﺑﻪ ﺗﻌﺪاد ﮐﻞ ﻧﻘﺎط‪ ،‬ﺗﻘﺮﻳﺒﯽ از ‪ π‬را ﺑﺮﮔﺮداﻧﺪ‪.‬‬
‫ﺣﺎل در ﺑﺮﻧﺎﻣﻪ اﺻﻠﯽ ﺧﻮد ﻋﺪد ‪ n‬را از ﮐﺎرﺑﺮ ﮔﺮﻓﺘﻪ و ﺗﻘﺮﻳﺐ ﺑﺪﺳﺖ ﺁﻣﺪﻩ از ﺗﺎﺑﻊ ‪ n‬را در ﺧﺮوﺟﯽ ﭼﺎپ ﮐﻨﻴﺪ‪.‬‬
‫ﻣﺴﺎﻟﻪ دوم ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬
‫ﺑﺎزﯼ ﺣﺪس‬
‫ﺑﺮﻧﺎﻣﻪ اﯼ ﺑﺮاﯼ اﺟﺮاﯼ ﺑﺎزﯼ ﺣﺪس ﺑﺎ ﻗﻮاﻧﻴﻦ زﻳﺮ ﺑﻨﻮﻳﺴﻴﺪ ‪:‬‬
‫‬‫‬‫‪-‬‬
‫در هﺮ ﺑﺎزﯼ ﻳﮏ ﻋﺪد ﺗﺼﺎدﻓﯽ ﻃﺒﻴﻌﯽ ﮐﻤﺘﺮ از ‪ 1000‬ﺗﻮﺳﻂ ﺑﺮﻧﺎﻣﻪ اﻧﺘﺨﺎب ﻣﯽ ﺷﻮد‪.‬‬
‫ﮐﺎرﺑﺮ ﻣﯽ ﺗﻮاﻧﺪ ﺣﺪاﮐﺜﺮ ‪ 10‬ﺑﺎر ﺷﺎﻧﺲ ﺧﻮد را ﺑﺮاﯼ ﺣﺪس ﻋﺪد اﻧﺘﺨﺎﺑﯽ اﻣﺘﺤﺎن ﮐﻨﺪ‪.‬‬
‫ﺑﺮاﯼ هﺮ ﺣﺪس ﮐﺎرﺑﺮ‪ ،‬ﺧﺮوﺟﯽ ﺑﺮﻧﺎﻣﻪ ﻳﮑﯽ از ‪ 3‬ﺣﺎﻟﺖ زﻳﺮ ﺧﻮاهﺪ ﺑﻮد‪:‬‬
‫!‪You win‬‬
‫)‪Play again? (y/n‬‬
‫‬‫‪-‬‬
‫‪Too high, try again.‬‬
‫‪Too low, try again.‬‬
‫‬‫‪-‬‬
‫و اﮔﺮ ﭘﺲ از ‪ 10‬ﺑﺎر ﺣﺪس زدن‪ ،‬ﮐﺎرﺑﺮ ﻧﺘﻮاﻧﺪ ﻋﺪد اﻧﺘﺨﺎﺑﯽ را ﺣﺪس ﺑﺰﻧﺪ‪ ،‬ﺑﺎ ﭘﻴﻐﺎم زﻳﺮ ﻣﻮاﺟﻪ ﺧﻮاهﺪ ﺷﺪ‪:‬‬
‫… ‪You have no more choice. The number was‬‬
‫…‪You lose‬‬
‫)‪Play again? (y/n‬‬
‫‬‫‬‫‪-‬‬
‫در ﺻﻮرت ﺗﻤﺎﻳﻞ ﮐﺎرﺑﺮ‪ ،‬ﺑﺎزﯼ ﺑﺎﻳﺪ ﺗﮑﺮار ﺷﻮد‪.‬‬
‫ﻣﺴﺎﻟﻪ ﺳﻮم ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬
‫ﻣﻴﺰ ﮔﺮد!‬
‫‪ n‬ﻧﻔﺮ ﺑﺎ ﺷﻤﺎرﻩ هﺎﯼ … ‪ 1‬دور ﻳﮏ ﻣﻴﺰﮔﺮد ﻧﺸﺴﺘﻪ اﻧﺪ و در ﻳﮏ ﺑﺎزﯼ ﺷﺮﮐﺖ ﻣﯽ ﮐﻨﻨﺪ‪ .‬ﻧﺤﻮﻩ ﺑﺎزﯼ ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ اﺳﺖ ﮐﻪ‬
‫از ﻧﻔﺮ ‪ m‬ام ﺷﺮوع ﮐﺮدﻩ و ﻳﮑﯽ در ﻣﻴﺎن اﻓﺮادﯼ را ﮐﻪ هﻨﻮز در ﺑﺎزﯼ ﺷﺮﮐﺖ دارﻧﺪ‪ ،‬از ﺑﺎزﯼ ﺣﺬف ﻣﯽ ﮐﻨﻴﻢ‪).‬ﻳﻌﻨﯽ ﻓﺮد ‪m‬‬
‫ام ﺣﺬف و ‪ m+1‬ام در ﺑﺎزﯼ ﺑﺎﻗﯽ ﻣﯽ ﻣﺎﻧﺪ( اﻳﻦ ﮐﺎر ﺗﺎ ﺑﺎﻗﯽ ﻣﺎﻧﺪن ﺗﻨﻬﺎ ﻳﮏ ﻧﻔﺮ در ﺑﺎزﯼ اداﻣﻪ ﭘﻴﺪا ﻣﯽ ﮐﻨﺪ‪.‬‬
‫ﺑﺮﻧﺎﻣﻪ اﯼ ﺑﻨﻮﻳﺴﻴﺪ ﮐﻪ از ﮐﺎرﺑﺮ ‪ m, n‬را ﮔﺮﻓﺘﻪ و ﺑﺮﻧﺪﻩ ﺑﺎزﯼ را ﺗﻌﻴﻴﻦ ﮐﻨﺪ‪1000) .‬‬
‫(‬
‫ﻧﻤﻮﻧﻪ اﺟﺮاﯼ ﺑﺮﻧﺎﻣﻪ‪:‬‬
‫‪How manny people taake part? 10‬‬
‫‪Who is thhe first loserr? 3‬‬
‫‪The winnner is Numbeer 6‬‬
‫ﻣﺴﺎﻟﻪ ﭼﻬﺎرم ‪. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬
‫ﺑﺮج ههﺎﻧﻮﯼ‬
‫دﻳﺴﮏ را‬
‫هﺎﻧﻮﯼ ﺑﺎ ‪ n‬ﮏ‬
‫ﯼ‬
‫ﮐﻼﺳﻴﮏ ﺑﺮج‬
‫ﮏ‬
‫ﻪ‬
‫ﺑﺮﻧﺎﻣﻪ اﯼ ﺑﻨﻮﻳﺴﻴﺪ ﮐﮐﻪ ﻋﺪد ‪ n‬را از ﮐﺎرﺑﺮ ﮔﺮﻓﻓﺘﻪ و راﻩ ﺣﻞ ﻣﺴﺎﻟﻪ‬
‫ﭼﺎپ ﮐﮐﻨﺪ‪.‬‬
‫اﻳﻦ ﺑﺎززﯼ ‪ 3‬ﻗﺎﻧﻮن ددارد‪:‬‬
‫ﻣﻴﻠﻪ ‪ A‬ﺑﺎﻳﺪ ﺑﻪ ﻣﻴﻴﻠﻪ ‪ C‬اﻧﺘﻘﺎل ﻳﻳﺎﺑﻨﺪ‪.‬‬
‫ﺴﮏ روﯼ ﻠﻪ‬
‫ ﺗﻤﺎم ‪ n‬دﻳﺴ‬‫ﺠﺎ ﮐﺮد‪.‬‬
‫ در هﺮ ﮔﺎم ﺗﻨﻬﺎ ﻳﮑﯽ از ددﻳﺴﮏ هﺎ راﻣﻣﯽ ﺗﻮان ﺟﺎﺑﺠ‬‫ﮑﺘﺮ ﻗﺮار داد‪.‬‬
‫ﺑﺰرگ ﺗﺮ را روﯼ ددﻳﺴﮏ ﮐﻮﭼﮑ‬
‫ ﻧﻤﯽ ﺗﻮان ددﻳﺴﮏ گ‬‫ﻧﻤﻮﻧﻪ اﺟﺮاﯼ ﺑﺮﻧﺎﻣﻪ‪:‬‬
‫‪Enter n: 3‬‬
‫‪The soluttion is:‬‬
‫‪A->C‬‬
‫‪A->B‬‬
‫‪C->B‬‬
‫‪A->C‬‬
‫‪B->A‬‬
‫‪B->C‬‬
‫‪A->C‬‬