茅塞顿开的C#代码——通用型科学计算器

news/2024/11/8 2:50:37/

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

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

这里介绍用几十行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();
        }
    }
}

 


http://www.ppmy.cn/news/163156.html

相关文章

常见的电脑屏幕分辨率统计

通常情况下 &#xff0c;屏幕的分辨率月越高&#xff0c;所包含的像素也就越多&#xff0c;图片就越清晰。   根据不同笔记本、台式电脑以及Mac电脑屏幕大小以及分辨率都有所不同&#xff0c;从网上摘要对屏幕常见屏幕分辨率的归纳进行对比和开发尺寸使用。 笔记本电脑各大尺…

笔记本外接显示器无法调至最佳分辨率的问题

比如22寸宽屏显示器最佳分辨率应为1680 x 1050&#xff0c;但打开系统调节分辨率的地方&#xff0c;最高只有1280 x 768。 一般来说这是由于系统无法识别显示器所至&#xff0c;安装驱动即可。但是有些显示器未必能提供相应驱动&#xff0c;比如官方只有xp,2000的驱动&#xf…

选择驱动便携式计算机显示器GPU,显示器不是最佳分辨率怎么办

有些网友不知道显示器不是最佳分辨率该怎么办&#xff0c;那么下面就由学习啦小编来给你们说说显示器不是最佳分辨率的解决方法吧&#xff0c;希望可以帮到你们哦! 显示器不是最佳分辨率的解决方法&#xff1a; 针对CRT显示器&#xff0c;通过将其设置为最高分辨率将是最明智的…

常见电脑显示器分辨率及其比例

800 * 600 4:3 (淘汰) 1024 * 768 4:3 (淘汰) 1600 * 900 16:9 (非主流) 1366 * 768 16:9 (主流) 1920 * 1080 16:9 (主流) 1440 * 900 16:10 (传统比例)1680 * 1050 16:10 (传统比例)1920 * 1200 16:10 (传统比例)2560 * 160…

怎样得到 显示器所有能支持的分辨率 (显示器分辨率范围)

参考&#xff1a;http://www.codeproject.com/Articles/2518/Enumerate-and-Change-Display-Modes http://support.microsoft.com/kb/306399/zh-cn 缘由&#xff1a; 通过远程桌面的形式控制一台电脑屏幕分辨率等设置 .. &#xff08;说白了,就是想用远程模仿一个, 类似于右击…

超宽屏幕比例_显示器屏幕比例与分辨率对照表

显示器屏幕比例与分辨率对照表&#xff1a; 5:3 标屏 对应分辨率有(1280768 ...) 5:4 标屏 对应分辨率有(800640、12801024 ...) 4:3 标屏 对应分辨率有(800600、1024768、1280960、14001050、16001200、20481536 ...) 16:9 宽屏 对应分辨率有(1280720、1440810、1680945、…

AWTK实现汽车仪表Cluster/DashBoard嵌入式GUI开发(二):裁剪

GUI图形界面开发,一般人理解是比较耗费资源的,不管是高清晰度高分辨率的图片,或者做些开机动画、空间动画,除了图片可能用到音频视频处理,这些都是很耗费ROM存储空间和RAM内存的。然而说到嵌入式,那就是一个主芯片+各BOM器件构成的一个电路板,这样的系统对成本控制一般是…

Python版Day5

242. 有效的字母异位词 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 注意&#xff1a;若 s 和 t 中每个字符出现的次数都相同&#xff0c;则称 s 和 t 互为字母异位词。 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&…