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

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

小思

关于队列知识是一头雾水的,构造函数和析构函数不太清楚怎么用,类和对象有个初步了解,但在类里面用指针头好大,不知道申请分配内存和释放内存怎么弄,就乱写了。。。
posted @ 2016-02-24 14:19  抱朴  阅读(137)  评论(0编辑  收藏  举报