#include"graphics.h"
#include"dos.h"
#include"stdio.h"
#include"math.h"
union REGS i,o;
char *text[]={ "7","8","9","*",
	 "4","5","6","/",
	 "1","2","3","+",
	 "0","00",".","-",
	 "M","M+","M-","+/-",
	 "MR","MC","x^2","sr",
	 "OFF","AC","CE","="};
int k=0,pass,op,prop,newnum=1,bt,memo=1,d=0,sq;
long double num=0,accum,m;
void normalbutton(int ,int ,int ,int,char**);
void main()
{
int gd=DETECT,gm,x1,x2,y1,y2,i,j,maxx,maxy,x,y,button;
char *text1[]={""","T","o"," ","K","n","o","w"," ","a","b","o",
	 "u","t"," ","m","e"," ","l","o","g","o","n"," ",":"};
char *text2[]={"w","w","w",".","g","e","o","c","i","t","i","e","s",
	".","c","o","m","/","t","a","l","k","d","e","e","p",
	"e","s","h"};
initgraph(&gd,&gm,"");
if(initmouse()==0)
 {
 closegraph();
 restorecrtmode();
 printf("
Mouse driver not loded");
 exit(1);
 }
 showmouseptr();
// x=y=50;
 movemouseptr(&x,&y);
setbkcolor(11);
setcolor(1);
rectangle(198,140,417,163);
rectangle(199,141,418,164);
rectangle(197,139,416,162);
rectangle(185,130,430,450);
rectangle(184,129,431,451);
rectangle(182,127,433,454);
rectangle(181,126,434,453);
//setfillstyle(SOLID_FILL,3);
//bar(200,142,415,161);
outtextxy(200,50,"A Calculator in C");
outtextxy(200,100,"Press OFF button to exit....");
y1=140;
y2=160;
	for(j=0;j<7;j++)
 {
 x1=200;
 x2=235;
 y1+=40;
 y2+=40;
 for(i=0;i<4;i++)
 {
 normalbutton(x1,x2,y1,y2,text);
 x1+=60;
 x2+=60;
 }
 }
 while(1)
 {
	getmousepos(&button,&x,&y);
	y1=140;
	y2=160;
/*
	if( (x>400&&x<450) && (y>400&&y<420) )
 {	if((button & 1)==1)
	 {	sound(500);
	delay(5);
	exit();
	 }
 }
*/
	for(j=0;j<7;j++)
 {
 x1=200;
 x2=235;
 y1+=40;
 y2+=40;
 for(i=0;i<4;i++)
 {
	 if((xx1)&&(yy1))
 {
	if((button & 1)==1)
	 { gotoxy(28,10);
	 //	printf("%d",ch=*text[j*4+i]);
	 //	printf("char is %c",ch);
	bt=j*4+i;
 //	printf("char is %d",j*4+i);
	setcolor(11);
	outtextxy(x1+12,y1+7,text[j*4+i]);
	if(num>pow(10.0,18))
	exit();
	sound(500);delay(10);nosound();
	delay(250);
	sound(400);delay(10);
	nosound();
	 switch (bt)
	 {
	 case 8 :
	 addnum(1);
	 break;
	 case 9 :
	 addnum(2);
	 break;
	 case 10 :
	 addnum(3);
	 break;
	 case 4 :
	 addnum(4);
	 break;
	 case 5 :
	 addnum(5);
	 break;
	 case 6 :
	 addnum(6);
	 break;
	 case 0 :
	 addnum(7);
	 break;
	 case 1 :
	 addnum(8);
	 break;
	 case 2 :
	 addnum(9);
	 break;
	 case 12 :
	 addnum(0);
	 break;
	 case 11 :
	 // plus
	 operation(1);
	 break;
	 case 15 :
	 // minus
	 operation(2);
	 break;
	 case 3 :
	 // multiplication
	 operation(3);
	 break;
	 case 7 :
	 // division
	 operation(4);
	 break;
	 case 13:
	 doublezero();
	 break;
	 case 14 :
	 decimal();
	 break;
	 case 16:
	 mem();
	 break;
	 case 20:
	 recallmem();
	 break;
	 case 19:
	 plusminus();
	 break;
	 case 17:
	 plusm();
	 break;
	 case 18:
	 minusm();
	 break;
	 case 21:
	 clearm();
	 break;
	 case 22 :
	 square();
	 break;
	 case 23:
	 sqroot();
	 break;
	 case 24:
	 // OFF
	 hidemouseptr();
	 setcolor(1);
	 for(j=0;j<20;j++)
	 {
	for(i=75;i<481;i+=20)
	 line(0,0+i+j,640,j+0+i);
	 delay(100);
	 }
	 setcolor(14);
	 outtextxy(225,200,"Thanks for using it !");
	 delay(2000);
	 setcolor(13);
	for(j=0;j<20;j++)
	 {
	for(i=0;i<640;i+=20)
	 line(0+i+j,0,j+0+i,640);
	 delay(100);
	 }
	 setcolor(1);
	 for(i=0;i<25;i++)
	 {
	outtextxy(75+10*i,200,text1[i]);
	 sound(3000);
	 delay(50);
	 nosound();
	 }
	 for(i=0;i<29;i++)
	 {
	outtextxy(125+10*i,225,text2[i]);
	 sound(3000);
	 delay(50);
	 nosound();
	 }
	 delay(2500);
	 sound(5000);
	 delay(10);
	 exit();
	 break;
	 case 25:
	 allclear();
	 break;
	 case 26:
	 clear();
	 break;
	 case 27:
	 // equalto
	 operation(5);
	 break;
	 }
	 setcolor(1);
	outtextxy(x1+12,y1+7,text[j*4+i]);
	 }
 }
	x1+=60;
	x2+=60;
 }
 }
 }
}
void normalbutton(int x1,int x2,int y1,int y2,char **text)
{
setcolor(15);
rectangle(x1-2,y1-2,x2+1,y2+1);
rectangle(x1-1,y1-1,x2+2,y2+2);
setcolor(7);
rectangle(x1,y1,x2+2,y2+2);
rectangle(x1,y1,x2+1,y2+1);
setfillstyle(SOLID_FILL,14);
bar(x1,y1,x2,y2);
setcolor(1);
outtextxy(x1+12,y1+7,text[k]);
k++;
}
/* initmouse */
initmouse()
{
 i.x.ax=0;
 int86 (0x33,&i,&o);
 return(o.x.ax);
}
hidemouseptr()
{
	 i.x.ax=2;
	 int86(0x33,&i,&o);
}
/* displays mouse pointer */
showmouseptr()
{
 i.x.ax=1;
 int86(0x33,&i,&o);
 return 0;
}
/*gets mouse coordinates and button status*/
getmousepos(int *button,int *x,int *y)
{
 i.x.ax=3;
 int86(0x33,&i,&o);
 *button=o.x.bx;
 *x=o.x.cx;
 *y=o.x.dx;
 return 0;
}
/* Move mouse ptr to x,y */
movemouseptr(int *x,int *y)
{
 i.x.ax=4;
 int86(0x33,&i,&o);
 o.x.cx=*x;
 o.x.dx=*y;
 return 0;
}
addnum(int pass)
{ if(sq)
	newnum=1;
	if(newnum)
	 { if(d)
	{
	 num=pass/(pow(10.0,d));
	 d++;
	 newnum=0;
	}
	 else
	{ num=pass;
	 newnum=0;
	}
	 }
	else
	{
	/* if(num==0)
	 { if(d)
	{
	 num=num+pass/(pow(10.0,d));
	 d++;
	}
	 else
	 num=pass;
	 }
	*/
	//	 else
	 { if(d)
	{
	 if(num<0)
	 num=num-pass/(pow(10.0,d));
	 else
	 num=num+pass/(pow(10.0,d));
	 d++;
	}
	else
	{
	num=num*10+pass;
	}
	}
	 }
 printf("%25.5Lf",num);
}
operation(int opr)
{ long double pnum;
 pnum=num;
 if(newnum && (prop != 5) && memo)
 {
 }
 else
 { newnum=1;
	 d=0;
	 sq=0;
	 switch(prop)
	{
	 case 1:
	accum=accum+pnum;
	break;
	 case 2:
	accum=accum-pnum;
	break;
	 case 3:
	accum=accum*pnum;
	break;
	 case 4:
	accum=accum/pnum;
	break;
	 default:
	 accum=pnum;
	 }
 }
	prop=opr;
	num=accum;
 printf("%25.5Lf",num);
}
allclear()
{
 sq=0;
 accum=0;
 num=0;
 d=0;
 newnum=1;
 printf("%25.5Lf",num);
}
mem()
{
 m=num;
}
recallmem()
{
 memo=0;
 printf("%25.5Lf",m);
 num=m;
}
plusminus()
{ if(num!=0)
 {	num*=-1;
	printf("%25.5Lf",num);
 }
}
plusm()
{
m+=num;
}
minusm()
{
m-=num;
}
clearm()
{
m=0;
}
decimal()
{
 if(!d)
 {d=1;
	if(newnum==1)
	{
	 num=0;
	}
 printf("%25.5Lf",num);
 }
}
square()
{ sq=1;
 num*=num;
 printf("%25.5Lf",num);
// newnum=1;
}
sqroot()
{ sq=1;
 num=pow(num,0.5);
 printf("%25.5Lf",num);
// newnum=1;
}
doublezero()
{
 if(d)
 {
	// num=num+pass/(pow(100.0,d));
	 d++;
	 d++;
 }
 else
 num*=100;
 printf("%25.5Lf",num);
}
clear()
{
num=0;
printf("%25.5Lf",num);
}