File indexing completed on 2022-12-06 18:52:35

0001 /*
0002     Task.h  -  class Task
0003     SPDX-FileCopyrightText: 2001 Sebastian Stein <seb.kde@hpfsc.de>
0004     SPDX-FileCopyrightText: 2008 Tiago Porangaba <tiago.porangaba@ltia.fc.unesp.br>
0005     SPDX-FileCopyrightText: 2008 Tadeu Araujo <tadeu.araujo@ltia.fc.unesp.br>
0006     SPDX-FileCopyrightText: 2008 Danilo Balzaque <danilo.balzaque@ltia.fc.unesp.br>
0007 
0008     SPDX-License-Identifier: GPL-2.0-or-later
0009 */
0010 
0011 #ifndef TASK_H
0012 #define TASK_H
0013 
0014 #include "Ratio.h"
0015 #include "PrimeNumber.h"
0016 
0017 #include <vector>
0018 #include <QTextStream>
0019 
0020 /** important for add_sub and mul_div */
0021 #define YES 1
0022 #define NO  0
0023 
0024 /** important for op_vector */
0025 #define ADD 0
0026 #define SUB 1
0027 #define MUL 2
0028 #define DIV 3
0029 
0030 /** to mark a prime factor as used or unused */
0031 #define UNUSED 0
0032 #define USED    1
0033 
0034 /** Structure represents a prime factor.
0035  *  Structure stores a prime factor and its usage status. The factor is marked
0036  *  as used or unused.
0037  **/
0038 typedef struct PRIME_FACTOR {
0039     /** the prime factor */
0040     int factor;
0041 
0042     /** the status of the prime factor (used or unused) */
0043     short flag;
0044 }
0045 Tprime_factor;
0046 
0047 /** we use the vector template class to create 3 dynamic types */
0048 typedef QVector<Ratio> RatioArray;
0049 typedef QVector<short> ShortArray;
0050 typedef QVector<Tprime_factor> PrimeFactorArray;
0051 
0052 /*! class to handle mathematical tasks with ratios
0053  *  naming:
0054  *  - a task has at least 2 ratios
0055  *  - a task has at least 1 operation
0056  *
0057  *  \author Sebastian Stein */
0058 class Task
0059 {
0060 public:
0061     /** constructor */
0062     Task();
0063 
0064     /** destructor */
0065     ~Task();
0066 
0067     /** automatically generate a new task with the given parameters */
0068     void create_task(unsigned int pmax_md = 10, short pnr_ratios = 2,
0069                      short padd_add = YES, short padd_div = NO, short padd_mult = NO, short padd_sub = NO);
0070 
0071     /** set ratio n */
0072     void set_ratio_n(unsigned short number = 0, int numerator = 0,
0073                      int denominator = 1);
0074 
0075     /** set ratio n */
0076     void set_ratio_n(unsigned short number, const Ratio &fraction);
0077 
0078     /** returns ration n */
0079     Ratio get_ratio_n(unsigned short number = 0) const;
0080 
0081     /** set operation n */
0082     void set_op_n(unsigned short number = 0, short operation = ADD);
0083 
0084     /** return operation n */
0085     short get_op_n(unsigned short number = 0) const;
0086 
0087     /** add a ratio to the end of the task */
0088     void add_ratio(const Ratio &new_ratio);
0089 
0090     /** add a ratio to the end of the task */
0091     void add_ratio(int numerator = 0, int denominator = 1);
0092 
0093     /** add an operation at the end of the task */
0094     void add_operation(short operation = ADD);
0095 
0096     /** display the whole task, mainly for debug */
0097     QTextStream & display(QTextStream & str);
0098 
0099     /** solves the task and returns the result as ratio */
0100     Ratio solve();
0101 
0102     /** returns the number of ratios in the vector */
0103     int getNumberOfRatios() const;
0104 
0105     /** returns the number of operations in the vector */
0106     int getNumberOfOperations() const;
0107 
0108     /** removes all ratios and operations from the given task */
0109     void clean();
0110 
0111 private:
0112     /** the ratio vector */
0113     RatioArray ratio_vector;
0114 
0115     /** the operation vector, smaller by one than ratio_vector */
0116     ShortArray op_vector;
0117 
0118     /** the prime factor vector is used to store all prime factors of the
0119      * main denominator */
0120     PrimeFactorArray prim_fac_vector;
0121 
0122     /** this function is needed by solve() */
0123     Ratio product(RatioArray::iterator & ratio_pointer,
0124                   ShortArray::iterator & op_pointer);
0125 
0126     /** generate the operations randomly; return how many mul or div
0127      * are in one block */
0128     unsigned short make_operation(short padd_add = YES, short padd_div = NO,
0129                                   short padd_mult = NO, short padd_sub = NO,
0130                                   short pnr_ratios = 0);
0131 
0132     /** find a denominator for the task */
0133     int make_main_dn(unsigned int pmax_md, unsigned short max_product_length);
0134 
0135     /** returns the count number's prime factors  */
0136     unsigned short prim_factor_nr(int number = 1);
0137 
0138     /** set the numerators randomly */
0139     void make_numerators(int main_denominator, short pnr_ratios);
0140 
0141     /** create the ratios' denominators */
0142     void make_denominators(int main_denominator = 0, short pmax_md = 0,
0143                            short padd_div = NO, short padd_mult = NO);
0144 };
0145 
0146 
0147 /* ------ some prototypes of non class functions ------ */
0148 
0149 /** it is possible to code: cout << task_object << endl; */
0150 QTextStream & operator<< (QTextStream & str, Task & ptask);
0151 
0152 #endif