diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/parser.c | 14 | ||||
-rw-r--r-- | lib/polynom.c | 51 |
2 files changed, 51 insertions, 14 deletions
diff --git a/lib/parser.c b/lib/parser.c index ef3f0e9..3483d1e 100644 --- a/lib/parser.c +++ b/lib/parser.c @@ -208,8 +208,8 @@ void parse_line(char *line) exception(1, _("Invalid binary operator")); } } - while ((get_pri(get_last_op()) >= get_pri(buffer[0])) - && ((get_last_op() & 127) != '(')) { + while (((get_pri(get_last_op()) >= get_pri(buffer[0])) + && ((get_last_op() & 127) != '(')) && !global_error) { act_pile(get_func(pop_op())); got_unary = 0; } @@ -226,7 +226,7 @@ void parse_line(char *line) switch (buffer[0]) { case ';': /* Equivalent a fin de ligne */ - while (pileop_pos) { + while ((pileop_pos) && !global_error) { op = pop_op(); if (op == '(') exception(1, _("Parse error: too much left parenthesis")); @@ -236,7 +236,7 @@ void parse_line(char *line) break; case ')': /* Fin de parenthese (Appel de fonction ou expression mathématique) */ - while (1) { + while (!global_error) { if (!pileop_pos) exception(1, _("Parse error: too much right parenthesis")); op = pop_op(); @@ -271,4 +271,10 @@ void parse_line(char *line) popcontext(); } popcontext(); + if (global_error) { + got_unary = 0; + while (pileop_pos) { + pop_op(); + } + } } diff --git a/lib/polynom.c b/lib/polynom.c index 8478531..472eb24 100644 --- a/lib/polynom.c +++ b/lib/polynom.c @@ -222,21 +222,52 @@ polynome ply_multiplication(polynome poly1, polynome poly2) return resultat; } -polynome ply_division(polynome poly1, polynome poly2) +polynome ply_division(polynome dividende, polynome diviseur) { /* division de deux polynomes */ - polynome result = NULL; - - - return result; - - + polynome interdividende = dividende, interdiviseur = NULL, inter = NULL, reste = dividende, resultat = NULL, r = NULL; + + printf("On divise %s", ply_affichage(dividende)); + printf("par %s\n", ply_affichage(diviseur)); + printf("interdividende degre = %u\n", interdividende->degre); + printf("diviseur degre = %u\n", diviseur->degre); + while ((interdividende) && (interdividende->degre >= diviseur->degre)) { + inter = ply_constr(rat_division(dividende->coef, diviseur->coef), dividende->degre - diviseur->degre); + printf("On trouve qu'il nous faut soustraire %s fois\n", ply_affichage(inter)); + r = ply_addition(resultat, inter); + printf("Resultat intermédiaire %s\n", ply_affichage(r)); + interdiviseur = ply_multiplication(diviseur, inter); + printf("On soustrait donc %s\n", ply_affichage(interdiviseur)); + reste = ply_soustraction(interdividende, interdiviseur); + printf("Reste intermédiaire %s\n", ply_affichage(reste)); + ply_destruct(resultat); + ply_destruct(inter); + ply_destruct(interdividende); + ply_destruct(interdiviseur); + resultat = r; + interdividende = reste; + } + + return resultat; } -polynome ply_modulo(polynome poly1, polynome poly2) +polynome ply_modulo(polynome dividende, polynome diviseur) { /* reste de la division de deux polynomes */ - polynome result = NULL; + polynome interdividende = dividende, interdiviseur = NULL, inter = NULL, reste = dividende, resultat = NULL, r = NULL; - return result; + while (interdividende->degre >= diviseur->degre) { + inter = ply_constr(rat_division(dividende->coef, diviseur->coef), dividende->degre - diviseur->degre); + interdiviseur = ply_multiplication(diviseur, inter); + r = ply_addition(resultat, inter); + reste = ply_soustraction(interdividende, interdiviseur); + ply_destruct(resultat); + ply_destruct(inter); + ply_destruct(interdividende); + ply_destruct(interdiviseur); + resultat = r; + interdividende = reste; + } + + return reste; } polynome ply_exposant(polynome poly, unsigned int exp) |