c++課程設(shè)計(jì)四則運(yùn)算.doc_第1頁
c++課程設(shè)計(jì)四則運(yùn)算.doc_第2頁
c++課程設(shè)計(jì)四則運(yùn)算.doc_第3頁
c++課程設(shè)計(jì)四則運(yùn)算.doc_第4頁
c++課程設(shè)計(jì)四則運(yùn)算.doc_第5頁
已閱讀5頁,還剩6頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、Vc+課程設(shè)計(jì)報(bào)告題目名稱:四則運(yùn)算班級(jí):測控技術(shù)與儀器姓名:周賽學(xué)號(hào):914101170150一、程序功能簡介該程序用字符串形式接受一個(gè)帶括號(hào)的四則運(yùn)算表達(dá)式,然后按照四則運(yùn)算優(yōu)先級(jí)的算法先括號(hào),后乘方、乘除、加減這樣的順序?qū)⑦@個(gè)算式解出。該程序的設(shè)計(jì)比較巧妙,是在主程序中反復(fù)查找最后一對(duì)括號(hào),將其中的結(jié)果計(jì)算出來,去掉括號(hào),這樣的過程持續(xù)下去,最后導(dǎo)致所有的括號(hào)都去除,解出算式。二、課程設(shè)計(jì)要求()用類的要求改寫程序,將數(shù)據(jù)和函數(shù)封裝到類中。()修改主程序,使程序可以反復(fù)運(yùn)算,直到選擇退出為止。()擴(kuò)充程序功能,使程序適合浮點(diǎn)數(shù)運(yùn)算。()增加程序的判斷功能,當(dāng)有非法的輸入時(shí)(如字母等),給

2、出提示信息并退出運(yùn)算,當(dāng)輸入帶有空格時(shí),能將空格濾除。三、程序設(shè)計(jì)思想(1)類的封裝實(shí)際上該字符串類基本類似于中的string類,比string類多定義了浮點(diǎn)數(shù)與字符串的相互轉(zhuǎn)換的函數(shù),輸入輸出友元函數(shù),可以從string類派生出CStr類,這樣,類的定義就更加簡單,且可以利用很多現(xiàn)成的成員函數(shù)。(2)主程序結(jié)構(gòu)算法的設(shè)置定義char類型的變量用來存儲(chǔ)字符串,定義CStr類用于對(duì)字符串操作函數(shù)的引用。先對(duì)輸入字符串用Judge函數(shù)進(jìn)行輸入正確性的判斷及取出空格內(nèi)容;然后用charinstr函數(shù)在字符串中反復(fù)查找最后一對(duì)括號(hào);用midstr函數(shù)提取出來,用calculate函數(shù)進(jìn)行計(jì)算;并用le

3、ft函數(shù)與right函數(shù)及addstrings函數(shù)將所找到這對(duì)括號(hào)的左邊、右邊及運(yùn)算結(jié)果以字符串的形式合并成一個(gè)新的字符串;重復(fù)上述操作直至字符串中不再有括號(hào);最后用calculate函數(shù)進(jìn)行最后的計(jì)算返回計(jì)算結(jié)果。緊接著進(jìn)行是否退出計(jì)算的輸入判斷,完成程序反復(fù)運(yùn)算的功能。四、詳細(xì)設(shè)計(jì)判斷功能:用類中定義的judge函數(shù)實(shí)現(xiàn),返回值為1即合法,為0即不合法。 去除空格:定義p、s兩個(gè)指針指向字符串,r指針指向p指針實(shí)現(xiàn)p、s指針在字符串中的遍歷,用p指針找到第一處空格處,再用s指針找到p指向位置以后最近一個(gè)不是空格處,賦值語句*p=*s,繼續(xù)向下遍歷字符串直至結(jié)束。 非法輸入:定義destin

4、ation指向字符串,列舉算式中出現(xiàn)的合法的字符,通過遍歷字符串找到非法輸入字符,返回0; 非法算式邏輯:包括運(yùn)算符號(hào)相連,以及違背運(yùn)算法則等現(xiàn)象,通過對(duì)運(yùn)算符號(hào)的遍歷比較實(shí)現(xiàn);還有包括左括號(hào)前或右括號(hào)后緊挨數(shù)字,通過定義一個(gè)新字符串?dāng)?shù)組指向字符串來尋找括號(hào)并判斷括號(hào)前后是否合法;非法,返回0; 全都合法返回1.數(shù)字字符串轉(zhuǎn)換成數(shù)字:用類中定義的val函數(shù)實(shí)現(xiàn),擴(kuò)充到浮點(diǎn)數(shù)的運(yùn)算范圍。 定義char類型的source指針指向字符串,用charinstr函數(shù)尋找字符串中小數(shù)點(diǎn)位置,以此判斷整數(shù)還是浮點(diǎn)數(shù),如果整數(shù)即用10的相應(yīng)位數(shù)的乘方來乘以相應(yīng)字符位置字符的數(shù)字,并進(jìn)行累加,最后返回resul

5、t;如果是浮點(diǎn)數(shù),則分為整數(shù)與小數(shù)部分依次進(jìn)行計(jì)算,整數(shù)同上,小數(shù)部分則用相應(yīng)字符位置字符所代表的數(shù)字除以10的相應(yīng)位數(shù)的乘方,并進(jìn)行累加,最后將整數(shù)小數(shù)部分的和返回result。字符串的連接,通過類中定義的left、right、midstr、addstrings函數(shù)配合實(shí)現(xiàn)。 通過left、right、midstr三個(gè)函數(shù)進(jìn)行字符串的提取,addstrtings函數(shù)進(jìn)行三個(gè)指針的遍歷實(shí)現(xiàn)兩個(gè)字符串的合并。數(shù)字的字符串化,通過類中定義的str函數(shù)實(shí)現(xiàn)。 類比val函數(shù)一樣區(qū)分整數(shù)與浮點(diǎn)數(shù),將數(shù)字的每一個(gè)數(shù)字單個(gè)提取出來通過與字符0的比較轉(zhuǎn)化為相應(yīng)字符復(fù)制給遞增的指針。算式的計(jì)算,通過類中定義的

6、calculate函數(shù)實(shí)現(xiàn)。 依次按照*/+-的順序用charinstr函數(shù)尋找運(yùn)算符號(hào),并用相應(yīng)函數(shù)進(jìn)行字符串與數(shù)字之間的轉(zhuǎn)換,以及新的字符串的合并,返回計(jì)算結(jié)果。友元函數(shù)的定義,定義輸入輸出友元函數(shù),重載賦值運(yùn)算符等,實(shí)現(xiàn)字符串之間的加法。五、程序調(diào)試的過程 出現(xiàn)問題:開始編寫完整個(gè)程序,出現(xiàn)許多編寫錯(cuò)誤,一個(gè)個(gè)改正; 在實(shí)現(xiàn)浮點(diǎn)數(shù)的擴(kuò)充過程中的小數(shù)部分,以及輸入合法性的判斷過程漏掉情況,指針的誤用等; 有時(shí)單獨(dú)的一個(gè)函數(shù)不能搞懂或錯(cuò)誤不能改正,就單獨(dú)在編寫一個(gè)類似程序,多次調(diào)試運(yùn)行,來弄懂并加以改正;解決辦法:查閱書籍,上網(wǎng)搜索,獨(dú)立思考,詢問同學(xué)老師,多次上機(jī)調(diào)試等;六、輸入輸出數(shù)據(jù)開

7、始界面:非法輸入判斷: 非法字母:運(yùn)算符緊挨: 左括號(hào)前或右括號(hào)后為數(shù)字: 括號(hào)為中文符號(hào):清理空格:運(yùn)算第一個(gè)輸入字符串算式結(jié)果:退出判斷:繼續(xù)運(yùn)算:退出運(yùn)算:浮點(diǎn)數(shù)的加入:七、課程設(shè)計(jì)總結(jié) 經(jīng)過這次龐大復(fù)雜的課程設(shè)計(jì)過程,是我對(duì)c+知識(shí)有了更加深刻的理解,引起了我對(duì)c+語言世界的無限好奇心和探索欲,感慨到了世界的神奇與微妙,程序控制的無限用途以及自身的渺?。?在其中編寫判斷括號(hào)前后是否合法語句時(shí),指針遍歷不易實(shí)現(xiàn),于是經(jīng)過多次調(diào)試后重新定義了一個(gè)字符串?dāng)?shù)組來實(shí)現(xiàn),這給了我很大的啟示,只要努力并不斷嘗試新的東西一定會(huì)成功;還有程序中友元函數(shù)與運(yùn)算符重載部分,由于知識(shí)掌握不夠牢固,反復(fù)調(diào)試查閱

8、書籍,最終得到了解決,也使得我對(duì)這方面的知識(shí)獲得了更為深刻的理解與認(rèn)知;浮點(diǎn)數(shù)的加入要進(jìn)行小數(shù)點(diǎn)數(shù)位的取舍,函數(shù)中設(shè)定為小數(shù)點(diǎn)兒后六位,因此浮點(diǎn)數(shù)運(yùn)算過程中每次都會(huì)出現(xiàn)六位小數(shù)的現(xiàn)象,使得結(jié)果有0.000001的誤差,通過單獨(dú)編寫類似函數(shù)多次調(diào)試,使得我對(duì)c+語言中對(duì)double型向int型變量轉(zhuǎn)化的規(guī)律的理解獲得了更深層次的理解;通過編寫過程,體會(huì)到了細(xì)節(jié)的厲害,有時(shí)一個(gè)微小的錯(cuò)誤就能使整個(gè)程序而不能正確運(yùn)行;八、源程序注解#include<iostream.h>#include<string.h>#include<stdlib.h>char pause;

9、int len(char*source)/算出字符串的長素 int retval=0; while(*(source+retval+)!=0)return -retval;class CStr/定義字符串類 private:int nlen;/字符串長度 char *pstr;/字符串首地址public: CStr(); CStr(char *str) nlen=len(str);pstr=str; int Getlen()return nlen;/返回字符串長度char*Getstr()return pstr;/返回字符串首地址CStr(CStr&str)nlen=str.Getle

10、n();pstr=str.Getstr();/拷貝構(gòu)造函數(shù)char*Getpstr()return pstr;void midstr(CStr & str1,int start,int length);/*返回指定字符串類中從nStart序號(hào)開始nLength長度的字符*/ void left(CStr & str1,int length);/*返回指定字符串中從左邊開始nLength個(gè)字符*/ void right(CStr & str1,int length);/*返回指定字符串中從右邊開始nLength個(gè)字符*/ calculate();/計(jì)算該字符串所代表的四則

11、運(yùn)算的值(內(nèi)無括號(hào))friend int charinstr(char); /友元函數(shù),判斷字符是否在字符串中double val();/求字符串代表的數(shù)字字符的數(shù)值str(double val);/將數(shù)值表示成字符串的形式 friend istream &operator>>(istream &,CStr &);/重載輸入運(yùn)算符 int Judge();/判斷輸入是否合法,濾除空格;void CStr:left(CStr & str1,int length)/從參數(shù)指向的地址左邊取Length個(gè)字符賦給目的字符串char*destination=p

12、str;char *source=str1.Getstr();*(destination+-length+1)=0;/目的字符串以0 結(jié)尾 while(length>=0)/賦值Length個(gè)字符 *(destination+length)=*(source+length-); void CStr:midstr(CStr & str1,int start,int length)/從參數(shù)指向的地址處從start位置開始取length個(gè)字符賦給目的字符串char *source=str1.Getstr();source+=start-1;/開始賦值處的地址 char*destinat

13、ion=pstr;*(destination+-length+1)=0;/目的字符串以0 結(jié)尾while(length>=0)/賦值Length個(gè)字符*(destination+length)=*(source+length-); void CStr:right(CStr & str1,int length)/從參數(shù)指向的地址右邊取Length個(gè)字符賦給目的字符串char *source=str1.Getstr();while(*source!=0) source+; /移至字符串尾部char*destination=pstr;source-=length;/跳至欲賦值的首地址*

14、(destination+-length+1)=0;/目的字符串以0 結(jié)尾while(length>=0)/賦值Length個(gè)字符 *(destination+length)=*(source+length-); int charinstr( char *destination,char char_to_find)/判斷字符串char_to_find是否在目的字符串中,若在,返回其所在位置,若不再返回0 int pos=0;while(*(destination+pos)!=0)/循環(huán)查找 if(char_to_find=*(destination+pos+) return pos; /

15、找到,返回其位置return 0;CStr:str(double value)/將value的值轉(zhuǎn)換為字符串的形式返回,加入浮點(diǎn)數(shù) char*tempdest=pstr; int a=0; int b=(int)value;double c=value-b;int multiplier=1000000000;for(multiplier=1000000000;multiplier!=0;multiplier/=10)*tempdest='0'+(char)(b/multiplier);b-=(b/multiplier)*multiplier;if(*tempdest!='

16、;0')|(a)a+;tempdest+; if(c=0)/如果value為整數(shù)*tempdest=0;else/如果value為浮點(diǎn)數(shù)*tempdest+='.'for(a=1;a<=6;a+)c*=10;int d=(int)c;if(d!=0&&a<=6)*tempdest+='0'+d;c-=d; *tempdest=0;/賦值字符串最后一位為0char*addstrings(char*destination,char*source1,char*source2)/兩個(gè)字符串合并,結(jié)果在第一個(gè)參數(shù)中 char*tempd

17、est=destination; while(*source1!=0)*(tempdest+)=*(source1+); while(*source2!=0)*(tempdest+)=*(source2+);*tempdest=0;/NULLreturn destination;double pwr(double a,double b)/計(jì)算a的b次方double result=1; for(int c=1;c<=b;c+)result*=a; return result;double CStr:val()/將數(shù)字字符串轉(zhuǎn)換成數(shù)值(包括浮點(diǎn)數(shù))char*source=pstr;doubl

18、e result=0;CStr nstr(source); int z=charinstr(source,'.');/從source字符串中找到小數(shù)點(diǎn)if(z=0)/如果為整數(shù)int multiplier=(int)pwr(10,len(source)-1);while(*source!=0)/依次遍歷每一個(gè)字符result+=(*(source+)-'0')*multiplier;multiplier/=10;/將相應(yīng)字符轉(zhuǎn)化為對(duì)應(yīng)位數(shù)的整數(shù),并依次累加獲得所需整數(shù)數(shù)return result; else/如果為小數(shù),此時(shí)指針指向小數(shù)點(diǎn)的位置char a150

19、;CStr A1(a1);A1.left(nstr,z-1);/返回此時(shí)nstr指向的地址左邊的z-1個(gè)字符,即所需浮點(diǎn)數(shù)的整數(shù)部分char*nint=A1.Getstr();/將A1的內(nèi)容賦值給nint指針int multiplier=(int)pwr(10,len(nint)-1);/定義multiplier等于10的整數(shù)位數(shù)的乘方while(*nint!=0)result+=(double)(*(nint+)-'0')*multiplier;multiplier/=10; /將浮點(diǎn)數(shù)整數(shù)部分字符串轉(zhuǎn)換為數(shù)值char a350;CStr A3(a3);A3.midstr(n

20、str,z+1,len(source)-z);/返回從nstr指向地址的z+1位置開始的(len(source)-z)個(gè)字符,即所需浮點(diǎn)數(shù)的小數(shù)部分char *ndouble=A3.Getstr();/將A3的內(nèi)容賦值給ndouble指針for(multiplier=10;*ndouble!=0;ndouble+)/依次遍歷ndouble指向的每一個(gè)字符 result+=(double)(*(ndouble)-'0')/(double)multiplier; multiplier*=10; /將相應(yīng)字符除以對(duì)應(yīng)數(shù)位的10的乘方獲得該位的小數(shù)并依次相加return result;

21、char*assignstr(char*source,char*destination)/字符串賦值char*tempdest=destination;while (source!=0)*(tempdest+)=*(source+); *tempdest=0; return destination;CStr:calculate()/計(jì)算數(shù)字算式形式的字符串,將其轉(zhuǎn)換為數(shù)字形式并計(jì)算出來,然后再將結(jié)果轉(zhuǎn)換為字符串的形式,此算式?jīng)]有括號(hào),遵循的原則是先乘除后加減char*string=pstr; CStr nstr(string);char buf150,buf250,buf350,buf450,

22、buf550; CStr cuf1(buf1),cuf2(buf2),cuf3(buf3),cuf4(buf4),cuf5(buf5);char opstr6="/*+-"double leftnr;double rightnr;int oppos;int z;double result;for(int pos_in_opstr=0;pos_in_opstr<=4;pos_in_opstr+)/先找優(yōu)先級(jí)高的運(yùn)算符,直至將算式中所有的運(yùn)算符都找出來 while(charinstr(string,opstrpos_in_opstr) oppos=charinstr(st

23、ring,opstrpos_in_opstr);/找到后,將運(yùn)算符左邊的數(shù)字字符取出轉(zhuǎn)換為數(shù)字for (z=oppos-2;z>=0;z-)if (*(string+z)='+')|(*(string+z)='/')|(*(string+z)='-')|(*(string+z)='*')|(*(string+z)='')cuf1.midstr(nstr,z+2,oppos-z-2); leftnr=cuf1.val(); z=-1; else if(z=0)cuf1.left(nstr,oppos-1); l

24、eftnr=cuf1.val(); for(z=oppos;z<len(string);z+)/再將運(yùn)算符右邊的數(shù)字字符取出轉(zhuǎn)換為數(shù)字if(*(string+z)='+')|(*(string+z)='/')|(*(string+z)='-')|(*(string+z)='*')|(*(string+z)='')cuf2.midstr(nstr,oppos+1,z-oppos); rightnr=cuf2.val();z=len(string);else if(z=len(string)-1)cuf2.rig

25、ht(nstr,len(string)-oppos); rightnr=cuf2.val();/對(duì)這兩個(gè)數(shù)字進(jìn)行計(jì)算,結(jié)果在result中if(opstrpos_in_opstr='+')result=leftnr+rightnr;else if (opstrpos_in_opstr='-')result=leftnr-rightnr;else if (opstrpos_in_opstr='/')result=leftnr/rightnr;else if (opstrpos_in_opstr='*')result=leftnr*r

26、ightnr;else if (opstrpos_in_opstr='')result=pwr(leftnr,rightnr);/計(jì)算后,將結(jié)果轉(zhuǎn)換為字符串,然后將左右未運(yùn)算過的字符串與其連接起來cuf4.left(nstr,oppos-len(&buf10)-1);cuf5.str(result);addstrings(&buf30,cuf4.pstr,cuf5.pstr);cuf5.right(nstr,len(string)-oppos-len(&buf20);addstrings(string,cuf3.pstr,cuf5.pstr);cout&

27、lt;<"運(yùn)行的結(jié)果是"<<pstr<<endl;/輸出這個(gè)字符istream & operator>>(istream&is,CStr&ss) char a50;char *x=a;char *y=ss.pstr;cin.getline(x,50);while(*x!=0) *(y+)=*(x+);*y=0; return is;int CStr:Judge()/新增程序判斷功能/三個(gè)指針依次遍歷字符串,去除空格char *p,*s,*r,*source=pstr;p=source;s=p+1;while(

28、*p!=0)r=p;if(*p=' ') while(*s!=0) *p=*s;p+;s+;*p=0;p=r;s=p+1;continue;p=r+1;s=p+1; /找到除基本運(yùn)算符和數(shù)字外的非法輸入char *destination=source;while(*destination!=0)if('('<=*destination&&*destination<='+'|'-'<=*destination&&*destination<='/'|'0&

29、#39;<=*destination&&*destination<='9'|*destination=''|*destination=' ')destination+;elsereturn 0;/找到非法輸入,返回0/找到非法邏輯destination=pstr;if(*destination=''|*destination='*'|*destination='/'|*destination='+')/一開始為運(yùn)算符 return 0;int pos_in

30、_opstr;int pos;int z;char opstr6="/*+-"for(pos_in_opstr=0;pos_in_opstr<=4;pos_in_opstr+) while(charinstr(source,opstrpos_in_opstr)pos=charinstr(source,opstrpos_in_opstr);z=pos;if(*(source+z)=''|*(source+z)='*'|*(source+z)='/'|*(source+z)='+'|*(source+z)=&

31、#39;-'|*(source+z)=0)return 0;/運(yùn)算符后緊接著又是運(yùn)算符,返回0 z-=2;if(*(source+z)=''|*(source+z)='*'|*(source+z)='/'|*(source+z)='+'|*(source+z)='-'|*(source+z)=0)return 0;/兩個(gè)運(yùn)算符相距非法,返回0elsesource+=pos;/繼續(xù)遍歷字符串 char m50;int n=0;strcpy(m,pstr); while(mn) if(mn='('

32、;)if(n=0) n+;continue;/左括號(hào)位于開頭,繼續(xù)向下遍歷else if('0'<=mn-1&&mn-1<='9')return 0;break;/如果左括號(hào)左邊是數(shù)字,沒有運(yùn)算符號(hào),非法,返回0if(mn=')')if(mn+1=0) n+;continue;/右括號(hào)位于結(jié)尾,繼續(xù)else if('0'<=mn+1&&mn+1<='9')return 0;break;/如果右括號(hào)右邊是數(shù)字,沒有運(yùn)算符號(hào),非法,返回0n+;return 1;c

33、out<<"去除空格后的算式:"<<pstr<<endl;void main()CStr myrecord; cout<<"2 歡迎使用四則運(yùn)算程序 2 n"cout<<"2 2 n"cout<<"2 2 n" cout<<"2 2 n" cout<<"2 2 n"cout<<"2 2 n" cout<<"2 請按回車鍵繼續(xù) 2 n" cin.get(pause);system("cls");int choice=1; while(choice)/進(jìn)行退出判斷,使程序可以反復(fù)運(yùn)算 char strn50,duf150,duf250,duf350,duf450,duf550;CStr buf1(duf1),buf2(duf2),buf3(duf3),buf4(duf4),buf5(duf5),origin(strn),oristr(strn);int z,lastopen;cout<<"請輸入一個(gè)算式n&qu

溫馨提示

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

評(píng)論

0/150

提交評(píng)論