基于WPF的科学计算器程序
基于WPF的科學(xué)計(jì)算器程序
- 1.前言
- 2.界面展示
- 2.1標(biāo)準(zhǔn)計(jì)算器界面
- 2.2科學(xué)計(jì)算器界面
- 3.功能分析
- 4.代碼實(shí)現(xiàn)
- 4.1窗體拖動(dòng)
- 4.2界面切換
- 4.3運(yùn)算符優(yōu)先級(jí)
- 4.4功能函數(shù)
- 5.結(jié)語(yǔ)
1.前言
????????Windows實(shí)驗(yàn)課程需要根據(jù)老師發(fā)布的文檔選擇一個(gè)項(xiàng)目完成,考慮復(fù)習(xí)月時(shí)間比較緊張以及項(xiàng)目的可行性,因此選擇了計(jì)算器程序。
????????本次實(shí)驗(yàn)利用WPF構(gòu)建程序界面,調(diào)用dll進(jìn)行運(yùn)算,并在界面顯示運(yùn)算結(jié)果。在完成基本要求的前提下,實(shí)現(xiàn)了科學(xué)計(jì)算器的部分功能。
????????PS:本實(shí)驗(yàn)所創(chuàng)建的窗體項(xiàng)目類型為:Windows窗體應(yīng)用(.Net Framework),動(dòng)態(tài)鏈接庫(kù)項(xiàng)目類型為:類庫(kù)(.Net Framework)(熟悉visual studio的盆友應(yīng)該比較清楚)。
2.界面展示
????????本實(shí)驗(yàn)計(jì)算器程序的界面基于WPF,包含標(biāo)準(zhǔn)計(jì)算器和科學(xué)計(jì)算器兩個(gè)界面,以擴(kuò)大計(jì)算器程序的適用性。 標(biāo)準(zhǔn)計(jì)算器界面和科學(xué)計(jì)算器界面通過(guò)tabControl控件進(jìn)行切換,方便快捷。界面上方左側(cè)為本計(jì)算器程序的logo,即:“Calc”,為計(jì)算器英文簡(jiǎn)寫(xiě)。
2.1標(biāo)準(zhǔn)計(jì)算器界面
????????標(biāo)準(zhǔn)計(jì)算器界面背景設(shè)置為黑色,不同區(qū)域的按鈕設(shè)置為不同的顏色,給人更直觀的視覺(jué)效果。由于隱藏了窗體狀態(tài)欄,因此將退出程序的功能集成為程序按鈕的點(diǎn)擊事件,即“Exit”按鈕;直接點(diǎn)擊鼠標(biāo)左鍵滑動(dòng),即可拖動(dòng)窗體,以改變窗體的位置。
????????該計(jì)算器程序總體風(fēng)格仿照蘋(píng)果手機(jī)端計(jì)算器,布局方面運(yùn)用到了Grid以及Grid的嵌套,以實(shí)現(xiàn)區(qū)域的劃分以及按鈕的對(duì)齊。如上圖所示,文本框設(shè)置為兩個(gè),分別顯示歷史輸入以及當(dāng)前輸入。在xmal文件中定義了按鈕的樣式,使按鈕的形狀變?yōu)閳A形,同時(shí)賦予了按鈕點(diǎn)擊時(shí)的動(dòng)作反饋,即點(diǎn)擊時(shí)按鈕顏色發(fā)生變化,增強(qiáng)了人機(jī)交互性。
2.2科學(xué)計(jì)算器界面
????????科學(xué)計(jì)算器在標(biāo)準(zhǔn)計(jì)算器的基礎(chǔ)上增加了很多新的功能,比如:三角函數(shù)、次方、開(kāi)根號(hào)、階乘等,因此額外添加了一些新的按鍵。值得一提的是,由于使用了tabControl控件,科學(xué)計(jì)算器界面無(wú)法重用標(biāo)準(zhǔn)計(jì)算器界面定義的輸入欄以及按鈕。科學(xué)計(jì)算器界面按鈕排布為:7×5,同樣的,給不同區(qū)域的按鈕賦予了不同的顏色。
????????由于科學(xué)計(jì)算器功能較多,全部功能均表現(xiàn)在界面上,容易導(dǎo)致界面按鈕過(guò)多,很不美觀。因此,這里借鑒了已有的方案,即設(shè)置第二功能鍵,點(diǎn)擊“2nd”按鈕,切換部分按鍵的功能,在實(shí)現(xiàn)擴(kuò)展功能的同時(shí),兼顧界面的視覺(jué)效果。
3.功能分析
????????功能分析這部分就不寫(xiě)那么詳細(xì)了(其實(shí)是比較懶,實(shí)驗(yàn)報(bào)告上肯定不能怠慢),總結(jié)一下實(shí)現(xiàn)的功能吧:基本算術(shù)運(yùn)算、數(shù)據(jù)類型兼容(整形、浮點(diǎn)型)、正負(fù)數(shù)、小括號(hào)、取余運(yùn)算、三角函數(shù)、反三角函數(shù)、次方開(kāi)方運(yùn)算、對(duì)數(shù)階乘運(yùn)算以及刪除回退和錯(cuò)誤提示的功能,大概就這樣。
????????放幾張圖看一下吧(放太多的話讀著可能不太方便,這里就放三張吧):
4.代碼實(shí)現(xiàn)
????????OKK,終于到代碼了,這個(gè)實(shí)驗(yàn)雖然簡(jiǎn)單但代碼還是不少了,全部貼出來(lái)估計(jì)看的人也會(huì)抓狂吧,因此這里簡(jiǎn)要分析一下關(guān)鍵代碼,有助于大家理解整個(gè)項(xiàng)目,本實(shí)驗(yàn)全部代碼放在Github。
4.1窗體拖動(dòng)
????????本次實(shí)驗(yàn),為了美化窗體,去除了窗體狀態(tài)欄,因此需要實(shí)現(xiàn)窗體拖動(dòng)的方法。
//狀態(tài)欄隱藏后窗體拖動(dòng)private void Window_MouseMove(object sender, MouseEventArgs e){//解決此報(bào)錯(cuò):調(diào)度程序進(jìn)程已掛起,但消息仍在處理中if (e.LeftButton == MouseButtonState.Pressed) {Dispatcher.BeginInvoke(new Action(() => {this.DragMove();}));}}4.2界面切換
????????本項(xiàng)目實(shí)現(xiàn)了標(biāo)準(zhǔn)計(jì)算器和科學(xué)計(jì)算器,當(dāng)進(jìn)行切換時(shí),為了重用標(biāo)準(zhǔn)計(jì)算器的按鈕點(diǎn)擊事件,需要對(duì)文本框進(jìn)行賦值。
//當(dāng)選項(xiàng)卡發(fā)生變化時(shí)private void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e){if (tabControl.SelectedIndex == 0) //界面一,即標(biāo)準(zhǔn)計(jì)算器{this.Result = TempResult;this.Input = TempInut;}if (tabControl.SelectedIndex == 1) //界面二,即科學(xué)計(jì)算器{this.Result = this.Result1;this.Input = this.Input1;} }4.3運(yùn)算符優(yōu)先級(jí)
????????根據(jù)運(yùn)算符類型返回運(yùn)算符的優(yōu)先級(jí),用于確定運(yùn)算符的入棧順序。
private int OperatorLevel(string op) //返回運(yùn)算符優(yōu)先級(jí){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功能函數(shù)
????????算法邏輯實(shí)現(xiàn)部分需要分析界面輸入的數(shù)據(jù),將數(shù)字放入數(shù)字棧,將運(yùn)算符放入符號(hào)棧,因此需要判斷某一字符串是否為數(shù)字。
private bool isNumberic(string value) //判斷元素是否為數(shù)字{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.結(jié)語(yǔ)
????????本項(xiàng)目還有一些可以改進(jìn)的地方,比如增加錯(cuò)誤提示的類型,本實(shí)驗(yàn)錯(cuò)誤提示僅有:“Divisor cannot be zero”、“Invalid input”以及“Error”。
????????另一點(diǎn)是本項(xiàng)目可以新增一個(gè)界面——程序員計(jì)算器,新增界面很簡(jiǎn)單,即對(duì)tabControl新增一個(gè)item,然后進(jìn)行按鍵的布局以及功能的實(shí)現(xiàn)。由于當(dāng)時(shí)復(fù)習(xí)時(shí)間有限,就沒(méi)有做這個(gè)界面,大家有興趣可以嘗試一下。
????????PS:窗體應(yīng)用項(xiàng)目????????算法實(shí)現(xiàn)項(xiàng)目
總結(jié)
以上是生活随笔為你收集整理的基于WPF的科学计算器程序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Ubuntu安装Beyond Compa
- 下一篇: 设计模式之桥接模式:如何实现抽象协议与不