美文网首页
C++11策略模式展示

C++11策略模式展示

作者: FredricZhu | 来源:发表于2021-07-17 08:15 被阅读0次

题目,


image.png

这个题目其实是在有理数范围内和无理数范围内分别计算求根公式的策略。
对于有理数,不支持复数,那么如果求根公式返回负数,就返回 complex<double>(nan, nan)。
如果是无理数,支持复数,那么如果求根公式返回正数,就返回 complex<double>(res, 0)。
如果是无理数,支持复数,并且求根公式返回负数,就返回complex<double>(r, i)。

代码如下,

#include <iostream>
#include <vector>
#include <complex>
#include <tuple>
#include <math.h>
using namespace std;

struct DiscriminantStrategy
{
    virtual double calculate_discriminant(double a, double b, double c) = 0;
};

struct OrdinaryDiscriminantStrategy : DiscriminantStrategy
{
    double calculate_discriminant(double a, double b, double c) {
        return b*b - 4*a*c;
    }
};

struct RealDiscriminantStrategy : DiscriminantStrategy
{
    double calculate_discriminant(double a, double b, double c) {
        int value =  b*b - 4*a*c;
        if(value < 0) {
            return sqrt((double)-1);
        }
        
        return value;
    }
};

class QuadraticEquationSolver
{
    DiscriminantStrategy& strategy;
public:
    QuadraticEquationSolver(DiscriminantStrategy &strategy) : strategy(strategy) {}

    tuple<complex<double>, complex<double>> solve(double a, double b, double c)
    {
        auto res = strategy.calculate_discriminant(a, b, c);
        if(isnan(res)) {
            return {complex<double>(res, res), complex<double>(res, res)};
        }
        
        if(res > 0) {
            auto x1 =  -b/(2*a) + sqrt(res)/(2*a);
            auto x2 =  -b/(2*a) - sqrt(res)/(2*a);
            return {complex<double>(x1, 0), complex<double>(x2, 0)};
        }
        
        auto r = -b/(2*a);
        auto i = sqrt(-res)/(2*a);
        
        return {complex<double>(r, i), complex<double>(r, -i)};
    }
};

相关文章

  • C++11策略模式展示

    题目, 这个题目其实是在有理数范围内和无理数范围内分别计算求根公式的策略。对于有理数,不支持复数,那么如果求根公式...

  • 大话设计模式-策略模式

    窗口展示 策略模式的金额计算 策略模式的优缺点: 策略模式定义了一系列算法,这些算法功能相同,实现不同,可以采用相...

  • C++11命令模式展示

    这个代码太简单了。命令模式一般会有一个std::vector对象来做命令的执行和回放,这里没体现出来。感觉课程的作...

  • C++11解释器模式展示

    题目, 本例实现一个简单的+,-法解释器,不考虑括号的情况,也就是不考虑优先级。需要支持嵌入变量的情况。如果变量是...

  • C++11模板方法模式展示

    题目, 这个题目我做的答案判定是错误的,但是思路是一致的,就是说在父类中定义抽象行为,在子类中实现行为方法。这个作...

  • C++11迭代器模式展示

    题目, 这个代码跟迭代器没什么关系,就是先序遍历树,然后把遍历结果放到std::vector里面。不过有了这个st...

  • C++11 装饰器模式展示

    题目, 这个题目开始想复杂了,折腾了两三个小时才折腾出来,不过这种设计本身也很蛋疼,1、已经有red或者blue的...

  • C++11享元模式展示

    题干,看题干好像只要能支持指定位置的单词大写就行。但其实出题者的单元测试不只这些,大写之后也有可能还原到小写。这样...

  • C++11责任链模式展示

    题目 题目不是很难,但是解起来的时候要注意一点。就是Creature指针是被放在了vector里面固化了的,就是缓...

  • C++11访问者模式展示

    题目 题目作者把accept和visit方法写反了,但是这不影响做题。你也反着写就行了。就是看着有点别扭。这里的实...

网友评论

      本文标题:C++11策略模式展示

      本文链接:https://www.haomeiwen.com/subject/thubpltx.html