# include & ltmath.h & gt/*數學函數的定義*/
# include & ltconio.h & gt/*屏幕操作功能*/
# include & ltstdio.h & gt/*I/O功能*/
# include & ltstdlib.h & gt/*庫函數*/
# include & ltstdarg.h & gt/*可變長度參數表*/
# include & ltgraphics.h & gt/*圖形功能*/
# include & ltstring.h & gt/*字符串函數*/
# include & ltctype.h & gt/*字符操作功能*/
#define UP 0x48 /*光標向上鍵*/
#define DOWN 0x50 /*光標向下鍵*/
#定義左0x4b /*光標左鍵*/
#定義右0x4d /*光標右鍵*/
#define ENTER 0x0d /* Enter */
void * rar/*全局變量,保存光標圖像*/
struct palettetype調色板;/*使用調色板信息*/
int GraphDriver/*圖形設備驅動程序*/
int GraphMode/*圖形模式值*/
int錯誤代碼;/*錯誤代碼*/
int MaxColors/*可用顏色的最大數量*/
int MaxX,MaxY/*屏幕的最高分辨率*/
雙面翻;/*屏幕的像素比率*/
void draw boder(void);/*繪制邊框函數*/
void初始化(void);/*初始化函數*/
void電腦(void);/*計算器計算功能*/
void changetextstyle(int font,int direction,int charsize);/*更改文本樣式功能*/
void m window(char * header);/*窗口函數*/
int special key(void);/*獲取特殊按鍵功能*/
int arrow();/*設置箭頭光標功能*/
/*主函數*/
int main()
{
initialize();/*設置系統進入圖形模式*/
計算機();/*運行計算器*/
closegraph();/*系統關閉圖形模式並返回到文本模式*/
return(0);/*結束程序*/
}
/*設置系統進入圖形模式*/
void初始化(void)
{
int xasp,yasp/*用於讀取X和Y方向的縱橫比*/
GraphDriver = DETECT/*自動檢測顯示*/
init graph(& amp;graph driver & amp;GraphMode,“”;
/*初始化圖形系統*/
error code = graph result();/*讀取初始化結果*/
if( ErrorCode!= grOk) /*如果在初始化過程中出現錯誤*/
{
printf("圖形系統錯誤:%s\n ",
grapherrormsg(error code));/*顯示錯誤代碼*/
退出(1);/*退出*/
}
get palette(& amp;調色板);/*讀取面板信息*/
max colors = get maxcolor()+1;/*讀取顏色的最大值*/
MaxX = get MaxX();/*讀取屏幕尺寸*/
MaxY = get MaxY();/*讀取屏幕尺寸*/
getaspectratio(& amp;xasp & amp;yasp);/*將縱橫比復制到變量中*/
aspectation =(double)xasp/(double)yasp;/*計算縱橫比*/
}
/*計算器功能*/
無效計算機(無效)
{
struct viewporttype vp/*定義視口類型變量*/
int顏色、高度、寬度;
int x,y,x0,y0,I,j,v,m,n,act,flag = 1;
float num1=0,num2=0,結果;/*操作數和計算結果變量*/
char cnum[5],str2[20]={""},c,temp[20]= { " " };
夏爾·str1[]="1230.456+-789*/qc=^%”;/*定義要在按鈕圖形上顯示的字符串符號*/
mwindow(“計算器”);/*顯示主窗口*/
顏色= 7;/*設置灰色值*/
getview settings(& amp;VP);/*讀取當前窗口的大小*/
寬度=(VP . right+1)/10;/*設置按鈕寬度*/
height =(VP . bottom-10)/10;/*設置按鈕高度*/
x =寬度/2;/*設置x的坐標值*/
y =身高/2;/*設置y的坐標值*/
setfillstyle(SOLID_FILL,color+3);
bar(x+寬度*2,y,x+7 *寬度,y+高度);
/*繪制壹個二維矩形條來顯示操作數和結果*/
setcolor(顏色+3);/*設置淺綠色邊框線*/
矩形(x+寬度*2,y,x+7 *寬度,y+高度);
/*繪制矩形邊框線*/
setcolor(紅色);/*將顏色設置為紅色*/
out textxy(x+3 *寬度,y+高度/2," 0。");/*輸出字符串“0”*/
x = 2 *寬度-寬度/2;/*設置x的坐標值*/
y = 2 *身高+身高/2;/*設置y的坐標值*/
for(j = 0;j & lt4 ;++j) /*繪制壹個按鈕*/
{
for(I = 0;我& lt5 ;++i)
{
setfillstyle(SOLID_FILL,color);
setcolor(紅色);
bar( x,y,x+寬度,y+高度);/*畫壹個矩形條*/
矩形(x,y,x+寬度,y+高度);
sprintf(str2," %c ",str 1[j * 5+I]);
/*保存str2中的字符*/
outtextxy( x+(寬度/2),y+高度/2,str 2);
x = x+寬度+(寬度/2);/*移動列坐標*/
}
y +=(高度/2)* 3;/*移動線坐標*/
x = 2 *寬度-寬度/2;/*重置列坐標*/
}
x0 = 2 *寬度;
y0 = 3 *高度;
x = x0
y = y0
gotoxy(x,y);/*將光標移動到x,y位置*/
arrow();/*顯示光標*/
putimage(x,y,rar,XOR _ PUT);
m = 0;
n = 0;
strcpy(str2," ");/*將str2設置為空字符串*/
while((v=specialkey())!=45) /*按Alt+x結束程序,否則,執行以下循環*/
{
while((v=specialkey())!=ENTER) /*當按下鍵時不輸入*/
{
putimage(x,y,rar,XOR _ PUT);/*顯示光標圖像*/
If(v==RIGHT) /*向右移動箭頭時新位置的計算*/
if(x & gt;= x0+6 *寬度)
/*如果向右移動並移動到末尾,則移動到最左邊的字符位置*/
{
x = x0
m = 0;
}
其他
{
x = x+寬度+寬度/2;
m++;
}/*否則,向右移動到下壹個字符位置*/
If(v==LEFT) /*向左移動箭頭時新位置的計算*/
if(x & lt;=x0)
{
x = x0+6 *寬度;
m = 4;
}/*如果移動到頭部,然後向左移動,則移動到最右邊的字符位置*/
其他
{
x = x-寬度-寬度/2;
m-;
}/*否則,向左移動到前壹個字符位置*/
If(v==UP) /*向上移動箭頭時新位置的計算*/
if(y & lt;=y0)
{
y = y0+4 *高度+高度/2;
n = 3;
}/*如果移動到頭部然後向上移動,則移動到底部字符位置*/
其他
{
y = y-height-height/2;
n-;
}/*否則,移動到壹個字符的高位*/
If(v==DOWN) /*向下移動箭頭時新位置的計算*/
如果(y & gt= 7 *高)
{
y = y0
n = 0;
}/*如果移動到末尾然後向下移動,則移動到頂部字符位置*/
其他
{
y = y+身高+身高/2;
n++;
}/*否則,移動到下壹個字符位置*/
putimage(x,y,rar,XOR _ PUT);/*在新位置顯示光標箭頭*/
}
c = str 1[n * 5+m];/*保存變量c中的字符*/
If (isdigit (c) || c = ' . ')/*判斷是數字還是小數點*/
{
If (flag = -1)/*如果標誌為-1,則表示負數*/
{
strcpy(str2,"-");/*將減號連接成字符串*/
flag = 1;
}/*將標誌值恢復為1*/
sprintf(temp," %c ",c);/*保存字符串變量temp中的字符*/
strcat(str2,temp);/*將temp中的字符串連接到str2 */
setfillstyle(SOLID_FILL,color+3);
條形(2 *寬+寬/2,高/2,15 *寬/2,3 *高/2);
outtextxy(5 *寬,高,str 2);/*顯示字符串*/
}
if(c=='+')
{
num 1 = atof(str 2);/*將第壹個操作數轉換為浮點數*/
strcpy(str2," ");/*空str2 */
act = 1;/*進行計算並添加標誌值*/
setfillstyle(SOLID_FILL,color+3);
條形(2 *寬+寬/2,高/2,15 *寬/2,3 *高/2);
out textxy(5 *寬,高," 0。");/*顯示字符串*/
}
if(c=='-')
{
If(strcmp(str2," ")==0) /*如果str2為空,則表示減號,而不是負號*/
flag =-1;/*設置負數標誌*/
其他
{
num 1 = atof(str 2);/*將第二個操作數轉換為浮點數*/
strcpy(str2," ");/*空str2 */
act = 2;/*計算減法標誌值*/
setfillstyle(SOLID_FILL,color+3);
條形(2 *寬+寬/2,高/2,15 *寬/2,3 *高/2);/*畫壹個矩形*/
out textxy(5 *寬,高," 0。");/*顯示字符串*/
}
}
if(c=='* ')
{
num 1 = atof(str 2);/*將第二個操作數轉換為浮點數*/
strcpy(str2," ");/*空str2 */
act = 3;/*做乘法標誌值的計算*/
setfillstyle(SOLID_FILL,color+3);條形(2 *寬+寬/2,高/2,15 *寬/2,3 *高/2);
out textxy(5 *寬,高," 0。");/*顯示字符串*/
}
if(c=='/')
{
num 1 = atof(str 2);/*將第二個操作數轉換為浮點數*/
strcpy(str2," ");/*空str2 */
act = 4;/*做計算除法標誌值*/
setfillstyle(SOLID_FILL,color+3);
條形(2 *寬+寬/2,高/2,15 *寬/2,3 *高/2);
out textxy(5 *寬,高," 0。");/*顯示字符串*/
}
if(c=='^')
{
num 1 = atof(str 2);/*將第二個操作數轉換為浮點數*/
strcpy(str2," ");/*空str2 */
act = 5;/*計算功率符號值*/
setfillstyle(SOLID_FILL,color+3);/*設置為用淺綠色實體填充*/
條形(2 *寬+寬/2,高/2,15 *寬/2,3 *高/2);/*畫壹個矩形*/
out textxy(5 *寬,高," 0。");/*顯示字符串*/
}
if(c=='% ')
{
num 1 = atof(str 2);/*將第二個操作數轉換為浮點數*/
strcpy(str2," ");/*空str2 */
act = 6;/*計算模冪標誌值*/
setfillstyle(SOLID_FILL,color+3);/*設置為用淺綠色實體填充*/
條形(2 *寬+寬/2,高/2,15 *寬/2,3 *高/2);/*畫壹個矩形*/
out textxy(5 *寬,高," 0。");/*顯示字符串*/
}
if(c=='= ')
{
num 2 = atof(str 2);/*將第二個操作數轉換為浮點數*/
開關(act) /*根據操作符號計算*/
{
案例1:結果= num 1+num 2;打破;/*添加*/
情況二:結果= num 1-num 2;打破;/*做減法*/
情況三:結果= num 1 * num 2;打破;/*做乘法*/
情況4:結果= num 1/num 2;打破;/*做除法*/
情況5:結果=pow(num1,num 2);打破;/*使x成為y的冪*/
情況6:結果=fmod(num1,num 2);打破;/*做模運算*/
}
setfillstyle(SOLID_FILL,color+3);/*設置為用淺綠色實體填充*/
條形(2 *寬+寬/2,高/2,15 *寬/2,3 *高/2);/*覆蓋結果區域*/
sprintf(temp," %f ",result);/*將結果保存在temp中*/
outtextxy(5 *寬度、高度、溫度);/*顯示結果*/
}
if(c=='c ')
{
num 1 = 0;/*將兩個操作數重置為0,符號sign為1*/
num 2 = 0;
flag = 1;
strcpy(str2," ");/*空str2 */
setfillstyle(SOLID_FILL,color+3);/*設置為用淺綠色實體填充*/
條形(2 *寬+寬/2,高/2,15 *寬/2,3 *高/2);/*覆蓋結果區域*/
out textxy(5 *寬,高," 0。");/*顯示字符串*/
}
if(c = = ' Q ')exit(0);/*如果選擇了Q Enter,則結束計算程序*/
}
putimage(x,y,rar,XOR _ PUT);/*退出前移除光標箭頭*/
返回;/* Return */
}
/*窗口函數*/
void mwindow( char *header)
{
int高度;
clear device();/*清除圖形屏幕*/
set color(max colors-1);/*將當前顏色設置為白色*/
setviewport( 20,20,MaxX/2,MaxY/2,1);/*設置視口大小*/
height = text height(" H ");/*讀取基本文本大小*/
settextstyle( DEFAULT_FONT,HORIZ_DIR,1);/*設置文本樣式*/
settextjustify( CENTER_TEXT,TOP _ TEXT);/*設置字符的排列*/
outtextxy( MaxX/4,2,header);/*輸出標題*/
setviewport( 20,20+height+4,MaxX/2+4,MaxY/2+20,1);/*設置視口大小*/
draw boder();/*繪制邊框*/
}
Void drawboder(void) /*繪制邊框*/
{
struct viewporttype vp/*定義視口類型變量*/
set color(max colors-1);/*將當前顏色設置為白色*/
setlinestyle( SOLID_LINE,0,NORM _ WIDTH);/*設置畫線方法*/
getview settings(& amp;VP);/*將當前視口信息加載到vp指向的結構中*/
矩形(0,0,vp.right-vp.left,VP . bottom-VP . top);/*繪制矩形邊框*/
}
/*設計鼠標圖形功能*/
整數箭頭()
{
int大小;
int raw[]={4,4,4,8,6,8,14,16,16,16,8,6,8,4,4,4 };/*定義多邊形坐標*/
setfillstyle(SOLID_FILL,2);/*設置填充模式*/
fillpoly(8,raw);/*繪制光標箭頭*/
size=imagesize(4,4,16,16);/*測試圖像尺寸*/
rar=malloc(大小);/*分配內存區域*/
getimage(4,4,16,16,rar);/*存儲光標箭頭圖像*/
putimage(4,4,rar,XOR _ PUT);/*擦除光標箭頭圖像*/
返回0;
}
/*關鍵功能*/
int specialkey(void)
{
int鍵;
while(BIOS key(1)= = 0);/*等待鍵盤輸入*/
key = BIOS key(0);/*鍵盤輸入*/
鑰匙=鑰匙& amp0xff?鑰匙和鑰匙。0x ff:key & gt;& gt8;/*只取特殊鍵的掃描值,其余為0*/
回車鍵;/*返回鍵值*/
}