有没有人做过字符串四则运算的?

习总 发布于 2013/04/17 12:07
阅读 940
收藏 1

我见过不少计算器,但是几乎都没有可以处理字符串的运算的,举几个简单的例子:

a+a+1  =》 2*a+1
(a+b)-(a-b) =》 2*b
a*(a+b) =》 a*a+a*b
(a+b)*(a+b) =》 a*a+2*a*b+b*b
最近要做个计算器,除了常规的运算,还要实现类似的功能,需要哪些方面的知识呢?
加载中
0
习总
习总
这个很难吗?
0
张亦俊
张亦俊
虽然没做过,但要说知识的话,应该是 编译原理那方面的。
0
jwjiang
jwjiang
重载一下+和*就能解决了吧
习总
习总
回复 @jwjiang : 现在还有没有代码片段或者可执行文件呢?
jwjiang
jwjiang
回复 @习总 : 我之前做过的,确实就这么简单,不过解析算式的部分我用的是动态创建一个类这样偷懒的办法,效率上要差一点
习总
习总
要求是输入、输出的都是字符串,而不是具体的数
习总
习总
想得太省事了
0
纳兰清风
纳兰清风

引用来自“张亦俊”的答案

虽然没做过,但要说知识的话,应该是 编译原理那方面的。
+1
0
jwjiang
jwjiang

引用来自“jwjiang”的答案

重载一下+和*就能解决了吧

当时的代码太长了,我把核心按照你的要求重写了一下,稍微实现了乘法部分,相信你看看意思就懂了

类:

public class StringComplex
    {
        public string ResultString { get; set; }
        public StringComplex CompA { get; set; }
        public StringComplex CompB { get; set; }
        public string CompOper { get; set; }
        public StringComplex(string str)
        {
            ResultString = str;
            CompOper = "";
        }
        public static StringComplex operator +(StringComplex sc1, StringComplex sc2)
        {
            StringComplex sc = new StringComplex(sc1.ResultString + " + " + sc2.ResultString);
            sc.CompA = sc1;
            sc.CompB = sc2;
            sc.CompOper = "+";
            return sc;
        }
        public static StringComplex operator *(StringComplex sc1, StringComplex sc2)
        {
            if (sc1.CompOper != "" && sc1.CompOper != "*")
            {
                return GetResult(sc1.CompA * sc2, sc1.CompB * sc2, sc1.CompOper);
            }
            if (sc2.CompOper != "" && sc2.CompOper != "*")
            {
                return GetResult(sc1 * sc2.CompA, sc1 * sc2.CompB, sc2.CompOper);
            }
            StringComplex sc = new StringComplex(sc1.ResultString + " * " + sc2.ResultString);
            return sc;
        }
        public static StringComplex GetResult(StringComplex sc1, StringComplex sc2, string oper)
        {
            switch (oper)
            {
                case "+":
                    return sc1 + sc2;
                case "*":
                    return sc1 * sc2;
                default:
                    return null;
            }
        }
    }
调用方法:

StringComplex a = new StringComplex("a");
            StringComplex b = new StringComplex("b");
            Console.WriteLine("a*(a+b)=" + (a * (a + b)).ResultString);
            Console.WriteLine("(a+b)*b=" + ((a + b) * b).ResultString);
            Console.WriteLine("(a+b)*(a+b)=" + ((a + b) * (a + b)).ResultString);
            Console.ReadLine();
执行结果:

jwjiang
jwjiang
回复 @习总 : 这个在加法规则里改一下就行啦,剩下的就是体力活
习总
习总
还不错,不过(a+b)*(a+b)没有合并中间的为2*a*b
jwjiang
jwjiang
另外输入方面,是根据输入的值动态构建一个类,可以很容易的把字符串转换成执行代码,不过效率较低,其他方法也是能实现的
0
Dr.Who
Dr.Who
如果你想深入研究,这个叫符号计算.
习总
习总
oh,看来是内行
0
Xsank
Xsank
楼上的几位看来都打算用解释器解决,谁来实现下 
0
不必在乎朕是谁
不必在乎朕是谁
目测要用栈,把中缀先转换成后缀表达式
0
LucEsape
LucEsape
几个栈就OK了。解析表达式 
0
祁达方
祁达方

引用来自“不必在乎我是谁”的答案

目测要用栈,把中缀先转换成后缀表达式

正解。《数据结构和算法》中一个经典的问题来着。

返回顶部
顶部