




版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 基因工程基礎(chǔ)
- 盾構(gòu)機(jī)吊裝吊拆安全協(xié)議出井模板
- 領(lǐng)導(dǎo)力培訓(xùn)提升企業(yè)核心競爭力
- 音樂與光影文化節(jié)的視聽盛宴設(shè)計(jì)
- 項(xiàng)目管理方法與實(shí)施策略培訓(xùn)
- 非物質(zhì)文化遺產(chǎn)在旅游業(yè)中的價(jià)值挖掘
- 顧客服務(wù)與無縫購物流程的深度融合
- 項(xiàng)目管理中的時(shí)間與資源分配策略
- 防空防災(zāi)知識(shí)的普及與教育
- 零售業(yè)中增強(qiáng)現(xiàn)實(shí)AR的顧客體驗(yàn)優(yōu)化策略
- 阿米巴模式的合同協(xié)議書
- 福建省泉州市晉江市2025屆數(shù)學(xué)七下期末調(diào)研試題含解析
- 技術(shù)員獎(jiǎng)勵(lì)協(xié)議書
- 北京市先農(nóng)壇體育運(yùn)動(dòng)技術(shù)學(xué)校招聘筆試真題2024
- GB 35181-2025重大火災(zāi)隱患判定規(guī)則
- 青科綜評面試真題及答案
- 中國科學(xué)院大學(xué)《高級(jí)人工智能》2023-2024學(xué)年第一學(xué)期期末試卷
- 中國保險(xiǎn)行業(yè)協(xié)會(huì)官方-2023年度商業(yè)健康保險(xiǎn)經(jīng)營數(shù)據(jù)分析報(bào)告-2024年3月
- 華南理工大學(xué)自主招生綜合素質(zhì)評價(jià)面試及試題指導(dǎo)
- (最新整理)模板-消防安全評估質(zhì)量過程控制體系(山東)
- 圓管切割機(jī)機(jī)構(gòu)設(shè)計(jì)
評論
0/150
提交評論