1. 前端界面
<Window x:Class="CSDN_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:CSDN_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 CSDN_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}";
}
}
}