aboutsummaryrefslogblamecommitdiff
path: root/4.10.c
blob: 512854119964b390fb8c66d292c08a3b2d2dec8b (plain) (tree)



























































































































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

#define MAXLEN 1000
#define MAXOP 100
#define NUMBER_SIG '0'

unsigned sneed_getline(char str[], unsigned len);
double pop(void);
void push(double input);
char getop(char str[], char op[], unsigned *spos);

int 
main(void)
{
  char str[MAXLEN];
  unsigned len, spos;
  char op[MAXOP];
  double op2;

  while ((len = sneed_getline(str, MAXLEN)) > 1) {
    spos = 0;
    while (spos < len) {
      switch (getop(str, op, &spos)) {
        case '0' :
          push(atof(op));
          break;
        case '+' :
          push(pop() + pop());
          break;
        case '*' :
          push(pop() * pop());
          break;
        case '-' :
          op2 = pop();
          printf("hey: %g\n", op2);
          push(pop() - op2);
          break;
        case '/' :
          if ((op2 = pop()) == 0.0)
            printf("Err: deviser cant be zero\n");
          else 
            push(pop() / op2);
          break;
        case '%' :
          op2 = pop();
          if (op2 != 0)
            push(fmod(pop(), op2));
          else 
            printf("Err: deviser cant be zero\n");
          break;
        default :
          printf("Err: unknow command\n");
      }
    }

    printf("%.8g\n", pop());
  }

  return 0;
}

unsigned 
sneed_getline(char str[], unsigned len)
{
  char input;
  unsigned i;

  for(i = 0; i < len+1 && (input = getchar()) != EOF && input != '\n'; i++)
    str[i] = input;

  str[i] = '\0';

  return i;
}

#define MAXVAL 100 
double val[MAXVAL];
int sp = 0;

double 
pop(void)
{
  if (sp > 0)
    return val[--sp];
  else 
    printf("Err: stack empty\n");

  return 0.0;
}

void
push(double input)
{
  if (sp < MAXVAL)
    val[sp++] = input;
  else 
    printf("Err: stack full\n");
}

char 
getop(char str[], char op[], unsigned *spos)
{
  int j;
  
  /* skip blanks */
  for (; isblank(str[*spos]); (*spos)++)
    ;

  /* return operator */
  if (!isdigit(str[*spos]) &&  str[*spos] != '.') {
    return str[(*spos)++];
  }  

  /* collect digit s*/
  for (j = 0; j < MAXOP+1 && (isdigit(str[*spos]) || str[*spos] == '.'); j++, (*spos)++)
    op[j] = str[*spos]; 

  op[*spos] = '\0';

  return NUMBER_SIG;
}