版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、些说明:本程序支持基本的四则运算,三角函数运算( sin , cos , tan ),指数运算,以及对数运算( lg , ln , log ),取模运算,同时还支持括号!主函数流程:输入运算式子 -> 判断是否有异常字符 -> 对式子进行处理以便于计算->调用计算没有括号的式子的函数去除括号,即先计算括号里的子式-> 最后得到没有括号的式子, 在调用函数计算得到结果。值得注意的是输入运算式子时, 必 须写成 alogb , 必 须写成 pi ,三角函数若不是tanN形式的话,要加上括号如tan (a+b),这是由于控 制台输入的限制和为了输入后便于处理。子函数流程:从运
2、算式子中读出数字和字符, 分别存于一个队列中 -> 按顺序取出数字与字符, 进行乘方运算, 其他的再一次放回队列中 -> 依次再取出进行三角函数和对数的运算, 其他依次放回 -> 再依次取出进行乘除和取模运算, 其他依次放回 -> 现在只剩下加减运算, 依次取出计算,得到最后的结果。关键技术:一、c+的sstream流的运用,可以从中分别读出运算式子的数字与字符还有去除括号时将未处理字符(即非括号内的字符)以及括号内的子式处理结果输出到流中,便于迭代去除括号。2、 对没括号的式子进行分级处理。3、 将式子的字符以及数字分开处理。源代码如下:#include<ios
3、tream> #include<sstream> #include<string> #include<cmath> #include<queue>#define pi 3.141592654 double calculate( std:string);int main()/输入式子,存于s 中std:string s;std:getline(std:cin, s);/抛出异常try/判断是否有异常字符const std:string jubge = "1234567890 tan sin cos +-*/八(|) log ln l
4、g sqrt pi!"for (const auto &i : s)if (jubge. find(i) = -1)throw 1;/ 抛出异常/将三角函数名化为数字与&字符,便于识别和计算以及将对数函数以及阶乘以及开方将pi/兀化为数字size_t n = 0;while (n = s. find("sin") != -1)s. replace(n, 3, "1&");while (n = s. find("cos") != -1)s. replace(n, 3, "2&"
5、;);while (n = s. find("tan") != -1)s. replace(n, 3, "3&");while (n = s. find("ln") != -1)s. replace(n, 2, "4&");while (n = s. find("lg") != -1)s. replace(n, 2, "5&");while (n = s. find("sqrt") != -1)s. replace(n, 4, &q
6、uot;6&");while (n = s. find("log") != -1)s. replace(n, 3, "");while (n = s. find("!") != -1)s. replace(n, 1, "$7");while (n = s. find("pi") != -1)s. replace(n, 2, std:to_string(pi);/去除括号while (s. find("(") != -1|s. find(")&quo
7、t;)!=-1)std:ostringstream uout;/ 存储未处理字符auto left = s. begin();/记录左括号位置auto right = s. begin();/记录右括号位置while (right != s. end()/ 处理最里层括号里的字符if (*right = '(')if (*left = '(')for (auto i = left; i != right; +i)uout << *i;left = right;else if (*right = ')')if (*left !=
8、9;(') throw 2;/ 抛出异常uout << calculate( std:string(left + 1, right);break;else if (*left != '(')uout << *right;else;+right;if (*left = '('&&right = s. end() throw 3;/ 抛出异常for (auto i = right + 1; i != s. end(); +i)/ 输出剩余未处理符uout << *i;s = uout. str();/将处理
9、一对括号后的字符串赋给s/计算最后结果 double result = calculate(s);/输出结果std:cout << result << std:endl;catch (int e)/ 捕获并处理异常using std:cout;using std:endl;cout << "Input Error!" << endl;switch (e)case 1: cout << "式子中有异常字符! " << endl; break;case 2: cout <<
10、"缺左括号!" << endl; break;case 3: cout << "缺右括号!" << endl; break;case 4: cout << "运算符相连或对数等复活写错! " << endl;break;default:;system("pause");return 0;double calculate( std:string s)/将数字和运算符分别装入双向队列和队列适配器中std:deque<double> number;s
11、td:queue<char> symbol;std:istringstream uin(s);symbol. push('+');/ 添加加号为第一个运算符double tpn; char tpc;while (uin >> tpn >> tpc)number. push_back(tpn), symbol. push(tpc);if (!uin. eof() throw 4;/ 抛出异常number. push_back(tpn);/ 添加最后一个数字/计算乘方for (int i = 0, n = number. size(); i &l
12、t; n; +i)tpc = symbol. front(); symbol. pop();取出运算符tpn = number. front(); number. pop_front();取出数字if (tpc ='八')计算乘方double temp = number. back();number. back() = pow(temp, tpn);elsesymbol. push(tpc);/ 放回队列,置于最后精品资料number. push_back(tpn);/ 放回队列,置于最后/计算三角函数以及对数 for (int i = 0, n = number. size(
13、); i < n; +i)tpc = symbol. front(); symbol. pop();取出运算符tpn = number. front(); number. pop_front();取出数字if (tpc = '&')/ 计算乘方以及对数switch (int(number. back()case 1:number. back() case 2:number. back() case 3:number. back() case 4:number. back() case 5:number. back() case 6:number. back() d
14、efault:;= sin(tpn); break;= cos(tpn); break;= tan(tpn); break;= log(tpn); break;= log10(tpn); break;= sqrt(tpn); break;else if (tpc = '')/ 计算对数double temp = number. back();number. back() = log(tpn) / log(temp);else if (tpc = '$')/ 计算阶乘int n = number. back();number. back() = 1;for (in
15、t i = 1; i <= n; +i) number. back() *= i;elsesymbol. push(tpc);/ 放回队列,置于最后number. push_back(tpn);/ 放回队列,置于最后/计算乘除以及取模运算for (int i = 0, n = number. size(); i < n; +i)tpc = symbol. front(); symbol. pop();取出运算符tpn = number. front(); number. pop_front();取出数字if (tpc = '+' | tpc = '-')symbol. push(tpc);number. push_back(tpn);else if (tpc = '*')number. back() *= tpn;/ 计算乘else if (tpc = '/')number. back() /= tpn;/ 计算除else/取模运算double temp = number. back();temp = int(temp) % int(tpn);number. back() = temp;/计算加减得出结果double resu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年互联网金融产品研发合同
- 2024年型厨具订购合同示范文本
- 2024年城市公园照明规划与建设合同
- 2024年企业数据中心改造工程合同
- 2024年合同履行保函
- 社区环保活动垃圾收集服务合同
- 2024至2030年中国布艺装饰画数据监测研究报告
- 2024至2030年中国光亮免擦蜡水行业投资前景及策略咨询研究报告
- 2024至2030年大型圆棍机项目投资价值分析报告
- 2024年组装式水冷制冷机组项目可行性研究报告
- 数字经济十大趋势
- 工程水文学题库及题解(全)
- 个人征信承诺书
- 【学生基本信息表】样本
- 【类文阅读】25.古人谈读书(试题)五年级语文上册 部编版(含答案、解析)
- 新疆维吾尔自治区吐鲁番市2023-2024学年九年级上学期期中数学试题
- 环境监测仪器设备采购投标方案(技术标)
- 小学信息技术《认识“画图”》说课稿
- 薄壁不锈钢管卡压连接施工工艺
- 鲁教版七年级上册地理知识点汇总
- 全国高中青年数学教师优质课大赛一等奖《函数的单调性》课件
评论
0/150
提交评论