• Aucun résultat trouvé

Compléter notre package (exercices) Cahier des charges

Dans le document Apprenez à programmer avec Ada (Page 69-72)

Pour l'heure, notre package ne contient pas grand chose : le type T_Vecteur et une procédure Put(). Nous allons donc le compléter, ce sera un excellent exercice pour appliquer tout ce que nous avons vu et cela nous fournira un package bien utile. De quoi avons-nous besoin ?

Des procédures d'affichage;

Des procédures de création;

Des fonctions de tri;

Des fonctions pour les opérations élémentaires.

Procédures d'affichage Code : Ada

PROCEDURE Put(T : IN T_Vecteur ; FORE : IN integer := 11) ;

Celle-là ne sera pas compliquée : nous l'avons déjà faite. Elle affiche les valeurs contenues dans un T_Vecteur T sur une même ligne. Fore indique le nombre de chiffres à afficher (Fore pour Before = Avant la virgule).

Code : Ada

PROCEDURE Put_line(T : IN T_Vecteur ; FORE : IN integer := 11) ;

Affiche les valeurs du T_Vecteur T comme Put() et retourne à la ligne.

Code : Ada

Partie 3 : Ada, les types composites 69/312

PROCEDURE Put_Column(T : IN T_Vecteur ; FORE : IN integer := 11 ; Index : IN Boolean := true) ;

Affiche les valeurs du T_Vecteur T comme Put() mais en retournant à la ligne après chaque affichage partiel. Le paramètre booléen Index indiquera si l'on souhaite afficher l'indice de la valeur affichée (le numéro de sa case).

Procédures de création Code : Ada

PROCEDURE Get(T : IN OUT T_Vecteur) ;

Permet à l'utilisateur de saisir au clavier les valeurs du T_Vecteur T. L'affichage devra être le plus sobre possible. Pas de « Veuillez vous donner la peine de saisir la 1ere valeur du T_Vecteur en question » :

Code : Ada

PROCEDURE Init(T : IN OUT T_Vecteur ; Val : IN integer := 0) ;

Initialise un tableau en le remplissant de 0 par défaut. Le paramètre Val permettra de compléter par autre chose que des 0.

Code : Ada

PROCEDURE Generate(T : IN OUT T_Vecteur ; Min : integer := integer'first ; Max : integer := integer'last) ;

Génère un T_Vecteur rempli de valeurs aléatoires comprises entre Min et Max. Il vous faudra ajouter le package Ada.Numerics.Discrete_random au début de votre fichier .adb !

Fonctions de tri Code : Ada

FUNCTION Tri_Selection(T : T_Vecteur) RETURN T_Vecteur ;

Pour l'heure, nous n'avons vu qu'un seul algorithme de tri de tableau : le tri par sélection (ou tri par extraction). Je vous invite donc à en faire un petit copier-coller-modifier. Mais il en existe de nombreux autres. Nous serons donc amenés à créer plusieurs fonctions de tri, d'où le nom un peu long de notre fonction. J'ai préféré le terme français cette fois (Select_Sort n'étant pas très parlant). Peut-être sera-t-il intéressant de créer également les fonctions RangMin ou Echanger pour un usage futur?

Opérations élémentaires

Les opérations ci-dessous seront détaillées dans la sous-partie « Vecteurs et calcul vectoriel ».

Code : Ada

FUNCTION Somme(T : T_Vecteur) RETURN integer ;

Renvoie la somme des éléments du T_Vecteur.

Code : Ada

FUNCTION "+"(Left,Right : T_Vecteur) RETURN T_Vecteur ;

Effectue la somme de deux T_Vecteurs. L'écriture très spécifique de cette fonction (avec un nom de fonction écrit comme un string et exactement deux paramètres Left et Right pour Gauche et Droite) nous permettra d'écrire par la suite T3 := T1 + T2 au lieu de T3 := +(T1,T2) ! On dit que l'on surcharge l'opérateur "+".

Code : Ada

FUNCTION "*"(Left : integer ; Right : T_Vecteur) RETURN T_Vecteur ;

Effectue le produit d'un nombre entier par un T_Vecteur.

Code : Ada

FUNCTION "*"(Left, Right : T_Vecteur) RETURN Integer ;

Effectue le produit scalaire de deux T_Vecteurs. Pas de confusion possible avec la fonction précédente car les paramètres ne sont pas de même type.

Code : Ada

FUNCTION Minimum(T : T_Vecteur) RETURN Integer ; FUNCTION Maximum(T : T_Vecteur) RETURN Integer ;

Renvoient respectivement le plus petit et le plus grand élément d'un T_Vecteur.

Solutions

Voici les packages Integer_Array.adb et Integer_Array.ads tels que je les ai écrits. Je vous conseille d'essayer de les écrire par vous-même avant de copier-coller ma solution, ce sera un très bon entraînement. Autre conseil, pour les opérations élémentaires, je vous invite à lire la sous-partie qui suit afin de comprendre les quelques ressorts mathématiques.

Integer_Array.adb :

Code : Ada - Integer_Array.adb

WITH Ada.Integer_Text_IO, Ada.Text_IO, Ada.Numerics.Discrete_Random ; USE Ada.Integer_Text_IO, Ada.Text_IO ; package body Integer_Array IS --Procédures PROCEDURE Put (

T : IN T_Vecteur;

Fore : IN Integer := 11) IS BEGIN

FOR I IN T'RANGE LOOP Put(T(I),Fore) ; put(" ; ") ; END LOOP ; END Put ;

PROCEDURE Put_Column ( T : IN T_Vecteur;

Fore : IN Integer := 11) IS

Partie 3 : Ada, les types composites 70/312

BEGIN subtype Random_Range is integer range min..max ;

Package Random_Array is new

function Tri_Selection(T : T_Vecteur) return T_Vecteur is function RangMin(T : T_Vecteur ; debut : integer ; fin : integer) return integer is

Rang : integer := debut ;

function Somme(T:T_Vecteur) return integer is S : integer := 0 ;

FUNCTION "+" (Left,Right : T_Vecteur) return T_Vecteur is T : T_Vecteur ;

FUNCTION "*" (Left,Right : T_Vecteur) return Integer is S : Integer := 0 ;

FUNCTION Maximum(T : T_Vecteur) return integer is max : integer := T(T'first) ;

Partie 3 : Ada, les types composites 71/312

--Définition des types et Taille : CONSTANT Integer := 10;

TYPE T_Vecteur IS ARRAY(1..Taille) OF Integer ;

--Procédures PROCEDURE Put (

T : IN T_Vecteur;

Fore : IN Integer := 11);

PROCEDURE Put_Column ( T : IN T_Vecteur;

Fore : IN Integer := 11);

PROCEDURE Put_Line ( T : IN T_Vecteur;

Fore : IN Integer := 11);

--Procédures de PROCEDURE Init (

T : OUT T_Vecteur;

Value : IN Integer := 0);

PROCEDURE Generate ( T : IN OUT T_Vecteur;

Min : IN Integer := Integer'First;

Max : IN Integer := Integer'Last);

PROCEDURE Get (

T : IN OUT T_Vecteur);

--Fonctions de

function Tri_Selection(T : T_Vecteur) return T_Vecteur ;

--Opérations

function Somme(T:T_Vecteur) return integer ; FUNCTION "+" (Left,Right : T_Vecteur) return T_Vecteur ; FUNCTION "*" (Left : integer ; Right : T_Vecteur) return T_Vecteur ;

FUNCTION "*" (Left,Right : T_Vecteur) return Integer ; FUNCTION Minimum(T : T_Vecteur) return integer ; FUNCTION Maximum(T : T_Vecteur) return integer ; END Integer_Array ;

Vous remarquerez que j'utilise autant que possible les attributs et agrégats. Pensez que vous serez amenés à réutiliser ce package régulièrement et sûrement aussi à modifier la longueur de nos tableaux T_Vecteur. Il ne faut pas que vous ayez besoin de relire toutes vos procédures et fonctions pour les modifier !

Vecteurs et calcul vectoriel (optionnel)

Dans le document Apprenez à programmer avec Ada (Page 69-72)