ÏÏÏwith Ada.Text_Io,
Files;
ÏÞßàprocedure Test_Files is
Ïϧ
ÏϧÏïÏtype Type_Appareil
is ( __Planeur,
ÏϧÏÏÏ________________Cargo,
ÏϧÏÏÏ________________Commercial,
ÏϧÏÏÏ________________Chasseur,
ÏϧÏÏÏ________________Reconnaissance);
ÏÏ§ÏØÓìpackage Appareil_Io
is new Ada.Text_Io.Enumeration_Io ( Type_Appareil );
Ïϧ
ÏÏ§ÏØÓìpackage Naturel_Io is new Ada.Text_Io.Integer_Io
( Natural );
Ïϧ
ÏÏ§ÏØÓìpackage File_Appareil
is new Files ( Élément => Type_Appareil);
Ïϧ
ÏϧÏíÏFile_Pour_La_Piste : File_Appareil.File;
ÏϧÏíÏFile_Initiale : File_Appareil.File;
Ïϧ
ÏϧÏÛÜÝprocedure Imprimer ( La_File : in File_Appareil.File) is separate;
ÏϧÏÛÜÝfunction "=" (Gauche _: in File_Appareil.File;
ÏϧÏÏ§Ï ___Droite__:
in File_Appareil.File)
return Boolean
ÏϧÏÏ©Ï_________renames File_Appareil.Est_Égal;
Ïϧbegin
ÏϨ¹¹ÏFile_Appareil.Purger ( File_Pour_La_Piste);
ÏϨ¹¹±for Index in Type_Appareil
loop
ÏϧÏÏ7¹¹ÏFile_Appareil.Ajouter ( Index, À_La_File => File_Pour_La_Piste);
ÏϧÏϰend loop;
ÏϨ¹¹ÏFile_Appareil.Copier ( File_Pour_La_Piste,
File_Initiale);
ÏϨ¹¹ÏImprimer (File_Pour_La_Piste);
ÏϨ¹¹ÏFile_Appareil.Enlever ( File_Pour_La_Piste);
ÏϨ¹¹ÏFile_Appareil.Enlever ( File_Pour_La_Piste);
ÏϨ¹¹ÏFile_Appareil.Enlever ( File_Pour_La_Piste);
ÏϨ¹¹ÏAda.Text_Io.Put ( " La tête de la
file est :");
ÏϨ¹¹ÏAppareil_Io.Put (File_Appareil.Tête_De
(File_Pour_La_Piste));
ÏϨ¹¹ÏAda.Text_IO.New_Line;
ÏϨ¹¹ÏAda.Text_IO.Put ( " La longueur
de la file est : ");
ÏϨ¹¹ÏNaturel_IO.Put ( File_Appareil.Longueur_De
(File_Pour_La_Piste), width
=> 2);
ÏϨ¹¹ÏFile_Appareil.Purger ( File_Pour_La_Piste);
ÏϨ¹¹ÏAda.Text_IO.New_Line;
ÏϨ¹¹ÏAda.Text_IO.Put ( " La longueur
de la file après la purge est : ");
ÏϨ¹¹ÏNaturel_IO.Put ( File_Appareil.Longueur_De
(File_Pour_La_Piste), width
=> 2);
ÏϨ¹¹ÏAda.Text_IO.New_Line;
ÏϨ¹³´if File_Pour_La_Piste
/= File_Initiale
then
ÏϧÏ6¾¹¹ÏAda.Text_IO.Put_Line (" La File_Pour_La_Piste est différente de la File_Initiale");
Ïϧ϶Ïend if;
ÏÏ©end Test_Files;
ÏÞßàseparate ( Test_Files)
ÏϧÏprocedure Imprimer ( La_File : in File_Appareil.File) is
ÏϧÏíÏL_Appareil : File_Appareil.Pour_Itérer.Itérateur;
Ïϧbegin
ÏϨ¹¹ÏFile_Appareil.Pour_Itérer.Initialiser ( L_Appareil,
File_Pour_La_Piste);
ÏϨ¹¹ÏAda.Text_Io.Put_Line ( " Les appareils
en file pour la piste sont : ");
ÏϨ¹¹±while not File_Appareil.Pour_Itérer.Est_Fini
( L_Appareil ) loop
ÏϧÏÏ7¹¹ÏAppareil_IO.Put (File_Appareil.Pour_Itérer.Valeur_De
( L_Appareil ));
ÏϧÏÏ7¹¹ÏAda.Text_Io.New_Line;
ÏϧÏÏ7¹¹ÏFile_Appareil.Pour_Itérer.Aller_Suivant ( L_Appareil
);
ÏϧÏϰend loop;
ÏÏ©end Imprimer;
ÏØÙÚgeneric
ÏϧÏtype Élément is private;
ÏϧÏpackage Files is
ÏϧÏïÏtype Noeud is private;
ÏϧÏïÏtype Structure is access Noeud;
Ïϧ
ÏϧÏïÏtype File _ is limited private;
ÏϧÏÛÜÝprocedure Purger __( La_File__: in out File);
ÏϧÏÛÜÝprocedure Ajouter __( La_Valeur_: in Élément;
ÏϧÏÏ©Ï ______À_La_File_: in out File);
ÏϧÏÛÜÝprocedure Enlever __( La_File__: in out File);
ÏϧÏÛÜÝprocedure Copier_ __( De_La_File
_: in File;
ÏϧÏÏ©Ï _______À_La_File_: in out File);
ÏϧÏÛÜÝfunction Longueur_De
_( La_File : in File) return Natural;
ÏϧÏÛÜÝfunction Est_Vide __( La_File : in File) return Boolean;
ÏϧÏÛÜÝfunction Est_Égal
( Gauche _: in File;
ÏϧÏÏ©Ï ______ Droite __: in File) return Boolean;
ÏϧÏÛÜÝfunction Tête_De __( La_File : in File) return Élément;
ÏϧÏíÏDébordement, Épuisement_:
exception;
ÏÏ§ÏØÓìpackage Pour_Itérer
is
ÏϧÏϧÏïÏsubtype Itérateur
is Structure;
ÏϧÏϧÏÛÜÝprocedure Initialiser _( L_Itérateur __: in out Itérateur;
ÏϧÏϧÏÏ©Ï ______ Avec_La_File
_: in_File );
ÏϧÏϧÏÛÜÝprocedure Aller_Suivant(
L_Itérateur_: in out Itérateur);
ÏϧÏϧÏÛÜÝfunction Valeur_De__(
L_Itérateur_: in
Itérateur) return Élément;
ÏϧÏϧÏÛÜÝfunction Est_Fini__(
L_Itérateur_: in Itérateur)
return Boolean;
ÏϧÏϧÏíÏErreur_Itérateur : exception;
ÏϧÏÏ©end Pour_Itérer;
Ïϧprivate
ÏϧÏïÏtype File is
ÏϧÏÏÏÏÏÏrecord
ÏϧÏÏÏÏÏÏÏÏÏLa_Tête _: Structure;
ÏϧÏÏÏÏÏÏÏÏÏLa_Queue_: Structure;
ÏϧÏÏÏÏÏÏend record;
ÏϧÏïÏtype Noeud is
ÏϧÏÏÏÏÏÏrecord
ÏϧÏÏÏÏÏÏÏÏÏL_Élément _: Élément;
ÏϧÏÏÏÏÏÏÏÏÏSuivant _: Structure;
ÏϧÏÏÏÏÏÏend record;
ÏÏ©end Files;
ÏÏÏwith Ada.Unchecked_Deallocation;
ÏÕÖ×package body Files is
Ïϧ
ÏϧÏÕÖ×package body Pour_Itérer
is
ÏϧÏϧ
ÏϧÏϧÏÞßàprocedure Initialiser _( L_Itérateur __: in out Itérateur;
ÏϧÏϧÏÏ§Ï Avec_La_File
_: in_File) is
ÏϧÏϧÏϧbegin
ÏϧÏϧÏϨ¹¹ÏL_Itérateur := Itérateur (Avec_La_File.La_Tête);
ÏϧÏϧÏÏ©end Initialiser;
ÏϧÏϧ
ÏϧÏϧÏÞßàprocedure Aller_Suivant
( L_Itérateur _: in out Itérateur)
is
ÏϧÏϧÏϧbegin
ÏϧÏϧÏϨ¹¹ÏL_Itérateur := Itérateur (L_Itérateur.Suivant);
ÏϧÏϧÏϧÏðîìexception
ÏϧÏϧÏϧÏϧ
ÏϧÏϧÏϧÏϨ¹³´when Constraint_Error
=>
ÏϧÏϧÏϧÏϩ϶¾êîìraise Erreur_Itérateur;
ÏϧÏϧÏÏ©end Aller_Suivant;
ÏϧÏϧ
ÏϧÏϧÏÞßàfunction Valeur_De
( L_Itérateur : in Itérateur
) return Élément is
ÏϧÏϧÏϧbegin
ÏϧÏϧ¹Ĺ¹Ïreturn L_Itérateur.L_Élément;
ÏϧÏϧÏϧÏðîìexception
ÏϧÏϧÏϧÏϨ¹³´when Constraint_Error
=>
ÏϧÏϧÏϧÏϩ϶¾êîìraise Erreur_Itérateur;
ÏϧÏϧÏÏ©end Valeur_De;
ÏϧÏϧ
ÏϧÏϧÏÞßàfunction Est_Fini
( L_Itérateur : in Itérateur
) return Boolean
is
ÏϧÏϧÏϧbegin
ÏϧÏϧ¹Ĺ¹Ïreturn (L_Itérateur
= null);
ÏϧÏϧÏÏ©end Est_Fini;
ÏϧÏϧ
ÏϧÏÏ©end Pour_Itérer;
Ïϧ
ÏϧÏÞßàprocedure Purger _(La_File__: in out File) is
ÏϧÏϧÏíÏCourant, Pointeur_Courant
: Pour_Itérer.Itérateur;
ÏϧÏϧÏÛÜÝprocedure Delete
is new Ada.Unchecked_Deallocation ( _Object __=> Noeud ,
ÏϧÏϧÏÏ©Ï _______________________Name __=> Pour_Itérer.Itérateur
);
ÏϧÏϧbegin
ÏϧÏϨ¹³´if La_File.La_Tête
/= La_File.La_Queue then
ÏϧÏϧÏ6¨¹¹ÏPour_Itérer.Initialiser ( Courant, Avec_La_File => La_File);
ÏϧÏϧÏ6¾¹¹±while not Pour_Itérer.Est_Fini
( Courant ) loop
ÏϧÏϧÏ6ÏÏÏ7¹¹ÏPointeur_Courant := Courant;--
ÏϧÏϧÏ6ÏÏÏ7¹¹ÏPour_Itérer.Aller_Suivant ( Courant );
ÏϧÏϧÏ6ÏÏÏ7¹¹ÏDelete (Pointeur_Courant);
ÏϧÏϧÏ6ÏÏϰend loop;
ÏϧÏϧ϶Ïend if;
ÏϧÏϨ¹¹ÏLa_File := File'( La_Tête _=> null,
ÏϧÏϧÏÏÏÏÏÏ La_Queue _=> null);
ÏϧÏÏ©end Purger;
Ïϧ
ÏϧÏÞßàprocedure Ajouter (_La_Valeur_: in Élément;
ÏϧÏÏ§Ï À_La_File_:
in out File) is
ÏϧÏϧbegin
ÏϧÏϨ¹³´if À_La_File.La_Tête
= null then
ÏϧÏϧÏ6¨¹¹ÏÀ_La_File.La_Tête := new Noeud'(_L_Élément_=>
La_Valeur,
ÏϧÏϧÏ6§ÏÏÏÏÏÏ Suivant__=> null);
ÏϧÏϧÏ6¾¹¹ÏÀ_La_File.La_Queue := À_La_File.La_Tête;
ÏϧÏϧÏö´else
ÏϧÏϧϸ¨¹¹ÏÀ_La_File.La_Queue.Suivant := new Noeud'( L_Élément => La_Valeur,
ÏϧÏϧϸ§ÏÏÏÏÏÏ
Suivant => null);
ÏϧÏϧϸ¾¹¹ÏÀ_La_File.La_Queue ___ := À_La_File.La_Queue.Suivant;
ÏϧÏϧÏÈÏend if;
ÏϧÏϧÏðîìexception
ÏϧÏϧÏϨ¹³´when STORAGE_ERROR =>
ÏϧÏϧÏϩ϶¾êîìraise Débordement;
ÏϧÏÏ©end Ajouter;
Ïϧ
ÏϧÏÞßàprocedure Copier ( De_La_File : in File;
ÏϧÏÏ§Ï À_La_File : in out File) is
ÏϧÏϧÏíÏDe_L_Index_: Structure := De_La_File.La_Tête;
ÏϧÏϧÏíÏÀ_L_Index_: Structure;
ÏϧÏϧbegin
ÏϧÏϨ¹³´if De_La_File.La_Tête
= null then
ÏϧÏϧÏ6¨¹¹ÏÀ_La_File.La_Tête ___:= null;
ÏϧÏϧÏ6¾¹¹ÏÀ_La_File.La_Queue _:= null;
ÏϧÏϧÏö´else
ÏϧÏϧϸ¨¹¹ÏÀ_La_File.La_Tête ___:= new Noeud' ( _L_Élément__=> De_L_Index.L_Élément,
ÏϧÏϧϸ§ÏÏÏÏÏÏ ___ _________Suivant____=>
null);
ÏϧÏϧϸ¨¹¹ÏÀ_La_File.La_Queue _:= À_La_File.La_Tête;
ÏϧÏϧϸ¨¹¹ÏÀ_L_Index ____:= À_La_File.La_Tête;
ÏϧÏϧϸ¨¹¹ÏDe_L_Index__ _____:= De_L_Index.Suivant;
ÏϧÏϧϸ¾¹¹±while De_L_Index /= null loop
ÏϧÏϧϸÏÏÏ7¹¹ÏÀ_L_Index.Suivant := new Noeud'( L_Élément => De_L_Index.L_Élément,
ÏϧÏϧϸÏÏÏ5ÏÏÏÏÏÏ ___________Suivant _=> null);
ÏϧÏϧϸÏÏÏ7¹¹ÏÀ_L_Index _______:= À_L_Index.Suivant;
ÏϧÏϧϸÏÏÏ7¹¹ÏDe_L_Index _______:= De_L_Index.Suivant;
ÏϧÏϧϸÏÏÏ7¹¹ÏÀ_La_File.La_Queue _:= À_L_Index;
ÏϧÏϧϸÏÏϰend loop;
ÏϧÏϧÏÈÏend if;
ÏϧÏϧÏðîìexception
ÏϧÏϧÏϨ¹³´when Storage_Error
=>
ÏϧÏϧÏϩ϶¾êîìraise Débordement;
ÏϧÏÏ©end Copier;
Ïϧ
ÏϧÏÞßàprocedure Enlever ( La_File_: in out File) is
ÏϧÏϧÏÛÜÝprocedure Delete
is new Ada.Unchecked_Deallocation ( _Object __=> Noeud ,
ÏϧÏϧÏÏ©Ï
______________________Name __=> Structure
);
ÏϧÏϧÏíÏÀ_Enlever : Structure := La_File.La_Tête;
ÏϧÏϧbegin
ÏϧÏϨ¹¹ÏLa_File.La_Tête := La_File.La_Tête.Suivant;
ÏϧÏϨ¹¹ÏDelete ( À_Enlever);
ÏϧÏϨ¹³´if La_File.La_Tête
= null then
ÏϧÏϧÏ6¾¹¹ÏLa_File.La_Queue := null;
ÏϧÏϧ϶Ïend if;
ÏϧÏϧÏðîìexception
ÏϧÏϧÏϨ¹³´when Constraint_Error
_=>
ÏϧÏϧÏϩ϶¾êîìraise Épuisement;
ÏϧÏÏ©end Enlever;
Ïϧ
ÏϧÏÞßàfunction Longueur_De
(_La_File_: in File) return Natural
is
ÏϧÏϧÏíÏCompte _: Natural := 0;
ÏϧÏϧÏíÏIndex _: Structure _ := La_File.La_Tête;
ÏϧÏϧbegin
ÏϧÏϨ¹¹±while Index /= null loop
ÏϧÏϧÏÏ7¹¹ÏCompte := Compte + 1;
ÏϧÏϧÏÏ7¹¹ÏIndex := Index.Suivant;
ÏϧÏϧÏϰend loop;
Ïϧ¹Ĺ¹Ïreturn Compte;
ÏϧÏÏ©end Longueur_De;
Ïϧ
ÏϧÏÞßàfunction Est_Égal
( Gauche _: in File;
ÏϧÏÏ§Ï Droite __: in File) return Boolean
is
ÏϧÏϧÏíÏIndex_Gauche _: Structure := Gauche.La_Tête;
ÏϧÏϧÏíÏIndex_Droit _: Structure := Droite.La_Tête;
ÏϧÏϧbegin
ÏϧÏϨ¹¹±while Index_Gauche
/= null loop
ÏϧÏϧÏÏ7¹³´if Index_Gauche.L_Élément
/= Index_Droit.L_Élément then
Ïϧ¹ÄÏÏ5Ï6¾¹¹Ïreturn False;
ÏϧÏϧÏÏ5Ïö´else
ÏϧÏϧÏÏ5ϸ¨¹¹ÏIndex_Gauche := Index_Gauche.Suivant;
ÏϧÏϧÏÏ5ϸ¾¹¹ÏIndex_Droit := Index_Droit.Suivant;
ÏϧÏϧÏÏ5ÏÈÏend if;
ÏϧÏϧÏϰend loop;
Ïϧ¹Ĺ¹Ïreturn (Index_Droit
= null);
ÏϧÏϧÏðîìexception
ÏϧÏϧÏϨ¹³´when Constraint_Error
_=>
Ïϧ¹ÄÏϩ϶¾¹¹Ïreturn False;
ÏϧÏÏ©end Est_Égal;
Ïϧ
ÏϧÏÞßàfunction Est_Vide
( La_File : in File) return Boolean
is
ÏϧÏϧbegin
Ïϧ¹Ĺ¹Ïreturn (La_File.La_Tête
= null);
ÏϧÏÏ©end Est_Vide;
Ïϧ
ÏϧÏÞßàfunction Tête_De
( La_File : in File) return Élément is
ÏϧÏϧbegin
Ïϧ¹Ĺ¹Ïreturn La_File.La_Tête.L_Élément;
ÏϧÏϧÏðîìexception
ÏϧÏϧÏϨ¹³´when Constraint_Error
=>
ÏϧÏϧÏϩ϶¾êîìraise Épuisement;
ÏϧÏÏ©end Tête_De;
Ïϧ
ÏÏ©end Files;