一、基础数学运算
- 阶乘计算:计算任意非负整数的阶乘
- 组合 / 排列数:计算 C (n,k) 和 P (n,k) 组合排列数
- 对数运算:支持任意底数的对数计算
- 指数函数:计算 e^x 和任意底数的幂函数
- 开方运算:计算 n 次根号下 x 的值
二、三角函数与双曲函数
- 标准三角函数:sin、cos、tan 及其反函数
- 余割 / 正割 / 余切:csc、sec、cot 及其反函数
- 双曲函数:sinh、cosh、tanh 及其反函数
三、代数与几何计算
- 最大公约数 / 最小公倍数:整数的 GCD 和 LCM
- 绝对值计算:计算数值的绝对值
- 向量运算:支持向量点积和三维向量叉积
- 矩阵运算:实现任意维度矩阵的乘法
四、统计与分析
- 平均值计算:计算一组数据的算术平均值
- 标准差计算:计算数据集的标准偏差
五、用户体验优化
- 交互式菜单:通过数字选择不同功能
- 输入验证:对非法输入进行错误提示
- 结果格式化:数值结果以固定精度显示
- 跨平台支持:兼容 Windows 和 Linux 系统
- 用户交互:清屏和暂停功能增强操作体验
技术特点
- 使用 STL 标准库实现复杂数据结构(向量、矩阵)
- 采用模块化设计,每个功能封装为独立函数
- 支持任意维度的向量和矩阵运算
- 实现错误处理机制,避免程序崩溃
- 提供简洁的用户界面和清晰的操作指引
这个计算器适合需要进行科学计算、工程计算或数学学习的用户,能够满足大多数非加减乘除的数学运算需求。
上代码:
cpp
#include<bits/stdc++.h>
using namespace std;
//清屏函数
void clrScr() {
system("cls");
}
//暂停程序
void pause() {
cout<<"\n按回车键继续...";
cin.ignore(numeric_limits<streamsize>::max(),'\n');
cin.get();
}
//清除输入缓冲区
void clrInp() {
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(),'\n');
}
//阶乘计算
long double fact(int n) {
if(n<0) return-1;
if(n<2) return 1;
return n*fact(n-1);
}
//组合数计算
long double comb(int n,int k) {
if(k>n) return 0;
if(k==0||k==n) return 1;
return fact(n)/(fact(k)*fact(n-k));
}
//排列数计算
long double perm(int n,int k) {
if(k>n) return 0;
return fact(n)/fact(n-k);
}
//对数计算
double logBase(double x,double base) {
if(x<=0||base<=0||base==1) {
cout<<"错误:对数参数无效";
return-1;
}
return log(x)/log(base);
}
//三角函数计算
double trigFunc(double x,string func) {
if(func=="sin") return sin(x);
if(func=="cos") return cos(x);
if(func=="tan") return tan(x);
if(func=="csc") return 1.0/sin(x);
if(func=="sec") return 1.0/cos(x);
if(func=="cot") return 1.0/tan(x);
cout<<"错误:未知三角函数";
return 0;
}
//反三角函数计算
double invTrig(double x,string func) {
if(x<-1||x>1) {
cout<<"错误:反三角函数参数超出范围";
return 0;
}
if(func=="arcsin") return asin(x);
if(func=="arccos") return acos(x);
if(func=="arctan") return atan(x);
cout<<"错误:未知反三角函数";
return 0;
}
//幂函数计算
double powFunc(double base,double exp) {
return pow(base,exp);
}
//开方计算
double rootFunc(double x,int n) {
if(x<0&&n%2==0) {
cout<<"错误:负数不能开偶次方";
return-1;
}
return pow(x,1.0/n);
}
//指数函数计算
double expFunc(double x) {
return exp(x);
}
//自然对数计算
double lnFunc(double x) {
if(x<=0) {
cout<<"错误:自然对数真数必须大于0";
return-1;
}
return log(x);
}
//双曲函数计算
double hypFunc(double x,string func) {
if(func=="sinh") return sinh(x);
if(func=="cosh") return cosh(x);
if(func=="tanh") return tanh(x);
cout<<"错误:未知双曲函数";
return 0;
}
//反双曲函数计算
double invHyp(double x,string func) {
if(func=="arsinh") return asinh(x);
if(func=="arcosh"&&x<1) {
cout<<"错误:反双曲余弦参数需≥1";
return -1;
}
if(func=="arcosh") return acosh(x);
if(func=="artanh"&&(x<=-1||x>=1)) {
cout<<"错误:反双曲正切参数需在(-1,1)";
return -1;
}
if(func=="artanh") return atanh(x);
cout<<"错误:未知反双曲函数";
return 0;
}
//绝对值计算
double absVal(double x) {
return abs(x);
}
//最大公约数计算
int gcdFunc(int a,int b) {
while(b!=0) {
int t=b;
b=a%b;
a=t;
}
return a;
}
//最小公倍数计算
int lcmFunc(int a,int b) {
return abs(a*b)/gcdFunc(a,b);
}
//平均值计算
double avgVec(vector<double>nums) {
if(nums.empty()) return 0;
double sum=0;
for(double n:nums) sum+=n;
return sum/nums.size();
}
//标准差计算
double stdDev(vector<double>nums) {
if(nums.size()<2) return 0;
double av=avgVec(nums);
double var=0;
for(double n:nums)var+=pow(n-av,2);
return sqrt(var/nums.size());
}
//向量点积计算
double dotProd(vector<double>v1,vector<double>v2) {
if(v1.size()!=v2.size()) {
cout<<"错误:向量维度不匹配";
return 0;
}
double res=0;
for(size_t i=0; i<v1.size(); i++) res+=v1[i]*v2[i];
return res;
}
//向量叉积计算
vector<double>crossProd(vector<double>v1,vector<double>v2) {
if(v1.size()!=3||v2.size()!=3) {
cout<<"错误:仅支持三维向量";
return {};
}
return {
v1[1]*v2[2]-v1[2]*v2[1],
v1[2]*v2[0]-v1[0]*v2[2],
v1[0]*v2[1]-v1[1]*v2[0]
};
}
//矩阵乘法计算
vector<vector<double>>matMult(vector<vector<double>>m1,vector<vector<double>>m2) {
size_t r1=m1.size(),c1=m1[0].size();
size_t r2=m2.size(),c2=m2[0].size();
if(c1!=r2) {
cout<<"错误:矩阵维度不匹配";
return {};
}
vector<vector<double>>res(r1,vector<double>(c2,0));
for(size_t i=0; i<r1; i++) {
for(size_t j=0; j<c2; j++) {
for(size_t k=0; k<c1; k++) {
res[i][j]+=m1[i][k]*m2[k][j];
}
}
}
return res;
}
//获取向量输入
vector<double>getVec(string prompt) {
vector<double>v;
cout<<prompt;
clrInp();
string inp;
getline(cin,inp);
size_t pos=0;
while(pos<inp.length()) {
size_t nxt=inp.find(' ',pos);
if(nxt==string::npos)nxt=inp.length();
string num=inp.substr(pos,nxt-pos);
if(!num.empty()) {
try {
v.push_back(stod(num));
} catch(...) {
cout<<"无效数字:"<<num<<endl;
}
}
pos=nxt+1;
}
return v;
}
//获取矩阵输入
vector<vector<double>>getMat(string prompt,int r,int c) {
vector<vector<double>>mat(r,vector<double>(c,0));
cout<<prompt<<"(输入"<<r<<"行,每行"<<c<<"个数):\n";
for(int i=0; i<r; i++) {
cout<<"第"<<i+1<<"行:";
clrInp();
string inp;
getline(cin,inp);
size_t pos=0,col=0;
while(pos<inp.length()&&col<c) {
size_t nxt=inp.find(' ',pos);
if(nxt==string::npos)nxt=inp.length();
string num=inp.substr(pos,nxt-pos);
if(!num.empty()) {
try {
mat[i][col]=stod(num);
col++;
} catch(...) {
cout<<"无效数字:"<<num<<endl;
}
}
pos=nxt+1;
}
if(col!=c) {
cout<<"列数不符,重试\n";
i--;
}
}
return mat;
}
//显示菜单
void showMenu() {
clrScr();
cout<<"\n=====数学计算器=====\n";
cout<<"1.阶乘计算\n";
cout<<"2.组合数C(n,k)\n";
cout<<"3.排列数P(n,k)\n";
cout<<"4.对数log_base(x)\n";
cout<<"5.三角函数\n";
cout<<"6.反三角函数\n";
cout<<"7.幂函数base^exp\n";
cout<<"8.开方n√x\n";
cout<<"9.指数函数e^x\n";
cout<<"10.自然对数ln(x)\n";
cout<<"11.双曲函数\n";
cout<<"12.反双曲函数\n";
cout<<"13.绝对值\n";
cout<<"14.最大公约数\n";
cout<<"15.最小公倍数\n";
cout<<"16.平均值\n";
cout<<"17.标准差\n";
cout<<"18.向量点积\n";
cout<<"19.向量叉积\n";
cout<<"20.矩阵乘法\n";
cout<<"0.退出程序\n";
cout<<"请选择(0-20):";
}
int main() {
int choice;
double x,y;
int n,k;
string func;
while(true) {
showMenu();
if(!(cin>>choice)) {
cout<<"无效输入,请输数字";
clrInp();
pause();
continue;
}
switch(choice) {
case 0:
clrScr();
cout<<"感谢使用,再见!\n";
return 0;
case 1:
cout<<"输入整数:";
if(!(cin>>n)) {
cout<<"无效数字";
clrInp();
break;
}
cout<<n<<"!="<<fixed<<setprecision(2)<<fact(n)<<endl;
pause();
break;
case 2:
cout<<"输入nk:";
if(!(cin>>n>>k)) {
cout<<"无效数字";
clrInp();
break;
}
cout<<"C("<<n<<","<<k<<")="<<fixed<<setprecision(2)<<comb(n,k)<<endl;
pause();
break;
case 3:
cout<<"输入nk:";
if(!(cin>>n>>k)) {
cout<<"无效数字";
clrInp();
break;
}
cout<<"P("<<n<<","<<k<<")="<<fixed<<setprecision(2)<<perm(n,k)<<endl;
pause();
break;
case 4:
cout<<"输入底数真数:";
if(!(cin>>x>>y)) {
cout<<"无效数字";
clrInp();
break;
}
cout<<"log_"<<x<<"("<<y<<")="<<fixed<<setprecision(6)<<logBase(y,x)<<endl;
pause();
break;
case 5:
cout<<"输入弧度函数(sin/cos/tan等):";
if(!(cin>>x)) {
cout<<"无效数字";
clrInp();
break;
}
cin>>func;
cout<<func<<"("<<x<<")="<<fixed<<setprecision(6)<<trigFunc(x,func)<<endl;
pause();
break;
case 6:
cout<<"输入值函数(arcsin等):";
if(!(cin>>x)) {
cout<<"无效数字";
clrInp();
break;
}
cin>>func;
cout<<func<<"("<<x<<")="<<fixed<<setprecision(6)<<invTrig(x,func)<<endl;
pause();
break;
case 7:
cout<<"输入底数指数:";
if(!(cin>>x>>y)) {
cout<<"无效数字";
clrInp();
break;
}
cout<<x<<"^"<<y<<"="<<fixed<<setprecision(6)<<powFunc(x,y)<<endl;
pause();
break;
case 8:
cout<<"输入xn:";
if(!(cin>>x>>n)) {
cout<<"无效数字";
clrInp();
break;
}
cout<<n<<"√"<<x<<"="<<fixed<<setprecision(6)<<rootFunc(x,n)<<endl;
pause();
break;
case 9:
cout<<"输入x:";
if(!(cin>>x)) {
cout<<"无效数字";
clrInp();
break;
}
cout<<"e^"<<x<<"="<<fixed<<setprecision(6)<<expFunc(x)<<endl;
pause();
break;
case 10:
cout<<"输入x:";
if(!(cin>>x)) {
cout<<"无效数字";
clrInp();
break;
}
cout<<"ln("<<x<<")="<<fixed<<setprecision(6)<<lnFunc(x)<<endl;
pause();
break;
case 11:
cout<<"输入x函数(sinh等):";
if(!(cin>>x)) {
cout<<"无效数字";
clrInp();
break;
}
cin>>func;
cout<<func<<"("<<x<<")="<<fixed<<setprecision(6)<<hypFunc(x,func)<<endl;
pause();
break;
case 12:
cout<<"输入x函数(arsinh等):";
if(!(cin>>x)) {
cout<<"无效数字";
clrInp();
break;
}
cin>>func;
cout<<func<<"("<<x<<")="<<fixed<<setprecision(6)<<invHyp(x,func)<<endl;
pause();
break;
case 13:
cout<<"输入x:";
if(!(cin>>x)) {
cout<<"无效数字";
clrInp();
break;
}
cout<<"|"<<x<<"|="<<fixed<<setprecision(2)<<absVal(x)<<endl;
pause();
break;
case 14:
cout<<"输入整数ab:";
if(!(cin>>n>>k)) {
cout<<"无效数字";
clrInp();
break;
}
cout<<"gcd("<<n<<","<<k<<")="<<gcdFunc(n,k)<<endl;
pause();
break;
case 15:
cout<<"输入整数ab:";
if(!(cin>>n>>k)) {
cout<<"无效数字";
clrInp();
break;
}
cout<<"lcm("<<n<<","<<k<<")="<<lcmFunc(n,k)<<endl;
pause();
break;
case 16: {
vector<double>nums=getVec("输入数字(空格分隔):");
cout<<"平均值="<<fixed<<setprecision(6)<<avgVec(nums)<<endl;
pause();
break;
}
case 17: {
vector<double>nums=getVec("输入数字(空格分隔):");
cout<<"标准差="<<fixed<<setprecision(6)<<stdDev(nums)<<endl;
pause();
break;
}
case 18: {
vector<double>v1=getVec("向量1:");
vector<double>v2=getVec("向量2:");
cout<<"点积="<<fixed<<setprecision(6)<<dotProd(v1,v2)<<endl;
pause();
break;
}
case 19: {
vector<double>v1=getVec("三维向量1:");
vector<double>v2=getVec("三维向量2:");
vector<double>res=crossProd(v1,v2);
if(!res.empty()) {
cout<<"叉积=("<<fixed<<setprecision(6)
<<res[0]<<","<<res[1]<<","<<res[2]<<")\n";
}
pause();
break;
}
case 20: {
int r1,c1,r2,c2;
cout<<"矩阵1行列:";
if(!(cin>>r1>>c1)) {
cout<<"无效数字";
clrInp();
break;
}
cout<<"矩阵2行列:";
if(!(cin>>r2>>c2)) {
cout<<"无效数字";
clrInp();
break;
}
if(c1!=r2) {
cout<<"维度不匹配";
pause();
break;
}
vector<vector<double>> m1=getMat("矩阵1",r1,c1);
vector<vector<double>> m2=getMat("矩阵2",r2,c2);
vector<vector<double>> res=matMult(m1,m2);
if(!res.empty()) {
cout<<"结果矩阵:\n";
for(auto&row:res) {
for(double val:row)
cout<<fixed<<setprecision(6)<<val<<"\t";
cout<<"\n";
}
}
pause();
break;
}
default:
cout<<"无效选择,请输0-20";
pause();
break;
}
}
return 0;
}