C#实现计算器,支持括号运算

来源:互联网 发布:国外网络摄像头直播 编辑:程序博客网 时间:2024/06/04 22:05
有些面试题要实现一个计算器。自己尝试了一下。若有问题请留言说明。我好及时纠正。
public class CalcHelper    {        public double CalcBrackets(ref string str)        {            char[] array = str.ToArray();            string tex = str;            int count = 1;            int endIndex = 0;            for(int i=1;i<array.Length;i++)            {                if (array[i] == '(')                    count++;                if (array[i] == ')')                    count--;                if (count == 0)                { endIndex = i;break; }            }            tex = tex.Substring(1,endIndex-1);            str = str.Substring(endIndex+1);            var result = StrCalc(0, ref tex);            return result;        }        public double GetANumber(ref string str)        {            char first = str.First();            if (first == '(')            {                double result = 0;                result = CalcBrackets(ref str);                return result;            }            char[] array = str.ToArray();            int end = 0;            int point = -1;            for (int i = 0; i < array.Length; i++)            {                if (array[i] < 0x30 && array[i] > 0x39 && array[i] != 0x2E)                {                    end = i;                    break;                }                if (array[i] == 0x2E)                {                    point = i;                }            }            double Value = 0;            Value += array[0]-0x30;            if(point>=0)            {                for (int i = 1; i < point; i++)                    Value = Value * 10 + (array[i]-0x30);                double except = 10.0;                for(int i=point+1;i<end;i++)                {                    Value += (array[i]-0x30) / except;                    except *= 10;                }            }            else            {                for (int i = 1; i < end; i++)                    Value = Value * 10 + (array[i]-0x30);            }            str = str.Substring(++end);            return Value;        }        public double StrCalc(double A,ref string str)        {            if (str.Length == 0) return A;            char first = str.First();              double result = 0;            if (first >= 0x30 && first <= 0x39)            {                result = GetANumber(ref str);                result = StrCalc(result, ref str);            }            else if (first == '+')            {                str = str.Substring(1);                result = A + StrCalc(0, ref str);            }            else if (first == '-')            {                str = str.Substring(1);                result = A - StrCalc(0, ref str);            }            else if (first=='(')            {               result= CalcBrackets(ref str);               result = StrCalc(result, ref str);            }            else if (first == '*')            {                str = str.Substring(1);                result = A * GetANumber(ref str);            }            else if (first == '/')            {                str = str.Substring(1);                result = A / GetANumber(ref str);            }            return result;        }    }


调用方法:

CalcHelper calc = new CalcHelper();            string cmd = "1+1+1+1+3*3+1+2-((3*4)+5)*(6-7)+9/(3-1)";            var result = calc.StrCalc(0, ref cmd);            while(cmd.Length!=0)                result=calc.StrCalc(result, ref cmd);



阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 眼睛近视怎么办才能恢复 吃脂老虎尿酮高怎么办 尿微量蛋白高怎么办 经血少颜色发黑怎么办 乳晕颜色深怎么办 马桶水箱溢水怎么办 蹲便器水槽太浅怎么办 马桶突然下水慢怎么办 虾池ph值过高怎么办 虾池水ph值太高怎么办 红细胞压积偏低怎么办 血小板比积偏高怎么办 血小板计数高怎么办359 脂蛋白a高1033怎么办 窦性心律过快怎么办 怀孕心率不齐该怎么办 高压正常,低压高怎么办 心跳120心率快怎么办 心脏病心跳特别快怎么办 体检时心跳过快怎么办 尿白细胞2是怎么办 体检尿蛋白阳性怎么办 老人小便次数多怎么办 怀孕隐血1是怎么办 孕妇尿蛋白阳性怎么办 肾浓缩功能减退怎么办 尿蛋白有加号怎么办 尿葡萄糖弱阳性怎么办 尿检sg比重偏高怎么办 尿蛋白高了怎么办 尿量白蛋白偏高怎么办 微量尿蛋白偏高怎么办 孕妇总蛋白偏低怎么办 汽油车加了柴油怎么办 汽油加成柴油了怎么办 冬天柴油车油冻怎么办 汽油泵坏了怎么办 汽车加了柴油怎么办 国五出来后国四怎么办 人死买不起墓地怎么办 货车尿素堵了怎么办