159 lines
3.6 KiB
C
159 lines
3.6 KiB
C
/* printer.c */
|
|
|
|
#include "computorv1.h"
|
|
|
|
void print_debug(const char *description, ...)
|
|
{
|
|
if (!flag_debug_mode)
|
|
return;
|
|
|
|
// print the formatted description
|
|
va_list args;
|
|
va_start(args, description);
|
|
// ft_vdprintf(STDERR_FILENO, description, args); // it's not handling floats for the moment
|
|
vdprintf(STDERR_FILENO, description, args);
|
|
va_end(args);
|
|
}
|
|
|
|
/**
|
|
- [x] : ./computorv1 -b "3x² + 0x -0 = x"
|
|
Reduced form: 3x² - = 0
|
|
- [x] : ./computorv1 -b "3x² + 0x -7 = x"
|
|
Reduced form: 3x² - - 7 = 0
|
|
- [x] : ./computorv1 -b "-3x² + 2x -7 = x"
|
|
Reduced form: -+ x - 7 = 0
|
|
*/
|
|
static void print_reduced_form_beautify(s_polynom *polynom)
|
|
{
|
|
int i;
|
|
bool is_first_term;
|
|
double coefficient;
|
|
int exponent;
|
|
char *default_form;
|
|
|
|
default_form = "0 ";
|
|
ft_putstr("Reduced form: ");
|
|
|
|
i = 0;
|
|
is_first_term = true;
|
|
while (polynom[i].sign != TERM_SIGN_END)
|
|
{
|
|
coefficient = ft_fabs(polynom[i].coefficient);
|
|
exponent = polynom[i].exponent;
|
|
|
|
// if term is zero dont output
|
|
if (coefficient == 0.0)
|
|
{
|
|
i++;
|
|
continue;
|
|
}
|
|
|
|
// default_form is not nedded anymore since something will be printed
|
|
default_form = "";
|
|
|
|
// print sign
|
|
// don't output '+' if is first term
|
|
if (!(polynom[i].sign == TERM_PLUS && is_first_term))
|
|
{
|
|
ft_putchar(polynom[i].sign);
|
|
}
|
|
|
|
// print term
|
|
if (!is_first_term)
|
|
{
|
|
ft_putchar(' ');
|
|
}
|
|
|
|
// for x⁰
|
|
if (exponent == 0)
|
|
{
|
|
printf("%g ", coefficient);
|
|
}
|
|
|
|
// for x¹
|
|
if (exponent == 1)
|
|
{
|
|
if (coefficient == 1)
|
|
printf("x ");
|
|
if (coefficient > 1)
|
|
printf("%gx ", coefficient);
|
|
}
|
|
|
|
// for x²
|
|
if (exponent >= 2)
|
|
{
|
|
if (coefficient == 1)
|
|
printf("x%s ", ft_superscript(exponent + '0'));
|
|
if (coefficient > 1)
|
|
printf("%gx%s ", coefficient, ft_superscript(exponent + '0'));
|
|
}
|
|
fflush(stdout);
|
|
|
|
i++;
|
|
is_first_term = false;
|
|
}
|
|
ft_printf("%s= 0\n", default_form);
|
|
}
|
|
|
|
void print_reduced_form(s_polynom *polynom)
|
|
{
|
|
int i;
|
|
bool is_first_term;
|
|
|
|
if (flag_beautify_mode)
|
|
return print_reduced_form_beautify(polynom);
|
|
|
|
// reduced form
|
|
ft_putstr("Reduced form: ");
|
|
is_first_term = true;
|
|
i = 0;
|
|
while (polynom[i].sign != TERM_SIGN_END)
|
|
{
|
|
// print sign
|
|
// don't output '+' if is first term
|
|
if (!(polynom[i].sign == TERM_PLUS && is_first_term))
|
|
{
|
|
ft_putchar(polynom[i].sign);
|
|
}
|
|
|
|
// print term
|
|
if (!is_first_term)
|
|
{
|
|
ft_putchar(' ');
|
|
}
|
|
printf("%g * x^%i ", ft_fabs(polynom[i].coefficient), polynom[i].exponent);
|
|
fflush(stdout);
|
|
|
|
i++;
|
|
is_first_term = false;
|
|
}
|
|
ft_putstr("= 0\n");
|
|
}
|
|
|
|
void print_degree(s_polynom *polynom, int degree)
|
|
{
|
|
if (degree == 0)
|
|
{
|
|
if (polynom[0].coefficient == 0)
|
|
{
|
|
stop_errors("Any real number is a solution.\n");
|
|
}
|
|
else if (polynom[0].coefficient != 0)
|
|
{
|
|
stop_errors("No solution.\n");
|
|
}
|
|
}
|
|
else if (degree == 1)
|
|
{
|
|
ft_printf("Polynomial degree: %i\n", degree);
|
|
}
|
|
else if (degree == 2)
|
|
{
|
|
ft_printf("Polynomial degree: %i\n", degree);
|
|
}
|
|
else
|
|
{
|
|
ft_printf("Polynomial degree: %i\n", degree);
|
|
stop_errors("The polynomial degree is strictly greater than 2, I can't solve.\n");
|
|
}
|
|
} |