C++簡單計(jì)算器設(shè)計(jì)報(bào)告_第1頁
C++簡單計(jì)算器設(shè)計(jì)報(bào)告_第2頁
C++簡單計(jì)算器設(shè)計(jì)報(bào)告_第3頁
C++簡單計(jì)算器設(shè)計(jì)報(bào)告_第4頁
C++簡單計(jì)算器設(shè)計(jì)報(bào)告_第5頁
已閱讀5頁,還剩28頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、C+簡單計(jì)算器設(shè)計(jì)報(bào)告本人寫了一個(gè)簡單的計(jì)算器實(shí)現(xiàn)代碼,能實(shí)現(xiàn)+-*/及()功能.特此備案.一、開發(fā)環(huán)境:Linux操作系統(tǒng)(Fedora虛擬機(jī)), vim、g+等開發(fā)環(huán)境。二、核心算法1、 int Test(string str): 對輸入的const string類型字符串(計(jì)算式)進(jìn)行檢測,發(fā)現(xiàn)其是否為一正確的計(jì)算表達(dá)式,如果是則return 1,如果否則return 0。如“12+23”為正確則返回1,“12*&45”為錯(cuò)誤計(jì)算式,則返回0。2、 string stringtoarr(const stringstr):對輸入的無括號的conststring類型字符串str進(jìn)行單

2、元轉(zhuǎn)換,將最終返回其值,如果某個(gè)單元“12+23*2”,則將之返回為“58”。3、 string trims(const string&sub):將輸入的帶括號的字符串進(jìn)行去括號操作,最后返回?zé)o括號的表達(dá)式(對帶括號的子字符串部分進(jìn)行stringtoarr處理,去除括號)。這是一個(gè)遞歸函數(shù),如果子字符串中含有多個(gè)括號,則反復(fù)地自遞歸調(diào)用。三、編譯與鏈接在虛擬機(jī)環(huán)境下,使用vim環(huán)境指令創(chuàng)建Calculation.cpp文件,并用g+進(jìn)行編譯與鏈接g+ Calculation.cpp oCal.out。并使程序能正常進(jìn)行實(shí)現(xiàn)計(jì)算器功能。四、自測試報(bào)告。1、對生成的Cal.out文件進(jìn)行運(yùn)

3、行,并進(jìn)行測試用例自測試過程(正異常用例共7組):正常用例測試:第一組(加減):12.2+23.0 24+34.6+34+7854.3 56-23.3+23.5-0.12第二組(乘除):17/56 23*45.75 12.04/34 23.77/34.901*23.0 23.04*0/34.2第三組(+-*/混合):23.4*23.5/34 23+234*34.3/45.9-23/23.04 第四組(+-*/混合,帶一個(gè)或多個(gè)括號):(12-45.4)/23.78 (12*23.5-23/(25.7-34.6)*12 2*(12-(45.5*(12.3*(11.92-6)-12.4)*2.3)

4、錯(cuò)誤用例測試:第一組(字符錯(cuò)誤):12<23.2-34.6 89.6/56,2+2 23%7 212 2a.0-12 12”3-12第二組(被除數(shù)為零): 12/0.0+12第三組(式中括號有誤): 12-(12.7*(35-45.8)+2 12-(12.7*)35-45.8)+2 12*)34-98(-232、部分測試報(bào)告截圖如下: *說明:此計(jì)算器代碼相對較簡單,是以一個(gè).cpp文件將三個(gè)子函數(shù)全部寫下。如果在建立的工程需要將子函數(shù)寫成不成同的.cpp文件,則需要用到Makefile,規(guī)定每個(gè)程序源文件的編譯順序,否則改動(dòng)程序時(shí)會(huì)經(jīng)歷循環(huán)反復(fù)的編輯à編譯à測試過程

5、,比較費(fèi)時(shí)。五、審評意見:使用遞歸算法實(shí)現(xiàn)計(jì)算器功能,代碼相對簡潔,但編碼不太規(guī)范,希望在以后的編碼工作中加強(qiáng)規(guī)范編碼的訓(xùn)練。附錄代碼:/Calculation.cpp : 定義控制臺應(yīng)用程序的入口點(diǎn)。 / /#include"stdafx.h" #include<stdio.h> #include<iostream> #include<string> #include<stdlib.h> #include<fstream> usingnamespace std; intTest(string as) string

6、:size_type len=as.size(); string:size_type i=0; int k=0; while(i<len) if(!(asi>='0' &&asi<='9') | asi='+' | asi='-' | asi='*' | asi='/'|asi='.' | asi='(' | asi=')') cout<<"輸入的表達(dá)式錯(cuò)誤,請重新輸入!"<<

7、;endl; return 0; if(asi='/'&&asi+1='0') cout<<"分母不能為零!"<<endl; return 0; if(asi='(') k+; else if(asi=')') k-; if(k<0) return 0; i+; if(k!=0) cout<<"括號輸入錯(cuò)誤!"<<endl; return 0; return 1; stringstringtoarr(const strin

8、g str) /將一個(gè)字符串轉(zhuǎn)化成兩個(gè)數(shù)組,一個(gè)為數(shù)字?jǐn)?shù)組保存數(shù)字,另一個(gè)為字符數(shù)組,保存符號 /此函數(shù)將用于無括號的計(jì)算。 int i=0,z=0,s,temp; float rate=10.0,itemp=0.0; float valueStr=0.0; float a40; char b20; for(i=0;i<40;i+) ai=0.0; /對數(shù)組a20初始化 for(i=0;i<20;i+) bi=' ' /對數(shù)組b10初始化 i=0; /把0賦給i for(i=0;i<stri;i+) if(stri>='0'&&a

9、mp; stri<='9') /如果字符串str.GetAt(i)的內(nèi)容是整數(shù) if(rate=10.0) /整數(shù)部分 itemp=itemp*rate+(stri-'0'); /獲得整數(shù) else /小數(shù)部分 itemp=itemp+rate*(stri-'0'); /獲得小數(shù) rate=rate/10; /每次讓rate小10倍 elseif(stri='.') /如果str.GetAt(i)是小數(shù)點(diǎn) rate=0.1; /讓rate=0.1,開始計(jì)算小數(shù)部分 elseif(stri='+') /如果st

10、r.GetAt(i)是加號 az=itemp;itemp=0; /把itemp的值放入雙精度數(shù)組a中,并把itemp的值改為0 z+; /讓z自加一次 bz='+' /把加號放入字符數(shù)組b中 z+; /讓z自加一次 rate=10.0; /把10賦給rate,確保讀取下個(gè)數(shù)字時(shí),先計(jì)算整數(shù)部分 else if(stri='-') /如果str.GetAt(i)是減號 az=itemp;itemp=0; /把itemp的值放入雙精度數(shù)組a中,并把itemp的值改為0 z+; /讓z自加一次 bz='-' /把減號放入字符數(shù)組b中 z+; /讓z自加

11、一次 rate=10.0; /把10賦給rate,確保讀取下個(gè)數(shù)字時(shí),先計(jì)算整數(shù)部分 else if(stri='*') /如果str.GetAt(i)是乘號 az=itemp;itemp=0; /把itemp的值放入雙精度數(shù)組a中,并把itemp的值改為0 z+; /讓z自加一次 bz='*' /把減號放入字符數(shù)組b中 z+; /讓z自加一次 rate=10.0; /把10賦給rate,確保讀取下個(gè)數(shù)字時(shí),先計(jì)算整數(shù)部分 else if(stri='/') /如果str.GetAt(i)是除號 az=itemp;itemp=0; /把itemp

12、的值放入雙精度數(shù)組a中,并把itemp的值改為0 z+; /讓z自加一次 bz='/' /把除號放入字符數(shù)組b中 z+; /讓z自加一次 rate=10.0; /把10賦給rate,確保讀取下個(gè)數(shù)字時(shí),先計(jì)算整數(shù)部分 az=itemp; /把最后一個(gè)整數(shù)itemp的值放入雙精度數(shù)組a中 s=z; /把z的值賦給變量s,用來控制計(jì)算結(jié)果的循環(huán)中的條件,s即為數(shù)與值的大小。 for(i=0;i<=s;i+) if(bi='/') /當(dāng)循環(huán)遇到除號時(shí) ai+1=1/ai+1; /把a(bǔ)i+1的值改為1/ai+1 bi='*' /把bi的值改為乘號

13、for(i=0;i<=s;i+) while(bi='*') /當(dāng)循環(huán)遇到乘號時(shí) ai-1=ai-1*ai+1; for(temp=i+1;temp+2<40;temp+) atemp=atemp+2; for(temp=i;temp+2<20;temp+) btemp=btemp+2; valueStr=a0; for(i=0;i<s;i+) if(bi='+') valueStr+=ai+1; else if(bi='-') valueStr-=ai+1; char svalue16; sprintf(svalue,&

14、quot;%f" , valueStr); string ssavalue(svalue); return ssavalue; stringtrims(const string &sub) string s1,s2,s3,sp,ss; int i; int counter=0; int left,right; if(string:size_typepos1=sub.find(")")=string:npos) return sub; for(i=0;subi;i+) if(subi='(') left=i; counter+; break;

15、 for(i=left+1;subi;i+) if(subi='(') counter+; else if(subi=')') counter-; if(counter=0) right=i; break; s1=sub.substr(0,left); sp=sub.substr(left+1,right-left-1); s2=stringtoarr(trims(sub.substr(left+1,right-left-1); s3=trims(sub.substr(right+1); ss=s1+s2+s3; return ss; voidcalcation

16、(string &str1) int stTe; if(stTe=Test(str1)<=0) cout<<"輸入字符串有誤,請重新輸入!"<<endl; return; string sk=trims(str1); string ssk=stringtoarr(sk); cout<<ssk<<endl; cout<<"-"<<endl; intmain() string input_str; int p=1; int tsTest; /string tss; while(1) cout<<"請輸入表達(dá)式(退出請輸入小寫exit):"<<endl; cin>>i

溫馨提示

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

評論

0/150

提交評論