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

相关文章

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

使用C#代码在PDF文档中添加、删除和替换图片

《使用C#代码在PDF文档中添加、删除和替换图片》在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一,本文将介绍如何在.NET平台使用C#代码在PDF文档中添加、... 目录引言用C#添加图片到PDF文档用C#删除PDF文档中的图片用C#替换PDF文档中的图片引言在当

详解C#如何提取PDF文档中的图片

《详解C#如何提取PDF文档中的图片》提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使用,下面我们就来看看如何使用C#通过代码从PDF文档中提取图片吧... 当 PDF 文件中包含有价值的图片,如艺术画作、设计素材、报告图表等,提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

C#数据结构之字符串(string)详解

《C#数据结构之字符串(string)详解》:本文主要介绍C#数据结构之字符串(string),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录转义字符序列字符串的创建字符串的声明null字符串与空字符串重复单字符字符串的构造字符串的属性和常用方法属性常用方法总结摘

C#如何动态创建Label,及动态label事件

《C#如何动态创建Label,及动态label事件》:本文主要介绍C#如何动态创建Label,及动态label事件,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#如何动态创建Label,及动态label事件第一点:switch中的生成我们的label事件接着,

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

Spring Boot 3.4.3 基于 Spring WebFlux 实现 SSE 功能(代码示例)

《SpringBoot3.4.3基于SpringWebFlux实现SSE功能(代码示例)》SpringBoot3.4.3结合SpringWebFlux实现SSE功能,为实时数据推送提供... 目录1. SSE 简介1.1 什么是 SSE?1.2 SSE 的优点1.3 适用场景2. Spring WebFlu

java之Objects.nonNull用法代码解读

《java之Objects.nonNull用法代码解读》:本文主要介绍java之Objects.nonNull用法代码,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录Java之Objects.nonwww.chinasem.cnNull用法代码Objects.nonN