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

  • 相关阅读:
    restFul接口设计规范[仅供参考]
    Vue的router路由跳转传参——实现跳转时url不显示参数
    vue-cli(vue脚手架)搭建超详细教程
    Vue面试常见问题
    Ubuntu18.04安装时的一些问题
    仿BBS项目
    前端常用正则校验
    orm数据库查询优化及数据库三大设计范式总结
    SpringBoot+Git+Jenkins+Docker实现CI/CD
    Jenkins Pipeline+Maven+Gitlab持续集成构建问题集锦
  • 原文地址:https://www.cnblogs.com/monsterJang/p/5216788.html
Copyright © 2020-2023  润新知