Exercise 4-3. Given the basic framework, it's straightforward to extend the calculator. Add the modulus (%) operator and provisions for negative numbers.
/* Exercise 4-3. Given the basic framework, it's straightforward to extend the calculator. Add the modulus (%) operator and provisions for negative numbers. */#include<stdio.h>#include<stdlib.h> /* for atof() */#define MAXOP 100 /* max size of operand or operator */#define NUMBER '0' /* signal that a number was found */intgetop(char[]);voidpush(double);doublepop(void);/* reverse Polish calculator */intmain(){inttype;doubleop2;chars[MAXOP];while((type=getop(s))!=EOF){switch(type){caseNUMBER:push(atof(s));break;case'+':push(pop()+pop());break;case'*':push(pop()*pop());break;case'-':op2=pop();push(pop()-op2);break;case'/':op2=pop();if(op2!=0.0)push(pop()/op2);elseprintf("error: zero divisor\n");break;case'%':op2=pop();if(op2!=0.0)push((int)pop()%(int)op2);elseprintf("error: zero divisor\n");break;case'\n':printf("\t%.8g\n",pop());break;default:printf("error: unknown command %s\n",s);break;}}return0;}#define MAXVAL 100 /* maximum depth of val stack */intsp=0;/* next free stack position */doubleval[MAXVAL];/* value stack *//* push: push f onto value stack */voidpush(doublef){if(sp<MAXVAL)val[sp++]=f;elseprintf("error: stack full, can't push %g\n",f);}/* pop: pop and return top value from stack */doublepop(void){if(sp>0)returnval[--sp];else{printf("error: stack empty\n");return0.0;}}#include<ctype.h>intgetch(void);voidungetch(int);/* getop: get next character or numeric operand */intgetop(chars[]){inti,c;while((s[0]=c=getch())==' '||c=='\t');s[1]='\0';if(!isdigit(c)&&c!='.')returnc;/* not a number */i=0;if(isdigit(c))/* collect integer part */while(isdigit(s[++i]=c=getch()));if(c=='.')/* collect fraction part */while(isdigit(s[++i]=c=getch()));s[i]='\0';if(c!=EOF)ungetch(c);returnNUMBER;}#define BUFSIZE 100charbuf[BUFSIZE];/* buffer for ungetch */intbufp=0;/* next free position in buf */intgetch(void)/* get a (possibly pushed-back) character */{return(bufp>0)?buf[--bufp]:getchar();}voidungetch(intc)/* push character back on input */{if(bufp>=BUFSIZE)printf("ungetch: too many characters\n");elsebuf[bufp++]=c;}