fix polynomial to accept any exponents
This commit is contained in:
@@ -6,11 +6,12 @@
|
||||
* GLOBALS
|
||||
*/
|
||||
|
||||
bool debug_mode;
|
||||
char *input_g_err;
|
||||
s_token *tokens_g_err;
|
||||
s_term *terms_g_err;
|
||||
s_polynom *polynom_g_err;
|
||||
bool debug_mode;
|
||||
double *polynom_g_err;
|
||||
int polynom_len_g_err;
|
||||
|
||||
/**
|
||||
* PROGRAM
|
||||
@@ -81,16 +82,41 @@ static void terms_fill_null(s_term *terms, size_t terms_count_prediction)
|
||||
}
|
||||
}
|
||||
|
||||
static void polynom_fill_null(s_polynom *polynom)
|
||||
static int get_max_exponent(s_term *terms)
|
||||
{
|
||||
polynom->a = 0.0;
|
||||
polynom->b = 0.0;
|
||||
polynom->c = 0.0;
|
||||
int i;
|
||||
int max_exponent;
|
||||
|
||||
i = 0;
|
||||
max_exponent = 0;
|
||||
while (terms[i].position != TERM_END)
|
||||
{
|
||||
if (terms[i].exponent > max_exponent)
|
||||
{
|
||||
max_exponent = terms[i].exponent;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
|
||||
return max_exponent;
|
||||
}
|
||||
|
||||
static void polynom_fill_null(double *polynom, int len)
|
||||
{
|
||||
int i;
|
||||
|
||||
i = 0;
|
||||
while (i < len)
|
||||
{
|
||||
polynom[i] = 0.0;
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
static void launch_argv(char *input)
|
||||
{
|
||||
int ret;
|
||||
int max_exponent;
|
||||
size_t arg_len;
|
||||
size_t terms_count_prediction;
|
||||
|
||||
@@ -123,15 +149,18 @@ static void launch_argv(char *input)
|
||||
}
|
||||
|
||||
// reduce
|
||||
s_polynom polynom[1];
|
||||
max_exponent = get_max_exponent(terms) + 1;
|
||||
double polynom[max_exponent];
|
||||
polynom_g_err = polynom;
|
||||
polynom_fill_null(polynom);
|
||||
polynom_len_g_err = max_exponent;
|
||||
polynom_fill_null(polynom, max_exponent);
|
||||
reduce(terms, polynom);
|
||||
|
||||
// debug
|
||||
print_state();
|
||||
}
|
||||
|
||||
// trim spaces and quotes and newlines
|
||||
static void clean_copy_input(char *input, char *line)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
@@ -207,7 +207,7 @@ int parse(s_token *tokens, s_term *terms, int terms_count_max)
|
||||
term_position = TERM_LEFT;
|
||||
while (tokens[i].type != TOKEN_END && terms_count < terms_count_max)
|
||||
{
|
||||
ft_printf("- token[%i]\n", i); // debug
|
||||
// ft_printf("- token[%i]\n", i); // debug
|
||||
|
||||
// equal
|
||||
if (tokens[i].type == TOKEN_EQUAL)
|
||||
@@ -229,19 +229,19 @@ int parse(s_token *tokens, s_term *terms, int terms_count_max)
|
||||
sign = -1;
|
||||
}
|
||||
i += token_count;
|
||||
ft_printf("term[%i] get_sign: (%i)[%s], token_count: [%d]\n", terms_count, ret_sign, term_sign_to_str(ret_sign), token_count); // debug
|
||||
// ft_printf("term[%i] get_sign: (%i)[%s], token_count: [%d]\n", terms_count, ret_sign, term_sign_to_str(ret_sign), token_count); // debug
|
||||
|
||||
// coefficient
|
||||
double ret_coefficient = get_coefficient_absolute(tokens, i, &token_count);
|
||||
terms[terms_count].coefficient = ret_coefficient * sign;
|
||||
i += token_count;
|
||||
printf("term[%i] get_coefficient: [%g], token_count: [%d]\n", terms_count, ret_coefficient, token_count); // debug
|
||||
// printf("term[%i] get_coefficient: [%g], token_count: [%d]\n", terms_count, ret_coefficient, token_count); // debug
|
||||
|
||||
// exponent
|
||||
int ret_exponent = get_exponent(tokens, i, &token_count);
|
||||
terms[terms_count].exponent = ret_exponent;
|
||||
i += token_count;
|
||||
ft_printf("term[%i] get_exponent: [%i], token_count: [%d]\n", terms_count, ret_exponent, token_count); // debug
|
||||
// ft_printf("term[%i] get_exponent: [%i], token_count: [%d]\n", terms_count, ret_exponent, token_count); // debug
|
||||
|
||||
terms_count++;
|
||||
}
|
||||
|
||||
21
src/reduce.c
21
src/reduce.c
@@ -2,31 +2,26 @@
|
||||
|
||||
#include "computorv1.h"
|
||||
|
||||
void reduce(s_term *terms, s_polynom *polynom)
|
||||
void reduce(s_term *terms, double *polynom)
|
||||
{
|
||||
int i;
|
||||
int exponent;
|
||||
double tmp;
|
||||
|
||||
i = 0;
|
||||
while (terms[i].position != TERM_END)
|
||||
{
|
||||
// get coefficient with left sign
|
||||
tmp = terms[i].coefficient;
|
||||
if (terms[i].position == TERM_RIGHT)
|
||||
{
|
||||
tmp *= -1;
|
||||
}
|
||||
if (terms[i].exponent == 2)
|
||||
{
|
||||
polynom->a += tmp;
|
||||
}
|
||||
if (terms[i].exponent == 1)
|
||||
{
|
||||
polynom->b += tmp;
|
||||
}
|
||||
if (terms[i].exponent == 0)
|
||||
{
|
||||
polynom->c += tmp;
|
||||
}
|
||||
|
||||
// add coefficient to exponent
|
||||
exponent = terms[i].exponent;
|
||||
polynom[exponent] += tmp;
|
||||
|
||||
i++;
|
||||
}
|
||||
}
|
||||
@@ -61,7 +61,6 @@ static void print_context_terms()
|
||||
{
|
||||
int i;
|
||||
|
||||
ft_putchar_fd('\n', STDERR_FILENO);
|
||||
i = 0;
|
||||
while (terms_g_err[i].position != TERM_END)
|
||||
{
|
||||
@@ -97,9 +96,14 @@ static void print_context_terms()
|
||||
|
||||
static void print_context_polynom()
|
||||
{
|
||||
dprintf(STDERR_FILENO, "\npolynom[a]: %10g\n", polynom_g_err->a);
|
||||
dprintf(STDERR_FILENO, "polynom[b]: %10g\n", polynom_g_err->b);
|
||||
dprintf(STDERR_FILENO, "polynom[c]: %10g\n", polynom_g_err->c);
|
||||
int i;
|
||||
|
||||
i = 0;
|
||||
while (i < polynom_len_g_err)
|
||||
{
|
||||
dprintf(STDERR_FILENO, "polynom[%i]: %10g\n", i, polynom_g_err[i]);
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
void print_state()
|
||||
|
||||
Reference in New Issue
Block a user