版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、/*程序名稱:表達式計算器編譯環(huán)境:Microsoft Visual C+ 6.0時間:200801*/*說明:采用樹形結(jié)構(gòu)處理表達式,按優(yōu)先級運算結(jié)果,一個加,減,乘,除或數(shù)值為一個節(jié)點優(yōu)先級如下:函數(shù):4括號:3乘除:2加減:1*/#include <windows.h>#include <iostream>#include <fstream>#include <string>#include <cmath>using namespace std;const char NUM='0','1',
2、9;2','3','4','5','6','7','8','9','.'const char OPERATION='+','-','*','/'const double PI=3.14159265358979;const double EE=2.71828182818281;class Fun /處理系統(tǒng)數(shù)學(xué)函數(shù)的類public:Fun(string o,int t,double l=0.0,do
3、uble r=0.0):op(o),type(t),lvalue(l),rvalue(r)static string FUN;double calc();private:int type; /666 0 1 sin90 2 3! 3 3C2 string op; /函數(shù)類型double lvalue; /函數(shù)左邊的值double rvalue; /函數(shù)右邊的值static int FunNum;int Fun:FunNum=10;string Fun:FUN="!","sin","cos","tan","
4、log","ln","C","A","","-"/*函數(shù)說明:1:log是以10為底的工程對數(shù)2:ln 是以e為底的自然對數(shù)3:C 計算組合數(shù) 輸入規(guī)則 如計算 3取2的組合 輸入表達式 3C24:A 計算排列數(shù) 輸入規(guī)則 如計算 3取2的排列 輸入表達式 3A25:! 計算階乘6: x的y次方 輸入 xy*/int factorial(int n) /階乘函數(shù)int i,s=1;for(i=1;i<=n;i+)s*=i;return s;int C(int a,int b)re
5、turn factorial(a)/(factorial(b)*factorial(a-b);int A(int a,int b)return factorial(a)/factorial(b);double Fun:calc() /計算系統(tǒng)函數(shù)的值if(type=0)return lvalue;elseif(op="!")return factorial(lvalue);if(op="sin")return sin(rvalue/180*PI);if(op="cos")return cos(rvalue/180*PI);if(op=
6、"tan")return tan(rvalue/180*PI);if(op="log")return log10(rvalue);if(op="ln")return log10(rvalue)/log10(EE);if(op="C")return C(lvalue,rvalue);if(op="A")return A(lvalue,rvalue);if(op="")return pow(lvalue,rvalue);if(op="-")return -rv
7、alue;elsestring err="暫時沒有函數(shù)"+op;MessageBox(NULL,err.c_str(),"錯誤",MB_OK);return 0;struct Unit /雙向鏈表保存運算單元Unit(int p,char o,string c,double v,int t,Unit * pr=NULL,Unit * n=NULL):PRI(p),Operation(o),Code(c),value(v),Type(t),Pre(pr),Next(n)int PRI; /優(yōu)先級char Operation; /操作符string Code
8、; /原始代碼double value; /數(shù)據(jù)int Type; /類型 操作符0 數(shù)據(jù)1 函數(shù)2Unit * Pre; /構(gòu)成雙向鏈表Unit * Next;class Node /表達式樹狀結(jié)構(gòu)的節(jié)點public:Node(char o,int p,int e=1,double v=0,Node * ph=NULL,Node * pl=NULL,Node * pr=NULL):Operation(o),PRI(p),Expression(e),value(v),Head(ph),Left(pl),Right(pr)Node * Head; /節(jié)點的根,左樹枝,右樹枝Node * Left
9、;Node * Right;double GetValue();char GetOperation() const return Operation;int GetPri() const return PRI;int IsExp() const return Expression;private:char Operation; /操作符int PRI; /優(yōu)先級int Expression; /記錄該節(jié)點是否是表達式0 1double value; /該節(jié)點的值;double Node:GetValue() /運算該節(jié)點的值if(IsExp() /該節(jié)點的值還未算出來double lvalue
10、,rvalue;lvalue=Left->GetValue();rvalue=Right->GetValue();Expression=0;char op=GetOperation();switch(op)case '+':return lvalue+rvalue;case '-':return lvalue-rvalue;case '*':return lvalue*rvalue;case '/':return lvalue/rvalue;default:return 0;elsereturn value;bool
11、Isnum(char c)for(int i=0;i<sizeof(NUM);i+)if(c=NUMi)return true;return false;bool Isoperation(char c)for(int i=0;i<sizeof(OPERATION);i+)if(c=OPERATIONi)return true;return false;Unit * Analyse(string exp) /分析表達式并生成鏈表int pri=0; /當前優(yōu)先級int stat=1; /當前的讀入狀態(tài) 括號 0 運算符 1 其他 2Unit * head=NULL,* p=NULL;
12、int i=0,explen;explen=exp.size();for(i=0;i<explen;i+)char c=exp.at(i);if(c='(')pri+=3;stat=0;else if(c=')')pri-=3;stat=0;else if(Isoperation(c) && stat!=1) /操作符后的當正負號處理stat=1;Unit * temp=p;int add_pri; /自身增加的優(yōu)先級if(c='+' | c='-')add_pri=1;elseadd_pri=2;p->
13、;Next=new Unit(pri+add_pri,c," ",0,0);p=p->Next;p->Pre=temp;else /其他的當做函數(shù)處理stat=2;string function=""while(i<explen && (c=exp.at(i),! Isoperation(c) && c!=')')function+=c;i+;i-;if(head=NULL)p=new Unit(pri,' ',function,0,2);head=p;elseUnit *
14、 temp=p;p->Next=new Unit(pri,' ',function,0,2);p=p->Next;p->Pre=temp;return head;Unit * Calc(Unit * head) /計算雙向鏈表基本單元的值Unit * p=head;while(p!=NULL)if(p->Type!=0) /非操作符string temp=p->Code;string op;double lvalue=0,rvalue=0;int l_point=0,r_point=0;int i=0,type=0;char ch;while(i&
15、lt;temp.size() && (ch=temp.at(i),Isnum(ch)if(ch='.')l_point+;i+;continue;if(! l_point)lvalue*=10;lvalue+=(ch-'0')*pow(10,-l_point);i+;if(l_point)l_point+;while(i<temp.size() && (ch=temp.at(i),! Isnum(ch)op+=ch;type=1;i+;while(i<temp.size() && (ch=temp.at
16、(i),Isnum(ch)if(ch='.')r_point+;i+;continue;if(! r_point)rvalue*=10;rvalue+=(ch-'0')*pow(10,-r_point);i+;if(r_point)r_point+;Fun * f=new Fun(op,type,lvalue,rvalue);p->value=f->calc();p=p->Next;return head;Node * Tree(Unit * head) /生成表達式樹Node * root=NULL,* proot=NULL,* pbranc
17、h=NULL;Unit * p=head;int now_pri; /當前優(yōu)先級bool hadop=false;while(p!=NULL)if(p->Type=0) /如果是一個操作符hadop=true;if(root=NULL)proot=new Node(p->Operation,p->PRI,1);root=proot;pbranch=root;now_pri=p->PRI;proot->Left=new Node(' ',0,0,p->Pre->value);proot->Right=new Node(' &
18、#39;,0,0,p->Next->value);elseif(p->PRI<now_pri) /優(yōu)先級低于當前優(yōu)先級,樹根方向proot=new Node(p->Operation,p->PRI,1); /新的樹根proot->Left=root; /根的變換proot->Left->Head=proot;proot->Right=new Node(' ',0,0,p->Next->value);proot->Right->Head=proot;root=proot;pbranch=proot
19、; /右樹枝的變換/pbranch->Right=new Node(' ',0,0,p->Pre->value); /樹枝右邊取值else if(p->PRI=now_pri) /優(yōu)先級相同,先算左邊的Node * temp;temp=new Node(p->Operation,p->PRI,1);temp->Left=pbranch;if(pbranch->Head=NULL)proot=temp;root=proot;pbranch->Head=proot;elseNode * temp0;temp0=pbranch-&
20、gt;Head;temp0->Right=temp;temp->Head=temp0;pbranch->Head=temp;pbranch=temp;pbranch->Right=new Node(' ',0,0,p->Next->value);pbranch->Right->Head=pbranch;elseNode * temp;temp=new Node(p->Operation,p->PRI,1);pbranch->Right=temp;temp->Head=pbranch;pbranch=pbranch->Right;pbranch->Left=new Node(' ',0,0,p->Pre->value);pbranch->Left->Head=pbranch;pbranch->Right=new Node(' ',0,0,p->Next->value);pbranch->Right-&
溫馨提示
- 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)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度新型農(nóng)業(yè)用地承包與轉(zhuǎn)讓合同協(xié)議3篇
- 2025石材資源開發(fā)與承包管理服務(wù)協(xié)議3篇
- 2025年度智能家居系統(tǒng)設(shè)計與安裝服務(wù)合同3篇
- 個人日常運營資金貸款協(xié)議范本版B版
- 二零二五年貨物采購合同(食品)
- 2025版兄弟姐妹房產(chǎn)分配及分割協(xié)議書范本3篇
- 個人信用評估服務(wù)合同2024年度范本datainputs3篇
- 二零二五年戰(zhàn)略性新興產(chǎn)業(yè)項目投標管理制度合同3篇
- 二零二五年度美團打車出行安全保障及應(yīng)急處理合同4篇
- 長沙醫(yī)學(xué)院《中國古代文學(xué)作品選讀2》2023-2024學(xué)年第一學(xué)期期末試卷
- 寒假作業(yè)一年級上冊《數(shù)學(xué)每日一練》30次打卡
- 2024-2025學(xué)年九年級化學(xué)上冊 第二單元 單元測試卷(人教版)
- 2024年公共衛(wèi)生基本知識考試題庫(附含答案)
- 2024多級AO工藝污水處理技術(shù)規(guī)程
- 2024年江蘇省鹽城市中考數(shù)學(xué)試卷真題(含答案)
- DZ∕T 0287-2015 礦山地質(zhì)環(huán)境監(jiān)測技術(shù)規(guī)程(正式版)
- 2024年合肥市廬陽區(qū)中考二模英語試題含答案
- 質(zhì)檢中心制度匯編討論版樣本
- 藥娘激素方案
- 提高靜脈留置使用率品管圈課件
- GB/T 10739-2023紙、紙板和紙漿試樣處理和試驗的標準大氣條件
評論
0/150
提交評論