## Jan 9, 2012

### K & R C Programs Exercise 4-3.

K and R C, Solution to Exercise 4-3:
K and R C Programs Exercises provides the solution to all the exercises in the C Programming Language (2nd Edition). You can learn and solve K&R C Programs Exercise.
Write a c program to implement Basic framework, it's straight forward to extend the calculate. Add the modulus(%) operator and provisions for negative numbers. Read more about C Programming Language .

/***********************************************************
* You can use all the programs on  www.c-program-example.com
* for personal and learning purposes. For permissions to use the
* programs for commercial purposes,
* contact info@c-program-example.com
* To find more C programs, do visit www.c-program-example.com
* and browse!
*
*                      Happy Coding
***********************************************************/

#include<stdio.h>
#include<math.h>       /*for atof()*/
#define MAXTOP 100     /* max size of operand or operator  */
#define NUMBER  '0'    /* SIGNAL THAT A NUMBER WAS FOUND   */
int gettop(char []);
void push(double);
double pop(void);

//reverse Polish calulator
int main(void)
{
int type;
double op2;
char s[MAXOP];

while((type = getop(s)) != EOF)
{
switch(type)
{
case NUMBER:
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);
else printf("\nError: Zero divissor\n")
break;
case '%':
op2 = pop();
if(op2)
push(fmod(pop(), op2));
else
printf("\nError: Division by zero!");
break;
case '\n':
printf("\t%.8g\n",pop());
break;
default:
printf("error: unknown command %s\n", s);
brak;

}
}
return 0;
}

/* Getop: get next operator or numeric operand. */
int getop(char s[])
{
#define PERIOD  '.'
int i = 0;
int c;
int next;

/* Skip whitespace */
while((s[0] = c = getch()) == ' ' || c == '\t')
;
s[1] = '\0';

/* Not a number but may contain a unary minus. */
if(!isdigit(c) && c != PERIOD && c != '-')
return c;

if(c == '-')
{
next = getch();
if(!isdigit(next) && next != PERIOD)
{
return c;
}
c = next;
}
else
{
c = getch();
}

while(isdigit(s[++i] = c))
c = getch();
if(c == PERIOD)                     /* Collect fraction part. */
while(isdigit(s[++i] = c = getch()))
;
s[i] = '\0';
if(c != EOF)
unGetch(c);
return NUMBER;

#define MAXVAL 100

int sp = 0;          /* Next free stack position. */
double val[MAXVAL];  /* value stack. */

/* push: push f onto stack. */
void push(double f)
{
if(sp < MAXVAL)
val[sp++] = f;
else
printf("\nError: stack full can't push %g\n", f);
}

double pop(void)
{
if(sp > 0)
return val[--sp];
else
{
printf("\nError: stack empty\n");
return 0.0;
}
}
}
C Basic
C Strings
K and R C Programs Exercise
You can easily select the code by double clicking on the code area above.

You can discuss these programs on our Facebook Page. Start a discussion right now,

our page!