


版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、一些说明:本程序支持基本的四则运算,三角函数运算(sin , cos, tan ), 指数运算,以及对数运算(lg,ln,log ),取模运算,同时还支持 括号!主函数流程:输入运算式子-> 判断是否有异常字符-> 对式子进行处理以 便于计算-> 调用计算没有括号的式子的函数去除括号,即先计算括 号里的子式-> 最后得到没有括号的式子,在调用函数计算得到结 果。值得注意的是输入运算式子时,"& J必须写成alogb,庇必须 写成pi,三角函数若不是tanN形式的话,要加上括号如tan (a+b), 这是由于控制台输入的限制和为了输入后便于处理。子函数流
2、程:从运算式子中读出数字和字符,分别存于一个队列中-> 按顺序 取出数字与字符,进行乘方运算,其他的再一次放回队列中-> 依次 再取出进行三角函数和对数的运算,其他依次放回-> 再依次取出进 行乘除和取模运算,其他依次放回-> 现在只剩下加减运算,依次取 出计算,得到最后的结果。关键技术:一、C+的sstream流的运用,可以从中分别读出运算式子的数字与字符还有去除括号时将未处理字符(即非括号内的字符)以及括号内的子式处理结果输出到流中,便于迭代去 除括号。二、对没括号的式子进行分级处理。三、将式子的字符以及数字分开处理。源代码如下:#inClude<iostre
3、am>#inClude<sstream>#inClude<string>#inClude<Cmath>#inClude<queue>#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
4、In lg sqrt pi!"for (conSt auto &i : S)if (jubge. find (i) = -1)throw 1;/ 抛出异常/ 将三角函数名化为数字与 &字符,便于识别和计算/以及将对数函数/以及阶乘/以及开方/将pi/ n化为数字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, &
5、quot;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") !=
6、 -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 ("
7、;(") != -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 i
8、f (*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;/抛出异常end(); +i)/输出for (auto i = right + 1; i != s.剩余未处理符
9、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 << " 式子中有异常字符! "
10、; << 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)/ 将
11、数字和运算符分别装入双向队列和队列适配器中std: deque<double> number;std: 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);/ 添
12、加最后一个数字/ 计算乘方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(tp
13、n);/ 放回队列,置于最后 / 计算三角函数以及对数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(t
14、pn); 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:;double temp = number. back(); number. back() = log (tpn) / log (temp);else if (tpc = '$')/计算阶乘int n = number. bac
15、k();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
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 教材解析水利水电工程试题及答案
- 五年级心理健康成长教育
- 物理学原理在工程中的应用知识集萃
- 高尔夫运动基础技能培训指南
- 教育科技产品研发合同
- 探索市政工程考试领域的试题及答案
- 企业临时用工劳动合同
- 经济师中级考试重要试题及答案提醒
- 物理实验答辩报告设计规范
- 学习“铸牢中华民族共同体意识”应知应会知识竞赛测试题库
- 烹饪原料知识试题库(含参考答案)
- 【MOOC】创新思维与创业实验-东南大学 中国大学慕课MOOC答案
- 《体育保健学》课程笔记
- 关于贪污的检举信范文
- 地方融资平台债务和政府中长期支出事项监测平台操作手册-单位
- 2020年同等学力申硕《计算机科学与技术学科综合水平考试》历年真题及答案
- 2024年中国防盗报警器系统市场调查研究报告
- 20世纪西方音乐知到智慧树期末考试答案题库2024年秋北京大学
- 【水利水电】李想 案例专项班教案 01-案例专项班(一)
- 社区治理中的意识形态工作制度
- 计算机及外部设备装配调试员(中级)学习通超星期末考试答案章节答案2024年
评论
0/150
提交评论