# Reverse Polish Calculator

• View
31

2

Embed Size (px)

DESCRIPTION

Reverse Polish Calculator. Reverse Polish Notation 연산자가 피연산자의 뒤에 온다 . 예 ) (1 – 2) * (4 + 5)  1 2 – 4 5 + * * 수식에서 괄호가 요구되지 않는다 . ( 수식이 애매하지 않다 ). 구현 방법 1) 피연산자는 stack(LIFO) 상에 push 2) 연산자가 입력되면 적절한 수의 피연산자를 pop 시킨다 . ( 이항연산자  2 개 ) - PowerPoint PPT Presentation

### Text of Reverse Polish Calculator

• Reverse Polish CalculatorReverse Polish Notation . ) (1 2) * (4 + 5) 1 2 4 5 + * * . ( )

• 1) stack(LIFO) push 2) pop . ( 2) 3) pop , stack push

) 1 2 4 5 + * 1) 1 2 stack push 2) stack 2 pop 3) (-1) stack push

• 1) 4 5 stack push 2) + , stack 2 pop 3) 4 5 9 stack push 2) * stack 2 pop (-1 9) 3) 1 9 9 stack push * newline stack pop .

• 1 2 4 5 + * stack0sp12sp-1sp-145sp-19sp-9spsp

• While (next operator or operand is not EOF)if (number)push itelse if (operator)pop operandsdo operationpush resultelse if (newline)pop and print top of stackelseerror

• #define MAXOP 100#define NUMBER '0'

int getop(char []);void push(double);double pop(void);

/* reverse polish calculator */main() {

int type;double op2;char s[MAXOP];

• while ((type = getop(s)) != EOF) {switch (type) {case NUMBER:push(atof(s));break;case '+':push(pop() + pop());break;case '*':push(pop() * pop());break;

• case '-':op2 = pop();push(pop() - op2);break;case '/':op2 = pop();if (op2 != 0.0)push(pop() / op2);elseprintf("erroe: zero division\n");break;

• case '\n':printf("\t%.8g\n",pop());break;default:printf("error: unknown command %s\n",s);break;}}return 0;}

• #define MAXVAL 100int sp = 0;double val[MAXVAL];

void push(double f) {if (sp < MAXVAL )val[sp++] = f;elseprintf("error: stack full, can't push %g\n", f);}

• double pop(void) {if (sp > 0)return val[--sp];else {printf("error: stack empty\n");return 0.0;}}

• #include

int getch(void);void ungetch(int);

/* getop: get next operator or numeric operand */int getop(char s[]) {int i, c;

while ((s[0] = c = getch()) == ' ' || c == '\t');

• s[1] = '\0';if (!isdigit(c) && c != '.')return c;i = 0;if (isdigit(c))while (isdigit(s[++i] = c = getch()));if (c == '.')while (isdigit(s[++i] = c = getch()));

• s[i] = '\0';if (c != EOF)ungetch(c);return NUMBER;}#define BUFSIZE 100

char buf[BUFSIZE];int bufp = 0;

int getch(void) {return (bufp > 0) ? buf[--bufp] : getchar();}

• void ungetch(int c) {if (bufp >= BUFSIZE)printf("ungetch: too many characters\n");elsebuf[bufp++] = c;}

• Scope rule( )main() { }/**********************************/int sp = 0;double val[MAXVAL];void push(double f) { }double pop(void) { } sp, val scope : (push, pop ok, main X, main push pop X)

• , extern .(declaration) vs (definition) : () : ) int sp;double val[MAXVAL];) extern int sp;extern double val[];

• In file1:extern int sp;extern double val[];void push(double f) { }double pop(void) { }In file2:int sp = 0;double val[MAXVAL];

• Separate CompileLet us now consider dividing the calculator program into several source files.1st file : main (main.c)2nd file : push, pop (stack.c)3rd file : getop (getop.c)4th file : getch, ungetch (getch.c)

• #define NUMBER 0void push(double);double pop(void);int getop(char []);int getch(void);void ungetch(int);calc.hSeparate Compile#include #inlcude #include calc.h#define MAXOP 100main() { }

main.c

• getop.c#include #include #include calc.hint getop() { }

stack.c#include #include calc.h#define MAXVAL 100int sp = 0;double val[MAXVAL];void push(double) { }double pop(void) { }Separate Compile

• Separate Compilegetch.c#include #define BUFSIZE 100char buf[BUFSIZE];int bufp = 0;int getch(void) { }void ungetch(int c) { }

• Turbo-C()Create the file rcalc.prj and put into it the name of each file that contains definitions of functions used in the program. The names may be separated by white space, commas, or semicolons.In file rcalc.prj: main.c (calc.h) getop.c (calc.h) stack.c (calc.h) getch.c(calc.h)

• Select the Project menu from main menu line.Then in turn select Project name and type in the name rcalc.prjNow press Alt-r to make and run the program.Turbo-C project facility will recompile only those files that have been changed since the last time rcalc.exe was updated.

• Static Static scope static char buf[BUFSIZE]; static int bufp = 0; int getch(void) { }

• C File inclusion #include filename #include 2. Macro #define name replacement text #define forever for(;;) #define max(A,B) ((A) > (B) ? (A) : (B)) #define square(x) ( (x) * (x) )

Recommended

Technology
Documents
Documents
Documents
Documents
Documents
Education
Documents
Documents
Education
Documents
Documents