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

GitHub

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

代码

include

include

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崽  阅读(184)  评论(0)    收藏  举报