关于计算器中小数点的优先级和其他运算符号相比谁大谁小

2019-07-20 15:04发布

请问有大神知道关于计算器中小数点的优先级和其他运算符号相比谁大谁小吗?,换言之有哪位大神有编过能得出浮点型结果的计算器吗?本人想用stm32编一个触屏计算器并能得出浮点结果。以下是本人编的只能得出整型结果的计算器:
#include"stdio.h"
#define maxsize 20
typedef struct arithentic
{
        char fu[maxsize];
        int shu[maxsize];
        int top;
}stu;
struct advence
{
        char letter;
        int ch;
}pro[]={{'+',1},{'-',1},{'*',2},{'/',2},{')',0},{'(',0}};
int advence_com(char k)
{
        int i;
        for(i=0;i<6;i++)
        if(pro[i].letter==k)
        return pro[i].ch;
}
int yunsuan(char *s)
{
        stu op;
        stu num;
        int a,b,c,d,i,sum=0,n=0,k;
        op.top=num.top=-1;
        while(*s!='')
        {
                if(*s>='0'&&*s<='9')
                {
                    num.top++;
                        num.shu[num.top]=*s-'0';
                        s++;
                        n++;
                }
                else
                if(*s=='+'||*s=='-'||*s=='*'||*s=='/'||*s=='('||*s==')')
                {
                        if(n>=2)
                        {
                        k=num.top;
                        i=k+1-n;
                        while(n--)
                        {
                                d=num.shu[i];
                                num.top--;
                                sum=sum*10+d;
                                i++;
                        }
                        num.top++;
                        num.shu[num.top]=sum;
                        sum=0;
                        }
                        n=0;
                        if(op.top==-1||*s=='('||advence_com(op.fu[op.top])<advence_com(*s))
                    {
                            op.top++;
                            op.fu[op.top]=*s;
                            s++;
                        }
                        else
                        if(*s==')'&&op.fu[op.top]=='(')
                        {
                                op.top--;
                                s++;
                        }
                        else
                        if(advence_com(op.fu[op.top])>=advence_com(*s))
                        {
                                switch(op.fu[op.top])
                                {
                                        case '+':a=num.shu[num.top];
                                                 num.top--;
                                                 b=num.shu[num.top];
                                                 num.top--;
                                                 c=b+a;
                                                 num.top++;
                                                 num.shu[num.top]=c;break;
                                        case '-':a=num.shu[num.top];
                                                 num.top--;
                                                 b=num.shu[num.top];
                                                 num.top--;
                                                 c=b-a;
                                                 num.top++;
                                                 num.shu[num.top]=c;break;
                                        case '*':a=num.shu[num.top];
                                                 num.top--;
                                                 b=num.shu[num.top];
                                                 num.top--;
                                                 c=b*a;
                                                 num.top++;
                                                 num.shu[num.top]=c;break;
                                        case '/':a=num.shu[num.top];
                                                 num.top--;
                                                 b=num.shu[num.top];
                                                 num.top--;
                                                 if(a!=0)
                                                 {
                                                          c=b/a;
                                                                 num.top++;
                                                     num.shu[num.top]=c;break;
                                                         }
                                                 else
                                                 {
                                                         printf("计算错误 ");
                                                         break;
                                                         }
                                }
                                op.top--;
                        }
                }
        }
        if(n>=2)
        {
                k=num.top;
                i=k+1-n;
                while(n--)
                {
                        d=num.shu[i];
                        num.top--;
                        sum=sum*10+d;
                        i++;
                }
                num.top++;
                num.shu[num.top]=sum;
                sum=0;
        }
                        n=0;
        while(op.top!=-1)
        {
                switch(op.fu[op.top])
                                {
                                        case '+':a=num.shu[num.top];
                                                 num.top--;
                                                 b=num.shu[num.top];
                                                 num.top--;
                                                 c=b+a;
                                                 num.top++;
                                                 num.shu[num.top]=c;break;
                                        case '-':a=num.shu[num.top];
                                                 num.top--;
                                                 b=num.shu[num.top];
                                                 num.top--;
                                                 c=b-a;
                                                 num.top++;
                                                 num.shu[num.top]=c;break;
                                        case '*':a=num.shu[num.top];
                                                 num.top--;
                                                 b=num.shu[num.top];
                                                 num.top--;
                                                 c=b*a;
                                                 num.top++;
                                                 num.shu[num.top]=c;break;
                                        case '/':a=num.shu[num.top];
                                                 num.top--;
                                                 b=num.shu[num.top];
                                                 num.top--;
                                                 if(a!=0)
                                                 {
                                                          c=b/a;
                                                                 num.top++;
                                                     num.shu[num.top]=c;break;
                                                         }
                                                 else
                                                 {
                                                         printf("计算错误 ");
                                                         break;
                                                         }
                                }
                                op.top--;
        }
        return num.shu[0];
}
int main()
{
        char s[maxsize];
        int sum;
        while(1)
        {
    printf("please input arithentic: ");
        scanf("%s",s);
        sum=yunsuan(s);
        printf("=%d ",sum);
        }
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
幼儿园扛把子
1楼-- · 2019-07-20 18:35
 精彩回答 2  元偷偷看……
企鹅之心
2楼-- · 2019-07-20 23:01
 精彩回答 2  元偷偷看……

一周热门 更多>