C++四則運(yùn)算程序代碼(共7頁)_第1頁
C++四則運(yùn)算程序代碼(共7頁)_第2頁
C++四則運(yùn)算程序代碼(共7頁)_第3頁
C++四則運(yùn)算程序代碼(共7頁)_第4頁
C++四則運(yùn)算程序代碼(共7頁)_第5頁
已閱讀5頁,還剩2頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、四則表達(dá)式計(jì)算一、程序分析和設(shè)計(jì) 把整個(gè)表達(dá)式存為字符數(shù)組,按照四則運(yùn)算規(guī)則尋找其中的運(yùn)算符號(hào),然后提取左右兩側(cè)操作數(shù)計(jì)算,用計(jì)算結(jié)果替換掉計(jì)算的表達(dá)式,這樣整體表達(dá)式會(huì)被簡化,繼續(xù)重復(fù)這個(gè)過程,直到找不到運(yùn)算符為止。1) 運(yùn)算表達(dá)式的存儲(chǔ)定義字符數(shù)組來存儲(chǔ)即可,注意由于運(yùn)算過程中可能會(huì)出現(xiàn)小數(shù),而小數(shù)會(huì)導(dǎo)致表達(dá)式長度增加,所以定義時(shí)字符數(shù)組長度應(yīng)該足夠(比如1000)并且計(jì)算結(jié)果應(yīng)該減少精度,比如保留小數(shù)點(diǎn)后面三位。2) 數(shù)和字符數(shù)組之間的轉(zhuǎn)化提取出來的操作數(shù)實(shí)際為字符序列,計(jì)算前我使用 atof(定義在stdlib.h) 轉(zhuǎn)化為浮點(diǎn)數(shù)運(yùn)算,同樣的,運(yùn)算結(jié)果要替換表達(dá)式中的字符序列也需要先轉(zhuǎn)

2、化為字符串才行,我使用 sprintf 函數(shù),該函數(shù)定義在 stdio.h 中字符串的連接使用了 strcat(string.h) 等函數(shù)。3) 計(jì)算邏輯設(shè)pstr 為計(jì)算表達(dá)式/先算乘除for(int i=1;istrlen(pstr);i+) If(如果當(dāng)前位置字符為*或者/) 把運(yùn)算符保存在ysf中 從該位置左邊找前邊的操作符獲取左邊要計(jì)算的數(shù)據(jù)coml和該數(shù)據(jù)前的字符串strleft從該位置右邊找后邊的操作符獲取右邊要計(jì)算的數(shù)據(jù)comr和該數(shù)據(jù)后的字符串 strright將數(shù)據(jù)變換成浮點(diǎn)型運(yùn)算再轉(zhuǎn)換為字符型的結(jié)果連接 strleft + 結(jié)果 + stright 組成新字符串替換掉 p

3、str /再找加減/代碼與找乘除的過程類似為了代碼簡單,中途設(shè)計(jì)了幾個(gè)計(jì)算函數(shù)double jia(char x,char y);/字符加法返回double的值double jian(char x,char y);/字符減法返回double的值double cheng(char x,char y);/字符乘法返回double的值double chu(char x,char y);/字符除法返回double的值double xsd(char x);/字符檢測是否有小數(shù),返回double的值為了可以重復(fù)輸入,開頭使用了個(gè)do while ,為了可以輸入-1+2這種表達(dá)式,我設(shè)計(jì)了個(gè)判斷,如果第一字

4、符是+或-我給整體表達(dá)式前加了個(gè)0字符這樣就轉(zhuǎn)化為一般的字符了!如果是* /則提示出錯(cuò),別重新輸入!二、程序主要代碼#include#include/atof函數(shù)的頭文件#include/sprintf函數(shù)的頭文件#define MAX 255/宏定義常量#includedouble cmjia(char x,char y);/聲明函數(shù)double cmjian(char x,char y);double cmcheng(char x,char y);double cmchu(char x,char y);double compute(char pstr);double xsd(char x)

5、;/主函數(shù)void main()do double t;/存儲(chǔ)運(yùn)算結(jié)果char a=0;char linshiMAX;/計(jì)算臨時(shí)用的 char biaodashiMAX;/用來存放表達(dá)式 for(;)/輸入表達(dá)式 cout請輸入一個(gè)正確的數(shù)學(xué)表達(dá)式,形如7+8*6,按回車結(jié)束biaodashi; if(biaodashi0=*|biaodashi0=/) cout您輸入的表達(dá)式有誤,請重新輸入endl;/判斷首字符是否為*/,如果是提示錯(cuò)誤別返回重新輸入else break;if(biaodashi0=-|biaodashi0=+)/判斷首字符是否為+-,如果是給字符前加字符0 strcat(

6、a,biaodashi);strcpy(biaodashi,a);strcpy(linshi,biaodashi); t=compute(linshi);/計(jì)算cout運(yùn)算結(jié)果是:biaodashi=tendl;/輸出結(jié)果while(1);/計(jì)算完返回,接著輸入 /自定義函數(shù)double xsd(char x)/判斷是否有小數(shù)點(diǎn),并把字符型轉(zhuǎn)化為浮點(diǎn)型for(int i=0;istrlen(x);i+)if(xi=.) double num = 0.0; sscanf(x, %f, &num);/return num; else return atof(x);double cmjia(char

7、 x,char y)/計(jì)算兩字符加法,并返回double型值 double a,b;a=xsd(x);b=xsd(y);double c=a+b;return c;double cmjian(char x,char y)/計(jì)算兩字符減法,并返回double型值double a,b;a=xsd(x);b=xsd(y);double c=a-b;return c;double cmcheng(char x,char y)/計(jì)算兩字符乘法,并返回double型值 double a,b;a=xsd(x);b=xsd(y);double c=a*b;return c;double cmchu(char

8、x,char y)/計(jì)算兩字符除法,并返回double型值 double a,b;a=xsd(x);b=xsd(y);double c=a/b;return c;double compute(char pstr)/char strleftMAX,strrightMAX,comlMAX,comrMAX,comMAX,ysf;/ysf代表運(yùn)算符double comzhi,zhi;/comzhi代表中途計(jì)算的值,com代表comzhi所對應(yīng)的字符型 int n=0;/先算乘除for(int i=0;i=0;j-)if(pstrj=-|pstrj=+)for(int k=0;k=j;k+) strle

9、ftk=pstrk;strleftk=0;/獲取左邊要計(jì)算數(shù)據(jù)前的字符串strleft for(k=j+1,n=0;ki;k+,n+) comln=pstrk;comln=0;/獲取左邊要計(jì)算的數(shù)據(jù)comlbreak;elsefor(int k=0;ki;k+) comlk=pstrk; strleft0=0;/獲取右邊要計(jì)算的數(shù)據(jù)comr和該數(shù)據(jù)后的字符串 strrightfor(j=i+1;j=strlen(pstr);j+) if(pstrj=-|pstrj=+|pstrj=*|pstrj=/|pstrj=0)for(int k=0,n=j;kstrlen(pstr)-i-1;k+,n+

10、) strrightk=pstrn;strrightk=0; for(k=i+1,n=0;kj;k+,n+) comrn=pstrk;comrn=0;break; if(ysf=*)/如果是* comzhi=cmcheng(coml,comr); sprintf(com,%.3f,comzhi);else/如果是/comzhi=cmchu(coml,comr);sprintf(com,%.3f,comzhi);strcat(strleft,com);/把數(shù)據(jù)前的字符和運(yùn)算后的字符連接strcat(strleft,strright);/把數(shù)據(jù)后的字符和運(yùn)算后的字符連接 strcpy(pstr,s

11、trleft);/替換pstr/重新找操作符/再找加減for(i=0;istrlen(pstr);i+)if(pstri=+|pstri=-)ysf=pstri; /獲取左邊要計(jì)算的數(shù)據(jù)comlfor(int k=0;ki;k+) comlk=pstrk;comlk=0;/獲取右邊要計(jì)算的數(shù)據(jù)和該數(shù)據(jù)后的字符串 strright for(int j=i+1;j=strlen(pstr);j+) if(pstrj=-|pstrj=+|pstrj=0)for(int k=0,n=j;k=strlen(pstr)-j;k+,n+) strrightk=pstrn; strrightk=0; for(k=i+1,n=0;kj;k+,n+) comrn=pstrk; comrn=0; break; if(ysf=+)comzhi=cmjia(coml,comr); sprintf(com,%.3f,comzhi); elsecomzhi=cmjian(coml,comr); sprintf(com,%.3f,comzhi);strcat(com,strrig

溫馨提示

  • 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

提交評論