C 프로그래밍 언어 학습 노트(二)

13463 단어 학습 노트
최근에는 《 C 프로그래밍 언어 》.를 통해 C 언어를 다시 체계적으로 학습하면서 함수에 관한 부분을 배웠다.오늘 배운 체험은 코드를 쓴 후에 반복적으로 고려하고 수정해야만 우수한 제품이 될 수 있다는 것이다.다음은 역폴란드 계산기에 대한 코드를 붙여 연습문제 4-3의 수정을 포함한다.
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>

#define MAXOP 100
#define NUMBER '0'
#define BUFSIZE 100
#define MAXVAL 100
int sp = 0;
double val[MAXVAL];
char buf[BUFSIZE];
int bufp = 0;

int getop(char s[]);
void push(double x);
double pop(void);
int getch(void);
void ungetch(int);

int main()
{
    int type;
    double op2,op1;
    char s[MAXOP];

    while((type = getop(s)) != EOF)
    {
        switch(type)
        {
            case NUMBER:
                push(atof(s));
                break;
            case '+':
                push(pop() + pop());
                break;
            case '-':
                op2 = pop();
                push(pop() - op2);
                break;
            case '*':
                push(pop() * pop());
                break;
            case '/':
                op2 = pop();
                if(op2 != 0.0)
                    push(pop() / op2);
                else
                  printf("error:zero divisor
"); break; case '%': op2 = pop(); push((int)pop() % (int)op2); break; case '
': printf("\t%.8g
", pop()); break; default: printf("error:unknown command %s
", s); break; } } return 0; } void push(double f) { /*printf("f = %lf
", f);
*/ if(sp < MAXVAL) val[sp++] = f; else printf("error:the stack is full
"); } double pop(void) { if(sp > 0) return val[--sp]; else { printf("error:the stack is empty
"); return 0; } } int getop(char s[]) { int c, i; while((s[0] = c = getch()) == ' ' || c == '\t') ; s[1] = '\0'; if(!isdigit(c) && c != '.') { int c2; /**/ /* printf("c = %c
",c);
*/ if( c == '
' || !(c == '-' || c == '+')) { return c; } /* , , */ c2 = getch(); ungetch(c2); /*printf("c2 = %c
", c2);
*/ if(!isdigit(c2)) { return c; } } i = 0; if(isdigit(c) || c == '-') { while((s[++i] = c = getch()) && isdigit(c)) ; } if(c == '.') { while((s[++i] = c = getch()) && isdigit(c)) ; } s[i] = '\0'; /*printf("s = %s
", s);
*/ if(c != EOF) { ungetch(c); } return NUMBER; } int getch() { return (bufp > 0) ? buf[--bufp] : getchar(); } void ungetch(int c) { if(bufp < BUFSIZE) { buf[bufp++] = c; } else { printf("error:the buf is full
"); } }

좋은 웹페이지 즐겨찾기