#include <iostream>
#include <windows.h>
using namespace std;
// 设置控制台颜色
void SetConsoleColor(WORD color) {
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hConsole, color);
}
// 从字符串中解析下一个数字
long long parseNumber(const string& s, int& pos) {
long long sum = 0;
for(; pos < s.size(); pos++) {
if(s[pos] >= '0' && s[pos] <= '9') {
sum = sum * 10 + s[pos] - '0';
} else {
break;
}
}
return sum;
}
int main() {
system("title Garry计算器2.3.8");
::MessageBox(NULL, TEXT("新版本特性:\n 1.增加余数\n 2.增加各种报错\n\n有Bug或其他想法记得在评论区回复我! "), TEXT("Garry计算器2.3.8"), 0);
// 初始化显示
cout << " Garry计算器2.3.8" << endl << endl << " 不要在加载时乱按按键";
Sleep(5000);
system("cls");
// 显示标题
for(int i = 0; i <= 6; i++) cout << endl;
SetConsoleColor(FOREGROUND_RED | FOREGROUND_INTENSITY);
cout << " 究极";
SetConsoleColor(FOREGROUND_GREEN | FOREGROUND_INTENSITY);
cout << " 计";
SetConsoleColor(FOREGROUND_BLUE | FOREGROUND_INTENSITY);
cout << "算";
SetConsoleColor(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
cout << "器";
cout << endl << endl << endl;
long long yu = 0; // 余数
while(true) {
int ket = rand() % 1000;
if(ket % 4 == 0) SetConsoleColor(FOREGROUND_RED | FOREGROUND_INTENSITY);
if(ket % 4 == 1) SetConsoleColor(FOREGROUND_GREEN | FOREGROUND_INTENSITY);
if(ket % 4 == 2) SetConsoleColor(FOREGROUND_BLUE | FOREGROUND_INTENSITY);
if(ket % 4 == 3) SetConsoleColor(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
string s;
cout << "请输入需要计算的算式(输入#结束,一定要输入正确,不要加空格,输入#结束,要在longlong范围内,由于多种原因,请不要输入小数,不要输入括号,乘除加减都按顺序计算,可以按位运算(& ^ |)和模运算(前一个数除以后一个数的余数),可以多次运算,如需清空屏幕请输入“clean”):";
cin >> s;
// 处理特殊命令
if(s == "clean") {
system("cls");
for(int i = 0; i <= 6; i++) cout << endl;
SetConsoleColor(FOREGROUND_RED | FOREGROUND_INTENSITY);
cout << " 究极";
SetConsoleColor(FOREGROUND_GREEN | FOREGROUND_INTENSITY);
cout << " 计";
SetConsoleColor(FOREGROUND_BLUE | FOREGROUND_INTENSITY);
cout << "算";
SetConsoleColor(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
cout << "器";
cout << endl << endl << endl;
continue;
}
if(s == "#") break;
bool valid = true;
long long result = 0;
bool firstNumber = true;
bool hasDivision = false;
for(int i = 0; i < s.size(); i++) {
if(s[i] >= '0' && s[i] <= '9') {
long long num = parseNumber(s, i);
if(firstNumber) {
result = num;
firstNumber = false;
} else {
valid = false;
break;
}
i--; // 回退一步,因为循环会再增加i
} else if(s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/' ||
s[i] == '&' || s[i] == '|' || s[i] == '^' || s[i] == '%') {
char op = s[i];
i++; // 移动到操作数
if(i >= s.size()) {
valid = false;
break;
}
long long num = parseNumber(s, i);
i--; // 回退一步
switch(op) {
case '+': result += num; break;
case '-': result -= num; break;
case '*': result *= num; break;
case '/':
if(num == 0) {
valid = false;
system("title 错误!");
::MessageBox(NULL, TEXT("\n余数不能为零,请正确输入! "), TEXT("错误"), 0);
} else {
yu = result % num;
result /= num;
hasDivision = true;
}
break;
case '&': result &= num; break;
case '|': result |= num; break;
case '^': result ^= num; break;
case '%':
if(num == 0) {
valid = false;
system("title 错误!");
::MessageBox(NULL, TEXT("\n模运算除数不能为零,请正确输入! "), TEXT("错误"), 0);
} else {
result %= num;
}
break;
}
} else {
valid = false;
system("title 错误!");
::MessageBox(NULL, TEXT("\n请正确输入! "), TEXT("错误"), 0);
break;
}
}
if(!valid) {
continue;
}
cout << s << "=" << result;
if(hasDivision && yu != 0) cout << "......" << yu;
cout << endl << endl << endl;
}
cout << endl << "再见!" << endl;
return 0;
}