热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

c#根据公式进行自动计算四个5加减乘除=4

  想不出来就采用枚举法吧,代码写起来还是很简单的,当然代码写的不怎么样,也不考虑设计效率等等问题了,理论上这种类型的都可以这么拼出来,比较初级的做法,但轻松解决问题。注意Calc
 
c#根据公式进行自动计算 四个5加减乘除=4
 
想不出来就采用枚举法吧,代码写起来还是很简单的,当然代码写的不怎么样,也不考虑设计效率等等问题了,理论上这种类型的都可以这么拼出来,比较初级的做法,但轻松解决问题。注意Calculate(string expression) 虽然可以作为通用的string转数学算式计算出结果,但是:
1、不支持sin、cos等数学函数
2、不支持[]、{}等括号和除数字、+、-、*、/以外的字符,建议调用计算函数前进行输入的验证。
代码无需多解释,毫无难度。
代码如下(C# winform程序,一个窗体上放个button和memo):

using System;

using System.CodeDom.Compiler;

using System.Reflection;

using System.Text;

using System.Windows.Forms;

using Microsoft.CSharp;

 

namespace WindowsFormsApplication1

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

 

        private void simpleButton1_Click(object sender, EventArgs e)

        {

            int icnt = 0;

            string[] ss = new string[100];

            for (int i = 0; i < 4; i++)

            {

                string s = "5";

                LinkString(i, ref s);

                for (int j = 0; j < 4; j++)

                {

                    string s2 = s;

                    LinkString(j, ref s2);

 

                    for (int m = 0; m < 4; m++)

                    {

                        string s3 = s2;

                        LinkString(m, ref s3);

 

                        ss[icnt] = s3 + " = " + Calculate(s3).ToString();

                        icnt++;

                    }

                }

            }

 

            memoEdit1.Lines = ss;

        }

 

        private void LinkString(int i, ref string s)

        {

            if (i == 0)

                s = s + " + 5";

            else

                if (i == 1)

                    s = s + " - 5";

                else

                    if (i == 2)

                        s = s + " * 5";

                    else

                        s = s + " / 5";

        }

 

        /// 

        /// 接受一个string类型的表达式并计算结果,返回一个object对象,静态方法

        /// 

        /// 

        /// 

        public static object Calculate(string expression)

        {

            string className = "Calc";

            string methodName = "Run";

            expression = expression.Replace("/", "*1.0/");

 

            // 创建编译器实例。

            ICodeCompiler complier = (new CSharpCodeProvider().CreateCompiler());

 

            // 设置编译参数。

            CompilerParameters paras = new CompilerParameters();

            paras.GenerateExecutable = false;

            paras.GenerateInMemory = true;

 

            // 创建动态代码。

            StringBuilder classSource = new StringBuilder();

            classSource.Append("public class " + className + "\n");

            classSource.Append("{\n");

            classSource.Append(" public object " + methodName + "()\n");

            classSource.Append(" {\n");

            classSource.Append(" return " + expression + ";\n");

            classSource.Append(" }\n");

            classSource.Append("}");

 

            // 编译代码。

            CompilerResults result = complier.CompileAssemblyFromSource(paras,classSource.ToString());

 

            // 获取编译后的程序集。

            Assembly assembly = result.CompiledAssembly;

 

            // 动态调用方法。

            object eval = assembly.CreateInstance(className);

            MethodInfo method = eval.GetType().GetMethod(methodName);

            object reobj = method.Invoke(eval, null);

            GC.Collect();

            return reobj;

        }  

    }

}

 

 

结果如下:
5 + 5 + 5 + 5 = 20
5 + 5 + 5 - 5 = 10
5 + 5 + 5 * 5 = 35
5 + 5 + 5 / 5 = 11
5 + 5 - 5 + 5 = 10
5 + 5 - 5 - 5 = 0
5 + 5 - 5 * 5 = -15
5 + 5 - 5 / 5 = 9
5 + 5 * 5 + 5 = 35
5 + 5 * 5 - 5 = 25
5 + 5 * 5 * 5 = 130
5 + 5 * 5 / 5 = 10
5 + 5 / 5 + 5 = 11
5 + 5 / 5 - 5 = 1
5 + 5 / 5 * 5 = 10
5 + 5 / 5 / 5 = 5.2
5 - 5 + 5 + 5 = 10
5 - 5 + 5 - 5 = 0
5 - 5 + 5 * 5 = 25
5 - 5 + 5 / 5 = 1
5 - 5 - 5 + 5 = 0
5 - 5 - 5 - 5 = -10
5 - 5 - 5 * 5 = -25
5 - 5 - 5 / 5 = -1
5 - 5 * 5 + 5 = -15
5 - 5 * 5 - 5 = -25
5 - 5 * 5 * 5 = -120
5 - 5 * 5 / 5 = 0
5 - 5 / 5 + 5 = 9
5 - 5 / 5 - 5 = -1
5 - 5 / 5 * 5 = 0
5 - 5 / 5 / 5 = 4.8
5 * 5 + 5 + 5 = 35
5 * 5 + 5 - 5 = 25
5 * 5 + 5 * 5 = 50
5 * 5 + 5 / 5 = 26
5 * 5 - 5 + 5 = 25
5 * 5 - 5 - 5 = 15
5 * 5 - 5 * 5 = 0
5 * 5 - 5 / 5 = 24
5 * 5 * 5 + 5 = 130
5 * 5 * 5 - 5 = 120
5 * 5 * 5 * 5 = 625
5 * 5 * 5 / 5 = 25
5 * 5 / 5 + 5 = 10
5 * 5 / 5 - 5 = 0
5 * 5 / 5 * 5 = 25
5 * 5 / 5 / 5 = 1
5 / 5 + 5 + 5 = 11
5 / 5 + 5 - 5 = 1
5 / 5 + 5 * 5 = 26
5 / 5 + 5 / 5 = 2
5 / 5 - 5 + 5 = 1
5 / 5 - 5 - 5 = -9
5 / 5 - 5 * 5 = -24
5 / 5 - 5 / 5 = 0
5 / 5 * 5 + 5 = 10
5 / 5 * 5 - 5 = 0
5 / 5 * 5 * 5 = 25
5 / 5 * 5 / 5 = 1
5 / 5 / 5 + 5 = 5.2
5 / 5 / 5 - 5 = -4.8
5 / 5 / 5 * 5 = 1
5 / 5 / 5 / 5 = 0.04
 
可以看出图片中后2个算式不可能成立。

推荐阅读
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文详细介绍了使用C#实现Word模版打印的方案。包括添加COM引用、新建Word操作类、开启Word进程、加载模版文件等步骤。通过该方案可以实现C#对Word文档的打印功能。 ... [详细]
  • C#多线程解决界面卡死问题的完美解决方案
    当界面需要在程序运行中不断更新数据时,使用多线程可以解决界面卡死的问题。一个主线程创建界面,使用一个子线程执行程序并更新主界面,可以避免卡死现象。本文分享了一个例子,供大家参考。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • 深入理解CSS中的margin属性及其应用场景
    本文主要介绍了CSS中的margin属性及其应用场景,包括垂直外边距合并、padding的使用时机、行内替换元素与费替换元素的区别、margin的基线、盒子的物理大小、显示大小、逻辑大小等知识点。通过深入理解这些概念,读者可以更好地掌握margin的用法和原理。同时,文中提供了一些相关的文档和规范供读者参考。 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • 导出功能protectedvoidbtnExport(objectsender,EventArgse){用来打开下载窗口stringfileName中 ... [详细]
  • JS实现一键分享功能
    本文介绍了如何使用JS实现一键分享功能,并提供了2019独角兽企业招聘Python工程师的标准。同时,给出了分享到QQ空间、新浪微博和人人网的链接。 ... [详细]
  • 在C#中,使用关键字abstract来定义抽象类和抽象方法。抽象类是一种不能被实例化的类,它只提供部分实现,但可以被其他类继承并创建实例。抽象类可以用于类、方法、属性、索引器和事件。在一个类声明中使用abstract表示该类倾向于作为其他类的基类成员被标识为抽象,或者被包含在一个抽象类中,必须由其派生类实现。本文介绍了C#中抽象类和抽象方法的基础知识,并提供了一个示例代码。 ... [详细]
  • Android源码中的Builder模式及其作用
    本文主要解释了什么是Builder模式以及其作用,并结合Android源码来分析Builder模式的实现。Builder模式是将产品的设计、表示和构建进行分离,通过引入建造者角色,简化了构建复杂产品的流程,并且使得产品的构建可以灵活适应变化。使用Builder模式可以解决开发者需要关注产品表示和构建步骤的问题,并且当构建流程发生变化时,无需修改代码即可适配新的构建流程。 ... [详细]
  • 本文讨论了在ASP中创建RazorFunctions.cshtml文件时出现的问题,即ASP.global_asax不存在于命名空间ASP中。文章提供了解决该问题的代码示例,并详细解释了代码中涉及的关键概念,如HttpContext、Request和RouteData等。通过阅读本文,读者可以了解如何解决该问题并理解相关的ASP概念。 ... [详细]
  • Java图形化计算器设计与实现
    本文介绍了使用Java编程语言设计和实现图形化计算器的方法。通过使用swing包和awt包中的组件,作者创建了一个具有按钮监听器和自定义界面尺寸和布局的计算器。文章还分享了在图形化界面设计中的一些心得体会。 ... [详细]
author-avatar
Chickny的造梦空间
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有