《C高級編程》源代碼的進_第1頁
《C高級編程》源代碼的進_第2頁
《C高級編程》源代碼的進_第3頁
《C高級編程》源代碼的進_第4頁
《C高級編程》源代碼的進_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論