calculator.docx
- 文档编号:6274177
- 上传时间:2023-01-05
- 格式:DOCX
- 页数:15
- 大小:17.28KB
calculator.docx
《calculator.docx》由会员分享,可在线阅读,更多相关《calculator.docx(15页珍藏版)》请在冰豆网上搜索。
calculator
#include
#include
#include
#include
#include
#include
#definePI3.14159265358
doublerun(chara[])
{
inti=1,j,p=0,m=0,n=0,t,y,k,ka=0,kuo=0;
longjie;
charfu[50],xu[50],q;
doublec[50],shu,mm[80];
while(a[i]!
='\0')
{
if(a[i]<='9'&&a[i]>='0')//将字符串转换为数字
{
j=i;
shu=0;
while(a[i]<='9'&&a[i]>='0')
{
shu=a[i]+10*shu-'0';
i++;
}
if(a[i]=='.')
{
i++;
k=1;
while(a[i]<='9'&&a[i]>='0')
{
shu=(a[i]-'0')*pow(0.1,k)+shu;
k=k+1;
i++;
}
}
c[++p]=shu;//p代表参数的个数
xu[++m]='0'+p;//xu代表排序字符串,调制
xu[m+1]='\0';
if(a[j-1]=='@'||a[j-1]=='s'||a[j-1]=='t'||a[j-1]=='c')//单左运算符
{
while(a[j-1]=='@'||a[j-1]=='s'||a[j-1]=='t'||a[j-1]=='c')
{
xu[++m]=a[j-1];
xu[m+1]='\0';
j--;
}
}
}
elseif(a[i]=='(')
{
fu[++n]=a[i];//fu代表符号字符串
j=i;
i++;
if(a[j-1]=='@'||a[j-1]=='s'||a[j-1]=='t'||a[j-1]=='c')//单左运算符
{
while(a[j-1]=='@'||a[j-1]=='s'||a[j-1]=='t'||a[j-1]=='c')
{
fu[++n]=a[j-1];
j--;
}
}
t=n;
while(fu[t]=='@'||fu[t]=='s'||fu[t]=='t'||fu[t]=='c'||fu[t]=='(')//单左运算符前置
{
if(fu[t]=='@'||fu[t]=='s'||fu[t]=='t'||fu[t]=='c')
ka=t;
elseif(fu[t]=='(')
kuo=t;
if(ka!
=0&&kuo!
=0)
{
if(ka>kuo)
{
q=fu[ka];
fu[ka]=fu[kuo];
fu[kuo]=q;
}
}
t--;
}
}
elseif(a[i]==')')
{
t=n;
while(fu[t]!
='(')
{
xu[++m]=fu[t];
xu[m+1]='\0';
t--;
}
while(fu[t]!
='(')
{
while(fu[t]=='@'||fu[t]=='s'||fu[t]=='t'||fu[t]=='c')
{
xu[++m]=fu[t];
xu[m+1]='\0';
}
t--;
}
n=t-1;//在左括号前面一位,让后面的运算覆盖左括号
i++;
}
elseif(a[i]=='+')//遇到+,把前面的(前一个符号入xu,此+入fu覆盖上一个符号
{
while(fu[n]!
='('&&n)
{
xu[++m]=fu[n];
xu[m+1]='\0';
n--;
}
fu[++n]=a[i];
i++;
}
elseif(a[i]=='-')
{
if(a[i-1]=='$')
{
a[0]='0';
i=0;//从a[0]开始计算
}
elseif(a[i-1]=='(')
{
a[i-1]='0';
a[i-2]='(';
i-=2;
}
else
{
while(fu[n]!
='('&&n)
{
xu[++m]=fu[n];
xu[m+1]='\0';
n--;
}
fu[++n]=a[i];
i++;
}
}
elseif(a[i]=='*'||a[i]=='/')
{
while(fu[n]=='*'||fu[n]=='/'||fu[n]=='^'||fu[n]=='@'||fu[n]=='#'||fu[n]=='s'||fu[n]=='t'||fu[n]=='c')//优先级大于a[i]
{
xu[++m]=fu[n];
xu[m+1]='\0';
n--;
}
fu[++n]=a[i];
i++;
}
elseif(a[i]=='^'||a[i]=='#')
{
while(fu[n]=='^'||fu[n]=='#'||fu[n]=='@'||fu[n]=='s'||fu[n]=='t'||fu[n]=='c')
{
xu[++m]=fu[n];
xu[m+1]='\0';
n--;
}
fu[++n]=a[i];
i++;
}
elseif(a[i]=='@'||a[i]=='s'||a[i]=='t'||a[i]=='c')
i++;
elseif(a[i]=='!
')
{
xu[++m]=a[i];
xu[m+1]='\0';
i++;
}
}
while(fu[n]>0)//优先级最低的符号
{
xu[++m]=fu[n];
xu[m+1]='\0';
n--;
}
p=0;
for(m=1;xu[m]!
='\0';m++)//解调
{
if(xu[m]<='9'&&xu[m]>='0')
{
y=xu[m]-'0';
mm[++p]=c[y];
}
elseif(xu[m]=='+')
{
mm[p-1]=mm[p-1]+mm[p];
p--;
}
elseif(xu[m]=='-')
{
mm[p-1]=mm[p-1]-mm[p];
p--;
}
elseif(xu[m]=='*')
{
mm[p-1]=mm[p-1]*mm[p];
p--;
}
elseif(xu[m]=='/')
{
mm[p-1]=mm[p-1]/mm[p];
p--;
}
elseif(xu[m]=='^')
{
mm[p-1]=pow(mm[p-1],mm[p]);
p--;
}
elseif(xu[m]=='@')
{
mm[p]=sqrt(mm[p]);
}
elseif(xu[m]=='#')
{
mm[p-1]=pow(mm[p-1],1/mm[p]);
p--;
}
elseif(xu[m]=='s')
{
mm[p]=sin(mm[p]*PI/180);
}
elseif(xu[m]=='t')
{
mm[p]=tan(mm[p]*PI/180);
}
elseif(xu[m]=='c')
{
mm[p]=cos(mm[p]*PI/180);
}
elseif(xu[m]=='!
')
{
if(mm[p]!
=0)
{
jie=(long)mm[p];
while(--jie)
mm[p]*=jie;
}
else
mm[p]=1;
}
}
returnmm[1];
}
charinput(char*a)
{
charx;
inti=0,j,m=0,n=0,t;
a[0]='$';
x=getch();
while(x!
='=')
{
if('n'==x)
{
system("cls");
system("color84");
printf("\n\n********************************谢谢使用,再见!
********************************\n\n");
exit(0);
}
if((x<='9'&&x>='0')||x=='+'||x=='-'||x=='*'||x=='/'||x=='('||x==')'||x=='.'||x=='^'||x=='@'||x=='#'||x==8||x=='m'||x=='s'||x=='t'||x=='c'||x=='!
')
{
if(((a[i]=='+'||a[i]=='-'||a[i]=='*'||a[i]=='^'||a[i]=='@'||a[i]=='s'||a[i]=='t'||a[i]=='c')&&x!
='+'&&x!
='-'&&x!
='*'&&x!
='/'&&x!
='.'&&x!
='^'&&x!
='!
')//符号后不能接
||((a[i]=='/')&&x!
='+'&&x!
='-'&&x!
='*'&&x!
='/'&&x!
='.'&&x!
='^'&&x!
='0'&&x!
='!
')//除号后不能接
||(a[i]>='0'&&a[i]<='9'&&x!
='('&&x!
='@'&&x!
='s'&&x!
='t'&&x!
='c')//数字后不能接
||(a[i]=='$'&&x!
='+'&&x!
='*'&&x!
='/'&&x!
=')'&&x!
='.'&&x!
=8&&x!
='^'&&x!
='#'&&x!
='!
')//第一位不能是
||(a[i]==')'&&(x=='+'||x=='-'||x=='*'||x=='/'||x==8||x=='m'||x=='^'||x=='#'||x==')'))//右括号后只能接
||(a[i]=='('&&x!
='+'&&x!
='*'&&x!
='/'&&x!
='.'&&x!
=')'&&x!
='^'&&x!
='#'&&x!
='!
')//左括号后不能接
||(a[i]=='.'&&((x>='0'&&x<='9')||x==8||x=='m'))//小数点后只能接
||((a[i]=='^'||a[i]=='#')&&x!
='+'&&x!
='-'&&x!
='*'&&x!
='/'&&x!
=')'&&x!
='.'&&x!
='!
')//平方后不能接
||((a[i]=='@'||a[i]=='s'||a[i]=='t'||a[i]=='c')&&x!
='+'&&x!
='-'&&x!
='*'&&x!
='/'&&x!
=')'&&x!
='.'&&x!
='^'&&x!
='#'&&x!
='!
')//开方、三角函数后不能接
||(a[i]=='!
'&&(x=='+'||x=='-'||x=='*'||x=='/'||x==8||x=='m'||x=='!
')))//阶乘后只能接
{
if(x==')')//括号要左右相等
{
j=i;
while(a[j]!
='$')
{
if(a[j]=='(')
m++;
if(a[j]==')')
n++;
j--;
}
if((n-m)<0&&m!
=0)
{
m=n=0;
a[++i]=x;
putchar(a[i]);
}
}
elseif(x=='.')//一个数只有一个小数点
{
j=i;
while(a[j]!
='+'&&a[j]!
='-'&&a[j]!
='*'&&a[j]!
='/'&&a[j]!
='('&&a[j]!
='$'&&a[j]!
='@'&&a[j]!
='#'&&a[j]!
='^'&&a[j]!
='s'&&a[j]!
='t'&&a[j]!
='c'&&a[j]!
='!
')
{
if(a[j]=='.')
m++;
j--;
}
if(m==0&&a[j]!
='!
')
{
j=i;
while(a[j]>='0'&&a[j]<='9')
{
j--;
}
if(i-j<=15)
{
a[++i]=x;
putchar(a[i]);
}
}
}
elseif(x==8)//删除键
{
//printf("\b");
i--;
system("cls");
printf("***********************************计算器***************************************\n");
printf("************************本软件由紫阳真人制作,版权所有!
************************\n");
printf("*声明:
本程序支持九个运算数、共十六位数、六位小数的实型数的加+、减-、乘*、除/、**\n");
printf("*******乘方^、开方#、开二次方@、括号()、正弦s、余弦c、正切t、阶乘!
的运算*******\n");
printf("********请输入正确的表达式,并以“=”结束,例如“t45-(@(1+3)^3)#3/2!
=”*********\n");
printf("***********************清零请输入“m”,退出请输入“n”*************************\n");
for(j=1;j<=i;j++)
{
putchar(a[j]);
}
}
elseif(x=='m')//清零键
{
system("cls");
printf("***********************************计算器***************************************\n");
printf("************************本软件由紫阳真人制作,版权所有!
************************\n");
printf("*声明:
本程序支持九个运算数、共十六位数、六位小数的实型数的加+、减-、乘*、除/、**\n");
printf("*******乘方^、开方#、开二次方@、括号()、正弦s、余弦c、正切t、阶乘!
的运算*******\n");
printf("********请输入正确的表达式,并以“=”结束,例如“t45-(@(1+3)^3)#3/2!
=”*********\n");
printf("***********************清零请输入“m”,退出请输入“n”*************************\n");
i=0;
}
elseif(x>='0'&&x<='9')//对数字的位数进行限制
{
j=i;
while(a[j]>='0'&&a[j]<='9')
{
j--;
}
t=j;
if(a[j]=='.')
{
while(a[j-1]>='0'&&a[j-1]<='9')
{
j--;
}
if((i-t<=5)&&(i-j<=15))
{
a[++i]=x;
putchar(a[i]);
}
}
elseif(i-j<=15)
{
a[++i]=x;
putchar(a[i]);
}
}
else
{
a[++i]=x;
putchar(a[i]);
}
}
}
x=getch();
}
if(a[i]=='$'&&x=='=')
{
a[1]='0';
i++;
}
a[i+1]='\0';
return(*a);
}
intmain()
{
chara[50];
doubleresult;
system("color3e");
printf("***********************************计算器***************************************\n");
printf("************************本软件由紫阳真人制作,版权所有!
************************\n");
printf("*声明:
本程序支持九个运算数、共十六位数、六位小数的实型数的加+、减-、乘*、除/、**\n");
printf("*******乘方^、开方#、开二次方@、括号()、正弦s、余弦c、正切t、阶乘!
的运算*******\n");
printf("********请输入正确的表达式,并以“=”结束,例如“t45-(@(1+3)^3)#3/2!
=”*********\n");
printf("***********************清零请输入“m”,退出请输入“n”*************************\n");
while
(1)
{
input(a);
result=run(a);
printf("=%lf\n",result);
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- calculator