简易计算器(逆波兰算法)
来源:互联网 发布:姜文 王朔 知乎 编辑:程序博客网 时间:2024/05/11 23:03
开篇
开始学习C#了,接触的第一个程序设计就是计算器了。不过,目前所能实现的只能算是简单的了。
第一次看C#代码,觉得和其他语言有很多共通之处,感觉学习起来应该不难。但是后来了解的深的话,有些地方还是区别蛮大的。还要学习的还有很多。
习惯看C/C++程序运行后的窗口后,看到C#窗体时,难免有点激动,毕竟不再那么黑黑得了。感觉比较友好。
计算器程序代码
XAML
<Window x:Class="计算器_逆波兰.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="421.642" Width="639.925"> <Grid Margin="10,0,2,-2"> <Grid.ColumnDefinitions> <ColumnDefinition/> <ColumnDefinition Width="0*"/> </Grid.ColumnDefinitions> <Button Content="8" HorizontalAlignment="Left" Margin="181,71,0,0" VerticalAlignment="Top" Width="109" Height="38" Click="Button_Click_2"/> <Button Content="9" HorizontalAlignment="Left" Margin="306,71,0,0" VerticalAlignment="Top" Width="109" Height="38" Click="Button_Click_3"/> <Button Content="+" HorizontalAlignment="Left" Margin="446,71,0,0" VerticalAlignment="Top" Width="109" Height="38" Click="Button_Click_13"/> <Button Content="4" HorizontalAlignment="Left" Margin="41,134,0,0" VerticalAlignment="Top" Width="109" Height="38" Click="Button_Click_4"/> <Button Content="5" HorizontalAlignment="Left" Margin="181,134,0,0" VerticalAlignment="Top" Width="109" Height="38" Click="Button_Click_5"/> <Button Content="6" HorizontalAlignment="Left" Margin="306,134,0,0" VerticalAlignment="Top" Width="109" Height="38" Click="Button_Click_6"/> <Button Content="-" HorizontalAlignment="Left" Margin="446,134,0,0" VerticalAlignment="Top" Width="109" Height="38" Click="Button_Click_14"/> <Button Content="1
" HorizontalAlignment="Left" Margin="41,202,0,0" VerticalAlignment="Top" Width="109" Height="38" Click="Button_Click_7"/> <Button Content="2
" HorizontalAlignment="Left" Margin="181,202,0,0" VerticalAlignment="Top" Width="109" Height="38" Click="Button_Click_8"/> <Button Content="3" HorizontalAlignment="Left" Margin="306,202,0,0" VerticalAlignment="Top" Width="109" Height="38" Click="Button_Click_9"/> <Button Content="*" HorizontalAlignment="Left" Margin="446,202,0,0" VerticalAlignment="Top" Width="109" Height="38" Click="Button_Click_15"/> <Button Content="7" HorizontalAlignment="Left" Margin="41,71,0,0" VerticalAlignment="Top" Width="109" Height="38" Click="Button_Click_1"/> <Button Content=")" HorizontalAlignment="Left" Margin="306,335,0,0" VerticalAlignment="Top" Width="109" Height="38" Click="Button_Click_12"/> <Button Content="/" HorizontalAlignment="Left" Margin="446,276,0,0" VerticalAlignment="Top" Width="109" Height="38" Click="Button_Click_16"/> <Button Content="." HorizontalAlignment="Left" Margin="41,276,0,0" VerticalAlignment="Top" Width="109" Height="38" Click="Button_Click_10"/> <Button Content="计算" HorizontalAlignment="Left" Margin="41,335,0,0" VerticalAlignment="Top" Width="109" Height="38" Click="Button_Click_18"/> <Button Content="清除" HorizontalAlignment="Left" Margin="181,335,0,0" VerticalAlignment="Top" Width="109" Height="38" RenderTransformOrigin="2.56,5.632" Click="Button_Click_17"/> <TextBox x:Name="textBox1" HorizontalAlignment="Left" Height="36" Margin="41,21,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="514"/> <Button Content="退出" HorizontalAlignment="Left" Margin="446,335,0,0" VerticalAlignment="Top" Width="109" Height="38" Click="Button_Click_19"/> <Button Content="(" HorizontalAlignment="Left" Margin="306,276,0,0" VerticalAlignment="Top" Width="109" Height="38" Click="Button_Click_11" RenderTransformOrigin="1.468,2.289"/> <Button Content="0" HorizontalAlignment="Left" Margin="181,276,0,0" VerticalAlignment="Top" Width="109" Height="38" Click="Button_Click_20"/> </Grid></Window>
xaml.cs
/*************************** * 作者:mzl * *************************/using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows;using System.Windows.Controls;using System.Windows.Data;using System.Windows.Documents;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Imaging;using System.Windows.Navigation;using System.Windows.Shapes;namespace 计算器_逆波兰{ /// <summary> /// MainWindow.xaml 的交互逻辑 /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private void Button_Click_1(object sender, RoutedEventArgs e) { if (textBox1.Text == "0") { textBox1.Text = "7"; } else { textBox1.Text += "7"; } } private void Button_Click_2(object sender, RoutedEventArgs e) { if (textBox1.Text == "0") { textBox1.Text = "8"; } else { textBox1.Text += "8"; } } private void Button_Click_3(object sender, RoutedEventArgs e) { if (textBox1.Text == "0") { textBox1.Text = "9"; } else { textBox1.Text += "9"; } } private void Button_Click_4(object sender, RoutedEventArgs e) { if (textBox1.Text == "0") { textBox1.Text = "4"; } else { textBox1.Text += "4"; } } private void Button_Click_5(object sender, RoutedEventArgs e) { if (textBox1.Text == "0") { textBox1.Text = "5"; } else { textBox1.Text += "5"; } } private void Button_Click_6(object sender, RoutedEventArgs e) { if (textBox1.Text == "0") { textBox1.Text = "6"; } else { textBox1.Text += "6"; } } private void Button_Click_7(object sender, RoutedEventArgs e) { if (textBox1.Text == "0") { textBox1.Text = "1"; } else { textBox1.Text += "1"; } } private void Button_Click_8(object sender, RoutedEventArgs e) { if (textBox1.Text == "0") { textBox1.Text = "2"; } else { textBox1.Text += "2"; } } private void Button_Click_9(object sender, RoutedEventArgs e) { if (textBox1.Text == "0") { textBox1.Text = "3"; } else { textBox1.Text += "3"; } } private void Button_Click_10(object sender, RoutedEventArgs e) { if (textBox1.Text == "") textBox1.Text = "0"; else if (textBox1.Text.LastIndexOf(".") >= 0) MessageBox.Show("已经添加了小数点", "提示"); else { textBox1.Text = textBox1.Text + "."; } } private void Button_Click_11(object sender, RoutedEventArgs e) { textBox1.Text += "("; } private void Button_Click_12(object sender, RoutedEventArgs e) { textBox1.Text += ")"; } private void Button_Click_13(object sender, RoutedEventArgs e) { textBox1.Text += "+"; } private void Button_Click_14(object sender, RoutedEventArgs e) { textBox1.Text += "-"; } private void Button_Click_15(object sender, RoutedEventArgs e) { textBox1.Text += "*"; } private void Button_Click_16(object sender, RoutedEventArgs e) { textBox1.Text += "/"; } private void Button_Click_17(object sender, RoutedEventArgs e) { if(textBox1.Text.Length>0) textBox1.Text = textBox1.Text.Remove(textBox1.Text.Length - 1, 1); } private void Button_Click_18(object sender, RoutedEventArgs e) { try { string s1; double s2; s1 = textBox1.Text; s2 = Class1.Calucate(s1); textBox1.Text = s1.ToString() + "=" + s2.ToString(); } catch { MessageBox.Show("表达式格式不正确!"); } } private void Button_Click_19(object sender, RoutedEventArgs e) { this.Close(); } private void Button_Click_20(object sender, RoutedEventArgs e) { textBox1.Text += "0"; } }}
逆波兰算法类函数
/*************************** * 作者:mzl * *************************/using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace 计算器_逆波兰{ class Class1 { static Dictionary<char, int> priorities = null; const string operators = "+-*/"; static Class1() { priorities = new Dictionary<char, int>(); priorities.Add('#', -1); priorities.Add('+', 0); priorities.Add('-', 0); priorities.Add('*', 1); priorities.Add('/', 1); } static double Compute(double leftNum, double rightNum, char op) { switch (op) { case '+': return leftNum + rightNum; case '-': return leftNum - rightNum; case '*': return leftNum * rightNum; case '/': return leftNum / rightNum; default: return 0; } } static bool IsOperator(char op) { return operators.IndexOf(op) >= 0; } static bool IsLeftAssoc(char op) { return op == '+' || op == '-' || op == '*' || op == '/'; } static Queue<object> PreOrderToPostOrder(string expression) { var result = new Queue<object>(); var operatorStack = new Stack<char>(); operatorStack.Push('#'); char top, cur, tempChar; string tempNum; if (expression[0] == '-') expression = '0' + expression; for (int i = 0, j; i < expression.Length; ) { cur = expression[i++]; top = operatorStack.Peek(); if (cur == '(') { operatorStack.Push(cur); } else { if (IsOperator(cur)) { while (IsOperator(top) && ((IsLeftAssoc(cur) && priorities[cur] <= priorities[top])) || (!IsLeftAssoc(cur) && priorities[cur] < priorities[top])) { result.Enqueue(operatorStack.Pop()); top = operatorStack.Peek(); } operatorStack.Push(cur); } else if (cur == ')') { while (operatorStack.Count > 0 && (tempChar = operatorStack.Pop()) != '(') { result.Enqueue(tempChar); } } else { tempNum = "" + cur; j = i; while (j < expression.Length && (expression[j] == '.' || (expression[j] >= '0' && expression[j] <= '9'))) { tempNum += expression[j++]; } i = j; result.Enqueue(tempNum); } } } while (operatorStack.Count > 0) { cur = operatorStack.Pop(); if (cur == '#') continue; if (operatorStack.Count > 0) { top = operatorStack.Peek(); } result.Enqueue(cur); } return result; } static public double Calucate(string expression) { var rpn = PreOrderToPostOrder(expression); var operandStack = new Stack<double>(); double left, right; object cur; while (rpn.Count > 0) { cur = rpn.Dequeue(); if (cur is char) { right = operandStack.Pop(); left = operandStack.Pop(); operandStack.Push(Compute(left, right, (char)cur)); } else { operandStack.Push(double.Parse(cur.ToString())); } } return operandStack.Pop(); } }}
效果图
0 0
- 简易计算器(逆波兰算法)
- 简易计算器(核心算法就是Shutting-Yard, 逆波兰式)
- 计算器之逆波兰算法
- 栈的应用之简易逆波兰计算器
- 逆波兰计算器(C语言)
- 逆波兰计算器(C语言)
- (未完)逆波兰计算器功能分层:
- 计算器(逆波兰运算表达式)
- 逆波兰计算器
- 计算器 | 逆波兰表达式
- 逆波兰实现计算器
- 简单逆波兰计算器
- 逆波兰计算器
- 逆波兰表达式计算器
- 逆波兰计算器
- 逆波兰计算器
- 逆波兰计算器
- 逆波兰计算器:
- Tricks(四十六)—— 四个数中最小值的实现
- Leetcode #62. Unique Paths 路径搜寻 解题报告
- Android解惑 - 为什么要用Fragment.setArguments(Bundle bundle)来传递参数
- 面试之路(23)-递归和循环优缺点详解
- Hibernate多对多中间表有多个字段字段的注解配置方式(二)
- 简易计算器(逆波兰算法)
- SDAU dp专题 1003
- Hibernate多对多中间表有多个字段字段的注解配置方式(三)
- Android进程
- KMP模板
- Android ActionBar的基本用法
- 浅谈:自步学习(Self-Paced Learning)
- 202. Happy Number
- 23.Maven 项目介绍 - IntelliJ IDEA 使用教程