home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Interactive Reference Guide / C-C++ Interactive Reference Guide.iso / c_ref / csource3 / 150_01 / hp.c < prev    next >
Encoding:
C/C++ Source or Header  |  1985-09-07  |  2.9 KB  |  109 lines

  1. /*
  2.        HEADER:  150.??;
  3.         TITLE:  Reverse Polish Notation (RPN) Calculator;
  4.   DESCRIPTION:  "A small program which turns your PC into a very expensive, 
  5.                  but convenient(?), pocket calculator.  It operates like the
  6.                  Hewlett-Packard calculators, which use RPN.  It has a 6 value
  7.                  stack, although this could easily be modified.  It is NOT a
  8.                  "resident" program, like the commercial desktop assistant
  9.                  programs.  Commands: "," (clear top), "+", "-", "*", "/",
  10.                  "^" (raise to power), "I" (invert, or 1/x), "N" (negate), "R" 
  11.                  (square root), "L" (log, to base e), "E" (exponential),
  12.                  and "Q" (quit).  Latter values to 1E-7 precision.";
  13.      KEYWORDS:  Calculator, RPN, Reverse Polish Notation;
  14.        SYSTEM:  any with suitable C compiler;
  15.      FILENAME:  HP.C;
  16.      WARNINGS:  "1) User documentation not included.  
  17.                  2) Requires C compiler with double precision real numbers.
  18.                  3) Requires file TRAN.C to compute transcendental functions.";
  19.      SEE-ALSO:  TRAN.C;
  20.     COMPILERS:  any C compiler with double prec. reals;
  21.    REFERENCES:  AUTHORS: unknown; TITLE: "HP.C";
  22.                 CITATION: "PC-SIG Disk 50 or 142" 
  23.        ENDREF;
  24. */
  25. #include "stdio.h"
  26.  
  27. #include "tran.c"
  28.  
  29. double pop(),push();
  30.  
  31. double stack[6];
  32.  
  33. int sp=0;
  34.  
  35. main()
  36.  
  37. {
  38.  
  39. double dp=1;
  40.  
  41. int x,i,df=0;
  42.  
  43. while ((x=getchar()) != 'q' && x != 'Q') {
  44.  
  45.     if (x>='0' && x<='9') {
  46.  
  47.       if (df) dp=10*dp;
  48.  
  49.       stack[0]=10*stack[0]+x-'0';
  50.  
  51.     }
  52.  
  53.     else if (x=='.') df=1;
  54.  
  55.     else {
  56.  
  57.       stack[0] = stack[0] / dp;
  58.  
  59.       dp=1;
  60.  
  61.       df=0;
  62.  
  63.       if (x==',' && stack[0] == 0) stack[0]=stack[sp];
  64.  
  65.       if (stack[0] == 0) stack[0]=pop();
  66.  
  67.       switch (x) {
  68.  
  69.       case ',' :
  70.  
  71.       case '\13' :
  72.  
  73.         break;
  74.  
  75.       case '+' :
  76.  
  77.         stack[0] = stack[0]+pop();
  78.  
  79.         break;
  80.  
  81.       case '-' :
  82.  
  83.         stack[0] = pop()-stack[0];
  84.  
  85.         break;
  86.  
  87.       case '*' :
  88.  
  89.         stack[0] = pop()*stack[0];
  90.  
  91.         break;
  92.  
  93.       case '/' :
  94.  
  95.         stack[0] = pop()/stack[0];
  96.  
  97.         break;
  98.  
  99.       case '^' :
  100.  
  101.         stack[0] = exp( stack[0] * log( pop(0) ) ) ;
  102.  
  103.         break;
  104.  
  105.       case 'I' :
  106.  
  107.       case 'i' :
  108.  
  109.         stack[0] = 1/stack[0];
  110.  
  111.         break;
  112.  
  113.       case 'N' :
  114.  
  115.       case 'n' :
  116.  
  117.         stack[0] = -stack[0];
  118.  
  119.         break;
  120.  
  121.       case 'r' :
  122.  
  123.       case 'R' :
  124.  
  125.         stack[0]=root(stack[0]);
  126.  
  127.         break;
  128.  
  129.       case 'l' :
  130.  
  131.       case 'L' :
  132.  
  133.         stack[0]=log(stack[0]);
  134.  
  135.         break;
  136.  
  137.       case 'e' :
  138.  
  139.       case 'E' :
  140.  
  141.         stack[0]=exp(stack[0]);
  142.  
  143.         break;
  144.  
  145.       }
  146.  
  147.       push (stack[0]);
  148.  
  149.       stack[0]=0;
  150.  
  151.       if (x != '\0') {
  152.  
  153.       for (i=1;i<=sp;i++) printf("%f  ",stack[i]);
  154.  
  155.       printf ("%c\n",x);
  156.  
  157.       }
  158.  
  159.       }
  160.  
  161.       }
  162.  
  163. }
  164.  
  165.  
  166.  
  167. /* Pop floating from stack */
  168.  
  169. double pop()
  170.  
  171. {
  172.  
  173. if (sp>0) return (stack[sp--]);
  174.  
  175. else return (0);
  176.  
  177. }
  178.  
  179.  
  180.  
  181. /* Push floating onto stack */
  182.  
  183. double push(x)
  184.  
  185. double x;
  186.  
  187. {
  188.  
  189. if (sp<5) stack[++sp] = x;
  190.  
  191. }
  192.