面向对象程序设计__Task3_Calculator

The initial part of the Calculator program
题目链接:Click Here
github链接:Click Here

看到这个题目的话,想到就是有3个任务要去做,一是写Scan类,二是写Print类,三是写.cpp里的main函数。其中main函数和Print类第一感觉不是很难写,难点在于Scan类的函数对接受的字符串的处理。下面就说说我的具体思路。

(一)

  • 从第一点开始说起,根据题目描述的,ToStringQueue的形参为string类型的四则运算表达式,返回值为一个string队列。因此可以先写出函数的声明为 queue ToStringQueue(string input); 另外,为了测试的必要,在第三点.cpp里的main()函数里创建Scan对象并调用Scan的ToStringQueue方法。

  • 接下来就是对input的具体操作。在这里我一开始的想法是不管其他的符号,把所有的数字一位一位的push到队列中,这个可以通过一个简单的判断来完成,即逐个字符扫描input,只要字符满足在'0'到'9'之间或'.'则进行push操作。

  • 然后是对数字的进一步操作,即实现连续数字的操作。由于C++不满足两个string型常量的 + 操作,所以我引入一个string型变量 res = "";这样,只要在逐个字符扫描input时,若下一字符满足在'0'到'9'之间或'.',则加到res;若不满足且res不为空字符串,则将res字符串push到队列中并进行操作res = "";

  • 上述操作成功之后,Scan类的任务算是接近尾声,最后只要在上一步操作中添加对符号的push操作就OK啦!

  • 然而还是太天真了。题目要求,当输入的数字超过10位(包括小数位)时,报错。这就说明,程序还应判断是否push到超过10位的数字,可是函数已然有返回值了,怎么把是否超过10位数字的结果表现出来呢?

  • 我的做法是,在Scan类定义一个bool型变量isExceed10用来记录程序运行过程中是否有超过10位的数字被push到队列之中。

  • 自此,Scan类的工作大功告成!下面附上代码。


Scan.h

#pragma once
#include <string>
#include <queue>

using namespace std;

class Scan
{
public:
    Scan(void);
    ~Scan(void);
    queue<string> ToStringQueue(string input);
    void setIsExceed10(bool _isExceed10);
    bool getIsExceed10();
private:
    bool isExceed10;     // 记录是否有输入超过10位的数
};

Scan.cpp

#include "Scan.h"
#define N 100

using namespace std;


Scan::Scan(void)
{
}


Scan::~Scan(void)
{
}

void Scan::setIsExceed10(bool _isExceed10)
{
    isExceed10 = _isExceed10;
}

bool Scan::getIsExceed10()
{
    return isExceed10;
}

queue<string> Scan::ToStringQueue(string input)
{
    queue<string> q;     // q即为最后所要return的队列,用于保存input表达式中的数字和符号
    string res = "";     // res为扫描input表达式时用于临时存储的字符串
    string strArr[N];     // strArr为扫描input表达式时用于存储数字和符号的string数组
    int len = input.length();
    int cnt = 0;     // 作为strArr的下标记录已完成提取的数字和符号的个数
    setIsExceed10(false);
    for(int i = 0; i < len; i++)
    {
        if((input[i] >= '0' && input[i] <= '9') || input[i] == '.')
        {
            res += input[i];     // 若是数字或 '.' 则添加到临时存储器res里,
            if(i == len - 1)     // 若已完成扫描
            {
                strArr[cnt++] = res;
                break;
            }
            continue;     // 继续判断下一元素
        }
        else
        {
            if(!res.empty())     // res非空表示此时res中缓存着一个数字
            {
                strArr[cnt++] = res;
            }
            res = "";     // res置空
            strArr[cnt++] = res + input[i];     // 将不是数字或 "." 的元素(即符号元素)添加到strArr中
        }
    }
    for(int i =0; i < cnt; i++)     // 将strArr中各个元素添加到q队列中
    {
        if(strArr[i].length() > 10)
        {
            setIsExceed10(true);     // 存在大于10位数的数字
        }
        q.push(strArr[i]);
    }
    return q;
}

(二)

  • 第二个是Print类。若没有特殊要求的话,一个一个将传进来的队列中的元素打印出来即可,由于有不超过10位的数字的限制,所以应添加对此的特殊处理——打印出提示。

  • 代码如下。


Print.h

#pragma once
#include <string>
#include <queue>

using namespace std;

class Print
{
public:
    Print(void);
    ~Print(void);
    void printQueue(queue<string> q, bool isExceed10);
};

Print.cpp

#include "Print.h"
#include <iostream>

Print::Print(void)
{
}


Print::~Print(void)
{
}

void Print::printQueue(queue<string> q, bool isExceed10)
{
    if(isExceed10)     // 若超过10位数的数字存在为真
    {
        cout << "\n输入错误!应输入不超过10位的数字!" << endl;
        cout << "Input error !  Not exceeding 10 digits expected! " << endl;
        return ;
    }
    while(q.size())
    {
        cout << q.front() << endl;     // 输入队首元素
        q.pop();     // 删除队首元素
    }
}

(三)

  • 最后则是主函数啦。类都写完了,main函数里面好好调用就行了。话不多说,上代码。

Main.cpp

#include <iostream>
#include <string>
#include "Scan.h"
#include "Print.h"

using namespace std;

int main()
{
    // 提示信息
    cout << "请输入四则运算表达式:" << endl;
    cout << "please input the arithmetic expression:\n" << endl;
    string input;
    // 接受用户输入
    cin >> input;
    Scan *sc = new Scan();
    Print *pr = new Print();
    // 调用Scan类的ToStringQueue得到string队列
    queue<string> qu = sc->ToStringQueue(input);
    // 输出该队列
    pr->printQueue(qu, sc->getIsExceed10());
    // 对象销毁
    delete sc;
    sc = NULL;
    delete pr;
    pr = NULL;
    system("pause"); // 防止程序一闪而过
    return 0;
}

以上就是此次作业的详细过程了,杂七杂八的说了一大堆,虽然在过程当中遇到了很多问题,但是都能靠自己的能力解决,也在过程当中学到了很多,比如queue的一些用法,加深了对类的理解等等,毕竟看教程视频是一回事,自己动手又是另一回事。第一次在博客上直接的贴代码,还望多多指点。

转载于:https://www.cnblogs.com/monsterJang/p/5216788.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值