| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1547 人关注过本帖
标题:《The C programming Language》中的一个例子—逆波兰计算器问题求解
只看楼主 加入收藏
hcs_xiaohan
Rank: 2
等 级:论坛游民
帖 子:40
专家分:23
注 册:2016-7-4
结帖率:91.67%
收藏
 问题点数:0 回复次数:1 
《The C programming Language》中的一个例子—逆波兰计算器问题求解
这是教材里的代码:
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>

#define MAXOP 100
#define NUMBER '0'
#define MAXVAL 100
#define BUFSIZE 100


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

int sp = 0;
double val[MAXVAL];
char buf[BUFSIZE];
int bufp = 0;

void 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);
        }
    }
}
void push(double f)
{
    if (sp < MAXVAL)
        val[sp++] = f;
    else
        printf("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;
    }
}
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;
}
int getch(void)
{
    return (bufp > 0) ? buf[--bufp] : getchar();
}
void ungetch(int c)
{
    if (bufp >= BUFSIZE)
        printf("ungetch:too many characters\n");
    else
        buf[bufp++] = c;
}


问题1:请帮我解释一下getop函数 81行为什么是s[1]='\0'?

图片附件: 游客没有浏览图片的权限,请 登录注册

问题2:getop函数最后(截图93、94、95行)为什么这样写?

图片附件: 游客没有浏览图片的权限,请 登录注册


[此贴子已经被作者于2016-7-4 20:26编辑过]

搜索更多相关主题的帖子: 计算器 include double 
2016-07-04 20:18
加奈
Rank: 1
等 级:新手上路
帖 子:15
专家分:6
注 册:2014-10-12
收藏
得分:0 
这代码正好今天看到了
问题1:请帮我解释一下getop函数 81行为什么是s[1]='\0'?
你可以注释去掉,不影响。
问题2:getop函数最后(截图93、94、95行)为什么这样写?
你是不是想问为什么要有92,93?如果是的话,我想他大概是想说名 反读 然后举了个例子
这段代码(92 93)你可以注释掉,然后把getch()函数改成
int getch(void){
    //return (bufp > 0) ? buf[--bufp] : getchar();
    return getchar();
}
效果一样
2016-10-20 21:56
快速回复:《The C programming Language》中的一个例子—逆波兰计算器问题求解
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.011747 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved