## Feb 7, 2012

### K & R C Programs Exercise 7-5.

K and R C, Solution to Exercise 7-5:
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.
Rewrite the postfix calculator of chapter 4 to use scanf and/or sscanf to do the input number conversion.

```/***********************************************************
* 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   */
#define MAXVAL 100
int gettop(char []);
void push(double);
double pop(void);
int sp = 0;          /* Next free stack position. */
double val[MAXVAL];

//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);
break;

}
}
return 0;
}

/* Getop: get next operator or numeric operand. */
int getop(char s[])
{

int i = 0;
int c;
int rc;
static char lastc[] = " ";
sscanf(lastc,"%c", &c);
lastc[0] = ' ';

/* Skip whitespace */
while((s[0] = c ) == ' ' || c == '\t')
if(scanf("%",&c) == EOF)
c = EOF;
s[1] = '\0';

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

if(isdigit(c))
do{
rc = scanf("%c",&c);
if(!isdigit(s[++i] = c))
break;
}while(rc != EOF)

if(c == '.')
do{
rc = scanf("%c",&c);
if(!isdigit(s[++i] = c))
break;
}while(rc != EOF)

s[i] = '\0';
if(rc != EOF)
lastc[0] = c;
return NUMBER;

}

/* 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;
}
}

```
```Read more c programs

C Basic
C Strings
K and R C Programs Exercise```
You can easily select the code by double clicking on the code area above.