Expression trees and differential

‫ﺑﺴﻢ اﷲ اﻟﺮﺣﻤﻦ اﻟﺮﺣﻴﻢ‬
‫داﻧﺸﮕﺎه ﺻﻨﻌﺘﻲ ﺷﺮﻳﻒ‬
‫داﻧﺸﻜﺪه ﻣﻬﻨﺪﺳﻲ ﻛﺎﻣﭙﻴﻮﺗﺮ‬
‫ﻣﺒﺎﻧﻲ ﺑﺮﻧﺎﻣﻪ ﺳﺎزي ﺑﻪ زﺑﺎن ‪C / C++‬‬
‫ﭘﺮوژه ﭘﺎﻳﺎﻧﻲ‬
‫دﻳﻔﺮاﻧﺴﻴﻞ‬
‫‪ 2-3‬ﻧﻔﺮ‬
‫ﻫﻤﻪ ﺷﻤﺎ ﺑﺎ ﻧﻤﺎﻳﺶ ﻳﻚ ﻋﺒﺎرت رﻳﺎﺿﻲ ﺑﻪ ﺻﻮرت ﻋﺎدي آﺷﻨﺎ ﻫﺴﺘﻴﺪ‪ .‬راﻳﺞ ﺗﺮﻳﻦ ﺻﻮرت ﺑﻴﺎن ﻳﻚ ﻋﺒـﺎرت ﺑـﻪ ﺻـﻮرت‬
‫ﻣﻴﺎن وﻧﺪي ‪ 1‬ﻣﻲ ﺑﺎﺷﺪ‪ .‬ﺑﺮاي ﻣﺜﺎل ﻋﺒﺎرت زﻳﺮ را در ﻧﻈﺮ ﺑﮕﻴﺮﻳﺪ‪:‬‬
‫‪(x+y)-2*z‬‬
‫)‪(1‬‬
‫در اﻳﻦ ﺷﻴﻮه ﻧﻤﺎﻳﺶ اوﻟﻴﻮﻳﺖ ﻋﻤﻠﮕﺮﻫﺎ ﺑﺎ ﻛﻤﻚ ﭘﺮاﻧﺘﺰ و از ﭼﭗ ﺑﻪ راﺳﺖ ﺗﻌﻴﻴﻦ ﻣﻲ ﺷﻮد‪ .‬ﺑﺎ وﺟـﻮدي ﻛـﻪ اﻳـﻦ ﻋﺒـﺎرت‬
‫ﻣﻤﻜﻦ اﺳﺖ ﺑﺮاي ﺑﺴﻴﺎري از ﻣﺎ آﺷﻨﺎ ﺑﺎﺷﺪ وﻟﻲ ﭘﻴﺎده ﺳﺎزي آن در زﺑﺎن ﻫﺎي ﺑﺮﻧﺎﻣﻪ ﺳﺎزي ﻣﺸﻜﻞ اﺳﺖ‪ .‬واﺿﺢ ﺗﺮﻳﻦ دﻟﻴﻞ آن ﻫـﻢ‬
‫ﺗﻘﺪم ﻋﻤﻠﮕﺮ ﻫﺎ ﺑﺮ ﻫﻤﺪﻳﮕﺮ ﻣﻲ ﺑﺎﺷﻨﺪ‪ .‬ﺑﺮاي ﺣﻞ اﻳﻦ ﻣﺸﻜﻞ در ﺑﺴﻴﺎري از ﺑﺮﻧﺎﻣﻪ ﻫﺎي رﻳﺎﺿﻲ از ﻧﻤﺎﻳﺶ ﭘﻴﺶ وﻧﺪي ‪ 2‬ﻳـﺎ ﻧﻤـﺎﻳﺶ‬
‫ﭘﺲ وﻧﺪي ‪ 3‬اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻨﺪ‪.‬‬
‫ﺑﺮاي ﻣﺜﺎل ﺻﻮرت ﭘﻴﺶ وﻧﺪي و ﭘﺲ وﻧﺪي ﻋﺒﺎرت ‪ 1‬ﺑﻪ ﺻﻮرت زﻳﺮ ﺧﻮاﻫﺪ ﺑﻮد‪.‬‬
‫‪-+xy*2z‬‬
‫ﭘﻴﺶ وﻧﺪي‪:‬‬
‫*‪xy+2z‬‬‫ﭘﺲ وﻧﺪي‪:‬‬
‫ﻫﺪف اﻳﻦ ﭘﺮوژه اﻳﻦ اﺳﺖ ﻛﻪ ﻳﻚ ﻋﺒﺎرت را ﺑﻪ ﺻﻮرت ﻣﻴﺎن وﻧﺪي درﻳﺎﻓﺖ ﻛﺮده و ﺑﺘﻮاﻧﺪ ﺣﺎﺻﻞ آﻧﺮا ﺣﺴﺎب‬
‫ﻛﻨﺪ و ﻳﺎ از آن ﻣﺸﺘﻖ ﺑﮕﻴﺮد‪.‬‬
‫‪infix 1‬‬
‫‪prefix 2‬‬
‫‪postfix 3‬‬
‫• ﻧﻤﺎﻳﺶ ﻟﻬﺴﺘﺎﻧﻲ ‪: 4‬‬
‫در اﻳﻦ ﺷﻴﻮه ﺑﻴﺎن ﻋﺒﺎرت ﻛﻪ ﻋﺒﺎرت ﻫﺎ ﺑﺮ اﺳﺎس اوﻟﻮﻳﺖ ﺷﺎن ﻣﺮﺗﺐ ﻣﻲ ﺷﻮﻧﺪ ﻧﻤﺎﻳﺶ ﻟﻬﺴﺘﺎﻧﻲ ) ﻳﺎ ﺑﻪ ﻋﺒـﺎرت دﻳﮕـﺮ ﭘـﻴﺶ‬
‫وﻧﺪي ﻳﺎ ﭘﺲ وﻧﺪي ( ﻧﺎﻣﻴﺪه ﻣﻲ ﺷﻮد‪ .‬ﻣﺤﺎﺳﺒﻪ ﻋﺒﺎرت ﻫﺎي اﻳﻨﭽﻨﻴﻨﻲ آﺳﺎن اﺳﺖ ﭼﺮا ﻛﻪ ﻛﺎﻓﻲ اﺳـﺖ ﻋﺒـﺎرت ورودي را ﺑـﻪ‬
‫ﺗﺮﺗﻴﺐ ﭘﻴﻤﺎﻳﺶ ﻛﺮده و ﺑﺎﻛﻤﻚ ﻳﻚ ﭘﺸﺘﻪ ﻳﺎ آراﻳﻪ ﻣﻘﺪار ﻋﺒﺎرت را ﺣﺴﺎب ﻧﻤﺎﻳﻴﻢ‪.‬‬
‫• درﺧﺖ ﻋﺒﺎرت‪:‬‬
‫درﺧﺖ ﻋﺒﺎرت ﻳﻚ درﺧﺖ دودوﻳﻲ و داده ﺳﺎﺧﺘﺎري ﻣﻨﺎﺳﺐ ﺑﺮاي ذﺧﻴﺮه ﺳﺎزي ﻋﺒﺎرت ﻫﺎي رﻳﺎﺿﻲ ﻣﻲ ﺑﺎﺷﺪ‪ .‬ﻧﻤﻮﻧﻪ اي‬
‫از اﻳﻦ درﺧﺖ ﻫﺎ و ﻋﺒﺎرت ﻫﺎي ﻣﺮﺑﻮﻃﻪ را در ﺷﻜﻞ‪ 2‬ﻣﻲ ﺑﻴﻨﻴﺪ‪ .‬ﺑﺪﻳﻬﻲ اﺳﺖ ﻛﻪ ﺑﺎ داﺷﺘﻦ رﻳﺸﻪ ﻳﻚ درﺧـﺖ و اﻧﺠـﺎم‬
‫ﻋﻤﻞ ﭘﻴﻤـﺎﻳﺶ ‪ inorder‬ﻣـﻲ ﺗـﻮان ﺻـﻮرت ﻣﻴـﺎن وﻧـﺪي ﻋﺒـﺎرت را ﺑﺪﺳـﺖ آورد‪ .‬ﭘﻴﻤـﺎﻳﺶ ﻫـﺎي ‪ preorder‬و‬
‫‪ postorder‬ﺑﻪ ﺗﺮﺗﻴﺐ ﺻﻮرت ﭘﻴﺶ وﻧﺪي و ﭘﺲ وﻧﺪي ﻋﺒﺎرت را ﺑﺪﺳﺖ ﻣﻲ دﻫﻨﺪ‪.‬‬
‫ﺑﺮاي ﻣﺜﺎل درﺧﺖ ﻋﺒﺎرت ﻣﺜﺎل ‪ 1‬ﺑﻪ ﺻﻮرت زﻳﺮ اﺳﺖ‪:‬‬
‫ﭘﻴﻤﺎﻳﺶ ‪ inorder‬درﺧﺖ ﺑﻪ ﺻﻮرت ﺑﺎزﮔﺸﺘﻲ ﺑﻪ ﺻﻮرت زﻳﺮ اﺳﺖ‪:‬‬
‫{)‪void inorder(node* x‬‬
‫;)‪inorder(x->left‬‬
‫; " " << ‪cout << x->value‬‬
‫;)‪inorder(x->right‬‬
‫}‬
‫ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﮔﻔﺘﻪ ﺷﺪ ﺑﺎ ﻛﻤﻚ اﻳﻦ ﭘﻴﻤﺎﻳﺶ ﺑﺮ روي ﻳﻚ درﺧﺖ ﻋﺒﺎرت ﻣﻲ ﺗﻮاﻧﻴﺪ ﺻﻮرت ﻣﻴﺎن وﻧﺪي آن را ﺗﻬﻴﻪ ﻛﻨﻴﺪ‪.‬‬
‫ﭘﻴﻤﺎﻳﺶ ‪ preOrder‬و ‪ postOrder‬ﻫﻢ ﺑﻪ ﺻﻮرت ﻣﺸﺎﺑﻬﻲ ﻣﻲ ﺑﺎﺷﻨﺪ‪ .‬اﻳﺠﺎد ﺻﻮرت ﻛﺎﻣﻼً ﭘﺮاﻧﺘﺮي ﺑﺎ داﺷﺘﻦ درﺧـﺖ ﻋﺒـﺎرت‬
‫ﺑﺪﻳﻬﻲ اﺳﺖ‪.‬‬
‫‪Polish Notation 4‬‬
‫• ﻗﻮاﻧﻴﻦ ﻣﺸﺘﻖ ﮔﻴﺮي‪:‬‬
‫ﺑﺮاي ﻣﺘﻐﻴﺮ ‪ x‬ﻣﻲ ﺗﻮاﻧﻴﺪ از ﻗﻮاﻋﺪ ﻣﺸﺘﻖ ﮔﻴﺮي زﻳﺮ اﺳﺘﻔﺎده ﻛﻨﻴﺪ‪:‬‬
‫‪d‬‬
‫‪k =0‬‬
‫‪dx‬‬
‫‪d‬‬
‫‪x =1‬‬
‫‪dx‬‬
‫‪d‬‬
‫‪d‬‬
‫‪d‬‬
‫)‪( F ( x) ± G ( x)) = F ( x) ± G ( x‬‬
‫‪dx‬‬
‫‪dx‬‬
‫‪dx‬‬
‫‪d‬‬
‫‪d‬‬
‫‪d‬‬
‫)‪( F ( x) × G ( x)) = F ( x) × G ( x) + G ( x) × F ( x‬‬
‫‪dx‬‬
‫‪dx‬‬
‫‪dx‬‬
‫‪d‬‬
‫‪d‬‬
‫)‪G ( x) × F ( x) − F ( x) × G ( x‬‬
‫⎛‬
‫⎞‬
‫)‪d F ( x‬‬
‫‪dx‬‬
‫‪dx‬‬
‫⎜⎜‬
‫= ⎟⎟‬
‫‪2‬‬
‫⎠ )‪dx ⎝ G ( x‬‬
‫)‪G ( x‬‬
‫ﺑﻌﺪ از ﻫﺮ ﻋﻤﻞ ﻣﺸﺘﻖ ﮔﻴﺮي درﺧﺖ ﻋﺒﺎرت ﺷﻤﺎ ﺑﻪ ﺻﻮرت زﻳﺮ ﺗﻐﻴﻴﺮ ﻣﻲ ﻧﻤﺎﻳﺪ‪:‬‬
‫• ﭘﻴﺎده ﺳﺎزي درﺧﺖ‪:‬‬
‫ﺑﺮاي ﭘﻴﺎده ﺳﺎزي درﺧﺖ در ﻫﺮ ﮔﺮه از دو اﺷﺎره ﮔﺮ ﺑﻪ ﻓﺮزﻧﺪ ﭼﭗ و راﺳﺖ آن اﺳﺘﻔﺎده ﻛﻨﻴﺪ‪ .‬ﺑﻪ ﻋﻼوه رﻳـﺸﻪ درﺧـﺖ را ﺑـﻪ ﻋﻨـﻮان‬
‫ﻳﻚ ﻣﺘﻐﻴﺮ ﺳﺮاﺳﺮي ﻧﮕﻬﺪاري ﻧﻤﺎﻳﻴﺪ‪.‬‬
‫{‪struct node‬‬
‫; ‪node* left‬‬
‫; ‪node* right‬‬
‫; ‪char value‬‬
‫; ‪} *root‬‬
‫• راﻫﻨﻤﺎﻳﻲ‪:‬‬
‫ﺗﻮﺻﻴﻪ ﻣﻲ ﻛﻨﻴﻢ ﺑﺮاي راﺣﺘﻲ ﻋﻤﻞ ﻣﺸﺘﻖ ﮔﻴﺮي و ﻫﻤﻴﻦ ﻃﻮر ﻣﺤﺎﺳﺒﻪ ﻋﺒﺎرت اﺑﺘﺪا ﻋﺒﺎرت را از ﺻﻮرت ﻣﻴﺎن وﻧﺪي ﺑﻪ‬
‫ﭘﻴﺶ وﻧﺪي ﻳﺎ ﭘﺲ وﻧﺪي ﺗﺒﺪﻳﻞ ﻛﺮده و ﺑﻌﺪ درﺧﺖ ﻋﺒﺎرت را از روي آن ﺑﺴﺎزﻳﺪ‪.‬‬
‫•‬
‫ورودي‪/‬ﺧﺮوﺟﻲ‪:‬‬
‫ورودي ﺧﻮد را از ‪ standard input‬ﺑﺨﻮاﻧﻴﺪ و ﺧﺮوﺟـﻲ ﺗـﺎن را ﺑـﺮ روي ‪standard‬‬
‫‪ output‬ﺑﻨﻮﻳﺴﻴﺪ‪.‬‬
‫‪5‬‬
‫‪ .1‬ورودي ﺑﺮﻧﺎﻣﻪ‪:‬‬
‫ورودي ﺑﺮﻧﺎﻣﻪ ﻳﻚ ﭼﻨﺪ ﺟﻤﻠﻪ اي از از ﻣﺘﻐﻴﺮ ‪ x‬ﺑﻪ ﺻﻮرت ﻣﻴﺎﻧﻮﻧﺪي ﻣﻲ ﺑﺎﺷﺪ‪ .‬اﻳﻦ ﭼﻨﺪ ﺟﻤﻠﻪ اي ﻣﻤﻜـﻦ‬
‫اﺳﺖ ﺷﺎﻣﻞ ﭘﺮاﻧﺘﺰ‪ ،‬ﻋﻤﻞ ﺿﺮب ﻳﺎ ﻋﻤﻞ ﺗﻘﺴﻴﻢ ﻳﺎ ﻋﺪد ﺛﺎﺑﺖ ﺑﺎﺷﺪ‪ .‬ﻓﺮض ﻛﻨﻴﺪ اﻋﺪاد ﺛﺎﺑﺖ ﻫﻤﻪ ﻳﻚ رﻗﻤـﻲ‬
‫ﻫﺴﺘﻨﺪ‪ .‬در ﻧﺘﻴﺠﻪ در ﺳﺎﺧﺘﺎر ﮔﺮه اﺳﺘﻔﺎده از ﻧﻮع داده ‪ char‬ﺑﺮاي ﻧﮕﻪ داري ﻫﻤﻪ اﻃﻼﻋﺎت ﻛﺎﻓﻲ ﻣﻲ ﺑﺎﺷﺪ‪.‬‬
‫ﺑﻌﺪ از آن ﭼﻨﺪ ﻣﻘﺪار ورودي ﺑﺮاي ‪ ) x‬از ﻧﻮع ‪ (float‬داده ﻣﻲ ﺷﻮد ﻛﻪ ﺷﻤﺎ ﻣـﻲ ﺑﺎﻳـﺴﺖ ﻣﻘـﺪار ﻋﺒـﺎرت را‬
‫ﺑﺮاي آن ﻣﺤﺎﺳﺒﻪ ﻧﻤﺎﻳﻴﺪ‪.‬‬
‫‪ .2‬ﺧﺮوﺟﻲ ﻫﺎي ﺑﺮﻧﺎﻣﻪ‪:‬‬
‫ƒ ﺑﺮﻧﺎﻣﻪ ﺷﻤﺎ در درﺟﻪ اول ﻣﻲ ﺑﺎﻳﺴﺖ ﻋﺒﺎرت ورودي را ﺑﻪ ﺻﻮرت ﻛﺎﻣﻼ ﭘﺮاﻧﺘﺰي ﺑﻨﻮﻳﺴﺪ‪.‬‬
‫ƒ ﺳﭙﺲ ﺑﺎﻳﺪ از ﻋﺒﺎرت ﻣﻮرد ﻧﻈﺮ ﻣﺸﺘﻖ ﺑﮕﻴﺮﻳﺪ‪.‬‬
‫ƒ در اﻧﺘﻬﺎ ﺑﺎﻳﺪ ﻣﻘﺪار ﻋﺒﺎرت را ﺑﻪ ازاي ﺑﺮﺧﻲ ﻣﻘﺎدﻳﺮ ورودي ﺑﺮاي ﻣﺘﻐﻴﺮ ﻫﺎ ﻣﺤﺎﺳﺒﻪ ﻛﻨﻴﺪ‪.‬‬
‫ﭘﻴﺎده ﺳﺎزي ﻣﻮارد زﻳﺮ ﻣﺸﻤﻮل ﻧﻤﺮه اﺿﺎﻓﻲ ﻣﻲ ﺑﺎﺷﺪ‪:‬‬
‫ﻧﻴﺎزي ﺑﻪ ﺳﺎده ﺳﺎزي ﻋﺒﺎرت ﻧﻴﺴﺖ‪ .‬وﻟﻲ ﺳﺎده ﻛﺮدن آن ﻳﺎ اﻋﻤﺎل اوﻟﻮﻳﺖ ﻫﺎ ﺑﻪ ﺻﻮرت دﻗﻴﻖ ﻣﺸﻤﻮل ﻧﻤﺮه اﺿﺎﻓﻲ ﺧﻮاﻫﺪ ﺑﻮد‪.‬‬
‫ﺑﻪ ﻋﻼوه اﮔﺮ ﺑﺘﻮاﻧﻴﺪ ﻣﻜﺎﻧﻴﺰم ﻣﺪﻳﺮﻳﺖ اﺳﺘﺜﻨﺎء ‪ 6‬را در ﺑﺮﻧﺎﻣﻪ ﺗﺎن ) ﺑـﺎ ﻛﻤـﻚ ‪ exception handling‬زﺑـﺎن ‪ c++‬ﻳـﺎ ﭘﻴـﺎده‬
‫ﺳﺎزي ﺗﻮﺳﻂ ﺧﻮدﺗﺎن( را ﭘﻴﺎده ﻛﻨﻴﺪ ﺑﻪ ﺻﻮرﺗﻲ ﻛﻪ ﺑﺘﻮاﻧﺪ ﺧﻄﺎﻫﺎي ﺳﺎده ﻣﺎﻧﻨﺪ ﺗﻘﺴﻴﻢ ﺑﺮ ﺻﻔﺮ را ﺗﺸﺨﻴﺺ دﻫﺪ ﻧﻤﺮه اﺿﺎﻓﻪ درﻳﺎﻓﺖ‬
‫ﺧﻮاﻫﻴﺪ ﻛﺮد‪ .‬در ﺻﻮرت رﺧﺪاد ﺧﻄﺎ ﻓﻘﻂ ﭘﻴﻐﺎم ‪ error‬را ﺑﺮ روي ﺻﻔﺤﻪ ﭼﺎپ ﻛﺮده و ﺑﻪ ﻛﺎر ﺧﻮد اداﻣﻪ دﻫﻴﺪ‪.‬‬
‫در اﻧﺘﻬﺎ اﮔﺮ ﻋﻼوه ﺑﺮ ﻣﻘﺪار ﻋﺒﺎرت ﻣﻘﺪار ﻣﺸﺘﻖ آﻧﺮا ﻫﻢ ﺣﺴﺎب ﻛﺮده و ﭼﺎپ ﻛﻨﻴﺪ ﻧﻤﺮه اﺿﺎﻓﻲ ﺗﺮي درﻳﺎﻓﺖ ﻣﻲ ﻛﻨﻴﺪ‪.‬‬
‫‪5‬‬
‫ﺑﺮاي اﻳﻦ ﻛﺎر از ‪ header file‬ﻫﺎي ‪)stdio.h‬ﺑﺮاي زﺑﺎن ‪ (C‬و ﻓﺎﻳﻞ ‪ ) iostream‬ﺑﺮاي زﺑﺎن ‪ (C++‬اﺳﺘﻔﺎده ﻛﻨﻴﺪ‪.‬‬
‫‪Exception handling 6‬‬
‫ﻣﺜﺎل‪:‬‬
‫ورودي‪:‬‬
‫)‪(x*x*x)-(x)/(2*x–3‬‬
‫‪4.3‬‬
‫‪1.5‬‬
‫‪0‬‬
‫ﺧﺮوﺟﻲ‪:‬‬
‫))‪((((x*x)*x)-x)/((2*x)-3‬‬
‫))‪((3*x*x-1)*(2*x-3)-(2)*(x*x*x-x)/((2*x-3)*(2*x-3‬‬
‫‪13.429821‬‬
‫‪error‬‬
‫‪0‬‬
‫• ﺗﻮﺟﻪ ﺑﺴﻴﺎر ﻣﻬﻢ‪:‬‬
‫ﺑﺮﻧﺎﻣﻪ ﺷﻤﺎ ﺑﺎﻳﺪ در زﻣﺎن ﺗﺤﻮﻳﻞ ﻛﻤﭙﺎﻳﻞ و اﺟﺮا ﺷﻮد و ﺑﺘﻮاﻧﺪ ﺑﺮاي ﺗﺴﺖ ﻫﺎي ورودي ﺧﺮوﺟﻲ ﺻﺤﻴﺢ اﻳﺠﺎد ﻛﻨﺪ‪.‬‬
‫ﻛــﺪ ﻣﻨﺒــﻊ ﭘــﺮوژه ﺧﻮدﺗــﺎن را ﺑــﻪ ﻫﻤــﺮاه ﻣــﺴﺘﻨﺪات ﻣﺮﺑــﻮط ﺑــﻪ آن را در ﻏﺎﻟــﺐ ﻳــﻚ ﻓﺎﻳــﻞ ﻓــﺸﺮده ‪ 7‬ﺑــﻪ ﻧــﺎم‬
‫‪ differential‬ﺗﺎ زﻣﺎن ﺗﺤﻮﻳﻞ ﺑﻪ آدرس ‪ [email protected]‬ارﺳﺎل ﻧﻤﺎﻳﻴﺪ‪ .‬ﻓﻴﻠﺪ ‪ subject‬ﻧﺎﻣﻪ ﺧﻮد را ﺑﺮاﺑـﺮ‬
‫ﺑﺎ )‪ Project2-differential-(8510xxxx-8510xxxx-8510xxxx‬ﻗﺮار دﻫﻴﺪ ﻛﻪ در آن ‪ xxxx‬ﭼﻬﺎر رﻗﻢ اﻧﺘﻬـﺎﻳﻲ‬
‫ﺷﻤﺎره داﻧﺸﺠﻮﻳﻲ اﻋﻀﺎي ﺗﻴﻢ ﺷﻤﺎ ﻣﻲ ﺑﺎﺷﺪ‪.‬‬
‫ﻟﻄﻔﺎً ﺗﻮﺟﻪ ﻛﻨﻴﺪ ﻛﻪ ﺗﺤﻮﻳﻞ ﭘﺮوژه ﻫﺎ ﺑﻪ ﺻﻮرت ﺣﻀﻮري ﻣﻲ ﺑﺎﺷﺪ‪.‬‬
‫ﻣﻮﻓﻖ ﺑﺎﺷﻴﺪ‪.‬‬
‫‪7‬‬
‫ﺑﺎ ﻓﺮﻣﺖ ‪ rar ،zip‬ﻳﺎ ‪tar‬‬