OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4634|回复: 2

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

[复制链接]

6

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2016-8-15
在线时间
5 小时
发表于 2017-2-19 14:34:02 | 显示全部楼层 |阅读模式
1金钱
请问有大神知道关于计算器中小数点的优先级和其他运算符号相比谁大谁小吗?,换言之有哪位大神有编过能得出浮点型结果的计算器吗?本人想用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!='\0')
        {
                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("计算错误\n");
                                                         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("计算错误\n");
                                                         break;
                                                         }
                                }
                                op.top--;
        }
        return num.shu[0];
}
int main()
{
        char s[maxsize];
        int sum;
        while(1)
        {
    printf("please input arithentic:\n");
        scanf("%s",s);
        sum=yunsuan(s);
        printf("=%d\n",sum);
        }
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
190
金钱
190
注册时间
2017-2-9
在线时间
52 小时
发表于 2017-2-19 21:54:44 | 显示全部楼层
不明白你的意思,你自己写的计算器,优先级应该是你自己控制的啊,另外你的程序中运算变量都是int,即使你输入浮点型数字也会被强制变成整数,int变量怎么加减乘除都是整数啊,怎么可能得到浮点型数据。最后你遇到的问题究竟是什么?是不是浮点型数字已经以字符的形式存在数组中,而你不知道怎么把它赋给浮点型变量?
回复

使用道具 举报

6

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2016-8-15
在线时间
5 小时
 楼主| 发表于 2017-4-22 15:28:03 | 显示全部楼层
幼儿园扛把子 发表于 2017-2-19 21:54
不明白你的意思,你自己写的计算器,优先级应该是你自己控制的啊,另外你的程序中运算变量都是int,即使你 ...

我只是一步一步来
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-18 01:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表