:#include
#include
#include
#include
#include
#include
class Window;
Window * const SCREEN=(Window *)0;
enum buttonstatus{unpushed,pushed};
enum boolean{false,true};
class Window
{
protected:
Window * ptr;
int left,right,top,bot;
int delta,deltacolor,centercolor;
public:Window(){}
Window(Window *ptro,int l,int t,int r,int b,int dc,int cc);
void Display();
};
class Border:public Window
{
public:
Border(Window *ptro,int l,int t,int r,int b,int dc=DARKGRAY,int cc=BLUE)
:Window(ptro,l,t,r,b,dc,cc){}
};
class Button:public Window
{
char text[20];
buttonstatus bs;
public:
Button(Window *ptro,int l,int t,int r,int b,int cc=BLACK,char *tx="")
:Window(ptro,l,t,r,b,BLACK,cc)
{strcpy(text,tx);bs=unpushed;}
void Click();
void Display();
};
class Output:public Window
{
char text[80];
public:
Output(Window *ptro,int l,int t,int r,int b,int dc=BLUE,int cc=WHITE)
:Window(ptro,l,t,r,b,dc,cc){}
void Text(char *ch);
void Number(double d);
};
Window::Window(Window* ptro,int l,int t,int r,int b,int dc,int cc)
{
ptr=ptro;left=l;right=r;top=t;bot=b;deltacolor=dc;centercolor=cc;
delta=(-r-l-b-t)/150+3;
if(ptr!=SCREEN)
{
left+=ptr->left;
right+=ptr->right;
top+=ptr->top;
bot+=ptr->bot;
}
}
void Window::Display()
{
setcolor(WHITE);
int p[10];
p[0]=left;p[1]=top;p[2]=right;p[3]=top;p[4]=right;p[5]=bot;
p[6]=left;p[7]=bot;p[8]=left;p[9]=top;
setfillstyle(SOLID_FILL,deltacolor);
fillpoly(5,p);
rectangle(left+delta+1,top+delta,right-delta-1,bot-delta);
setfillstyle(SOLID_FILL,centercolor);
floodfill(left+(right-left)/2,top+delta+1,WHITE);
}
void Button::Click()
{
bs=pushed;
Button::Display();
sound(500);delay(10);nosound();
delay(250);
bs=unpushed;
Button::Display();
sound(400);delay(10);nosound();
}
void Button::Display()
{
Window::Display();
moveto(left+(right-left)/2+1,top+(bot-top)/2);
settextjustify(CENTER_TEXT,CENTER_TEXT);
settextstyle(SANS_SERIF_FONT,HORIZ_DIR,USER_CHAR_SIZE);
setusercharsize(5,8,2,3);
setcolor(WHITE);
outtext(text);
moveto(left,top);
lineto(left+delta,top+delta);
moveto(right,top);
lineto(right-delta,top+delta);
moveto(left,bot);
lineto(left+delta,bot-delta);
moveto(right,bot);
lineto(right-delta,bot-delta);
setfillstyle(SOLID_FILL,LIGHTGRAY);
if(bs==unpushed)
{
floodfill(left+(right-left)/2,top+1,WHITE);
floodfill(left+1,top+(bot-top)/2,WHITE);
}
else
{
floodfill(left+(right-left)/2,bot-1,WHITE);
floodfill(right-1,top+(bot-top)/2,WHITE);
}
}
void Output::Text(char *ch)
{
Display();
moveto(right-delta,top+(bot-top)/2);
settextjustify(RIGHT_TEXT,CENTER_TEXT);
settextstyle(SANS_SERIF_FONT,HORIZ_DIR,USER_CHAR_SIZE);
setusercharsize(5,8,1,1);
setcolor(BLACK);
outtext(ch);
}
void Output::Number(double d)
{
char buffer[80];
sprintf(buffer,"%16.2lf",d);
Output::Text(buffer);
}
void main()
{
int gd,gm;
gd=EGA;
gm=EGAHI;
initgraph(&gd,&gm,"\tc\bgi");
Border br1(SCREEN,240,30,480,330);
Output o1(&br1,20,20,-20,-240,BLUE,WHITE);
Button b0(&br1,30,230,-175,-35,BLACK,"0");
Button b1(&br1,30,180,-175,-85,BLACK,"1");
Button b2(&br1,78,180,-127,-85,BLACK,"2");
Button b3(&br1,127,180,-78,-85,BLACK,"3");
Button b4(&br1,30,130,-175,-135,BLACK,"4");
Button b5(&br1,78,130,-127,-135,BLACK,"5");
Button b6(&br1,127,130,-78,-135,BLACK,"6");
Button b7(&br1,30,80,-175,-185,BLACK,"7");
Button b8(&br1,78,80,-127,-185,BLACK,"8");
Button b9(&br1,127,80,-78,-185,BLACK,"9");
Button bdiv(&br1,175,80,-30,-185,BLUE,"/");
Button bmul(&br1,175,130,-30,-135,BLUE,"*");
Button bsub(&br1,175,180,-30,-85,BLUE,"-");
Button bdot(&br1,78,230,-127,-35,BLACK,".");
Button bclr(&br1,127,230,-78,-35,RED,"clr");
Button badd(&br1,175,230,-30,-35,BLUE,"+=");
br1.Display();o1.Display();
b7.Display();b8.Display();b9.Display();
b4.Display();b5.Display();b6.Display();
b1.Display();b2.Display();b3.Display();
b0.Display();bdot.Display();bclr.Display();
bsub.Display();bdiv.Display();badd.Display();bmul.Display();
o1.Number(0.0);
const char ESC=27;
char ds[80],tb[80],ch,oper;
int num=0;
boolean isfirst=true,chain=false;
double num1,num2,ans;
while((ch=getch())!=ESC)
{
if(ch>='0'&&ch<='9'||ch=='.')
{
switch(ch)
{
case '0':b0.Click();break;
case '1':b1.Click();break;
case '2':b2.Click();break;
case '3':b3.Click();break;
case '4':b4.Click();break;
case '5':b5.Click();break;
case '6':b6.Click();break;
case '7':b7.Click();break;
case '8':b8.Click();break;
case '9':b9.Click();break;
case '.':bdot.Click();break;
}
ds[num++]=ch;ds[num]='