والا من پاسکال بلد نیستم!
اما برای منطق برنامه میتونم راهنماییتون کنم
اول از همه ورودی رو میگیرید و میریزید تو یه رشته!
در مرحله دوم این رشته رو تفکیک میکیند یعنی عددها رو از بقیه چیزها جدا میکنید و میریزید تو یه آرایه!
تفکیک عدد از بقیه چیزها هم که کاری نداره! تو رشته میرین جلو و هی تا جایی که رقم هست در 10 ضرب میکنید با رقم جدید جمع میکنید تا برسید به جایی که رقم نیست!
یه مثال بزنم:
مثلا ورودی بوده
خوب اینجا اول پذرانتز باز رو می خونید که چون رقم نیست میریزیدش تو یه خونه آرایه بعد 5 رو میخونید که عدد هست و میریزیدش تو یه متغیر، بعد 2 رو میخونید که رقم هست، 5 رو در 10 ضرب میکنید و با 2 جمع میکنید و دوباره تو همون متغیر نگه میدارید. حالا علامت + رو میخونید که چون رقم نیست، 52 رو تو یه خونه آرایه میریزید و + رو تو یه خونه و به همین ترتیب ادامه میدید، آخر سر تو یه آرایه عددها و عملگرها رو جدا جدا دارید. اگه بخواید سینوس و اینا هم حساب کنه این مرحله یه خورده طولانی تر میشه ولی اونم خیلی سخت نیست.
خوب حالا که عملوندها و عملگرها تفکیک شدند، باید حساب کنید و اینجا هست که باید اولویت عملگرها و پرانتز رو لحاظ کنید!
خوب برای راحت تر شدن محاسبه باید فرم میانوندی یا همون اینفیکس رو به postfix تبدیل کنید که الگوریتمش به صورت زیر هست:
1- عبارت infix رو از چپ به راست پیمایش میکنیم(از اول آرایه به آخرش)
2- پرانتزهای سمت چپ (پرانتز باز) رو تو استک پوش میکنیم
3- هنگامی که به یک عملوند میرسیم آن را در یک صف مینویسیم.
4- هنگامی که به یک عملگر میرسیم آنگاه عملگرهای بالای استک را که دارای اولویتی یکسان یا بالاتر از آن هستند پاپ میکنیم و در صف میریزیم و سپس عملگر را در استک پوش میکنیم
5- هنگامی که به پرانتز سمت راست (پرانتز بسته) میرسیم آنگاه عملگرهای بالای استک را پاپ کرده و در صف میریزیم تا زمانی که به پرانتز سمت چپ استک برسیم و آن را پاپ میکنیم.
اینجا اگه بخوای کلاس بزاری می تونی صف رو چاپ کنی که معلوم بشه فرم postfix رو حساب کردی!
خوب بعد از به دست آوردن فرم postfix کار محاسبه آسون هست و باید از سر صف عملوند ها رو برداری تا برسی به عملگر، بعد عملگر رو اعمال کنی و نتیجه رو دوباره بزاری سر صف! پرانتزی هم که نمونده! آخر دست نتیجه به دست میاد! البته میشه مستقیم هم محاسبه کرد، الگوریتم مستقیمش شبیه همین هست الان دقیقش یادم نمیاد!
نکته:
1- اگه منفی تک عملوندی داری (منفی که عدد رو منفی میکنه!) باید علامت خاصی براش تعریف بشه و ...
2- سینوس و اینا رو هم بخوای بزاری یه خورده سخت تر میشه!
3- امیدوارم تونسته باشم توضیح بدم! کد سی این رو یه زمانی به عنوان تکلیف داشتیم، اما پیداش نکردم که براتون بزارمش!
4- اینم یه نمونه ساده از کار کرد برنامه!
کد:
vorudi: ((52+34)*(23+34))
tabdil be araye:
( ( 52 + 34 ) * ( 23 + 34 ) )
tabdil be postfix:
saf: 52 34 + 23 34 + *
mohasebat: saf:52 34 + 23 34 + *
a)52+34=86 saf:86 23 34 + *
b)23+34=57 saf:86 57 *
c)57*86=4092 saf:4092
khoruji=4092