1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
|
procedure arbre.Remplit(courant: noeud; s: string; signe1, signe2: char);
var g1, d1: string;
sig1: char;
function nb_elems(s: string; var g, d: string; s1, s2: char; var sig: char): integer;
var trouve: boolean;
p, nb: integer;
begin // on extrait la partie gauche et droite, séparées par s1 ou s2
p := length(s) + 1; nb := 0; // en faisant attention aux parenthèses, s'il y en a
repeat
dec(p);
if s[p] = '(' then dec(nb);
if s[p] = ')' then inc(nb);
trouve := (nb = 0) and ((s[p] = s1) or (s[p] = s2));
until (p = 1) or (trouve);
if p > 1 then // deux ou plusieurs elements; mais dans un arbre binaire il y en a 2
begin
d := copy(s, p + 1, length(s));
g := copy(s, 1, p - 1);
sig := s[p];
nb_elems := 2;
end
else // un seul élément
begin
d := s;
g := '';
sig := #0;
nb_elems := 1;
end;
end;
procedure traiter_sans_parentheses(courant: noeud; s: string; signe1, signe2: char);
var g2, d2: string;
sig2: char;
begin
if nb_elems(s, g2, d2, signe1, signe2, sig2) = 2 then // deux termes ou plus
begin
courant.FilsDroit := noeud.create;
traiter_sans_parentheses(courant.FilsDroit, d2, '*', '/');
courant.op := sig2;
courant.FilsGauche := noeud.create;
traiter_sans_parentheses(courant.FilsDroit, g2, signe1, signe2);
end
else
if nb_elems(s, g2, d2, '*', '/', sig2) = 2 then
traiter_sans_parentheses(courant, s, '*', '/')
else
begin
courant.op := 'c'; // c pour "chiffre"
courant.valeur := strToInt(s);
end;
end;
begin
if nb_elems(s, g1, d1, signe1, signe2, sig1) = 2 then // deux termes ou plus
begin
courant.FilsDroit := noeud.create;
remplit(courant.FilsDroit, d1, '*', '/');
courant.op := sig1;
courant.FilsGauche := noeud.create;
remplit(courant.FilsGauche, g1, signe1, signe2);
end
else // un seul terme
if nb_elems(s, g1, d1, '*', '/', sig1) = 2 then // un terme pour l'addition mais
remplit(courant, s, '*', '/') // plusieurs pour la multiplication : 2*3*(-5)
else
if d1[1] = '(' then // ou bien une seule parenthèse, ex : (2+3)
begin
courant.op := '(';
courant.FilsDroit := noeud.create;
d1 := copy(d1, 2, length(d1) - 2); // on supprime les parenthèses
Remplit(courant.FilsDroit, d1, '+', '-')
end
else // ou bien un seul nombre
traiter_sans_parentheses(courant, d1, '+', '-'); // --->>> je ne comprends pas ici
end; |
Partager