c++实现的完整功能计算器.doc_第1页
c++实现的完整功能计算器.doc_第2页
c++实现的完整功能计算器.doc_第3页
c++实现的完整功能计算器.doc_第4页
c++实现的完整功能计算器.doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

一些说明:本程序支持基本的四则运算,三角函数运算(sin,cos,tan),指数运算,以及对数运算(lg,ln,log),取模运算,同时还支持括号!主函数流程:输入运算式子 - 判断是否有异常字符 - 对式子进行处理以便于计算 -调用计算没有括号的式子的函数去除括号,即先计算括号里的子式 - 最后得到没有括号的式子,在调用函数计算得到结果。值得注意的是输入运算式子时,logab必须写成alogb,必须写成pi,三角函数若不是tanN形式的话,要加上括号如tan(a+b),这是由于控制台输入的限制和为了输入后便于处理。子函数流程:从运算式子中读出数字和字符,分别存于一个队列中 - 按顺序取出数字与字符,进行乘方运算,其他的再一次放回队列中 - 依次再取出进行三角函数和对数的运算,其他依次放回 - 再依次取出进行乘除和取模运算,其他依次放回 - 现在只剩下加减运算,依次取出计算,得到最后的结果。关键技术:一、 c+的sstream流的运用,可以从中分别读出运算式子的数字与字符还有去除括号时将未处理字符(即非括号内的字符)以及括号内的子式处理结果输出到流中,便于迭代去除括号。二、 对没括号的式子进行分级处理。三、 将式子的字符以及数字分开处理。源代码如下:#include#include#include#include#include#define pi 3.141592654double 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 lg 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&);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, 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()!=-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 != () 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();/将处理一对括号后的字符串赋给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 缺左括号! endl; break;case 3:cout 缺右括号! endl; break;case 4:cout 运算符相连或对数等复活写错! endl; break;default:;system(pause);return 0;double calculate(std:string s)/将数字和运算符分别装入双向队列和队列适配器中std:deque number;std:queue 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 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(); i n; +i)tpc = symbol.front(); symbol.pop();/取出运算符tpn = number.front(); number.pop_front();/取出数字if (tpc = &)/计算乘方以及对数switch (int(number.back()case 1:number.back() = sin(tpn); break;case 2:number.back() = cos(tpn); break;case 3:number.back() = tan(tpn); break;case 4:number.back() = log(tpn); break;case 5:number.back() = log10(tpn); break;case 6:number.back() = sqrt(tpn); break;default:;else if (tpc = )/计算对数double temp = number.back();number.back() = log(tpn) / log(temp);else if (tpc = $)/计算阶乘int n = number.back();number.back() = 1;for (int 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 result = 0;for (int i = 0, n = number.siz

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论