基于MFC的科學(xué)計算器課程設(shè)計實驗報告_第1頁
基于MFC的科學(xué)計算器課程設(shè)計實驗報告_第2頁
基于MFC的科學(xué)計算器課程設(shè)計實驗報告_第3頁
基于MFC的科學(xué)計算器課程設(shè)計實驗報告_第4頁
基于MFC的科學(xué)計算器課程設(shè)計實驗報告_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

浙江工商大學(xué)《C++課程設(shè)計》報告PAGE16課程設(shè)計實驗報告題目學(xué)院專業(yè)班級課程名稱學(xué)號學(xué)生姓名指導(dǎo)教師成 績二○一三年一月

目錄1概述1.1課程設(shè)計目的1.2課程設(shè)計內(nèi)容1.3課程設(shè)計思想2系統(tǒng)需求分析2.1系統(tǒng)目標(biāo)2.2主體功能2.3開發(fā)環(huán)境3系統(tǒng)概要分析3.1設(shè)計步驟3.2界面設(shè)計3.3主要代碼4結(jié)論與心得體會4.1遇到的問題與解決方法4.2心得5附錄5.1測試5.2程序源代碼

1概述課程設(shè)計目的《面向?qū)ο蟪绦蛟O(shè)計》是一門實踐性很強的計算機專業(yè)基礎(chǔ)課程,課程設(shè)計是學(xué)習(xí)完該課程后進行的一次較全面的綜合練習(xí)。其目的在于通過實踐加深學(xué)生對面向?qū)ο蟪绦蛟O(shè)計的理論、方法和基礎(chǔ)知識的理解,掌握使用C++語言進行面向?qū)ο笤O(shè)計的基本方法,提高運用面向?qū)ο蠓椒ǚ治鰧嶋H問題、解決實際問題的能力。1、鞏固并加深學(xué)生對C++語言程序設(shè)計知識的理解;2、培養(yǎng)學(xué)生面向?qū)ο蟮某绦蛟O(shè)計思想,使學(xué)生認(rèn)識面向過程和面向?qū)ο髢煞N設(shè)計方法的區(qū)別;3、進一步掌握和應(yīng)用VS2010集成開發(fā)環(huán)境;4、提高運用C++語言解決實際問題的能力;5、掌握書寫程序設(shè)計開發(fā)文檔的能力(書寫課程設(shè)計實驗報告)。課程設(shè)計內(nèi)容課題名稱:功能齊全的計算器說明:利用MFC實現(xiàn)一個功能齊全的計算器要求:實現(xiàn)的基本功能有:加、減、乘、除、計算帶括號的運算式;擴展功能有開平方、求三角函數(shù)、階乘、自然底數(shù)e的冪、10的冪和普通數(shù)的冪、進制的轉(zhuǎn)化等;輸入的原始數(shù)據(jù)、運算中間數(shù)據(jù)和結(jié)果都顯示在窗口頂部的同一個編輯框中;計算功能基本上是用系統(tǒng)內(nèi)部函數(shù);“歸零”按鈕可以清除所有已輸入的數(shù)據(jù)從頭計算;“←”按鈕可以退位。課程設(shè)計思想如流程圖1所示,先在編輯框中輸入運算式,通過IsChar()函數(shù)判斷表達式中是否有復(fù)雜的運算符。若無,則進行簡單的雙目運算;若有,則通過String_Replace()函數(shù)將IsChar()函數(shù)無法識別的運算符或字符用一定方式或浮點數(shù)替換,再進行簡單的雙目運算。開始開始鍵入運算式,按下=鍵輸入運算式字符串IsChar();是否含有復(fù)雜運算符?簡單計算Simple()讀入運算符和運算符前后兩個浮點數(shù)返回結(jié)果(double型)遞歸計算括號內(nèi)的值替換函數(shù)String_replace();把無意義的字符換成有意義的浮點數(shù)gcvt()函數(shù)轉(zhuǎn)化成字符串用SetDlgItemText()在對話框中輸出結(jié)束NY圖1系統(tǒng)需求分析系統(tǒng)目標(biāo)我們在學(xué)習(xí)生活中,常會遇到一些繁雜的數(shù)值運算,這時候我們就必須用到科學(xué)計算器,所以便著手開發(fā)了這個計算器程序,以便用于自己的學(xué)習(xí)工作。要計算功能有以下幾個方面:加法,減法,乘法,除法,求冪,求平方根,求Sin,求Cos。主體功能1、十進制數(shù)的加、減、乘、除、乘方、階乘等簡單計算。2、科學(xué)計算函數(shù),包括正弦、余弦、正切、開方、指數(shù)等函數(shù)運算。3、實現(xiàn)括號的優(yōu)先級判斷。4、將編輯框里的內(nèi)容以轉(zhuǎn)化成二、八、十六進制。開發(fā)環(huán)境Windows操作系統(tǒng),MicrosoftVisualStudio2010。系統(tǒng)詳細(xì)設(shè)計設(shè)計步驟打開VS2010,在文件中點擊新建,在彈出框內(nèi)選擇MFCAppWizard[exe]工程,輸入工程名Calculator及其所在位置,點擊確定,如圖2所示。圖2新建MFCAppWizard[exe]工程選擇基于對話框,如圖3所示圖3基于對話框界面設(shè)計設(shè)計如圖4所示的計算機界面,右擊創(chuàng)建類向?qū)?,如?所示,為每個控件添加ID號和單擊響應(yīng)事件的消息處理(BN_CLICKED)。圖4計算機主界面對象ID標(biāo)題或說明編輯框IDC_EDIT1結(jié)果顯示按鈕IDC_BTNCLEAR歸零按鈕IDC_BTNBACK←按鈕IDC_BUTTON00按鈕IDC_BUTTON11按鈕IDC_BUTTON22按鈕IDC_BUTTON33按鈕IDC_BUTTON44按鈕IDC_BUTTON55按鈕IDC_BUTTON66按鈕IDC_BUTTON77按鈕IDC_BUTTON88按鈕IDC_BUTTON99按鈕IDC_BUTTONPOINT.按鈕IDC_BTNADD+按鈕IDC_BTNSUB-按鈕IDC_BTNPLUS*按鈕IDC_BTNDIV/按鈕IDC_BTNFACTORIALn!按鈕IDC_BTNAQRTsqrt按鈕IDC_BTNCENTMod按鈕IDC_BTNLOGlog按鈕IDC_BTNLNln按鈕IDC_BTNSINsin按鈕IDC_BTNCOScos按鈕IDC_BTNTANtan按鈕IDC_BTNEXPEXP按鈕IDC_BTNEQUAL=按鈕IDC_BTNPOWERx^y按鈕IDC_BTNLBRACK(按鈕IDC_BTNRBRACK)按鈕IDC_BTNPIπ單選IDC_RADIO1二單選IDC_RADIO2八單選IDC_RADIO3十單選IDC_RADIO4十六表1各按鈕和編輯框等對象的屬性如圖5所示,為IDC_EDIT1和IDC_RADIO1添加變量。圖5添加變量主要代碼1)“=”鍵單擊響應(yīng)代碼voidCCalculatorVersion3Dlg::OnBtnequal(){ UpdateData(); m_str=m_string; while(!IsChar(m_str))//判斷表達式中是否有其他字符{Calculate(m_str); } doublesum=Simple(m_str); if(sum>-9.9002032198673601e-10&&sum<9.9002032198673601e-10){sum=0;} if(sum>0.4999999&&sum<0.5000001){sum=0.5;} if(sum<-0.4999999&&sum>-0.5000001){sum=-0.5;}charanswer[30]; gcvt(sum,20,answer);//把浮點數(shù)轉(zhuǎn)換成字符串,同時返回一個指向字符串的存儲位置的指針 SetDlgItemText(IDC_EDIT1,answer);}2)簡單雙目運算doubleCCalculatorVersion3Dlg::Simple(stringstr){ doublea=0; doubleb,c; charop; istringstreamsin(str);//定義字符流for(sin>>b;sin>>op>>c;)//分別讀入運算符和運算符前后¨兩個浮點數(shù) { switch(op) { case'-'://減法運算 c=-c; case'+'://加法運算 a+=b; b=c; break; case'*'://乘法運算 b*=c; break; case'/'://除法運算 if(c==0) { MessageBox("Can'tbedividedbyzero");break; } b=b/c; break; case'%'://double數(shù)據(jù)的取模 if((long)c!=0) b=fmod(b,c); break; default: break; } }returna+b;}3)判斷是否有簡單雙目運算以外的字符或運算符BOOLCCalculatorVersion3Dlg::IsChar(stringstr){ inti; for(i=0;i<str.length();i++) { if(!((str[i]>='0'&&str[i]<='9')||(str[i]=='+')||(str[i]=='-')|| (str[i]=='*')||(str[i]=='/')||(str[i]=='.')||(str[i]=='e')||(str[i]=='%'))) returnFALSE; } returnTRUE;}4)轉(zhuǎn)換函數(shù)voidCCalculatorVersion3Dlg::String_replace(string&strBig,conststring&strsrc,conststring&strdst){ { string::size_typepos=0;string::size_typesrclen=strsrc.size();string::size_typedstlen=strdst.size();while((pos=strBig.find(strsrc,pos))!=string::npos) {strBig.replace(pos,srclen,strdst);pos+=dstlen; }}}5)復(fù)雜運算doubleCCalculatorVersion3Dlg::Calculate(string&str){//遞歸計算括號內(nèi)的值 if(IsChar(str)) { doubletok=Simple(str); chartoken[20] ; gcvt(tok,20,token); String_replace(m_str,str,token); } else { //是否有PI while(str.find("PI")!=-1) { String_replace(m_str,str.substr(str.find("PI"),2),PI); }//是否有e while(str.find("EI")!=-1) { String_replace(m_str,str.substr(str.find("EI"),2),EI); } //是否有括號 while(str.find(")")!=-1) { intrightBrk=str.find(")"); intleftBrk=str.rfind("(",rightBrk); str.erase(rightBrk,1); str.erase(leftBrk,1); returnCalculate(str.substr(leftBrk,rightBrk-leftBrk-1)); } //是否有sqrt while(str.find("sqrt")!=-1) { intm1=str.find("sqrt"); intr1=FindRight(m1+3); doublec1=sqrt(atof(str.substr(m1+4,r1-m1-3).c_str())); charch1[20]; gcvt(c1,20,ch1); String_replace(m_str,str.substr(m1,r1-m1+1),ch1); } //是否有l(wèi)og while(str.find("log")!=-1) { intm2=str.find("log"); intr2=FindRight(m2+2); doublec2=log10(atof(str.substr(m2+3,r2-m2-2).c_str())); charch2[20]; gcvt(c2,20,ch2); String_replace(m_str,str.substr(m2,r2-m2+1),ch2); } //是否有l(wèi)n while(str.find("ln")!=-1) { intm3=str.find("ln"); intr3=FindRight(m3+1); doublec3=log(atof(str.substr(m3+2,r3-m3-1).c_str())); charch3[20]; gcvt(c3,20,ch3); String_replace(m_str,str.substr(m3,r3-m3+1),ch3); } //是否有階乘 while(str.find("!")!=-1) { intm4=str.find("!"); intl1=FindLeft(m4); intc4=atoi(str.substr(l1,m4-l1).c_str()); intsum=1; for(intm=1;m<=c4;m++) sum*=m; charch4[20]; itoa(sum,ch4,10); String_replace(m_str,str.substr(l1,m4-l1+1),ch4); } //是否有三角函數(shù) while(str.find("sin")!=-1) { intm5=str.find("sin"); intr5=FindRight(m5+2); doublec5=sin(atof(str.substr(m5+3,r5-m5-2).c_str())/180*pi); if(c5>-9.9002032198673601e-10&&c5<9.9002032198673601e-10){c5=0;} if(c5>0.4999999&&c5<0.5000001){c5=0.5;} if(c5<-0.4999999&&c5>-0.5000001){c5=-0.5;} charch5[20]; gcvt(c5,20,ch5); String_replace(m_str,str.substr(m5,r5-m5+1),ch5); } while(str.find("cos")!=-1) { intm6=str.find("cos"); intr6=FindRight(m6+2); doublec6=cos(atof(str.substr(m6+3,r6-m6-2).c_str())/180*pi); if(c6>-9.9002032198673601e-10&&c6<9.9002032198673601e-10){c6=0;} if(c6>0.4999999&&c6<0.5000001){c6=0.5;} if(c6<-0.4999999&&c6>-0.5000001){c6=-0.5;} charch6[20]; gcvt(c6,20,ch6); String_replace(m_str,str.substr(m6,r6-m6+1),ch6); } while(str.find("tan")!=-1) { intm7=str.find("tan"); intr7=FindRight(m7+2); doublec7=tan(atof(str.substr(m7+3,r7-m7-2).c_str())/180*pi); if(c7>-9.9002032198673601e-10&&c7<9.9002032198673601e-10){c7=0;} if(c7>0.4999999&&c7<0.5000001){c7=0.5;} if(c7<-0.4999999&&c7>-0.5000001){c7=-0.5;} charch7[20]; gcvt(c7,20,ch7); String_replace(m_str,str.substr(m7,r7-m7+1),ch7); } //是否有“^” while(str.find("^")!=-1) { intmd=str.find("^"); intleft=FindLeft(md); intright=FindRight(md); charc[20]; doubleaa,bb; aa=atof(str.substr(left,md-left).c_str()); bb=atof(str.substr(md+1,right-md).c_str()); gcvt(pow(aa,bb),20,c); String_replace(m_str,str.substr(left,right-left+1),c); } } return0;}6)小數(shù)點的左部和右部intCCalculatorVersion3Dlg::FindLeft(intm){ for(inti=m-1;i>=0;i--) { if(!((m_str[i]>='0'&&m_str[i]<='9')||(m_str[i]=='.'))) returni+1; } return0;}intCCalculatorVersion3Dlg::FindRight(intm){ for(intj=m+1;j<m_str.length();j++) { if(!((m_str[j]>='0'&&m_str[j]<='9')||(m_str[j]=='.'))) returnj-1; } returnm_str.length()-1;}

4結(jié)論與心得體會4.1遇到的問題與解決方法1、DebugAssertionFailed. File:dlgdata.cpp Line:43 Solution:編輯框Edit1屬性選Group2、DebugAssertionFailed. File:dlgdata.cpp Line:269 Solution:單選IDC_RADIO1的屬性選Group,其他不設(shè)3、ASSERTION::IsWindow(m_hWnd)斷言 Solution:消除野指針4.2心得這學(xué)期上過WINDOWS高級編程,書上有一個簡易的計算器的制作,但是對于利用MFC這個類庫制作能進行科學(xué)運算的方法還不是很了解。這個計算器我命名為VERSION3.0的原因,是我在這個版本之前還做了兩個計算器。第一個不能實現(xiàn)科學(xué)的單目運算,第二個能進行三角函數(shù)等運算但不能實現(xiàn)括號。后來將網(wǎng)上下載來的資源整理后發(fā)現(xiàn)substr()、find()等函數(shù)的功能,才寫出這個計算器。感覺寫得并不是很好,因為還有一些問題沒有得到完全的解決,比如sin函數(shù)與括號的結(jié)合問題,至今還沒找到解決的方法,只能以后有空再好好想想了!本來還想上網(wǎng)學(xué)一下MFC的美化,把這個頁面做得好看一些的,但時間不允許了,所以只是在同學(xué)的指點下添加了計算器的背景圖??偟膩碚f,這次的課程設(shè)計,還是讓自己學(xué)到不少東西,同時也感覺到自己現(xiàn)在的不足——基礎(chǔ)不夠扎實,很多東西都是一知半解,真的要好好加強對基礎(chǔ)知識的學(xué)習(xí)了!很多問題,不僅僅只是把功能實現(xiàn)就行了,還要注意代碼的優(yōu)化,把結(jié)果做得更好!

5附錄5.1測試1)(7-9)/5結(jié)果正確,證明可以實現(xiàn)雙目運算符的連續(xù)運算,菜單功能正常2)sin30運算結(jié)果證明單目運算符能運行成功3)8/0證明錯誤提示功能實現(xiàn)正常5.2程序源代碼//CalculatorVersion3Dlg.cpp:實現(xiàn)文件#include"stdafx.h"#include"CalculatorVersion3.h"#include"CalculatorVersion3Dlg.h"#include"afxdialogex.h"#include<string>#include<sstream>#include<cmath>usingnamespacestd; #definepi3.141592653579893constchar*PI="3.141592653579893";constchar*EI="2.718281828459045";……voidCCalculatorVersion3Dlg::OnBtnclear(){ m_string=""; UpdateData(FALSE);}voidCCalculatorVersion3Dlg::OnRadio1(){ m_num=0; UpdateData(); intanswer1=(int)atof(m_string.operatorLPCTSTR());itoa(answer1,(char*)m_string.operatorLPCTSTR(),2); UpdateData(FALSE);}v

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論