PDA

View Full Version : اولویت بندی پرانتزها



saeid.yavary
شنبه 20 بهمن 1386, 17:26 عصر
سلام
می خواستم یک برنامه با ++c بنویسم که یک رشته مثل
4+(5*2-3)*4
دریافت کنه و با توجه به الویت بندی () و عملگرها جواب رو بده.
اگه می تونید راهنماییم کنید.

emad_67
شنبه 20 بهمن 1386, 18:53 عصر
میتونی عبارتی رو وارد شده به postfix تبدیل کنی و بعد با استفاده از stack پردازشش کنی.

saeid.yavary
یک شنبه 21 بهمن 1386, 11:35 صبح
سلام
برنامه رو تونستم تکمیلش کنم اینم کدش


#include<iostream.h>
#include<conio.h>
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
int convert (char,int);
avg(char);
func(char);
char ch=NULL,ch1=NULL,sw=NULL,sw1=NULL,opt=NULL;
char s[50]="";
int i,sum[10],count=0;
main(){
clrscr();
cout<<"enter your sentence :";
cin>>s;
for(i=0;s[i];i++)
{ if (s[i]<48 || s[i]>57)
{func(s[i]);
count++;}
else
sum[count]=convert(s[i],sum[count]);
}
if(ch1 !=NULL)
avg(ch1);
if(ch!=NULL)
avg(ch);
cout<<sum[count];
getch();
}//******************************
int convert (char c,int d){
switch (c)
{
case '0':d=10*d+0;break;
case '1':d=10*d+1;break;
case '2':d=10*d+2;break;
case '3':d=10*d+3;break;
case '4':d=10*d+4;break;
case '5':d=10*d+5;break;
case '6':d=10*d+6;break;
case '7':d=10*d+7;break;
case '8':d=10*d+8;break;
case '9':d=10*d+9;break;
}
return d;
}//***************************************
func(char s){
if(s=='('){
opt='(';
count--;
return 0;}
if(s==')') {
opt=')';
}
if(opt==NULL)
{
if(ch==NULL)
{ch=s;
return 0;}
if(ch1==NULL)
{
if(ch=='+' || ch=='-')
{if(s=='+' ||s=='-')
{ avg(ch);
ch=s;}
else if(s=='*' || s=='/')
ch1=s;
}
else
if(ch=='*' || ch=='/')
{avg(ch);
ch=s;}
}
else
if(s=='+' || s=='-')
{avg(ch1);
avg(ch);
ch=s;
ch1=NULL;
}
else
{avg(ch1);
ch1=s;}
}
else if(opt=='(')
{ if(sw==NULL)
{sw=s;
return 0;}
if(sw1==NULL)
{
if(sw=='+' || sw=='-')
{if(s=='+' ||s=='-')
{ avg(sw);
sw=s;}
else if(s=='*' || s=='/')
sw1=s;
}
else
if(sw=='*' || sw=='/')
{avg(sw);
sw=s;}
}
else
if(s=='+' || s=='-')
{avg(sw1);
avg(sw);
sw=s;
sw1=NULL;
}
else
{avg(sw1);
sw1=s;}
}
else
if(opt==')')
{
if(sw1 !=NULL)
avg(sw1);
if(sw !=NULL)
avg(sw);
sw=sw1=NULL;
count--;
}
}//**********************************************
avg(char op){
switch (op){
case '-':
sum[count-1]=sum[count-1] - sum[count];
break;
case '+':
sum[count-1]=sum[count] + sum[count-1];
break;
case '*':
sum[count-1]=sum[count] * sum[count-1];
break;
case '/':
sum[count-1]=sum[count-1] / sum[count];
break;
}
sum[count]=0;
count--;
}//**************************************************

MRHagh
دوشنبه 22 بهمن 1386, 16:06 عصر
سلام
برنامه رو تونستم تکمیلش کنم اینم کدش

دوست عزیز ، برنامه شما اساسا غلط است ... جوابها غیر واقعی و الگوریتم تبدیل کاراکتر به عدد شما ، نادرست است !
بهترین راه برای اولویت بندی پرانتز ها استفاده از پشته و تبدیل عبارت از حالت infix به postfixt یا prefix است . در این رابطه الگوریتم های بسیاری موجود است .

saeid.yavary
پنج شنبه 25 بهمن 1386, 11:02 صبح
سلام

دوست عزیز ، برنامه شما اساسا غلط است ... جوابها غیر واقعی و الگوریتم تبدیل کاراکتر به عدد شما ، نادرست است !

من که امتحان کردم همه جوابها درست بود

بهترین راه برای اولویت بندی پرانتز ها استفاده از پشته و تبدیل عبارت از حالت infix به postfixt یا prefix است . در این رابطه الگوریتم های بسیاری موجود است .
این برنامه هم یک جوری داره از روش پشته استفاده می کنه!

MRHagh
پنج شنبه 25 بهمن 1386, 20:24 عصر
باشه ، قبول ... برنامه درسته !!!!!
خوب شما یک بار برنامه را با مقادیر زیر اجرا کن ، ببین چه جوابی میده ؟!!!

4+(5*2-3)*4
4+(5*4-5)*2
دوست عزیز ، برنامه شما برای حالتهای خاص درست عمل میکنه ،مثالهای بالا نشون میده برنامه در اعمال اولویت عملگرها هم مشکل داره که این موضوع از شکل الگوریتم برنامه هم مشخصه ... موفق باشید !

pesar irooni
پنج شنبه 25 بهمن 1386, 23:47 عصر
آقای MRHagh درست میگند.
برای اولویت بندی پرانتزها باید از روش postfix یا prefix عمل کرد. برنامه های ریاضی هم که میخواد برای CPU ارسال بشه و به زبان اسمبلی ترجمه میشه از این روش استفاده میکنه. چون CPU جز عدد و عملگر چیز دیگه ای نمیشناسه.

Mbt925
جمعه 26 بهمن 1386, 02:29 صبح
این نمونه میتونه کمکتون کنه:

Nima_NF
جمعه 26 بهمن 1386, 12:41 عصر
این برنامه هم یک جوری داره از روش پشته استفاده می کنه!استفاده از postfix یا prefix یا الگوریتم های مشابه یک ضرورت هست و اگر از اینگونه الگوریتم ها استفاده نشود ، پروژه شما حتی اگر برای یادگیری هم باشد کار درستی نیست و برای رشته های بزرگتر بهینه نخواهد بود، مگر اینکه الگوریتمی بهتر از آن ها کشف کرده اید!

حتما روی این الگوریتم ها کار کنید تا با اصول درست پردازش عبارت ها و دستورات آشنا شوید.

MRHagh
یک شنبه 28 بهمن 1386, 11:01 صبح
استفاده از postfix یا prefix یا الگوریتم های مشابه یک ضرورت هست و اگر از اینگونه الگوریتم ها استفاده نشود ، پروژه شما حتی اگر برای یادگیری هم باشد کار درستی نیست و برای رشته های بزرگتر بهینه نخواهد بود، مگر اینکه الگوریتمی بهتر از آن ها کشف کرده اید!

حتما روی این الگوریتم ها کار کنید تا با اصول درست پردازش عبارت ها و دستورات آشنا شوید.

من هم موافقم ، من هم برنامه ای مثل این نوشتم که با دو پشته پیوندی کار میکنه .

saeid.yavary
یک شنبه 28 بهمن 1386, 17:35 عصر
سلام

شما یک بار برنامه را با مقادیر زیر اجرا کن ، ببین چه جوابی میده ؟
شما درست گفتید اون حالت رو دیگه چک نکرده بودم!