diff --git a/src/fraction.cc b/src/fraction.cc new file mode 100644 index 0000000..e7c1b57 --- /dev/null +++ b/src/fraction.cc @@ -0,0 +1,44 @@ +#include "fraction.h" + +fraction fraction::operator+(const fraction &frac) { + fraction tmp = *this; + tmp.numerator = tmp.numerator * frac.denominator + + tmp.denominator * frac.numerator; + tmp.denominator = tmp.denominator * frac.denominator; + return tmp.simplify(); +} + +fraction fraction::operator*(const fraction &frac) { + fraction tmp = *this; + tmp.numerator = tmp.numerator * frac.numerator; + tmp.denominator = tmp.denominator * frac.denominator; + return tmp.simplify(); +} + +bool fraction::operator==(const fraction &frac) { + this->simplify(); + return gcd(frac.numerator, this->numerator) == this->numerator && + gcd(frac.denominator, this->denominator) == this->denominator; +} + +bool fraction::operator!=(const fraction &frac) { + return !(*this == frac); +} + +fraction &fraction::simplify() { + int g = gcd(numerator, denominator); + numerator /= g; + denominator /= g; + return *this; +} + +float fraction::real() { + return (float)numerator / denominator; +} + +int fraction::gcd(int a, int b) { + if (a % b == 0) + return b; + + return gcd(b, a % b); +} diff --git a/src/fraction.h b/src/fraction.h new file mode 100644 index 0000000..59cd82c --- /dev/null +++ b/src/fraction.h @@ -0,0 +1,18 @@ +#ifndef __FRACTION_H__ +#define __FRACTION_H__ + +struct fraction final { + int numerator; + int denominator; + + fraction operator+(const fraction &frac); + fraction operator*(const fraction &frac); + bool operator==(const fraction &frac); + bool operator!=(const fraction &frac); + fraction &simplify(); + float real(); +private: + int gcd(int a, int b); +}; + +#endif diff --git a/src/log.cc b/src/log.cc new file mode 100644 index 0000000..a990d9f --- /dev/null +++ b/src/log.cc @@ -0,0 +1,10 @@ +#include "log.h" + +#include + +logger::logger(std::ofstream &&new_out): + out{std::move(new_out)} {} + +void logger::render() { + +} diff --git a/src/log.h b/src/log.h index b82e1f9..342329d 100644 --- a/src/log.h +++ b/src/log.h @@ -2,6 +2,7 @@ #define __LOG_H__ #include #include +#include #include #include "constants.h" #include "characters.h" @@ -10,6 +11,7 @@ class logger final { private: std::ofstream out; + std::vector display; public: logger(std::ofstream &&new_out); diff --git a/src/rng.cc b/src/rng.cc index 4f204e6..2cd54bb 100644 --- a/src/rng.cc +++ b/src/rng.cc @@ -32,6 +32,10 @@ int RNG::get_curr_rand_num() const { return curr_rand_num; } +bool RNG::trial(fraction &psuccess) { + return (rand() % psuccess.denominator) < psuccess.numerator; +} + template T &RNG::get_rand_in_vector(const std::vector &vec) { curr_rand_num = rand(); diff --git a/src/rng.h b/src/rng.h index 4fd8bcf..037d6bb 100644 --- a/src/rng.h +++ b/src/rng.h @@ -5,6 +5,8 @@ #include #include +#include "fraction.h" + // Technically, you should ONLY define one rng for the entire program // IMPORTANT: pass all RNG objects as references class RNG final { @@ -24,6 +26,8 @@ public: unsigned int get_init_seed() const; int get_curr_rand_num() const; + bool trial(fraction &psuccess); + template T &get_rand_in_vector(const std::vector &vec); };