VC++ 多功能計算器
《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
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 24、p++;
stacklist[top]=item; //不滿則壓棧
}
//出棧
template 25、清棧
template 26、class T>
int Stack 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é)果是:"< 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é)果是:"< 31、#############"< 32、,重新輸入
{cout<<" Error node,please choose again!"< 33、#########"< 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)"< 35、alcualator 36、
cout<<"* 請輸入所選擇的運(yùn)算: **"<
- 溫馨提示:
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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 第七章-透射電子顯微鏡
- 群落的結(jié)構(gòu)(課件)
- 焊接基礎(chǔ)知識
- 水文地質(zhì)學(xué)課件
- 某公司員工工傷安全管理規(guī)定
- 消防培訓(xùn)課件:安全檢修(要點)
- 某公司安全生產(chǎn)考核與獎懲辦法范文
- 安全作業(yè)活動安全排查表
- 某公司危險源安全辨識、分類和風(fēng)險評價、分級辦法
- 某公司消防安全常識培訓(xùn)資料
- 安全培訓(xùn)資料:危險化學(xué)品的類別
- 中小學(xué)寒假學(xué)習(xí)計劃快樂度寒假充實促成長
- 紅色插畫風(fēng)輸血相關(guān)知識培訓(xùn)臨床輸血流程常見輸血不良反應(yīng)
- 14.應(yīng)急救援隊伍訓(xùn)練記錄
- 某公司各部門及人員安全生產(chǎn)責(zé)任制