PDA

View Full Version : طریقه پرانتز بندی یک عبارت ریاضی



Ghasem Dehghani
پنج شنبه 29 شهریور 1386, 18:15 عصر
با سلام خدمت همه دوستان .
میخواستم منو درباره پراتنز بندی یک عبارت ریاضی با در نظر گرفتن اولویت عملگرها راهنمایی کنید .
مثلا اگر ورودی به صورت زیر بود :

(x+5)-2*x
خروجی زیر رو تولید کنه :

((x+5)-(2*x))
اگه میشه لطفا با کد راهنمایی کنید .
با تشکر فراوان از تمامی دوستان .

emad_67
پنج شنبه 29 شهریور 1386, 20:01 عصر
جواب این کد :


(x+5)-2*x

همون کدی هست که برای خروجی نوشتی
اینم یه نمونه برنامه ساده


#include<iostream.h>
void main()
{
int x=3;
cout<<(x+5)-2*x<<endl;
cout<<((x+5)-(2*x))<<endl;
}

اولویت عمگر ها به ترتیب زیر هست:
( )
*, / , %
+ , -
به طور مثال اولویت دو عملگر + , - یکسان است. وقتی در یه کدی این دو با هم به کار میرن عملگر ها از چپ به راست ارزیابی میشن

Ghasem Dehghani
جمعه 30 شهریور 1386, 08:02 صبح
با تشکر از emad_67 .
منظورم این بود که ما یک جمله ریاضی را از طریق ورودی به برنامه بدهیم و خود برنامه تشخیص بده که چه قسمتی از این جمله ریاضی زودتر باید انجام بشه و بر اساس اون بیاد و برنامه به صورت خودکار پرانتر گذاری کنه .
ممنون میشم اگه باز هم منو راهنمایی کنید .

emad_67
جمعه 30 شهریور 1386, 09:22 صبح
برای محاسبه یه عبارت ریاضی باید اونو به صورت یه رشته تو آرایه ذخیره کنی و بعد شروع به خوندن تک تک کاراکتر ها کنی و وقتی به عملگر ها رسیدی طبق اون عملگر عملیات لازم رو انجام بدی برای مثال فرض کن یه همچین عبارتی داریم :"2+51"
شما باید برنامه رو جوری بنویسی که وقتی به عمگر + رسید کاراکتر های قبل از + رو تا جایی که به عملگر دیگه یا به ابتدای آرایه نرسیده جدا و تبدیل به عدد کنه و بعد همین عملیات رو برای عدد بعد از + هم انجام بده
برای اولویت بندی عملگر ها هم مثلا فرض کن فقط دو عملگر * و + رو داریم که اولویت اونا با هم فرق داره .میتونی با تعریف یه همچین چیزی


char *function="*+";
for(int i=0;i<2;i++)
{
for(j=0;j<strlen(s);j++)
{
if(s[j]==*function)
{
...
}
}
function++;
}

اولویت ها رو رعایت کنی یعنی ابتدا جواب عملگر * به دست میاد و بعد +
به هر حال این روشی بود که خودم استفاده کردم ولی روش دیگه هم که به ذهنم میرسه اینه که در حین ورود اعداد جواب رو محاسبه کنید( تقریبا مثل ماشین حساب ویندوز)
من فعلا عملگر () رو توی برنامه به حساب نمیارم بنابراین بدون عملگر () ,عملگر ها به دو دسته تقسیم بندی میشن :
دسته اول : * % /
دسته دوم : + -
حالا فرض کنید که کاربر همچین عبارتی رو وارد میکنه : "5+2*8"
باید برنامه جوری باشه که به محض اینکه به عملگر های دسته اول بر خورد کرد عملیات مورد نظر رو انجام بده یعنی عبارت بشه "5+16".
در صورتی که عملگر های دسته دوم ابتدا وارد شدن مثلا "2*8+5" باید برنامه صبر کنه تا ببینه عملگر بعدی که وارد میشه چی هست ، در صورتی که از دسته اول بود سریعا جواب اونو حساب کنه یعنی عبارتمون بشه : "16+5" و اگه عملگر دومی که وارد شده از دسته دوم بود ابتدا جواب عملگر اولی رو حساب کنه و بعد به سراغ عملگر جدید بره. حالا اگه الگوریتم رو دست متوجه شده باشی میتونی عملگر () رو هم بهشون اضافه کنی
به هر حال امیدوارم تونسته باشم منظورم رو درست برسونم