C++語言計算器源代碼_第1頁
C++語言計算器源代碼_第2頁
C++語言計算器源代碼_第3頁
已閱讀5頁,還剩9頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jì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存儲運(yùn)算符號的棧char*top;char*base;stack_char;stack

2、_numS_num;定義stack_charS_char;/定義charfu18='n',')','+','-','*','/','%','A',Q,'L',C,'S',T,'c','s','t','('intcompare1000;表現(xiàn)出各運(yùn)算符號的優(yōu)先級doubleshu1000;存儲”數(shù)”的數(shù)組doubledai_result;/運(yùn)算的結(jié)果,是為了處理M運(yùn)算(簡介函數(shù)

3、里有M的定義)intbiao=0;/和dia_result一樣,為了處理M運(yùn)算charlineSIZE;輸入的所要計算的表達(dá)式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.base=(double*)malloc(sizeof(double)*SIZE);為棧開

4、辟空間S_char.base=(char*)malloc(sizeof(char)*SIZE);同上S_num.top=S_num.base;S_char.top=S_char.base;voidpush_num(doublen)數(shù)字進(jìn)棧*+S_num.top=n;voidpush_char(charc)/運(yùn)算符號進(jìn)棧*+S_char.top=c;doublepop_num()數(shù)字出棧doublem=*S_num.top;S_num.top-;returnm;charpop_char()運(yùn)算符號出棧charcc=*S_char.top;S_char.top-;returncc;charget_

5、top_char()得到運(yùn)算符號的棧中最頂端的運(yùn)算符號return*S_char.top;doubleoperate(doubley,charc,doublex)對兩個數(shù)計算(含是雙目運(yùn)算符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')r=1;for(inti=1;i<=y;i+)r*=x;elseif(c='%')intr0=

6、(int)x%(int)y;r=double(r0);returnr;doubleoperate_one(doubleone,charcc)/對一個數(shù)運(yùn)算(含單目運(yùn)算符:如:如*,/等等)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);elseif(cc='c')r=acos(one);elseif(cc='s')r=asin(one);elseif(cc='

7、t')r=atan(one);returnr;doubleoperate_L(doublea,doubleb,chardian)求對數(shù)的值doubler=log(b)/log(a);returnr;doublecompute。/對整個表達(dá)式的計算charc;/表示運(yùn)算符號intp=0;/用于shu+p,先初始化inti,j;init();/進(jìn)行初始化push_char('n');linestrlen(line)='n:linestrlen(line)+1='0'if(biao)push_num(dai_result);把運(yùn)算的結(jié)果先進(jìn)棧,在這個結(jié)

8、果的基礎(chǔ)上繼續(xù)進(jìn)行運(yùn)算biao=0;for(i=0;linei!='0')/把表達(dá)式中的數(shù)字字符串轉(zhuǎn)化成可計算的數(shù)字intflag=0;intflag1=1;/標(biāo)記是否是運(yùn)算符號/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(linei=fuj)flag1=0;break;if(linei='_')break;if(linei='.')i+;ge=0;biao_dian=1

9、;if(linei=P)shu+p=pi;i+;break;if(linei='E')shu+p=e;i+;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*=10;h/=r;shu+p=h;/把轉(zhuǎn)化而來的數(shù)字存于數(shù)組if(linei='+')shu+p=-1;elseif(linei='-')shu+p=-2;elseif(linei

10、='*')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=C)shu+p=-9;elseif(linei='S')shu+p=-10;elseif(linei=T)shu+p=-11;elseif(linei='c')shu+p=-12

11、;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|get_top_char()!='n')doublem=shui;if(m>=0)push_num(m);elseif(m=-1)c='+';elseif(m=-2

12、)c=11.elseif(m=-3)c=1*1.5elseif(m=-4)c='/'elseif(m=-5)c='%'elseif(m=-6)c='A'5elseif(m=-7)c=Q;elseif(m=-8)c='L'elseif(m=-9)c=C;elseif(m=-10)c='S'elseif(m=-11)c='T'elseif(m=-12)c='c'elseif(m=-13)c='s'elseif(m=-14)c='t'elseif(m=-15

13、)c='('elseif(m=-16)c=')'elseif(m=-17)c='n'charch=get_top_char();得到最頂端運(yùn)算符號if(comparech<comparec)運(yùn)算符號級別的比較push_char(c);i+;elseif(ch='('&&c=')')pop_char();i+;elseif(comparech>=comparec&&ch!='('&&ch!='n')if(ch=Q|ch=C|c

14、h='S'|ch=T|ch='c'|ch='s'|ch='t')doubleone=pop_num();chardian=pop_char();push_num(operate.one(one,dian);elseif(ch='L')doubleone_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();ch

15、ardian=pop_char();if(dian='/'&&x=0)/判斷是否除了”零"cout<<"由于您除了零,結(jié)果將是錯誤的"<<endl;push_num(operate(x,dian,y);/把進(jìn)行一次計算的結(jié)果入棧elsepush_char(c);i+;doubleresult=pop_num();/得至U結(jié)果returnresult;intcheck_kuohao()檢查表達(dá)式括號是否匹配inti,f=0;intkuoSIZE,key=1;memset(kuo,0,sizeof(kuo);fo

16、r(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;intcheck_char()/檢查運(yùn)算符號是否合法(如:1+*4)inti,ge;for(i=0;linei!='0')ge=0;while(linei='+'|linei='-'|linei='*'|linei='/&

17、#39;|linei='%'|linei='A'|linei=Q|linei='L'|linei='S'|linei=C|linei='T'|linei='s'|linei='c'|linei='t')ge+;i+;if(ge>=3)return0;elsereturn1;voidoutput(doubleresult)/打出結(jié)果printf("所得結(jié)果是:”);cout<<result<<endl;voidcheck()檢查表

18、達(dá)式是否合法voidintroduce();charcc;/決定計算器按哪種功能進(jìn)行計算doubleresult;/結(jié)果voidinput();/定義if(check_kuohao()&&check_char()/看是否合法,合法則計算result=compute();output(result);cout<<"輸入一個字符'M'或'D'或'F',決定是否繼續(xù):"<<endl;while(cin>>cc)if(cc='M')system("cls&q

19、uot;);introduce();printf("您上次所得結(jié)果為:”);"<<endl;"<<endl;cout<<result<<endl;cout<<"在上次計算結(jié)果的基礎(chǔ)上,請繼續(xù)輸入想計算的表達(dá)式dai_result=result;biao=1;input();/輸入表達(dá)式break;elseif(cc='D')system("cls");introduce();cout<<"計算器已清零,請輸入您所要計算的表達(dá)式"

20、<<endl;input();輸入表達(dá)式break;elseif(cc='F')system("cls");cout<<"計算器關(guān)閉,謝謝使用!"<<endl;break;elsecout<<"所輸入字符無效,請輸入一個字符'M'或D或'F'!"<<endl;continue;else/不合法,分兩種不合法if(check_kuohao()=0&&check_char()=1)cout<<"

21、您所輸入的表達(dá)式括號不匹配,請重新輸入:"<<endl;input();輸入表達(dá)式elsecout<<"您所輸入的表達(dá)式不合法,請重新輸入:"<<endl;input();/輸入表達(dá)式voidtackle_fuhao()處理負(fù)號node*root,*head,*p,*q,*p1;root=head=newnode;head->next=NULL;inti;for(i=0;linei!='0'i+)建立鏈表p=newnode;p->data=linei;p->next=head->next;

22、head->next=p;head=p;/deletep;q=(node*)malloc(sizeof(node);head=root;if(root->next->data='+'|root->next->data='-')/處理第一個字符p=newnode;p->data='O'p->next=head->next;head->next=p;if(root->next!=NULL)for(q=root->next;q;q=q->next)if(q->data=

23、9;('&&(q->next->data='-'|q->next->data='+')p=newnode;p->data='O'p->next=q->next;q->next=p;/deleteq;pl=newnode;intqi=-1;for(p1=root->next;p1;pl=p1->next)line+qi=p1->data;line+qi='0'voidinput()輸入cin>>line;if(biao=0)tack

24、le_fuhao();處理負(fù)號check();檢查表達(dá)式是否合法voidintroduce()/對計算器的符號功能的簡要介紹cout<<"計算器簡要介紹"<<endl;T(tan)a(arccos)c(arcsin)"<<endl;cout<<"C(cos)S(sin)cout<<"789/ont(arctan)"<<endl;cout<<"456*%L(log)"<<endl;cout<<"123-M(M+)Q(sqrt)"<<endl;cout<<"0+A(乘方)F(off)Enter(=)"<<endl;cout<<"

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論