c++課程設計四則運算(共11頁)_第1頁
c++課程設計四則運算(共11頁)_第2頁
c++課程設計四則運算(共11頁)_第3頁
c++課程設計四則運算(共11頁)_第4頁
c++課程設計四則運算(共11頁)_第5頁
已閱讀5頁,還剩6頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、精選優(yōu)質文檔-傾情為你奉上Vc+課程設計報告題目名稱:四則運算班級:測控技術與儀器姓名:周賽學號:0一、程序功能簡介該程序用字符串形式接受一個帶括號的四則運算表達式,然后按照四則運算優(yōu)先級的算法先括號,后乘方、乘除、加減這樣的順序將這個算式解出。該程序的設計比較巧妙,是在主程序中反復查找最后一對括號,將其中的結果計算出來,去掉括號,這樣的過程持續(xù)下去,最后導致所有的括號都去除,解出算式。二、課程設計要求()用類的要求改寫程序,將數(shù)據(jù)和函數(shù)封裝到類中。()修改主程序,使程序可以反復運算,直到選擇退出為止。()擴充程序功能,使程序適合浮點數(shù)運算。()增加程序的判斷功能,當有非法的輸入時(如字母等)

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

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

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

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

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

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

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

9、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.Getlen();

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

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

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

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

14、tination+-length+1)=0;/目的字符串以0 結尾while(length>=0)/賦值Length個字符 *(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的值轉換為字符串的形式返回,加入浮點數(shù) char*tempdest=pstr; int a=0; int b=(int)value;double c=value-b;int multiplier=;for(multiplier=;multiplier!=0;multiplier/=10)*tempdest='0'+(char)(b/multiplier);b-=(b/multiplier)*multiplier;if(*tempdest!='0')|(a)a+;tempdest+

16、; if(c=0)/如果value為整數(shù)*tempdest=0;else/如果value為浮點數(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)/兩個字符串合并,結果在第一個參數(shù)中 char*tempdest=destination; while(*

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

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

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

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

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

22、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)先級高的運算符,直至將算式中所有的運算符都找出來 while(charinstr(string,opstrpos_in_opstr) oppos=charinstr(string,opstrpos_in_opstr);

23、/找到后,將運算符左邊的數(shù)字字符取出轉換為數(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); leftnr=cuf1.val(); for(z=

24、oppos;z<len(string);z+)/再將運算符右邊的數(shù)字字符取出轉換為數(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.right(nstr,len(string)-oppo

25、s); rightnr=cuf2.val();/對這兩個數(shù)字進行計算,結果在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*rightnr;else if (opstrpos

26、_in_opstr='')result=pwr(leftnr,rightnr);/計算后,將結果轉換為字符串,然后將左右未運算過的字符串與其連接起來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、;<<pstr<<endl;/輸出這個字符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()/新增程序判斷功能/三個指針依次遍歷字符串,去除空格char *p,*s,*r,*source=pstr;p=source;s=p+1;while(*p!=0)r=p;if(*p=' &#

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

29、p;&*destination<='9'|*destination=''|*destination=' ')destination+;elsereturn 0;/找到非法輸入,返回0/找到非法邏輯destination=pstr;if(*destination=''|*destination='*'|*destination='/'|*destination='+')/一開始為運算符 return 0;int pos_in_opstr;int pos;int z;cha

30、r 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)='-'|*(source+z)=0

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

32、括號位于開頭,繼續(xù)向下遍歷else if('0'<=mn-1&&mn-1<='9')return 0;break;/如果左括號左邊是數(shù)字,沒有運算符號,非法,返回0if(mn=')')if(mn+1=0) n+;continue;/右括號位于結尾,繼續(xù)else if('0'<=mn+1&&mn+1<='9')return 0;break;/如果右括號右邊是數(shù)字,沒有運算符號,非法,返回0n+;return 1;cout<<"去除空格后的算

33、式:"<<pstr<<endl;void main()CStr myrecord; cout<<"2 歡迎使用四則運算程序 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)/進行退出判斷,使程序可以反復運算 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<<"請輸入一個算式n"operato

溫馨提示

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

評論

0/150

提交評論