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的一些用法,加深了对类的理解等等,毕竟看教程视频是一回事,自己动手又是另一回事。第一次在博客上直接的贴代码,还望多多指点。

面向对象程序设计__Task3_Calculator的更多相关文章

  1. [.net 面向对象程序设计深入](0) 开篇

    [.net 面向对象程序设计深入](0)开篇        [.net 面向对象编程基础]和 [.net 面向对象程序设计进阶]在15年底写完了,群里也加进来不少热爱学习的小伙伴.让我深切感受到在这个 ...

  2. [.net 面向对象程序设计进阶] (1) 开篇

    [.net 面向对象程序设计进阶] (1) 开篇 上一系列文章<.net 面向对象编程基础>写完后,很多小伙伴们希望我有时间再写一点进阶的文章,于是有了这个系列文章.这一系列的文章中, 对 ...

  3. [.net 面向对象程序设计深入](6).NET MVC 6 —— 模型、视图、控制器、路由等的基本操作

    [.net 面向对象程序设计深入](6).NET MVC 6 —— 模型.视图.控制器.路由等的基本操作 1. 使用Visual Studio 2015创建Web App (1)文件>新建> ...

  4. [.net 面向对象程序设计深入](5)MVC 6 —— 构建跨平台.NET开发环境(Windows/Mac OS X/Linux)

    [.net 面向对象程序设计深入](5)MVC 6 —— 构建跨平台.NET开发环境(Windows/Mac OS X/Linux) 1.关于跨平台 上篇中介绍了MVC的发展历程,说到ASP.NET ...

  5. [.net 面向对象程序设计深入](4)MVC 6 —— 谈谈MVC的版本变迁及新版本6.0发展方向

    [.net 面向对象程序设计深入](4)MVC 6 ——谈谈MVC的版本变迁及新版本6.0发展方向 1.关于MVC 在本篇中不再详细介绍MVC的基础概念,这些东西百度要比我写的全面多了,MVC从1.0 ...

  6. [.net 面向对象程序设计深入](3)UML——在Visual Studio 2013/2015中设计UML活动图

    [.net 面向对象程序设计深入](3)UML——在Visual Studio 2013/2015中设计UML活动图 1.活动图简介 定义:是阐明了业务用例实现的工作流程. 业务工作流程说明了业务为向 ...

  7. [.net 面向对象程序设计深入](2)UML——在Visual Studio 2013/2015中设计UML用例图

    [.net 面向对象程序设计深入](2)UML——在Visual Studio 2013/2015中设计UML用例图  1.用例图简介 定义:用例图主要用来描述“用户.需求.系统功能单元”之间的关系. ...

  8. [.net 面向对象程序设计深入](1)UML——在Visual Studio 2013/2015中设计UML类图

    [.net 面向对象程序设计深入](1)UML——在Visual Studio 2013/2015中设计UML类图 1.UML简介 Unified Modeling Language (UML)又称统 ...

  9. [.net 面向对象程序设计进阶] (28) 结束语——告别2015

    [.net 面向对象程序设计进阶] (28) 结束语——告别2015 <.net面向对象程序设计进阶>这一系列文章写了太长的时间了,大概有半年没写,在年底又一口气写了好几篇.在整个过程中目 ...

随机推荐

  1. nginx重启报错:nginx: [error] invalid PID number "" in "/run/nginx.pid"

    问题描述:执行 nginx -t 是OK的,然而在执行 nginx -s reload 的时候报错 nginx: [error] invalid PID number “” in “/run/ngin ...

  2. [转]微信小程序支付简单小结与梳理

    本文转自:https://www.cnblogs.com/onetwo/p/6667424.html 公司最近在做微信小程序,被分配到做支付这一块,现在对这一块做一个简单的总结和梳理. 支付,对于购物 ...

  3. Visual Basic了解

    Visual Basic是一种由微软公司开发的结构化的.模块化的.面向对象的.包含协助开发环境的事件驱动为机制的可视化程序设计语言.这是一种可用于微软自家产品开发的语言.它源自于Basic编程语言.V ...

  4. 导出为shape文件

    private void barButtonItem2_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)//导出为s ...

  5. MySQL 学习 --- 数据结构和索引

    本文参考了多篇文章集成的笔记,希望各位学习之前可以阅读以下参考资料先 概述 文章分几个部分 :第一部分介绍了B-Tree 和 B+Tree 这种数据结构作为索引:第二部分介绍索引的最左前缀原则和覆盖索 ...

  6. Enable Scribble,Enable Guard Edges,Enable Guard Malloc,Zombie Objects

    最近项目中使用一个翻拍身份证信息识别活体检测的第三方框架,在使用时会偶然性的出现崩溃的现象,经过查找是因为第三方框架中有释放的内存区域再次引用引起的,因而补充一下相关知识点.   在Xcode Edi ...

  7. NSObject常用方法和反射

    // 类的反射    NSString *str = @"Person";    Class class = NSClassFromString(str);        Pers ...

  8. Java基础教程(21)--泛型

    一.为什么使用泛型   泛型意味着编写的代码可以被很多不同类型的对象所重用.例如,我们不希望为存放String和Integer对象的集合设计不同的类.现在的ArrayList类可以存放任何类型的对象, ...

  9. JVM进程状态监控

    前言 ========== 为什么需要做服务器jvm自动发现的监控呢?这个事情主要有两点原因: 1.zabbix默认监控jvm状态是使用jmx中转进行监控的,监控效率比较低下 2.zabbix使用jm ...

  10. C# NPOI 导出Execl 工具类

    NPOI 导出Execl 自己单独工具类 详见代码 using System; using System.Collections.Generic; using System.Linq; using S ...