当前位置: 首页 > news >正文

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 标准库实现复杂数据结构(向量、矩阵)
  • 采用模块化设计,每个功能封装为独立函数
  • 支持任意维度的向量和矩阵运算
  • 实现错误处理机制,避免程序崩溃
  • 提供简洁的用户界面和清晰的操作指引

这个计算器适合需要进行科学计算、工程计算或数学学习的用户,能够满足大多数非加减乘除的数学运算需求。

上代码:
 

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

相关文章:

  • 2024年12月6级第二套第一篇
  • c++中main函数执行完后还执行其它语句吗?
  • Web APIS Day04
  • VOSK 离线中文语音识别实战:精准转文字、格式避坑全解析
  • 分类数据集 - 植物分类数据集下载
  • MySQL面试题(含答案),从简单到深入
  • 【全志V821_FoxPi】2-1 首次编译Tina5.0 SDK
  • 获取RadioButton的text,更换textview的text
  • 如何防止任务在多个项目中重复执行
  • Android SDK Manager 2025镜像,亲测好用
  • 蓝凌EKP产品:低门槛、可扩展、可视化公式引擎应用示例
  • 【系统介绍】IBMS智能建筑集成管理平台-智能化子系统的大脑
  • Gartner<Reference Architecture Brief: Data Integration>学习心得
  • RTX4060安装cuda12.3 cudnn8.9
  • Chrome 优质插件计划
  • 【深度学习】深度学习中的张量:从多维数组到智能计算单元
  • jpeg与 Mjpeg数据格式有什么区别
  • 【电力物联网】SDN架构与工作原理介绍
  • PHP基础-语法变量
  • MVVM 分层思想详解
  • 网站首页设计多少钱/石家庄seo排名公司
  • 海口手机建站模板/关键词排名优化易下拉霸屏
  • 目前做网站流行的语言/网络营销与直播电商好就业吗
  • 360建筑网忘记密码怎么办/成都关键词优化平台
  • 如何给给公司建立网站/百度广告联盟
  • 登录注册网站怎么做/网推项目平台