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

下載本文檔

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

文檔簡介

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

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

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

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

5、為整數(shù)與小數(shù)部分依次進行計算,整數(shù)同上,小數(shù)部分則用相應(yīng)字符位置字符所代表的數(shù)字除以10的相應(yīng)位數(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的比較轉(zhuǎn)化為相應(yīng)字符復(fù)制給遞增的指針。算式的計算,通過類中定義的calculate函數(shù)

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

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

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

9、!=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();pstr=str.Getstr();/拷貝構(gòu)造函數(shù)char*Getpstr()return pstr;void midstr(CStr

10、 & str1,int start,int length);/*返回指定字符串類中從nStart序號開始nLength長度的字符*/ void left(CStr & str1,int length);/*返回指定字符串中從左邊開始nLength個字符*/ void right(CStr & str1,int length);/*返回指定字符串中從右邊開始nLength個字符*/ calculate();/計算該字符串所代表的四則運算的值(內(nèi)無括號)friend int charinstr(char); /友元函數(shù),判斷字符是否在字符串中double val();/求字符串代表的數(shù)字字符的數(shù)值

11、str(double val);/將數(shù)值表示成字符串的形式 friend istream &operator(istream &,CStr &);/重載輸入運算符 int Judge();/判斷輸入是否合法,濾除空格;void CStr:left(CStr & str1,int length)/從參數(shù)指向的地址左邊取Length個字符賦給目的字符串char*destination=pstr;char *source=str1.Getstr();*(destination+-length+1)=0;/目的字符串以0 結(jié)尾 while(length=0)/賦值Length個字符 *(destina

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

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

14、ar *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; /找到,返回其位置return 0;CStr:str(double value)/將value的值轉(zhuǎn)換為字符串的形式返回,加入浮點數(shù) char*tempdest=pstr; int a=0; int b=(int)value;double c=value-

15、b;int multiplier=;for(multiplier=;multiplier!=0;multiplier/=10)*tempdest=0+(char)(b/multiplier);b-=(b/multiplier)*multiplier;if(*tempdest!=0)|(a)a+;tempdest+; 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;/賦值

16、字符串最后一位為0char*addstrings(char*destination,char*source1,char*source2)/兩個字符串合并,結(jié)果在第一個參數(shù)中 char*tempdest=destination; while(*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

17、=1;c=b;c+)result*=a; return result;double CStr:val()/將數(shù)字字符串轉(zhuǎn)換成數(shù)值(包括浮點數(shù))char*source=pstr;double result=0;CStr nstr(source); 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;/將相

18、應(yīng)字符轉(zhuǎn)化為對應(yīng)位數(shù)的整數(shù),并依次累加獲得所需整數(shù)數(shù)return result; else/如果為小數(shù),此時指針指向小數(shù)點的位置char a150;CStr A1(a1);A1.left(nstr,z-1);/返回此時nstr指向的地址左邊的z-1個字符,即所需浮點數(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;mul

19、tiplier/=10; /將浮點數(shù)整數(shù)部分字符串轉(zhuǎn)換為數(shù)值char a350;CStr A3(a3);A3.midstr(nstr,z+1,len(source)-z);/返回從nstr指向地址的z+1位置開始的(len(source)-z)個字符,即所需浮點數(shù)的小數(shù)部分char *ndouble=A3.Getstr();/將A3的內(nèi)容賦值給ndouble指針for(multiplier=10;*ndouble!=0;ndouble+)/依次遍歷ndouble指向的每一個字符 result+=(double)(*(ndouble)-0)/(double)multiplier; multipl

20、ier*=10; /將相應(yīng)字符除以對應(yīng)數(shù)位的10的乘方獲得該位的小數(shù)并依次相加return result;char*assignstr(char*source,char*destination)/字符串賦值char*tempdest=destination;while (source!=0)*(tempdest+)=*(source+); *tempdest=0; return destination;CStr:calculate()/計算數(shù)字算式形式的字符串,將其轉(zhuǎn)換為數(shù)字形式并計算出來,然后再將結(jié)果轉(zhuǎn)換為字符串的形式,此算式?jīng)]有括號,遵循的原則是先乘除后加減char*string=pstr

21、; CStr nstr(string);char buf150,buf250,buf350,buf450,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=0;z-)if (*(string+z)=+)|(*(string+z)=/)|(*(string+z)=-)|(*(string+z

22、)=*)|(*(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=oppos;zlen(string);z+)/再將運算符右邊的數(shù)字字符取出轉(zhuǎn)換為數(shù)字if(*(string+z)=+)|(*(string+z)=/)|(*(string+z)=-)|(*(string+z)=*)|(*(string+z)=)cuf2.midstr(nstr,oppos+1,z-oppos); righ

23、tnr=cuf2.val();z=len(string);else if(z=len(string)-1)cuf2.right(nstr,len(string)-oppos); rightnr=cuf2.val();/對這兩個數(shù)字進行計算,結(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_op

24、str=*)result=leftnr*rightnr;else if (opstrpos_in_opstr=)result=pwr(leftnr,rightnr);/計算后,將結(jié)果轉(zhuǎ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運行

25、的結(jié)果是pstr(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= ) while(*s!=0) *p=*s;p+;s+;*p=0;p=r;s=p+1;continue;p=r+1;s=p+1; /找到除基本

26、運算符和數(shù)字外的非法輸入char *destination=source;while(*destination!=0)if(=*destination&*destination=+|-=*destination&*destination=/|0=*destination&*destination=9|*destination=|*destination= )destination+;elsereturn 0;/找到非法輸入,返回0/找到非法邏輯destination=pstr;if(*destination=|*destination=*|*destination=/|*destination

27、=+)/一開始為運算符 return 0;int pos_in_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)=-|*(source+z)=0)return 0;

28、/運算符后緊接著又是運算符,返回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;/左括號位于開頭,繼續(xù)向下遍歷else if(0=mn-1&mn-1=9)return 0;break;/如果左括號左邊是數(shù)字,沒有運算符號,非法,返回0if(mn=)if(mn+1=0) n+;continue;/右括號位于結(jié)尾,繼續(xù)else if(0=mn+1&mn+1=9)return 0;break;/如果右括號右邊是數(shù)字,沒有運算符號,非法,返回0n+;return 1;cout去除空格后的算式:pstrendl;void main()CStr myrecord; cout2 歡迎使用四則運算程序 2 n;cout2 2 n;cout2 2 n; cout2 2 n; cout2 2 n;cout2 2 n; cout2 請按回車鍵繼續(xù) 2 n; cin.get(p

溫馨提示

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

評論

0/150

提交評論