图形鼠标输入界面计算器.docx
《图形鼠标输入界面计算器.docx》由会员分享,可在线阅读,更多相关《图形鼠标输入界面计算器.docx(19页珍藏版)》请在冰豆网上搜索。
图形鼠标输入界面计算器
图形界面鼠标操作计算器
计算器功能:
1.单步的加减乘除运算
2.连续的加减运算或者乘除运算
3.乘除在前,加减在后的混合运算
设计思路:
用鼠标点击图片中的数字或符号区域,输入的字符。
输入的字符以字符串的形式存储。
在输入=后,整个对整个字符串进行判断,将字符串中的数字以运算符号或者=为区分点,将其转化为数字,之后按照顺序进行运算显示图片,用Switch进行判断输出,数字和符号录入及运算结果的动态输出运用循环控制位置和顺序。
本计算器只能进行简单单步计算或者顺序多步计算,并不能按运算优先级控制运算顺序,由于未将图片以资源文件的形式添加到程序中,故exe文件无法单独运行,须在解决方案中打开。
完整程序:
#include
#include
#include//包括函数getch()、exit()
#include//包括各类数学计算的函数
#include//包括图片窗口及显示函数loadimage()、initgraph()、putimage()、puttextxy()
#include"windows.h"//包括控制主板蜂鸣器的函数Beep()
#include"string.h"//包括字符串的输入、转换、输出等函数
#include"iostream"//包括定义逻辑变量bool函数
IMAGEimg,img0,img1,img2,img3,img4,img5,img6,img7,img8,img9,
imgplus,imgcut,imgdivide,imgmultiply,imganswer;
MOUSEMSGmou;//定义全局变量有利于调用图片和鼠标参数
voidDisplay()//主界面显示
{
printf("\t\t\t\tC语言大作业\n\n\t\t\t\t简单计算器\n\n\n功能介绍:
\n");
printf("1.单步的加减乘除运算\n2.连续的加减运算或者乘除运算\n3.乘除在前,加减在后的混合运算\n");
printf("\n\n制作人:
\n\t通信一班\n\t\t408宿舍\n\t\t\tLMZBJZLTYZYL\n");
printf("\n\n\n\t\t\t\t按任意键启动计算器...\n\n\n");
getchar();
}
voidWindow()//打开图形窗口,载入图片
{
initgraph(470,420);//打开图形窗口,设定大小
loadimage(&img,"ck.jpg");//载入图片
loadimage(&img0,"ck0.jpg");
loadimage(&img1,"ck1.jpg");
loadimage(&img2,"ck2.jpg");
loadimage(&img3,"ck3.jpg");
loadimage(&img4,"ck4.jpg");
loadimage(&img5,"ck5.jpg");
loadimage(&img6,"ck6.jpg");
loadimage(&img7,"ck7.jpg");
loadimage(&img8,"ck8.jpg");
loadimage(&img9,"ck9.jpg");
loadimage(&imgplus,"ckplus.jpg");
loadimage(&imgcut,"ckcut.jpg");
loadimage(&imgdivide,"ckdivide.jpg");
loadimage(&imgmultiply,"ckmultiply.jpg");
loadimage(&imganswer,"ckanswer.jpg");
putimage(0,0,&img);//显示初始界面
}
voidPic(charg)//输入过程中的按键显示
{
switch(g)//判断输入值,控制按键显示变化
{
case'0':
putimage(0,0,&img0);Sleep(150);putimage(0,0,&img);break;
case'1':
putimage(0,0,&img1);Sleep(150);putimage(0,0,&img);break;
case'2':
putimage(0,0,&img2);Sleep(150);putimage(0,0,&img);break;
case'3':
putimage(0,0,&img3);Sleep(150);putimage(0,0,&img);break;
case'4':
putimage(0,0,&img4);Sleep(150);putimage(0,0,&img);break;
case'5':
putimage(0,0,&img5);Sleep(150);putimage(0,0,&img);break;
case'6':
putimage(0,0,&img6);Sleep(150);putimage(0,0,&img);break;
case'7':
putimage(0,0,&img7);Sleep(150);putimage(0,0,&img);break;
case'8':
putimage(0,0,&img8);Sleep(150);putimage(0,0,&img);break;
case'9':
putimage(0,0,&img9);Sleep(150);putimage(0,0,&img);break;
case'+':
putimage(0,0,&imgplus);Sleep(150);putimage(0,0,&img);break;
case'-':
putimage(0,0,&imgcut);Sleep(150);putimage(0,0,&img);break;
case'*':
putimage(0,0,&imgmultiply);Sleep(150);putimage(0,0,&img);break;
case'/':
putimage(0,0,&imgdivide);Sleep(150);putimage(0,0,&img);break;
default:
break;
}
}
voidPog(char*num,inti)//输入过程中的数字及符号显示
{
intii;
setfont(30,0,"Arial");//设置显示字体、大小
for(ii=i;ii>=0;ii--)//控制显示位置
outtextxy(400-(ii-1)*13,80,num[i-ii]);
}
voidPoa(char*ans,char*num,intnumber)//答案的显示
{
intjj,p,q;
p=strlen(ans);
q=strlen(num);//获取各字符串长度,用于下一步的显示控制
putimage(0,0,&img);
for(jj=number;jj>=0;jj--)//控制原算式的显示
outtextxy((35+number*13)-13*jj,30,num[number-jj]);
for(jj=p;jj>0;jj--)//控制运算结果的显示
outtextxy(400-(jj-3)*13,80,ans[p-jj]);
}
charMouseget()//鼠标控制函数
{
intx,y;
charm;
x=0;
y=0;
next:
mou=GetMouseMsg();//获取鼠标信息
x=mou.x;
y=mou.y;
switch(mou.uMsg)
{
caseWM_LBUTTONDOWN:
//判断左键是否按下
if(x>0&&x<79&&y>284&&y<350)//根据左键按下的位置确定返回值m
m='1';
if(x>79&&x<155&&y>284&&y<350)
m='2';
if(x>155&&x<233&&y>284&&y<350)
m='3';
if(x>0&&x<79&&y>210&&y<284)
m='4';
if(x>79&&x<155&&y>210&&y<284)
m='5';
if(x>155&&x<233&&y>210&&y<284)
m='6';
if(x>0&&x<79&&y>144&&y<210)
m='7';
if(x>79&&x<155&&y>144&&y<210)
m='8';
if(x>155&&x<233&&y>144&&y<210)
m='9';
if(x>0&&x<233&&y>350&&y<420)
m='0';
if(x>233&&x<345&&y>144&&y<248)
m='+';
if(x>345&&x<470&&y>144&&y<248)
m='-';
if(x>233&&x<345&&y>248&&y<350)
m='*';
if(x>345&&x<470&&y>248&&y<350)
m='/';
if(x>233&&x<470&&y>350&&y<420)
m='=';
break;
default:
gotonext;break;//若左键没有按下,重复以上循环
}
returnm;
}
voidCaculator()//控制输入、数值转化、计算
{
inti,j,l,k=0,n,c,d,y=0,g,m[100]={0},number;
doublea[100],so,b[100]={0};
charnum[100],gt;
charans[100];//声明用到的变量
for(i=0;i<100;i++)
a[i]=10;
for(i=0;i<100;i++)
{
gt=Mouseget();//调用鼠标控制函数,用鼠标进行输入
num[i]=gt;
Beep(1500,100);//控制按键声音
Pic(gt);//调用函数控制输入阶段按键变化
Pog(num,i);//调用函数控制输入阶段字符的动态显示
if(num[i]=='=')//如果输入=,将已输入字符串进行运算
{
number=i;
break;
}
}
for(i=0;i<100;i++)//此阶段控制输入的字符串转化为数字,以运算符号为区分点
{
switch(num[i])
{
case'1':
a[i]=1;break;
case'2':
a[i]=2;break;
case'3':
a[i]=3;break;
case'4':
a[i]=4;break;
case'5':
a[i]=5;break;
case'6':
a[i]=6;break;
case'7':
a[i]=7;break;
case'8':
a[i]=8;break;
case'9':
a[i]=9;break;
case'0':
a[i]=0;break;
default:
break;
}
if(num[i]=='\0')break;
}
for(n=1;n<100;n++)
{
c=0;
for(d=k;d
{
if(a[d]!
=10)
c++;
elsebreak;
}
k=k+c+1;
m[n]=c-1;
if(m[n]==-1)break;
}
for(j=0;j<100;j++)
{
for(k=y;k
{
if(a[k]!
=10)
b[j]=a[k]*pow(10.0,m[j+1]-k+y)+b[j];
elsebreak;
}
y=y+m[j+1]+2;
if(b[j]==0)break;
}//至此,转化阶段结束
so=b[0];
l=1;
for(g=0;g
{
switch(num[g])
{
case'+':
so+=b[l],l++;break;
case'-':
so=so-b[l],l++;break;
case'*':
so=so*b[l],l++;break;
case'/':
so=so/b[l],l++;break;
default:
break;
}
if(b[l]==0.0)
break;
}
gcvt(so,15,ans);//将运算结果转化为字符串,用于下一步的显示
Poa(ans,num,number);//调用函数控制运算结果及原算式的显示
}
intmain()//主程序
{
Display();//开始界面
Window();//打开图形窗口,载入图片
while
(1)//控制程序可以多次运行
{
Caculator();//调用控制输入、数值转化及计算的函数
}
return0;
}
图片部分:
ck.jpg
ck0.jpg
ck1.jpg
ck2.jpg
ck3.jpg
ck4.jpg
ck5.jpg
ck6.jpg
ck7.jpg
ck8.jpg
ck9.jpg
ckcut.jpg
ckdivide.jpg
ckmultiply.jpg
ckadd.jpg
将图片保存到解决方案中的Caculator文件夹中,并按照图片后面的标注进行命名,可以对图片进行调用。
程序必须在安装easyx的电脑上进行执行,并按照以下方法进行命名。
而且,应注意此项设置,否则无法运行。
程序功能不全,还有不少Bug,有待改进。
程序的亮点是,可以用鼠标点击对应区域输入值,同时图形窗口中可以进行按键和字符的动态输出,而且会有按键声音。
山东大学(威海)
机电与信息工程学院
2011级通信一班
408宿舍
ELESSAR
C语言期末作业作品
谢谢