《面向对象程序设计》课程作业(七)

GitHub

•请将随机生成数字、表达式的部分设计成:一个Random基类,基类中有random()方法。并由该基类派生出RandomNumber类、RandomOperation类,继承并覆盖父类方法。

代码

#include <iostream>
#include <sstream>
#include <stdlib.h>
#include<time.h>

using namespace std;

class Random
{
protected:
	int digit;
public:
	Random(){digit = rand() % 3 + 4;}
	~Random(){}
	void random();
};

class RandomNumber:public Random
{
protected:
	int digit2;
	int nums[10];
public:
	RandomNumber(){digit2=digit;}
	~RandomNumber(){}
	void randomN();
};

void RandomNumber::randomN()
{
for (int i = 0; i<digit; i++)
{
	nums[i] = rand()%9+1;    // 数字
}
}

class RandomOperation:public Random
{
protected:
	char signs[10];
public:
	RandomOperation(){}
	~RandomOperation(){}
	void randomO(); 
};

void RandomOperation::randomO()
{
	char c[] = "+-*/";
	for (int i = 0; i<digit; i++)
	{
		signs[i] = c[rand() % 4]; //符号
	}
	signs[digit] = '=';
}

class Expression:public RandomOperation,public RandomNumber
{
private:
	string equ;
	stringstream str;
public:
	Expression(){}
	~Expression(){}
	void getExpression();
};

void Expression::getExpression()
{	
int	braO,braT;
randomN();
randomO(); 
int bracketNum =rand()%2;    //括号个数 
if (bracketNum == 1)
{
	braO = rand() % (digit2 - 2) + 1;
	braT = braO + rand() % (digit2 - braO) + 1;
	//braO是第一个括号的位置,braT是第二个括号的位置
}
for (int i = 0; i<digit2; i++)
{
	if (bracketNum != 0 && i == braO - 1)
		str << "(";
	str << nums[i];
	if (bracketNum != 0 && i == braT - 1)
		str << ")";
	if (i != digit2 - 1)
		str << signs[i + 1];
}
    str <<"=";
str >> equ;
cout<<equ;
}

int main()
{
srand((unsigned(time(NULL))));
Expression exp;
exp.getExpression();
return 0;
} 

•学习简单工厂模式,思考能否将该模式运用到题目的第一点要求中。

其实简单工厂模式也是类的一种。

优点:用户在使用时可以直接根据工厂类去创建所需的实例,而无需了解这些对象是如何创建以及如何组织的。有利于整个软件体系结构的优化。客户端要使用使用数据时,只需要和工厂进行交互即可,这就导致操作步骤得到极大的简化。

缺点:一旦这个工厂出了问题,所有的客户端都会受到牵连;所以,简单工厂模式违背了“开放封闭原则”,因为当新增加一个产品的时候必须修改工厂类,相应的工厂类就需要重新编译一遍。

附上学习的blog:

简单工厂模式

详解设计模式之工厂模式(简单工厂+工厂方法+抽象工厂)

百度百科

posted @ 2017-06-09 21:57  wood崽  阅读(162)  评论(0编辑  收藏  举报