1.支持+、-、 * 、/(整除)、^(幂运算)、进制转换、高精度、面积、体积等运算

#include<bits/stdc++.h>
#include<windows.h>
#include<ctime>
#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)
using namespace std;
int a[100001], b[100001], sum[100001], len1, len2, sumlen;
string s1, s2;
void Add() {
	memset(sum, 0, sizeof(sum));
	cin >> s1 >> s2;
	len1 = s1.size();
	len2 = s2.size();
	for (int i = 0; i < len1; ++i) {
		a[len1 - i - 1] = int(s1[i] - '0');
	}
	for (int i = 0; i < len2; ++i) {
		b[len2 - i - 1] = int(s2[i] - '0');
	}
	sumlen = max(len1, len2);
	for (int i = 0; i < sumlen; ++i) {
		sum[i] += a[i] + b[i];
		sum[i + 1] = sum[i] / 10;
		sum[i] = sum[i] % 10;
	}
	if (sum[sumlen] != 0)sumlen++;
	for (int i = sumlen - 1; i >= 0; --i)cout << sum[i];
}
void Subtract() {
	memset(sum, 0, sizeof(sum));
	cin >> s1 >> s2;
	if (s1.size() < s2.size() || (s1.size() == s2.size() && s1 < s2)) {
		cout << '-';
		swap(s1, s2);
	}
	len1 = s1.size();
	len2 = s2.size();
	for (int i = 0; i < len1; ++i) {
		a[len1 - i - 1] = int(s1[i] - '0');
	}
	for (int i = 0; i < len2; ++i) {
		b[len2 - i - 1] = int(s2[i] - '0');
	}
	sumlen = max(len1, len2);
	for (int i = 0; i < sumlen; ++i) {
		if (a[i] < b[i])a[i + 1]--, a[i] += 10;
		sum[i] = a[i] - b[i];
	}
	while (sum[sumlen - 1] == 0 && sumlen > 1)sumlen--;
	for (int i = sumlen - 1; i >= 0; --i)cout << sum[i];
}
void Multiple() {
	memset(sum, 0, sizeof(sum));
	cin >> s1 >> s2;
	len1 = s1.size();
	len2 = s2.size();
	for (int i = 0; i < len1; ++i) {
		a[len1 - i - 1] = int(s1[i] - '0');
	}
	for (int i = 0; i < len2; ++i) {
		b[len2 - i - 1] = int(s2[i] - '0');
	}
	for (int i = 0; i < len1; ++i) {
		for (int j = 0; j < len2; ++j) {
			sum[i + j] += a[i] * b[j];
		}
	}
	sumlen = len1 + len2;
	for (int i = 0; i < sumlen; ++i) {
		sum[i + 1] += sum[i] / 10;
		sum[i] %= 10;
	}
	while (sum[sumlen - 1] == 0 && sumlen > 1)sumlen--;
	for (int i = sumlen - 1; i >= 0; --i)cout << sum[i];
}
long long ksm(long long n, long long p, const int m = (int)1e10) { //快速幂
	if (p == 0)return 1;
	long long sum = ksm(n, p / 2, m);
	if (p & 1)return sum * sum * n % m;
	return sum * sum % m;
}

stack<long long>n;
stack<char>sym;
void pop() {
	long long n1 = n.top();
	n.pop();
	int n2 = n.top();
	n.pop();
	long long pd = sym.top();
	sym.pop();
	switch (pd) {
		case 0:
			n.push(n1 + n2);
			break;
		case 1:
			n.push(n2 - n1);
			break;
		case 2:
			n.push(n1 * n2);
			break;
		case 3:
			n.push(n2 / n1);
			break;
		case 4:
			n.push(ksm(n2, n1));
			break;
	}
}

void bds() {
	string str;
	cin >> str;
	long long num = 0;
	int k;
	for (int i = 0; i < (int)str.size(); i++) {
		if (str[i] >= '0' && str[i] <= '9') {
			num = num * 10 + str[i] - '0';
		} else {
			n.push(num);
			num = 0;
			switch (str[i]) {
				case'+':
					k = 0;
					break;
				case'-':
					k = 1;
					break;
				case'*':
					k = 2;
					break;
				case'/':
					k = 3;
					break;
				case'^':
					k = 4;
					break;
			}
			while (!sym.empty() && (int)(sym.top()) >= (int)k)pop();
			sym.push(k);
		}
	}
	n.push(num);
	while (!sym.empty())pop();
	cout << str << '=' << n.top();
}
void ShowCursor() {
	HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
	CONSOLE_CURSOR_INFO cursor_info;
	GetConsoleCursorInfo(h, &cursor_info);
	cursor_info.bVisible = true;
	SetConsoleCursorInfo(h, &cursor_info);
}

void HideCursor() {
	CONSOLE_CURSOR_INFO cursor_info = {1, 0};
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}

void gotoxy(int x, int y) {
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	COORD pos;
	pos.X = x, pos.Y = y;
	SetConsoleCursorPosition(handle, pos);
}

void color(int a) {
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), a);
}
void check(char n, int i) {
	switch (n) {
		case '1': {
			if (i == 1 || i == 4 || i == 7)cout << "     ";
			if (i == 2 || i == 3 || i == 5 || i == 6)cout << "   | ";
			break;
		}
		case '2': {
			if (i == 1 || i == 4 || i == 7)cout << " --  ";
			if (i == 2 || i == 3)cout << "   | ";
			if (i == 5 || i == 6)cout << "|    ";
			break;
		}
		case '3': {
			if (i == 1 || i == 4 || i == 7)cout << " --  ";
			if (i == 2 || i == 3 || i == 5 || i == 6)cout << "   | ";
			break;
		}
		case '4': {
			if (i == 1 || i == 7)cout << "     ";
			if (i == 2 || i == 3)cout << "|  | ";
			if (i == 4)cout << " --  ";
			if (i == 5 || i == 6)cout << "   | ";
			break;
		}
		case '5': {
			if (i == 1)cout << "┌--  ";
			if (i == 4 || i == 7)cout << " --  ";
			if (i == 2 || i == 3)cout << "|    ";
			if (i == 5 || i == 6)cout << "   | ";
			break;
		}
		case '6': {
			if (i == 1 || i == 4 || i == 7)cout << " --  ";
			if (i == 2 || i == 3)cout << "|    ";
			if (i == 5 || i == 6)cout << "|  | ";
			break;
		}
		case '7': {
			if (i == 1)cout << "---  ";
			else cout << "   | ";
			break;
		}
		case '8': {
			if (i == 1 || i == 4 || i == 7)cout << " --  ";
			else cout << "|  | ";
			break;
		}
		case '9': {
			if (i == 1 || i == 4 || i == 7)cout << " --  ";
			if (i == 2 || i == 3)cout << "|  | ";
			if (i == 5 || i == 6)cout << "   | ";
			break;
		}
		case '0': {
			if (i == 1 || i == 7)cout << " --  ";
			else if (i == 3)cout << "| /| ";
			else if (i == 4)cout << "|/ | ";
			else cout << "|  | ";
			break;
		}
		case 'A': {
			if (i == 1)cout << " /\\   ";
			if (i == 2)cout << "/  \\  ";
			if (i == 3 || i == 5 || i == 6 || i == 7)cout << "|   | ";
			if (i == 4)cout << "|---| ";
			break;
		}
		case 'B': {
			if (i == 1)cout << "┌--  ";
			if (i == 2 || i == 5 || i == 6)cout << "|  | ";
			if (i == 3)cout << "|  | ";
			if (i == 4)cout << "|--  ";
			if (i == 7)cout << "└--  ";
			break;
		}
		case 'C': {
			if (i == 1 || i == 7)cout << " --- ";
			else cout << "|    ";
			break;
		}
		case 'D': {
			if (i == 1)cout << "┌---  ";
			else if (i == 7)cout << "└---  ";
			else cout << "|   | ";
			break;
		}
		case 'E': {
			if (i == 1)cout << "┌--- ";
			else if (i == 4)cout << "|--- ";
			else if (i == 7)cout << "└--- ";
			else cout << "|    ";
			break;
		}
		case 'F': {
			if (i == 1)cout << "┌--- ";
			else if (i == 4)cout << "|--- ";
			else if (i == 7)cout << "|    ";
			else cout << "|    ";
			break;
		}
		case 'G': {
			if (i == 1 || i == 7)cout << " --  ";
			if (i == 2 || i == 3)cout << "|    ";
			if (i == 4)cout << "| -- ";
			if (i == 5 || i == 6)cout << "|  | ";
			break;
		}
		case 'H': {
			if (i == 4)cout << "|--| ";
			else cout << "|  | ";
			break;
		}
		case 'I': {
			if (i == 1 || i == 7)cout << " --- ";
			else cout << "  |  ";
			break;
		}
		case 'J': {
			if (i == 1)cout << " --- ";
			else if (i == 7)cout << "└-┘  ";
			else cout << "  |  ";
			break;
		}
		case 'K': {
			if (i == 3)cout << "||   ";
			else if (i == 2 || i == 4)cout << "| |  ";
			else cout << "|  | ";
			break;
		}
		case 'L': {
			if (i == 7)cout << "└--- ";
			else cout << "|    ";
			break;
		}
		case 'M': {
			if (i == 1)cout << "|\\  /| ";
			else if (i == 2)cout << "| \\/ | ";
			else cout << "|    | ";
			break;
		}
		case 'N': {
			if (i == 1)cout << "|\\   | ";
			else if (i == 2)cout << "| \\  | ";
			else if (i == 3)cout << "|  \\ | ";
			else if (i == 4)cout << "|   \\| ";
			else cout << "|    | ";
			break;
		}
		case 'O': {
			if (i == 1 || i == 7)cout << " ---  ";
			else cout << "|   | ";
			break;
		}
		case 'P': {
			if (i == 1 || i == 4)cout << "┌---  ";
			else if (i == 2 || i == 3)cout << "|   | ";
			else cout << "|     ";
			break;
		}
		case 'Q': {
			if (i == 1)cout << " ---  ";
			else if (i == 6)cout << "|  \\| ";
			else if (i == 7)cout << " ---\\ ";
			else cout << "|   | ";
			break;
		}
		case 'R': {
			if (i == 1)cout << "┌--  ";
			if (i == 2 || i == 3)cout << "|  | ";
			if (i == 4)cout << "|--  ";
			if (i == 5)cout << "|\\   ";
			if (i == 6)cout << "| \\  ";
			if (i == 7)cout << "|  \\ ";
			break;
		}
		case 'S': {
			if (i == 1 || i == 4 || i == 7)cout << " --  ";
			if (i == 2 || i == 3)cout << "|    ";
			if (i == 5 || i == 6)cout << "   | ";
			break;
		}
		case 'T': {
			if (i == 1)cout << "---  ";
			else cout << " |   ";
			break;
		}
		case 'U': {
			if (i == 7)cout << " --  ";
			else cout << "|  | ";
			break;
		}
		case 'V': {
			if (i == 6)cout << "\\  /  ";
			else if (i == 7)cout << " \\/   ";
			else cout << "|   | ";
			break;
		}
		case 'W': {
			if (i == 7)cout << "|/  \\| ";
			else if (i == 6)cout << "| /\\ | ";
			else cout << "|    | ";
			break;
		}
		case 'X': {
			if (i == 1)cout << "\\     / ";
			if (i == 2)cout << " \\   /  ";
			if (i == 3)cout << "  \\ /   ";
			if (i == 4)cout << "   X    ";
			if (i == 5)cout << "  / \\   ";
			if (i == 6)cout << " /   \\  ";
			if (i == 7)cout << "/     \\ ";
			break;
		}
		case 'Y': {
			if (i == 1)cout << "\\  / ";
			else if (i == 2)cout << " \\/  ";
			else cout << " |   ";
			break;
		}
		case 'Z': {
			if (i == 1)cout << "----- ";
			if (i == 2)cout << "    / ";
			if (i == 3)cout << "   /  ";
			if (i == 4)cout << "  /   ";
			if (i == 5)cout << " /    ";
			if (i == 6)cout << "/     ";
			if (i == 7)cout << "----- ";
			break;
		}
		case ':': {
			if (i == 2 || i == 5)cout << " .  ";
			else cout << "    ";
			break;
		}
		case ' ': {
			cout << "    ";
			break;
		}
		default: {
			if (i == 1 || i == 2 || i == 7)cout << "     ";
			if (i == 3)cout << "┌--┐ ";
			if (i == 6)cout << "└--┘ ";
			if (i == 4)cout << "|\\/| ";
			if (i == 5)cout << "|/\\| ";
			break;
		}
	}
}
int main() {
	while (1) {
		cout << "欢迎使用简易计算器[V5.0],(Made By ";
		color(14);
		cout << "2024tysc0470";
		color(7);
		cout << ")\n" << endl;
		char s;
		cout << "请选择一个功能\n1.自由输入表达式\n2.高精度计算\n3.其他\n";

		int aa;
		cin >> aa;
		switch (aa) {
			case 1: {
				cout << "您选择了自由表达式,请在下方输入您的数学表达式(支持 +,-,*,/,^(幂),不支持小数运算)\n";
				bds();
				cout << endl << "是否返回(y/n)";
				cin >> s;
				if (s == 'y' || s == 'Y') {
					system("cls");
					continue;
				} else return 0;
				break;
			}
			case 2: {
				int gjd;
				do {
					cout << "您选择了高精度计算,请输入您的运算方式\n1.+\n2.-\n3.*\n(目前还没有除法)\n";
					cin >> gjd;
					system("cls");
				} while (gjd > 3 && gjd < 1);
				cout << "输入两个数,长度不能超过99999\n";
				if (gjd == 1)Add();
				if (gjd == 2)Subtract();
				if (gjd == 3)Multiple();
				cout << endl << "是否返回(y/n)";
				cin >> s;
				if (s == 'y' || s == 'Y') {
					system("cls");
					continue;
				} else return 0;
				break;
			}
			case 3: {
				int b;
				system("cls");
				cout << "你选择了其他,请继续选择\n";
				cout << "1.计算面积\n";
				cout << "2.计算体积\n";
				cout << "3.计算表面积\n";
				cout << "4.鸡兔同笼\n";
				cout << "5.进制转换\n";
				cout << "6.小小显示器\n";
				cout << "7.时钟\n" << endl;
				cin >> b;
				switch (b) {
					case 1: {
						int c;
						cout << "你选择了计算面积,请问你要算什么图形的面积?\n";
						cout << "1.正方形\n" << "2.长方形\n" << "3.圆形\n" << endl;
						cin >> c;
						switch (c) {
							case 1: {
								double bianchang;
								cout << "您选择的是正方形,请输入正方形的边长" << endl;
								cin >> bianchang;
								printf("它的面积是:%.3lf", bianchang * bianchang);
								cout << endl << "是否返回(y/n)";
								cin >> s;
								if (s == 'y' || s == 'Y') {
									system("cls");
									continue;
								} else return 0;
								break;
							}
							case 2: {
								double chang, kuan;
								cout << "您选择的是长方形,请输入长方形的长和宽,中间用空格隔开" << endl;
								cin >> chang >> kuan;
								printf("它的面积是:%.3lf", chang * kuan);
								cout << endl << "是否返回(y/n)";
								cin >> s;
								if (s == 'y' || s == 'Y') {
									system("cls");
									continue;
								} else return 0;
								break;
							}
							case 3: {
								double banjing;
								cout << "您选择的是圆形,请输入圆形的半径(半径等于直径除以2)" << endl;
								cin >> banjing;
								printf("它的面积是:%.3lf", 3.14 * banjing * banjing);
								cout << endl << "是否返回(y/n)";
								cin >> s;
								if (s == 'y' || s == 'Y') {
									system("cls");
									continue;
								} else return 0;
								break;
							}
							default: {
								cout << endl << "输入错误,是否返回(y/n)";
								cin >> s;
								if (s == 'y' || s == 'Y') {
									system("cls");
									continue;
								} else return 0;
							}
						}
						break;
					}
					case 2: {
						int tiji;
						cout << "你选择了计算体积,请问你要算什么的体积?\n";
						cout << "1.正方体\n" << "2.长方体\n" << "3.圆柱\n" << "4.圆锥\n" << endl;
						cin >> tiji;
						switch (tiji) {
							case 1: {
								double bc;
								cout << "您选择了正方体,请输入它的边长。" << endl;
								cin >> bc;
								printf("它的体积是:%.3lf", bc * bc * bc);
								cout << endl << "是否返回(y/n)";
								cin >> s;
								if (s == 'y' || s == 'Y') {
									system("cls");
									continue;
								} else return 0;
								break;
							}
							case 2: {
								double c, k, g;
								cout << "您选择了长方体,请输入它的长、宽、高,中间用空格隔开。" << endl;
								cin >> c >> k >> g;
								printf("它的体积是:%.3lf", c * k * g);
								cout << endl << "是否返回(y/n)";
								cin >> s;
								if (s == 'y' || s == 'Y') {
									system("cls");
									continue;
								} else return 0;
								break;
							}
							case 3: {
								double r, h;
								cout << "您选择了圆柱,请输入他的半径(直径/2)和高,中间用空格隔开。" << endl;
								cin >> r >> h;
								printf("它的体积是:%.3lf", 3.14 * r * r * h);
								cout << endl << "是否返回(y/n)";
								cin >> s;
								if (s == 'y' || s == 'Y') {
									system("cls");
									continue;
								} else return 0;
								break;
							}
							case 4: {
								double r, h;
								cout << "您选择了圆锥,请输入他的半径(直径/2)和高,中间用空格隔开。" << endl;
								cin >> r >> h;
								printf("它的体积是:%.3lf", (3.14 * r * r * h) / 3);
								cout << endl << "是否返回(y/n)";
								cin >> s;
								if (s == 'y' || s == 'Y') {
									system("cls");
									continue;
								} else return 0;
								break;
							}
							default: {
								cout << endl << "输入错误,是否返回(y/n)";
								cin >> s;
								if (s == 'y' || s == 'Y') {
									system("cls");
									continue;
								} else return 0;
								break;
							}
						}
						break;
					}
					case 3: {
						int bmj;
						cout << "您选择了计算表面积,请问您要算什么的表面积?\n";
						cout << "1.正方体\n" << "2.长方体\n" << "3.圆柱体\n" << "4.圆锥\n" << endl;
						cin >> bmj;
						switch (bmj) {
							case 1: {
								double bc;
								cout << "您选择了正方形,请输入他的边长" << endl;
								cin >> bc;
								printf("它的表面积是:%.3lf", bc * bc * 6);
								cout << endl << "是否返回(y/n)";
								cin >> s;
								if (s == 'y' || s == 'Y') {
									system("cls");
									continue;
								} else return 0;
								break;
							}
							case 2: {
								double c, k, g;
								cout << "您选择了长方形,请输入他的长宽高" << endl;
								cin >> c >> k >> g;
								printf("它的表面积是:%.3lf", 2 * (c * k + c * g + k * g));
								cout << endl << "是否返回(y/n)";
								cin >> s;
								if (s == 'y' || s == 'Y') {
									system("cls");
									continue;
								} else return 0;
								break;
							}
							case 3: {
								double r, h;
								cout << "您选择了圆柱体,请输入它的半径(直径/2)和高" << endl;
								cin >> r >> h;
								printf("它的表面积是:%.3lf", 2 * (3.14 * r * r) + 2 * (3.14 * r * h));
								cout << endl << "是否返回(y/n)";
								cin >> s;
								if (s == 'y' || s == 'Y') {
									system("cls");
									continue;
								} else return 0;
								break;
							}
							case 4: {
								double r, l;
								cout << "您选择了圆锥,请输入它的半径和母线(圆锥顶点到底部的长度)" << endl;
								cin >> r >> l;
								printf("它的表面积是:%.3lf", 3.14 * r * l + 3.14 * r * r);
								cout << endl << "是否返回(y/n)";
								cin >> s;
								if (s == 'y' || s == 'Y') {
									system("cls");
									continue;
								} else return 0;
								break;
							}
						}
						break;
					}
					case 4: {
						int rabbit, chicken, head, leg;
						cout << "您选择了鸡兔同笼,请输入头和腿的数量,中间用空格隔开" << endl;
						cin >> head >> leg;
						rabbit = (leg - 2 * head) / 2;
						chicken = head - rabbit;
						cout << "鸡有" << chicken << "只," << "兔有" << rabbit << "只" << endl;
						cout << endl << "是否返回(y/n)";
						cin >> s;
						if (s == 'y' || s == 'Y') {
							system("cls");
							continue;
						} else return 0;
						break;
					}
					case 5: {
						cout << "您选择了进制转换,请问你选择什么模式?\n";
						cout << "1.十进制转任何进制\n" << "2.任何进制转十进制\n" << endl;
						int jz;
						cin >> jz;
						switch (jz) {
							case 1: {
								cout << "您选择了十进制转任何进制,请输入一个十进制数和您要转换的进制(注:进制最好不要超过36,否则可能会出错)" << endl;
								long long n, r, ans[10086], i = 0;
								cin >> n >> r;
								printf("(%lld)10 用 %lld 进制表示为:", n, r);
								while (n > 0)ans[++i] = n % r, n /= r;
								for (; i >= 1; i--) {
									if (ans[i] < 10)cout << ans[i];
									else cout << (char)(ans[i] - 10 + 'A');
								}
								cout << endl;
								cout << endl << "是否返回(y/n)";
								cin >> s;
								if (s == 'y' || s == 'Y') {
									system("cls");
									continue;
								} else return 0;
							}
							case 2: {
								cout << "您选择了任何进制转十进制,请输入一个任何进制数和这个数的进制(注:进制最好不要超过36,否则可能会出错)" << endl;
								long long r, pow = 1, sum = 0, x;
								string n;
								cin >> n >> r;
								for (int i = n.size() - 1; i >= 0; i--) {
									if (n[i] >= '0' and n[i] <= '9')x = n[i] - '0';
									else {
										if (n[i] >= 'A' and n[i] <= 'Z')x = n[i] - 'A' + 10;
										else x = n[i] - 'a' + 10;
									}
									sum += x * pow, pow *= r;
								}
								printf("(%s)%lld 用 10 进制表示为:%lld\n", n.c_str(), r, sum);
								cout << endl << "是否返回(y/n)";
								cin >> s;
								if (s == 'y' || s == 'Y') {
									system("cls");
									continue;
								} else return 0;
							}
							default: {
								cout << endl << "输入错误,是否返回(y/n)";
								cin >> s;
								if (s == 'y' || s == 'Y') {
									system("cls");
									continue;
								} else return 0;
							}
						}
						break;
					}
					case 6: {
						cout << "您选择了小小显示器,请输入您想显示的内容(仅支持大写字母和数字,如果输入“字母表”即可输出字母表):";
						string n;
						cin >> n;
						if (n == "字母表") {
							for (int i = 1; i <= 7; i++) {
								for (int j = 'A'; j <= 'Z'; j++)check(j, i);
								cout << endl;
							}
						} else {
							for (int i = 1; i <= 7; i++) {
								for (int j = 0; j < (int)(n.size()); j++)check(n[j], i);
								cout << endl;
							}
						}
						cout << endl << "是否返回(y/n)";
						cin >> s;
						if (s == 'y' || s == 'Y') {
							system("cls");
							continue;
						} else return 0;
						break;
					}
					case 7: {
						int k = 0;
						system("cls");
						while (1) {
							HideCursor(); //隐藏光标
							time_t now = time(0);
							char* dt = ctime(&now);
							cout << "退出请按E\n";
							for (int i = 1; i <= 7; i++) {
								for (int j = 11; j < (int)strlen(dt) - 6; j++) {
									check(dt[j], i);
								}
								cout << endl;
							}
							gotoxy(0, 0);
							if (KEY_DOWN('E')) {
								system("cls");
								ShowCursor();//显示光标
								cout << endl << "是否返回(y/n)";
								cin >> s;
								if (s == 'y' || s == 'Y') {
									system("cls");
									k = 1;
									break;
								} else return 0;
							}
						}
						if (k)continue;
						break;
					}
					default: {
						cout << endl << "输入错误,是否返回(y/n)";
						cin >> s;
						if (s == 'y' || s == 'Y') {
							system("cls");
							continue;
						} else return 0;
					}
				}
			}
			default: {
				cout << endl << "输入错误,是否返回(y/n)";
				cin >> s;
				if (s == 'y' || s == 'Y') {
					system("cls");
					continue;
				} else return 0;
			}
		}
	}
	return 0;
}

2.MessegeBox计算器模板

#include<windows.h>
#include<cstdio>
#include<cstdlib>
#include<string>
HWND he;
char buffer[256] = {0};
int sz=0;
void settext(HWND h,char* textToSet){
    SendMessage(h, WM_SETTEXT, 0, (LPARAM)textToSet);
}
char* gettext(HWND h){
    SendMessage(h, WM_GETTEXT,255,(LPARAM)buffer);
	return buffer;
}
void addch(char ch){
	int len=strlen(buffer);
	buffer[len]=ch;
	buffer[len+1]='\0';
}
void cal(){
	
}
/* This is where all the input to the window goes to */
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) {
	switch(Message) {
		
		/* Upon destruction, tell the main thread to stop */
		case WM_DESTROY: {
			PostQuitMessage(0);
			break;
		}
		case WM_COMMAND:{
        	if(LOWORD(wParam)<10){
        		addch('0'+LOWORD(wParam));
        		settext(he,buffer);
			}
			
        	return 0;
    	}
    	case WM_SIZE:{
			break;
		}
		/* All other messages (a lot of them) are processed using default procedures */
		default:
			return DefWindowProc(hwnd, Message, wParam, lParam);
	}
	return 0;
}
/* The 'main' function of Win32 GUI programs: this is where execution starts */
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
	WNDCLASSEX wc; /* A properties struct of our window */
	HWND hwnd; /* A 'HANDLE', hence the H, or a pointer to our window */
	MSG msg; /* A temporary location for all messages */

	/* zero out the struct and set the stuff we want to modify */
	memset(&wc,0,sizeof(wc));
	wc.cbSize		 = sizeof(WNDCLASSEX);
	wc.lpfnWndProc	 = WndProc; /* This is where we will send messages to */
	wc.hInstance	 = hInstance;
	wc.hCursor		 = LoadCursor(NULL, IDC_ARROW);
	
	/* White, COLOR_WINDOW is just a #define for a system color, try Ctrl+Clicking it */
	wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
	wc.lpszClassName = "WindowClass";
	wc.hIcon		 = LoadIcon(NULL, IDI_APPLICATION); /* Load a standard icon */
	wc.hIconSm		 = LoadIcon(NULL, IDI_APPLICATION); /* use the name "A" to use the project icon */

	if(!RegisterClassEx(&wc)) {
		MessageBox(NULL, "Window Registration Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
		return 0;
	}

	hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,"WindowClass","计算器",WS_VISIBLE|WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT, /* x */
		CW_USEDEFAULT, /* y */
		300+20, /* width */
		180+15+28, /* height */
		NULL,NULL,hInstance,NULL);
	HWND hButton7 = CreateWindow("BUTTON", "7", WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
        0,
		30,
		50,
		50,
		hwnd,
		(HMENU)7, 
		hInstance,
		NULL);
	HWND hButton8 = CreateWindow("BUTTON", "8", WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
        50,
		30,
		50,
		50,
		hwnd,
		(HMENU)8, 
		hInstance,
		NULL);
	HWND hButton9 = CreateWindow("BUTTON", "9", WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
        100,
		30,
		50,
		50,
		hwnd,
		(HMENU)9, 
		hInstance,
		NULL);
	HWND hButton4 = CreateWindow("BUTTON", "4", WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
        0,
		80,
		50,
		50,
		hwnd,
		(HMENU)4, 
		hInstance,
		NULL);
	HWND hButton5 = CreateWindow("BUTTON", "5", WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
        50,
		80,
		50,
		50,
		hwnd,
		(HMENU)5, 
		hInstance,
		NULL);
	HWND hButton6 = CreateWindow("BUTTON", "6", WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
        100,
		80,
		50,
		50,
		hwnd,
		(HMENU)6, 
		hInstance,
		NULL);
	HWND hButton1 = CreateWindow("BUTTON", "1", WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
        0,
		130,
		50,
		50,
		hwnd,
		(HMENU)1, 
		hInstance,
		NULL);
	HWND hButton2 = CreateWindow("BUTTON", "2", WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
        50,
		130,
		50,
		50,
		hwnd,
		(HMENU)2, 
		hInstance,
		NULL);
	HWND hButton3 = CreateWindow("BUTTON", "3", WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
        100,
		130,
		50,
		50,
		hwnd,
		(HMENU)3, 
		hInstance,
		NULL);
	
	if(hwnd == NULL) {
		MessageBox(NULL, "Nooooooooooo!",0,MB_ICONEXCLAMATION|MB_OK);
		return 0;
	}
	 he = CreateWindow("edit", "0", WS_CHILD|WS_VISIBLE | WS_BORDER | ES_AUTOHSCROLL|ES_READONLY,
                             0, 0, 300, 30,hwnd,(HMENU)99, hInstance, NULL);
	settext(he,gettext(he));
	while(GetMessage(&msg, NULL, 0, 0) > 0) { /* If no error is received... */
		TranslateMessage(&msg); /* Translate key codes to chars if present */
		DispatchMessage(&msg); /* Send it to WndProc */
		
	}
	return msg.wParam;
}