PDA

View Full Version : کمک در ریزه کاری های محاسبه مقدار postfix (مورد نیاز ضروری)



mahmoudw810
یک شنبه 13 بهمن 1387, 11:51 صبح
دوستان من دارم مقدار عددی یه عبارت postfix رو محاسبه میکنم.طوری که مقدار عدد رو به کاراکتر تبدیل میکنم و بعد از اون استفاده میکنم.مشکل اینجاس که نمیشه روی اعداد اعشاری کار کرد.مثلا میخوایم عدد 0.33 رو در محاسبات استفاده کنیم.اما اگه به کاراکتر تبدیل بشه میشه 0. اصل برنامه اینجاس.کسی میتونه منو کمک کنه؟این مربوط به پروژه ام میشه تا فردا باید تموم شه.دستم به دامنتون.....!
#include <iostream>
using namespace std;
#define max 30
#include <cmath>
char pop(void);
void push(char);
int Isover(void);
int Isunder(void);
int type(char);
void eval(double,double,char);
int top=-1;
char stk[max];
double result=0;
char postfix[max];
int taghadom(char);
int sar=0,i=0,j=0;
char poshte[max];
char infix[max];

void main()
{
cout << "Please enter your mathematic expression :";
cin >> infix ;
for(i=0;infix[i]!='\0';i++)
{
switch(infix[i])
{
case '(' :

if (sar<max)
poshte[++sar]='(';
else
cout << "Stack's full";
break;
case ')' :

while(poshte[sar]!='(')
if (sar!=0)
postfix[j++]=poshte[sar--];
if (poshte[sar]=='(')
sar--;
break;
case '/':
case '*':
case '+':
case '-':
case '^':
if (sar!=0)
{
if (taghadom(infix[i]) > taghadom(poshte[sar]) )
{
if (sar<max)
poshte[++sar]=infix[i];
else
cout << "Stack's full";;

}
else
{
if (sar!=0)
postfix[j++]=poshte[sar--];
if (sar<max)
poshte[++sar]=infix[i];
else
cout << "Stack's full";
}
}
else
if (sar<max)
poshte[++sar]=infix[i];
else
cout << "Stack's full";;

break;

default :
postfix[j++] = infix[i] ;


}

}
while (sar!=0)
if (sar!=0)
postfix[j++]=poshte[sar--];

postfix[j]='\0';
cout << endl << "Your postfix expression is :" << postfix << endl ;

for(i=0;postfix[i]!='\0';i++)
{
switch(type(postfix[i]))
{
case 0 : //it is an operator

push(postfix[i]-48);
break;
//////////////////////////////////////////////////////////////////////////////////

case 1 : //it is an operand

eval((int)pop(),(int)pop(),postfix[i]);
break;
}
}


cout << endl << "Your postfix expression value is :" << result << endl ;



}
/*
//// pop opertation
char khoroj()
{
if (sar!=0)
return poshte[sar--];
}
//// push operation
void vorod(char ch)
{
if (sar<max)
poshte[++sar]=ch;
else
cout << "Stack's full";
}
//// overflow
/*int Isover()
{
if (top == max-1)
return 1;
else
return 0;
}*/
//// underflow
/*int Isunder()
{
if (top == -1)
return 1;
else
return 0;
}*/
/////////////////////////////
int taghadom(char ch)
{
switch(ch)
{
case '(' :
return 1;
break;
case '-' :
return 2;
break;
case '+' :
return 3;
break;
case '*' :
return 4;
break;
case '/' :
return 5;
break;
case '^':
return 6;

}
}

//// pop opertation
char pop()
{
if (!Isunder())
return stk[top--];
}
//// push operation
void push(char ch)
{
if (!Isover())
stk[++top]=ch;
else
cout << "Stack is full";
}
//// overflow
int Isover()
{
if (top == max-1)
return 1;
else
return 0;
}
//// underflow
int Isunder()
{
if (top == -1)
return 1;
else
return 0;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////
int type(char ch)
{
switch(ch)
{

case '-' :
case '+' :
case '*' :
case '/' :
case '^' :
return 1;
break;
default :
return 0;
}
}
///////////////////////////////////////////////////////////////////////
void eval(double opr1,double opr2,char ch)
{


switch(ch)
{

case '-' :
result=opr1-opr2;
break;
case '+' :
result=opr1+opr2;
break;
case '*' :
result=opr1*opr2;
break;
case '/' :
result=opr1/opr2;
break;
case '^' :
result=pow(opr1,opr2);
break;
}

push(result);


}




همونطور که میبینین مشکل در تابع eval و قسمت push(result) هست.

mahmoudw810
یک شنبه 13 بهمن 1387, 11:55 صبح
دوستان من دارم مقدار عددی یه عبارت postfix رو محاسبه میکنم.طوری که مقدار عدد رو به کاراکتر تبدیل میکنم و بعد از اون استفاده میکنم.مشکل اینجاس که نمیشه روی اعداد اعشاری کار کرد.مثلا میخوایم عدد 0.33 رو در محاسبات استفاده کنیم.اما اگه به کاراکتر تبدیل بشه میشه 0. اصل برنامه اینجاس.کسی میتونه منو کمک کنه؟این مربوط به پروژه ام میشه تا فردا باید تموم شه.دستم به دامنتون.....!


#include <iostream>
using namespace std;
#define max 30
#include <cmath>
char pop(void);
void push(char);
int Isover(void);
int Isunder(void);
int type(char);
void eval(double,double,char);
int top=-1;
char stk[max];
double result=0;
char postfix[max];
int taghadom(char);
int sar=0,i=0,j=0;
char poshte[max];
char infix[max];

void main()
{
cout << "Please enter your mathematic expression :";
cin >> infix ;
for(i=0;infix[i]!='\0';i++)
{
switch(infix[i])
{
case '(' :

if (sar<max)
poshte[++sar]='(';
else
cout << "Stack's full";
break;
case ')' :

while(poshte[sar]!='(')
if (sar!=0)
postfix[j++]=poshte[sar--];
if (poshte[sar]=='(')
sar--;
break;
case '/':
case '*':
case '+':
case '-':
case '^':
if (sar!=0)
{
if (taghadom(infix[i]) > taghadom(poshte[sar]) )
{
if (sar<max)
poshte[++sar]=infix[i];
else
cout << "Stack's full";;

}
else
{
if (sar!=0)
postfix[j++]=poshte[sar--];
if (sar<max)
poshte[++sar]=infix[i];
else
cout << "Stack's full";
}
}
else
if (sar<max)
poshte[++sar]=infix[i];
else
cout << "Stack's full";;

break;

default :
postfix[j++] = infix[i] ;


}

}
while (sar!=0)
if (sar!=0)
postfix[j++]=poshte[sar--];

postfix[j]='\0';
cout << endl << "Your postfix expression is :" << postfix << endl ;

for(i=0;postfix[i]!='\0';i++)
{
switch(type(postfix[i]))
{
case 0 : //it is an operator

push(postfix[i]-48);
break;
//////////////////////////////////////////////////////////////////////////////////

case 1 : //it is an operand

eval((int)pop(),(int)pop(),postfix[i]);
break;
}
}


cout << endl << "Your postfix expression value is :" << result << endl ;



}
/*
//// pop opertation
char khoroj()
{
if (sar!=0)
return poshte[sar--];
}
//// push operation
void vorod(char ch)
{
if (sar<max)
poshte[++sar]=ch;
else
cout << "Stack's full";
}
//// overflow
/*int Isover()
{
if (top == max-1)
return 1;
else
return 0;
}*/
//// underflow
/*int Isunder()
{
if (top == -1)
return 1;
else
return 0;
}*/
/////////////////////////////
int taghadom(char ch)
{
switch(ch)
{
case '(' :
return 1;
break;
case '-' :
return 2;
break;
case '+' :
return 3;
break;
case '*' :
return 4;
break;
case '/' :
return 5;
break;
case '^':
return 6;

}
}

//// pop opertation
char pop()
{
if (!Isunder())
return stk[top--];
}
//// push operation
void push(char ch)
{
if (!Isover())
stk[++top]=ch;
else
cout << "Stack is full";
}
//// overflow
int Isover()
{
if (top == max-1)
return 1;
else
return 0;
}
//// underflow
int Isunder()
{
if (top == -1)
return 1;
else
return 0;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////
int type(char ch)
{
switch(ch)
{

case '-' :
case '+' :
case '*' :
case '/' :
case '^' :
return 1;
break;
default :
return 0;
}
}
///////////////////////////////////////////////////////////////////////
void eval(double opr1,double opr2,char ch)
{


switch(ch)
{

case '-' :
result=opr1-opr2;
break;
case '+' :
result=opr1+opr2;
break;
case '*' :
result=opr1*opr2;
break;
case '/' :
result=opr1/opr2;
break;
case '^' :
result=pow(opr1,opr2);
break;
}

push(result);


}

mahmoudw810
یک شنبه 13 بهمن 1387, 11:58 صبح
دوستان من دارم مقدار عددی یه عبارت postfix رو محاسبه میکنم.طوری که مقدار عدد رو به کاراکتر تبدیل میکنم و بعد از اون استفاده میکنم.مشکل اینجاس که نمیشه روی اعداد اعشاری کار کرد.مثلا میخوایم عدد 0.33 رو در محاسبات استفاده کنیم.اما اگه به کاراکتر تبدیل بشه میشه 0. اصل برنامه اینجاس.کسی میتونه منو کمک کنه؟این مربوط به پروژه ام میشه تا فردا باید تموم شه.دستم به دامنتون.....!


#include <iostream>
using namespace std;
#define max 30
#include <cmath>
char pop(void);
void push(char);
int Isover(void);
int Isunder(void);
int type(char);
void eval(double,double,char);
int top=-1;
char stk[max];
double result=0;
char postfix[max];
int taghadom(char);
int sar=0,i=0,j=0;
char poshte[max];
char infix[max];

void main()
{
cout << "Please enter your mathematic expression :";
cin >> infix ;
for(i=0;infix[i]!='\0';i++)
{
switch(infix[i])
{
case '(' :

if (sar<max)
poshte[++sar]='(';
else
cout << "Stack's full";
break;
case ')' :

while(poshte[sar]!='(')
if (sar!=0)
postfix[j++]=poshte[sar--];
if (poshte[sar]=='(')
sar--;
break;
case '/':
case '*':
case '+':
case '-':
case '^':
if (sar!=0)
{
if (taghadom(infix[i]) > taghadom(poshte[sar]) )
{
if (sar<max)
poshte[++sar]=infix[i];
else
cout << "Stack's full";;

}
else
{
if (sar!=0)
postfix[j++]=poshte[sar--];
if (sar<max)
poshte[++sar]=infix[i];
else
cout << "Stack's full";
}
}
else
if (sar<max)
poshte[++sar]=infix[i];
else
cout << "Stack's full";;

break;

default :
postfix[j++] = infix[i] ;


}

}
while (sar!=0)
if (sar!=0)
postfix[j++]=poshte[sar--];

postfix[j]='\0';
cout << endl << "Your postfix expression is :" << postfix << endl ;

for(i=0;postfix[i]!='\0';i++)
{
switch(type(postfix[i]))
{
case 0 : //it is an operator

push(postfix[i]-48);
break;
//////////////////////////////////////////////////////////////////////////////////

case 1 : //it is an operand

eval((int)pop(),(int)pop(),postfix[i]);
break;
}
}


cout << endl << "Your postfix expression value is :" << result << endl ;



}
/*
//// pop opertation
char khoroj()
{
if (sar!=0)
return poshte[sar--];
}
//// push operation
void vorod(char ch)
{
if (sar<max)
poshte[++sar]=ch;
else
cout << "Stack's full";
}
//// overflow
/*int Isover()
{
if (top == max-1)
return 1;
else
return 0;
}*/
//// underflow
/*int Isunder()
{
if (top == -1)
return 1;
else
return 0;
}*/
/////////////////////////////
int taghadom(char ch)
{
switch(ch)
{
case '(' :
return 1;
break;
case '-' :
return 2;
break;
case '+' :
return 3;
break;
case '*' :
return 4;
break;
case '/' :
return 5;
break;
case '^':
return 6;

}
}

//// pop opertation
char pop()
{
if (!Isunder())
return stk[top--];
}
//// push operation
void push(char ch)
{
if (!Isover())
stk[++top]=ch;
else
cout << "Stack is full";
}
//// overflow
int Isover()
{
if (top == max-1)
return 1;
else
return 0;
}
//// underflow
int Isunder()
{
if (top == -1)
return 1;
else
return 0;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////
int type(char ch)
{
switch(ch)
{

case '-' :
case '+' :
case '*' :
case '/' :
case '^' :
return 1;
break;
default :
return 0;
}
}
///////////////////////////////////////////////////////////////////////
void eval(double opr1,double opr2,char ch)
{


switch(ch)
{

case '-' :
result=opr1-opr2;
break;
case '+' :
result=opr1+opr2;
break;
case '*' :
result=opr1*opr2;
break;
case '/' :
result=opr1/opr2;
break;
case '^' :
result=pow(opr1,opr2);
break;
}

push(result);


}

ztx1111
دوشنبه 14 بهمن 1387, 12:26 عصر
دوست عزیز من برنامه شمارو کامپایل کردم.
متاسفانه علاوه بر ایرادی که گفتید برنامه شما یه اشکال بزرگ تر داره و اون اینه که فقط با اعداد تک رقمی درست کار می کنه
این ران برنامه شماست:


Please enter your mathematic expression :12*2

Your postfix expression is :122*

Your postfix expression value is :4



من سعی می کنم درستش کنم.اما قول نمی دم چون یکم سرم شلوغه.
امیدوارم موفق باشی.