计算器

作者在 2010-04-17 12:52:50 发布以下内容

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#define DELIMITER 1
#define VARIABLE 2
#define NUMBER 3


char token[80];
char tok_type;
char *prog;

void eval_exp(double *answer),eval_exp2(double *answer);
void eval_exp3(double *answer),eval_exp4(double *answer);
void eval_exp5(double *answer),eval_exp6(double *answer);
void atom(double *answer);
void get_token(void),putback(void);
void serror(int error);
int isdelim(char c);

void eval_exp(double *answer)
{
    get_token();
    if(!*token)
    {
        serror(2);
        return;
    }
    eval_exp2(answer);
    if(*token)serror(0);
}

void eval_exp2(double *answer)
{
    register char op;
    double temp;
    eval_exp3(answer);
    while((op=*token)=='+' || op=='-')
    {
        get_token();
        eval_exp3(&temp);
        switch(op)
        {
            case '-':
                *answer=*answer-temp;
                break;
            case '+':
                *answer=*answer+temp;
                break;
        }
    }
}        

void eval_exp3(double *answer)
{
    register char op;
    double temp;
    eval_exp4(answer);
    while((op=*token)=='*' || op=='/' || op=='%')
    {
        get_token();
        eval_exp4(&temp);
        switch(op)
        {
            case '*':
                *answer=*answer*temp;
                break;
            case '/':
                if(temp==0.0)
                {
                    serror(3);
                    *answer=0.0;
                }
                else *answer=*answer/temp;
                break;
            case '%':
                *answer=(int)*answer%(int)temp;
                break;
        }
    }
}               

void eval_exp4(double *answer)
{
    double temp,ex;
    register int t;
    eval_exp5(answer);
    if(*token=='^')
    {
        get_token();
        eval_exp4(&temp);
        ex=*answer;
        if(temp==0.0)
        {
            *answer=1.0;
            return;
        }
        for(t=temp-1;t>0;--t)*answer=(*answer)*(double)ex;
    }
}           

void eval_exp5(double *answer)
{
    register char op;
    op=0;
    if((tok_type==DELIMITER)&&*token=='+' || *token=='-')
    {
        op=*token;
        get_token();
    }
    eval_exp6(answer);
    if(op=='-')*answer=-(*answer);
}

void eval_exp6(double *answer)
{
    if((*token=='('))
    {
        get_token();
        eval_exp2(answer);
        if(*token!=')')
                serror(1);
        get_token();
    }
    else
        atom(answer);
}               

void atom(double *answer)
{
    if(tok_type==NUMBER)
    {
        *answer=atof(token);
        get_token();
        return;
    }
    serror(0);
}       

void putback(void)
{
    char *t;
    t=token;
    for(;*t;t++)prog--;
}   

void serror(int error)
{
    static char *e[]=
    {
        "Syntax error",
        "UNbalanced Parenthesses",
        "No Expression Present",
        "Division by Zero"
    };
    printf("%s\n",e[error]);
}       

void get_token(void)
{
    register char *temp;
    tok_type=0;
    temp=token;
    *temp='\0';
    if(!*prog)return;
    while(isspace(*prog))++prog;
    if(strchr("+-*/%^=()",*prog))
    {
        tok_type=DELIMITER;
        *temp++=*prog++;
    }
    else if(isalpha(*prog))
    {
        while(!isdelim(*prog))*temp++=*prog++;
        tok_type=VARIABLE;
    }
    else if(isdigit(*prog))
    {
        while(!isdelim(*prog))*temp++=*prog++;
        tok_type=NUMBER;
    }
    *temp='\0';
}    

int isdelim(char c)
{
    if(strchr("+-/*%^=()",c)||c==9||c=='\r'||c==0)
        return 1;
    return 0;
}              

int main(void)
{
  double answer;
  char *p;
  p=(char *)malloc(100);
  if(!p)
  {
      printf("Allocation failure.\n");
      exit(1);
  }
  do
  {
      prog=p;
      printf("ENter expression:");
      gets(prog);
      if(!*prog)break;
      eval_exp(&answer);
      printf("Answer is :%.2f\n",answer);
  }while(*p);         
  system("PAUSE");
  return 0;
}

默认分类 | 阅读 409 次
文章评论,共0条
游客请输入验证码
文章分类
文章归档
最新评论