<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    呆呆向前沖的blog

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      78 隨筆 :: 43 文章 :: 5 評論 :: 74 Trackbacks

    mmd 感覺腦子不夠用了。還是用笨方法:一步一步寫注釋。

    #include <stdio.h>
    #include <stdlib.h> /* for atof() */
    #include <ctype.h>

    #define MAXOP 100       /* max size of operand and operator */
    #define NUMBER '0'      /* signal that a number was found  */
    #define MAXVAL 100      /* maxmium depth of value stack */
    #define BUFSIZE 100

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

    int sp = 0;             /* next free stack position */
    double val[MAXVAL];     /* value stack  */
    char buf[BUFSIZE];      /* buffer for ungetch */
    int bufp = 0;           /* next free position in buf */

    /* 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);
                                    else
                                            printf("error: zero divisor\n");
                                    break;
                            case '\n':
                                    printf("\t%.8g\n",pop());
                                    break;
                            default:
                                    printf("error: unknown command %s\n",s);
                                    break;
                    }
            }
            return 0;
    }
    /* push: push f onto value stack  */
    void push(double f)
    {
            if (sp < MAXVAL)
                    val[sp++] = f;
            else
                    printf("error: stack full,can't push %g\n",f);
    }
    /* pop: pop and return top value from stack */
    double pop(void)
    {
            if (sp > 0)
                    return val[--sp];
            else {
                    printf("error: stack empty\n");
                    return 0.0;
            }
    }
    /* getop: get next character or numeric oprand */
    int getop(char s[])
    {  
      //開始試圖讀取一個操作數或一個操作符
            int i,c;
      //忽略空格:直到讀到非空字符
            while ((s[0] = c = getch()) == ' ' || c == '\t')
                    ;
      //末尾加字符串結束標識
            s[1] = '\0';
            //if (!(s[0] == '-' && bufp == 1))
            //        if (!isdigit(c) && c != '.')
            //                return c;
      //如果讀到的不是數字并且不是小數點,表示讀到了一個操作符
            if (!isdigit(c) && c != '.')
                    return c;       /* not a number */
            i = 0;
      //如果讀到了數字,繼續讀取直到讀到非數字字符
            if (isdigit(c)) /* collect integer part */
                    while (isdigit(s[++i] = c = getch()))
                            ;
      //如果上面讀取到的非數字字符是小數點,繼續讀取直到讀取到非數字字符
            if (c == '.')   /* collect fraction part */
                    while (isdigit(s[++i] = c = getch()))
                            ;
      //在s結尾前一位加結束標識
            s[i] = '\0';
      //如果未讀到末尾,把最后讀到的那個字符放到輸入緩沖字符數組buf中
            if (c != EOF)
                    ungetch(c);
            return NUMBER;
    }

    int getch(void)         /* get a (possibly pushed-back) character */
    {
            return (bufp > 0) ? buf[--bufp] : getchar();
    }

    void ungetch(int c)     /* push character back on input */
    {
            if (bufp >= BUFSIZE)
                    printf("ungetch: too many characters\n");
            else
                    buf[bufp++] = c;
    }

    posted on 2005-01-25 23:19 呆呆向前沖的blog 閱讀(227) 評論(0)  編輯  收藏 所屬分類: 愛好:網絡編程

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 老司机亚洲精品影视www| free哆啪啪免费永久| 免费人成在线观看视频播放| youjizz亚洲| 韩国欧洲一级毛片免费| 久久亚洲精品11p| 免费大黄网站在线看| 美女视频黄.免费网址| 久久亚洲国产精品123区| 中文在线日本免费永久18近| 亚洲色婷婷一区二区三区| 99在线免费观看| 亚洲综合一区二区| 免费国产黄线在线观看| 国产亚洲精品免费| 亚洲宅男天堂在线观看无病毒| 免费看黄的成人APP| 亚洲国产av高清无码| 在线观看人成视频免费| 羞羞漫画登录页面免费| 亚洲乱码无码永久不卡在线| 18女人水真多免费高清毛片| 亚洲AV综合永久无码精品天堂| 亚洲精品老司机在线观看| 久久aⅴ免费观看| 在线观看亚洲AV日韩AV| 午夜亚洲国产成人不卡在线| 国产婷婷成人久久Av免费高清| 亚洲人成毛片线播放| 亚洲男女内射在线播放| 91精品国产免费入口| 国产亚洲漂亮白嫩美女在线| 国产V亚洲V天堂A无码| 国产三级在线观看免费| 亚洲免费一区二区| 亚洲jizzjizz在线播放久| 亚洲男人天堂2020| 91免费国产在线观看| 好吊色永久免费视频大全| 麻豆狠色伊人亚洲综合网站| 亚洲色偷偷狠狠综合网|