Easier to understand number generation for hard problems. Initial support for input and checking correctness.
This commit is contained in:
parent
5ab9e9c5f3
commit
860a237faa
72
Problem.cpp
72
Problem.cpp
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include <locale.h>
|
#include <locale.h>
|
||||||
|
#include <syslog.h>
|
||||||
|
|
||||||
bool Problem::seeded = false;
|
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));
|
number_bottom += temp_number_bottom * (pow(10, digit));
|
||||||
}
|
}
|
||||||
break;
|
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:
|
case EASY_SUBTRACTION:
|
||||||
for(auto digit = 0; digit < digits; ++digit)
|
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));
|
number_bottom += temp_number_bottom * (pow(10, digit));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case HARD_ADDITION:
|
||||||
|
number_top = rand() % int(pow(10, digits));
|
||||||
|
number_bottom = rand() % int(pow(10, digits));
|
||||||
|
break;
|
||||||
case HARD_SUBTRACTION:
|
case HARD_SUBTRACTION:
|
||||||
for(auto digit = 0; digit < digits; ++digit)
|
number_top = rand() % int(pow(10, digits));
|
||||||
{
|
number_bottom = rand() % int(pow(10, digits));
|
||||||
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));
|
|
||||||
}
|
|
||||||
// NOTE(dev): don't allow negative numbers:
|
// NOTE(dev): don't allow negative numbers:
|
||||||
if(number_bottom > number_top)
|
if(number_bottom > number_top)
|
||||||
{
|
{
|
||||||
@ -152,3 +139,48 @@ void Problem::GenerateWindow(unsigned win_x, unsigned win_y)
|
|||||||
if(!win)
|
if(!win)
|
||||||
return;
|
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;
|
||||||
|
}
|
||||||
|
15
Problem.h
15
Problem.h
@ -1,13 +1,14 @@
|
|||||||
#ifndef DVEREB_PROBLEM_H
|
#ifndef DVEREB_PROBLEM_H
|
||||||
#define DVEREB_PROBLEM_H
|
#define DVEREB_PROBLEM_H
|
||||||
|
|
||||||
|
#include <string>
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
#include <ncurses.h>
|
#include <ncurses.h>
|
||||||
|
|
||||||
enum PROBLEM_TYPE
|
enum PROBLEM_TYPE
|
||||||
{
|
{
|
||||||
// NOTE(dev): EASY means each digit can be handled without carryover.
|
// 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.
|
// 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.
|
// e.g. 33 + 97 is hard because 7 + 3 = 10, carry the 1, 9 + 3 + 1 = 13, 130.
|
||||||
EASY_ADDITION = 1,
|
EASY_ADDITION = 1,
|
||||||
@ -16,6 +17,12 @@ enum PROBLEM_TYPE
|
|||||||
HARD_SUBTRACTION,
|
HARD_SUBTRACTION,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum INPUT_STYLE
|
||||||
|
{
|
||||||
|
INPUT_PREPEND = 1,
|
||||||
|
INPUT_APPEND,
|
||||||
|
};
|
||||||
|
|
||||||
class Problem
|
class Problem
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -23,6 +30,8 @@ public:
|
|||||||
~Problem();
|
~Problem();
|
||||||
|
|
||||||
void Draw(bool selected);
|
void Draw(bool selected);
|
||||||
|
void Input(char character);
|
||||||
|
bool Correct() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Problem() = delete;
|
Problem() = delete;
|
||||||
@ -35,6 +44,10 @@ private:
|
|||||||
int number_top;
|
int number_top;
|
||||||
int number_bottom;
|
int number_bottom;
|
||||||
|
|
||||||
|
INPUT_STYLE input_style = INPUT_STYLE::INPUT_PREPEND;
|
||||||
|
int Input() const;
|
||||||
|
std::string input;
|
||||||
|
|
||||||
// Helper Functions:
|
// Helper Functions:
|
||||||
void GenerateNumbers(PROBLEM_TYPE type, unsigned short max_digits);
|
void GenerateNumbers(PROBLEM_TYPE type, unsigned short max_digits);
|
||||||
void GenerateWindow(unsigned win_x, unsigned win_y);
|
void GenerateWindow(unsigned win_x, unsigned win_y);
|
||||||
|
Loading…
Reference in New Issue
Block a user