啊哈磊_编程从这里起步

标题: c程序设计语言第二版上的一个例题,设计的是一个计算器。虽然编译成功,但是运行后... [打印本页]

作者: fengzhenging    时间: 2013-9-10 21:01
标题: c程序设计语言第二版上的一个例题,设计的是一个计算器。虽然编译成功,但是运行后...
#include <stdio.h>
#include <stdlib.h>

#define MAXOP 100
#define NUMBER '0'

int getop(char []);
void push (double);
double pop(void);
int 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;
        }
    }


        system("pause");
        return 0;
}



#define MAXVAL 100

int sp=0;
double val[MAXVAL];

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;
    }
}

#include <ctype.h>

int getch(void);
void ungetch(int);

int getop(char s[])
{
        int i,c;
    while((s[0]=c=getch())==' '||c=='\t')
                ;
    s[i]='\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;
}  

#define BUFSIZE 100

char buf[BUFSIZE];
int bufp=0;

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;

}



作者: rosynirvana    时间: 2013-9-10 21:01
看上去你抄错了
  1. int getop(char s[])
  2. {
  3.         int i,c;
  4.     while((s[0]=c=getch())==' '||c=='\t')
  5.                 ;
  6.     s[i]='\0';
复制代码

作者: rosynirvana    时间: 2013-9-10 23:29
你的问题是什么……
作者: fengzhenging    时间: 2013-9-11 12:16
rosynirvana 发表于 2013-9-10 23:29
你的问题是什么……

编译虽然成功,但计算不了。。
作者: rosynirvana    时间: 2013-9-11 12:18
fengzhenging 发表于 2013-9-11 12:16
编译虽然成功,但计算不了。。

你是按照后缀法输入的吗?
作者: fengzhenging    时间: 2013-9-11 15:36
rosynirvana 发表于 2013-9-11 12:18
你是按照后缀法输入的吗?

求举例,不管是输入3+6还是3 6 +都无法计算,enter键一按下 就是跳出Windows正在寻找解决问题的方案
作者: fengzhenging    时间: 2013-9-11 18:36
rosynirvana 发表于 2013-9-11 16:56
看上去你抄错了

好眼力!!!!




欢迎光临 啊哈磊_编程从这里起步 (https://bbs.codeaha.com/) Powered by Discuz! X3.2