Jump to content
xisto Community
vIp3rS

Plz Help! It Doesn't Evaluate Right When I Use 2-digit Or More Numbers Starting From 10....only 1-digit Numbers! THIS IS A CALCULATOR PROGRAM

Recommended Posts

#include <stdio.h>#include <conio.h>#include <ctype.h>#define MAX 100#define EMPTY -1struct stack{		  int data[MAX];		  int top;};int isempty(struct stack *s){		  return (s->top == EMPTY) ? 1 : 0;}void emptystack(struct stack* s){		  s->top = EMPTY;}void push(struct stack* s,int item){		  if(s->top == (MAX-1))		  {					 printf("\nSTACK FULL");		  }		  else		  {					 ++s->top;					 s->data[s->top]=item;		  }}int pop(struct stack* s){		  int ret=EMPTY;		  if(s->top != EMPTY)		  {					 ret= s->data[s->top];					 --s->top;		  }		  return ret;}void display(struct stack s){		  while(s.top != EMPTY)		  {					 printf("\n%d",s.data[s.top]);					 s.top--;		  }}int isoperator(char e){		  if(e == '+' || e == '-' || e == '*' || e == '/' || e == '%')					 return 1;		  else					 return 0;}int priority(char e){		  int pri = 0;		  if(e == '*' || e == '/' || e =='%')					 pri = 2;		  else		  {					 if(e == '+' || e == '-')								pri = 1;		  }		  return pri;}int evaluate(char *postfix){		  char *p;		  struct stack stk;		  int op1,op2,result;		  emptystack(&stk);		  p = &postfix[0];		  while(*p != '\0')		  {					 /* removes tabs and spaces */					 while(*p == ' ' || *p == '\t' )					 {								p++;					 }					 if(*p == '\0')								break;			 /* if is digit */					 if(isdigit(*p))					 {								push(&stk,*p - 48);					 }					 else					 {						 /* it is an operator */								op1 = pop(&stk);								op2 = pop(&stk);								switch(*p)								{										  case '+':													 result = op2 + op1;													 break;										  case '-':													 result = op2 - op1;													 break;										  case '/':													 result = op2 / op1;													 break;										  case '*':													 result = op2 * op1;													 break;										  case '%':													 result = op2 % op1;													 break;										  default:													 printf("\nInvalid Operator");													 return 0;								}								push(&stk,result);					 }					 p++;		  }		  result = pop(&stk);		  return result;}void infix2postfix(char* infix, char * postfix, int insertspace){		  char *i,*p;		  struct stack X;		  char n1;		  emptystack(&X);		  i = &infix[0];		  p = &postfix[0];		  while(*i)		  {					 while(*i == ' ' || *i == '\t')					 {								i++;					 }					 if( isdigit(*i) || isalpha(*i) )					 {								while( isdigit(*i) || isalpha(*i))								{										  *p = *i;										  p++;										  i++;								}								/*SPACE CODE*/								if(insertspace)								{										  *p = ' ';										  p++;								}								/*END SPACE CODE*/					 }					 if( *i == '(' )					 {								push(&X,*i);								i++;					 }					 if( *i == ')')					 {								n1 = pop(&X);								while( n1 != '(' )								{										  *p = n1;										  p++;										  /*SPACE CODE*/										  if(insertspace)										  {													 *p = ' ';													 p++;										  }										  /*END SPACE CODE*/										  n1 = pop(&X);								}								i++;					 }					 if( isoperator(*i) )					 {								if(isempty(&X))										  push(&X,*i);								else								{										  n1 = pop(&X);										  while(priority(n1) >= priority(*i))										  {													 *p = n1;													 p++;													 /*SPACE CODE*/													 if(insertspace)													 {																*p = ' ';																p++;													 }													 /*END SPACE CODE*/													 n1 = pop(&X);										  }										  if(n1!=-1)										  push(&X,n1);										  push(&X,*i);								}								i++;					 }		  }		  while(!isempty(&X))		  {					 n1 = pop(&X);					 *p = n1;					 p++;					 /*SPACE CODE*/					 if(insertspace)					 {								*p = ' ';								p++;					 }					 /*END SPACE CODE*/		  }		  *p = '\0';}int main(void){	char infix[MAX], postfix[MAX], choice, option;	printf("\t\tMISSION-RIVERA's CALCULATOR PROGRAM!");	printf("\n\nDo you want to use our calculator program?<Y/N>");	scanf("%c",&option);	if(option=='y' || option=='Y')	{		do		{			clrscr();			printf("Enter expression: ");			fflush(stdin);			gets(infix);			infix2postfix(&infix[0],&postfix[0],1);			printf("\n\nPostfix expression is: %s",&postfix[0]);			printf("\n\n\t\tThe answer to this expression %s is %d.",&infix[0],evaluate(&postfix[0]));			printf("\n\nDo you want to continue?<Y/N>");			scanf("%c",&choice);		 }while(choice=='y' || choice=='Y');	printf("\n\t\t\tTHANK YOU FOR USING!!!");	printf("\n\nPress any key to exit!");	getch();	}	else	{		printf("\n\t\t\tTHANK YOU FOR USING!!!");		printf("\n\nPress any key to exit!");		getch();	}		return 0;}

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

Terms of Use | Privacy Policy | Guidelines | We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.