计算器 1.0

我写了一个计算器,功能挺多的,大家可以帮忙测一下吗?有问题记得发在评论区里。这是第一版正式版,求……

代码(C++):

#include <iostream>
#include <string>
#include <sstream>
#include <cmath>
#include <cstdlib>
#include <windows.h>  // 用于清屏函数
using namespace std; 
// count
int count(string s,char x){
	int sum=0;
	for(int i=0;i<s.size();i++){
		if(s[i]==x)sum++;
	}
	return sum;
}
// 计算阶乘
unsigned long long factorial(int n) {
    unsigned long long result = 1;
    for (int i = 2; i <= n; ++i) {
        result *= i;
    }
    return result;
}

// 计算组合数
int combination(int n, int k) {
    return factorial(n) / (factorial(k) * factorial(n - k));
}

// 计算排列数
int permutation(int n, int k) {
    return factorial(n) / factorial(n - k);
}

// 转换进制
std::string convertBase(int num, int base) {
    if (num == 0) return "0";
    std::string result = "";
    while (num > 0) {
        int remainder = num % base;
        if (remainder < 10) {
            result = static_cast<char>(remainder + '0') + result;
        } else {
            result = static_cast<char>(remainder - 10 + 'A') + result;
        }
        num /= base;
    }
    return result;
}

// 清屏函数
void clearScreen() {
    HANDLE hOut;
    COORD Position;

    hOut = GetStdHandle(STD_OUTPUT_HANDLE);

    Position.X = 0;
    Position.Y = 0;
    SetConsoleCursorPosition(hOut, Position);
}

// 输出帮助信息
void printHelp() {
    std::cout << "支持的运算符和格式如下:" << std::endl;
    std::cout << "1. 基本运算: +, -, *, /, %" << std::endl;
    std::cout << "2. 位运算: <<, >>" << std::endl;
    std::cout << "3. 幂运算: 例如 2^3 表示 2 的 3 次方" << std::endl;
    std::cout << "4. 组合数: C^5v2 表示从 5 个中选 2 个的组合数" << std::endl;
    std::cout << "5. 排列数: A^5v2 表示从 5 个中选 2 个的排列数" << std::endl;
    std::cout << "6. 进制转换: 例如 10 16 19 表示把 10 进制的 19 转换成 16 进制" << std::endl;
    std::cout << "7. 开方: sqrt(25) 表示对 25 开方" << std::endl;
    std::cout << "8. 平方: pow2(5) 表示 5 的平方" << std::endl;
    std::cout << "输入 'q' 退出程序。" << std::endl;
}

int main() {
    std::string input;
    cout<<"欢迎使用计算器2.0!"<<endl;
    cout<<"welcome to using calculator 2.0!"<<endl;	 
    printHelp();
    while (true) {
        std::cout << "请输入计算表达式(输入 'q' 退出,输入 'help' 获取帮助):";
        std::getline(std::cin, input);

        if (input == "q") {
            break;
        } else if (input == "help") {
            printHelp();
            continue;
        }

        std::istringstream iss(input);
        double num1, num2;
        char op;

        if (input.find("sqrt(") != std::string::npos) {
            sscanf(input.c_str(), "sqrt(%lf)", &num1);
            if (num1 >= 0) {
                std::cout << "sqrt(" << num1 << ") = " << std::sqrt(num1) << std::endl;
            } else {
                std::cout << "错误:不能对负数开方。" << std::endl;
            }
        } else if (input.find("pow2(") != std::string::npos) {
            sscanf(input.c_str(), "pow2(%lf)", &num1);
            std::cout << "pow2(" << num1 << ") = " << std::pow(num1, 2) << std::endl;
        } else if (input.find('^') != std::string::npos) {
            if (input.find("C^") != std::string::npos) {
                int n, k;
                sscanf(input.c_str(), "C^%dv%d", &n, &k);
                std::cout << "组合数 C(" << n << ", " << k << ") = " << combination(n, k) << std::endl;
            } else if (input.find("A^") != std::string::npos) {
                int n, k;
                sscanf(input.c_str(), "A^%dv%d", &n, &k);
                std::cout << "排列数 A(" << n << ", " << k << ") = " << permutation(n, k) << std::endl;
            } else {
                iss >> num1 >> op >> num2;
                std::cout << num1 << " 的 " << num2 << " 次方 = " << std::pow(num1, num2) << std::endl;
            }
        } else if (count(input, ' ') == 2) {
            int fromBase, toBase, num;
            sscanf(input.c_str(), "%d %d %d", &fromBase, &toBase, &num);
            std::cout << fromBase << " 进制的 " << num << " 转换为 " << toBase << " 进制是: " << convertBase(num, toBase) << std::endl;
        } else if (iss >> num1 >> op >> num2) {
            switch (op) {
                case '+':
                    std::cout << num1 << " + " << num2 << " = " << num1 + num2 << std::endl;
                    break;
                case '-':
                    std::cout << num1 << " - " << num2 << " = " << num1 - num2 << std::endl;
                    break;
                case '*':
                    std::cout << num1 << " * " << num2 << " = " << num1 * num2 << std::endl;
                    break;
                case '/':
                    if (num2 != 0) {
                        std::cout << num1 << " / " << num2 << " = " << num1 / num2 << std::endl;
                    } else {
                        std::cout << "错误:除数不能为零。" << std::endl;
                    }
                    break;
                case '%':
                    if (static_cast<int>(num2) != 0) {
                        std::cout << static_cast<int>(num1) << " % " << static_cast<int>(num2) << " = " << static_cast<int>(num1) % static_cast<int>(num2) << std::endl;
                    } else {
                        std::cout << "错误:除数不能为零。" << std::endl;
                    }
                    break;
                case '<':
                    if (iss.get() == '<') {
                        std::cout << static_cast<int>(num1) << " << " << static_cast<int>(num2) << " = " << (static_cast<int>(num1) << static_cast<int>(num2)) << std::endl;
                    }
                    break;
                case '>':
                    if (iss.get() == '>') {
                        std::cout << static_cast<int>(num1) << " >> " << static_cast<int>(num2) << " = " << (static_cast<int>(num1) >> static_cast<int>(num2)) << std::endl;
                    }
                    break;
                default:
                    std::cout << "错误:不支持的运算符。" << std::endl;
            }
        } else {
            std::cout << "错误:输入格式不正确。" << std::endl;
        }
    }

    return 0;
}    

可执行程序和cpp文件在附加包里。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值