C程序设计语言学习笔记(二)

最近在通过《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\n");
                break;
            case '%':
                op2 = pop();
                push((int)pop() % (int)op2);
                break;
            case '\n':
                printf("\t%.8g\n", pop());
                break;
            default:
                printf("error:unknown command %s\n", s);
                break;

        }
    }
    return 0;
}

void push(double f)
{
    /*printf("f = %lf\n", f);*/
    if(sp < MAXVAL)
      val[sp++] = f;
    else
      printf("error:the stack is full\n");
}

double pop(void)
{
    if(sp > 0)
        return val[--sp];
    else
    {
        printf("error:the stack is empty\n");
        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\n",c);*/
        if( c == '\n' || !(c == '-' || c == '+'))
        {
            return c;
        }
        /*获取下一个字符,判断是否为数字,以支持正负号的输入*/
        c2 = getch();
        ungetch(c2);
        /*printf("c2 = %c\n", 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\n", 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\n");
    }
}

 

你可能感兴趣的:(学习笔记)