四则运算

/*只能输入运算符和数字*/
#include<conio.h>
#include<stdio.h>
#include<string.h>
double Operation(double operand1,char operator1, double operand2);
int IsOperator(char character);
char JudgePrecede(char symbol1,char symbol2);
double EvaluateExpression(void);

void main()
{
       
        /*提示输入一条表达式,要以'#'结尾,回车后可得出结果,如:9-6#回车即可*/
        printf("please input a expression:/n");
        printf("/n%lf/n",EvaluateExpression());
        getch();
  return;
}
double EvaluateExpression(void)
{
        double digit;
        double a,b;
        char theta;

        char cInput;
        char OPTR[20];
        double OPND[20];
        int top_optr = -1,top_opnd = -1;


        OPTR[0] = '#';
        top_optr = 0;
        cInput = getchar();
        digit = 0.0;//临时变量
        while( cInput!='#'|| OPTR[top_optr] != '#' )
        {/*如果不是操作符,则用变量temp暂时存储*/
        /*略施小计,实现一位以上四则运算*/
                if( 0 == IsOperator(cInput))
                {       /*正数*/
                        if((cInput <'0') || (cInput > '9') )
                                return 0;
                        digit = digit * 10 + (cInput - '0');
                        cInput = getchar();
                       
                }
                else  /*如果是操作符*/
                {
                        top_opnd++;
                        OPND[top_opnd] = digit;
                        digit = 0.0;//临时变量复位

                        switch(JudgePrecede(OPTR[top_optr], cInput))
                        {/*当栈顶操作符优先级小于栈外操作符,则入栈,继续输入*/
                                case '<':top_optr++;
                                         OPTR[top_optr] = cInput;
                                         cInput = getchar();
                                         break;
                        /*当括号左右两边相遇,则出栈,继续输入*/
                                case '=':top_optr--;
                                         cInput = getchar();
                                         break;
                        /*当栈顶操作符优先级大于栈外操作符,则执行运算*/
                                case '>':theta = OPTR[top_optr];
                                         top_optr--;
                                         a = OPND[top_opnd];
                                         top_opnd--;
                                         b = OPND[top_opnd];
                                         top_opnd--;
                                         top_opnd++;
                                         OPND[top_opnd] =Operation(a,theta,b);
                                          printf("%lf/n",OPND[top_opnd]);
                                         cInput = getchar();
                                         break;
                        }/*switch*/

                }/*if*/

        }/*while*/

        return( OPND[top_opnd]);

}/*EvaluateExpression*/
/*4则运算*/
double Operation(double operand1,char operator1, double operand2)
{
         switch(operator1)
        {
                case '+' : return(operand1 + operand2);
                case '-' : return(operand1 - operand2);
                case '*' : return(operand1 * operand2);
                case '/' : return(operand1 / operand2);

        }
   return 0.0;
}

int IsOperator(char character)
{
        if(
           '+' == character ||
           '-' == character ||
           '*' == character ||
           '/' == character ||
           '(' == character ||
           ')' == character ||
           '#' == character
           )
                return 1;
        else
                return 0;
}
/*判断运算符优先级,强呀*/
char JudgePrecede(char symbol1,char symbol2)
{
        int row,col;
        char result[7][7];

        strcpy(result[0],">><<<>>");
        strcpy(result[1],">><<<>>");
        strcpy(result[2],">>>><>>");
        strcpy(result[3],">>>><>>");
        strcpy(result[4],"<<<<<= ");
        strcpy(result[5],">>>> >>");
        strcpy(result[6],"<<<<< =");

        switch(symbol1)
        {
                case '+' : row = 0;
                           break;
                case '-' : row = 1;
                           break;
                case '*' : row = 2;
                           break;
                case '/' : row = 3;
                           break;
                case '(' : row = 4;
                           break;
                case ')' : row = 5;
                           break;
                case '#' : row = 6;
                           break;
        }
        switch(symbol2)
        {
                case '+' : col= 0;
                           break;
                case '-' : col = 1;
                           break;
                case '*' : col = 2;
                           break;
                case '/' : col = 3;
                           break;
                case '(' : col = 4;
                           break;
                case ')' : col = 5;
                           break;
                case '#' : col = 6;
                           break;
        }
        return result[row][col];
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值