文章目录C#实例 —— 设计一个科学计算器 (WPF界面实现)
- 前言
- 一、基本技术
- (一)C# 语言
- (二)WPF(Windows Presentation Foundation)
- 二、开发环境:Rider (.Net 开发神器)
- (一)简介
- (二)特点
- 1. 支持多种 .NET 项目类型
- 2. 功能丰富速度快
- 3. 跨平台
- 三、程序设计
- (一)xaml界面代码
- 1. MainWindow.xaml部分
- 2. App.xaml部分(Style样式)
- (二)MainWindow.xaml.cs 部分(C#后台代码)
- 四、运行效果(界面截图)
前言
计算器的系统功能在 “加” “减” “乘” “除” 等基本运算之上新增 “取余” “幂运算” “对数” “阶层” “三角函数” 等运算功能。
一、基本技术 (一)C# 语言
C#是由C和C++衍生出来的一种安全的、稳定的、简单的、优雅的面向对象编程语言。它在继承C和C++强大功能的同时去掉了一些它们的复杂特性(例如没有宏以及不允许多重继承)。C#综合了VB简单的可视化操作和C++的高运行效率,以其强大的操作能力、优雅的语法风格、创新的语言特性和便捷的面向组件编程的支持成为.NET开发的首选语言。
(二)WPF(Windows Presentation Foundation)WPF是微软新一代图形系统,运行在.NET Framework 3.0及以上版本下,为用户界面、2D/3D 图形、文档和媒体提供了统一的描述和操作方法。基于DirectX 9/10技术的WPF不仅带来了前所未有的3D界面,而且其图形向量渲染引擎也大大改进了传统的2D界面,比如Vista中的半透明效果的窗体等都得益于WPF。WPF相对于Windows客户端的开发来说,向前跨出了巨大的一步,它提供了超丰富的.NET UI 框架,集成了矢量图形,丰富的流动文字支持(flow text support),3D视觉效果和强大无比的控件模型框架。程序人员与美工人员明确分工,美工人员可以使用Expression Studio中套装工具可视化的设计界面。然后交给程序开发组中的XAML就可以。让程序人员直接套用到开发环境,不需要想页面怎么切了。而且您可以使用任何一种.Net编程语言(C#,VB NET等开发语言)进行开发。XAML主要针对界面的可视化控件描述,成生进会分析成 .cs或 .vb文件,并最后将编译为CLR中间运行语言。
二、开发环境:Rider (.Net 开发神器)多数人在进行 .Net 开发的时候首选的会是号称宇宙无敌第一的IDE —— Visio Studio,而因为笔者是JetBrains 的粉丝,同我们所熟知的IDEA以及PyCahrm一样,Rider也是JetBrains 旗下的一款产品,因此本人在进行开发的时候选择的是他们的 Rider 这款IDE。下图是本人在Rider开发的一个界面。
(一)简介JetBrains Rider 是一款基于 IntelliJ 平台和 ReSharper 的跨平台 .NET IDE。Rider 让您可以高效地开发广泛的应用程序,包括:.NET 桌面应用程序、服务和库、Unity 和 Unreal Engine 游戏、Xamarin 应用、ASP.NET 和 ASP.NET Core web 应用程序。
(二)特点 1. 支持多种 .NET 项目类型Rider 支持 .NET 框架、新的跨平台框架 .NET Core 和基于 Mono 的项目。 这使您可以开发广泛的应用程序,包括:.NET 桌面应用程序、服务和库、Unity 游戏、Xamarin 应用、ASP.NET 和 ASP.NET Core web 应用程序。
2. 功能丰富速度快Rider 提供 2200 多种活跃代码检查,数百种来自 ReSharper 的上下文操作和重构,并与 IntelliJ 平台可靠的 IDE 功能相结合。 除了丰富的功能集,Rider 的设计宗旨是轻量级、响应式。
3. 跨平台除了运行和调试多个运行时之外,Rider 本身还可以在多个平台上运行:Windows、macOS 和 Linux。
三、程序设计 (一)xaml界面代码 1. MainWindow.xaml部分2. App.xaml部分(Style样式)
(二)MainWindow.xaml.cs 部分(C#后台代码)
using System;
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Imaging;
namespace Scientific_Calculator
{
public partial class MainWindow
{
public MainWindow()
{//窗口类
InitializeComponent();
}
private string num1 = null; //运算符之前的数
private string num2 = null; //运算符之后的数
private string ope = null; //运算符
private void B7_OnClick(object sender, RoutedEventArgs e)
{//输入数字7
if (ope == null)
{//假如没有运算符,那就是输入运算符前的第一个数字
num1 += B7.Content;
MyText.Text = num1;
}
else
{//否则有运算符的情况下,输入的就是运算符之后的数字
num2 += B7.Content;
MyText.Text = num2;
}
}
private void B8_OnClick(object sender, RoutedEventArgs e)
{//输入数字8
if (ope == null)
{
num1 += B8.Content;
MyText.Text = num1;
}
else
{
num2 += B8.Content;
MyText.Text = num2;
}
}
private void B9_OnClick(object sender, RoutedEventArgs e)
{//输入数字9
if (ope == null)
{
num1 += B9.Content;
MyText.Text = num1;
}
else
{
num2 += B9.Content;
MyText.Text = num2;
}
}
private void B4_OnClick(object sender, RoutedEventArgs e)
{//输入数字4
if (ope == null)
{
num1 += B4.Content;
MyText.Text = num1;
}
else
{
num2 += B4.Content;
MyText.Text = num2;
}
}
private void B5_OnClick(object sender, RoutedEventArgs e)
{//输入数字5
if (ope == null)
{
num1 += B5.Content;
MyText.Text = num1;
}
else
{
num2 += B5.Content;
MyText.Text = num2;
}
}
private void B6_OnClick(object sender, RoutedEventArgs e)
{//输入数字6
if (ope == null)
{
num1 += B6.Content;
MyText.Text = num1;
}
else
{
num2 += B6.Content;
MyText.Text = num2;
}
}
private void B1_OnClick(object sender, RoutedEventArgs e)
{//输入数字1
if (ope == null)
{
num1 += B1.Content;
MyText.Text = num1;
}
else
{
num2 += B1.Content;
MyText.Text = num2;
}
}
private void B2_OnClick(object sender, RoutedEventArgs e)
{//输入数字2
if (ope == null)
{
num1 += B2.Content;
MyText.Text = num1;
}
else
{
num2 += B2.Content;
MyText.Text = num2;
}
}
private void B3_OnClick(object sender, RoutedEventArgs e)
{//输入数字3
if (ope == null)
{
num1 += B3.Content;
MyText.Text = num1;
}
else
{
num2 += B3.Content;
MyText.Text = num2;
}
}
private void BPeriod_OnClick(object sender, RoutedEventArgs e)
{//输入小数点
if (ope == null && !num1.Contains(".")) //如果num中已有小数点,则不允许再输入.
{
num1 += BPeriod.Content;
MyText.Text = num1;
}
if (ope != null && !num2.Contains("."))
{
num2 += BPeriod.Content;
MyText.Text = num2;
}
}
private void B0_OnClick(object sender, RoutedEventArgs e)
{//输入数字0
if (ope == null)
{
num1 += B0.Content;
MyText.Text = num1;
}
else
{
num2 += B0.Content;
MyText.Text = num2;
}
}
private void BPlus_OnClick(object sender, RoutedEventArgs e)
{//输入加号
ope = "+";
}
private void Minus_OnClick(object sender, RoutedEventArgs e)
{//输入减号
ope = "-";
}
private void Multiply_OnClick(object sender, RoutedEventArgs e)
{//输入乘号
ope = "*";
}
private void Devide_OnClick(object sender, RoutedEventArgs e)
{//输入除号
ope = "/";
}
private void Percent_OnClick(object sender, RoutedEventArgs e)
{//取余
ope = "%";
}
private void Hierarchy_OnClick(object sender, RoutedEventArgs e)
{//阶层
ope = "!";
}
private void Pow_OnClick(object sender, RoutedEventArgs e)
{//幂运算
ope = "pow";
}
private void Log_OnClick(object sender, RoutedEventArgs e)
{//取对数
ope = "log";
}
private void Sin_OnClick(object sender, RoutedEventArgs e)
{//正弦函数
ope = "sin";
}
private void Cos_OnClick(object sender, RoutedEventArgs e)
{//余弦函数
ope = "cos";
}
private void Tan_OnClick(object sender, RoutedEventArgs e)
{//正切函数
ope = "tan";
}
private void BC_OnClick(object sender, RoutedEventArgs e)
{//清除文本框所有内容
this.MyText.Text = "";
num1 = null;
num2 = null;
ope = null;
}
public static int fun(int n)
{//求阶层的递归函数
if (n < 1)
return 0;
if (n == 1)
return 1;
return n * fun(n - 1);
}
private void Amount_OnClick(object sender, RoutedEventArgs e)
{//点击等于号,进行数学运算
switch (ope)
{//进行数学运算,其中Convert是转换数据类型
case "+":
MyText.Text = Convert.ToString(Convert.ToDouble(num1) + Convert.ToDouble(num2));
break;
case "-":
MyText.Text = Convert.ToString(Convert.ToDouble(num1) - Convert.ToDouble(num2));
break;
case "*":
MyText.Text = Convert.ToString(Convert.ToDouble(num1) * Convert.ToDouble(num2));
break;
case "/":
MyText.Text = Convert.ToString(Convert.ToDouble(num1) / Convert.ToDouble(num2));
break;
case "%":
MyText.Text = Convert.ToString(Convert.ToDouble(num1) % Convert.ToDouble(num2));
break;
case "sin":
MyText.Text = Convert.ToString(Math.Sin(Math.PI * Convert.ToDouble(num1) / 180));
break;
case "cos":
MyText.Text = Convert.ToString(Math.Cos(Math.PI * Convert.ToDouble(num1) / 180));
break;
case "tan":
MyText.Text = Convert.ToString(Math.Tan(Math.PI * Convert.ToDouble(num1) / 180));
break;
case "pow":
MyText.Text = Convert.ToString(Math.Pow(Convert.ToDouble(num1),Convert.ToDouble(num2)));
break;
case "log":
MyText.Text = Convert.ToString(Math.Log(Convert.ToDouble(num1),Convert.ToDouble(num2)));
break;
case "!":
MyText.Text = Convert.ToString(fun(Convert.ToInt32(num1))); //调用求阶层的递归函数fun()
break;
}
num1 = MyText.Text;
num2 = null;
ope = null;
}
}
}
四、运行效果(界面截图)



