C#,茅塞顿开的代码——最少的程序实现通用型科学计算器

本文主要是介绍C#,茅塞顿开的代码——最少的程序实现通用型科学计算器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

计算器是经常遇到的编程作业。

一般都是实现加、减、乘、除四则运算的普通计算器。

这里介绍用几十行C#代码实现的复杂的《科学计算器》,可以计算各种函数。

不知道其他语言实现同样的功能需要编写多少行代码?20000行?

using System;
using System.Text;
using System.Drawing;
using System.Collections.Generic;
using System.Windows.Forms;
using System.CodeDom.Compiler;
using Microsoft.CSharp;
using System.Reflection;
 
namespace HyperCalculator
{
    public partial class Form1 : Form
    {
        // 预定义各 按键 的文字
        string[] operationArray = new string[] {
            "Abs",  "Acos", "(",    ",",    ")",    "Backspace",   "C",
            "Asin", "Atan", "7",    "8",    "9",    "/",    "=",
            "Atan2",    "Ceiling",  "4",    "5",    "6",    "*",    "",
            "Cos",  "Cosh", "1",    "2",    "3", "-",    "",
            "E",    "Exp",  "0",    "", ".",    "+",    "",
            "Floor",    "Log",  "Log10",    "Max",  "Min",   "PI",   "Pow",
            "Sign", "Sin",  "Sinh", "Sqrt", "Tan",  "Tanh", "",
        };
        List<Button> buttonList = new List<Button>();
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            // 动态加载液晶LED字体(请下载压缩包,内含)
            System.Drawing.Text.PrivateFontCollection privateFonts = new System.Drawing.Text.PrivateFontCollection();
            privateFonts.AddFontFile("LEDCalculatorBold.ttf");
            System.Drawing.Font font = new Font(privateFonts.Families[0], 21);
            textBox1.Font = font;
            textBox1.Text = "0";
            textBox1.TextAlign = HorizontalAlignment.Right;
            // 打包按键集合
            Control.ControlCollection sonControls = this.Controls;
            foreach (Control control in sonControls)
            {
                if (control.GetType() == typeof(Button))
                {
                    buttonList.Add((Button)control);
                }
            }
            // 按位置排序,以及匹配实现预定义的文字
            buttonList.Sort(delegate (Button a, Button b)
            {
                return Comparer<int>.Default.Compare(a.Left + a.Top * button1.Height, b.Left + b.Top * button1.Height);
            });
            Font nf = new Font(Font.FontFamily, 21);
            for (int i = 0; i < buttonList.Count && i < operationArray.Length; i++)
            {
                buttonList[i].Cursor = Cursors.Hand;
                buttonList[i].Text = operationArray[i];
                if (buttonList[i].Text.Length == 1 && operationArray[i] != "E")
                {
                    buttonList[i].Font = nf;
                    buttonList[i].BackColor = Color.FromArgb(225, 255, 200);
                }
                if (operationArray[i].Trim().Length > 0) buttonList[i].Click += button_Click;
            }
        }
 
        private void button_Click(object sender, EventArgs e)
        {
            Button btn = (Button)sender;
            if (btn.Text == "=")
            {
                // 等号就是计算啦!任何计算,都是执行一个表达式而已!
                CSharpCodeProvider objCSharpCodePrivoder = new CSharpCodeProvider();
                ICodeCompiler objICodeCompiler = objCSharpCodePrivoder.CreateCompiler();
                CompilerParameters objCompilerParameters = new CompilerParameters();
                objCompilerParameters.ReferencedAssemblies.Add("System.dll");
                objCompilerParameters.GenerateExecutable = false;
                objCompilerParameters.GenerateInMemory = true;
                // 编译 Code() 返回的含有计算表达式的完整的 C# 程序;
                CompilerResults cr = objICodeCompiler.CompileAssemblyFromSource(objCompilerParameters, Code());
                if (cr.Errors.HasErrors)
                {
                    StringBuilder sb = new StringBuilder();
                    foreach (CompilerError err in cr.Errors)
                    {
                        sb.AppendLine(err.ErrorText);
                    }
                    MessageBox.Show(sb.ToString(), "表达式错误");
                }
                else
                {
                    // 执行 C# 程序的指定 函数,并得到返回值,就是计算结果;
                    Assembly objAssembly = cr.CompiledAssembly;
                    object objHelloWorld = objAssembly.CreateInstance("Beijing.Legalsoft.Ltd.HyperCalculator");
                    MethodInfo objMI = objHelloWorld.GetType().GetMethod("Run");
                    double resultValue = (double)objMI.Invoke(objHelloWorld, null);
                    textBox1.Text = resultValue + "";
                }
                return;
            }
            if (btn.Text == "C")
            {
                textBox1.Text = "0";
                return;
            }
            if (btn.Text == "Backspace")
            {
                if (textBox1.Text.Length > 1)
                {
                    textBox1.Text = textBox1.Text.Substring(0, textBox1.Text.Length - 1);
                }
                else
                {
                    textBox1.Text = "0";
                }
                return;
            }
            if (textBox1.Text == "0") textBox1.Text = "";
            if (textBox1.Text.Length + btn.Text.Length < 45)
            {
                textBox1.Text += btn.Text;
            }
        }
        private string Code()
        {
            // 按输入的文字构造一个完整的 C# 程序;包括命名空间,类与方法(函数)
            string state = textBox1.Text;
            foreach (string ps in operationArray)
            {
                if (ps.Trim().Length > 1 || ps == "E")
                {
                    state = state.Replace(ps, "Math." + ps);
                }
            }
            state = state.Replace("Math.Math.", "Math.");
            StringBuilder sb = new StringBuilder();
            sb.AppendLine("using System;");
            sb.AppendLine("namespace Beijing.Legalsoft.Ltd");
            sb.AppendLine("{");
            sb.AppendLine("    public class HyperCalculator");
            sb.AppendLine("    {");
            sb.AppendLine("        public double Run()");
            sb.AppendLine("        {");
            sb.AppendLine("            return (" + state + ");");
            sb.AppendLine("        }");
            sb.AppendLine("    }");
            sb.AppendLine("}");
            return sb.ToString();
        }
    }
}

这篇关于C#,茅塞顿开的代码——最少的程序实现通用型科学计算器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/460595

相关文章

C# string转unicode字符的实现

《C#string转unicode字符的实现》本文主要介绍了C#string转unicode字符的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随... 目录1. 获取字符串中每个字符的 Unicode 值示例代码:输出:2. 将 Unicode 值格式化

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

C#中读取XML文件的四种常用方法

《C#中读取XML文件的四种常用方法》Xml是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具,下面我们就来看看C#中读取XML文件的方法都有哪些吧... 目录XML简介格式C#读取XML文件方法使用XmlDocument使用XmlTextReader/XmlTextWr

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(

MySQL数据库函数之JSON_EXTRACT示例代码

《MySQL数据库函数之JSON_EXTRACT示例代码》:本文主要介绍MySQL数据库函数之JSON_EXTRACT的相关资料,JSON_EXTRACT()函数用于从JSON文档中提取值,支持对... 目录前言基本语法路径表达式示例示例 1: 提取简单值示例 2: 提取嵌套值示例 3: 提取数组中的值注意

CSS3中使用flex和grid实现等高元素布局的示例代码

《CSS3中使用flex和grid实现等高元素布局的示例代码》:本文主要介绍了使用CSS3中的Flexbox和Grid布局实现等高元素布局的方法,通过简单的两列实现、每行放置3列以及全部代码的展示,展示了这两种布局方式的实现细节和效果,详细内容请阅读本文,希望能对你有所帮助... 过往的实现方法是使用浮动加

JAVA调用Deepseek的api完成基本对话简单代码示例

《JAVA调用Deepseek的api完成基本对话简单代码示例》:本文主要介绍JAVA调用Deepseek的api完成基本对话的相关资料,文中详细讲解了如何获取DeepSeekAPI密钥、添加H... 获取API密钥首先,从DeepSeek平台获取API密钥,用于身份验证。添加HTTP客户端依赖使用Jav

Java实现状态模式的示例代码

《Java实现状态模式的示例代码》状态模式是一种行为型设计模式,允许对象根据其内部状态改变行为,本文主要介绍了Java实现状态模式的示例代码,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来... 目录一、简介1、定义2、状态模式的结构二、Java实现案例1、电灯开关状态案例2、番茄工作法状态案例