Project-1.pdf

‫ﻣﺒﺎﻧﯽ ﺑﺮﻧﺎﻣﻪﺳﺎزي )‪(40153‬‬
‫‪f‬‬
‫ﻣﺪرس‪ :‬ﺣﻤﯿﺪ ﺿﺮاﺑﯽزاده‬
‫داﻧﺸﮑﺪهي ﻣﻬﻨﺪﺳﯽ ﮐﺎﻣﭙﯿﻮﺗﺮ‬
‫ﭘﺮوژه‪ :‬ﻣﺮﺣﻠﻪي اول‬
‫ﻣﻬﻠﺖ ﺗﺤﻮﯾﻞ‪ :‬ﺳﻪﺷﻨﺒﻪ ‪ 8‬آذر ‪ ،1390‬ﺳﺎﻋﺖ ‪ 9‬ﺻﺒﺢ‬
‫ﭘﺮوژهي ﻧﻬﺎﯾﯽ درس ﻣﺒﺎﻧﯽ ﺑﺮﻧﺎﻣﻪﻧﻮﯾﺴﯽ‪ ،‬ﭘﯿﺎدهﺳﺎزي ﯾﮏ ﺻﻔﺤﻪي ﮔﺴﺘﺮده )‪ (spreadsheet‬ﺧﻮاﻫﺪ ﺑﻮد‪ .‬در اﯾﻦ‬
‫ﻣﺮﺣﻠﻪ‪ ،‬ﺷﻤﺎ ﺑﺮﺧﯽ ﻗﺴﻤﺖﻫﺎي ﻣﻮردﻧﯿﺎز اﯾﻦ ﭘﺮوژه را ﭘﯿﺎدهﺳﺎزي ﻣﯽﮐﻨﯿﺪ‪.‬‬
‫ﻧﮑﺎت ﮐﻠﯽ‬
‫‪ ‬ﮐﺪ ﻫﺮ ﺑﺨﺶ را در ﯾﮏ ﻓﺎﯾﻞ ﺟﺪاﮔﺎﻧﻪ و ﺑﺎ ﻧﺎم ﺧﻮاﺳﺘﻪ ﺷﺪه ﻗﺮار دﻫﯿﺪ‪ .‬ﺑﺎﻻي ﻫﺮ ﻓﺎﯾﻞ ﻧﺎم‪ ،‬ﻧﺎم ﺧﺎﻧﻮادﮔﯽ و‬
‫ﺷﻤﺎرهي داﻧﺶﺟﻮﯾﯽ ﺧﻮد را ذﮐﺮ ﮐﻨﯿﺪ‪.‬‬
‫‪ ‬ﺑﺮﻧﺎﻣﻪﻫﺎي ﻣﺮﺑﻮط ﺑﻪ اﯾﻦ ﻣﺮﺣﻠﻪ ﺑﺎﯾﺪ ﺻﺮﻓﺎً ﺑﻪ زﺑﺎن ‪ C‬ﻧﻮﺷﺘﻪ ﺷﺪه و ﺑﺎ ﮐﺎﻣﭙﺎﯾﻠﺮﻫﺎي اﺳﺘﺎﻧﺪارد ﺳﯽ )‪ (C99‬ﻗﺎﺑﻞ‬
‫ﮐﺎﻣﭙﺎﯾﻞ ﺑﺎﺷﻨﺪ‪.‬‬
‫‪ ‬ﮐﺎﻣﻨﺖﮔﺬاري ﺑﺮاي ﺑﺮﻧﺎﻣﻪﻫﺎ ﺟﺰﺋﯽ از ﻧﻤﺮهي ﺷﻤﺎ اﺳﺖ‪.‬‬
‫‪ ‬ﻣﻮﻋﺪ ارﺳﺎل‪ ،‬ﺳﺎﻋﺖ ‪ 9:00‬ﺻﺒﺢ روز ﺳﻪﺷﻨﺒﻪ ‪ 8‬آذر ﻣﺎه ‪ 1390‬ﺑﻮده و ﺑﻪ ﻫﯿﭻ ﻋﻨﻮان ﺗﻤﺪﯾﺪ ﻧﺨﻮاﻫﺪ ﺷﺪ‪.‬‬
‫‪ ‬در ﺻﻮرت ﺗﺎﺧﯿﺮ‪ ،‬ﺑﻪ ازاي روز اول ‪ ٪30‬از ﻧﻤﺮهي ﺷﻤﺎ ﮐﺎﺳﺘﻪ ﺧﻮاﻫﺪ ﺷﺪ‪ .‬ﺗﺄﺧﯿﺮ ﺑﯿﺸﺘﺮ از ﺑﯿﺴﺖ و ﭼﻬﺎر ﺳﺎﻋﺖ‬
‫ﻗﺎﺑﻞ ﻗﺒﻮل ﻧﯿﺴﺖ‪.‬‬
‫‪ ‬ﻫﻢﻓﮑﺮي ﺑﺎ دﯾﮕﺮ داﻧﺶﺟﻮﯾﺎن ﻣﻮرد ﻗﺒﻮل اﺳﺖ‪ ،‬اﻣﺎ ﻓﺎﯾﻞﻫﺎﯾﯽ ﮐﻪ ﻣﯽﻓﺮﺳﺘﯿﺪ ﺑﺎﯾﺪ ﺑﻪﻃﻮر ﮐﺎﻣﻞ ﺗﻮﺳﻂ ﺧﻮدﺗﺎن‬
‫ﻧﻮﺷﺘﻪ ﺷﺪه ﺑﺎﺷﻨﺪ‪ .‬ﮐﻢﺗﺮﯾﻦ ﺗﺨﻄﯽ از اﯾﻦ ﻣﻮﺿﻮع ﺑﺎﻋﺚ درﯾﺎﻓﺖ ﻧﻤﺮهي ‪ -100‬ﺑﺮاي ﮐﻤﮏدﻫﻨﺪه و ﮐﻤﮏﮔﯿﺮﻧﺪه‬
‫ﺧﻮاﻫﺪ ﺑﻮد و در ﺻﻮرت ﺗﮑﺮار‪ ،‬ﻣﻨﺠﺮ ﺑﻪ ﺣﺬف درس و ﮔﺰارش ﺑﻪ ﮐﻤﯿﺘﻪي اﻧﻀﺒﺎﻃﯽ ﺧﻮاﻫﺪ ﺷﺪ‪.‬‬
‫‪ ‬در ﺻﻮرت وﺟﻮد ﻫﺮﮔﻮﻧﻪ ﻣﺸﮑﻞ‪ ،‬ﺳﻮاﻻت ﺧﻮد را از ﻃﺮﯾﻖ ﺳﯿﺴﺘﻢ ﭘﯿﺎﺗﺰا ﺑﺎ ﮐﻤﮏﻣﺪرﺳﯿﻦ در ﻣﯿﺎن ﺑﮕﺬارﯾﺪ‪.‬‬
‫ﺑﺨﺶ اول‪ :‬ﺗﻮاﺑﻊ اﺑﺘﺪاﯾﯽ‬
‫ﻧﺎم ﻓﺎﯾﻞ‪functions.c :‬‬
‫در اﯾﻦ ﺑﺨﺶ‪ ،‬ﺷﻤﺎ ﺑﺮﺧﯽ ﺗﻮاﺑﻊ اﺑﺘﺪاﯾﯽ ﻣﻮردﻧﯿﺎز ﺻﻔﺤﻪي ﮔﺴﺘﺮده را ﭘﯿﺎدهﺳﺎزي ﻣﯽﮐﻨﯿﺪ‪ .‬ﺑﺮاي راﺣﺘﯽ ﮐﺎر‪ ،‬ﻗﺎﻟﺐ ﮐﻠﯽ‬
‫ﻓﺎﯾﻞ ‪ functions.c‬ﺷﺎﻣﻞ ﺳﺮﺑﺨﺶ ﺗﻮاﺑﻊ در اﺧﺘﯿﺎر ﺷﻤﺎ ﻗﺮار ﮔﺮﻓﺘﻪ اﺳﺖ‪ .‬دﻗﺖ ﮐﻨﯿﺪ ﮐﻪ ﻫﺮ ﯾﮏ از ﺗﻮاﺑﻊ را دﻗﯿﻘﺎْ ﺑﺎ‬
‫ﻫﻤﺎن ﻧﺎم ﺧﻮاﺳﺘﻪﺷﺪه و ﺑﻪ ﻫﻤﺎن ﺻﻮرﺗﯽ ﮐﻪ در ﺳﺮﺑﺨﺶ ﺗﻮاﺑﻊ ذﮐﺮ ﺷﺪه ﭘﯿﺎدهﺳﺎزي ﮐﻨﯿﺪ‪.‬‬
‫ﺗﻮاﺑﻊ‪:‬‬
‫در ﺗﻤﺎﻣﯽ ﺗﻮاﺑﻊ زﯾﺮ‪ ،‬ﯾﮏ آراﯾﻪ از اﻋﺪاد ‪ double‬ﺑﻪ ﻫﻤﺮاه اﻧﺪازهي آن ﺑﻪ ﻋﻨﻮان ورودي ﺑﻪ ﺗﺎﺑﻊ داده ﻣﯽﺷﻮد‪.‬‬
‫‪ :array_sum .1‬ﻣﺠﻤﻮع ﻋﻨﺎﺻﺮ آراﯾﻪ را ﺑﺮﻣﯽﮔﺮداﻧﺪ‪.‬‬
‫;)‪double array_sum (const double array[], int array_size‬‬
‫‪ :array_average .2‬ﻣﯿﺎﻧﮕﯿﻦ اﻋﻀﺎي آراﯾﻪ را ﺑﺮﻣﯽﮔﺮداﻧﺪ‪.‬‬
‫;)‪double array_average (const double array[], int array_size‬‬
‫‪ :array_variance .3‬وارﯾﺎﻧﺲ دادهﻫﺎي درون آراﯾﻪ را ﺑﺎزﻣﯽﮔﺮداﻧﺪ‪.‬‬
‫ﺗﻮﺿﯿﺢ‪ :‬وارﯾﺎﻧﺲ ‪ n‬دادهي ‪ a1, …, an‬ﺑﺎ ﻣﯿﺎﻧﮕﯿﻦ ‪ µ‬ﺑﺮاﺑﺮ اﺳﺖ ﺑﺎ‪:‬‬
‫‪−µ‬‬
‫‪a‬‬
‫‪1‬‬
‫‪n‬‬
‫= )‪(a − µ‬‬
‫‪1‬‬
‫‪n‬‬
‫‪ :array_min .4‬ﮐﻮﭼﮏﺗﺮﯾﻦ ﻋﻨﺼﺮ آراﯾﻪ را ﺑﺮﻣﯽﮔﺮداﻧﺪ‪.‬‬
‫;)‪double array_min (const double array[], int array_size‬‬
‫‪ :array_max .5‬ﺑﺰرگﺗﺮﯾﻦ ﻋﻨﺼﺮ آراﯾﻪ را ﺑﺮﻣﯽﮔﺮداﻧﺪ‪.‬‬
‫;)‪double array_max (const double array[], int array_size‬‬
‫‪ :array_sort .6‬آراﯾﻪي ورودي را ﺑﻪ ﺻﻮرت ﺻﻌﻮدي ﻣﺮﺗﺐ ﻣﯽﮐﻨﺪ‪.‬‬
‫;)‪void array_sort (double array[], int array_size‬‬
‫ﭘﺮوژه‪ :‬ﻣﺮﺣﻠﻪي اول ‪ -‬درس ﻣﺒﺎﻧﯽ ﺑﺮﻧﺎﻣﻪﺳﺎزي‬
‫;)‪double array_variance (const double array[], int array_size‬‬
‫‪1‬‬
‫ﺑﺨﺶ دوم‪ :‬ﮐﺎر ﺑﺎ اﻋﺪاد ﺑﺰرگ‬
‫ﻧﺎم ﻓﺎﯾﻞ‪bignum.c :‬‬
‫ﻫﻤﺎنﻃﻮر ﮐﻪ ﻣﯽداﻧﯿﺪ‪ ،‬ﻫﺮ ﻣﺘﻐﯿﺮ ﺻﺤﯿﺢ ﭼﻬﺎر ﺑﺎﯾﺘﯽ از ﻧﻮع ‪ int‬ﺗﻨﻬﺎ ﻣﯽﺗﻮاﻧﺪ اﻋﺪاد ﺻﺤﯿﺤﯽ در ﺑﺎزهي‬
‫]‪ [-2147483648, 2147483647‬را در ﺧﻮد ﺟﺎي دﻫﺪ‪ .‬ﻣﺘﻐﯿﺮﻫﺎي ﺻﺤﯿﺢ ﻫﺸﺖ ﺑﺎﯾﺘﯽ ﻫﻢ ﺗﻨﻬﺎ ﺑﺮاي اﻋﺪاد‬
‫ﺻﺤﯿﺢ در ﺑﺎزهي ]‪ [-9223372036854775808, 9223372036854775807‬ﮐﺎﻓﯽ ﻫﺴﺘﻨﺪ‪.‬‬
‫ﺑﺮاي ﮐﺎر ﺑﺎ اﻋﺪاد ﺻﺤﯿﺢ ﺑﺰرگﺗﺮ‪ ،‬ﻻزم اﺳﺖ ﮐﻪ ﻫﺮ ﻋﺪد ﺻﺤﯿﺢ ﺑﺰرگ ﺑﻪ ﮐﻤﮏ ﯾﮏ آراﯾﻪ ذﺧﯿﺮه ﺷﻮد‪ .‬ﻫﺪف از اﯾﻦ‬
‫ﺑﺨﺶ‪ ،‬ﭘﯿﺎدهﺳﺎزي ﭼﻨﺪ ﺗﺎﺑﻊ ﺑﺮاي ﮐﺎر ﺑﺎ اﻋﺪاد ﺑﺰرگ‪ ،‬از ﺟﻤﻠﻪ اﻧﺠﺎم ﻋﻤﻠﯿﺎت اﺻﻠﯽ رﯾﺎﺿﯽ اﺳﺖ‪ .‬در اﯾﻦ ﺑﺨﺶ از ﭘﺮوژه‪،‬‬
‫ﺗﻨﻬﺎ اﻋﺪاد ﺑﺰرگ ﺑﺪون ﻋﻼﻣﺖ )اﻋﺪاد ﺣﺴﺎﺑﯽ( ﻣﻮرد ﻧﻈﺮ ﻫﺴﺘﻨﺪ‪ .‬ﻋﻼوه ﺑﺮ اﯾﻦ‪ ،‬ﺑﺮاي ﺳﺎدهﺗﺮ ﺷﺪن ﭘﯿﺎدهﺳﺎزي‪ ،‬ﻓﺮض‬
‫ﻣﯽﮐﻨﯿﻢ ﮐﻪ ﻫﺮ ﻋﺪد ﺑﺰرگ ﺣﺪاﮐﺜﺮ ﺗﻌﺪاد ﺛﺎﺑﺘﯽ )ﻣﺜﻼً ‪ (100‬رﻗﻢ دارد‪ .‬ﺗﻌﺪاد اﯾﻦ ارﻗﺎم ﺗﻮﺳﻂ ﺛﺎﺑﺖ ‪ MAX_DIGITS‬در‬
‫اﺑﺘﺪاي ﺑﺮﻧﺎﻣﻪ ﺗﻌﺮﯾﻒ ﻣﯽﺷﻮد )ﻓﺎﯾﻞ ﻗﺎﻟﺐ ﺿﻤﯿﻤﻪ را ﺑﺒﻨﯿﺪ(‪.‬‬
‫ﻫﺮ ﻋﺪد ﺑﺰرگ در ﯾﮏ آراﯾﻪي ‪ int‬ﺑﻪ اﻧﺪازهي ‪ MAX_DIGITS‬ﻧﮕﻬﺪاري ﻣﯽﺷﻮد‪ .‬ﻫﺮ ﻋﻨﺼﺮ از اﯾﻦ آراﯾﻪ‪ ،‬ﯾﮏ رﻗﻢ از‬
‫ﻋﺪد ﺑﺰرگ را در ﺧﻮد ﺟﺎي ﻣﯽدﻫﺪ‪ :‬ﮐﻢارزشﺗﺮﯾﻦ رﻗﻢ )رﻗﻢ ﯾﮑﺎن( در اوﻟﯿﻦ ﺧﺎﻧﻪي آراﯾﻪ )ﺑﺎ اﻧﺪﯾﺲ ﺻﻔﺮ( ﻗﺮار ﻣﯽﮔﯿﺮد‪،‬‬
‫رﻗﻢ دﻫﮕﺎن در دوﻣﯿﻦ ﺧﺎﻧﻪ )ﺑﺎ اﻧﺪﯾﺲ ﯾﮏ(‪ ،‬و ﺑﻪ ﻫﻤﯿﻦ ﺗﺮﺗﯿﺐ اﻟﯽ آﺧﺮ‪ .‬اﮔﺮ ﻋﺪد ﺑﺰرگ ﮐﻢﺗﺮ از ‪ MAX_DIGITS‬رﻗﻢ‬
‫داﺷﺖ‪ ،‬رﻗﻢﻫﺎي ﺑﺎﻗﯽﻣﺎﻧﺪه در آراﯾﻪ ﺑﺎ ﺻﻔﺮ ﭘﺮ ﻣﯽﺷﻮﻧﺪ‪ .‬اﮔﺮ ﻋﺪد ﺑﺰرگ ﺑﯿﺶ از ‪ MAX_DIGITS‬رﻗﻢ داﺷﺖ‪ ،‬رﻗﻢﻫﺎي‬
‫اﺿﺎﻓﯽ ﻣﻮﻗﻊ ذﺧﯿﺮه در آراﯾﻪ ﺣﺬف ﻣﯽﺷﻮﻧﺪ‪ .‬در اﯾﻦ ﺑﺨﺶ‪ ،‬ﺷﻤﺎ ﺗﻮاﺑﻊ زﯾﺮ را ﭘﯿﺎدهﺳﺎزي ﻣﯽﮐﻨﯿﺪ‪.‬‬
‫ﺗﻮاﺑﻊ ﺗﺒﺪﯾﻠﯽ‪:‬‬
‫ﭘﺮوژه‪ :‬ﻣﺮﺣﻠﻪي اول ‪ -‬درس ﻣﺒﺎﻧﯽ ﺑﺮﻧﺎﻣﻪﺳﺎزي‬
‫‪2‬‬
‫‪ :string_to_big .1‬ﯾﮏ رﺷﺘﻪ از ارﻗﺎم ‪ 0‬ﺗﺎ ‪ 9‬را ﺑﻪ ﯾﮏ ﻋﺪد ﺑﺰرگ ﺗﺒﺪﯾﻞ ﻣﯽﮐﻨﺪ‪ .‬اﮔﺮ ﻃﻮل رﺷﺘﻪ ﺑﯿﺶﺗﺮ از‬
‫‪ MAX_DIGITS‬ﺑﻮد‪ ،‬رﻗﻢﻫﺎي اﺿﺎﻓﯽ ﻣﻮﻗﻊ ﺗﺒﺪﯾﻞ ﺣﺬف ﻣﯽﺷﻮﻧﺪ‪.‬‬
‫‪ :big_to_string .2‬ﯾﮏ ﻋﺪد ﺑﺰرگ را ﺑﻪ ﯾﮏ رﺷﺘﻪ از ارﻗﺎم ‪ 0‬ﺗﺎ ‪ 9‬ﮐﻪ ﺑﻪ ﮐﺎراﮐﺘﺮ ’‪ ‘\0‬ﺧﺘﻢ ﻣﯽﺷﻮد‪ ،‬ﺗﺒﺪﯾﻞ‬
‫ﻣﯽﮐﻨﺪ‪.‬‬
‫‪ :big_to_double .3‬ﯾﮏ ﻋﺪد ﺑﺰرگ را ﺑﻪ ﯾﮏ ﻋﺪد ‪ double‬ﺗﺒﺪﯾﻞ ﻣﯽﮐﻨﺪ‪.‬‬
‫;)][‪void string_to_big (const char str[], int big‬‬
‫;)][‪void big_to_string (const int big[], char str‬‬
‫;)][‪double big_to_double (const int big‬‬
‫ﺗﻮاﺑﻊ رﯾﺎﺿﯽ‪:‬‬
‫‪ :big_add .1‬دو ﻋﺪد ﺑﺰرگ ‪ a‬و ‪ b‬را ﺑﺎ ﻫﻢ ﺟﻤﻊ ﻣﯽﮐﻨﺪ و ﻧﺘﯿﺠﻪ را در آراﯾﻪي ‪ c‬ذﺧﯿﺮه ﻣﯽﮐﻨﺪ‪.‬‬
‫;)][‪void big_add (const int a[], const int b[], int c‬‬
‫‪ :big_subtract .2‬ﻋﺪد ﺑﺰرگ ‪ b‬را از ﻋﺪد ﺑﺰرگ ‪ a‬ﮐﻢ ﮐﺮده‪ ،‬ﻧﺘﯿﺠﻪ را در ‪ c‬ذﺧﯿﺮه ﻣﯽﮐﻨﺪ‪.‬‬
‫;)][‪void big_subtract (const int a[], const int b[], int c‬‬
‫‪ :big_multiply .3‬دو ﻋﺪد ﺑﺰرگ ‪ a‬و ‪ b‬را در ﻫﻢ ﺿﺮب ﮐﺮده‪ ،‬ﻧﺘﯿﺠﻪ را در آراﯾﻪي ‪ c‬ذﺧﯿﺮه ﻣﯽﮐﻨﺪ‪.‬‬
‫;)][‪void big_multiply (const int a[], const int b[], int c‬‬
‫‪ :big_divide .4‬ﻋﺪد ﺑﺰرگ ‪ a‬را ﺑﺮ ﻋﺪد ﺑﺰرگ ‪ b‬ﺗﻘﺴﯿﻢ ﻣﯽﮐﻨﺪ‪ .‬ﺣﺎﺻﻞ ﺗﻘﺴﯿﻢ را ﺑﻪ ﺻﻮرت ﯾﮏ ﻋﺪد ﺑﺰرگ‬
‫در آراﯾﻪي ‪ c‬و ﺑﺎﻗﯽﻣﺎﻧﺪهي ﺗﻘﺴﯿﻢ را در آراﯾﻪي ‪ d‬ذﺧﯿﺮه ﻣﯽﮐﻨﺪ‪.‬‬
‫;)][‪void big_divide (const int a[], const int b[], int c[], int d‬‬
‫ﻧﮑﺎت‪:‬‬
‫‪ ‬در ﺗﻮاﺑﻊ ﺿﺮب و ﺟﻤﻊ‪ ،‬ﻧﺘﯿﺠﻪ ﻋﺪدي ﺑﺎ ‪ MAX_DIGITS‬رﻗﻢ اﺳﺖ و رﻗﻢﻫﺎي اﺿﺎﻓﯽ در ﺻﻮرت وﺟﻮد ﺣﺬف‬
‫ﻣﯽﺷﻮﻧﺪ‪.‬‬
‫‪ ‬در ﺗﺎﺑﻊ ﺗﻔﺮﯾﻖ‪ ،‬اﮔﺮ ﺣﺎﺻﻞ ﺗﻔﺮﯾﻖ‪ ،c ،‬ﮐﻮﭼﮏﺗﺮ از ﺻﻔﺮ ﺑﺎﺷﺪ‪ ،‬ﻧﺘﯿﺠﻪ ﺑﻪ ﺻﻮرت ‪10MAX_DIGITS − c − 1‬‬
‫ﻧﮕﻪداري ﻣﯽﺷﻮد‪.‬‬
‫‪ ‬ﭘﯿﺎدهﺳﺎزي ﺗﺎﺑﻊ ﺗﻘﺴﯿﻢ اﺧﺘﯿﺎري ﺑﻮده و داراي ﻧﻤﺮهي اﺿﺎﻓﯽ اﺳﺖ‪.‬‬
‫ﭘﺮوژه‪ :‬ﻣﺮﺣﻠﻪي اول ‪ -‬درس ﻣﺒﺎﻧﯽ ﺑﺮﻧﺎﻣﻪﺳﺎزي‬
‫‪3‬‬