C语言计算器源代码Word下载.docx
- 文档编号:16998632
- 上传时间:2022-11-27
- 格式:DOCX
- 页数:16
- 大小:18.92KB
C语言计算器源代码Word下载.docx
《C语言计算器源代码Word下载.docx》由会员分享,可在线阅读,更多相关《C语言计算器源代码Word下载.docx(16页珍藏版)》请在冰豆网上搜索。
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;
&
&
y!
=0)
r=x/y;
r=x*y;
elseif(c==叭'
){
r=1;
for(inti=1;
=y;
i++)r*=x;
intr0=(int)x%(int)y;
r=double(r0);
returnr;
doubleoperate_one(doubleone,charcc)//对一个数运算(含单目运算符:
如log(L),sin(S)等等)
if(cc=='
r=sqrt(one);
elseif(cc=='
r=cos(one);
r=sin(one);
r=tan(one);
r=acos(one);
r=asin(one);
r=atan(one);
returnr;
doubleoperate_L(doublea,doubleb,chardian)//求对数的值{
doubler=log(b)/log(a);
doublecompute()//对整个表达式的计算
charc;
//表示运算符号
intp=0;
//用于shu[++p],先初始化
inti,j;
init();
//进行初始化
push_char('
);
line[strlen(line)]='
;
line[strlen(line)+1]='
\0'
if(biao)
push_num(dai_result);
//把运算的结果先进栈,在这个结果的基础上继续进行运算biao=0;
for(i=0;
line[i]!
='
)//把表达式中的数字字符串转化成可计算的数字
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;
.'
i++;
ge=0;
biao_dian=1;
P'
shu[++p]=pi;
E'
shu[++p]=e;
if(flag1)
h=h*10+(line[i]-'
0'
flag=1;
if(biao_dian)
ge++;
}else
}if(flag)
intr=1;
for(intk=1;
k<
=ge;
k++)r*=10;
h/=r;
shu[++p]=h;
//把转化而来的数字存于数组
shu[++p]=-1;
elseif(line[i]=='
shu[++p]=-2;
shu[++p]=-3;
shu[++p]=-4;
shu[++p]=-5;
elseif(line[i]=='
"
shu[++p]=-6;
shu[++p]=-7;
shu[++p]=-8;
shu[++p]=-9;
shu[++p]=-10;
shu[++p]=-11;
shu[++p]=-12;
shu[++p]=-13;
)shu[++p]=-14;
)shu[++p]=-15;
shu[++p]=-16;
shu[++p]=-17;
i=1;
while(shu[i]!
=-17||get_top_char()!
doublem=shu[i];
if(m>
push_num(m);
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='
elseif(m==-8)c='
elseif(m==-9)c='
elseif(m==-10)c='
elseif(m==-11)
elseif(m==-12)
elseif(m==-13)
elseif(m==-14)
elseif(m==-15)
elseif(m==-16)
elseif(m==-17)
charch=get_top_char();
//得到最顶端运算符号if(compare[ch]<
compare[c])//运算符号级别的比较{
push_char(c);
elseif(ch=='
c=='
pop_char();
elseif(compare[ch]>
=compare[c]&
ch!
if(ch=='
||ch=='
||ch=='
{doubleone=pop_num();
chardian=pop_char();
push_num(operate_one(one,dian));
doubleone_L=pop_num();
doubletwo_L=pop_num();
push_num(operate_L(two_L,one_L,dian));
doublex=pop_num();
doubley=pop_num();
if(dian=='
x==0)//判断是否除了"
零"
{
cout<
由于您除了零,结果将是错误的"
endl;
}
push_num(operate(x,dian,y));
//把进行一次计算的结果入栈
doubleresult=pop_num();
//得到结果returnresult;
intcheck_kuohao()//检查表达式括号是否匹配
inti,f=0;
intkuo[SIZE],key=1;
memset(kuo,0,sizeof(kuo));
)kuo[++f]=1;
{if(kuo[f]==1){
kuo[f]=0;
f--;
key=0;
if(key&
f==0)
return1;
return0;
intcheck_char()//检查运算符号是否合法(如:
1+*4){
inti,ge;
)
while(line[i]=='
||line[i]=='
IIline[i]=='
||line[i]=='
||line[i]=='
IIline[i]=='
>
}if(ge>
=3)
voidoutput(doubleresult)//打出结果
printf("
所得结果是:
"
cout<
result<
voidcheck()//检查表达式是否合法
voidintroduce();
charcc;
//决定计算器按哪种功能进行计算doubleresult;
//结果
voidinput();
if(check_kuohao()&
check_char())//看是否合法,合法则计算{
result=compute();
output(result);
输入一个字符'
M'
或D或F,决定是否继续:
while(cin>
cc)
system("
cls"
introduce();
您上次所得结果为:
在上次计算结果的基础上,请继续输入想计算的表达式"
dai_result=result;
biao=1;
input();
//输入表达式
D'
计算器已清零,请输入您所要计算的表达式"
F'
计算器关闭,谢谢使用!
所输入字符无效,请输入一个字符’M'
或D或'
!
continue;
}}
分两种不合法
else//不合法,
if(check_kuohao()==0&
check_char()==1){
您所输入的表达式括号不匹配,请重新输入:
input();
您所输入的表达式不合法,请重新输入:
//输入表达式
voidtackle_fuhao()//处理负号
node*root,*head,*p,*q,*p1;
root=head=newnode;
head->
next=NULL;
inti;
i++)//建立链表{
p=newnode;
p->
data=line[i];
next=head->
next;
head->
next=p;
head=p;
//deletep;
q=(node*)malloc(sizeof(node));
head=root;
if(root->
next->
data=='
||root->
)//处理第一个字符{
data='
}if(root->
next!
=NULL)
for(q=root->
q;
q=q->
next)
if(q->
(q->
||q->
)){
next=q->
q->
//deleteq;
p1=newnode;
intqi=-1;
for(p1=root->
p1;
p1=p1->
next){
line[++qi]=p1->
data;
line[++qi]='
voidinput()//输入
cin>
line;
if(biao==0)
tackle_fuhao();
//处理负号
voidintroduce()//对计算器的符号功能的简要介绍
计算器简要介绍"
C(cos)cout<
7
S(sin)
8
T(tan)
9
a(arccos)
/on
4
1
对于对数输入
M(在前面结果的基础上继续计算,
c(arcsin)"
t(arctan)"
L(log)"
Q(sqrt)"
Enter(=)"
L2
5表示以
*%
-M(M+)
A(乘方)F(off)
2为底5的对数"
如:
上次结果为10,现输入+10.5*2)"
check();
//检查表达式是否合法
D(清零并继续输入)"
F(计算机关闭)"
输入P就代表输入圆周率,输入E代表输入自然对数"
endl<
voidprint()
color2"
欢迎使用本计算器"
输入一个字符串on,计算器开始启动"
voidif_start()//是否启动计算器
stringstart;
print();
while(cin>
start)
if(start!
="
on"
您所输入的字符无效,请按照介绍的继续输入:
if(start=="
color5"
//颜色的处理system("
//刷屏
}introduce();
//对计算器的简要介绍cout<
现在,请输入您所要计算的表达式"
input();
//输入所要计算的表达式
intmain()
if_start();
//调用是否启动计算器函数return0;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 计算器 源代码