PDA

View Full Version : سوال: تابع بازگشتی



fatemeh.h
شنبه 21 فروردین 1389, 23:07 عصر
این تابعی که من نوشتم قراره حاصل یک عبارت ریاضی رشته ای رو حساب کنه که توش عملگرهای + * ( ) و اعداد 0 تا 99 وجود دارن ولی الگوریتمش مشکل داره و این کارو نمیکنه
ممنون میشم کمکم کنید





int f(char s[],int x,int y)/*x o y ebteda va entehaie reshteyi and ke baiad
f e un hesab she ino gozashtam ta az substr(i,j) estefade nakonam*/
{
int l=strlen(s);
int k;

if(l==1) return s[0]-48;

else
{
for(int i=0;i<l;i++)
{
if((s[i])=='(')//age khune i om "(" bud
{
for(int j=i;j<l;j++)/*hala migarde basteie un parantez ro
peida mikone ta hasele beineshuno hesab kone*/
{
if(s[i]==')') int k=j;// age khune i om ")" bud
}
s[i]= f(s,i+1,k-1);
for(int j=i+1;j<l;j++) s[j]=s[j+(k-j-1)];/*khuneharo be
andaze fasele beine 2parantez+1 mikeshe aghab va hasel ham
tu khune paranteze aval zakhire mishe*/

l=l-(k-i);//meghdre ghablo az tul ham kam mikone
}

else if(s[i]=='*'&&s[i+1]!='(')//age khune i om "*" bud
{
s[i-1]=s[i-1]*s[i+1];//hasel a*b ro tu khune a zakhire mikone
for(int j=i;j<l;j++) s[j]=s[j+2];//2khune hamro mikeshe aghab
l=l-2;

}

else if(s[i]=='+')//age khune i om "+" bud
{
s[i-1]= f(s,0,i-1)+f(s,i+1,l);/*hasele a+b ro tu khune a
zakhire mikone*/
for(int j=i;j<l;j++)
s[j]=s[j+2];
l=l-2;
}
}
}
}

mehrdad.tahvilian
یک شنبه 22 فروردین 1389, 00:10 صبح
الگریتمتون کلا مشکل داره!مخصوصاً توی پیدا کردن پرنتزا مثلا عبارت زیرو در نظر بگیر
3+(2*(4+(3*5)))
احتمالا می‌خوای ماشین حساب بنویسی‌،من یکیشو از ترم قبل دارم خواستی‌ وسعت میفرستم

mehrdad.tahvilian
یک شنبه 22 فروردین 1389, 00:13 صبح
ا ا ا ا ا ا !!!!!ته for‌ها هم که برک نذاشتی!!!!کلا از اول بنویسش ولی‌ یکم فک کن چی‌ مینویسی

fatemeh.h
یک شنبه 22 فروردین 1389, 21:49 عصر
ا ا ا ا ا ا !!!!!ته for‌ها هم که برک نذاشتی!!!!کلا از اول بنویسش ولی‌ یکم فک کن چی‌ مینویسی

گذاشتم ولی وقتی کپی میکنم میریزه بهم
بله ماشین حسابه ولی چون خلاف قوانینه(مخفیش میکنن)نمیتونم ازتون بخوام بفرستین
اگه میشه تو الگوریتمش یکم بهم ایده بدین فقط بازگشتی باشه
ممنون

mehrdad.tahvilian
دوشنبه 23 فروردین 1389, 22:13 عصر
گذاشتم ولی وقتی کپی میکنم میریزه بهم
بله ماشین حسابه ولی چون خلاف قوانینه(مخفیش میکنن)نمیتونم ازتون بخوام بفرستین
اگه میشه تو الگوریتمش یکم بهم ایده بدین فقط بازگشتی باشه
ممنون


سلام،اول یه تابع بنویس که تشخیص بده توی یه عبارت +*/- وجود داره یا نه!!!!!
بعدش یه تابع بازگشتی می‌خوای که عبارت سترینگ میگرد و عدد سهیه بر میگردون
بد توی تابعٔ بازگشتیت شعرت پینیو میذاری اینکه توی عبارت ات */+- وجود نداشته باشه!!!!
در این حالت باید چک کنی‌ اگه مثلا اددت (۹) بود اونو ۹ کنی‌ و به عدد تبدیلش کنی‌ نه رشته!!!!
در حالت بعدی باید بیای عمل گریو که کمترین الویتو داره پیدا کنی‌ و از اونجا عبرتو بشکنی و و تابعٔ بزگشتیو برای هر ۲ طرف که شکوندی کال کنی‌

whitehat
سه شنبه 24 فروردین 1389, 10:14 صبح
این همه تابع برای چی ؟ کافیه با استفاده از پشته عبارت Postfix آن را بسازید و بعد پیمایش کنید. تنها نکته ای که لازمه بهش توجه کنید اینه که برای هر عدد یک فضا در رشته تولیدی در نظر بگیرید مثلا می توانید از یک آرایه برای هر عدد استفاده کنید.