Calculator

1、代码链接:https://github.com/laixiaolian/object-oriented

2、主要思路:

首先,先建立一个.h文件,里面建立一个Scan类和Print类。在Scan类里定义一个bool ToStringQueue(string input)用于读取用户输入的四则运算表达式inupt,分解后转存到m_scanstring。在Print类里定义一个void PrintQueue(queue& tmpQueue)用于接受一个队列。

之后,建立一个.cpp文件,在这个文件中,在Scan类里写一个函数:首先先判断是否为小数还是整数或者是字符。若判断出不是字符,则还要考虑到输入的数字是否超过了10位,若是小数要包括小数点的所占的一位。当读完连续的数字或者单个字符时,要将这些数字或者字符导入到队列中。在最后还需判断表达式最后是否为数字,若是数字则与刚开始时一样需要判断是小数还是整数,是否有超过10位。在Print类里写一个方法,用来输出所得到的队列。

最后,建立Main.cpp文件,在其main里面获取键盘输入以及创建Scan对象和Print对象。

3、过程中遇到的困难以及解决过程:

  • 处理实数的过程中,开始没有判断小数和整数,于是我在calculator.cpp中添加了判断条件。

            bool isDigit = false; 
            bool isdecimal = false; 
            for (size_t i = 0; i != input.size(); i++)
        {
    if (isdigit(input[i]) || input[i] == '.') //判断是否为数字,包括小数点
    {
        if (input[i] == '.') 
        {
            isdecimal = true;   
        }
    
        isDigit = true;
        continue;
             }
  • 调试时发现没有输出。解决方法:没有考虑到表达式最后是数字还是字符,于是我在代码中加了这一段

            if (isDigit) //表示表达式最后为数字
            {
    string tmp = input.substr(markOfReadPos,input.size() - markOfReadPos); //i - markOfReadPos为要截取的字符串字符数
    
    
    //判断输入的数字是否超过10位
    
    if (isdecimal) 
    {   
        if ((tmp.size() - 1) > 10) 
        {   
            return false;   
        }   
    }
    
    
    else 
    {   
        if (tmp.size() > 10) 
        {   
            return false;   
        }
    }
    
    m_scanstring.push(tmp); //将markOfReadPos 到 i位置的数字 的string导入queue
            }
  • 可还是调试不出来,最后发现没有将string存入queue中,于是加了m_scanstring.push()将string存入到queue中。

  • 在Main.cpp中忘记了当数字超出10位时应该输出的语句,于是再加了一个if else语句。整个代码就完成了。

4、主要代码:

#include "Calculator.h"
#include <iostream>
bool Scan::ToStringQueue(string input)
{
size_t markOfReadPos = 0; //标识已经导入到input的第几位,初始0为input第一位
bool isDigit = false; 
bool isdecimal = false; 

for (size_t i = 0; i != input.size(); i++)
{
    if (isdigit(input[i]) || input[i] == '.') //判断是否为数字,包括小数点
    {
        if (input[i] == '.') 
        {
            isdecimal = true;   
        }
        
        isDigit = true;
        continue;
    }


    else 
    {
        if (isDigit == true) //判断是否刚读完一串数字
        {
            isDigit = false;
            string tmp = input.substr(markOfReadPos,i - markOfReadPos); //i - markOfReadPos为要截取的字符串字符数

            //判断输入的数字是否超过10位

            if (isdecimal) 
            {
                if ((tmp.size() - 1) > 10) 
                {   
                    return false;   
                }
            }


            else 
            {
                if (tmp.size() > 10) //整数部分超过10位
                {   
                  return false; 
                }
            }


            m_scanstring.push(tmp); //将markOfReadPos 到 i位置的数字 的string导入queue
            markOfReadPos = i;
            isdecimal = false;
        }


        string sign;
        sign.insert( sign.begin(), input[i] ); //把char转化成string
        m_scanstring.push(sign);
        markOfReadPos++;
    }   
}


if (isDigit) //表示表达式最后为数字
{
    string tmp = input.substr(markOfReadPos,input.size() - markOfReadPos); //i - markOfReadPos为要截取的字符串字符数


    //判断输入的数字是否超过10位

    if (isdecimal) 
    {   
        if ((tmp.size() - 1) > 10) 
        {   
            return false;   
        }   
    }


    else 
    {   
        if (tmp.size() > 10) 
        {   
            return false;   
        }
    }

    m_scanstring.push(tmp); //将markOfReadPos 到 i位置的数字 的string导入queue
}

return true;    
}


void Print::PrintQueue(queue<string>& tmpQueue)
{
while(!tmpQueue.empty()) //此种遍历会清空queue
{
    cout<<tmpQueue.front()<<endl;
    tmpQueue.pop(); 
}               
}

5、scan类

class Scan
{
public:
    Scan() {};
    ~Scan() {};
    
public:
    bool ToStringQueue(string input); //读取用户输入的四则运算表达式inupt,分解后转存到m_scanstring
    
public:
    queue<string> m_scanstring; 
 };

6、 print类

class Print
{
public:
    Print() {};
    ~Print() {};
    
public:
    void PrintQueue(queue<string>& tmpQueue); //接受一个队列
};

7、main函数

#include "Calculator.h"
#include <iostream>
using namespace std;
int main()
{
string input;
Scan scanMachine;
Print printMachine;

cin>>input;

if (scanMachine.ToStringQueue(input))
{
    printMachine.PrintQueue(scanMachine.m_scanstring);  
}

else
{   
    cout<<"包含位数超10位的数字,请重新输入!";
}

system("pause");
}

转载于:https://www.cnblogs.com/laixiaolian/p/5202081.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值