问题标题: 计算器(有点水,暑假再做)

0
0
张赫凡
张赫凡
修练者
修练者

#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;
}


0
0
肖付强
肖付强
资深光能
资深光能

可以,但是可以再加入一些内容,比如更号之类的

我要回答