C++语言计算器源代码.docx

上传人:b****7 文档编号:11068785 上传时间:2023-02-24 格式:DOCX 页数:21 大小:26.70KB
下载 相关 举报
C++语言计算器源代码.docx_第1页
第1页 / 共21页
C++语言计算器源代码.docx_第2页
第2页 / 共21页
C++语言计算器源代码.docx_第3页
第3页 / 共21页
C++语言计算器源代码.docx_第4页
第4页 / 共21页
C++语言计算器源代码.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

C++语言计算器源代码.docx

《C++语言计算器源代码.docx》由会员分享,可在线阅读,更多相关《C++语言计算器源代码.docx(21页珍藏版)》请在冰豆网上搜索。

C++语言计算器源代码.docx

C++语言计算器源代码

#include

#include

#includeusingnamespacestd;

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',')','+','-','*','/','%','A',

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;

}

{

*++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=='A')

{

r=1;

for(inti=1;i<=y;i++)

r*=x;

}

elseif(c=='%')

{

intr0=(int)x%(int)y;

r=double(rO);

}

returnr;

}

{

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;

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]=='A')

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='A';

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();//得至U结果

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--;

}

elsekey=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]==

1*1

IIline[i]=

='/'||line[i]==

'%'||line[i]=

='A'

IIline[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'!

"<

}

}

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='O';

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='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)

tackle_fuhao();〃处理负号

check();〃检查表达式是否合法

voidintroduce()〃对计算器的符号功能的简要介绍

{

cout<<"计算器简要介绍"<

cout<<"C(cos)

S(sin)

T(tan)

a(arccos)

c(arcsin)"<

cout<<"7

8

9

/on

t(arctan)"<

cout<<"4

5

6

*%

L(log)"<

cout<<"1

2

3

-M(M+)

Q(sqrt)"<

cout<<"0

+

A(乘方)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;

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 历史学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1