zoukankan      html  css  js  c++  java
  • [C++ Calculator 项目] 基础运算实现

    Calculator V1.1

    注:这是C++计算器项目第二部分-运算 [基于初始部分增改而得]
    源文件已上传至github

    主要问题:

    Ⅰ.运算实现的问题在于( ) + - * /的优先级的处理,以及对-的处理
    Ⅱ.命令行参数如何进行合法性检查和判断

    编写想法:

    • ()的处理:

            基本想法是使用递归,当碰到`(`时,调用自身进入更深层循环,计算`()`内的式子,当遇到`)`时则计算结束返回计算结果给上一层
    
    • +-*/的处理:

            若字符为`+`则跳过,若字符为`-`则将一个标志负号的bool数 __minus=true ,当字符为`*`或`/`时将其推入栈 stack<char> m_sym 内等待处理
    
    • num的处理:

            当从队列中取出字符串为数值时,将其赋予 stringstream sstr ,并输出给 int num 
            此后需要经过两个条件判断。
                        ·① 检查__minus == true,为真则将 num*=-1
                        ·② 检查`m_sym`栈是否非空且栈顶元素是否为 *、/ ,为真则将储存数值的栈 stack<int> m_val 的栈顶元素 m_val.top() *or/ num 并赋值给num
            最后 m_val.push(num); 
    
    • -的处理:

           主要有这三种情况:`1-2` `-1*2` `-(1+2)`,通过分析不难发现,不论`-`号处于哪种情况是都可看做是影响其后一个数字,即前两个式子可看做 `1+(-2)` `(-1)*2` ,而第三种情况由于对`()`已做过处理,故最后得`-3`即为第一种
    

    过程记录:

    • 在写calc函数时,首选并不是递归,当时准备将calc写为处理表达式队列中的-号的函数,并且在碰到-(...)时直接将-乘入(...)内的第一个数,结果一连遇上了好多bug(多到真的数不过来,所以就不列出了)
    • 因为代码是基于原先已经写好了的输入输出类上进行增改,所以在写calculation类的时候,省去了很多的工作。不过由于在写的时候并没有进行一些整体规划,所以最后成形的代码整体架构混乱,自己隔天看了也没看懂,于是把想法整理了之后,重写了两次,才觉得稍微好一些。
    • 由于需要增加一个命令行参数-a,所以就增加了一个处理命令行参数的类 __arg ,以方便将来的开发和处理
    • 最后附上自己的成果

    最后:[有奖竞猜]

    请解析这句话的结构以及它想表达什么

  • 相关阅读:
    Linq-分页查询
    思维导图软件xmind和mindmanager哪个更好
    Enterprise Architect使用教程
    敏捷开发之Scrum
    总结---4
    判断单链表是否存在环
    设计模式分类
    实用手册:130+ 提高开发效率的 vim 常用命令
    Reverse Linked List II
    Single Number and Single Number II
  • 原文地址:https://www.cnblogs.com/tr3e/p/5374173.html
Copyright © 2011-2022 走看看