A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王军行 中级黑马   /  2013-4-9 19:02  /  1347 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王军行 于 2013-4-9 20:14 编辑

心血来潮,想实现一个简单的计算器。自己做了个只能一步一计算,我看人家的都可以带()什么的来计算,比如输入个(a+b)*c,
这些是怎么获取的值和算法啊,我只是简单的做了个图形两个文本区,一个输入算式,一个出结果,外加一个运算按钮,那些个()什么的怎么处理啊
求给个思路

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

6 个回复

正序浏览
找到了好几年前写的代码 C写的 支持的运算符','+','-','*','/','%,可以有括号()
#include<stdio.h>
char infix[100];
char postfix[100];
int topPostfix=-1;
typedef enum{lparen,rparen,plus,minus,times,divide,mod,oprand}precedence;
precedence stack1[100];
int topstack1=-1;
int instack1[]={0,0,12,12,13,13,13,0};
char instack1ch[]={'(',')','+','-','*','/','%'};

int stack2[100];
int top=-1;

void addToPostfix(char ch)
{
        topPostfix++;
        postfix[topPostfix]=ch;
}
precedence change(char a)
{
        if(a=='(')
                return lparen;
        if(a==')')
                return rparen;
        if(a=='+')
                return plus;
        if(a=='-')
                return minus;
        if(a=='*')
                return times;
        if(a=='/')
                return divide;
        if(a=='%')
                return mod;
}

void addToStack1(char ch)
{
        precedence a,b;
        b=change(ch);
        if(ch==')')
        {
                while(stack1[topstack1]!=lparen)
                {
                        a=stack1[topstack1];
                        addToPostfix(instack1ch[a]);
                        topstack1--;
                }
                topstack1--;//'('

        }
        else if(ch=='(')//zhijiejia
        {
                topstack1++;
                stack1[topstack1]=b;
        }
        else
        {
                while(topstack1!=-1&&instack1[b]<=instack1[stack1[topstack1]])
                {
                        addToPostfix(instack1ch[stack1[topstack1]]);
                        topstack1--;
                }
               
                topstack1++;
                stack1[topstack1]=b;
        }
}
void infixToPostfix()
{
        int i;
        for(i=0;infix[i]!='\0';i++)
                if(infix[i]>='0'&&infix[i]<='9')
                        addToPostfix(infix[i]);
                else
                        addToStack1(infix[i]);
        while(topstack1!=-1)//
        {
                addToPostfix(instack1ch[stack1[topstack1]]);
                topstack1--;
        }
                       
}
void outputPostfix()
{
        printf("%s\n",postfix);
}
void add(int a)
{
        top++;
        if(top==100)
                printf("full!\n");
        stack2[top]=a;
}
void evalue()
{
        int i;
        for(i=0;postfix[i]!='\0';i++)
                if(postfix[i]>='0'&&postfix[i]<='9')
                        add(postfix[i]-'0');
                else
                {
                        if(postfix[i]=='+')
                                stack2[top-1]+=stack2[top];
                        if(postfix[i]=='-')
                                stack2[top-1]-=stack2[top];
                        if(postfix[i]=='*')
                                stack2[top-1]*=stack2[top];
                        if(postfix[i]=='/')
                                stack2[top-1]/=stack2[top];
                        if(postfix[i]=='%')
                                stack2[top-1]%=stack2[top];
                        top--;
                }
        printf("%d\n",stack2[0]);
}
int main()
{
        gets(infix);
        infixToPostfix();
        outputPostfix();
        evalue();
        return 0;
}


回复 使用道具 举报
谢达 发表于 2013-4-9 20:03
下面是我的思路,这要用到栈,这里用到两个栈(一个操作符栈(stack1),一个操作数值栈(stack2)),
如运算 ...

谢谢,这个思路好,简单多了
回复 使用道具 举报
如果问题未解决,请继续追问,如果没有问题了,请将帖子分类 改为“已解决”,谢谢
回复 使用道具 举报
下面是我的思路,这要用到栈,这里用到两个栈(一个操作符栈(stack1),一个操作数值栈(stack2)),
如运算字符串为(a+b)*c
1,扫描字符串将 '(' 压入stack1
2,扫描字符串将'a' 压入stack2
3,扫描字符串将 '+'压入stack1
4,扫描字符串将 'b'压入stack2
5,扫描字符串碰到')'  取出b '+' 和 'a' 将 a+b的压入stack2
6,扫描字符串将'*'压人stack1,
7,扫描字符串将c压入stack2
8,到达结束位置,弹栈,取出 a+b  '*' c 计算出值

无论多长的计算都可以采用这种方式,希望对你有所帮助

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
张子凯 发表于 2013-4-9 19:10
我还没学到图形那呢。。。不过这个我有一个笨思路:
你输入的全是字符串,然后将它转成数组,然后挨个取元 ...

谢谢但是带()括号之类的稍复杂一点算式太难处理了,头大了:(
回复 使用道具 举报
我还没学到图形那呢。。。不过这个我有一个笨思路:
你输入的全是字符串,然后将它转成数组,然后挨个取元素,用if判断,如果‘+’就+等等,转换成算式,应该可以求值吧。。。。只是一个笨思路,相信有更好的。。。。。坐等神回复

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马