VC++ 多功能計算器

上傳人:痛*** 文檔編號:156018592 上傳時間:2022-09-25 格式:DOC 頁數(shù):24 大?。?12KB
收藏 版權(quán)申訴 舉報 下載
VC++ 多功能計算器_第1頁
第1頁 / 共24頁
VC++ 多功能計算器_第2頁
第2頁 / 共24頁
VC++ 多功能計算器_第3頁
第3頁 / 共24頁

下載文檔到電腦,查找使用更方便

10 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《VC++ 多功能計算器》由會員分享,可在線閱讀,更多相關(guān)《VC++ 多功能計算器(24頁珍藏版)》請在裝配圖網(wǎng)上搜索。

1、 課程設(shè)計說明書 NO.24 多功能計算器 1、課程設(shè)計的目的 本課程設(shè)計以《VC++程序設(shè)計》課程為基礎(chǔ),目的是進(jìn)一步培養(yǎng)學(xué)生綜合應(yīng)用VC++的各種編程知識和技巧進(jìn)行程序設(shè)計的能力,最終掌握面向?qū)ο蟮木幊碳夹g(shù)。通過本次課程設(shè)計,學(xué)生應(yīng)能達(dá)到具備設(shè)計功能較為復(fù)雜的Windows應(yīng)用程序的能力,同時培養(yǎng)學(xué)生自主學(xué)習(xí)和獨立創(chuàng)新的精神。 系統(tǒng)地學(xué)習(xí)面向?qū)ο缶幊趟枷耄私釳FC架構(gòu),逐步熟悉可視化編程環(huán)境Visual C++,加深對面向?qū)ο缶幊痰乃枷氲恼J(rèn)識。能夠獨立的完成一個簡單的編程,實現(xiàn)一個簡單計算器的編程和應(yīng)用,從而更深入的了解Visual C++的工作原

2、理。 2、功能描述 在Visual C++環(huán)境下設(shè)計并實現(xiàn)一個簡單計算器系統(tǒng),該計算器應(yīng)能實現(xiàn)如下功能: 1)、二進(jìn)制、八進(jìn)制、十進(jìn)制及十六進(jìn)制數(shù)的加、減、乘、除、乘方、取模等簡單計算 2)、科學(xué)計算函數(shù),包括(反)正弦、(反)余弦、(反)正切、(反)余切、開方、指數(shù)等函數(shù)運(yùn)算 3)、以角度、弧度兩種方式實現(xiàn)上述部分函數(shù) 4)、具備歷史計算的記憶功能 5)、對不正確的表達(dá)式能指出其錯誤原因 3、案論論證 3.1、可行性分析 本設(shè)計是簡單計算器。日常計算機(jī)使用中,常常涉及到一些有關(guān)計算的問題,一個小型的計算器軟件變得非常有用,該校型計算器需要空間資源較少,對電腦其他程序的應(yīng)用

3、影響較小。它的設(shè)計按軟件工程的方法進(jìn)行,系統(tǒng)具有良好的界面、必要的交互信息和較好的健壯性;醒目美觀的軟件封面。使用人員能快捷簡單地進(jìn)行操作。即時準(zhǔn)確地獲得需要的計算的結(jié)果,充分降低了數(shù)字計算的難度和節(jié)約了時間,對人們的生活有一定的幫助 3.2、需求分析 本軟件主要用于計算機(jī)windows 2000/XP以上版本的用戶的使用,這次課程設(shè)計一般是實現(xiàn)簡單計算器的功能。要程序能實現(xiàn):加,減,乘,除,開方,倒數(shù)等運(yùn)算功能;還要實現(xiàn)數(shù)據(jù)的輸入,輸出,計算,顯示及程序退出等功能。另外還可以實現(xiàn)多種科學(xué)計算的功能,如:三角函數(shù)的計算,弧度與角度間的轉(zhuǎn)換,對數(shù)指數(shù)的計算等等。 3.3、總體方案設(shè)計 (

4、1)功能框架 圖1 功能框架圖 (2)主要功能原理: ①正弦、余弦、正切、余切函數(shù): 制度的選擇,程序運(yùn)行默認(rèn)制度選中角度,當(dāng)選項中“角度”按鈕時,則需將其轉(zhuǎn)換為角度計算,由公式:弧度=PI*角度/180,可將表達(dá)式中角度轉(zhuǎn)換為弧度既s[ll-1]=PI*s[ll-1]/180。對于反、正余弦和反正余切,由于C++math.h庫函數(shù)提供的計算結(jié)果是弧度的,所以當(dāng)選中默認(rèn)的“弧度”按鈕時可不必將計算結(jié)果轉(zhuǎn)換,當(dāng)選中“角度”按鈕時,則由公式:角度=弧度*180/PI,既可計算出來。 ②實現(xiàn)進(jìn)制間浮點數(shù)的轉(zhuǎn)換 對不同進(jìn)制的輸入,將其轉(zhuǎn)換為十進(jìn)制數(shù)后出入,顯示時轉(zhuǎn)換為所選擇的進(jìn)

5、行輸出。 所以進(jìn)制間的轉(zhuǎn)換輸出,其實只是將已存的那個十進(jìn)制數(shù)轉(zhuǎn)換為其他進(jìn)制輸出。 ③歷史計算的記憶功能 對(和),使用一個運(yùn)算符棧和一個操作數(shù)棧存儲。按(時,進(jìn)棧保存;按)時,出棧運(yùn)算。 對MC、MR、MS、M+,使用一個浮點數(shù)存儲中間值,MC為將其清零,MR為讀取其值,MS為保存、M+為在原有值的基礎(chǔ)上加當(dāng)前值。 3.4、詳細(xì)設(shè)計 (1)進(jìn)行開始編程前的數(shù)據(jù)結(jié)構(gòu)分析: double m_mem; //中間值 bool m_IsHudu; //弧度、角度判斷 void init(); CRect rectSmall; CRect rectLa

6、rge; double base; //進(jìn)制基數(shù) double m_operand; //存儲當(dāng)前輸入的操作數(shù) double m_accum; //存儲當(dāng)前的計算處理結(jié)果 bool m_bCoff; //表示當(dāng)前輸入是否是小數(shù) double m_coff; //小數(shù)輸入是的系數(shù) Operator m_operator; //當(dāng)前運(yùn)算符 CalcError m_errorState; //當(dāng)前運(yùn)算狀態(tài) bool m_bOperandAvail; //表示當(dāng)前是否是新輸入數(shù)字 (2)界面設(shè)計,將要實現(xiàn)的按鍵添加入: (3)添加按鍵函數(shù)

7、: void CCalculatorDlg::OnAdd() // 加 void CCalculatorDlg::OnAddMi() // +/- void CCalculatorDlg::OnBackspace() // Backspace void CCalculatorDlg::OnClear() // 清除 void CCalculatorDlg::OnClearE() // 清除當(dāng)前 void CCalculatorDlg::OnDivid() // 除 void CCalculatorDlg::OnEqual()

8、// 等于 void CCalculatorDlg::OnMimus() // 減 void CCalculatorDlg::OnMod() // 取模 void CCalculatorDlg::OnMultiply() // 乘 void CCalculatorDlg::OnPoint() // 小數(shù)點 void CCalculatorDlg::OnX2() // 平方 void CCalculatorDlg::OnSin() //sin函數(shù) void CCalculatorDlg::OnTan() // tan函數(shù)

9、 void CCalculatorDlg::OnMs() //覆蓋記憶 void CCalculatorDlg::OnMr() //讀記憶 void CCalculatorDlg::OnMc() //清零記憶 void CCalculatorDlg::OnMadd() //增加記憶 void CCalculatorDlg::OnLog() //log函數(shù) void CCalculatorDlg::OnLn() //ln函數(shù) void CCalculatorDlg::OnCot() //cot函數(shù) void CCalcula

10、torDlg::OnCos() //cos函數(shù) void CCalculatorDlg::OnSqrt() //開方 void CCalculatorDlg::OnXy() //X的Y次方 等等… (4)完善功能: 增加如下函數(shù)實現(xiàn)進(jìn)制轉(zhuǎn)換: char change(int a) //將整數(shù)轉(zhuǎn)換為字符 { if(a < 10) return '0'+a; else return 'A'+a-10; } CString ToCString(int base, double m_operand) //將double(根據(jù)基

11、數(shù)base)轉(zhuǎn)換為CString { CString temp = "", temp2; if(m_operand == 0) return "0"; __int64 operand = (__int64)m_operand; m_operand = m_operand - operand; //整數(shù)部分 while(operand){ temp2.Format("%c", change((int)(operand%base))); temp = temp2 + temp; operand /= base; } temp = temp

12、+ "."; //小數(shù)部分 while(m_operand > 10e-10){ m_operand *= base; operand = (__int64)m_operand; temp2.Format("%c", change((int)operand)); temp = temp + temp2; m_operand = m_operand - operand; } return temp; } double change2(char a) //將字符轉(zhuǎn)換為浮點數(shù) { if(a >= '0' && a <= '9')

13、 return (double) (a - '0'); else return (double) (a - 'A'); } double ToDouble(double base, CString str, int &k) //將CString(根據(jù)基數(shù)base)轉(zhuǎn)換為double //k為標(biāo)志是否刪除了小數(shù)點 { double num = 0.0; double temp = 1.0/base; int len = str.GetLength(), i = 0; k = 0; //整數(shù)部分 while(i < len){ if(str.G

14、etAt(i) == '.') break; num = num*base + change2(str.GetAt(i)); i++; } i++; if(i >= len) k = 1; //小數(shù)部分 while(i < len){ num = num + change2(str.GetAt(i)) * temp; temp *= 1.0/base; i++; } return num; } 加入出錯處理: if(m_errorState != ErrNone){ if(m_errorState == Er

15、rDivideByZero) m_Edit = "除數(shù)不能為零"; else if(m_errorState == ErrModFloat) m_Edit = "浮點數(shù)不能取mod"; else if(m_errorState == ErrTanMax) m_Edit = "tan為無窮大"; else if(m_errorState == ErrCotMin) m_Edit = "cot為無窮大"; else if(m_errorState == ErrLogSign) m_Edit = "不可以對負(fù)數(shù)取對數(shù)"; }

16、 (5)增加方便用戶功能: 加入加速鍵: 圖2 增加控件圖 4、運(yùn)行結(jié)果 (1)基本計算器的運(yùn)行效果如圖3所示 圖3 基本計算器的運(yùn)行圖 (2)科學(xué)計算器的運(yùn)行效果如圖4所示 圖4 科學(xué)計算器運(yùn)行效果圖 (3)不可以對浮點數(shù)進(jìn)行取模運(yùn)算,例如9.2 mod 9.2=?。運(yùn)行結(jié)果如圖5所示 圖5 浮點數(shù)不能取摸示意圖 (4)不可以對90度角進(jìn)行正切操作。Tan 90=?。運(yùn)行結(jié)果如圖6所示。 圖6 90度角不能進(jìn)行正切操作

17、示意圖 (5)不可以對0度角進(jìn)行取余切操作。Cot0=?。運(yùn)行結(jié)果如圖7所示 圖7 0度角不能取余示意圖 (6)不可以對負(fù)數(shù)求對數(shù)。例如Ln -9=?。運(yùn)行結(jié)果如圖8所示 圖8 對數(shù)不可求對數(shù)示意圖 (7)不可以對負(fù)數(shù)進(jìn)行開方。運(yùn)行結(jié)果如圖9所示 圖9 負(fù)數(shù)不能開方示意圖 5、心得體會 C++是一種面對對象的編程語言,它跟我們大一學(xué)習(xí)的面向過程語言C++有很大的不同。在C語言中完全沒有類這個概念,平時用的最多的就是數(shù)組和結(jié)構(gòu)體。但面向?qū)ο蟮恼Z言就不同了,在軟件的開發(fā)過程中,

18、我們可以通過編寫各種各樣不同功能的類去實現(xiàn)我們所想要的功能。而且我們還可以把這些類保存起來,這樣,當(dāng)我們以后要用到的時候把它加入到工程里面就可以用了。而且,對于以前的一些類,加入它有一些功能我們想拿來用,但是又想在此基礎(chǔ)上增加一些新的功能,這怎么辦呢?我們可以通過重載這個類,然后加入我們想要的東西,那么在軟件開發(fā)功能中就可以節(jié)省很多的時間,提高軟件開發(fā)的效率。 剛看到這個課程設(shè)計題目的時候,我認(rèn)為要實現(xiàn)起來并不難。但當(dāng)我開始做的時候,發(fā)現(xiàn)這遠(yuǎn)沒有我想的那么簡單,反而是越做越難。這并不是擺一些控件,添加響應(yīng)就可以實現(xiàn)的了。就拿最簡單的加、減、乘、除來說吧。在進(jìn)行設(shè)計的時候,我除了要實現(xiàn)基本的兩

19、個數(shù)進(jìn)行簡單的四則運(yùn)算外,還要實現(xiàn)他們連加、連減等。對于除法還要考慮除數(shù)不能為零這種情況。在進(jìn)行科學(xué)計算這些功能設(shè)計的時候,我發(fā)現(xiàn)用常規(guī)的方法并不能滿足我的要求。為了判斷一個表達(dá)式的正誤還有運(yùn)算的優(yōu)先級,我必須用到一個堆棧。為了實現(xiàn)堆棧這個數(shù)據(jù)結(jié)構(gòu),我花了不少時間在上面。而對于個別的功能,我是手工寫出函數(shù)處理的。 在此次實驗,我掌握面向?qū)ο蠹夹g(shù)相關(guān)的一些軟件開發(fā)技術(shù)。利用MFC類庫開發(fā)Windows應(yīng)用程序,消息映射是如何工作的。代碼編寫能力又有了進(jìn)一步的提高。 參考文獻(xiàn) [1] 劉於勛等.C++程序設(shè)計. [M].科學(xué)出版社,2007 [2] 榮欽科技

20、.Visual C++游戲編程基礎(chǔ). [M].電子工業(yè)出版社,2004 [3] 揣錦華.面向?qū)ο蟪绦蛟O(shè)計與VC++實踐. [M].西安電子科技大學(xué)出版社,2005 [4] 羅偉堅.Visual C++經(jīng)典游戲程序設(shè)計. [M].人民郵電出版社,2006 [5]《Visual C ++ 程序設(shè)計—基礎(chǔ)與實例分析》,朱晴婷,黃海鷹,陳蓮君,[M].清華大學(xué)出版社 [6]《Visual C++面向?qū)ο笈c可視化程序設(shè)計(第2版)》,黃維通,[M].清華大學(xué)出版社 [7] 劉振安、劉燕君、孫忱,《C++語言課程設(shè)計》,[M].機(jī)械工業(yè)出版社,2007年 [8] 嚴(yán)華峰. Visual C++

21、課程設(shè)計案例精編. [M].北京:中國水利水電出版社,2002 [9] 張宏軍,黨留群,趙天巨.Visual C++ 6.0編程案例精解.[M].北京:電子工業(yè)出版社,2005 附錄: 部分程序源代碼 //stack.h標(biāo)準(zhǔn)的堆棧模板程序(頭文件) #if !defined(STACK_H) #define STACK_h #include #include using namespace std; const int MaxStackSize=50; template <

22、class T> class Stack { private: T stacklist[MaxStackSize]; //堆棧的最大尺寸 int top; public: Stack(); void Push(const T& item); //壓棧 T Pop(); //出棧 void ClearStack(); //清空堆棧 T Peek() const; //輸出堆棧頂部元素(計算結(jié)果) int StackEmpty() const

23、; //判斷堆棧是否為空 int StackFull() const; //判斷堆棧是否已滿 }; //構(gòu)造函數(shù),將top置-1 template Stack::Stack(): top(-1){} //壓棧 template void Stack::Push(const T& item) { if (StackFull()) //判斷堆棧是否已滿 { cerr<<"Stack overflow!"<

24、p++; stacklist[top]=item; //不滿則壓棧 } //出棧 template T Stack::Pop() { T temp; //判斷是否為空棧 if(StackEmpty()) { cerr<<"Attempt to pop an empty stack!"<

25、清棧 template void Stack::ClearStack() { top=-1; } //返回棧頂元素 template T Stack::Peek() const { if(top==-1) //判斷top是否有效 { cerr<<"attempt to peek at an empty stack!"<

26、class T> int Stack::StackEmpty() const { return top==-1; } //判斷堆棧是否已滿 template int Stack::StackFull() const { return top==MaxStackSize-1; } #endif //calculator.h計算器模板類的頭文件 } //四則運(yùn)算函數(shù) template void Calcualator::Run(void) { cout<<"輸入要進(jìn)行的四則運(yùn)算(后綴法):\n";

27、 char c; T newoperand; while (cin>>c,c!='=') { switch(c) { case '+': case '-': case '*': case '/': case '^': Compute1(c); break; default: //非運(yùn)算符,則必為操作數(shù),將字符送回 cin.putback(c); //讀入操作數(shù)并將其存入棧中 cin>>newoperand; Enter(newoperand); break; }

28、} //答案已在棧頂,用peek輸出之 if (!S.StackEmpty()) cout<<"結(jié)果是:"< void Calcualator::Compute2(char d) { T data,N; cout<<"請輸入角度"<>data; N=data*(PI/180); //把輸入的角度轉(zhuǎn)換成弧度

29、 S.ClearStack(); cout<<" \n"; Enter(N); //將N存放到棧中 switch(d) { case 'T': S.Push(tan(N));//正切計算 break; case 'S': S.Push(sin(N));//正弦計算 break; case 'c': S.Push(cos(N));//余弦計算 break; default:

30、 S.ClearStack(); break; } f (!S.StackEmpty()) cout<<"結(jié)果是:"< void Calcualator::trangle(void) {int flag=0; char d do { flag=0; cout<<"##########################

31、#############"<>d; if(d!='T'&&d!='S'&&d!='c'&&d!='y')//判斷選擇代碼的輸入是否有誤,輸入錯誤時

32、,重新輸入 {cout<<" Error node,please choose again!"< void Calcualator::com(void) {Calcualator A; int d;char y; do { cout<<"##############################

33、#########"<>d; switch (d) { case 1: chengfang(A);//乘方的具體運(yùn)算函

34、數(shù) break; case 2: kaifang(A);//開方的具體運(yùn)算函數(shù) break; case 3: jiecheng(A);//階乘的具體運(yùn)算函數(shù) break; default: cout<<"Continue?………………(y or N)"<>y; }while(y=='y');//循環(huán)語句控制是否繼續(xù)該類型的計算,否則進(jìn)入主菜單 } template void C

35、alcualator::Clear() { S.ClearStack(); } #endif //main.cpp源文件 #include "calculator.h" int main() { cout<<" Wellcome to calculator system! \n"; cout<<" \n"; char k; do {cout<<" *************************************************\n";

36、 cout<<"* 請輸入所選擇的運(yùn)算: **"<>h; Calcualator CALC; if(h=='k') CALC.com();//進(jìn)入乘方開方階乘運(yùn)算 if(h=='a') CALC.Run();//進(jìn)入普通四則運(yùn)算 if(h=='s') CALC.trangle();//進(jìn)入三角函數(shù)的運(yùn)算 cout<<"進(jìn)入主菜單?(y or N):"<>k; }while(k=='y'); return 0; } 沈 陽 大 學(xué)

展開閱讀全文
溫馨提示:
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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號:ICP2024067431-1 川公網(wǎng)安備51140202000466號


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!