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

news2024/12/22 22:51:15

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

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

这里介绍用几十行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.coloradmin.cn/o/600709.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot接口如何正确地接收时间参数

唠嗑部分 在做Java开发时&#xff0c;肯定会碰到传递时间参数的情况吧&#xff0c;比如用户的出生日期、活动的开始&#xff0c;结束日期等等&#xff0c;这些参数往往是由前端传递过来的&#xff0c;那么在SpringBoot项目中&#xff0c;该如何正确的接收日期参数呢&#xff0…

如果不小心上了电信黑名单,应该怎么妥善处理呢?

有些小伙伴们在处理不用的手机卡时&#xff0c;可能会粗心大意&#xff0c;认为不用了就用不了呗&#xff0c;存在欠费停机的情况下也没有及时的去补交欠费&#xff0c;然后销户&#xff0c;导致了自己不小心上了电信黑名单&#xff0c;那遇到这种情况&#xff0c;应该怎么妥善…

论文解读 | 利用图形卷积核在距离图像中实现高效的3D目标检测

原创 | 文 BFT机器人 01 摘要 该论文提出了一种基于范围图像的高效3D物体检测方法&#xff0c;通过利用图卷积核来提取每个像素周围的局部几何信息。 作者设计了一种新颖的2D卷积网络架构&#xff0c;并提出了四种替代内积核心的卷积核&#xff0c;以注入所需的三维信息。该方法…

GPT最常用的应用场景有哪些?

生成式预训练转换器&#xff08;GPT&#xff09;是一种深度学习模型&#xff0c;它能够根据给定的提示生成类似人类的文本&#xff0c;彻底改变了自然语言处理&#xff08;NLP&#xff09;领域。 聊天机器人和虚拟助手 GPT最受欢迎的应用程序之一是开发聊天机器人和虚拟助手。凭…

【Python 自然语言处理(NLP)】零基础也能轻松掌握的学习路线与参考资料

Python 自然语言处理&#xff08;NLP&#xff09;是目前人工智能&#xff08;AI&#xff09;发展中的重要领域。随着科技的不断进步&#xff0c;NLP已经被应用于文本自动摘要、机器翻译、语音识别、情感分析、问答系统等各项实际任务中。 要学习 Python 自然语言处理&#xff…

“河南省数字化转型与信息技术应用创新专家研讨会-政府数字化转型推动信创产业发展”专场活动成功召开

由《中国信息化》杂志社主办的“2023河南省数字化转型与信息技术应用创新专家研讨会——政府数字化转型推动信创产业发展”专场活动于5月27日&#xff0c;在郑州成功举办。本次活动由深圳竹云科技股份有限公司协办&#xff0c;由河南省测绘学会、中国信息主管平台支持。中国交通…

Windows 安装部署 MinIo

1、下载地址 安装包下载地址&#xff1a;https://min.io/download#/windows 2、安装目录 下载的是一个可执行文件 minio.exe 将其放到一个方便寻找的目录&#xff0c;我这里放在 D:\develop\minio 同时新建一个 data 文件夹&#xff0c;用来存储上传的文件 3、启动 MinIo 服…

Godot引擎 4.0 文档 - 第一个 3D 游戏

本文为Google Translate英译中结果&#xff0c;DrGraph在此基础上加了一些校正。英文原版页面&#xff1a; Your first 3D game — Godot Engine (stable) documentation in English 你的第一个 3D 游戏 在这个循序渐进的教程系列中&#xff0c;您将使用 Godot 创建您的第一…

Java程序设计入门教程 -- 二维数组

二维数组创建 定义数组 声明二维数组 Java中二维数组的声明格式&#xff1a; 数据类型名[ ][ ] 数组名; 或 数据类型名 数组名[ ][ ]; 分配数组内存 常用格式&#xff1a; new 数组名[ M][N ] ; //M&#xff0c;N为数组行号和列号 分配数组内存 1&#xff09;规…

chatgpt赋能python:Python的几次方符号介绍

Python的几次方符号介绍 当我们在使用Python编程时&#xff0c;经常需要进行数学计算。其中最常见的计算就是幂运算。Python使用幂运算符号来表示一个数的几次方。这个符号既可以用在数字之间&#xff0c;也可以用在变量之间。在本文中&#xff0c;我们将介绍Python中的几次方…

堆基础1_小白垃圾笔记

小白垃圾笔记&#xff0c;不建议阅读。 目录 1.什么是堆&#xff1f; 2.堆从哪里来&#xff1f; 3.堆管理器是什么 4.堆申请的实现方式 1.brk&#xff1a;brk仅仅主线程申请小空间的时候用&#xff0c;子线程不可调用brk。 2.mmap&#xff1a;主线程申请大的内存的时候和…

Mysql小知识 delete 清空表之后,磁盘空间未发生变化?

1. 删除空洞 1.1 案例展示 首先我们先来看这样一个例子。 我现在有一个名为 sakila 的数据库&#xff0c;该库中有一个 film 表&#xff0c;这个表中有 1000 条记录&#xff0c;我么先来看下这 1000 条记录占用了多少存储空间&#xff1a; 小伙伴们可以看到&#xff0c;这个…

Go-FastDFS 本地对象存储,Windows环境搭建(下载安装教程)!

文章目录 Go-FastDFS简介与地址下载安装服务与管理端台可视化测试 Go-FastDFS简介与地址 go-fastdfs 是一个基于 http 协议的分布式文件系统&#xff01; 它基于大道至简的设计理念&#xff0c;一切从简设计&#xff0c;使得它的运维及扩展变得更加简单&#xff0c;它具有高性…

Elasticsearch:使用带有 X-Opaque-Id 的慢速查询功能在 Elasticsearch 中调试慢速查询

如果你在软件堆栈中使用 Elasticsearch&#xff0c;你可能已经意识到 Elasticsearch 管理大量数据和提供实时搜索功能的强大能力。 了解 Elasticsearch 中的慢速查询 Slow Log 是 Elasticsearch 的内置功能&#xff0c;可用于识别慢速搜索。 任何花费时间超过预期的请求都会记…

Paper reading: Conditional Diffusion for Interactive Segmentation ICCV2021

交互式语义分割 We propose Conditional Diffusion Network (CDNet), which propagates labeled representations from clicks to conditioned destinations with two levels of affinities: Feature Diffusion Module (FDM) spreads features from clicks to potential targ…

单例模式-图文详解

概念 全世界就只要一个---在整个java程序中&#xff0c;只有这个类的一个实例 比如Student a new Student(); 就是Student类只创建这一个实例&#xff0c;只能有这一个对象存在 主要解决&#xff1a;一个全局使用的类频繁地创建与销毁。在内存里只有一个实例&#xff0c;减…

【白话机器学习系列】白话张量

白话张量 张量&#xff08;Tensor&#xff09;是向量和矩阵向 n n n 维的推广。向量是一维张量&#xff0c;矩阵是二维张量。张量作为数值容器&#xff0c;是机器学习&#xff0c;尤其是深度学习中最基础的操作对象&#xff0c;以至于 Google 的机器学习框架都已 TensorFlow …

ffmpeg在windows环境下的详细安装教程

这两天整理好用的录屏软件&#xff0c;发现了Captura这个软件&#xff0c;软件本身的安装很简单&#xff0c;但由于Captura需要依赖ffmpeg&#xff08;一套可以用来记录、转换数字音频、视频&#xff0c;并能将其转化为流的开源计算机程序&#xff09;&#xff0c;而ffmpeg在安…

springboot X-Accel-Redirect 大文件下载实现

文章目录 前言一、什么是 X-Sendfile&#xff1f;二、相关请求头说明三、食用步骤总结 前言 文件下载的方式&#xff1a; nginx代理附件路径&#xff0c;直接访问。无法控制用户的权限。服务端流式读取文件内容。这个过程需要后端进程将文件读取到内存中然后再发给用户&#…

全民开发|零代码平台搭建库存管理系统,助力企业降本增效

什么是库存管理系统 库存管理系统是一种用于监控和跟踪商业组织存货的系统机软件。它帮助企业管理其库存&#xff0c;确保所需的商品和服务始终可用&#xff0c;并在需要时提供报告和预测。库存管理系统可追踪库存级别、库存周转率、订单、销售和交付等方面的数据&#xff0c;…