#include "graphics.h"
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "conio.h"
char photo[41]="图片\\a.jpg";//图片路径
//==========================================函数声明
int shuru_ch(char *m);//输入字符串到ch[]
int ismun(char a);//判断是否是数字
int isop(char a);//判断是否是运算符
void initgraph() ;//创建用户界面
int check(char a[]);//字符串ch[]合法性检验
double count(double x, double y, char a);//计算函数
void qushu(char ch[],double *s,char *p);//取数函数
//---------------------------------------
int main()
{
int m,n;int i=0;
char put[41];//将double型的运算结果转换为字符串装入put[41]
char ch[41];//存字符串
double s[41];//存浮点数
double x;
char p[41];//存运算符(+,-)
RECT r={1,1,400,100};//RECT 参数名:定义一个rectangle(矩形)
initgraph();//创建用户界面
//---------------------------------------------------------
here://goto标记
//---------------------------------------------------------
for(;i<41;i++)//使后面put数组内容末尾有\0
put[i]='\0';
//---------------------------------------------------------
shuru_ch(ch);//输入字符串到ch[]
x=atof(ch);
qushu(ch,s,p);//取数
for(m=0,n=0;s[m]!='\0';m++,n++)//计算
{
x=count(x, s[m], p[n]);
}
sprintf(put,"%.2f",x);//将double型的运算结果转换为字符串装入put[41]
clearrectangle(0,0,400,100);//清屏
drawtext(put,&r, DT_CENTER | DT_VCENTER | DT_SINGLELINE);//在矩形r上格式化输出运算结果
goto here;//回到here处,用于实现多次计算
getch();
closegraph();//关闭图形界面
int j=0;
for(;s[j]!='\0';j++)
printf("%f\n",s[j]);
return 0;
}
//=============================================================================================
//时间:2019.5.18
int shuru_ch(char *ch)//输入字符串
{
int i=0;
char x[4][4]={{'7','8','9','+'},//将图形界面信息用二维数组表示
{'4','5','6','-'},
{'1','2','3','*'},
{'.','0','=','/'}};
MOUSEMSG m;
RECT r={1,1,400,100};//RECT 参数名:定义一个rectangle(矩形)
//---------------------------------------------------- --------------------------
for(;i<41;i++)// 使后面ch数组内容末尾有\0
ch[i]='\0';
//----------------------------------------------------- ----------------------------
i=0;
while(1)//死循环用于等待鼠标信息
{
m=GetMouseMsg();
if(m.mkLButton&&m.uMsg==WM_LBUTTONDOWN)//判断鼠标左键是否按下
{
//点击‘=’(输入完成,将字符串转至check函数验证合法性)
if(m.x>=200&&m.x<=300&&m.y>=400&&m.y<=500)
{
if(check(ch)==1)
return 1;
else
{
drawtext("输入错误,请重新输入!",&r, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
shuru_ch(ch);//输入错误,回调该函数重新输入
}
}
//----------------------------------------------------------------------------------------------------
//点击归零区域,归零----------------------------------------------------------------------------------
if(m.x>=200&&m.x<=400&&m.y>=500&&m.y<=600)
{
for(i=0;i<41;i++)
ch[i]='\0';
i=0;//归零过后要确保下一次输入从ch[0]开始
}
//-------------------------------------------------------------------------------------------------
//点击删除区域,删除前一个输入的字符----------------------------------------------------------------
if(m.x>=0&&m.x<=200&&m.y>=500&&m.y<=600)
{
if(i>0)//若不加if(i>0),在点击清零后(点击清零后i=0),再点击一次“删除按钮”,此时若输入123,则只将23存入数组;
//清零后点击二次“删除按钮”再输入123,则值将3存入ch数组;即使如此输入的字符串任可正常运行。
//若加上if(i>0)则不会。
i--;
ch[i]='\0';
}
//---------------------------------------------------------------------------------------------------
//将点击的字符输入ch数组
if(m.x>=0&&m.x<=400&&m.y>=100&&m.y<=400||m.x>=0&&m.x<=200&&m.y>=400&&m.y<=500||m.x>=300&&m.x<=400&&m.y>=400&&m.y<=500)
{
ch[i]=x[(m.y)/100-1][(m.x)/100];//鼠标位置(x,y)信息经运算,将对应的二维数组x中的值赋值给ch
i++;
}
//-------------------------------------------------------------------------------------------------
clearrectangle(0,0,400,100);
drawtext(ch,&r, DT_CENTER | DT_VCENTER | DT_SINGLELINE);//在举行r内显示输入内容
}
}
}
//=============================================================================================
//时间:2019.5.18
void initgraph()
{
int m=0,n=0;
int x[]={0,100,200,300},y[]={100,200,300,400,500};//图片张贴作坐标信息
IMAGE img,img_2;//创建图像对象img 和img_2。只用img有问题
initgraph(400,600,NULL);//创建画布
for(;m<4;m++)//x轴
{
for(n=0;n<4;n++)//y轴
{
loadimage(&img,photo,100,100);//图片初始化,并限制其大小
putimage(x[m],y[n],&img);//选择坐标,粘贴图片
photo[5]=photo[5]+1;//改变图片路径
}
}
m=0,n=4;
for(;m<4;m=m+2)//张贴归零图片和删除图片,大小与坐标同上面不同
{
loadimage(&img_2,photo,200,100);//图片初始化,并限制其大小
putimage(x[m],y[n],&img_2);//选择坐标,粘贴图片
photo[5]=photo[5]+1;//改变图片路径
}
}
//===========
//功能:判断数字,是数字返回1,否则返回0
//时间:2019.4.5
int ismun(char a)
{
if(a>='0'&&a<='9')
return 1;
return 0;
}
//=======================================
//功能:判断运算符,是运算符返回1,否则返回0
//时间:2019.4.5
int isop(char a)
{
if(a=='+'||a=='-'||a=='/'||a=='*')
return 1;
return 0;
}
//========================================
//功能:计算功能,返回运算结果
//时间:2019.4.5
double count(double x, double y, char a)
{
double t;
switch(a)
{
case '+':t=x+y;break;
case '-':t=x-y;break;
case '*':t=x*y;break;
case '/':t=x/y;break;
}
return t;
}
//=======================================
//功能:合法性函数,判断字符串合法性,合法返回1,否则返回1
//时间:2019.4.5
int check(char *ch)//合法性
{
int i;
if(ismun(ch[0])==0||ismun(ch[strlen(ch)-1])==0)//判断第一个和最后一个是否为数字
return 0;
for(i=0;ch[i]!='\0';i++)
{
if((isop(ch[i])==1&&isop(ch[i+1])==1)||(ch[i]=='.'&&isop(ch[i+1]))||(isop(ch[i])&&ch[i+1]=='.'))//判断是否有连续运算符或.+和+.的情况
return 0;
if(isop(ch[i])==0&&ismun(ch[i])==0&&ch[i]!='.')//除开运算符、数字、小数点是否存在其它字符
return 0;
}
int j; //判断是否存在2..2或2.2.222.2.2的情况
for(i=0;ch[i]!='\0';i++)
{
if(ch[i]=='.')
for(j=i+1;;j++)
{
if(isop(ch[j])==1||ch[j]=='\0')
break;
if(ch[j]=='.')
return 0;
}
}
for(i=0;ch[i]!='\0';i++)//是否为纯数字
{
if(isop(ch[i])==1)
return 1;
}
return 0;
}
//========================================================
//功能:将字符串中的运算符和数字分别存在p[]和s[]中;并运算‘*’‘/’
//时间:2019.4.5
void qushu(char *ch,double *s,char *p)
{
double y;
int m=0,n=0,i;
for(i=0; ch[i]!='\0'; i++)
{
if(ch[i]=='+'||ch[i]=='-')
{
*(p+n)=ch[i];//p[n]与*(p+n) 效果一样
*(s+m)=atof(ch+i+1);
m++;
n++;
}
if(ch[i]=='/')
{
y=atof(ch+i+1);
*(s+m-1)=count(*(s+m-1),y,ch[i]);
}
if(ch[i]=='*')
{
y=atof(ch+i+1);
*(s+m-1)=count(*(s+m-1),y,ch[i]);
}
}
s[m]='\0';
p[n]='\0';
}
改进(在计算器图形界面v2.0的基础上):
1.增加删除功能和清零功能。
2.解决在点击归零再多次点击删除后,ch数组输入时,下标为负数的情况。
3.在增加贴图时(删除和清零),新定义了IMAGE img_2。