سلام
میخواستم ببینم چه طور میتونم برنامه ی یک عبارت محاسباتی رو به زبان C (نه C++) بنویسم
فکر میکنم باید از پشته استفاده کنم اما نمیدونم چه طوری
مثلن این:
1+2.5*3=8.5
سلام
میخواستم ببینم چه طور میتونم برنامه ی یک عبارت محاسباتی رو به زبان C (نه C++) بنویسم
فکر میکنم باید از پشته استفاده کنم اما نمیدونم چه طوری
مثلن این:
1+2.5*3=8.5
اگه منظورت اینه که پشته رو فقط با کلاس بلدی بنویسی ، باید بگم که تو سی میتونی پشته رو با استراکت تعریف کنی:
struct stack
{
const int maxsize;
int saray[maxsize];
int top=-1;
}
void push(struct*s , int data)
{
if( s->top < s->maxsize )
{
s->top ++;
s-> saray[top]=data;
}
int pop(struct*s )
{
if(s>=0)
return (s->saray[--top] );
return -1;
}
سلام
دوستان عزیز می تونند به صورت توضیحی بگند برای عبارت infix به prefix چگونه باید عمل کنیم . فقط می خوام الگوریتمش را برام توضیح بدید .
با تشکر
براي اين كار اگر پرانتز باز ديديم در آرايه جواب يك خانه رد كرده و انديس آن خانه را در استك ، push ميكنيم اگر عملوند ديديم آن را در رشته جواب مي نويسيم اگر عملگر ديديم آخرين انديس كه در استك، push نموده بوديم را از استك pop كرده و در آن انديس در رشته جواب عمگرمان را مينويسيم اگر پرانتز بسته نيز ديديم از آن ميگذريم.
البته براي اين كار يك الگوريتم بهتر نيز هست كه اگر خواستيد براتون ميذارم. در ضمن اگر در نوشتن كدش به مشكلي برخورد كرديد بگيد تا كدشم براتون بذارم.
ممنون ، گفتید در صورتی که به عملگر رسیدم ، از استک اندیس را برداشته و در آرایه جواب در اندیسی که از استک برداشتیم قرارش میدیم. خوب در صورتی که از پرانتز استفاده نکردیم .
چه جوری عمل کنیم در زیر با استفاده از برنامه ای که یکی از دوستان گذاشتم چند عدد بدون پرانتز را تست کردم . ولی نتیجه ای نگرفتم
1+2*9*9+2-2==> ++1*2*99-226+3*2==>+6*329+2+3 ==> +9+23
براي محاسبه اين عبارات بايد قبل از شروع به كار عبارتتان را پرانتزگذاي كنيد.و بعد الگوريتم را پياده سازي كنيد.
با سلام من برنامه ا ی را که یک رشته ی محاسباتی بگیره و آن را محاسبه کند را نوشتم ولی اجرا نمی شه (عملگر توان و جذر هم نذاشتم ) لطفا کمک کنید
برنامه:
#include<stdio.h>
#include<conio.h>
#define m 21
struct stack{
int mytop;
float items[m];
}
void push(stack *s,char);
void pop(stack *s,char *);
void push(stack *s,float);
void pop(stack *s,float *);
int empty(stack *s);
void popAndtest(stack *s,char *x,int *underflow);
void topAndtest(stack *s,char *x,int *underflow);
int isOperand(char);
void convert(char[],char[]);
int pred(char,char);
int isDigit(char);
float evaluate(char []);
float operate(char,float,float);
int main()
{
char infix[m],postfix[m];
int i;
clrscr();
printf("enter an infix expression:");
gets(infix);
convert(infix,postfix);
printf("Evaluation of expression is:%.2f",evaluate(postfix));
printf("postfix expression is:");
for(i=0;postfix[i];i++)
printf("%c",postfix[i]);
getch();
return 0;
}
//*****************************
void convert(char infix[],char postfix[])
{
char symbol,topsymbol;
int underflow,i,j=0;
stack s;
s.mytop=-1;
for(i=0;infix[i],i++)
{
symbol = infix[i];
if(isOperand(symbol))
postfix[j++] = symbol;
elseif(symbol == '(')
push(&s,symbol);
elseif(symbol == ')')
{
pop(&s,&topsymbol);
while(topsymbol != '(')
{
postfix[j++] = topsymbol;
pop(&s,&topsymbol);
}//end of while
}//end of else if
else
{
topAndtest(&s, &topsymbol, &underflow);
//if op1 >op2 then true
if(empty(&s)||(!pred(topsymbol,symbol)))
push(&s,symbol);
else
{
popAndtest(&s,&topsymbol,&underflow);
while(pred(topsymbol,symbol) && !underflow)
{
postfix[j++] == topsymbol;
popAndtest(&s,&topsymbol,&underflow);
}
push(&s,symbol);
}//end of else
}//end of else
}//end of for
while(!empty(&s))_
{
pop(&s,&topsymbol);
postfix[j++]==topsymbol;
}
postfix[j] ='\o';
}
//************************************
int isOperand(char symbol)
{
if(symbol >='0' && symbol <= '9')
return 1;
return 0;
}
//************************************
void push(stack *s,char x)
{
s -> items[++(s -> mytop)]=x;
}
//************************************
void pop(stack *s,char *x)
{
*x=s ->items[(s -> mytop)--];
}
//************************************
void popAndtest(stack *s,char *x,int *underflow)
{
if(empty(s))
*underflow=1;
else
{
*x= s -> items[(s -> mytop)--];
*underflow=0;
}
}
//*************************************
void topAndtest(stack *s,char *x,int *underflow)
{
if(empty(S))
*underflow=1;
else
{
*x=s -> items[s ->mytop];
*underflow=0;
}
}
//**************************************
int empty(stack *s)
{
if(s -> mytop == -1)
return 1;
else
return 0;
}
//**************************************
int pred(char op1,char op2)
{
int i,p1,p2;
/* ( + - * / % */
staticchar op[] = {'(','+','-','*','/','%','\0'};
staticint isp[] = {0,12,12,13,13,13};
for(i=0;op[i];i++)
if(op[i]==op1)
{
p1=i;
break;
}
for(i=0;op[i];i++)
if(op[i]==op2)
{
p=i;
break;
}
if(isp[p1]> = isp[p2])
return 1;
return 0;
}
//********************************
float evaluate(char postfix[])
{
float value,operand1,operand2;
char symbol;
stack s;
s.mytop = -1;
int i;
for(i=0;postfix[i];i++)
{
symbol=postfix[i];
if(isdigit(symbol))
push(&s,(float)(symbol - '0'));
else
{
pop(&s,&operand2);
pop(&s,&operand1);
value=operate(symbol,operand1,operand2);
push(&s,value);
}//end of else
}//end of for
pop(&s,&value);
return value;
}
//***********************************
int isdigit(char symbol)
{
return (symbol >= '0' && symbol <= '9');
}
//***********************************
float operate(char symbol, float operand1,float operand2)
{
switch(symbol)
{
case'+':
return operand1 + operand2;
case'-':
return operand1 - operand2;
case'*':
return operand1 * operand2;
case'/':
return operand1 / operand2;
case'%':
return operand1 % operand2;
}
}
//*************************************
void push(stack *s,float x)
{
s -> items[++(s -> mytop)]=x;
}
//*************************************
void pop(stack *s,float *x)
{
*x= s -> items[(s -> mytop)--];
}