home *** CD-ROM | disk | FTP | other *** search
- /*
- HEADER: 150.??;
- TITLE: Reverse Polish Notation (RPN) Calculator;
- DESCRIPTION: "A small program which turns your PC into a very expensive,
- but convenient(?), pocket calculator. It operates like the
- Hewlett-Packard calculators, which use RPN. It has a 6 value
- stack, although this could easily be modified. It is NOT a
- "resident" program, like the commercial desktop assistant
- programs. Commands: "," (clear top), "+", "-", "*", "/",
- "^" (raise to power), "I" (invert, or 1/x), "N" (negate), "R"
- (square root), "L" (log, to base e), "E" (exponential),
- and "Q" (quit). Latter values to 1E-7 precision.";
- KEYWORDS: Calculator, RPN, Reverse Polish Notation;
- SYSTEM: any with suitable C compiler;
- FILENAME: HP.C;
- WARNINGS: "1) User documentation not included.
- 2) Requires C compiler with double precision real numbers.
- 3) Requires file TRAN.C to compute transcendental functions.";
- SEE-ALSO: TRAN.C;
- COMPILERS: any C compiler with double prec. reals;
- REFERENCES: AUTHORS: unknown; TITLE: "HP.C";
- CITATION: "PC-SIG Disk 50 or 142"
- ENDREF;
- */
- #include "stdio.h"
-
- #include "tran.c"
-
- double pop(),push();
-
- double stack[6];
-
- int sp=0;
-
- main()
-
- {
-
- double dp=1;
-
- int x,i,df=0;
-
- while ((x=getchar()) != 'q' && x != 'Q') {
-
- if (x>='0' && x<='9') {
-
- if (df) dp=10*dp;
-
- stack[0]=10*stack[0]+x-'0';
-
- }
-
- else if (x=='.') df=1;
-
- else {
-
- stack[0] = stack[0] / dp;
-
- dp=1;
-
- df=0;
-
- if (x==',' && stack[0] == 0) stack[0]=stack[sp];
-
- if (stack[0] == 0) stack[0]=pop();
-
- switch (x) {
-
- case ',' :
-
- case '\13' :
-
- break;
-
- case '+' :
-
- stack[0] = stack[0]+pop();
-
- break;
-
- case '-' :
-
- stack[0] = pop()-stack[0];
-
- break;
-
- case '*' :
-
- stack[0] = pop()*stack[0];
-
- break;
-
- case '/' :
-
- stack[0] = pop()/stack[0];
-
- break;
-
- case '^' :
-
- stack[0] = exp( stack[0] * log( pop(0) ) ) ;
-
- break;
-
- case 'I' :
-
- case 'i' :
-
- stack[0] = 1/stack[0];
-
- break;
-
- case 'N' :
-
- case 'n' :
-
- stack[0] = -stack[0];
-
- break;
-
- case 'r' :
-
- case 'R' :
-
- stack[0]=root(stack[0]);
-
- break;
-
- case 'l' :
-
- case 'L' :
-
- stack[0]=log(stack[0]);
-
- break;
-
- case 'e' :
-
- case 'E' :
-
- stack[0]=exp(stack[0]);
-
- break;
-
- }
-
- push (stack[0]);
-
- stack[0]=0;
-
- if (x != '\0') {
-
- for (i=1;i<=sp;i++) printf("%f ",stack[i]);
-
- printf ("%c\n",x);
-
- }
-
- }
-
- }
-
- }
-
-
-
- /* Pop floating from stack */
-
- double pop()
-
- {
-
- if (sp>0) return (stack[sp--]);
-
- else return (0);
-
- }
-
-
-
- /* Push floating onto stack */
-
- double push(x)
-
- double x;
-
- {
-
- if (sp<5) stack[++sp] = x;
-
- }