面向对象程序设计__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面向对象程序设计进阶>这一系列文章写了太长的时间了,大概有半年没写,在年底又一口气写了好几篇.在整个过程中目 ...
随机推荐
- centos6.5下yum安装mysql5.5
第一步就是看linu是否安装了mysql,经过rpm -qa|grep mysql查看到centos下安装了mysql5.1,那就开始卸载咯 2 接下来就是卸载mysql5.1了,命令:rpm -e ...
- win10 uwp 让焦点在点击在页面空白处时回到textbox中
在网上 有一个大神问我这样的问题:在做UWP的项目,怎么能让焦点在点击在页面空白处时回到textbox中? 虽然我的小伙伴认为他这是一个 xy 问题,但是我还是回答他这个问题. 首先需要知道什么是空白 ...
- 通向全栈之路——(4)nginx反向代理配置
1.安装nginx:sudo apt-get install nginx2.新建配置文件:cd /etc/nginx/conf.dsudo vi XXX-cn-8080.conf内容如下:upstre ...
- C# 小软件部分(一)
自己在空闲时分整合.编写了一款小软件程序,命名为魔法兔子,希望大家可以提出意见和指导,此篇文章主要为软件的部分截图和介绍. 软件详情: 1.首先是登录,注册界面. 可以注册自己的账号,后台是腾讯云服务 ...
- Unity 发布到ios平台笔记
[ProjectName] was compiled with optimization - stepping may behave oddly; variables may not be avail ...
- IOS中微信摇一摇声音无法播放解决办法
在IOS中第一次调用play方法播放音频会被阻止,必须得等用户有交互动作,比如touchstart,click后才能正常调用,所以可以在摇一摇之前提醒用户点击一下开始游戏的按钮或者给用户一个弹窗,用户 ...
- FUzhou 1607 Greedy division---因子个数问题。
Problem 1607 Greedy division http://acm.fzu.edu.cn/problem.php?pid=1607 Accept: 402 Submit: 1463T ...
- C# 运算符 ++在前与++在后实例分析。
首先记住计算技巧“++在前先+1,++在后后+1”. static void Main(string[] args) { int i = 10; Console.WriteLine(i);//此时i的 ...
- 转:PHP中的使用curl发送请求(GET请求和POST请求)
原文地址:http://www.jb51.net/article/104974.htm 使用CURL发送请求的基本流程 使用CURL的PHP扩展完成一个HTTP请求的发送一般有以下几个步骤: 1.初始 ...
- css过渡笔记
3D http://fangyexu.com/tool-CSS3Inspector.html <!DOCTYPE html> <html lang="en" ...