c# 计算器
c#计算器 实验报告
一、实验目的
设计一个简单计算器,在功能上功能尽量模拟windows操作系统中的计算器,系统界面不做强制要求。
最低要求:应具有一般计算功能,能进行基本的加减乘除运算。其他计算功能作为加分项。
二、实验原理
1.本实验包含22个控件,其中20个button按钮用于表达式的输入,2个textbox用于显示输出表达式和计算结果。
2.按下button按钮时,textbox的内容会随之更新。expression列表会根据布尔类型的pull值进行更新。当pull为真时,表示当前输入运算符,会单独占用列表的一个位置。当pull为假时,表示当前输入数字,会根据具体情况决定是否与其他内容共同占用一个列表位置。
3.按下AC清零按钮时,textbox中的文本清空,expression列表内容清空。
4.按下CE清除按钮时,textbox删除一个字符。当expression最后一个字符串中含有小数点或者不含有小数点但大于9时,此字符串删除最后一个字符,除此之外,删除该字符串。
5.按下等于按钮时,输出计算结果。首先将中缀表达式转后缀表达式,数字直接入后缀表达式,运算符优先级高,入运算符列表,运算符优先级低,运算符列表出去一个元素,直至完成。再对后缀表达式求值,如果是数字,加入到数组中,如果是运算符,从数组中取出两个数进行运算,结果放到数组中。最后进行输出。
三、实验要求
具有一般计算功能,能进行基本的加减乘除运算,包括小数的运算,并且能够使用括号,能够清零和删除。
四、实验结果(程序)及分析
源代码:
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;
namespace WindowsFormsApplication1
{
public partial class Calculator : Form
{
List expression = new List();
bool pull = false; //运算符未输入设为false,输入设为true
public Calculator()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
resultBox.Text = “”;
}
private void button0_Click(object sender, EventArgs e) { addExpression("0"); } private void button1_Click(object sender, EventArgs e) { addExpression("1"); } private void button2_Click(object sender, EventArgs e) { addExpression("2"); } private void button3_Click(object sender, EventArgs e) { addExpression("3"); } private void button4_Click(object sender, EventArgs e) { addExpression("4"); } private void button5_Click(object sender, EventArgs e) { addExpression("5"); } private void button6_Click(object sender, EventArgs e) { addExpression("6"); } private void button7_Click(object sender, EventArgs e) { addExpression("7"); } private void button8_Click(object sender, EventArgs e) { addExpression("8"); } private void button9_Click(object sender, EventArgs e) { addExpression("9"); } private void addbutton_Click(object sender, EventArgs e) { addOperat("+"); } private void subbutton_Click(object sender, EventArgs e) { addOperat("-"); } private void mulbutton_Click(object sender, EventArgs e) { addOperat("*"); } private void divbutton_Click(object sender, EventArgs e) { addOperat("/"); } private void buttonleft_Click(object sender, EventArgs e) { addOperat("("); } private void buttonright_Click(object sender, EventArgs e) { addOperat(")"); } private void button_pot_Click(object sender, EventArgs e) { resultBox.Text += "."; expression[expression.Count - 1] = expression.Last() + "."; pull = false; } //添加表达式的运算符 private void addOperat(string str) { resultBox.Text += str; expression.Add(str); pull = true; } //添加表达式的值 private void addExpression(string str) { resultBox.Text += str; if (pull) expression.Add(str); else { if (expression.Count <= 0) expression.Add(str); else expression[expression.Count - 1] = expression.Last() + str; } pull = false; } //优先级判断 public bool priority(string a, string b) { if (a == "+") { if (b == "-" || b == "(") return true; else return false; } else if (a == "-") { if (b == "(") return true; else return false; } else if (a == "(") return true; else if (a == ")") { if (b == "(") return true; else return false; } else if (a == "*") { if (b == "/" || b == "+" || b == "-" || b =="(") return true; else return false; } else if (a == "/") { if (b == "+" || b == "-" || b == "(") return true; else return false; } else return false; } //等号点击事件触发 private void equalbutton_Click(object sender, EventArgs e) { formulaBox.Text = resultBox.Text + "="; resultBox.Text = Convert.ToString(Result(Suffix()));//中缀转后缀,后缀表达四求值 } //中缀表达式转后缀表达式 private List<string> Suffix() { List<string> suffix = new List<string>(); List<string> operat = new List<string>(); operat.Add("("); for (int i = 0; i < expression.Count; i++) { //数字直接入后缀表达式列表 if (isNum(expression[i])) suffix.Add(expression[i]); //运算符考虑优先级 else { //运算符优先级高,入运算符列表 if (priority(expression[i], operat.Last())) { if (operat.Last() == "(" && expression[i] == ")") operat.RemoveAt(operat.Count-1); else operat.Add(expression[i]); } //运算符优先级低,运算符列表出去一个元素,继续比较此元素 else { suffix.Add(operat.Last()); operat.RemoveAt(operat.Count - 1); i--; } } } //处理列表剩余元素 while (operat.Count > 1) { suffix.Add(operat.Last()); operat.RemoveAt(operat.Count - 1); } return suffix; } //判断字符串是否为数字 private bool isNum(string str) { if(str!="+"&&str!="-"&&str!="*"&&str!="/"&&str!="("&&str!=")") return true; else return false; } //后缀表达式求值 private double Result(List<string> suffix) { double []stack = new double[100]; int j = -1; for (int i = 0; i < suffix.Count; i++) { //如果是数字,加入到数组中 if (isNum(suffix[i])) stack[++j] = Convert.ToDouble(suffix[i]); //是运算符,从数组中取出两个数进行运算,结果放到数组中 else if (suffix[i] == "+") { double b = stack[--j] + stack[++j]; stack[--j] = b; } else if (suffix[i] == "-") { double b = stack[--j] - stack[++j]; stack[--j] = b; } else if (suffix[i] == "*") { double b = stack[--j] * stack[++j]; stack[--j] = b; } else if (suffix[i] == "/") { double b = stack[--j] / stack[++j]; stack[--j] = b; } } double result = stack[0]; return result; } //清除按钮事件触发 private void buttonCE_Click(object sender, EventArgs e) { resultBox.Text = resultBox.Text.Remove(resultBox.Text.Count() - 1); //当前字符串有"."或者字符串数值大于9,此字符串去掉最后一个字符 if (isPot(expression.Last()) || isOperate(expression.Last())==false && Convert.ToDouble(expression.Last()) > 9.0) expression[expression.Count - 1] = expression.Last().Remove(expression.Last().Length - 1); //去掉该字符串 else expression.Remove(expression.Last()); //需要对pull的值进行修改 if (isOperate(expression.Last())) pull = true; else pull = false; } //判断字符串中是否有"." private bool isPot(string str) { for (int i = 0; i < str.Count(); i++) if (str[i] == '.') return true; return false; } //判断字符串中是否有加减乘除和括号 private bool isOperate(string str) { if (str == "+" || str == "-" || str == "*" || str == "/" || str == "(" || str == ")") return true; else return false; } //清0按钮触发 private void buttonAC_Click(object sender, EventArgs e) { formulaBox.Text = ""; resultBox.Text = ""; expression.RemoveRange(0, expression.Count); pull = false; } }
}
实验结果:
- 自己用C#做的第一个程序 —— 计算器
- C#编写的windows计算器-源代码
- 计算器c#实现
- C#写计算器实例
- C#代码写的一个计算器的小程序
- 第十课等于之调用关键调用——C#计算器编程教学
- C#入门计算器
- C# 计算器实现源码
- C#小型计算器
- C#基础--面向过程计算器
- c# 方法创建计算器
- C#计算器代码
- 仿查询分析器的C#计算器——1.初步分析
- C#简单工厂设计模式实现计算器
- C# 计算器
- 仿查询分析器的C#计算器——6.函数波形绘制
- C# 一步一步完成一个简单的计算器 第三步---实现双目运算
- 使用C#编写一个计算器(OK)
- 第十一课私有变量——C#计算器编程教学
- 1. 请用C#的面向对象语言 实现 一个计算器控制台程序,要求输入两个数和运算符号,得到结果