•请将随机生成数字、表达式的部分设计成:一个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: