• 《面向对象程序设计》 三 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存放的是同类型的数据,所以在拆分表达式放入队列时显性分开的意义不大,不过可能更好理解吧(...)。还有对于函数的写法可以多思考,有时候代码块位置的改变可能让代码的运行效率快上许多。

  • 相关阅读:
    PAT (Basic Level) Practise:1001. 害死人不偿命的(3n+1)猜想
    流加密法
    The NMEA 0183 Protocol
    USB 描述符
    网摘
    What are the 10 algorithms one must know in order to solve most algorithm challenges/puzzles?
    Why did Jimmy Wales invest in Quora? Is he afraid that it will take over Wikipedia?
    Add Binary
    Cocos2d-x 网络资源
    Cache
  • 原文地址:https://www.cnblogs.com/syaoyao/p/5209655.html
Copyright © 2020-2023  润新知