用c#设计一个可以连续运算的计算器,例如1+3*5得到的结果为20

qq_30499233 2017-03-07 01:25:54
用c#设计一个可以连续运算的计算器,例如1+3*5得到的结果为20
...全文
1984 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
smileruner 2017-11-16
  • 打赏
  • 举报
回复
这个设计不符合正常人用法吧
上菜的店小二 2017-11-16
  • 打赏
  • 举报
回复
没看懂啊,作为初学者,对设计步骤不够严谨
  • 打赏
  • 举报
回复
写个中间存储值,储存第一步运算的结果和下一步的运算方式
  • 打赏
  • 举报
回复
我做过vb的,你要源码吗
lovezq85 2017-04-15
  • 打赏
  • 举报
回复
引用 22 楼 sp1234 的回复:
比如说,“1+3”这叫做中缀表示法,而“1 3 + ”这叫做后缀表示法。我们生活中习惯上用中缀表示法,但是许多科学计算习惯后缀表示法,我们写c#程序时习惯用前缀表示法.......你不在乎基础概念的区分的时候,早晚要被小伎俩迷惑。 你遇到了“就把前面的结果赋给第一个数,再和第二个数进行运算不就可以了吗,但我在实现的时候还有困难!”这种困难的原因是因为没有心思花上几天时间去学基础知识。
这个需要学习什么基础?
  • 打赏
  • 举报
回复
引用 13 楼 starfd 的回复:
我曹。。。计算器对这个处理有问题啊,+和*的优先级是一样的
那是标准型的,点上面菜单“查看”,选科学型或程序员型都是16
  • 打赏
  • 举报
回复
引用 17 楼 qq_30499233 的回复:
我就是想实现我们现在用的计算器的功能一样!我不想用堆栈,我就想用简单的方法来实现,我想着,如果按运算符.......
事实上,当你有基础了之后,你对于“什么是”简单的方法”就会有不一样的语言模式。你“想着”的东西仅凭感觉你就知道是很简单的“栈”概念,那就是有基础了。
  • 打赏
  • 举报
回复
比如说,“1+3”这叫做中缀表示法,而“1 3 + ”这叫做后缀表示法。我们生活中习惯上用中缀表示法,但是许多科学计算习惯后缀表示法,我们写c#程序时习惯用前缀表示法.......你不在乎基础概念的区分的时候,早晚要被小伎俩迷惑。 你遇到了“就把前面的结果赋给第一个数,再和第二个数进行运算不就可以了吗,但我在实现的时候还有困难!”这种困难的原因是因为没有心思花上几天时间去学基础知识。
  • 打赏
  • 举报
回复
引用 17 楼 qq_30499233 的回复:
[quote=引用 16 楼 xuzuning 的回复:] 这样写可能容易理解些
            var s = "1+3*5";
            var d = Regex.Matches(s, @"\d+").Cast<Match>().Select(x => Convert.ToInt32(x.Value)).ToList();
            var f = Regex.Matches(s, @"\D+").Cast<Match>().Select(x => x.Value.Trim()).ToList();
            foreach (var x in f)
            {
                if (x == "+") d[1] = d[0] + d[1];
                if (x == "*") d[1] = d[0] * d[1];
                d.RemoveAt(0);
            }
            Console.WriteLine(d[0]);
我就是想实现我们现在用的计算器的功能一样!我不想用堆栈,我就想用简单的方法来实现,我想着,如果按运算符,就把前面的结果赋给第一个数,再和第二个数进行运算不就可以了吗,但我在实现的时候还有困难! [/quote] 分析“数字、符号”属于词法分析阶段,可以使用正则(自己写上几行代码 foreach 每一个字符查找符号标志也可以)。现在说的算法,你看看拿一个程序能真正计算 1+3*5+9*2= 的结果,你就可以用哪一个程序。但是抄一个程序并不是目的,而是要学习一个“模式”,就好像你上高中(甚至大学)时要学的不是抄老师的笔记,而是要知道每一个学期分别学了哪些“公理、定理”然后学会作为模式反复使用,这个时候知道历史上的一些文献内容比你抄点代码更重要。
绿领巾童鞋 2017-03-09
  • 打赏
  • 举报
回复
设计两个队列,分别保存 运算值 和运算符。
cheng2005 2017-03-08
  • 打赏
  • 举报
回复
引用 17 楼 qq_30499233 的回复:
[quote=引用 16 楼 xuzuning 的回复:] 这样写可能容易理解些
            var s = "1+3*5";
            var d = Regex.Matches(s, @"\d+").Cast<Match>().Select(x => Convert.ToInt32(x.Value)).ToList();
            var f = Regex.Matches(s, @"\D+").Cast<Match>().Select(x => x.Value.Trim()).ToList();
            foreach (var x in f)
            {
                if (x == "+") d[1] = d[0] + d[1];
                if (x == "*") d[1] = d[0] * d[1];
                d.RemoveAt(0);
            }
            Console.WriteLine(d[0]);
我就是想实现我们现在用的计算器的功能一样!我不想用堆栈,我就想用简单的方法来实现,我想着,如果按运算符,就把前面的结果赋给第一个数,再和第二个数进行运算不就可以了吗,但我在实现的时候还有困难! [/quote] 浓浓的民科的感觉。学过编译原理你就不会用这么幼稚的想法写计算器程序了。
qq_30499233 2017-03-08
  • 打赏
  • 举报
回复
引用 16 楼 xuzuning 的回复:
这样写可能容易理解些
            var s = "1+3*5";
            var d = Regex.Matches(s, @"\d+").Cast<Match>().Select(x => Convert.ToInt32(x.Value)).ToList();
            var f = Regex.Matches(s, @"\D+").Cast<Match>().Select(x => x.Value.Trim()).ToList();
            foreach (var x in f)
            {
                if (x == "+") d[1] = d[0] + d[1];
                if (x == "*") d[1] = d[0] * d[1];
                d.RemoveAt(0);
            }
            Console.WriteLine(d[0]);
我就是想实现我们现在用的计算器的功能一样!我不想用堆栈,我就想用简单的方法来实现,我想着,如果按运算符,就把前面的结果赋给第一个数,再和第二个数进行运算不就可以了吗,但我在实现的时候还有困难!
足球中国 2017-03-08
  • 打赏
  • 举报
回复
http://blog.csdn.net/zanfeng/article/details/54849872 我的这个有个小型的前端解析器。用于计算函数的。前段时间加了属性。
足球中国 2017-03-08
  • 打赏
  • 举报
回复
引用 18 楼 wddw1986 的回复:
[quote=引用 17 楼 qq_30499233 的回复:] [quote=引用 16 楼 xuzuning 的回复:] 这样写可能容易理解些
            var s = "1+3*5";
            var d = Regex.Matches(s, @"\d+").Cast<Match>().Select(x => Convert.ToInt32(x.Value)).ToList();
            var f = Regex.Matches(s, @"\D+").Cast<Match>().Select(x => x.Value.Trim()).ToList();
            foreach (var x in f)
            {
                if (x == "+") d[1] = d[0] + d[1];
                if (x == "*") d[1] = d[0] * d[1];
                d.RemoveAt(0);
            }
            Console.WriteLine(d[0]);
我就是想实现我们现在用的计算器的功能一样!我不想用堆栈,我就想用简单的方法来实现,我想着,如果按运算符,就把前面的结果赋给第一个数,再和第二个数进行运算不就可以了吗,但我在实现的时候还有困难! [/quote] 浓浓的民科的感觉。学过编译原理你就不会用这么幼稚的想法写计算器程序了。[/quote] 就是啊。这个连优先级都不用考虑了。也就是个写个词法解析器的工作量。
xuzuning 2017-03-07
  • 打赏
  • 举报
回复
这样写可能容易理解些
            var s = "1+3*5";
            var d = Regex.Matches(s, @"\d+").Cast<Match>().Select(x => Convert.ToInt32(x.Value)).ToList();
            var f = Regex.Matches(s, @"\D+").Cast<Match>().Select(x => x.Value.Trim()).ToList();
            foreach (var x in f)
            {
                if (x == "+") d[1] = d[0] + d[1];
                if (x == "*") d[1] = d[0] * d[1];
                d.RemoveAt(0);
            }
            Console.WriteLine(d[0]);
  • 打赏
  • 举报
回复
这就像 #10 楼所说的,使用逆波兰表示法(1,3,+,5,*)方式计算的。每当遇到一个计算符号,都把栈上的当前数据先弹出栈,然后与当前数值进行计算,把结果再压入栈。 这是在编译技术原理或者数据结构、算法的课程上会讲到的内容。 如果写成 c#程序,可以这样写一个,例如
public class 计算器: Stack<int>
{
    public void Plus(int x)
    {
        this.Push(this.Pop() + x);
    }

    public void Times(int x)
    {
        this.Push(this.Pop() * x);
    }

    public int Result()
    {
        return this.Peek();
    }
}
这里,每当调用“+x、*x”的时候,就是先从栈中pop出数据,然后再把相应的四则计算结果压入栈。 那么你调用
            var input = new 计算器();
            input.Push(1);
            input.Plus(3);
            input.Times(5);
            var result = input.Result();
结果就是20。
楚笑sama 2017-03-07
  • 打赏
  • 举报
回复
有个谷歌v8引擎的.net调用封装 可以实现这个效果
  • 打赏
  • 举报
回复
我曹。。。计算器对这个处理有问题啊,+和*的优先级是一样的
  • 打赏
  • 举报
回复
计算机 1+3如果后面不跟=的话,直接*5不可能是20,而是16
mjp1234airen4385 2017-03-07
  • 打赏
  • 举报
回复
你要实现这个算法啊,还以为你想用这个功能呢。 记得数据结构这门课吗,里面有个章节的内容就是用实现计算器的功能来完成的。 叫你从头开始的。
加载更多回复(9)

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧