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. 边框圆角Css

    .box{ background:grey; //灰色背景 height:50px; //高500像素 width:200px; //宽200像素 border-top-left-radius:15p ...

  2. async 和 await 的用法示例

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  3. [javaSE] 网络编程(UDP通信)

    UDP发送端 获取DatagramSocket对象,new出来 获取DatagramPacket对象,new出来,构造参数:byte[]数组,int长度,InetAddress对象,int端口 调用D ...

  4. Java多态-如何理解父类引用指向子类对象

    java多态,如何理解父类引用指向子类对象 要理解多态性,首先要知道什么是“向上转型”. 我定义了一个子类Cat,它继承了Animal类,那么后者就是前者是父类.我可以通过   Cat c = new ...

  5. 三:vim常用快捷键

    窗口移动操作: j或者Ctrl+e(就是Ctrl+e):向下细微滚动窗口. k或者Ctrl+y:向上细微滚动窗口. h:向左细微滚动窗口. l:向右细微滚动窗口. gg:跳转到页面的顶部. G(就是s ...

  6. fzu 2154 YesOrNo

    Problem 2154 YesOrNo Accept: 14    Submit: 29Time Limit: 1000 mSec    Memory Limit : 32768 KB Proble ...

  7. python中闭包和装饰器的理解(关于python中闭包和装饰器解释最好的文章)

    转载:http://python.jobbole.com/81683/ 呵呵!作为一名教python的老师,我发现学生们基本上一开始很难搞定python的装饰器,也许因为装饰器确实很难懂.搞定装饰器需 ...

  8. asp.ne如何使用javascript去验证客户端信息,如果验证成功则送往服务器端处理,否则在客户端提示用户(不返回到服务器端处理)

    一.问题 在网站一般都有很多地方需要用户去填写一些信息,然后用户点击提交,将信息送往后台储存到数据库中.在这一个过程我以前做法直接在button的click事件中来判断用户输入的数据是否完整和合法,虽 ...

  9. CentOS /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory

    使用的时候出现一个错误 bash: /usr/local/bin/rar: /lib/ld-linux.so.2: bad ELF interpreter: No such file or direc ...

  10. 使用手机预览移动端项目(Vue)

    1.在 npm run dev 启动Vue项目之后.例:http://localhost:8095/#/chatList 2.查看本机的 IP (WIN + R + cmd ) 输入 ipconfig ...