简易计算器的设计_C#课程设计

article/2025/10/20 8:13:23

以下内容可且仅可供参考,如有错误欢迎指正。

部分内容借鉴自百度

侵删致歉

位切换键盘的实现用了复杂的拖64给label的方法,此功能可以在自己计算机上的计算器里找到。

目录

一、设计简介

1.设计背景

2.开发工具及环境

二、需求分析

1.设计功能要求

2.其他要求

三、相关工作

1.设计基础

2.功能需求

四、设计原理

详见代码

五、源代码

1.界面

2. Form1.cs

3.Form2.cs

3.Program.cs


一、设计简介

1.设计背景

        伴随着日益升高的物质生活水平以及日常生活中对基本的计算需求的提高。如今,网络快速发展,对算数要求的需求日益增大,计算的效率和性能和人们的生活紧密相关。对此,使用c#语言开发出一个为人们生活带来便利的计算器,以期带来对数据计算的提高。该系统实现了对数的加、减、乘、除以及专业模式的运算。

2.开发工具及环境

1)   开发工具及介绍

        Microsoft Visual Studio(简称VS)。VS是美国微软公司的开发工具包系列产品。VS是一个基本完整的开发工具集,它包括了整个软件生命周期中所需要的大部分工具,如UML工具、代码管控工具、集成开发环境(IDE)等等。所写的目标代码适用于微软支持的所有平台,包括Microsoft Windows、Windows Mobile、Windows CE、.NET Framework、.Net Core、.NET Compact Framework和Microsoft Silverlight 及Windows Phone。

2)   开发环境

        window10系统、window11系统、Microsoft Visual Studio2019、2022。

二、需求分析

1.设计功能要求

1)实现加、减、乘、除、求开方、求倒数等。

2)实现进制之间的转换功能:十进制、二进制、十六进制、八进制。

2.其他要求

1)界面美观,功能丰富

2)开放平台:vs2010及以上

三、相关工作

1.设计基础

        使用Windows窗体应用程序,设计出美观丰富的用户界面(UI)以及相关代码编写设计程序而集成的一个简易的计算器,通过Windows窗体应用程序来添加控件,来组成所需要的运算和数字来达到简易模式以及专业模式。

2.功能需求

        图形化用户界面,设计的简易计算器,用户通过button按钮选择用户想要的算法、数字以及运算符号,进行简易模式以及专业模式。具体如下:

1)当进行简易模式的时候

  1. 鼠标单击“计算器”上的数字按钮(0、1、2、3、4、5、6、7、8、9、.)累次可以设置参与运算的数值。
  2. 鼠标单击“计算器”上的运算符号按钮(+、-、*、=、%)。
  3. 如果需要删除错误的数据,鼠标单击“计算器”上的Delete button按钮。
  4. 如果要清除历史就单击CE按钮。
  5. 此简易模式可以读取历史记录、清除历史记录、保存历史记录,以便于用户在旁边的空白处查看。

2)当进行专业模式的时候

  1. 鼠标单击“计算器”上面的数字按钮(button)(0、1、2、3、4、5、6、7、8、9、.、A、B、C、D、E、F、b、x、^、!、())累次可以设置参与运算的数值。
  2. 鼠标单击“计算器”上的运算符号按钮(content)(+、-、*、=、%、)。
  3. 鼠标单击“计算器”,选择进制(二进制(前缀0b)、八进制(前缀0)、十进制、十六进制(0x))。
  4. 此简易模式也可以读取历史记录、清除历史记录、保存历史记录,展示在旁边的空白格中。
  5. 在专业模式下,还有含有64位数字的二进制,在数字上修改二进制,变可在下方得到相应的八进制、十进制、十六进制。

四、设计原理

详见代码

五、源代码

1.界面

Form1.cs[设计]

 Form2.cs[设计]

 

2. Form1.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Text.RegularExpressions;
using System.IO;namespace _1._2
{public partial class Form1 : Form{public Form1(){InitializeComponent();}private static List<String> temp = new List<string>();private static long tempx = 0;private void Add(object sender, EventArgs e){   //数字和符号的Click事件Button button = (Button)sender;textBox1.Text += button.Text;}private void Reset(object sender, EventArgs e){   // CE的Click事件textBox1.Text = "";}private void Delete(object sender, EventArgs e){   // ←的Click事件//移除最后一个字符if (textBox1.TextLength > 0)textBox1.Text = textBox1.Text.Remove(textBox1.TextLength - 1);}private void Equal(object sender, EventArgs e){   // = 的Click事件,计算并显示//自动清除历史文件夹Cleanf();List<string> zhonglist = ToList(textBox1.Text);List<string> houlist = houzhui(zhonglist);List<string> s = zhonglist;s.Add("=");s.Add(Calculate(houlist));string s1 = string.Join("", s);if (temp.Count > 9)//最多存十条记录{temp.RemoveAt(0);}temp.Add(s1);textBox2.Text = string.Join(",",temp);textBox1.Text = Calculate(houlist);}//中缀转Liststatic List<string> ToList(string s){List<string> ls = new List<string>();//存放中缀表达式String str = "";               //拼接多位数、小数char c = ' ';                  //遍历输入的字符int i = 0;do{if((s[i] == '-' && i == 0) || (i > 0 && s[i] == '-' && !char.IsDigit(s[i - 1])))//在负数前加零方便后续计算{ls.Add("0");}if (!char.IsDigit(c = s[i])&&c != '.') //如果c不是数字和'.',就加入ls{ls.Add(c.ToString());i++;    //i后移}else//如果是数字,需要考虑多位数{str = "";   //先将str清空while (i < s.Length && (char.IsDigit(c = s[i]) || c == '.')){str += c;i++;}ls.Add(str);}} while (i < s.Length);return ls;}//中缀改后缀static List<string> houzhui(List<string> ls){//定义两个栈,一个存临时结果,一个存运算符Stack<string> operators = new Stack<string>();List<string> num = new List<string>();//遍历 lsforeach (var item in ls){Regex regex = new Regex("[+-]?\\d+.?\\d*");//整数和浮点数//如果是一个数,则加入numif (regex.Match(item).Length > 0){num.Add(item);}else if (item.Equals("("))//Equals:比较是否相同{operators.Push(item);}else if (item.Equals(")")){//如果是右括号,则依次弹出operators栈顶的运算符,并压入num,直到遇到左括号为止,并将这对括号丢弃while (!operators.Peek().Equals("("))//Peek()返回顶部对象{num.Add(operators.Pop());}operators.Pop();   //将 ( 弹出}else{//当item 的 优先级小于或等于operators栈顶运算符,将operators栈顶的运算符弹出并加入到num中,再次转到operators与operators中新的栈顶运算符比较while (operators.Count != 0 && compare(operators.Peek()) >= compare(item)){num.Add(operators.Pop());}//还需要将 item 压入栈operators.Push(item);}}//将operators中剩余的运算符依次弹出并加入numwhile (operators.Count != 0){num.Add(operators.Pop());}return num;  //按顺序输出就是对应的后缀表达式对应的List}//运算符优先级public static int compare(string operation){int res = 0;switch (operation){case "+":res = 1;break;case "-":res = 1;break;case "*":res = 2;break;case "/":res = 2;break;case "%":res = 3;break;case "^":res = 4;break;case "!":res = 5;break;default:Console.WriteLine("不存在该运算符");break;}return res;}//计算后缀表达式static string Calculate(List<string> ls){Regex regex = new Regex("[+-]?\\d+.?\\d*");//创建栈Stack<string> stack = new Stack<string>();//遍历 listforeach (var item in ls){//使用正则表达式来取出数if (regex.Match(item).Length > 0) //如果是数字,就压入栈中{stack.Push(regex.Match(item).Value);}else if (item.Equals("!"))//弹出一个数字进行计算{int num1 = int.Parse(stack.Pop());int res = leicheng(num1);stack.Push(res.ToString());}else    //不是数就弹出两个数字进行计算{double num2 = double.Parse(stack.Pop());if (stack.Count == 0){stack.Push("0");}double num1 = double.Parse(stack.Pop());double res = 0;if (item.Equals("+")){res = num1 + num2;}else if (item.Equals("-")){res = num1 - num2;}else if (item.Equals("*")){res = num1 * num2;}else if (item.Equals("÷")){res = num1 / num2;}else if (item.Equals("%")){res = num1 % num2;}else if (item.Equals("^")){res = Math.Pow(num1, num2);}else{throw new Exception("表达式有误");}stack.Push(res.ToString());}}//最后留在stack中的数据就是运算结果return stack.Pop();}//累乘private static int leicheng(int n){if(n == 1){return n;}else{return n * leicheng(n - 1);}}//进制转换//二进制的前缀为 0b//八进制的前缀为 0//十六进制的前缀为 0xprivate void jinzhi2(object sender, EventArgs e){String s = textBox1.Text;switch(s[0]){case '0':switch (s[1]){case 'x'://十六转二s = s.Substring(2);//去掉前缀textBox1.Text = Convert.ToString(Convert.ToInt32(s, 16), 2);//先转十再转二break;default://八转二s = s.Substring(1);textBox1.Text = Convert.ToString(Convert.ToInt32(s, 8), 2);break;}break;default://十转二textBox1.Text = Convert.ToString(Convert.ToInt32(s), 2);break;}}private void jinzhi8(object sender, EventArgs e){String s = textBox1.Text;switch (s[0]){case '0':switch (s[1]){case 'x'://十六转八s = s.Substring(2);//去掉前缀textBox1.Text = Convert.ToString(Convert.ToInt32(s, 16), 8);//先转十再转八break;case 'b'://二转八s = s.Substring(2);textBox1.Text = Convert.ToString(Convert.ToInt32(s, 2), 8);break;}break;default://十转八textBox1.Text = Convert.ToString(Convert.ToInt32(s), 8);break;}}private void jinzhi10(object sender, EventArgs e){String s = textBox1.Text;switch (s[1]){case 'x'://十六转十s = s.Substring(2);//去掉前缀textBox1.Text = Convert.ToString(Convert.ToInt32(s, 16));break;case 'b'://二转十s = s.Substring(2);textBox1.Text = Convert.ToString(Convert.ToInt32(s, 2));break;default://八转十s = s.Substring(1);textBox1.Text = Convert.ToString(Convert.ToInt32(s, 8));break;}}private void jinzhi16(object sender, EventArgs e){String s = textBox1.Text;switch (s[0]){case '0':switch (s[1]){case 'b'://二转十六s = s.Substring(2);//去掉前缀textBox1.Text = Convert.ToString(Convert.ToInt32(s, 2), 16); ;//先转十再转十六break;default://八转十六s = s.Substring(1);textBox1.Text = Convert.ToString(Convert.ToInt32(s, 8), 16);break;}break;default://十转十六textBox1.Text = Convert.ToString(Convert.ToInt32(s), 16);break;}}private void Reset2(object sender, EventArgs e){   // 清除历史记录的Click事件textBox2.Text = "";temp.Clear();Cleanf();}//清空历史记录文件private void Cleanf(){File.Delete("历史记录1.txt");FileStream f = File.Create("历史记录1.txt");f.Close();}//读取文件到历史记录private void Readf(object sender, EventArgs e){   //读取历史记录的Click事件StreamReader sr = new StreamReader("历史记录1.txt");string s;if((s = sr.ReadLine()) != null){String[] s1 = s.Split(',');List<String> s2 = new List<string>(s1);temp = s2;textBox2.Text = string.Join(",", temp);}sr.Close();}//打开文件,private void Openf(object sender, EventArgs e){  //保存历史记录的Click事件StreamWriter sw = new StreamWriter("历史记录1.txt");sw.WriteLine(string.Join(",", temp));sw.Close();}//以下是位切换键盘设计代码,不会高级方法,拖了64个label控制0和1private void jisuan(string s,int n){long t = 1;for(int i = 0;i < n - 1;i++){t *= 2;}if(s == "0"){tempx -= t;}else{tempx += t;}label72.Text = Convert.ToString(tempx , 8);label73.Text = Convert.ToString(tempx);label74.Text = Convert.ToString(tempx, 16);}private void ex1(object sender, EventArgs e){if(label1.Text == "0"){label1.Text = "1";}else{label1.Text = "0";}jisuan(label1.Text,1);}private void ex2(object sender, EventArgs e){if (label2.Text == "0"){label2.Text = "1";}else{label2.Text = "0";}jisuan(label2.Text, 2);}private void ex3(object sender, EventArgs e){if (label3.Text == "0"){label3.Text = "1";}else{label3.Text = "0";}jisuan(label3.Text, 3);}private void ex4(object sender, EventArgs e){if (label4.Text == "0"){label4.Text = "1";}else{label4.Text = "0";}jisuan(label4.Text, 4);}private void ex5(object sender, EventArgs e){if (label5.Text == "0"){label5.Text = "1";}else{label5.Text = "0";}jisuan(label5.Text, 5);}private void ex6(object sender, EventArgs e){if (label6.Text == "0"){label6.Text = "1";}else{label6.Text = "0";}jisuan(label6.Text, 6);}private void ex7(object sender, EventArgs e){if (label7.Text == "0"){label7.Text = "1";}else{label7.Text = "0";}jisuan(label7.Text, 7);}private void ex8(object sender, EventArgs e){if (label8.Text == "0"){label8.Text = "1";}else{label8.Text = "0";}jisuan(label8.Text, 8);}private void ex9(object sender, EventArgs e){if (label9.Text == "0"){label9.Text = "1";}else{label9.Text = "0";}jisuan(label9.Text, 9);}private void ex10(object sender, EventArgs e){if (label10.Text == "0"){label10.Text = "1";}else{label10.Text = "0";}jisuan(label10.Text, 10);}private void ex11(object sender, EventArgs e){if (label11.Text == "0"){label11.Text = "1";}else{label11.Text = "0";}jisuan(label11.Text, 11);}private void ex12(object sender, EventArgs e){if (label12.Text == "0"){label12.Text = "1";}else{label12.Text = "0";}jisuan(label12.Text, 12);}private void ex13(object sender, EventArgs e){if (label13.Text == "0"){label13.Text = "1";}else{label13.Text = "0";}jisuan(label13.Text, 13);}private void ex14(object sender, EventArgs e){if (label14.Text == "0"){label14.Text = "1";}else{label14.Text = "0";}jisuan(label14.Text, 14);}private void ex15(object sender, EventArgs e){if (label15.Text == "0"){label15.Text = "1";}else{label15.Text = "0";}jisuan(label15.Text, 15);}private void ex16(object sender, EventArgs e){if (label16.Text == "0"){label16.Text = "1";}else{label16.Text = "0";}jisuan(label16.Text, 16);}private void ex17(object sender, EventArgs e){if (label17.Text == "0"){label17.Text = "1";}else{label17.Text = "0";}jisuan(label17.Text, 17);}private void ex18(object sender, EventArgs e){if (label18.Text == "0"){label18.Text = "1";}else{label18.Text = "0";}jisuan(label18.Text, 18);}private void ex19(object sender, EventArgs e){if (label19.Text == "0"){label19.Text = "1";}else{label19.Text = "0";}jisuan(label19.Text, 19);}private void ex20(object sender, EventArgs e){if (label20.Text == "0"){label20.Text = "1";}else{label20.Text = "0";}jisuan(label20.Text, 20);}private void ex21(object sender, EventArgs e){if (label21.Text == "0"){label21.Text = "1";}else{label21.Text = "0";}jisuan(label21.Text, 21);}private void ex22(object sender, EventArgs e){if (label22.Text == "0"){label22.Text = "1";}else{label22.Text = "0";}jisuan(label22.Text, 22);}private void ex23(object sender, EventArgs e){if (label23.Text == "0"){label23.Text = "1";}else{label23.Text = "0";}jisuan(label23.Text, 23);}private void ex24(object sender, EventArgs e){if (label24.Text == "0"){label24.Text = "1";}else{label24.Text = "0";}jisuan(label24.Text, 24);}private void ex25(object sender, EventArgs e){if (label25.Text == "0"){label25.Text = "1";}else{label25.Text = "0";}jisuan(label25.Text, 25);}private void ex26(object sender, EventArgs e){if (label26.Text == "0"){label26.Text = "1";}else{label26.Text = "0";}jisuan(label26.Text, 26);}private void ex27(object sender, EventArgs e){if (label27.Text == "0"){label27.Text = "1";}else{label27.Text = "0";}jisuan(label27.Text, 27);}private void ex28(object sender, EventArgs e){if (label28.Text == "0"){label28.Text = "1";}else{label28.Text = "0";}jisuan(label28.Text, 28);}private void ex29(object sender, EventArgs e){if (label29.Text == "0"){label29.Text = "1";}else{label29.Text = "0";}jisuan(label29.Text, 29);}private void ex30(object sender, EventArgs e){if (label30.Text == "0"){label30.Text = "1";}else{label30.Text = "0";}jisuan(label30.Text, 30);}private void ex31(object sender, EventArgs e){if (label31.Text == "0"){label31.Text = "1";}else{label31.Text = "0";}jisuan(label31.Text, 31);}private void ex32(object sender, EventArgs e){if (label32.Text == "0"){label32.Text = "1";}else{label32.Text = "0";}jisuan(label32.Text, 32);}private void ex33(object sender, EventArgs e){if (label33.Text == "0"){label33.Text = "1";}else{label33.Text = "0";}jisuan(label33.Text, 33);}private void ex34(object sender, EventArgs e){if (label34.Text == "0"){label34.Text = "1";}else{label34.Text = "0";}jisuan(label34.Text, 34);}private void ex35(object sender, EventArgs e){if (label35.Text == "0"){label35.Text = "1";}else{label35.Text = "0";}jisuan(label35.Text, 35);}private void ex36(object sender, EventArgs e){if (label36.Text == "0"){label36.Text = "1";}else{label36.Text = "0";}jisuan(label36.Text, 36);}private void ex37(object sender, EventArgs e){if (label37.Text == "0"){label37.Text = "1";}else{label37.Text = "0";}jisuan(label37.Text, 37);}private void ex38(object sender, EventArgs e){if (label38.Text == "0"){label38.Text = "1";}else{label38.Text = "0";}jisuan(label38.Text, 38);}private void ex39(object sender, EventArgs e){if (label39.Text == "0"){label39.Text = "1";}else{label39.Text = "0";}jisuan(label39.Text, 39);}private void ex40(object sender, EventArgs e){if (label40.Text == "0"){label40.Text = "1";}else{label40.Text = "0";}jisuan(label40.Text, 40);}private void ex41(object sender, EventArgs e){if (label41.Text == "0"){label41.Text = "1";}else{label41.Text = "0";}jisuan(label41.Text, 41);}private void ex42(object sender, EventArgs e){if (label42.Text == "0"){label42.Text = "1";}else{label42.Text = "0";}jisuan(label42.Text, 42);}private void ex43(object sender, EventArgs e){if (label43.Text == "0"){label43.Text = "1";}else{label43.Text = "0";}jisuan(label43.Text, 43);}private void ex44(object sender, EventArgs e){if (label44.Text == "0"){label44.Text = "1";}else{label44.Text = "0";}jisuan(label44.Text, 44);}private void ex45(object sender, EventArgs e){if (label45.Text == "0"){label45.Text = "1";}else{label45.Text = "0";}jisuan(label45.Text, 45);}private void ex46(object sender, EventArgs e){if (label46.Text == "0"){label46.Text = "1";}else{label46.Text = "0";}jisuan(label46.Text, 46);}private void ex47(object sender, EventArgs e){if (label47.Text == "0"){label47.Text = "1";}else{label47.Text = "0";}jisuan(label47.Text, 47);}private void ex48(object sender, EventArgs e){if (label48.Text == "0"){label48.Text = "1";}else{label48.Text = "0";}jisuan(label48.Text, 48);}private void ex49(object sender, EventArgs e){if (label49.Text == "0"){label49.Text = "1";}else{label49.Text = "0";}jisuan(label49.Text, 9);}private void ex50(object sender, EventArgs e){if (label50.Text == "0"){label50.Text = "1";}else{label50.Text = "0";}jisuan(label50.Text, 50);}private void ex51(object sender, EventArgs e){if (label51.Text == "0"){label51.Text = "1";}else{label51.Text = "0";}jisuan(label51.Text, 51);}private void ex52(object sender, EventArgs e){if (label52.Text == "0"){label52.Text = "1";}else{label52.Text = "0";}jisuan(label52.Text, 52);}private void ex53(object sender, EventArgs e){if (label53.Text == "0"){label53.Text = "1";}else{label53.Text = "0";}jisuan(label53.Text, 53);}private void ex54(object sender, EventArgs e){if (label54.Text == "0"){label54.Text = "1";}else{label54.Text = "0";}jisuan(label54.Text, 54);}private void ex55(object sender, EventArgs e){if (label55.Text == "0"){label55.Text = "1";}else{label55.Text = "0";}jisuan(label55.Text, 55);}private void ex56(object sender, EventArgs e){if (label56.Text == "0"){label56.Text = "1";}else{label56.Text = "0";}jisuan(label56.Text, 56);}private void ex57(object sender, EventArgs e){if (label57.Text == "0"){label57.Text = "1";}else{label57.Text = "0";}jisuan(label57.Text, 57);}private void ex58(object sender, EventArgs e){if (label58.Text == "0"){label58.Text = "1";}else{label58.Text = "0";}jisuan(label58.Text, 58);}private void ex59(object sender, EventArgs e){if (label59.Text == "0"){label59.Text = "1";}else{label59.Text = "0";}jisuan(label59.Text, 59);}private void ex60(object sender, EventArgs e){if (label60.Text == "0"){label60.Text = "1";}else{label60.Text = "0";}jisuan(label60.Text, 60);}private void ex61(object sender, EventArgs e){if (label61.Text == "0"){label61.Text = "1";}else{label61.Text = "0";}jisuan(label61.Text, 61);}private void ex62(object sender, EventArgs e){if (label62.Text == "0"){label62.Text = "1";}else{label62.Text = "0";}jisuan(label62.Text, 62);}private void ex63(object sender, EventArgs e){if (label63.Text == "0"){label63.Text = "1";}else{label63.Text = "0";}jisuan(label63.Text, 63);}private void ex64(object sender, EventArgs e){if (label64.Text == "0"){label64.Text = "1";}else{label64.Text = "0";}jisuan(label64.Text, 64);}private void label79_Click(object sender, EventArgs e){System.Environment.Exit(0);}private void textBox2_TextChanged(object sender, EventArgs e){}//}
}

3.Form2.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Text.RegularExpressions;
using System.IO;namespace _1._2
{public partial class Form2 : Form{public Form2(){InitializeComponent();}private static List<String> temp = new List<string>();private void button2_Click(object sender, EventArgs e)//CE按钮{textBox1.Text = "";}private void button5_Click(object sender, EventArgs e){}private void Add(object sender, EventArgs e){   //数字和符号的Click事件Button button = (Button)sender;textBox1.Text += button.Text;}private void button8_Click(object sender, EventArgs e){}private void button3_Click(object sender, EventArgs e)//delect按钮{if (textBox1.TextLength > 0)textBox1.Text = textBox1.Text.Remove(textBox1.TextLength - 1);}private void button9_Click(object sender, EventArgs e)//“=”按钮{Cleanf();List<string> zhonglist = ToList(textBox1.Text);List<string> houlist = houzhui(zhonglist);List<string> s = zhonglist;s.Add("=");s.Add(Calculate(houlist));string s1 = string.Join("", s);if (temp.Count > 9)//最多存十条记录{temp.RemoveAt(0);}temp.Add(s1);textBox2.Text = string.Join(",", temp);textBox1.Text = Calculate(houlist);}//中缀转Liststatic List<string> ToList(string s){List<string> ls = new List<string>();//存放中缀表达式String str = "";               //拼接多位数、小数char c = ' ';                  //遍历输入的字符int i = 0;do{if ((s[i] == '-' && i == 0) || (i > 0 && s[i] == '-' && !char.IsDigit(s[i - 1])))//在负数前加零方便后续计算{ls.Add("0");}if (!char.IsDigit(c = s[i]) && c != '.') //如果c不是数字和'.',就加入ls{ls.Add(c.ToString());i++;    //i后移}else//如果是数字,需要考虑多位数{str = "";   //先将str清空while (i < s.Length && (char.IsDigit(c = s[i]) || c == '.')){str += c;i++;}ls.Add(str);}} while (i < s.Length);return ls;}static List<string> houzhui(List<string> ls){//定义两个栈,一个存临时结果,一个存运算符Stack<string> operators = new Stack<string>();List<string> num = new List<string>();//遍历 lsforeach (var item in ls){Regex regex = new Regex("[+-]?\\d+.?\\d*");//整数和浮点数//如果是一个数,则加入numif (regex.Match(item).Length > 0){num.Add(item);}else if (item.Equals("("))//Equals:比较是否相同{operators.Push(item);}else if (item.Equals(")")){//如果是右括号,则依次弹出operators栈顶的运算符,并压入num,直到遇到左括号为止,并将这对括号丢弃while (!operators.Peek().Equals("("))//Peek()返回顶部对象{num.Add(operators.Pop());}operators.Pop();   //将 ( 弹出}else{//当item 的 优先级小于或等于operators栈顶运算符,将operators栈顶的运算符弹出并加入到num中,再次转到operators与operators中新的栈顶运算符比较while (operators.Count != 0 && compare(operators.Peek()) >= compare(item)){num.Add(operators.Pop());}//还需要将 item 压入栈operators.Push(item);}}//将operators中剩余的运算符依次弹出并加入numwhile (operators.Count != 0){num.Add(operators.Pop());}return num;  //按顺序输出就是对应的后缀表达式对应的List}//运算符优先级public static int compare(string operation){int res = 0;switch (operation){case "+":res = 1;break;case "-":res = 1;break;case "^":res = 3;break;case "*":res = 2;break;case "÷":res = 3;break;case "%":res = 4;break;case "!":res = 5;break;default:Console.WriteLine("不存在该运算符");break;}return res;}//计算后缀表达式static string Calculate(List<string> ls){Regex regex = new Regex("[+-]?\\d+.?\\d*");//创建栈Stack<string> stack = new Stack<string>();//遍历 listforeach (var item in ls){//使用正则表达式来取出数if (regex.Match(item).Length > 0) //如果是数字,就压入栈中{stack.Push(regex.Match(item).Value);}else    //不是数就弹出两个数字进行计算{double num2 = double.Parse(stack.Pop());double num1 = double.Parse(stack.Pop());double res = 0;if (item.Equals("+")){res = num1 + num2;}else if (item.Equals("-")){res = num1 - num2;}else if (item.Equals("×")){res = num1 * num2;}else if (item.Equals("÷")){res = num1 / num2;}else if (item.Equals("%")){res = num1 % num2;}else{throw new Exception("表达式有误");}stack.Push(res.ToString());}}//最后留在stack中的数据就是运算结果return stack.Pop();}private void Cleanf(){File.Delete("历史记录2.txt");FileStream f = File.Create("历史记录2.txt");f.Close();}private void button22_Click(object sender, EventArgs e)//“读取历史”按钮{StreamReader sr = new StreamReader("历史记录2.txt");String s;if ((s = sr.ReadLine() )!= null){String[] s1 = s.Split(',');List<String> s2 = new List<string>(s1);temp = s2;textBox2.Text = string.Join(",", temp);}sr.Close();}private void button23_Click(object sender, EventArgs e)//“清除历史记录”{textBox2.Text = "";temp.Clear();Cleanf();}private void button24_Click(object sender, EventArgs e){StreamWriter sw = new StreamWriter("历史记录2.txt");sw.WriteLine(string.Join(",", temp));sw.Close();}private void label1_Click(object sender, EventArgs e){System.Environment.Exit(0);}private void textBox2_TextChanged(object sender, EventArgs e){}}}

3.Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;namespace _1._2
{static class Program{/// <summary>/// 应用程序的主入口点。/// </summary>[STAThread]static void Main(){Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);//跳转窗口Form2 EasyModel = new Form2();Form1 PerModel = new Form1(); EasyModel.ShowDialog();for(int i=0;i<1;i++){if (EasyModel.DialogResult == DialogResult.OK){PerModel.ShowDialog();}if (PerModel.DialogResult == DialogResult.Cancel){EasyModel.ShowDialog();i = -1;}}}}
}


http://chatgpt.dhexx.cn/article/J7GKZwBI.shtml

相关文章

Python制作简易计算器(GUI)---Tkinter

Python制作简易计算器&#xff08;GUI&#xff09;---Tkinter Tkinter简介Tkinter 与 PyQt5 的比较TkinterPyQt5 项目展示导入模块函数封装1. 运算公式的拼接与展示2. 将显示框的内容删除3. 使用eval()函数对表达式求值 主逻辑1. 布局窗口2. 布局表达式展示区域3. 布局按钮 代码…

自制个性计算器

一、布局文件xml的制作。 如图&#xff1a;是布局之后的一个效果图 完全可以自定义自己喜欢的各种类型的图片。 代码如下&#xff1a; 正所谓每一个鲜艳靓丽app背后都有成堆的代码支撑这句话是没有错的。由于没有长截屏软件只能用短截屏了&#xff0c;大家谅解一下&#…

C++简易计算器的实现

定义&#xff1a; 计算器是近代人发明的可以进行数字运算的机器。 也就是说&#xff0c;计算器不等同于算盘&#xff0c;前者能自行运算&#xff0c;后者只能简便计算过程&#xff0c;在古代,人们发明了许多计算工具,如算筹、算盘、计算尺等,随着社会的发展和科技的进步,计算…

制作简易计算器

简易计算器 效果展示图项目要求内容分析涉及函数 效果展示图 项目要求 制作简易计算器&#xff0c;使其能实现简单的加&#xff0c;减&#xff0c;乘&#xff0c;除运算。 1.在两个文本框中分别输入两个数字 2.输入完成后&#xff0c;再次点击加&#xff0c;减&#xff0c;乘&…

C# 制作简易计算器

前言&#xff1a;环境是vs 2022 1、打开vs2022后&#xff0c;右边导航栏选择创建新项目。 2、选择Windows窗体应用&#xff08;.net Framework&#xff09; 3、进入配置新项目界面&#xff08;项目名称和位置可自行修改&#xff09;点击创建 4、窗体From1即为我们要要编辑的位…

至简设计系列_简易计算器

–作者&#xff1a;小黑同学 本文为明德扬原创及录用文章&#xff0c;转载请注明出处&#xff01; 1.1 总体设计 1.1.1 概述 计算器是近代人发明的可以进行数字运算的机器。现代的电子计算器能进行数学运算的手持电子机器&#xff0c;拥有集成电路芯片&#xff0c;但结构比电…

如何制作一个简易的计算器

今天&#xff0c;我们来学习如何完成一个简易计算器的功能吧&#xff01; 一.布局 我们可以在HTML中使用CSS完成计算器的布局。接下来&#xff0c;我们便先来看看我们所要实现的效吧&#xff01; 上图的计算器中&#xff0c;我们可以通过以下几个步骤完成对计算器的简单布局…

简易版计算器

这次我们来写一个简单的计算器案例 代码部分 HTML部分 首先设置一个基本样式&#xff0c;把我们需要的“计算”按钮&#xff0c;“-*/”四个计算符合&#xff0c;三个文本框准备好(两个用来输入数字进行计算&#xff0c;一个用来接收计算出来的结果)&#xff0c;再为三个文…

java拦截器怎么实现

Java拦截器是一种对象拦截器&#xff0c;它可以拦截任何的类、方法和字段。拦截器还可以用于检查类是否已经加载以及对字段的访问权限是否符合规范。下面就让我们来了解一下 java拦截器怎么实现吧。 在 Java中&#xff0c;可以通过重写方法和代码块来实现拦截功能&#xff0c;但…

Java中的过滤器和拦截器

Java中的过滤器和拦截器 一.应用场景 拦截器应用场景 拦截器本质上是面向切面编程&#xff08;AOP&#xff09;&#xff0c;符合横切关注点的功能都可以放在拦截器中来实现&#xff0c;主要的应用场景包括&#xff1a; 登录验证&#xff0c;判断用户是否登录。权限验证&…

拦截器(HandlerInterceptor)

目录 1 什么是拦截器 2 HandlerInterceptor和WebMvcConfigurer 2.1 HandlerInterceptor 2.2 WebMvcConfigurer 3 拦截器实现流程 1 什么是拦截器 拦截器是相对于Spring中来说的&#xff0c;它和过滤器不一样&#xff0c;过滤器的范围更广一些是相对于Tomcat容器来说的。拦…

用 Java 实现拦截器 Interceptor 的拦截功能

Java 里的拦截器是动态拦截 action 调用的对象&#xff0c;它提供了一种机制可以使开发者可以定义在一个 action 执行的前后执行的代码&#xff0c;也可以在一个 action 执行前阻止其执行&#xff0c;同时也提供了一种可以提取 action 中可重用部分的方式。在 AOP&#xff08;A…

java-拦截器

(1)浏览器发送一个请求会先到Tomcat的web服务器 (2)Tomcat服务器接收到请求以后&#xff0c;会去判断请求的是静态资源还是动态资源 (3)如果是静态资源&#xff0c;会直接到Tomcat的项目部署目录下去直接访问 (4)如果是动态资源&#xff0c;就需要交给项目的后台代码进行处理…

JAVA中的拦截器、过滤器

JAVA变成拦截器、过滤器 一、拦截器1、简介说明2、源码及方法说明3、拦截器自定义应用 二、过滤器1、简介说明2、源码及方法说明3、过滤器的自定义应用 三、Springboot中的WebMvcConfigurer1、简介2、主要方法3、添加拦截器 四、区别1、原理2、触发3、其他 一、拦截器 1、简介…

Java开发学习----拦截器(Interceptor)详细解析

一、拦截器概念 讲解拦截器的概念之前&#xff0c;我们先看一张图: (1)浏览器发送一个请求会先到Tomcat的web服务器 (2)Tomcat服务器接收到请求以后&#xff0c;会去判断请求的是静态资源还是动态资源 (3)如果是静态资源&#xff0c;会直接到Tomcat的项目部署目录下去直接访…

JAVA三大器之拦截器

1&#xff0c;拦截器的概念 java里的拦截器是动态拦截Action调用的对象&#xff0c;它提供了一种机制可以使开发者在一个Action执行的前后执行一段代码&#xff0c;也可以在一个Action 执行前阻止其执行&#xff0c;同时也提供了一种可以提取Action中可重用部分代码的方式。…

java之拦截器

java里的拦截器是动态 拦截action的web请求&#xff0c;而过滤器能够进行系统级别的过滤&#xff0c;即能够过滤所有的web请求。从这可以看出拦截器是有一定的局限性的。拦截器是基于jdk实现的动态代理&#xff0c;拦截器是动态拦截action调用的对象&#xff0c; 拦截器可以使得…

Java三大器之拦截器(Interceptor)的实现原理及代码示例

前言&#xff1a;前面2篇博客&#xff0c;我们分析了Java中过滤器和监听器的实现原理&#xff0c;今天我们来看看拦截器。 1&#xff0c;拦截器的概念 java里的拦截器是动态拦截Action调用的对象&#xff0c;它提供了一种机制可以使开发者在一个Action执行的前后执行一段代…

Java 拦截器

一、引言 既然要用拦截器&#xff0c;首先先得简单了解一下什么是拦截器&#xff1a; 概念&#xff1a;java里的拦截器是动态拦截Action调用的对象&#xff0c;它提供了一种机制可以使开发者在一个Action执行的前后执行一段代码&#xff0c;也可以在一个Action执行前阻止其执行…

VirtualAPK:滴滴 Android 插件化的实践之路

作者简介&#xff1a; 任玉刚&#xff0c;滴滴出行 Android 技术专家&#xff0c;《Android 开发艺术探索》作者&#xff0c;插件化框架 dynamic-load-apk 的发起者&#xff0c;CSDN 移动开发博客专家&#xff0c;曾当选 CSDN 2014、2015年度十大博客之星。热爱技术&#xff0c…