我写了一个计算器,功能挺多的,大家可以帮忙测一下吗?有问题记得发在评论区里。这是第一版正式版,求……
代码(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文件在附加包里。