基于WPF的科学计算器程序
基于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的科学计算器程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ubuntu安装Beyond Compa
- 下一篇: 翡翠手链更能够突显佩戴者的非凡气质