lolamontes69

K+R Exercise7_5

Sep 25th, 2014
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.72 KB | None | 0 0
  1. /* Rewrite the postfix calculator of Chapter 4 to use scanf() and/or sscanf() to
  2.  * do the input and number conversion */
  3. #include <stdio.h>
  4. #define MAXCHAR 100
  5.  
  6. int do_math(char c);
  7.  
  8. int stackpos;
  9. float stack[MAXCHAR];
  10.  
  11.  
  12. main()
  13. {
  14.     int i;
  15.     char token[MAXCHAR];
  16.  
  17.     while((i = scanf("%s",token)) != EOF && i!=0) {
  18.         if(sscanf(token, "%f", &stack[stackpos]) == 1) // the args to sscanf
  19.             stackpos++;
  20.         else {
  21.             if(stackpos==0) {
  22.                 printf("error<%c>: Stack is empty\n",token[0]);
  23.                 break;
  24.             } i = do_math(token[0]);
  25.             if(i==-1) break;
  26.         }
  27.     } puts("--- End of Program ---");
  28.     return 0;
  29. }
  30.  
  31. int do_math(char c)
  32. {
  33.     double temp=0, temp1=0;
  34.  
  35.     stackpos--;
  36.     switch(c) {
  37.         case '+':
  38.             if(stackpos==0) {
  39.                 printf("error<%c>: Only one item in stack\n%0.3f\n",c, stack[stackpos]);
  40.                 return -1;
  41.             } temp  = stack[stackpos--];
  42.             temp1 = stack[stackpos];
  43.             stack[stackpos++] = temp1 + temp;
  44.             break;
  45.         case '-':
  46.             if(stackpos==0) {
  47.                 printf("error<%c>: Only one item in stack\n%0.3f\n",c, stack[stackpos]);
  48.                 return -1;
  49.             } temp  = stack[stackpos--];
  50.             temp1 = stack[stackpos];
  51.             stack[stackpos++] = temp1 - temp;
  52.             break;
  53.         case '*':
  54.             if(stackpos==0) {
  55.                 printf("error<%c>: Only one item in stack\n%0.3f\n",c, stack[stackpos]);
  56.                 return -1;
  57.             } temp  = stack[stackpos--];
  58.             temp1 = stack[stackpos];
  59.             stack[stackpos++] = temp1*temp;
  60.             break;
  61.         case '/':
  62.             if(stackpos==0) {
  63.                 printf("error<%c>: Only one item in stack\n%0.3f\n",c, stack[stackpos]);
  64.                 return -1;
  65.             } temp  = stack[stackpos--];
  66.             if(temp==0) {
  67.                 puts("error: division by zero");
  68.                 return -1;
  69.             } temp1 = stack[stackpos];
  70.             stack[stackpos++] = temp1/temp;
  71.             break;
  72.         case '\%':
  73.             if(stackpos==0) {
  74.                 printf("error<%c>: Only one item in stack\n%0.3f\n",c, stack[stackpos]);
  75.                 return -1;
  76.             } temp  = stack[stackpos--];
  77.             temp1 = stack[stackpos];
  78.             if(temp!=0.0) {
  79.                 if(temp1>0 && temp>0) {
  80.                     while(temp1-temp>=0)
  81.                         temp1 = temp1 - temp;
  82.                 }
  83.                 else if(temp1<0 && temp>0) {
  84.                     temp1 = temp1-temp1-temp1;
  85.                     while(temp1-temp>=0)
  86.                         temp1 = temp1 - temp;
  87.                 }
  88.                 else if(temp1<0 && temp<0) {
  89.                     temp1 = temp1-temp1-temp1;
  90.                     temp = temp-temp-temp;
  91.                     while(temp1-temp>=0)
  92.                         temp1 = temp1 - temp;
  93.                     temp1 = temp1-temp1-temp1;
  94.                 }
  95.                 else if(temp1>0 && temp<0) {
  96.                     temp = temp-temp-temp;
  97.                     while(temp1-temp>=0)
  98.                         temp1 = temp1 - temp;  
  99.                     temp1 = temp1-temp1-temp1;
  100.                 }
  101.                 stack[stackpos++]=temp1;
  102.             }
  103.             else {
  104.                 printf("error<\%>: division by zero\n",c);
  105.                 return -1;
  106.             } break;
  107.         case '=':
  108.             printf("result = %0.3f\n",stack[stackpos]);
  109.             return -1;
  110.         default:
  111.             printf("error<%c>: invalid character\n",c);
  112.             return -1;
  113.             break;
  114.     }
  115.     printf("\t%0.3f\n",stack[stackpos-1]);
  116.     return 1;
  117. }
Advertisement
Add Comment
Please, Sign In to add comment