当前位置: 代码迷 >> C语言 >> 帮朋友改的四则运算计算器
  详细解决方案

帮朋友改的四则运算计算器

热度:168   发布时间:2008-04-15 15:20:30.0
帮朋友改的四则运算计算器
只支持正整数。。可以这样测试9*8*8-(9*9-12)*7*7-8*9-8#
好像是对的。。不知道有没有错。。大家看看
#include<stdio.h>
#include<stdlib.h>
#include <ctype.h>
#define Stack_Size 50
typedef struct
{
    char elem[Stack_Size];
    int top;
}OpStack;
typedef struct
{
    int elem[Stack_Size];
    int top;
}NumStack;

void Push(OpStack *s,char x);
void Pop(OpStack *s,char *x);
void Push(NumStack *s,int x);
void Pop(NumStack *s,int *x);
int Execute(int a,char c,int b);
int ExpEvaluation(NumStack *OVS,OpStack *OPTR);
void GetNumber(char p);
int Cint(char mychar);
int num=0;
void main()
{   
    int result;
    OpStack OPTR;
    NumStack OVS;
    OVS.top=-1;OPTR.top=-1;
    result=ExpEvaluation(&OVS,&OPTR);
    printf("The result is %d\n",result);
}

void Push(OpStack *s,char x)
{
    s->top++;
    s->elem[s->top]=x;
}
void Pop(OpStack *s,char *x)
{
    *x=s->elem[s->top];
    s->top--;
}
void Push(NumStack *s,int x)
{
    s->top++;
    s->elem[s->top]=x;
}
void Pop(NumStack *s,int *x)
{
    *x=s->elem[s->top];
    s->top--;
}
int Execute(int a,char c,int b)
{
   
     switch(c)
     {
     case '+':return a+b;break;
     case '-':return a-b;break;
     case '*':;return a*b;break;
     case '/':return a/b;break;
     }
     
}

void GetNumber(char p)
{
    num=num*10+Cint(p);
}
int Cint(char mychar)
{
    return (mychar-48);
}
//栈运算符与读入运算符优先级的比较
char Compare(char x,char y)
{
  char priority='<';  
  switch(x)
  {
   case '+':
   case '-':if(y=='#'||y=='+'||y=='-'||y==')')priority='>';break;
   case '*':
   case '/': priority='>';if(y=='(' )priority='<';break;
   case '(':if(y==')')priority='=';break;
   case '#':if(y=='#') priority='=';break;
   default:priority='E';
  }
  return priority;
}
int ExpEvaluation(NumStack *OVS,OpStack *OPTR)
{
     int v,flag=0,f1=1,f2=1;
    char ch,ch1,c;
    int a,b,flag1=1;
    Push(OPTR,'#');
    printf("\n\nputin a string(stop with #):");
    while(ch!='#'||OPTR->elem[OPTR->top]!='#')
    {   if(f1&&f2)
         ch=getchar();
        if(isdigit(ch))
        {
            GetNumber(ch);
            
        }
        else
        {   
            
            if((ch>='0'&&ch<='9'||ch1>='0'&&ch1<='9')&&!flag)
            {   
                Push(OVS,num);            
                num=0;
            }
            switch(Compare(OPTR->elem[OPTR->top],ch))
            {
                                
            case '<':                
                Push(OPTR,ch);
                flag=0;
                break;
            case '>':
                Pop(OPTR,&c);
                Pop(OVS,&b);
                Pop(OVS,&a);
                v=Execute(a,c,b);
               
                if(OPTR->elem[OPTR->top]=='-')
                {
                      v=-1*v;
                      OPTR->elem[OPTR->top]='+';
                }
                    Push(OVS,v);
                if(ch!='#'&&ch!=')')    
                {   
                    
                        Push(OPTR,ch);
                        flag=0;
                }
                else
                {
                    f1=0;
                    flag=1;
                    
                }
                
                //printf("%d %c %d  %d\n",a,c,b,v);
                break;
            case '=':
                Pop(OPTR,&c);
                if(c=='('&&ch==')')
                {    
                    
                        f1=1;
                        flag=1;
                    
                }
                break;
            default:printf("Wrong Express!");exit(0);
                
            }
        }
         ch1=ch;
        
    }
   
    return(v);
}
搜索更多相关的解决方案: 计算器  运算  朋友  

----------------解决方案--------------------------------------------------------
写得过于复杂了,仅四则运算不需要这么长的。。。



[[it] 本帖最后由 Orz 于 2008-4-15 15:33 编辑 [/it]]
----------------解决方案--------------------------------------------------------
燕子是你的马甲?我也不想啊。。。他给我基本框架,我只能这样写了。。。。
----------------解决方案--------------------------------------------------------
马甲。。。。。。
----------------解决方案--------------------------------------------------------
他的意思就是用一个getchar(),一边取词一边分析。。还要进行类似文法分析,归约。。所以就这样了。。。呵呵
----------------解决方案--------------------------------------------------------
我写的代码真的很不堪吗,我再看看啊,谢谢,扰烦你了
----------------解决方案--------------------------------------------------------
似乎还是有问题的,而且还显示有error
----------------解决方案--------------------------------------------------------
我用c++弄的..你不要tc哦...而且我只保证正整数可以..你可以自己改下.我运行过的代码贴上来的..

[[it] 本帖最后由 sunkaidong 于 2008-4-15 22:05 编辑 [/it]]
----------------解决方案--------------------------------------------------------
我用的VC++环境,是c文件
----------------解决方案--------------------------------------------------------
你就用.cpp文件吧..还有就是有错误的时候你把错误发上来...ok,不要过几天才说..
----------------解决方案--------------------------------------------------------