zoukankan      html  css  js  c++  java
  • 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");
        }
    }
  • 相关阅读:
    CF827D Best Edge Weight
    克鲁斯卡尔重构树总结
    模拟赛 提米树 题解 (DP+思维)
    luogu P4781 【模板】拉格朗日插值
    luogu P5826 【模板】子序列自动机
    子序列自动机
    luogu P1368 工艺 /【模板】最小表示法
    最小表示法
    SP1812 LCS2
    FZOJ 3602 T2
  • 原文地址:https://www.cnblogs.com/renteng/p/2810548.html
Copyright © 2011-2022 走看看