基于WPF的科学计算器程序

  • 1.前言
  • 2.界面展示
    • 2.1标准计算器界面
    • 2.2科学计算器界面
  • 3.功能分析
  • 4.代码实现
    • 4.1窗体拖动
    • 4.2界面切换
    • 4.3运算符优先级
    • 4.4功能函数
  • 5.结语

1.前言

Windows实验课程需要根据老师发布的文档选择一个项目完成,考虑复习月时间比较紧张以及项目的可行性,因此选择了计算器程序。
        本次实验利用WPF构建程序界面,调用dll进行运算,并在界面显示运算结果。在完成基本要求的前提下,实现了科学计算器的部分功能。
        PS:本实验所创建的窗体项目类型为:Windows窗体应用(.Net Framework),动态链接库项目类型为:类库(.Net Framework)(熟悉visual studio的盆友应该比较清楚)。

2.界面展示

本实验计算器程序的界面基于WPF,包含标准计算器和科学计算器两个界面,以扩大计算器程序的适用性。 标准计算器界面和科学计算器界面通过tabControl控件进行切换,方便快捷。界面上方左侧为本计算器程序的logo,即:“Calc”,为计算器英文简写。

2.1标准计算器界面

标准计算器界面背景设置为黑色,不同区域的按钮设置为不同的颜色,给人更直观的视觉效果。由于隐藏了窗体状态栏,因此将退出程序的功能集成为程序按钮的点击事件,即“Exit”按钮;直接点击鼠标左键滑动,即可拖动窗体,以改变窗体的位置。
        该计算器程序总体风格仿照苹果手机端计算器,布局方面运用到了Grid以及Grid的嵌套,以实现区域的划分以及按钮的对齐。如上图所示,文本框设置为两个,分别显示历史输入以及当前输入。在xmal文件中定义了按钮的样式,使按钮的形状变为圆形,同时赋予了按钮点击时的动作反馈,即点击时按钮颜色发生变化,增强了人机交互性。

2.2科学计算器界面

科学计算器在标准计算器的基础上增加了很多新的功能,比如:三角函数、次方、开根号、阶乘等,因此额外添加了一些新的按键。值得一提的是,由于使用了tabControl控件,科学计算器界面无法重用标准计算器界面定义的输入栏以及按钮。科学计算器界面按钮排布为:7×5,同样的,给不同区域的按钮赋予了不同的颜色。
        由于科学计算器功能较多,全部功能均表现在界面上,容易导致界面按钮过多,很不美观。因此,这里借鉴了已有的方案,即设置第二功能键,点击“2nd”按钮,切换部分按键的功能,在实现扩展功能的同时,兼顾界面的视觉效果。

3.功能分析

功能分析这部分就不写那么详细了(其实是比较懒,实验报告上肯定不能怠慢),总结一下实现的功能吧:基本算术运算、数据类型兼容(整形、浮点型)、正负数、小括号、取余运算、三角函数、反三角函数、次方开方运算、对数阶乘运算以及删除回退和错误提示的功能,大概就这样。
        放几张图看一下吧(放太多的话读着可能不太方便,这里就放三张吧):


4.代码实现

OKK,终于到代码了,这个实验虽然简单但代码还是不少了,全部贴出来估计看的人也会抓狂吧,因此这里简要分析一下关键代码,有助于大家理解整个项目,本实验全部代码放在Github。

4.1窗体拖动

本次实验,为了美化窗体,去除了窗体状态栏,因此需要实现窗体拖动的方法。

        //状态栏隐藏后窗体拖动private void Window_MouseMove(object sender, MouseEventArgs e){//解决此报错:调度程序进程已挂起,但消息仍在处理中if (e.LeftButton == MouseButtonState.Pressed)  {Dispatcher.BeginInvoke(new Action(() => {this.DragMove();}));}}

4.2界面切换

本项目实现了标准计算器和科学计算器,当进行切换时,为了重用标准计算器的按钮点击事件,需要对文本框进行赋值。

      //当选项卡发生变化时private void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e){if (tabControl.SelectedIndex == 0)  //界面一,即标准计算器{this.Result = TempResult;this.Input = TempInut;}if (tabControl.SelectedIndex == 1)  //界面二,即科学计算器{this.Result = this.Result1;this.Input = this.Input1;}
}

4.3运算符优先级

根据运算符类型返回运算符的优先级,用于确定运算符的入栈顺序。

        private int OperatorLevel(string op)  //返回运算符优先级{int level = 0;switch (op){case "+": level = 0; break;case "-": level = 0; break;case "*": level = 1; break;case "/": level = 1; break;case "%": level = 1; break;case "1/x": level = 1; break;case "^": level = 2; break;case "!": level = 3; break;case "√": level = 3; break;case "log(":case "ln(":case "sin(":case "cos(":case "tan(":case "sin-1(":case "cos-1(":case "tan-1(": level = 4; break;}return level;}

4.4功能函数

算法逻辑实现部分需要分析界面输入的数据,将数字放入数字栈,将运算符放入符号栈,因此需要判断某一字符串是否为数字。

        private bool isNumberic(string value)  //判断元素是否为数字{if (value == "e" || value == "π")  //圆周率return true;for (int i = 0; i < value.Length; i++){if (i == 0){if (!isNumber(value[i])){if ((value[i] == '+' || value[i] == '-') && value.Length != 1)continue;elsereturn false;}}else{if (!isNumber(value[i]))return false;}}return true;}private bool isNumber(char value){if ('0' <= value && value <= '9' || value == '.')return true;return false;}

5.结语

本项目还有一些可以改进的地方,比如增加错误提示的类型,本实验错误提示仅有:“Divisor cannot be zero”、“Invalid input”以及“Error”。
        另一点是本项目可以新增一个界面——程序员计算器,新增界面很简单,即对tabControl新增一个item,然后进行按键的布局以及功能的实现。由于当时复习时间有限,就没有做这个界面,大家有兴趣可以尝试一下。
        PS:窗体应用项目        算法实现项目

基于WPF的科学计算器程序相关推荐

  1. AVR单片机计算器C语言源程序,一个基于AVR单片机的计算器程序.doc

    一个基于AVR单片机的计算器程序 #include #include//延时函数的头文件 #include // 中断函数的头文件 #define uint unsigned int #define ...

  2. 基于qt的计算机论文,基于qt的科学计算器的设计与实现本科毕业论文.doc

    基于qt的科学计算器的设计与实现 摘 要 随着科技的飞速发展,人类已经进入信息化的大时代.信息技术发展更是日新月异,计算器已经进入而且融入人们生活的各个领域,在现代生活中无处不在,大型复杂的计算是人脑 ...

  3. 基于avaSwing开发普通计算器程序 课程设计 大作业源码

    基于avaSwing开发普通计算器程序:   (大作业) 开发环境: Windows操作系统 开发工具: MyEclipse+Jdk 运行效果图: 基于avaSwing开发普通计算器程序:   (大作 ...

  4. 能计算x的计算机软件,访问Mac OS X中的科学计算器程序员计算器 | MOS86

    Mac计算机应用程序乍一看可能会有些限制,但实际上还有其他两个计算器模式包含在应用程序中;一个全功能的科学计算器,还有一个程序员计算器. 在OS X中访问备用计算器真的很简单,但像许多其他有趣的计算器 ...

  5. 基于Android的科学计算器设计

    资源下载地址:https://download.csdn.net/download/sheziqiong/85721857 科学计算器 一.产品概述 计算器: 它是一个拥有扁平化优雅用户界面的科学计算 ...

  6. 基于WPF+XMPP的IM程序开发日志 之二 WPF线程模型

    循例地在开始正文前说些废话.正如这篇博客的题目--开发日志,这系列的博客是我在编写这个IM的一些日志,或者另外一个说法:笔记.并不是一些系统的文章,例如"XX学习教程".这些博客里 ...

  7. mega16单片机c语言编程,mega16单片机科学计算器程序源代码

    描述 支持最大八位的无符号长整型数值计算 #include<iom16v.h> #include<macros.h> //#include<stdio.h> #de ...

  8. 科学计算机如何算加减乘除,mega16单片机科学计算器程序(带有加减乘除功能)初步收尾了...

    支持最大八位的无符号长整型数值计算,后期会添加带符号运算及其它计算功能. #include #include //#include #define uchar unsigned char #defin ...

  9. 计算机自带的科学计算器代码,[置顶] 科学计算器(简化版:基于MFC对话框)

    科学计算器(简化版) 最终界面: 全部源代码下载地址: 链接: http://download.csdn.net/detail/u012339743/8198227 详细编写过程: 1.    打开V ...

最新文章

  1. 跟你聊得这么投缘,你却说自己不是人?!
  2. 【Tools】WireShark3.2安装教程详解
  3. java重置_JAVA復制數組和重置數組大小
  4. lvs系列之dr(二)
  5. P3565 [POI2014]HOT-Hotels(树形dp+长链剖分)
  6. Web前端行业的了解
  7. 训练不出结果_训练赛惨败SKT?FPX直播透露拿冠军原因!Karsa再谈离开RNG?
  8. 用awk 取出ifconfig eth0中IP的方法
  9. Linux---基础指令
  10. 基于python的在线考试系统-基于Django的在线考试系统
  11. python标点符号全是英文吗_python 过滤中文、英文标点特殊符号
  12. [Tarjan四连] TarjanLCA
  13. tftp64工具使用
  14. 如何在MFC界面使用OCX控件
  15. 计算机二级python易错选择题汇总
  16. Windows快捷键大全(2020年版)
  17. 程序员缓解职业病的秘方
  18. 喜讯 | 人大金仓荣获行业信息化领航企业奖
  19. QOpenGLWidget空白不显示绘图内容
  20. Linux 服务器被黑后处理方法

热门文章

  1. 知识付费产品复购率低成难题
  2. 报错:java.lang.NullPointerException 空指针异常
  3. 软件能力成熟度模型(Capabilitymaturity model,CMM)
  4. 【树莓派】树莓派3B+搭建Ubuntu
  5. [POI2008]Mirror Trap
  6. 汽车智能化的商业化路径、产业演进及投资机会探讨——附下载链接
  7. 广东未来科技:书写立体显示事业传奇的行业独角兽
  8. Flutter 错误解决Building with plugins requires symlink support.
  9. iTunes无法验证服务器s.mzstatic.com的身份 服务器证书无效 解决办法
  10. 用python实现多线程爬取影视网站全部视频方法【笔记】