mahmoudw810
یک شنبه 13 بهمن 1387, 12: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) هست.
#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) هست.