面向对象程序设计__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