功能介绍
绘制出图形界面,支持鼠标点击实现四则运算(可带括号),同时具有清零和撤回操作。另外一种模式,可以绘制一些特定的函数图像。
代码实现
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include <graphics.h> 4 #include <windows.h> 5 #include <conio.h> 6 #include <string.h> 7 #include<math.h> 8 9 #define PI 3.1415926 10 #define N 100 11 12 typedef struct 13 { 14 char data[N][N]; 15 int top; 16 17 }stack; 18 19 typedef struct figure 20 { 21 char x[N]; 22 }figure; 23 24 const int max = 100; 25 int q; //定义一个全局变量,用来计数结构体数组的数量; 26 int count = 0; 27 char str[N] = { '0' }; //字符数组赋初始值; 28 figure st[N]; 29 char suffix[N][N] = { '0' }; 30 stack sta; 31 int select_; //用户选择 32 33 34 void gotoxy(int x, int y); 35 void hidecursor(); 36 void introduce(); 37 void calcul_memu(); 38 void mouse_imfor(); 39 void clear_cal(); 40 void chuli(char ch[], struct figure a[]); 41 void init(stack *sta); 42 void suffixtoresult(stack *sta, char suffix[][N], int length); 43 void inffixtosuffix(stack *sta, struct figure *a, char suffix[][N], int *length); 44 45 void image_menu(); 46 47 void function1(); 48 void function2(); 49 void function3(); 50 void function4(); 51 void function5(); 52 void function6(); 53 void function7(); 54 void function8(); 55 void function9(); 56 void function10(); 57 void creatCoordinate(); 58 59 int main() 60 { 61 introduce(); 62 switch (select_) 63 { 64 case 1: 65 { 66 initgraph(480, 600); //设置窗口的大小; 67 setbkcolor(BLACK); //设置背景色为黑色; 68 cleardevice(); //用背景色来清空屏幕; 69 calcul_memu(); 70 mouse_imfor(); 71 closegraph(); 72 break; 73 } 74 case 2: 75 { 76 image_menu(); 77 break; 78 } 79 default: 80 break; 81 } 82 } 83 void gotoxy(int x, int y)//函数gotoxy:定义光标位置 84 { 85 COORD coord;//坐标系coord 86 HANDLE handle; 87 88 coord.X = x;//横坐标X 89 coord.Y = y;//纵坐标 y 90 handle = GetStdHandle(STD_OUTPUT_HANDLE); 91 SetConsoleCursorPosition(handle, coord); 92 }//end gotoxy 93 94 void hidecursor()//函数hidecursor:隐藏光标 95 { 96 CONSOLE_CURSOR_INFO curinfo; 97 HANDLE Out; 98 99 Out = GetStdHandle(STD_OUTPUT_HANDLE); 100 curinfo.dwSize = 1;//光标百分比厚度:1~100 101 curinfo.bVisible = 0;//是否可见 102 SetConsoleCursorInfo(Out, &curinfo); 103 } //end hidecursor 104 105 //打印欢迎界面 106 void introduce() 107 { 108 int i; 109 HANDLE consolehwnd;//创建句柄 110 consolehwnd = GetStdHandle(STD_OUTPUT_HANDLE); 111 SetConsoleTextAttribute(consolehwnd, FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); 112 //设置为亮白色 113 114 for (i = 14; i < 39; i++) 115 { 116 gotoxy(i * 2, 4); 117 printf("■"); 118 } 119 120 for (i = 5; i < 20; i++) 121 { 122 gotoxy(28, i); 123 printf("■"); 124 gotoxy(76, i); 125 printf("■"); 126 } 127 128 gotoxy(45, 5); 129 printf("欢迎来到计算器!"); 130 131 for (i = 15; i < 38; i++) 132 { 133 gotoxy(i * 2, 6); 134 printf("■"); 135 } 136 137 gotoxy(45, 7); 138 printf("计算器控制台"); 139 140 for (i = 15; i < 38; i++) 141 { 142 gotoxy(i * 2, 8); 143 printf("■"); 144 } 145 146 gotoxy(35, 9); 147 printf("1.计算 实现加减乘除运算(支持括号)"); 148 149 gotoxy(37, 10); 150 printf("按'C'清屏,按'>'撤退一个"); 151 152 gotoxy(35, 11); 153 printf("2.画图 基本函数类型"); 154 gotoxy(37, 12); 155 printf("按右键退出"); 156 gotoxy(35, 13); 157 printf("3.开始使用 按1进入计算,按2进入画图"); 158 gotoxy(37, 14); 159 printf("按0退出"); 160 161 162 for (i = 15; i < 38; i++) 163 { 164 gotoxy(i * 2, 17); 165 printf("■"); 166 } 167 168 for (i = 14; i < 39; i++) 169 { 170 gotoxy(i * 2, 20); 171 printf("■"); 172 } 173 174 gotoxy(51, 19); 175 scanf_s("%d", &select_); 176 fflush(stdin); 177 178 getchar(); 179 system("cls"); 180 } 181 182 //打印计算器界面 183 void calcul_memu() 184 { 185 setfillcolor(BLACK); 186 solidrectangle(0, 100, 480, 600); 187 188 setcolor(DARKGRAY); 189 line(0, 100, 480, 100); 190 line(0, 200, 480, 200); 191 line(0, 300, 480, 300); 192 line(0, 400, 480, 400); 193 line(0, 500, 480, 500); 194 line(120, 100, 120, 600); 195 line(240, 100, 240, 600); 196 line(360, 100, 360, 600); 197 198 settextstyle(60, 60, _T("宋体")); 199 outtextxy(30, 120, _T("(")); 200 outtextxy(150, 120, _T(")")); 201 outtextxy(390, 120, _T("+")); 202 outtextxy(30, 220, _T("7")); 203 outtextxy(150, 220, _T("8")); 204 outtextxy(270, 220, _T("9")); 205 outtextxy(390, 220, _T("-")); 206 outtextxy(30, 320, _T("4")); 207 outtextxy(150, 320, _T("5")); 208 outtextxy(270, 320, _T("6")); 209 outtextxy(390, 320, _T("*")); 210 outtextxy(30, 420, _T("1")); 211 outtextxy(150, 420, _T("2")); 212 outtextxy(270, 420, _T("3")); 213 outtextxy(390, 420, _T("/")); 214 outtextxy(30, 520, _T(".")); 215 outtextxy(150, 520, _T("0")); 216 outtextxy(390, 520, _T("=")); 217 outtextxy(260, 120, _T("<")); 218 outtextxy(270, 520, _T("C")); 219 } 220 221 //处理鼠标消息 222 void mouse_imfor() 223 { 224 int length = 0; 225 int i = -1; 226 int go = 0; 227 for (int a = 0; a < N; a++) 228 strcpy(st[i].x, "0"); 229 MOUSEMSG m; 230 while (go == 0) 231 { 232 setcolor(DARKGRAY); 233 settextstyle(60, 20, _T("宋体")); 234 m = GetMouseMsg(); 235 switch (m.uMsg) 236 { 237 case WM_LBUTTONDOWN: 238 if (m.x > 0 && m.x < 120 && m.y>100 && m.y < 200) 239 { 240 ++i; count++; 241 str[i] = '('; 242 } 243 if (m.x > 120 && m.x < 240 && m.y>100 && m.y < 200) 244 { 245 ++i; count++; 246 str[i] = ')'; 247 } 248 if (m.x > 240 && m.x < 360 && m.y>100 && m.y < 200) 249 { 250 i--; 251 count--; 252 outtextxy(460 - i * 20, 20, _T(str)); 253 outtextxy(460 - (i + 1) * 20, 20, _T(" ")); //按'<'键清除后一个,往后退; 254 } 255 if (m.x > 360 && m.x < 480 && m.y>100 && m.y < 200) 256 { 257 ++i; count++; 258 str[i] = '+'; 259 } 260 if (m.x > 0 && m.x < 120 && m.y>200 && m.y < 300) 261 { 262 ++i; count++; 263 str[i] = '7'; 264 } 265 if (m.x > 120 && m.x < 240 && m.y>200 && m.y < 300) 266 { 267 ++i; count++; 268 str[i] = '8'; 269 } 270 if (m.x > 240 && m.x < 360 && m.y>200 && m.y < 300) 271 { 272 ++i; count++; 273 str[i] = '9'; 274 } 275 if (m.x > 360 && m.x < 480 && m.y>200 && m.y < 300) 276 { 277 ++i; count++; 278 str[i] = '-'; 279 } 280 if (m.x > 0 && m.x < 120 && m.y>300 && m.y < 400) 281 { 282 ++i; count++; 283 str[i] = '4'; 284 } 285 if (m.x > 120 && m.x < 240 && m.y>300 && m.y < 400) 286 { 287 ++i; count++; 288 str[i] = '5'; 289 } 290 if (m.x > 240 && m.x < 360 && m.y>300 && m.y < 400) 291 { 292 ++i; count++; 293 str[i] = '6'; 294 } 295 if (m.x > 360 && m.x < 480 && m.y>300 && m.y < 400) 296 { 297 ++i; count++; 298 str[i] = '*'; 299 } 300 if (m.x > 0 && m.x < 120 && m.y>400 && m.y < 500) 301 { 302 ++i; count++; 303 str[i] = '1'; 304 } 305 if (m.x > 120 && m.x < 240 && m.y>400 && m.y < 500) 306 { 307 ++i; count++; 308 str[i] = '2'; 309 } 310 if (m.x > 240 && m.x < 360 && m.y>400 && m.y < 500) 311 { 312 ++i; count++; 313 str[i] = '3'; 314 } 315 if (m.x > 360 && m.x < 480 && m.y>400 && m.y < 500) 316 { 317 ++i; count++; 318 str[i] = '/'; 319 } 320 if (m.x > 0 && m.x < 120 && m.y>500 && m.y < 600) 321 { 322 ++i; count++; 323 str[i] = '.'; 324 } 325 if (m.x > 120 && m.x < 240 && m.y>500 && m.y < 600) 326 { 327 ++i; count++; 328 str[i] = '0'; 329 } 330 outtextxy(460 - i * 20, 20, _T(str)); 331 if (m.x > 240 && m.x < 360 && m.y>500 && m.y < 600) 332 { 333 ++i; count++; 334 str[i] = 'C'; 335 } 336 str[i + 1] = '