Advertisement
lily09290110

四則運算

Jul 13th, 2015
218
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.79 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<math.h>
  4. #define max 100
  5. char tab[max];
  6. int i=0;
  7. double caculate(char c ,double a,double b)
  8. {
  9.     double j=0,ans=a;
  10.     switch(c)
  11.     {
  12.         case '+': return a+b;
  13.         case '-': return a-b;
  14.         case '*': return a*b;
  15.         case '/': return a/b;
  16.         case '^':
  17.                 for(j=1;j<b;j++)
  18.                     ans*=a;
  19.                 return ans;
  20.     }
  21. }
  22. int jude(char a)
  23. {
  24.     if(a=='^')return 2;
  25.     else if(a=='*'||a=='/') return 1;
  26.     else return 0;
  27. }
  28. double caculate_op()
  29. {
  30.     int top=-1,n=0,j,k;
  31.     char stack_op[max];
  32.     double stack_number[max],number;
  33.     double number_double;
  34.     double used[max]={0};
  35.     while(1)
  36.     {
  37.         number=0;
  38.         number_double=0;
  39.         if(tab[i]>='0'&&tab[i]<='9')
  40.         {
  41.             do
  42.              {
  43.                 number=number*10+tab[i]-48;
  44.                 i++;
  45.              } while(tab[i]>='0'&&tab[i]<='9');
  46.              if(tab[i]=='.')
  47.             {
  48.                 i++;
  49.                 double count=1,temp;
  50.                 do
  51.                  {  
  52.                      temp=tab[i]-48;
  53.                      for(j=0;j<count;j++)
  54.                         temp/=10.0;
  55.                      number_double+=temp;
  56.                      i++;
  57.                      count++;
  58.                  } while(tab[i]>='0'&&tab[i]<='9');
  59.             }
  60.              i--;
  61.             number+=number_double;
  62.             stack_number[n]=number;
  63.             n++;
  64.         }
  65.         else
  66.             switch(tab[i])
  67.             {
  68.                 case '\0':
  69.                 case ')' :
  70.                          for(j=2;j>=0;j--)
  71.                          {
  72.                              for(k=0;k<=top;k++)
  73.                                  if(jude(stack_op[k])==j)
  74.                                  {
  75.                                      int count=0;
  76.                                      while(used[k-count]==-1){count++;}
  77.                                      stack_number[k-count]=caculate(stack_op[k],stack_number[k-count],stack_number[k+1]);
  78.                                      stack_number[k+1]=0;
  79.                                      used[k+1]=-1;
  80.                                  }
  81.                          }
  82.                          for(j=0;j<n;j++)
  83.                              number+=stack_number[j];
  84.                          return number;
  85.                  case '(' :
  86.                          i++;
  87.                          stack_number[n]=caculate_op();
  88.                          n++;
  89.                          break;
  90.                  default :
  91.                     top++;
  92.                     stack_op[top]=tab[i];
  93.                    break;
  94.              }
  95.         i++;
  96.     }
  97. }
  98. int main()
  99. {
  100.     scanf("%s", tab);
  101.     printf("%lf\n",caculate_op());
  102.     return 0;
  103. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement