Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

( implemented in C) Please Make The .c and makefile • The executable • A pdf doc

ID: 3767715 • Letter: #

Question

( implemented in C)

Please Make

The .c   and   makefile

• The   executable

• A   pdf   document explaining your approach on how your solved the problem and   a    screenshot of   a   test   run   of   your   program

QUESTION:

Create   a   calculator.   This   is   a   textual     calculator     not a   GUI.

a. Your         calculator         should       begin    by       displaying      the      functions    your calculator is   able   to   perform.   

b. The      user      should      then      be      able      to      insert      a      formula      for      which      you calculate   and   display   the   answer.

c. The   following   functions     need   to   be   handled   by   your   calculator:  

i. Sin

ii. Cos

iii. Tan

iv. X^2

v. X^Y

vi. Square   root  

vii. Addition

viii. Subtraction

ix. Multiplication

x. Division

xi. Parentheses

d. The user   should   be   able   to   enter   a   formula   like:      

2   *   (3   +   4)   –   21   /   7  

Your    calculator    should    honor    the    order    of    operations    and    give    the

correct   answer   of   11.

Explanation / Answer

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <math.h>

#define MAX 10

struct opndstack
{
int top;
double items[MAX];
};

struct optrstack
{
int top;
char items[MAX];
};

void pushopnd(struct opndstack *s,double val)
{
if(s->top==MAX-1)
{
printf(“nStack Overflow.”);
exit(1);
}
else
{s->items[++(s->top)]=val;
}
}

double popopnd(struct opndstack *s)
{
if(s->top==-1)
{
printf(“nStack Underflow.”);
exit(1);
}
else
{
return(s->items[(s->top)–]);
}
}

void pushoptr(struct optrstack *s,char ch)
{
if(s->top==MAX-1)
{
printf(“nStack Overflow.”);
exit(1);
}
else
{s->items[++(s->top)]=ch;
}
}

char popoptr(struct optrstack *s)
{
if(s->top==-1)
{
printf(“nStack Underflow.”);
exit(1);
}
else
{
return(s->items[(s->top)–]);
}
}

int isdigit(char ch)
{return(ch>=’0 && ch<=’9);
}

int isoperator(char ch)
{
switch(ch)
{
case ‘+':
case ‘-‘:
case ‘*':
case ‘/':
case ‘^':
return 1;
default:
return 0;
}
}

double eval(char ch,double opnd1,double opnd2)
{
switch(ch)
{
case ‘+':return(opnd1+opnd2);
case ‘-‘:return(opnd1-opnd2);
case ‘*':return(opnd1*opnd2);
case ‘/':return(opnd1/opnd2);
case ‘^':return(pow(opnd1,opnd2));
default:printf(“nInvalid operator.”);
exit(1);
}
}

int precedence(char ch)
{
switch(ch)
{
case ‘#': return 0;
case ‘+':
case ‘-‘: return 1;
case ‘*':
case ‘/':return 2;
case ‘^':return 3;
case ‘(‘:return 4;
default :printf(“nInvalid operator.”);
exit(1);
}
}

double infix(char str[])
{
double opnd1,opnd2,value;
char ch;
opndstack opndstk;
optrstack optrstk;
opndstk.top=-1;
optrstk.top=-1;
pushoptr(&optrstk,’#’);
int i=0;
char optr2;
for(i=0;str[i]!=’';i++)
{
if(isdigit(str[i]))
pushopnd(&opndstk,(double)(str[i]-‘0));
else if(isoperator(str[i]))
{optr2=popoptr(&optrstk);
if(precedence(str[i])>precedence(optr2))
{pushoptr(&optrstk,optr2);
pushoptr(&optrstk,str[i]);
}
else
{
while(precedence(str[i])<=precedence(optr2))
{ opnd2=popopnd(&opndstk);
opnd1=popopnd(&opndstk);
value = eval(optr2,opnd1,opnd2);
pushopnd(&opndstk,value);
optr2=popoptr(&optrstk);
}
pushoptr(&optrstk,optr2);
pushoptr(&optrstk,str[i]);
}
}
}
while((ch=popoptr(&optrstk))!=’#’)
{
opnd2=popopnd(&opndstk);
opnd1=popopnd(&opndstk);
value=eval(ch,opnd1,opnd2);
pushopnd(&opndstk,value);
}
return(popopnd(&opndstk));
}

void main()
{
char str[80];
int i;
clrscr();
printf(“nEnter an infix string?”);
for(i=0;(str[i]=getchar())!=’n';i++);
str[i]=’';
printf(“nInfix String = %s”,str);
printf(“nEvaluation of infix = %f”,infix(str));
getch();
}