简易计算器(逆波兰算法)

来源:互联网 发布:姜文 王朔 知乎 编辑:程序博客网 时间: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&#xD;&#xA;" HorizontalAlignment="Left" Margin="41,202,0,0" VerticalAlignment="Top" Width="109" Height="38" Click="Button_Click_7"/>        <Button Content="2&#xD;&#xA;" 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
原创粉丝点击