C++语言计算器源代码.docx
- 文档编号:26879200
- 上传时间:2023-06-23
- 格式:DOCX
- 页数:22
- 大小:18.54KB
C++语言计算器源代码.docx
《C++语言计算器源代码.docx》由会员分享,可在线阅读,更多相关《C++语言计算器源代码.docx(22页珍藏版)》请在冰豆网上搜索。
C++语言计算器源代码
C++语言编写。
。
#include
#include
#include
usingnamespacestd;
constdoublepi=3.14159265;
constdoublee=2.718281828459;
constintSIZE=1000;
typedefstructnode//为了处理符号而建立的链表(如:
1+(-2))
{
chardata;
node*next;
}node;
typedefstructstack_num//存储数的栈
{
double*top;
double*base;
}stack_num;
typedefstructstack_char//存储运算符号的栈
{
char*top;
char*base;
}stack_char;
stack_numS_num;//定义
stack_charS_char;//定义
charfu[18]={'\n',')','+','-','*','/','%','^',
'Q','L','C','S','T','c','s','t','('};
intcompare[1000];//表现出各运算符号的优先级
doubleshu[1000];//存储"数"的数组
doubledai_result;//运算的结果,是为了处理M运算(简介函数里有M的定义)
intbiao=0;//和dia_result一样,为了处理M运算
charline[SIZE];//输入的所要计算的表达式
voidinit()//初始化
{
compare[fu[0]]=-2;//用数字的大小表现出符号的优先级
compare[fu[1]]=-1;
compare[fu[2]]=2;
compare[fu[3]]=2;
compare[fu[4]]=4;
compare[fu[5]]=4;
compare[fu[6]]=4;
compare[fu[7]]=5;
for(inti=8;i<=15;i++)
compare[fu[i]]=6;
compare[fu[16]]=7;
S_num.base=(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)//数字进栈
{
*++S_num.top=n;
}
voidpush_char(charc)//运算符号进栈
{
*++S_char.top=c;
}
doublepop_num()//数字出栈
{
doublem=*S_num.top;
S_num.top--;
returnm;
}
charpop_char()//运算符号出栈
{
charcc=*S_char.top;
S_char.top--;
returncc;
}
charget_top_char()//得到运算符号的栈中最顶端的运算符号
{
return*S_char.top;
}
doubleoperate(doubley,charc,doublex)//对两个数计算(含是双目运算符:
如*,/等等)
{
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=='^')
{
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)//对一个数运算(含单目运算符:
如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=='t')
r=atan(one);
returnr;
}
doubleoperate_L(doublea,doubleb,chardian)//求对数的值
{
doubler=log(b)/log(a);
returnr;
}
doublecompute()//对整个表达式的计算
{
charc;//表示运算符号
intp=0;//用于shu[++p],先初始化
inti,j;
init();//进行初始化
push_char('\n');
line[strlen(line)]='\n';
line[strlen(line)+1]='\0';
if(biao)
push_num(dai_result);//把运算的结果先进栈,在这个结果的基础上继续进行运算
biao=0;
for(i=0;line[i]!
='\0';)//把表达式中的数字字符串转化成可计算的数字
{
intflag=0;
intflag1=1;//标记是否是运算符号
//intflag2=1;//标记是否出现'_';
doubleh=0;
intge;//位数
intbiao_dian=0;//是否是小数的类型
while
(1)
{
flag1=1;
for(j=0;j<=16;j++)
{
if(line[i]==fu[j])
{
flag1=0;
break;
}
}
if(line[i]=='_')
{
break;
}
if(line[i]=='.')
{
i++;
ge=0;
biao_dian=1;
}
if(line[i]=='P')
{
shu[++p]=pi;
i++;
break;
}
if(line[i]=='E')
{
shu[++p]=e;
i++;
break;
}
if(flag1)
{
h=h*10+(line[i]-'0');
flag=1;
i++;
if(biao_dian)
ge++;
}
else
break;
}
if(flag)
{
if(biao_dian)
{
intr=1;
for(intk=1;k<=ge;k++)
r*=10;
h/=r;
}
shu[++p]=h;//把转化而来的数字存于数组
}
if(line[i]=='+')
shu[++p]=-1;
elseif(line[i]=='-')
shu[++p]=-2;
elseif(line[i]=='*')
shu[++p]=-3;
elseif(line[i]=='/')
shu[++p]=-4;
elseif(line[i]=='%')
shu[++p]=-5;
elseif(line[i]=='^')
shu[++p]=-6;
elseif(line[i]=='Q')
shu[++p]=-7;
elseif(line[i]=='L')
shu[++p]=-8;
elseif(line[i]=='C')
shu[++p]=-9;
elseif(line[i]=='S')
shu[++p]=-10;
elseif(line[i]=='T')
shu[++p]=-11;
elseif(line[i]=='c')
shu[++p]=-12;
elseif(line[i]=='s')
shu[++p]=-13;
elseif(line[i]=='t')
shu[++p]=-14;
elseif(line[i]=='(')
shu[++p]=-15;
elseif(line[i]==')')
shu[++p]=-16;
elseif(line[i]=='\n')
shu[++p]=-17;
i++;
}
i=1;
while(shu[i]!
=-17||get_top_char()!
='\n')
{
doublem=shu[i];
if(m>=0)
{
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='^';
elseif(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)
c='(';
elseif(m==-16)
c=')';
elseif(m==-17)
c='\n';
charch=get_top_char();//得到最顶端运算符号
if(compare[ch] { push_char(c); i++; } elseif(ch=='('&&c==')') { pop_char(); i++; } elseif(compare[ch]>=compare[c]&&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') { doubleone_L=pop_num(); doubletwo_L=pop_num(); chardian=pop_char(); push_num(operate_L(two_L,one_L,dian)); } else { doublex=pop_num(); doubley=pop_num(); chardian=pop_char(); if(dian=='/'&&x==0)//判断是否除了"零" { cout<<"由于您除了零,结果将是错误的"< } push_num(operate(x,dian,y));//把进行一次计算的结果入栈 } } else { push_char(c); i++; } } } doubleresult=pop_num();//得到结果 returnresult; } intcheck_kuohao()//检查表达式括号是否匹配 { inti,f=0; intkuo[SIZE],key=1; memset(kuo,0,sizeof(kuo)); for(i=0;line[i]! ='\0';i++) { if(line[i]=='(') kuo[++f]=1; elseif(line[i]==')') { if(kuo[f]==1) { kuo[f]=0; f--; } else { key=0; break; } } } if(key&&f==0) return1; else return0; } intcheck_char()//检查运算符号是否合法(如: 1+*4) { inti,ge; for(i=0;line[i]! ='\0';) { ge=0; while(line[i]=='+'||line[i]=='-'||line[i]=='*' ||line[i]=='/'||line[i]=='%'||line[i]=='^' ||line[i]=='Q'||line[i]=='L'||line[i]=='S' ||line[i]=='C'||line[i]=='T'||line[i]=='s' ||line[i]=='c'||line[i]=='t') { ge++; i++; } i++; } if(ge>=3) return0; else return1; } voidoutput(doubleresult)//打出结果 { printf("所得结果是: "); cout< } voidcheck()//检查表达式是否合法 { voidintroduce(); charcc;//决定计算器按哪种功能进行计算 doubleresult;//结果 voidinput();//定义 if(check_kuohao()&&check_char())//看是否合法,合法则计算 { result=compute(); output(result); cout<<"输入一个字符'M'或'D'或'F',决定是否继续: "< while(cin>>cc) { if(cc=='M') { system("cls"); introduce(); printf("您上次所得结果为: "); cout< cout<<"在上次计算结果的基础上,请继续输入想计算的表达式"< dai_result=result; biao=1; input();//输入表达式 break; } elseif(cc=='D') { system("cls"); introduce(); cout<<"计算器已清零,请输入您所要计算的表达式"< input();//输入表达式 break; } elseif(cc=='F') { system("cls"); cout<<"计算器关闭,谢谢使用! "< break; } else { cout<<"所输入字符无效,请输入一个字符'M'或'D'或'F'! "< continue; } } } else//不合法,分两种不合法 { if(check_kuohao()==0&&check_char()==1) { cout<<"您所输入的表达式括号不匹配,请重新输入: "< input();//输入表达式 } else { cout<<"您所输入的表达式不合法,请重新输入: "< input();//输入表达式 } } } voidtackle_fuhao()//处理负号 { node*root,*head,*p,*q,*p1; root=head=newnode; head->next=NULL; inti; for(i=0;line[i]! ='\0';i++)//建立链表 { p=newnode; p->data=line[i]; 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'; 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; for(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<<"计算器简要介绍"< cout<<"C(cos)S(sin)T(tan)a(arccos)c(arcsin)"< cout<<"789/ont(arctan)"< cout<<"456*%L(log)"< cout<<"123-M(M+)Q(sqrt)"< cout<<"0.+^(乘方)F(off)Enter(=)"< cout<<"对于对数输入L2_5表示以2为底5的对数"< cout<<"M(在前面结果的基础上继续计算,如: 上次结果为10,现输入+10.5*2)"< cout<<"D(清零并继续输入)"< cout<<"F(计算机关闭)"< cout<<"输入P就代表输入圆周率,输入E代表输入自然对数"< } voidprint() { system("color2"); cout<<"欢迎使用本计算器"< cout<<"输入一个字符串on,计算器开始启动"< } voidif_start()//是否启动计算器 { stringstart; print(); while(cin>>start) { if(start! ="on") { cout<<"您所输入的字符无效,请按照介绍的继续输入: "< continue; } else break; } if(start=="on") { system("color5");//颜色的处理 system("cls");//刷屏 } introduce();//对计算器的简要介绍 cout<<"现在,请输入您所要计算的表达式"< input();//输入所要计算的表达式 } intmain() { if_start();//调用是否启动计算器函数 return0; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 语言 计算器 源代码