1 ------------------------------------------------------------------------------------------------
2 -- Nom : Power_List / fait partie du programme Power Fractal --
4 -- Auteurs : Gregory Burri & Adrien Crivelli --
5 ------------------------------------------------------------------------------------------------
6 -- But : Outils pour creer et gerer des liste de fractals --
7 ------------------------------------------------------------------------------------------------
9 with Power_Types
; use Power_Types
;
10 with Ada
.Unchecked_Deallocation
;
12 package body Power_List
is
14 ------------------------------------------------------------------------------------------------
16 -- But : Ajouter une fractal a la suite de la liste --
17 -- Parametres ----------------------------------------------------------------------------------
18 -- In : * La liste de fractals --
19 -- * La Fractal A Ajouter --
20 ------------------------------------------------------------------------------------------------
21 procedure Ajouter (Liste_Fractals
: in out T_Liste_Fractals
; Fractal
: Cara_Fractal
) is
23 --Pour pouvoir parcourir la liste
24 Pointeur
: T_Lien
:= Liste_Fractals
.Tete
;
28 if Liste_Fractals
.Tete
= null then
30 Liste_Fractals
.Tete
:= new T_Fractal
'(Fractal, null);
34 while Pointeur.Suiv /= null loop
35 Pointeur := Pointeur.Suiv;
38 Pointeur.Suiv := new T_Fractal'(Fractal
, null);
42 Liste_Fractals
.Nb_Fractals
:= Liste_Fractals
.Nb_Fractals
+ 1;
46 ------------------------------------------------------------------------------------------------
48 -- But : Effacer une fractal de la liste --
49 -- Parametres ----------------------------------------------------------------------------------
50 -- In : * La liste de fractals --
51 -- * Le numeros de la fractal a effacer : Num --
52 ------------------------------------------------------------------------------------------------
53 procedure Effacer (Liste_Fractals
: in out T_Liste_Fractals
; Num
: Natural) is
55 --Pour pouvoir parcourir la liste
56 Pointeur
: T_Lien
:= Liste_Fractals
.Tete
;
57 Pointeur_Avant
: T_Lien
:= Liste_Fractals
.Tete
;
59 procedure Liberer
is new Ada
.Unchecked_Deallocation ( T_Fractal
, T_Lien
);
63 --Si la liste ne comporte qu'un seul element alors propage une erreur
64 if Liste_Fractals
.Nb_Fractals
= 1 then
65 raise Liste_Une_Fractal
;
68 --Si l'element a supprimer est le premier de la liste alors
70 Liste_Fractals
.Tete
:= Liste_Fractals
.Tete
.Suiv
; --La tete pointe sur le deuxieme element
74 --Pointeur pointe sur le deuxieme element de la liste
75 Pointeur
:= Liste_Fractals
.Tete
.Suiv
;
77 --Cherche l'element numero 'num'
80 --Decale les pointeurs
81 Pointeur_Avant
:= Pointeur
;
82 Pointeur
:= Pointeur
.Suiv
;
85 --Si pas trouve alors propage une erreur
86 if Pointeur
= null then raise Fractal_Inexistante
; end if;
90 Pointeur_Avant
.Suiv
:= Pointeur
.Suiv
; --Refais le lien en sautant l'element a supprimer
91 Liberer(Pointeur
); --Efface de la memoire l'element a supprimer
95 --Un element a ete enleve :
96 Liste_Fractals
.Nb_Fractals
:= Liste_Fractals
.Nb_Fractals
- 1;
101 ------------------------------------------------------------------------------------------------
102 -- Nom : Fractal_Num --
103 -- But : Retourner un pointeur sur la fractal correspondante a un numeros --
104 -- Parametres ----------------------------------------------------------------------------------
105 -- In : * La liste de fractals --
106 -- * Le numeros de la fractal a chercher : Num --
108 -- return : * Le pointeur sur La fractal correspondante au numero --
109 ------------------------------------------------------------------------------------------------
110 function Fractal_Num (Liste_Fractals
: T_Liste_Fractals
; Num
: Natural) return T_Lien
is
112 Pointeur
: T_Lien
:= Liste_Fractals
.Tete
; --Pour pouvoir parcourir la liste
118 --Si pas trouve alors propage une erreur
119 if Pointeur
= null then raise Fractal_Inexistante
; end if;
120 Pointeur
:= Pointeur
.Suiv
; --Decale le pointeur
124 return Pointeur
; --Retourne la fractal trouvee
129 ------------------------------------------------------------------------------------------------
130 -- Nom : Vider_Liste --
131 -- But : vider completement la liste des fractals --
132 -- Parametres ----------------------------------------------------------------------------------
133 -- In-out : * La liste de fractals a vider --
134 ------------------------------------------------------------------------------------------------
135 procedure Vider_Liste(Liste_Fractals
: in out T_Liste_Fractals
) is
137 Pointeur
: T_Lien
; --Pour pouvoir parcourir la liste
138 procedure Liberer
is new Ada
.Unchecked_Deallocation ( T_Fractal
, T_Lien
);
142 --Efface tout les elements de la liste
143 while Liste_Fractals
.Tete
/= null loop
144 Pointeur
:= Liste_Fractals
.Tete
;
145 Liste_Fractals
.Tete
:= Liste_Fractals
.Tete
.Suiv
;
149 Liste_Fractals
.Nb_Fractals
:= 0;
153 ------------------------------------------------------------------------------------------------
154 -- Nom : Liste_Defaut --
155 -- But : Mettre dans la liste en parametre des fractals d'exemple --
156 -- Parametres ----------------------------------------------------------------------------------
157 -- In-out : * La liste de fractals a remplir --
158 ------------------------------------------------------------------------------------------------
159 function Liste_Defaut
return T_Liste_Fractals
is
160 Liste
: T_Liste_Fractals
;
164 --Les fractales par defaut
165 Ajouter(Liste
, Fractal_Initial_Mandel
);
166 Ajouter(Liste
, Fractal_Initial_Julia
);
169 --D'autre fractal exemple
170 Ajouter(Liste
, (Mandelbrot
, 4, 30, 4.0, 1.0/4.0, (-0.6, 0.0), 60.0,
171 ( (2,203,253), (0,0,255), (255,255,0), (0,0,0) ),
174 Ajouter(Liste
, (Julia
, 4, 40, 4.0, 1.0/4.0, (0.0, 0.0), -40.0,
175 ( (0,0,0), (247,91,43), (209,207,30), (255,12,0) ),
176 False, False, -0.277, 0.968));
178 Ajouter(Liste
, (Mandelbrot
, 4, 70, 4.0, 1.0/4.0, (-0.6, 0.0), -90.0,
179 ((180,200,255), (200,250,0), (0,0,255), (0,0,140) ),
182 Ajouter(Liste
, (Julia
, 4, 40, 4.0, 1.0/4.0, (0.0, 0.0), 0.0,
183 ( (255,0,0), (0,255,0), (0,0,255), (255,255,0) ),
184 False, False, 0.4, 0.02));
186 Ajouter(Liste
, (Mandelbrot
, 4, 33, 4.0, 87.0634, (0.4147, 0.1589), -46.0,
187 ( (0,0,0), (0,255,0), (0,0,255), (0,0,0) ),
190 Ajouter(Liste
, (Julia
, 4, 30, 1.2, 1.0/4.0, (0.0, 0.0), 0.0,
191 ( (237,89,173), (138,164,237), (0,0,255), (22,23,23) ),
192 False, False, 0.44, 0.2));
194 Ajouter(Liste
, (Mandelbrot
, 4, 180, 3.2, 10.2903, (-1.761, -0.0), -26.0,
195 ( (0,0,0), (0,255,0), (255,20,20), (0,0,0) ),
198 Ajouter(Liste
, (Julia
, 4, 80, 4.0, 1.0/4.0, (0.0, 0.0), 10.0,
199 ( (255,0,0), (0,255,0), (0,0,255), (255,255,0) ),
200 False, False, -0.757, -0.08));
202 Ajouter(Liste
, (Mandelbrot
, 4, 50, 2.3, 1.0/4.0, (-0.6, 0.0), 180.0,
203 ( (0,100,0), (34,55,0), (0,0,255), (0,32,244) ),
206 Ajouter(Liste
, (Julia
, 4, 50, 4.0, 1.026, (-0.3471, 0.4628), 0.0,
207 ( (255,0,0), (0,255,0), (0,0,255), (255,255,0) ),
208 False, False, 0.44, -0.14));
215 ------------------------------------------------------------------------------------------------
217 ------------------------------------------------------------------------------------------------
218 function Nb_Fractals (Liste_Fractals
: in T_Liste_Fractals
) return Natural is
222 return Liste_Fractals
.Nb_Fractals
;