📄 compute.c
字号:
#include "compute.h"
/**********************************************************
* 函数原型:void compute() *
* 传入参数:无 *
* 返 回 值:无 *
* 函数功能:简单计算器的主处理流程函数 *
**********************************************************/
void compute()
{
double u=0,v=0; /* u:输入的第1个数, v:输入的第2个数 */
int mi=1; /* 计算器开启标志:0-开启 1-未开启 */
int flag=0; /* 输入数据是否有小数点标志:0-无 1-有 */
int sign=0; /* 是否单击了运算符:0-无 其他-运算符字符 */
int x,y,xx=10,yy=10; /* (x,y)鼠标当前位置 (xx,yy)鼠标前一位置 */
char s[9]; /* 存储输入的数字符号(含小数点) */
int fget='q'; /* 前一次单击的按钮标签 */
char d; /* 当前单击的按钮标签 */
int i,j,a,b;
putimage(xx,yy,imagep,XOR_PUT); /* 首次在(10,10)处显示鼠标 */
while(rightpress()!=1) /* 单击右键则退出简单计算器 */
{
if(leftpress()!=1) /* 鼠标左键未单击的处理 */
{
get_mouse_position(&x,&y); /* 获取鼠标当前位置 */
if(x!=xx||y!=yy) /* 鼠标移动处理 */
{
putimage(xx,yy,imagep,XOR_PUT);
xx=x;yy=y;
putimage(x,y,imagep,XOR_PUT);
}
}
else if(MouseLeftFlag==1) /* 鼠标左键单击的处理 */
{
MouseLeftFlag=0; /* 置标志为0,防止单击1次左键而多次进入 */
d=getnumber(x,y); /* 得到单击按钮的标签字符 */
a=kx(d);
b=ky(d);
if(a!=0&&b!=0) /* 显示按钮被单击的过程 */
show(a,b);
if(d=='C') /* 单击C开始使用 */
{
clearscreen();
outtextxy(OUTX-15,OUTY,"0");
outtextxy(OUTX,OUTY,".");
v=u=0;
sign=0;
flag=0;
i=0;
mi=0;
}
else if('0'<=d&&d<='9') /* 单击'0'-'9'数字键的处理 */
{
if(mi==1);
else
{
if(d=='0'&&u==0&&flag==0) /* 开始时始终单击'0',就显示0 */
{
i=0;
s[i++]=d;
s[i++]='.';
s[i]='\0';
u=atof(s);
outch(u);
}
else
{
if(fget=='C'||fget=='='||fget=='%'||fget=='S')
{
clearscreen();
i=0;
s[i++]=d;
s[i++]='.';
s[i]='\0';
u=atof(s);
outch(u);
}
if('0'<=fget&&fget<='9')
{
if(sign==0) /* 未单击运算符,处理第1个数u */
{
if(flag==0) /* 输入数据无小数点 */
{
clearscreen();
u=u*10+d-'0';
if((u>0&&u<1e8)||(u<0&&u>-1e8))
{
s[--i]=d;
s[++i]='.';
s[++i]='\0';
u=atof(s);
outch(u);
}
else
outch(u);
}
if(flag==1) /* 输入数据有小数点 */
{
if(i<=8)
{
clearscreen();
s[i]=d;
s[++i]='\0';
u=atof(s);
outch(u);
}
}
}
if(sign!=0) /* 单击了运算符,处理第2个数v */
{
if(flag==0)
{
clearscreen();
v=v*10+d-'0';
if((v>0&&v<1e8)||(v<0&&v>-1e8))
{
s[--i]=d;
s[++i]='.';
s[++i]='\0';
v=atof(s);
outch(v);
}
else
outch(v);
}
if(flag==1)
{
if(i<=8)
{
clearscreen();
s[i++]=d;
s[i]='\0';
v=atof(s);
outch(v);
}
}
}
}
if(fget=='+'||fget=='-'||fget=='*'||fget=='/')
{
clearscreen();
i=0;
s[i++]=d;
s[i++]='.';
s[i]='\0';
v=atof(s);
outch(v);
}
if(fget=='.') /* 前一次单击的是小数点按钮 */
{
clearscreen();
s[i]=d;
s[++i]='\0';
if(sign==0)
{
u=atof(s);
outch(u);
}
if(sign!=0)
{
v=atof(s);
outch(v);
}
}
}
}
}
else if(d=='+'||d=='-'||d=='*'||d=='/')
{ /* 单击加,减,乘,除按钮的处理 */
if(sign!=0)
{
if(fget=='+'||fget=='-'||fget=='*'||fget=='/');
else
{
if(sign=='/'&&v==0)
{
clearscreen();
outtextxy(OUTX-15,OUTY,"E");
}
else{
u=calculate(u,v,sign);
outch(u);
}
}
}
sign=d;
flag=0;
i=0;
}
else if(d=='=') /* 单击等号按钮的处理 */
{
if(sign!=0)
{
if(sign=='/'&&fabs(v)<1e-6)
{
clearscreen();
outtextxy(OUTX-15,OUTY,"E");
}
else
{
u=calculate(u,v,sign);
outch(u);
}
}
flag=0;
sign=0;
i=0;
}
else if(d=='.') /* 单击小数点按钮的处理 */
{
if(flag==0)
flag=1;
}
else if(d=='%') /* 单击百分号按钮的处理 */
{
if(sign==0) /* 如果是第1个数,输出u的百分数 */
outch(u*100);
if(sign!=0) /* 是第2个数(单击过运算符),输出v的百分数 */
outch(v*100);
i=0;
}
else if(d=='S') /* 单击求平方根按钮的处理 */
{
if(sign==0) /*对输入的第1个数求平方根 */
{
if(u<0)
{
clearscreen();
outtextxy(OUTX-15,OUTY,"E");
}
else{
u=sqrt(u);
outch(u);
}
}
if(sign!=0) /*对输入的第2个数求平方根 */
{
if(v<0)
{
clearscreen();
outtextxy(OUTX-15,OUTY,"E");
}
else{
v=sqrt(v);
outch(v);
}
}
i=0;
}
else if(d=='w') /* 单击+/-按钮的处理 */
{
if(mi==1);
else
if(sign==0)
{
u=-u;
outch(u);
}
else
{
v=-v;
outch(v);
}
}
else
continue;
fget=d; /* 保存上次单击按钮的标签 */
} /* End of else if(MouseLeftFlag==1) */
} /* End of while(rightpress()!=2) */
}
/**********************************************************
* 函数原型:double calculate(double u,double v,int sign) *
* 传入参数:u-第1个数 v-第2个数 sign-运算符 *
* 返 回 值:四则运算结果 *
* 函数功能:简单计算器的加、减、乘、除处理 *
**********************************************************/
double calculate(double u,double v,int sign)
{
switch(sign)
{
case '+':u+=v;break;
case '-':u-=v;break;
case '*':u*=v;break;
case '/':u/=v;break;
}
return u;
}
void main()
{
GraphInit();
initmouse();
picture();
compute();
closegraph();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -