Je suis actuellement sur un projet ADA utilisant les arbres n-aires. Pour le moment, j'arrive à afficher sur le terminal l'arbre test de cette façon :
où 11 est le premier fils de 1, 10 9 8 7 sont les frères de 11, 6 est le premier fils 7, 5 est le premier fils de 6, 4 3 2 sont les frères de 5 et 13 12 sont les frères de 1.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 1 11 10 9 8 7 6 5 4 3 2 13 12
ceci est réalisé avec le code suivant via une procedure An_Afficher qui appelle une fonction auxiliaire An_Afficher_Aux qui est récursive :
avec la fonction ecrire qui est :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 ------------------------------------------------------------------- ---- procedure An_Afficher : affiche le contenu complet de l'arbre ---- paramètres: arbre n-aire a ---- post-conditions: si l'arbre est vide, on leve l'exception arbre_vide ------------------------------------------------------------------- procedure An_Afficher( a: in arb_nr ) is begin if An_Vide(a) then raise arbre_vide; else An_Afficher_Aux(a,""); end if; end An_Afficher; --------------------------------------------------------------------- ---- procedure An_Afficher_aux : procédure récursive qui affiche les ---- valeurs de tous les fils et tous les freres. ---- parametres: arbre n-aire a ------------------------------------------------------------------ procedure An_Afficher_Aux( a: in arb_nr ; str_decal: in string ) is begin if a=null then null; else put(str_decal); -- ecrire la valeur courante ecrire(a.val); -- on affiche le fils An_Afficher_Aux(a.premier_fils,str_decal&" "); -- on affiche le frere An_Afficher_Aux(a.frere,str_decal); end if; end An_Afficher_Aux;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 procedure ecrire( a: in integer) is begin put(a); new_line; end ecrire_int;
Maintenant, j'aimerais afficher l'arbre en y ajoutant les caractères "|" et "+--" pour mieux voir la filiation; ça donnerait pour l'arbre test :
Malheureusement, je n'y arrive pas, un peu perdu dans la récursivité. J'ai essayé avec la procédure suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 1 | +--11 | 10 | 9 | 8 | 7 | | | +--6 | | | +--5 | 4 | 3 | 2 13 12
et avec An_Vide qui teste si un arbre est vide.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 procedure An_Afficher_Aux( a: in arb_nr ; str_decal: in string ) is begin if a=null then null; else put(str_decal); ecrire(a.val); if (not An_Vide(a.premier_fils)) then put(str_decal&"| "); put(str_decal&"+--"); end if; -- on affiche le fils An_Afficher_Aux(a.premier_fils,str_decal&" "); -- on affiche le frere An_Afficher_Aux(a.frere,str_decal); end if; end An_Afficher_Aux;
mais ça ne me donne pas le résultat attendu :
Au passage, impossible aussi de coller la première valeur à gauche du terminal (la valeur 1), comment fait-on pour forcer le put au début de la ligne ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 1 | +-- 11 10 9 8 7 | +-- 6 | +-- 5 4 3 2 13 12
Si quelqu'un pouvait m'aider pour cet affichage, ça serait sympa !
Partager