Advertisement
alch1337

SimpleCalc

Dec 14th, 2014
438
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.89 KB | None | 0 0
  1. #include <stdio.h>
  2.  
  3. #define STACKSIZE 100
  4. #define MAXLEN 1000
  5.  
  6. double stack[STACKSIZE];
  7. int top;
  8.  
  9. void push(double f);
  10. double pop(void);
  11. double atof(char s[]);
  12. int getline(char line[]);
  13. int isNum(char c);
  14. void convert(char s[], char t[], const int len);
  15.  
  16. int main(void) {
  17.     char number[MAXLEN];
  18.     int len = 0;
  19.     double num = 0.0;
  20.     char line[MAXLEN], result[MAXLEN];
  21.     while ((len = getline(line)) != 0) {
  22.         int t1 = 0, t2 = 0;
  23.         for (int i = 0; i < len; ++i) {
  24.             if (line[i] == '(') ++t1;
  25.             else if (line[i] == ')') ++t2;
  26.         }
  27.         if (t1 != t2) { printf("Mismatched parenthesis!\n"); continue; }
  28.         convert(line, result, len);
  29.         printf("%s\n", result);
  30.         len = 0;
  31.         for (int i = 0; result[i] != '\0'; ++i) {
  32.             switch (result[i]) {
  33.                 case '+':
  34.                     num = pop();
  35.                     push(pop() + num);
  36.                     ++i;
  37.                     break;
  38.                 case '-':
  39.                     num = pop();
  40.                     push(pop() - num);
  41.                     ++i;
  42.                     break;
  43.                 case '*':
  44.                     num = pop();
  45.                     push(pop() * num);
  46.                     ++i;
  47.                     break;
  48.                 case '/':
  49.                     num = pop();
  50.                     push(pop() / num);
  51.                     ++i;
  52.                     break;
  53.                 case ' ':
  54.                     number[len] = '\0';
  55.                     push(atof(number));
  56.                     len = 0;
  57.                     break;
  58.                 default:
  59.                     number[len++] = result[i];
  60.                     break;
  61.             }
  62.         }
  63.         printf("%f\n\n", pop());
  64.         top = 0;
  65.     }
  66.     return 0;
  67. }
  68.  
  69. void push(double f) {
  70.     stack[top++] = f;
  71. }
  72.  
  73. double pop(void) {
  74.     return stack[--top];
  75. }
  76.  
  77. double atof(char s[]) {
  78.     int sign = 1, value = 0, power = 1 , i = 0;
  79.     if (s[i] == '-') { sign = -1; ++i; }
  80.     for (; isNum(s[i]); ++i) value = 10 * value + (s[i] - '0');
  81.     if (s[i] == '.') ++i;
  82.     while (isNum(s[i])) {
  83.         value = 10 * value + (s[i++] - '0');
  84.         power *= 10;
  85.     }
  86.     return sign * value/(double)power;
  87. }
  88.  
  89. int getline(char line[]) {
  90.     int c;
  91.     int i = 0;
  92.     while ((c = getchar()) != '\n') {
  93.         line[i++] = c;
  94.     }
  95.     line[i] = '\0';
  96.     return i;
  97. }
  98.  
  99. int isNum(char c) {
  100.     return ((c >= '0' && c <= '9')) ? 1 : 0;
  101. }
  102.  
  103. void convert(char s[], char t[], const int len) {
  104.     int k = 0, l = 0;
  105.     char stack[MAXLEN];
  106.     for (int i = 0; i < len; ++i) {
  107.         if (isNum(s[i])  || s[i] == '.') { t[k++] = s[i]; if((i+1 != len) && !(isNum(s[i+1]) || s[i+1] == '.')) t[k++] = ' '; }
  108.         else if (s[i] == ')') {
  109.             while (stack[--l] != '(') {
  110.                 t[k++] = stack[l];
  111.                 t[k++] = ' ';
  112.             }
  113.             --l;
  114.         }
  115.         else {
  116.             switch(s[i]) {
  117.                 case '(':
  118.                     stack[l++] = '(';
  119.                     break;
  120.                 case '+':
  121.                 case '-':
  122.                     while (stack[--l] != '(' && l>=0) {
  123.                         t[k++] = stack[l];
  124.                         t[k++] = ' ';
  125.                     }
  126.                     stack[++l] = s[i];
  127.                     break;
  128.                 case '*':
  129.                 case '/':
  130.                     while (stack[--l] != '+' && stack[l] != '-' && stack[l] != '(' && l>=0) {
  131.                         t[k++] = stack[l];
  132.                         t[k++] = ' ';
  133.                     }
  134.                     stack[++l] = s[i];
  135.                     break;
  136.                 default:
  137.                     break;
  138.             }
  139.             if (s[i] != ' ') stack[l++] = s[i];
  140.         }
  141.     }
  142.     if (t[k-1] != ' ') t[k++] = ' ';
  143.     while (l > 0) {  t[k++] = stack[--l]; t[k++] = ' '; }
  144.     t[k] = '\0';
  145. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement