C++实现数学功能

一、基础数学运算
  1. 阶乘计算:计算任意非负整数的阶乘
  2. 组合 / 排列数:计算 C (n,k) 和 P (n,k) 组合排列数
  3. 对数运算:支持任意底数的对数计算
  4. 指数函数:计算 e^x 和任意底数的幂函数
  5. 开方运算:计算 n 次根号下 x 的值
二、三角函数与双曲函数
  1. 标准三角函数:sin、cos、tan 及其反函数
  2. 余割 / 正割 / 余切:csc、sec、cot 及其反函数
  3. 双曲函数:sinh、cosh、tanh 及其反函数
三、代数与几何计算
  1. 最大公约数 / 最小公倍数:整数的 GCD 和 LCM
  2. 绝对值计算:计算数值的绝对值
  3. 向量运算:支持向量点积和三维向量叉积
  4. 矩阵运算:实现任意维度矩阵的乘法
四、统计与分析
  1. 平均值计算:计算一组数据的算术平均值
  2. 标准差计算:计算数据集的标准偏差
五、用户体验优化
  1. 交互式菜单:通过数字选择不同功能
  2. 输入验证:对非法输入进行错误提示
  3. 结果格式化:数值结果以固定精度显示
  4. 跨平台支持:兼容 Windows 和 Linux 系统
  5. 用户交互:清屏和暂停功能增强操作体验

技术特点

  • 使用 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;
}