home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_100 / 164_01 / hp.c < prev    next >
Text File  |  1984-04-08  |  2KB  |  90 lines

  1. #include "stdio.h"
  2. #include "tran.c"
  3. double pop(),push();
  4. double stack[6];
  5. int sp=0;
  6. main()
  7. {
  8. double dp=1;
  9. int x,i,df=0;
  10. while ((x=getchar()) != 'q' && x != 'Q') {
  11.     if (x>='0' && x<='9') {
  12.       if (df) dp=10*dp;
  13.       stack[0]=10*stack[0]+x-'0';
  14.     }
  15.     else if (x=='.') df=1;
  16.     else {
  17.       stack[0] = stack[0] / dp;
  18.       dp=1;
  19.       df=0;
  20.       if (x==',' && stack[0] == 0) stack[0]=stack[sp];
  21.       if (stack[0] == 0) stack[0]=pop();
  22.       switch (x) {
  23.       case ',' :
  24.       case '\13' :
  25.         break;
  26.       case '+' :
  27.         stack[0] = stack[0]+pop();
  28.         break;
  29.       case '-' :
  30.         stack[0] = pop()-stack[0];
  31.         break;
  32.       case '*' :
  33.         stack[0] = pop()*stack[0];
  34.         break;
  35.       case '/' :
  36.         stack[0] = pop()/stack[0];
  37.         break;
  38.       case '^' :
  39.         stack[0] = exp( stack[0] * log( pop(0) ) ) ;
  40.         break;
  41.       case 'I' :
  42.       case 'i' :
  43.         stack[0] = 1/stack[0];
  44.         break;
  45.       case 'N' :
  46.       case 'n' :
  47.         stack[0] = -stack[0];
  48.         break;
  49.       case 'r' :
  50.       case 'R' :
  51.         stack[0]=root(stack[0]);
  52.         break;
  53.       case 'l' :
  54.       case 'L' :
  55.         stack[0]=log(stack[0]);
  56.         break;
  57.       case 'e' :
  58.       case 'E' :
  59.         stack[0]=exp(stack[0]);
  60.         break;
  61.       }
  62.       push (stack[0]);
  63.       stack[0]=0;
  64.       if (x != '\0') {
  65.       for (i=1;i<=sp;i++) printf("%f  ",stack[i]);
  66.       printf ("%c\n",x);
  67.       }
  68.       }
  69.       }
  70. }
  71.  
  72. /* Pop floating from stack */
  73. double pop()
  74. {
  75. if (sp>0) return (stack[sp--]);
  76. else return (0);
  77. }
  78.  
  79. /* Push floating onto stack */
  80. double push(x)
  81. double x;
  82. {
  83. if (sp<5) stack[++sp] = x;
  84. }
  85. turn (stack[sp--]);
  86. else return (0);
  87. }
  88.  
  89. /* Push floating onto stack */
  90. double pus