您的位置:首页 > 其它

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

2016-02-24 14:19 197 查看
代码链接 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;
}

小思

关于队列知识是一头雾水的,构造函数和析构函数不太清楚怎么用,类和对象有个初步了解,但在类里面用指针头好大,不知道申请分配内存和释放内存怎么弄,就乱写了。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: