《面向对象程序设计》 三 Calculator 计算器初步

Git传送门

纸上得来终觉浅,绝知此事要躬行。

学习了一些c++的相应知识后,虽然了解写法,真正操作时还是出现小错误。要多操作,记住关键点,避免不该有的小错误。

写分文件类外定义时出现了问题。在Scan.cpp文件中定义方法时忘记在方法名前加上作用域Scan::导致错误。记住该关键点后写Print.cpp文件就很顺利.

在Print类中写的一个打印队列的for循环出现错误

for (int i = 0; i < inputQue.size(); i++)
{
	cout << inputQue.front() << endl;
    inputQue.pop();
	
}

在测试数据时发现输出不完全,队列后面的部分丢失。通过调试输出队列的大小意识到当让队列头部元素出列后队列的size发生变化,用变量记下接收到的队列大小解决问题。

int size = inputQue.size();
for (int i = 0; i < size; i++)
{
	cout << inputQue.front() << endl;
    inputQue.pop();
	
}

还有解决方案是利用while循环。

while (inputQue.size())
{
	cout << inputQue.front() << endl;
    inputQue.pop();
	
}

代码部分


Scan.h

#include<iostream>
#include<string>
#include<queue>
using namespace std;

class Scan
{
	public:

        /*接收一个四则运算表达式,将表达式对应拆分存入队列 */ 
        void ToStringQueue(string input);  

        /*获取表达式处理后的队列 */ 
	    queue<string> getQue();  


	private:

	    bool isTrue = true;     //判断输入是否正确(目前实现判断输入的数字是否超过十位 超过则为 false) 
	    queue<string> inputQue;    //存放表达式处理后的队列 

};

Scan.cpp

#include"Scan.h"
using namespace std;

void  Scan::ToStringQueue(string input)
{
    string sign = "";	//存放符号 
    string num = "";	//存放数字 
    int count = 0;    //记忆数字位数 
	
    for (int i = 0; i < input.size(); i++)
    {
        /*当前位为符号*/ 
        if (input[i] == '-' || input[i] == '(' || input[i] == ')' || input[i] == '+' || input[i] == '*' || input[i] == '/')
        {
            if (num!="") 
	        {
	            inputQue.push(num);
	            num = "";
	            count = 0;
	        }
						
	        inputQue.push(sign = input[i]);
		
        }
		
        /*当前位为数字*/ 
        else if (input[i] >= 48 && input[i] <= 57 || input[i] == '.')
        {
            count++;
	        if (count > 10)
	        {
	            cout << "输入的数字超过十位(包括小数位)" << endl;
	            isTrue = false;
	            break; 
	        }	
		
	        num += input[i];
        }
			
     } 
 
    /*最后一位为数字*/
    if(num!="" && isTrue)
    {
        inputQue.push(num);
    }
	 
    /*输入不符(目前为输入的数字超过十位),清空队列*/ 
    if (!isTrue)
    {		
        int size = inputQue.size();
		
        for (int j = 0; j < size; j++)
        {
            inputQue.pop();
        }			  
    } 	
}

queue<string> Scan::getQue()
{
    return inputQue;
}

Print.h

#include<iostream>
#include<queue>
using namespace std;


class Print
{
    public:

        /*打印接收的队列*/ 
        void printQue(queue<string> que);
};

Print.cpp

#include"Print.h">
using namespace std;

void Print::printQue(queue<string> que)
{
    int size = que.size();	//存放队列的大小 

    /*当队列非空时打印队列,队列若为空则输入不符*/ 
    if (!que.empty())
    {
        for (int i=0; i< size; i++)
        {
            cout << que.front() << endl;
            que.pop();
        }
    }	
}

main.cpp

#include"Scan.h"
#include"Print.h"
using namespace std;

int main() 
{
    string input;	//接收键盘输入的表达式 
    cin>>input;

    Scan sc;
    sc.ToStringQueue(input) ;
    queue<string> q = sc.getQue();    //存放获取的队列 

    Print pr;
    pr.printQue(q);


    return 0;
}

写完代码看了一些同学的博客后发现自己还是有许多不足的地方,应该多加思考,深入思考。比如将数字存放入队列进行判断时我将数字与符号显性地分开存入num和sign字符串中,当时有这种想法是为了后续方便将字符串数字转变为实数,后来想了想queue存放的是同类型的数据,所以在拆分表达式放入队列时显性分开的意义不大,不过可能更好理解吧(...)。还有对于函数的写法可以多思考,有时候代码块位置的改变可能让代码的运行效率快上许多。

posted @ 2016-02-23 13:48  是光不是yao  阅读(317)  评论(1编辑  收藏  举报