• 面向对象第三次作业(向计算器进发)


    代码链接 https://github.com/424baopu/object-oriented/tree/master/Calculator

    题目要求


    大概了解题意以后,感觉在字符串处理,返回队列以及接收队列上面有难度。

    字符串处理

    数字像‘100’输入时按‘1’‘0’‘0’存,但是却要按‘100’输出。而且包括小数点超过十位报错。
    解决方法:
    分开存储,用string number存数字,用string sign存符号。首先需要用判断字符是数字还是运算符号,是符号直接将字符存入sign中并存入队列。如果是数字需要继续判断下一位是否为数字或者小数点,是就继续存入number,不是说明这个数字已经写完了。判断数字长度,符合要求就存入队列,number清空。
    

    返回队列以及接收

    之前没有接触过返回队列的函数,在外援帮助下使用了字符串队列指针,也就是queue<string> *GetQueue()函数。不会指针,Print类接收的时候一开始又写了一个队列,指针指向它然后对这个队列操作,后来感觉没有必要,于是把Scan里面那个队列也删了。
    

    意外状况

    在输出时想的是for循环,次数等于队列个数,但是在操作中有出列,队列个数也在变化。还有一个是输出没有括号,因为输入是中文输入。。。在判断错误那里只写了不符合要求就输出错误,然后跳出循环,但是这样在不符合数字之前的数字及符号还是会输出,所以在Scan里面用了一个数m_ijudge判断,将它初始化为0,若有数字不符合要求就变成1,当为1时,不执行输出操作。
    

    代码

    Scan.h

    #pragma once
    #include<string>
    #include<queue>
    using namespace std;
    
    class Scan
    {
    public:
    	void ToStringQueue(string input);
    	queue<string> *GetQueue();
        int m_ijudge = 0;
    
    	Scan();
    	~Scan();
    private:
    	queue<string>*m_que = new queue<string>;//队列指针
    };
    

    Scan.cpp

    #include "Scan.h"
    #include<iostream>
    using namespace std;
    
    Scan::Scan()
    {
    }
    
    void Scan::ToStringQueue(string input)
    {
    
        string number;//存储数字
        string sign;//存储符号
    
        for (int i = 0; i < input.size();)
        {
            //如果是符号直接存入字符串并存入队列
            if (input[i]<'0' || input[i]>'9')
            {
                sign = input[i];
                m_que->push(sign);
                i++;
            }
    
            //是数字
            else
            {
                do
                {
    
                    number = number + input[i];//将数字存入字符串
                    i++;
                } while (input[i] == '.' || input[i] >= '0' && input[i] <= '9');
    
                if (number.size() > 10)
                {
                    cout << "error" << endl;
                    m_ijudge = 1;//改变m_ijudge值用以判断
                    break;
                }
                else
                {
    
                    m_que->push(number);//数字存入队列
                    number = "";        //清空字符串
                }
    
            }
    
        }
    
    }
    

    Print.h

    #pragma once
    #include<string>
    #include<queue>
    using namespace std;
    class Print
    {
    public:
        void queueTraverse(queue<string>*que);
        Print();
        ~Print();
    };
    

    Print.cpp

    #include "Print.h"
    #include<iostream>
    using namespace std;
    
    Print::Print()
    {
    }
    
    void Print::queueTraverse(queue<string>*que)
    {
        int a = que->size();
        for (int i = 0; i < a;i++)
        {
            cout << que->front() << endl;
            que->pop();//访问一个队首元素出列一个
        }
    }
    
    Print::~Print()
    {
    }
    

    Calculator.cpp

    #include"Scan.h"
    #include"Print.h"
    #include<iostream>
    #include<string>
    #include<queue>
    using namespace std;
    
    int main()
    {
        string s;
        cin >> s;//输入字符串s
    
        Scan sca;
        sca.ToStringQueue(s);
        queue<string>*q = sca.GetQueue();
    
        //如果数字符合要求才输出
        if (sca.m_ijudge == 0)
        {
            Print pri;
            pri.queueTraverse(q);
        }
    
        system("pause");
        return 0;
    }
    

    小思

    关于队列知识是一头雾水的,构造函数和析构函数不太清楚怎么用,类和对象有个初步了解,但在类里面用指针头好大,不知道申请分配内存和释放内存怎么弄,就乱写了。。。
  • 相关阅读:
    leetcode 113. Path Sum II (路径和) 解题思路和方法
    [置顶] T-sql sql server 设置主键约束、标示列、唯一约束、默认值、约束、创建表
    python多线程threading
    可视化MNIST之降维探索Visualizing MNIST: An Exploration of Dimensionality Reduction
    神经网络:卷积神经网络CNN
    卷积神经网络(CNN)
    数据挖掘(10):卷积神经网络算法的一个实现
    CNN卷积神经网络在自然语言处理的应用
    卷积神经网络CNN全面解析
    Matlab多个Figure图合成一个Fig
  • 原文地址:https://www.cnblogs.com/liu424/p/5212600.html
Copyright © 2020-2023  润新知