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.
tdeedu/kbruch/src/task.h

168 lines
4.8 KiB

/***************************************************************************
task.h - class task
-------------------
begin : Tue Nov 27 16:40:42 CET 2001
copyright : (C) 2001 by Sebastian Stein
email : seb.kde@hpfsc.de
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#ifndef TASK_H
#define TASK_H
#include "ratio.h"
#include "primenumber.h"
#include <vector>
/** important for add_sub and mul_div */
#define YES 1
#define NO 0
/** important for op_vector */
#define ADD 0
#define SUB 1
#define MUL 2
#define DIV 3
/** to mark a prime factor as used or unused */
#define UNUSED 0
#define USED 1
/** Structure represents a prime factor.
* Structure stores a prime factor and its usage status. The factor is marked
* as used or unused.
**/
typedef struct PRIME_FACTOR
{
/** the prime factor */
int factor;
/** the status of the prime factor (used or unused) */
short flag;
}
Tprime_factor;
/** we use the vector template class to create 3 dynamic types */
typedef TQValueVector<ratio> RatioArray;
typedef TQValueVector<short> ShortArray;
typedef TQValueVector<Tprime_factor> PrimeFactorArray;
/*! class to handle mathematical tasks with ratios
* naming:
* - a task has at least 2 ratios
* - a task has at least 1 operation
*
* \author Sebastian Stein */
class task
{
public:
/** constructor */
task();
/** destructor */
~task();
/** automatically generate a new task with the given parameters */
void create_task(unsigned int pmax_md = 10, short pnr_ratios = 2,
short padd_sub = YES, short pmul_div = NO);
/** set ratio n */
void set_ratio_n(unsigned short number = 0, int numerator = 0,
int denominator = 1);
/** set ratio n */
void set_ratio_n(unsigned short number = 0, ratio fraction = 0);
/** returns ration n */
ratio get_ratio_n(unsigned short number = 0) const;
/** set operation n */
void set_op_n(unsigned short number = 0, short operation = ADD);
/** return operation n */
short get_op_n(unsigned short number = 0) const;
/** add a ratio to the end of the task */
void add_ratio(ratio new_ratio = 0);
/** add a ratio to the end of the task */
void add_ratio(int numerator = 0, int denominator = 1);
/** add an operation at the end of the task */
void add_operation(short operation = ADD);
/** display the whole task, mainly for debug */
TQTextStream & display(TQTextStream & str);
/** solves the task and returns the result as ratio */
ratio solve();
/** returns the number of ratios in the vector */
int getNumberOfRatios() const;
/** returns the number of operations in the vector */
int getNumberOfOperations() const;
private:
/** max. size of main denominator */
int max_md;
/** how many ratios should the task have */
short nr_ratios;
/** are add/sub operations allowed */
short add_sub;
/** are mul/div operations allowed */
short mul_div;
/** the ratio vector */
RatioArray ratio_vector;
/** the operation vector, smaller by one than ratio_vector */
ShortArray op_vector;
/** the prime factor vector is used to store all prime factors of the
* main denominator */
PrimeFactorArray prim_fac_vector;
/** this function is needed by solve() */
ratio product(RatioArray::iterator & ratio_pointer,
ShortArray::iterator & op_pointer);
/** generate the operations randomly; return how many mul or div
* are in one block */
unsigned short make_operation(short padd_sub, short pmul_div,
short pnr_ratios);
/** find a denominator for the task */
int make_main_dn(unsigned int pmax_md, unsigned short max_product_length);
/** returns the count number's prime factors */
unsigned short prim_factor_nr(int number = 1);
/** set the numerators randomly */
void make_numerators(int main_denominator, short pnr_ratios);
/** create the ratios' denominators */
void make_denominators(int main_denominator, short pmax_md,
short pmul_div);
};
/* ------ some prototypes of non class functions ------ */
/** it is possible to code: cout << task_object << endl; */
TQTextStream & operator<<(TQTextStream & str, task & ptask);
#endif