1. 前端界面
< Window x: Class= " Cal.MainWindow" xmlns = " http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns: x= " http://schemas.microsoft.com/winfx/2006/xaml" xmlns: d= " http://schemas.microsoft.com/expression/blend/2008" xmlns: mc= " http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns: local= " clr-namespace:Cal" mc: Ignorable= " d" Title = " 科学计算器" Height = " 600" Width = " 400" WindowStartupLocation = " CenterScreen" ResizeMode = " NoResize" > < Window.Resources> < Style TargetType = " Button" > <Setter Property="FontSize" Value="20" /><Setter Property="Margin" Value="5" /><Setter Property="Background" Value="#FF333333" /><Setter Property="Foreground" Value="White" /><Setter Property="BorderThickness" Value="0" /><Setter Property="BorderBrush" Value="#FF555555" /> </ Style> </ Window.Resources> < Grid Background = " #FF222222" > < Grid.RowDefinitions> < RowDefinition Height = " Auto" /> < RowDefinition Height = " *" /> </ Grid.RowDefinitions> < Border Grid.Row = " 0" Background = " #FF111111" Padding = " 10,10,10,10" Margin = " 10,10,10,10" > < StackPanel> < TextBlock x: Name= " txtHistory" Foreground = " #FFAAAAAA" FontSize = " 16" HorizontalAlignment = " Right" Margin = " 0,0,0,5" /> < TextBlock x: Name= " txtDisplay" Foreground = " White" FontSize = " 36" HorizontalAlignment = " Right" Text = " 0" /> </ StackPanel> </ Border> < Grid Grid.Row = " 1" Margin = " 10" > < Grid.RowDefinitions> < RowDefinition Height = " *" /> < RowDefinition Height = " *" /> < RowDefinition Height = " *" /> < RowDefinition Height = " *" /> < RowDefinition Height = " *" /> < RowDefinition Height = " *" /> </ Grid.RowDefinitions> < Grid.ColumnDefinitions> < ColumnDefinition Width = " *" /> < ColumnDefinition Width = " *" /> < ColumnDefinition Width = " *" /> < ColumnDefinition Width = " *" /> < ColumnDefinition Width = " *" /> </ Grid.ColumnDefinitions> < Button x: Name= " btnClear" Grid.Row = " 1" Grid.Column = " 0" Content = " C" Background = " #FFAA0000" /> < Button x: Name= " btnBack" Grid.Row = " 1" Grid.Column = " 1" Content = " ⌫" /> < Button x: Name= " btnPercent" Grid.Row = " 1" Grid.Column = " 2" Content = " %" /> < Button x: Name= " btnDivide" Grid.Row = " 1" Grid.Column = " 3" Content = " /" Background = " #FF555555" /> < Button x: Name= " btnSqrt" Grid.Row = " 1" Grid.Column = " 4" Content = " √" Background = " #FF555555" /> < Button x: Name= " btnTan" Grid.Row = " 0" Grid.Column = " 0" Content = " tan" Background = " #FF555555" /> < Button x: Name= " btnLog" Grid.Row = " 0" Grid.Column = " 1" Content = " log" Background = " #FF555555" /> < Button x: Name= " btnLn" Grid.Row = " 0" Grid.Column = " 2" Content = " ln" Background = " #FF555555" /> < Button x: Name= " btnPi" Grid.Row = " 0" Grid.Column = " 3" Content = " π" Background = " #FF555555" /> < Button x: Name= " btnFactorial" Grid.Row = " 0" Grid.Column = " 4" Content = " n!" Background = " #FF555555" /> < Button x: Name= " btn7" Grid.Row = " 2" Grid.Column = " 0" Content = " 7" /> < Button x: Name= " btn8" Grid.Row = " 2" Grid.Column = " 1" Content = " 8" /> < Button x: Name= " btn9" Grid.Row = " 2" Grid.Column = " 2" Content = " 9" /> < Button x: Name= " btnMultiply" Grid.Row = " 2" Grid.Column = " 3" Content = " ×" Background = " #FF555555" /> < Button x: Name= " btnPower" Grid.Row = " 2" Grid.Column = " 4" Content = " x^y" Background = " #FF555555" /> < Button x: Name= " btn4" Grid.Row = " 3" Grid.Column = " 0" Content = " 4" /> < Button x: Name= " btn5" Grid.Row = " 3" Grid.Column = " 1" Content = " 5" /> < Button x: Name= " btn6" Grid.Row = " 3" Grid.Column = " 2" Content = " 6" /> < Button x: Name= " btnSubtract" Grid.Row = " 3" Grid.Column = " 3" Content = " -" Background = " #FF555555" /> < Button x: Name= " btnSin" Grid.Row = " 3" Grid.Column = " 4" Content = " sin" Background = " #FF555555" /> < Button x: Name= " btn1" Grid.Row = " 4" Grid.Column = " 0" Content = " 1" /> < Button x: Name= " btn2" Grid.Row = " 4" Grid.Column = " 1" Content = " 2" /> < Button x: Name= " btn3" Grid.Row = " 4" Grid.Column = " 2" Content = " 3" /> < Button x: Name= " btnAdd" Grid.Row = " 4" Grid.Column = " 3" Content = " +" Background = " #FF555555" /> < Button x: Name= " btnCos" Grid.Row = " 4" Grid.Column = " 4" Content = " cos" Background = " #FF555555" /> < Button x: Name= " btn0" Grid.Row = " 5" Grid.Column = " 0" Content = " 0" /> < Button x: Name= " btnDecimal" Grid.Row = " 5" Grid.Column = " 1" Content = " ." /> < Button x: Name= " btnPlusMinus" Grid.Row = " 5" Grid.Column = " 2" Content = " ±" /> < Button x: Name= " btnEquals" Grid.Row = " 5" Grid.Column = " 3" Grid.ColumnSpan = " 2" Content = " =" Background = " #FF007ACC" /> </ Grid> </ Grid>
</ Window>
2. 功能代码
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 Cal
{ public partial class MainWindow : Window { private string currentInput = "0" ; private string previousInput = "" ; private string operation = "" ; private bool newInput = true ; private bool operationPerformed = false ; public MainWindow ( ) { InitializeComponent ( ) ; btn0. Click += NumberButton_Click; btn1. Click += NumberButton_Click; btn2. Click += NumberButton_Click; btn3. Click += NumberButton_Click; btn4. Click += NumberButton_Click; btn5. Click += NumberButton_Click; btn6. Click += NumberButton_Click; btn7. Click += NumberButton_Click; btn8. Click += NumberButton_Click; btn9. Click += NumberButton_Click; btnAdd. Click += OperatorButton_Click; btnSubtract. Click += OperatorButton_Click; btnMultiply. Click += OperatorButton_Click; btnDivide. Click += OperatorButton_Click; btnEquals. Click += EqualsButton_Click; btnClear. Click += ClearButton_Click; btnBack. Click += BackButton_Click; btnDecimal. Click += DecimalButton_Click; btnPlusMinus. Click += PlusMinusButton_Click; btnPercent. Click += PercentButton_Click; btnSqrt. Click += ScientificButton_Click; btnPower. Click += ScientificButton_Click; btnSin. Click += ScientificButton_Click; btnCos. Click += ScientificButton_Click; btnTan. Click += ScientificButton_Click; btnLog. Click += ScientificButton_Click; btnLn. Click += ScientificButton_Click; btnPi. Click += ScientificButton_Click; btnFactorial. Click += ScientificButton_Click; } private void NumberButton_Click ( object sender, RoutedEventArgs e) { Button button = ( Button) sender; if ( currentInput == "0" || newInput) { currentInput = button. Content. ToString ( ) ; newInput = false ; } else { currentInput += button. Content. ToString ( ) ; } UpdateDisplay ( ) ; } private void OperatorButton_Click ( object sender, RoutedEventArgs e) { Button button = ( Button) sender; if ( ! newInput && ! operationPerformed) { Calculate ( ) ; } operation = button. Content. ToString ( ) ; previousInput = currentInput; newInput = true ; operationPerformed = false ; UpdateHistory ( ) ; } private void EqualsButton_Click ( object sender, RoutedEventArgs e) { Calculate ( ) ; operation = "" ; UpdateHistory ( ) ; newInput = true ; operationPerformed = true ; } private void Calculate ( ) { if ( string . IsNullOrEmpty ( previousInput) || string . IsNullOrEmpty ( operation) ) return ; double num1 = double . Parse ( previousInput) ; double num2 = double . Parse ( currentInput) ; double result = 0 ; switch ( operation) { case "+" : result = num1 + num2; break ; case "-" : result = num1 - num2; break ; case "×" : result = num1 * num2; break ; case "/" : result = num1 / num2; break ; } currentInput = result. ToString ( ) ; UpdateDisplay ( ) ; } private void ScientificButton_Click ( object sender, RoutedEventArgs e) { Button button = ( Button) sender; double num = double . Parse ( currentInput) ; double result = 0 ; switch ( button. Content. ToString ( ) ) { case "√" : result = Math. Sqrt ( num) ; break ; case "x^y" : previousInput = currentInput; operation = "^" ; newInput = true ; UpdateHistory ( ) ; return ; case "sin" : result = Math. Sin ( num * Math. PI / 180 ) ; break ; case "cos" : result = Math. Cos ( num * Math. PI / 180 ) ; break ; case "tan" : result = Math. Tan ( num * Math. PI / 180 ) ; break ; case "log" : result = Math. Log10 ( num) ; break ; case "ln" : result = Math. Log ( num) ; break ; case "π" : currentInput = Math. PI. ToString ( ) ; UpdateDisplay ( ) ; return ; case "n!" : result = Factorial ( ( int ) num) ; break ; } currentInput = result. ToString ( ) ; UpdateDisplay ( ) ; newInput = true ; } private int Factorial ( int n) { if ( n <= 1 ) return 1 ; return n * Factorial ( n - 1 ) ; } private void ClearButton_Click ( object sender, RoutedEventArgs e) { currentInput = "0" ; previousInput = "" ; operation = "" ; newInput = true ; UpdateDisplay ( ) ; txtHistory. Text = "" ; } private void BackButton_Click ( object sender, RoutedEventArgs e) { if ( currentInput. Length > 1 ) { currentInput = currentInput. Substring ( 0 , currentInput. Length - 1 ) ; } else { currentInput = "0" ; newInput = true ; } UpdateDisplay ( ) ; } private void DecimalButton_Click ( object sender, RoutedEventArgs e) { if ( ! currentInput. Contains ( "." ) ) { currentInput += "." ; UpdateDisplay ( ) ; } } private void PlusMinusButton_Click ( object sender, RoutedEventArgs e) { if ( currentInput != "0" ) { if ( currentInput. StartsWith ( "-" ) ) { currentInput = currentInput. Substring ( 1 ) ; } else { currentInput = "-" + currentInput; } UpdateDisplay ( ) ; } } private void PercentButton_Click ( object sender, RoutedEventArgs e) { double num = double . Parse ( currentInput) ; currentInput = ( num / 100 ) . ToString ( ) ; UpdateDisplay ( ) ; } private void UpdateDisplay ( ) { txtDisplay. Text = currentInput; } private void UpdateHistory ( ) { txtHistory. Text = $" { previousInput } { operation } " ; } }
}
3. 效果展示