面向对象程序设计__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的一些用法,加深了对类的理解等等,毕竟看教程视频是一回事,自己动手又是另一回事。第一次在博客上直接的贴代码,还望多多指点。
面向对象程序设计__Task3_Calculator的更多相关文章
- [.net 面向对象程序设计深入](0) 开篇
[.net 面向对象程序设计深入](0)开篇 [.net 面向对象编程基础]和 [.net 面向对象程序设计进阶]在15年底写完了,群里也加进来不少热爱学习的小伙伴.让我深切感受到在这个 ...
- [.net 面向对象程序设计进阶] (1) 开篇
[.net 面向对象程序设计进阶] (1) 开篇 上一系列文章<.net 面向对象编程基础>写完后,很多小伙伴们希望我有时间再写一点进阶的文章,于是有了这个系列文章.这一系列的文章中, 对 ...
- [.net 面向对象程序设计深入](6).NET MVC 6 —— 模型、视图、控制器、路由等的基本操作
[.net 面向对象程序设计深入](6).NET MVC 6 —— 模型.视图.控制器.路由等的基本操作 1. 使用Visual Studio 2015创建Web App (1)文件>新建> ...
- [.net 面向对象程序设计深入](5)MVC 6 —— 构建跨平台.NET开发环境(Windows/Mac OS X/Linux)
[.net 面向对象程序设计深入](5)MVC 6 —— 构建跨平台.NET开发环境(Windows/Mac OS X/Linux) 1.关于跨平台 上篇中介绍了MVC的发展历程,说到ASP.NET ...
- [.net 面向对象程序设计深入](4)MVC 6 —— 谈谈MVC的版本变迁及新版本6.0发展方向
[.net 面向对象程序设计深入](4)MVC 6 ——谈谈MVC的版本变迁及新版本6.0发展方向 1.关于MVC 在本篇中不再详细介绍MVC的基础概念,这些东西百度要比我写的全面多了,MVC从1.0 ...
- [.net 面向对象程序设计深入](3)UML——在Visual Studio 2013/2015中设计UML活动图
[.net 面向对象程序设计深入](3)UML——在Visual Studio 2013/2015中设计UML活动图 1.活动图简介 定义:是阐明了业务用例实现的工作流程. 业务工作流程说明了业务为向 ...
- [.net 面向对象程序设计深入](2)UML——在Visual Studio 2013/2015中设计UML用例图
[.net 面向对象程序设计深入](2)UML——在Visual Studio 2013/2015中设计UML用例图 1.用例图简介 定义:用例图主要用来描述“用户.需求.系统功能单元”之间的关系. ...
- [.net 面向对象程序设计深入](1)UML——在Visual Studio 2013/2015中设计UML类图
[.net 面向对象程序设计深入](1)UML——在Visual Studio 2013/2015中设计UML类图 1.UML简介 Unified Modeling Language (UML)又称统 ...
- [.net 面向对象程序设计进阶] (28) 结束语——告别2015
[.net 面向对象程序设计进阶] (28) 结束语——告别2015 <.net面向对象程序设计进阶>这一系列文章写了太长的时间了,大概有半年没写,在年底又一口气写了好几篇.在整个过程中目 ...
随机推荐
- nginx重启报错:nginx: [error] invalid PID number "" in "/run/nginx.pid"
问题描述:执行 nginx -t 是OK的,然而在执行 nginx -s reload 的时候报错 nginx: [error] invalid PID number “” in “/run/ngin ...
- [转]微信小程序支付简单小结与梳理
本文转自:https://www.cnblogs.com/onetwo/p/6667424.html 公司最近在做微信小程序,被分配到做支付这一块,现在对这一块做一个简单的总结和梳理. 支付,对于购物 ...
- Visual Basic了解
Visual Basic是一种由微软公司开发的结构化的.模块化的.面向对象的.包含协助开发环境的事件驱动为机制的可视化程序设计语言.这是一种可用于微软自家产品开发的语言.它源自于Basic编程语言.V ...
- 导出为shape文件
private void barButtonItem2_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)//导出为s ...
- MySQL 学习 --- 数据结构和索引
本文参考了多篇文章集成的笔记,希望各位学习之前可以阅读以下参考资料先 概述 文章分几个部分 :第一部分介绍了B-Tree 和 B+Tree 这种数据结构作为索引:第二部分介绍索引的最左前缀原则和覆盖索 ...
- Enable Scribble,Enable Guard Edges,Enable Guard Malloc,Zombie Objects
最近项目中使用一个翻拍身份证信息识别活体检测的第三方框架,在使用时会偶然性的出现崩溃的现象,经过查找是因为第三方框架中有释放的内存区域再次引用引起的,因而补充一下相关知识点. 在Xcode Edi ...
- NSObject常用方法和反射
// 类的反射 NSString *str = @"Person"; Class class = NSClassFromString(str); Pers ...
- Java基础教程(21)--泛型
一.为什么使用泛型 泛型意味着编写的代码可以被很多不同类型的对象所重用.例如,我们不希望为存放String和Integer对象的集合设计不同的类.现在的ArrayList类可以存放任何类型的对象, ...
- JVM进程状态监控
前言 ========== 为什么需要做服务器jvm自动发现的监控呢?这个事情主要有两点原因: 1.zabbix默认监控jvm状态是使用jmx中转进行监控的,监控效率比较低下 2.zabbix使用jm ...
- C# NPOI 导出Execl 工具类
NPOI 导出Execl 自己单独工具类 详见代码 using System; using System.Collections.Generic; using System.Linq; using S ...