You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

71 lines
2.1 KiB

#ifndef QUESTION_H
#define QUESTION_H
#include <chrono>
#include<set>
#include<string>
#include<vector>
#include<memory>
#include <random>
struct User {
std::string username;
std::string password;
std::string usertype;
};
//抽象基类
class QuestionGenerator{
protected:
std::set<std::string> existingqustions;//已生成的问题
std::mt19937 gen;
public:
QuestionGenerator(){
auto seed = std::chrono::system_clock::now().time_since_epoch().count();
gen.seed(static_cast<unsigned int>(seed));
}
virtual std::string GenerateLogic()=0;
virtual ~QuestionGenerator() = default;
virtual std::vector<std::string> GenerateQuestion(int count);//生成问题
virtual std::string GetType() const = 0;
int GetRand(int min,int max);//产生随机数字
char GetOperator();
bool IsQuestionUnique(const std::string& question) const;
void ClearQuestions();
};
//小学题目生成器
class PrimaryQuestionGenerator : public QuestionGenerator {
public:
PrimaryQuestionGenerator() = default;
std::string GenerateLogic() override;
std::string GetType() const override;
private:
std::string GenerateWithParentheses(int operands);
bool IsValidParentheses(const std::string& expr) const;
std::string ParenthesesCaceOne(int operands, const std::vector<int>& numbers);
std::string ParenthesesCaceTwo(int operands, const std::vector<int>& numbers);
std::string ParenthesesCaceThree(int operands, const std::vector<int>& numbers);
};
// 初中题目生成器
class JuniorQuestionGenerator : public QuestionGenerator {
public:
JuniorQuestionGenerator() = default;
std::string GenerateLogic() override;
std::string GetType() const override;
};
// 高中题目生成器
class SeniorQuestionGenerator : public QuestionGenerator {
public:
SeniorQuestionGenerator() = default;
std::string GenerateLogic() override;
std::string GetType() const override;
};
// 工厂函数声明
std::unique_ptr<QuestionGenerator> CreateQuestionGenerator(const std::string& type);
#endif // QUESTION_H