基于c#的简易逆波兰式算法的计算器,用集合来处理运算符和运算数,包含平方、开方、三角函数、log、加减乘除、M+、M-、MS,能退格和清除,写出窗体程序代码并有详细中文注释,并且写出总体思路流程,窗体界面需要包含1、2、3、4、5、6、7、8、9、.、0、*、/、+、-、sin、cos、M+、M-、MS、=等以及写出详细的各控件属性表格。
时间: 2023-07-10 22:35:52 浏览: 51
总体思路流程:
1. 使用集合来存储运算符和运算数,并且使用栈来处理逆波兰式表达式的计算。
2. 在窗体界面中添加各种控件,包括数字按钮、运算符按钮、退格按钮、清除按钮、文本框等等。
3. 对于数字按钮和运算符按钮,使用事件处理程序将其添加到集合中,并在文本框中显示当前表达式。
4. 对于退格按钮和清除按钮,使用事件处理程序来处理文本框中的内容。
5. 对于等号按钮,将集合中的逆波兰式表达式计算出结果,并在文本框中显示。
6. 对于M+、M-、MS按钮,使用全局变量来存储和处理内存中的值。
窗体界面控件属性表格:
| 控件名称 | 属性名称 | 属性值 |
| --- | --- | --- |
| 数字按钮1-9 | Text | 1-9 |
| 数字按钮0 | Text | 0 |
| 加法按钮 | Text | + |
| 减法按钮 | Text | - |
| 乘法按钮 | Text | * |
| 除法按钮 | Text | / |
| 等号按钮 | Text | = |
| 正弦按钮 | Text | sin |
| 余弦按钮 | Text | cos |
| 平方按钮 | Text | ^2 |
| 开方按钮 | Text | sqrt |
| 对数按钮 | Text | log |
| 退格按钮 | Text | ← |
| 清除按钮 | Text | C |
| M+按钮 | Text | M+ |
| M-按钮 | Text | M- |
| MS按钮 | Text | MS |
| 结果文本框 | Multiline | True |
| 内存文本框 | ReadOnly | True |
窗体程序代码:
```csharp
using System;
using System.Collections.Generic;
using System.Windows.Forms;
namespace Calculator
{
public partial class Form1 : Form
{
private List<string> expression = new List<string>(); // 存储逆波兰式表达式
private double memory = 0; // 存储内存中的值
public Form1()
{
InitializeComponent();
}
// 数字按钮事件处理程序
private void numberButton_Click(object sender, EventArgs e)
{
Button button = sender as Button;
expression.Add(button.Text);
displayText.Text = string.Join(" ", expression);
}
// 运算符按钮事件处理程序
private void operationButton_Click(object sender, EventArgs e)
{
Button button = sender as Button;
expression.Add(button.Text);
displayText.Text = string.Join(" ", expression);
}
// 正弦按钮事件处理程序
private void sinButton_Click(object sender, EventArgs e)
{
expression.Add("sin");
displayText.Text = string.Join(" ", expression);
}
// 余弦按钮事件处理程序
private void cosButton_Click(object sender, EventArgs e)
{
expression.Add("cos");
displayText.Text = string.Join(" ", expression);
}
// 平方按钮事件处理程序
private void squareButton_Click(object sender, EventArgs e)
{
expression.Add("^2");
displayText.Text = string.Join(" ", expression);
}
// 开方按钮事件处理程序
private void sqrtButton_Click(object sender, EventArgs e)
{
expression.Add("sqrt");
displayText.Text = string.Join(" ", expression);
}
// 对数按钮事件处理程序
private void logButton_Click(object sender, EventArgs e)
{
expression.Add("log");
displayText.Text = string.Join(" ", expression);
}
// 退格按钮事件处理程序
private void backButton_Click(object sender, EventArgs e)
{
if (expression.Count > 0)
{
expression.RemoveAt(expression.Count - 1);
displayText.Text = string.Join(" ", expression);
}
}
// 清除按钮事件处理程序
private void clearButton_Click(object sender, EventArgs e)
{
expression.Clear();
displayText.Text = "";
}
// M+按钮事件处理程序
private void memoryPlusButton_Click(object sender, EventArgs e)
{
memory += double.Parse(displayText.Text);
memoryText.Text = memory.ToString();
}
// M-按钮事件处理程序
private void memoryMinusButton_Click(object sender, EventArgs e)
{
memory -= double.Parse(displayText.Text);
memoryText.Text = memory.ToString();
}
// MS按钮事件处理程序
private void memorySaveButton_Click(object sender, EventArgs e)
{
memory = double.Parse(displayText.Text);
memoryText.Text = memory.ToString();
}
// 等号按钮事件处理程序
private void equalsButton_Click(object sender, EventArgs e)
{
Stack<double> stack = new Stack<double>();
foreach (string token in expression)
{
if (double.TryParse(token, out double number))
{
stack.Push(number);
}
else if (token == "sin")
{
stack.Push(Math.Sin(stack.Pop()));
}
else if (token == "cos")
{
stack.Push(Math.Cos(stack.Pop()));
}
else if (token == "^2")
{
stack.Push(Math.Pow(stack.Pop(), 2));
}
else if (token == "sqrt")
{
stack.Push(Math.Sqrt(stack.Pop()));
}
else if (token == "log")
{
stack.Push(Math.Log10(stack.Pop()));
}
else
{
double rightOperand = stack.Pop();
double leftOperand = stack.Pop();
switch (token)
{
case "+":
stack.Push(leftOperand + rightOperand);
break;
case "-":
stack.Push(leftOperand - rightOperand);
break;
case "*":
stack.Push(leftOperand * rightOperand);
break;
case "/":
stack.Push(leftOperand / rightOperand);
break;
}
}
}
displayText.Text = stack.Pop().ToString();
}
}
}
```