zoukankan      html  css  js  c++  java
  • 面向对象第三次作业(向计算器进发)

    代码链接 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;
    }
    

    小思

    关于队列知识是一头雾水的,构造函数和析构函数不太清楚怎么用,类和对象有个初步了解,但在类里面用指针头好大,不知道申请分配内存和释放内存怎么弄,就乱写了。。。
  • 相关阅读:
    evernote100个做笔记的好方法
    平衡二叉树的调整模版
    晨间日记的奇迹
    hdu 2952 Counting Sheep
    hdu 1535 Invitation Cards
    poj 3259 Wormholes(spfa)
    poj 2263 Heavy Cargo(floyd)
    poj 3268 Silver Cow Party(SPFA)
    hdu 1690 Bus System
    hdu 3631 Shortest Path(Floyd)
  • 原文地址:https://www.cnblogs.com/liu424/p/5212600.html
Copyright © 2011-2022 走看看