- 1、本文档共9页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
c++实现的完整功能计算器
c++实现的完整功能计算器
PAGE
c++实现的完整功能计算器
一些说明:
本程序支持基本的四则运算,三角函数运算(sin,cos,tan),指数运算,以及对数运算(lg,ln,log),取模运算,同时还支持括号!
主函数流程:
输入运算式子 - 判断是否有异常字符 - 对式子进行处理以便于计算 -调用计算没有括号的式子的函数去除括号,即先计算括号里的子式 - 最后得到没有括号的式子,在调用函数计算得到结果。值得注意的是输入运算式子时,logab必须写成alogb,
子函数流程:
从运算式子中读出数字和字符,分别存于一个队列中 - 按顺序取出数字与字符,进行乘方运算,其他的再一次放回队列中 - 依次再取出进行三角函数和对数的运算,其他依次放回 - 再依次取出进行乘除和取模运算,其他依次放回 - 现在只剩下加减运算,依次取出计算,得到最后的结果。
关键技术:
c++的sstream流的运用,可以从中分别读出运算式子的数字与字符还有去除括号时将未处理字符(即非括号内的字符)以及括号内的子式处理结果输出到流中,便于迭代去除括号。
对没括号的式子进行分级处理。
将式子的字符以及数字分开处理。
源代码如下:
#includeiostream
#includesstream
#includestring
#includecmath
#includequeue
#define pi
double calculate(std::string);
int main(){
//输入式子,存于s中
std::string s;
std::getline(std::cin, s);
//抛出异常
try{
//判断是否有异常字符
const std::string jubge = 90 tan sin cos +-*/^%(|) log ln lg sqrt pi!;
for (const auto i : s)
if (i) == -1)
throw 1;////抛出异常
//将三角函数名化为数字与字符,便于识别和计算
//以及将对数函数······
//以及阶乘·········
//以及开方·········
//将pi/π化为数字
size_t n = 0;
while ((n = (sin)) != -1)
(n, 3, 1);
while ((n = (cos)) != -1)
(n, 3, 2);
while ((n = (tan)) != -1)
(n, 3, 3);
while ((n = (ln)) != -1)
(n, 2, 4);
while ((n = (lg)) != -1)
(n, 2, 5);
while ((n = (sqrt)) != -1)
(n, 4, 6);
while ((n = (log)) != -1)
(n, 3, @);
while ((n = (!)) != -1)
(n, 1, $7);
while ((n = (pi)) != -1)
(n, 2, std::to_string(pi));
//去除括号
while (() != -1||())!=-1){
std::ostringstream uout;//存储未处理字符
auto left = ();//记录左括号位置
auto right = ();//记录右括号位置
while (right != ()){//处理最里层括号里的字符
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 == ()) throw 3;////抛出异常
for (auto i = right + 1; i != (); ++i)//输出剩余未处理符
uout *i;
文档评论(0)