版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、C+語言編寫。#include<iostream>#include<cmath>#include<string>usingnamespacestd;constintSIZE=1000;typedefstructnode/為了處理符號而建立的鏈表(如:1+(-2)chardata;node*next;node;typedefstructstack_num/存儲數(shù)的棧double*top;double*base;stack_num;typedefstructstack_char/存儲運算符號的棧char*top;char*base;stack_char;stac
2、k_numS_num;/定義stack_charS_char;/定義charfu18='n',')','+','-','*','/','%','"'Q','L','C','S','T','c','s','t','('intcompare1000;/表現(xiàn)出各運算符號的優(yōu)先級doubleshu1000;/存儲"數(shù)&qu
3、ot;的數(shù)組doubledai_result;/運算的結(jié)果,是為了處理M運算(簡介函數(shù)里有M的定義)intbiao=0;/和dia_result一樣,為了處理M運算charlineSIZE;/輸入的所要計算的表達式voidinit()/初始化comparefu0=-2;/用數(shù)字的大小表現(xiàn)出符號的優(yōu)先級comparefu1=-1;comparefu2=2;comparefu3=2;comparefu4=4;comparefu5=4;comparefu6=4;comparefu7=5;for(inti=8;i<=15;i+)comparefui=6;comparefu16=7;S_num.b
4、ase=(double*)malloc(sizeof(double)*SIZE);/S_char.base=(char*)malloc(sizeof(char)*SIZE);/S_num.top=S_num.base;S_char.top=S_char.base;voidpush_num(doublen)/數(shù)字進棧* +S_num.top=n;voidpush_char(charc)/運算符號進棧* +S_char.top=c;doublepop_num()/數(shù)字出棧doublem=*S_num.top;S_num.top-;returnm;charpop_char()/運算符號出棧為棧開辟空
5、間同上charcc=*S_char.top;S_char.top-;returncc;charget_top_char()/得到運算符號的棧中最頂端的運算符號return*S_char.top;doubleoperate(doubley,charc,doublex)/對兩個數(shù)計算(含是雙目運算符:如*,/等等)doubler;if(c='-')r=x-y;elseif(c='+')r=x+y;elseif(c='/'&&y!=0)r=x/y;elseif(c='*')r=x*y;elseif(c='A
6、9;)r=1;for(inti=1;i<=y;i+)r*=x;elseif(c='%')intr0=(int)x%(int)y;r=double(r0);returnr;doubleoperate_one(doubleone,charcc)/對一個數(shù)運算(含單目運算符:如log(L),sin(S)等等)doubler;if(cc='Q')r=sqrt(one);elseif(cc='C')r=cos(one);elseif(cc='S')r=sin(one);elseif(cc='T')r=tan(one);
7、elseif(cc='c')r=acos(one);elseif(cc='s')r=asin(one);elseif(cc='t')r=atan(one);returnr;求對數(shù)的值doubleoperate_L(doublea,doubleb,chardian)/doubler=log(b)/log(a);returnr;doublecompute()/對整個表達式的計算charc;/表示運算符號intp=0;/用于shu+p,先初始化inti,j;init();/進行初始化push_char('n');linestrlen(l
8、ine)='n'linestrlen(line)+1='0'if(biao)push_num(dai_result);/把運算的結(jié)果先進棧,在這個結(jié)果的基礎(chǔ)上繼續(xù)進行運算biao=0;for(i=0;linei!='0')/把表達式中的數(shù)字字符串轉(zhuǎn)化成可計算的數(shù)字intflag=0;intflag1=1;/標(biāo)記是否是運算符號/intflag2=1;/標(biāo)記是否出現(xiàn)'_'doubleh=0;intge;/位數(shù)intbiao_dian=0;/是否是小數(shù)的類型while(1)flag1=1;for(j=0;j<=16;j+)if(l
9、inei=fuj)flag1=0;break;if(linei='_')(break;)if(linei='.')(i+;ge=0;biao_dian=1;)if(linei='P')(shu+p=pi;i+;break;)if(linei='E')(shu+p=e;break;if(flag1)h=h*10+(linei-'0');flag=1;i+;if(biao_dian)ge+;elsebreak;if(flag)if(biao_dian)intr=1;for(intk=1;k<=ge;k+)r*=1
10、0;h/=r;shu+p=h;/把轉(zhuǎn)化而來的數(shù)字存于數(shù)組if(linei='+')shu+p=-1;elseif(linei='-')shu+p=-2;elseif(linei='*')shu+p=-3;elseif(linei='/')shu+p=-4;elseif(linei='%')shu+p=-5;elseif(linei=,A,)shu+p=-6;elseif(linei='Q')shu+p=-7;elseif(linei='L')shu+p=-8;elseif(linei
11、='C')shu+p=-9;elseif(linei='S')shu+p=-10;shu+p=-11;elseif(linei='c')shu+p=-12;elseif(linei='s')shu+p=-13;elseif(linei='t')shu+p=-14;elseif(linei='(')shu+p=-15;elseif(linei=')')shu+p=-16;elseif(linei='n')shu+p=-17;i+;)i=1;while(shui!=-17
12、|get_top_char()!='n')doublem=shui;push_num(m);i+;)else(if(m=-1)c='+'elseif(m=-2)c='-'elseif(m=-3)c='*'elseif(m=-4)c='/'elseif(m=-5)c='%'elseif(m=-6)c=,A,;elseif(m=-7)c='Q'elseif(m=-8)c='L'c='C'elseif(m=-10)c='S'elseif(m=
13、-11)c='T'elseif(m=-12)c='c'elseif(m=-13)c='s'elseif(m=-14)c='t'elseif(m=-15)c='('elseif(m=-16)c=')'elseif(m=-17)c='n'charch=get_top_char();/得到最頂端運算符號if(comparech<comparec)/運算符號級別的比較push_char(c);elseif(ch='('&&c=')')po
14、p_char();i+;elseif(comparech>=comparec&&ch!='('&&ch!='n')if(ch='Q'|ch='C'|ch='S'|ch='T'|ch='c'|ch='s'|ch='t')doubleone=pop_num();chardian=pop_char();push_num(operate_one(one,dian);elseif(ch='L')doubleo
15、ne_L=pop_num();doubletwo_L=pop_num();chardian=pop_char();push_num(operate_L(two_L,one_L,dian);elsedoublex=pop_num();doubley=pop_num();chardian=pop_char();if(dian='/'&&x=0)/判斷是否除了"零"cout<<"由于您除了零,結(jié)果將是錯誤的"<<endl;push_num(operate(x,dian,y);/把進行一次計算的結(jié)果入棧el
16、sepush_char(c);i+;doubleresult=pop_num();/得到結(jié)果returnresult;intcheck_kuohao()/檢查表達式括號是否匹配inti,f=0;intkuoSIZE,key=1;memset(kuo,0,sizeof(kuo);for(i=0;linei!='0'i+)if(linei='(')kuo+f=1;elseif(linei=')')if(kuof=1)kuof=0;f-;elsekey=0;break;if(key&&f=0)return1;elsereturn0;)i
17、ntcheck_char()/檢查運算符號是否合法(如:1+*4)inti,ge;for(i=0;linei!='0')ge=0;while(linei='+'|linei=|linei=|linei=7'|linei='%'|linei=,A,|linei='Q'|linei='L'|linei='S'|linei='C|linei=T|linei='s'|linei='c'|linei='t')ge+;i+;i+;if(ge>
18、=3)return0;elsereturn1;voidoutput(doubleresult)/打出結(jié)果printf("所得結(jié)果是:");cout<<result<<endl;voidcheck()/檢查表達式是否合法voidintroduce();charcc;/決定計算器按哪種功能進行計算doubleresult;/結(jié)果voidinput();/定義if(check_kuohao()&&check_char()/看是否合法,合法則計算result=compute();output(result);cout<<"
19、;輸入一個字符'M'或'D'或'F',決定是否繼續(xù):"<<endl;while(cin>>cc)if(cc='M')system("cls");introduce();printf("您上次所得結(jié)果為:");cout<<result<<endl;cout<<"在上次計算結(jié)果的基礎(chǔ)上,請繼續(xù)輸入想計算的表達式<<endl;dai_result=result;biao=1;input();/輸入表達式br
20、eak;elseif(cc='D')system("cls");introduce();cout<<"計算器已清零,請輸入您所要計算的表達式"<<endl;input();/輸入表達式break;elseif(cc='F')system("cls");cout<<"計算器關(guān)閉,謝謝使用!"<<endl;break;elsecout<<"所輸入字符無效,請輸入一個字符'M'或'D'或&
21、#39;F'!"<<endl;continue;else/不合法,分兩種不合法if(check_kuohao()=0&&check_char()=1)cout<<"您所輸入的表達式括號不匹配,請重新輸入:"<<endl;input();/輸入表達式elsecout<<"您所輸入的表達式不合法,請重新輸入:"<<endl;input();/輸入表達式voidtackle_fuhao()/處理負號node*root,*head,*p,*q,*p1;root=head
22、=newnode;head->next=NULL;inti;for(i=0;linei!='0'i+)/建立鏈表p=newnode;p->data=linei;p->next=head->next;head->next=p;head=p;/deletep;q=(node*)malloc(sizeof(node);head=root;if(root->next->data='+'|root->next->data='-')/處理第一個字符p=newnode;p->data='0
23、39;p->next=head->next;head->next=p;if(root->next!=NULL)for(q=root->next;q;q=q->next)if(q->data='('&&(q->next->data='-'|q->next->data='+')p=newnode;p->data='0'p->next=q->next;q->next=p;/deleteq;p1=newnode;intqi=-1;fo
24、r(p1=root->next;p1;p1=p1->next)line+qi=p1->data;line+qi='0'voidinput()/輸入cin>>line;if(biao=0)tackle_fuhao();/處理負號check();/檢查表達式是否合法voidintroduce()/對計算器的符號功能的簡要介紹cout<<"計算器簡要介紹"<<endl;cout<<"C(cos) S(sin)<<endl;cout<<"789/<<endl;cout<<"456*cout<<"12<<endl;cout<<"0 .+ A(cout<<" 對于對數(shù)輸入 L2_5T(tan) a(arccos)c(arcsin)on t(arctan)% L(log)"<<endl;3-M(M+) Q(sqrt)乘方 ) F(off)
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024范文大全商鋪租期延長合同:租期調(diào)整與費用計算3篇帶眉腳
- 小學(xué)生英語學(xué)習(xí)中的語音感知與標(biāo)準(zhǔn)朗讀訓(xùn)練
- 二零二五年度海上貨物運輸與船舶融資租賃合同
- 安全電路設(shè)計從理論到實踐的探索
- 2025安置房工程建設(shè)項目環(huán)境保護驗收合同3篇
- 2025年度珠寶設(shè)計與加工出口合同3篇
- 二零二五年度智慧城市基礎(chǔ)設(shè)施運維合同2篇
- 醫(yī)療健康領(lǐng)域的政策與法規(guī)分析
- 學(xué)校教育質(zhì)量評估的維度與方法探討
- 2025年度城市綠化景觀建設(shè)項目承包合同范本3篇
- 2022-2023學(xué)年江蘇省鹽城第一學(xué)期高一期末考試數(shù)學(xué)試卷及答案解析-普通用卷
- 醫(yī)師病理知識定期考核試題與答案
- 履約情況證明(共6篇)
- 礦井提升容器課件
- 云南省迪慶藏族自治州各縣區(qū)鄉(xiāng)鎮(zhèn)行政村村莊村名居民村民委員會明細
- 《潔凈工程項目定額》(征求意見稿)
- 城鎮(zhèn)燃氣設(shè)計規(guī)范
- 年零售藥店操作規(guī)程版
- 日有所誦(二年級)
- 搞笑個性YY娛樂頻道分組設(shè)計圖
- 靜力觸探技術(shù)標(biāo)準(zhǔn)
評論
0/150
提交評論