From 860a237faae4c46b07a5c23792a8285563e0d516 Mon Sep 17 00:00:00 2001 From: "David Vereb (Home)" Date: Mon, 1 Apr 2019 17:14:30 -0500 Subject: [PATCH] Easier to understand number generation for hard problems. Initial support for input and checking correctness. --- Problem.cpp | 72 ++++++++++++++++++++++++++++++++++++++--------------- Problem.h | 15 ++++++++++- 2 files changed, 66 insertions(+), 21 deletions(-) diff --git a/Problem.cpp b/Problem.cpp index e6c9d13..9f08507 100644 --- a/Problem.cpp +++ b/Problem.cpp @@ -2,6 +2,7 @@ #include #include +#include bool Problem::seeded = false; @@ -83,17 +84,6 @@ void Problem::GenerateNumbers(PROBLEM_TYPE type, unsigned short max_digits) number_bottom += temp_number_bottom * (pow(10, digit)); } break; - case HARD_ADDITION: - for(auto digit = 0; digit < digits; ++digit) - { - unsigned short temp_number_top = rand() % 10; - unsigned short temp_number_bottom = rand() % 10; - - // Place into correct digit posititon: - number_top += temp_number_top * (pow(10, digit)); - number_bottom += temp_number_bottom * (pow(10, digit)); - } - break; case EASY_SUBTRACTION: for(auto digit = 0; digit < digits; ++digit) { @@ -110,16 +100,13 @@ void Problem::GenerateNumbers(PROBLEM_TYPE type, unsigned short max_digits) number_bottom += temp_number_bottom * (pow(10, digit)); } break; + case HARD_ADDITION: + number_top = rand() % int(pow(10, digits)); + number_bottom = rand() % int(pow(10, digits)); + break; case HARD_SUBTRACTION: - for(auto digit = 0; digit < digits; ++digit) - { - unsigned short temp_number_top = rand() % 10; - unsigned short temp_number_bottom = rand() % 10; - - // Place into correct digit posititon: - number_top += temp_number_top * (pow(10, digit)); - number_bottom += temp_number_bottom * (pow(10, digit)); - } + number_top = rand() % int(pow(10, digits)); + number_bottom = rand() % int(pow(10, digits)); // NOTE(dev): don't allow negative numbers: if(number_bottom > number_top) { @@ -152,3 +139,48 @@ void Problem::GenerateWindow(unsigned win_x, unsigned win_y) if(!win) return; } + +int Problem::Input() const +{ + int rtn = 0; + try { + rtn = std::stoi(input.c_str()); + } catch (const std::exception &e) { + syslog(LOG_USER|LOG_DEBUG, "%s:%d:%s Invalid std::stoi: %s", + __FILE__,__LINE__,__PRETTY_FUNCTION__,e.what()); + exit(-1); // INVALID INPUT!!! + } + return rtn; +} + +void Problem::Input(char character) +{ + // TODO(dev): ASSERT + if(character < '0' || character > '9') + exit(-1); + + if(input_style == INPUT_STYLE::INPUT_PREPEND) + input = std::to_string(character) + input; + else + input += std::to_string(character); +} + +bool Problem::Correct() const +{ + // NOTE(dev): I know I don't need "break;", but it just makes me happier knowing they're there. + switch(problem_type) + { + case EASY_ADDITION: + case HARD_ADDITION: + return number_top + number_bottom == Input(); + break; + case EASY_SUBTRACTION: + case HARD_SUBTRACTION: + return number_top - number_bottom == Input(); + break; + }; + + // TODO(dev): Assert that all conditions are handled! + exit(-1); + return false; +} diff --git a/Problem.h b/Problem.h index 80fb105..06bed60 100644 --- a/Problem.h +++ b/Problem.h @@ -1,13 +1,14 @@ #ifndef DVEREB_PROBLEM_H #define DVEREB_PROBLEM_H +#include #include #include enum PROBLEM_TYPE { // NOTE(dev): EASY means each digit can be handled without carryover. - // e.g. 33 + 46 is easy because 6+3 < 10 and 3+4 is < 10. + // e.g. 33 + 46 is easy because 3+6 < 10 and 3+4 is < 10. // HARD means you might have to carry over. // e.g. 33 + 97 is hard because 7 + 3 = 10, carry the 1, 9 + 3 + 1 = 13, 130. EASY_ADDITION = 1, @@ -16,6 +17,12 @@ enum PROBLEM_TYPE HARD_SUBTRACTION, }; +enum INPUT_STYLE +{ + INPUT_PREPEND = 1, + INPUT_APPEND, +}; + class Problem { public: @@ -23,6 +30,8 @@ public: ~Problem(); void Draw(bool selected); + void Input(char character); + bool Correct() const; private: Problem() = delete; @@ -35,6 +44,10 @@ private: int number_top; int number_bottom; + INPUT_STYLE input_style = INPUT_STYLE::INPUT_PREPEND; + int Input() const; + std::string input; + // Helper Functions: void GenerateNumbers(PROBLEM_TYPE type, unsigned short max_digits); void GenerateWindow(unsigned win_x, unsigned win_y);