ﺑﺴﻢ اﷲ اﻟﺮﺣﻤﻦ اﻟﺮﺣﻴﻢ
داﻧﺸﮕﺎه ﺻﻨﻌﺘﻲ ﺷﺮﻳﻒ
داﻧﺸﻜﺪه ﻣﻬﻨﺪﺳﻲ ﻛﺎﻣﭙﻴﻮﺗﺮ
ﻣﺒﺎﻧﻲ ﺑﺮﻧﺎﻣﻪ ﺳﺎزي ﺑﻪ زﺑﺎن 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
© Copyright 2025 Paperzz