MIAGE CRÉTEIL: Algorithmique & Génie Logiciel avec ADA 1999 – 2008





Algorithmique & Génie Logiciel avec ADA






Une Introduction



Version 1.0 , le lundi 30 juillet 2007






La version la plus récente est disponible à http://www.dgaudry.com







Pour toute correspondance, utiliser : daniel@dgaudry.com




Download :



HTTP download open office version: VERSION OPEN OFFICE


HTTP download pdf version: Version PDF



Table des matières

1 Introduction au langage 8

2 La structure de base 8

2.1 ce qu'il faut savoir 8

2.1.1 Les mots réservés 8

2.1.2 Les attributs 8

2.1.3 Des noms créés par l'utilisateur 9

2.1.4 Des lignes de code 9

2.1.5 Des structures 9

2.1.6 Des opérateurs 9

2.2 création d'un programme 10

2.2.1 Le fichier texte contenant le code source 10

2.2.2 Zone 1 10

2.2.3 Zone 2 10

2.2.4 Zone 3 10

2.3 Le code source et sa traduction en exécutable 10

2.3.1 La compilation 10

2.3.2 Le link 10

2.3.3 L'éditeur 11

2.3.4 Un premier exemple 11

3 Les variables 11

3.1 Les différents types de variables 12

3.2 Les déclarations de type de variables et les déclarations de variables à partir de leur type 12

3.2.1 Les nombres constants 12

3.2.2 Les entiers 12

3.2.2.1 Integer ou long_integer 12

3.2.2.2 Range 13

3.2.2.3 Modulo 13

3.2.2.4 Positive 13

3.2.2.5 Natural 14

3.2.2.6 Les attributs applicables aux types entier ou dérivés 14

3.2.3 Les options pour les types 14

3.2.3.1 Subtype 15

3.2.3.2 New 15

3.2.3.3 Private 15

3.2.3.4 Limited private 15

3.2.3.5 Aliased 16

3.2.4 Les réels 16

3.2.4.1 Digits 16

3.2.4.2 Float ou long_float 16

3.2.4.3 Delta 16

3.2.4.4 Delta et digits 16

3.2.4.5 Les attributs applicables aux types float ou dérivés 17

3.2.5 Les booléens 17

3.2.6 Les caractères 17

3.2.6.1 La table ASCII 18

3.2.7 Les énumérations 19

3.2.8 Les tableaux et matrices 19

3.2.8.1 L'index et le contenu 19

3.2.8.2 Index de limites définies par des nombres 19

3.2.8.3 Index de limites définies par type 19

3.2.8.4 Index de limites définies par les limites d'un subtype 20

3.2.8.5 Exemples de matrices 20

3.2.9 Les chaînes de caractères 21

3.2.10 Les records 21

3.2.10.1 Les records simples 21

3.2.10.2 Les records avec discriminants 22

3.2.10.3 Les records avec des parties variables et des choix discrets 22

3.2.11 Les pointeurs 22

3.2.11.1 Déclaration de base 23

3.2.11.2 Déclarations incomplètes 24

3.2.11.3 Terminaison d'une déclaration incomplète 24

3.2.11.4 Pointeurs vers des objets composés (records et tableaux) 24

3.2.11.5 Assignation et test avec pointeurs 25

3.2.11.6 Effacement d'un pointeur et des données associées 25

3.2.12 Programmation objet 25

3.2.13 Abstract 25

3.2.14 Tagged 26

3.2.15 Extension et héritabilité des types "tagged" 26

3.2.16 Le type task (tâche) 26

3.3 Domaine d'existence des variables 26

3.3.1 Domaine d'existence limité à quelques lignes dans un code 26

3.3.2 Domaine d'existence limité à toutes les lignes d'une procédure / fonction 27

3.3.3 Domaine d'existence limité à une partie des procédures / fonctions d'un package 27

3.3.4 Domaine d'existence limité à toutes les lignes d'un package 27

3.3.4.1 Le domaine est limité à toutes les lignes du package avec impossibilité d'accès externe 27

3.3.4.1.1 Déclaration dans le "body" 27

3.3.4.1.2 Déclaration dans la spécification 28

3.3.4.2 Le domaine est limité à toutes les lignes du package avec possibilité d'accès externe 28

3.3.5 Domaine d'existence limité à toutes les lignes de tous les packages en utilisant "with ..." 29

3.3.6 Utilisation de "finalize" pour illustrer le domaine d'existence 29

4 Le découpage des routines externes en Fichier ‘ADS' et ‘ADB' 30

4.1 Le choix entre une fonction et une procédure 30

4.1.1 Le passage de paramètres 30

4.1.1.1 Le mode in 30

4.1.1.2 Le mode out 31

4.1.1.3 Le mode in out 31

4.1.1.4 Access 31

4.1.2 Les fonctions 31

4.1.3 Les procédures 32

5 La syntaxe du code 32

5.1 La syntaxe des affectations 32

5.1.1 Opérateurs logiques 33

5.1.2 Opérateurs de comparaison 33

5.1.3 Opérateurs d'addition 34

5.1.4 Opérateurs de signe 34

5.1.5 Opérateurs de multiplication 34

5.1.6 Opérateurs de rang le plus haut 35

5.1.7 Modification du sens des opérateurs classiques 35

5.1.8 Conversion entre types 35

5.1.8.1 Entier vers réel 35

5.1.8.2 Réel vers entier 35

5.1.8.3 Conversion par utilisation d'une adresse mémoire commune 35

5.2 La syntaxe des tests 35

5.2.1 Le test if 35

5.2.2 Le test case 36

5.3 La syntaxe des boucles 36

5.3.1 Boucle simple 37

5.3.2 Boucle while 37

5.3.3 Boucle for 37

5.4 La syntaxe d'appel des fonctions 37

5.5 La syntaxe d'appel des procédures 38

5.6 La segmentation en parties indépendantes par ‘declare' ou begin 38

5.7 Gestion des erreurs durant l'exécution du programme 39

5.7.1 La notion d'exception 39

5.7.2 Les exception intégrées au langage 39

5.7.3 Définition d'une exception 39

5.7.4 Gestion des exceptions 39

5.7.5 Impression écran du type d'erreur rencontré 40

6 Entrées et Sorties 40

6.1 entrée clavier 40

6.2 Utilisation de read_write 40

6.2.1 Entrée d'un entier 40

6.2.2 Sortie écran d'un entier 40

6.2.3 Entrée d'un entier long 41

6.2.4 Sortie écran d'un entier long 41

6.2.5 Entrée d'un réel 41

6.2.6 Sortie écran d'un réel 41

6.2.7 Entrée d'un réel long 41

6.2.8 Sortie écran d'un réel long 41

6.2.9 Entrée d'une chaîne de caractères 42

6.2.10 Sortie écran d'une chaîne de caractères 42

6.3 Utilisation de Ada.Text_Io 42

6.3.0.1 Lecture de nombre après instantiation: 42

6.3.0.1.1 Entier: 42

6.3.0.1.2 Réel: 42

6.3.0.1.3 Chaîne de caractères 43

6.3.1 Sortie écran 44

6.3.1.1 Principes généraux 44

6.3.1.2 Chaîne de caractères 44

6.3.1.3 Entier 44

6.3.1.4 Réels 45

6.3.1.4.1 Sans mise en forme 45

6.3.1.4.2 Avec mise en forme 45

6.3.1.5 Énumération / booléens 46

6.4 Lecture et écriture de fichiers 46

6.4.1 Lecture de fichier texte 46

6.4.2 Écriture de fichier texte 47

7 Les routines: procedures et fonctions 47

7.1 Premier exemple: la somme d'un tableau d'entiers 47

7.2 Second exemple: Manipulation des bits, application à la lecture d'un fichier texte par bloc pour codage 48

7.2.1 Utilisation des opérateurs logiques 48

7.2.1.1 Masque 49

7.2.2 Assignation 49

7.2.3 Décalage gauche et droite 49

7.2.3.1 Rotation 49

7.2.4 Détails du stockage des entiers, caractères et réels dans un mot de 32 bits 50

7.2.4.1 Partage de zone de mémoire 50

7.2.4.2 Transformation little endian big endian 51

7.2.5 La lecture d'un fichier texte par bloc pour codage 53

7.3 programmation d'un code à exécuter au début et la fin du domaine de validité d'une variable 56

8 Générique 57

8.1 Un cas d'école 57

8.1.1 La solution (ici elle est plus longue que la duplication mais c'est un exemple simpliste!) se compose de trois fichiers: 57

8.1.1.1 Une partie générique, fichier s.ads 57

8.1.1.2 Une partie générique, fichier s.adb 57

8.1.1.3 Un exemple de procédure d'utilisation, fichier d.adb 58

8.2 L'Intérêt du générique 58

8.3 Les variables génériques 58

8.3.1 Les variables de type private 59

8.3.2 Les variables de type discrètes 59

8.3.3 Les variables de type entier 59

8.3.4 Les variables de type Modulo 59

8.3.5 Les variables de type Réel 59

8.4 Les procédures et fonctions génériques 59

8.4.1 Les changements dans le code 59

8.4.2 La spécification 59

8.4.3 Le body 60

8.5 Le programme principal 61

8.5.1 Premier type de données 61

8.5.2 Instantiation du générique pour le premier type de données 61

8.5.3 Second type de données 62

8.5.4 Instantiation du générique pour le second type de données 62

8.5.5 Le code du programme principal 63

8.5.6 Le résultat du programme principal 64

8.6 Les fonctions et procédures dont un générique a besoin 65

8.7 Les fonctions Logiques: égal supérieur et inférieure 65

8.7.1 La fonction < 65

8.7.2 La fonction > 65

8.7.3 Instantiation du générique 66

8.7.4 programme principal 66

8.7.5 résultat du programme principal 68

8.8 Autres exemples 68

8.8.1 Utilisation de générique déjà écrits: Un exemple de tri commenté 68

8.8.2 Fichier t.adb 69

8.8.3 fichier sort.ads 69

8.8.4 fichier sort.adb 69

8.8.5 Le résultat écran 70

9 programmation objet 70

9.1 Le type 'tagged' 70

9.2 l'extension d'un type 'tagged' et héritabilité 71

9.3 Le polymorphisme en utilisant le concept de 'dispatching operations' 72

9.4 Exemple de dispatching pour le calcul des surfaces de triangles 74

9.5 Calcul d'une expression arithmétique postscript en utilisant un arbre d'expressions et un stack 77

10 Task 79

10.1 Introduction 79

10.2 Un premier exemple: écriture SUR L'ÉCRAN PAR DEUX TÂCHES NON COORDONNÉES 79

10.2.1 Le programme principal 79

10.2.1.1 Définition des tâches 79

10.2.1.2 Activation des tâches 79

10.2.1.3 Démarrage et arrêt des tâches 80

10.2.2 La tâche numéro 1 80

10.2.2.1 Les différentes parties d'une tâche 80

10.2.2.2 La partie s'exécutant seule 81

10.2.2.3 La partie s'exécutant simultanément avec le programme principal 81

10.2.3 La tâche numéro 2 81

10.3 Second exemple : utilisation d'un sémaphore pour COORDONNER LES DEUX TÂCHES 81

10.3.1 Introduction 81

10.3.2 But d'un sémaphore 82

10.3.2.1 Seize 82

10.3.2.2 Release 82

10.3.3 Le sémaphore écrit en protected type 82

10.3.4 Fonctionnement du sémaphore 83

10.3.5 Le même problème avec synchronisation par sémaphore 83

10.4 Troisième exemple: utilisation de Ada.Finalization pour la gestion du sémaphore 83

10.4.1 Introduction à Ada.Finalization 84

10.4.1.1 Fichier final.ads 84

10.4.1.2 Fichier final.adb 84

10.4.1.3 Fichier final-protects.ads 84

10.4.1.4 Fichier final-protects.adb 85

10.4.1.5 Fichier t_final.adb 85

10.4.2 Utilisation pour la gestion du sémaphore 85

10.4.3 Le code avec Ada.Finalization 85

10.5 Quatrième exemple: création dynamique de plusieurs tâches 85

10.5.1 Le discriminant d'une tâche 86

10.5.2 La déclaration d'une tâche en vue de sa création dynamique 86

10.5.3 L'appel d'une tâche avec discriminant 86

10.5.4 Création dynamique d'une tâche 86

10.5.5 Transmission de la variable d'appel à la partie de la tâche s'exécutanten parallèle et Utilisation du discriminant 87

10.5.6 Résultat du fonctionnement 88

10.6 Cinquième exemple: le dinner des philosophes 88

10.7 Les codes complets 92

10.8 Premier exemple 92

10.8.1 Task_1.adb 92

10.8.2 Task_1_a.ads 93

10.8.3 Task_1_a.adb 93

10.9 second exemple 95

10.9.1 Task_2.adb 95

10.9.2 Task_2_a.ads 96

10.9.3 Task_2_a.adb 96

10.10 troisième exemple 98

10.10.1 Fichier semaph.ads 98

10.10.2 Fichier semaph.adb 99

10.10.3 fichier Semaph-Protects.ads 100

10.10.4 fichier Semaph-Protects.adb 101

10.10.5 fichier task_3_a.ads 102

10.10.6 fichier task_3_a.adb 102

10.10.7 fichier task_3.adb 104

10.11 quatrième exemple 105

10.11.1 Fichier a.adb 105

10.11.2 Fichier call_task.ads 105

10.11.3 Fichier call_task.adb 105

10.11.4 Fichier task_global.ads 106

10.11.5 Fichier task_global.adb 106

10.12 Cinquième exemple 106

10.12.1 Fichier Philosopher_Main.adb 106

10.12.2 Fichier Philosopher_Data.ads 107

10.12.3 Fichier Philosopher_Task.ads 107

10.12.4 Fichier Philosopher_Task.adb 107

10.12.5 Fichier Random_Normal.ads 110

10.12.6 Fichier Random_Normal.adb 111

11 Algorithmique 115

11.1 introduction 115

11.1.1 Grammaires et langage formel, automates à états finis 115

11.1.2 Table de hashing 115

11.1.3 Stack 115

11.1.4 Queue 115

11.1.5 Arbre binaire 115

11.1.6 Arbre dictionnaire 115

11.1.7 Graphe 115

11.1.8 Tris 115

11.1.9 Ensemble 116

11.1.10 Anneau 116

11.2 grammaires et langage formel, automates à états finis 116

11.2.1 Les abréviations 116

11.2.2 Fonction 116

11.2.3 Procédure 116

11.2.4 L'algorithme 116

11.2.5 La déclaration 116

11.2.6 L'instruction 117

11.2.7 L'expression multiple 117

11.2.8 Le test 117

11.2.9 L'itération 117

11.2.10 Le block d'instruction 117

11.3 Invariant de boucle et validation 117

11.3.1 Utilisation de l'invariant de boucle 117

11.4 Complexité des algorithmes 118

11.5 Temps d'exécution des algorithmes 118

12 Les structures Classiques 118

12.1 L' itérateur 118

12.2 Introduction 119

12.3 La table de hashing 119

12.3.1 Vitesse de traitement 120

12.3.2 Traduction de la clé en un nombre 120

12.3.2.1 Numérisation par addition 120

12.3.2.2 Partage d'emplacement mémoire 120

12.3.2.3 Attribution d'une valeur numérique à chaque caractère 121

12.3.2.4 Numérisation par multiplication 122

12.3.2.5 Numérisation par division 123

12.3.2.6 Numérisation quadratique 123

12.3.2.7 Numérisation par décalage et manipulation des bits 123

12.3.3 Les collisions et leur résolution 124

12.3.4 Table de Hashing: Implémentation avec un tableau simple 124

12.3.4.1 Données et Types de données: 124

12.3.4.2 Initialiser 126

12.3.4.3 Ajout 126

12.3.4.4 Recherche 126

12.3.4.5 Suppression 127

12.3.4.6 itérateur 127

12.3.4.6.1 Initialiser 127

12.3.4.6.2 Suivant 128

12.3.4.6.3 Valeur 128

12.3.4.6.4 Fini 128

12.3.5 Table de Hashing: Implémentation avec un tableau Chaîné et des pointeurs 128

12.3.5.1 Données et Types de données: 129

12.3.5.2 Initialiser 131

12.3.5.3 Ajout 131

12.3.5.4 Recherche 132

12.3.5.5 Suppression 133

12.3.5.6 itérateur 134

12.3.5.6.1 Initialiser 134

12.3.5.6.2 Suivant 134

12.3.5.6.3 Fini 134

12.3.5.6.4 Valeur 134

12.4 Le stack 134

12.4.0.1 Données et Types de données: 135

12.4.1 Le stack (pile) : Implémentation avec un tableau 136

12.4.1.1 Ajout (push) 136

12.4.1.2 Délétion (pop) 136

12.4.1.3 Dernière valeur (top) 136

12.4.1.4 Initialiser 137

12.4.1.5 itérateur 137

12.4.2 Le stack: Implémentation avec des pointeurs 137

12.4.2.1 Données et Types de données: 137

12.4.2.2 Ajout (push) 139

12.4.2.3 Délétion (pop) 139

12.4.2.4 Dernière valeur (top) 139

12.4.2.5 Initialiser 140

12.4.2.6 Itérateur 140

12.4.2.6.1 Initialiser 140

12.4.2.6.2 Valeur 140

12.4.2.6.3 Suivant 140

12.4.2.6.4 Fini 141

12.5 La queue 141

12.5.1 La queue: Implémentation avec un tableau 141

12.5.1.1 Données et Types de données: 141

12.5.1.2 Ajout 142

12.5.1.3 Délétion 143

12.5.1.4 Dernière valeur 143

12.5.1.5 Initialiser 143

12.5.1.6 Itérateur 143

12.5.1.6.1 Initialiser 143

12.5.1.6.2 Valeur 144

12.5.1.6.3 Suivant 144

12.5.1.6.4 Fini 144

12.5.2 La queue: Implémentation avec des pointeurs 144

12.5.2.1 Données et Types de données: 145

12.5.2.2 Ajout 146

12.5.2.3 Délétion 148

12.5.2.4 Dernière valeur 149

12.5.2.5 Initialiser 149

12.5.2.6 Itérateur 149

12.5.2.6.1 Initialiser 149

12.5.2.6.2 Valeur 149

12.5.2.6.3 Suivant 149

12.5.2.6.4 Fini 150

12.6 L'anneau 150

12.6.1 L'anneau: Implémentation avec des pointeurs 150

12.6.1.1 Ajout 152

12.6.1.2 Délétion 156

12.6.1.3 Valeur 157

12.6.1.4 Initialiser 158

12.6.1.5 Rotation 158

12.6.1.6 Itérateur 158

12.6.1.6.1 Initialiser 158

12.6.1.6.2 Valeur 158

12.6.1.6.3 Suivant 159

12.6.1.6.4 Fini 159

12.7 L'arbre binaire 159

12.7.1 L'arbre binaire: Implémentation avec un tableau 160

12.7.1.1 Données et Types de données: 163

12.7.1.2 Ajout 163

12.7.1.3 Délétion 164

12.7.1.3.1 La recherche de l'élément à supprimer 164

12.7.1.3.2 Suppression: le choix entre les trois cas 164

12.7.1.3.3 Le cas où il n'y a aucun fils 164

12.7.1.3.4 Le cas où il n'y a qu'un seul fils 164

12.7.1.3.5 Le cas où il y a deux fils. 165

12.7.1.3.6 Remplacement par le sous arbre 165

12.7.1.4 Recherche 169

12.7.1.5 Initialiser 170

12.7.1.6 itérateur (pre-order, in-order & post-order) 170

12.7.1.6.1 Initialiser 170

12.7.1.6.2 Valeur 171

12.7.1.6.3 Suivant 171

12.7.1.6.4 Fini 172

12.7.2 L'arbre binaire: Implémentation avec des pointeurs 172

12.7.2.1 Données et Types de données: 172

12.7.2.2 Ajout 174

12.7.2.3 Délétion 176

12.7.2.3.1 Recherche avec direction depuis le parent 176

12.7.2.3.2 Suppression: le choix entre les QUATRE cas 176

12.7.2.4 Initialiser 180

12.7.2.5 Recherche 180

12.7.2.6 Itérateur (pre-order, in-order & post-order) 181

12.7.2.6.1 Initialiser 181

12.7.2.6.2 Valeur 181

12.7.2.6.3 Suivant 182

12.7.2.6.4 Fini 184

13 Les algorithmes de tri classiques 184

13.1 Le tri bulle (bubble sort) 184

13.2 Le tri par tas (heap sort) 185

13.2.1 Algorithme 185

13.2.2 Pseudo code 190

13.2.2.1 Swap 190

13.2.2.2 transformation d'un sous arbre en tas 190

13.2.2.3 Construction du tas à partir d'un arbre quelconque 191

13.2.2.4 Tri à partir d'un tas 192

13.2.2.5 Programme principal 192

13.3 Le tri fusion (melt sort) 192

13.3.1 Le Rôle de la double récursion 192

13.3.2 La partie tri fusion 192

13.3.3 Le code en Ada 197

13.4 Introduction aux grammaires et langage formel, automates à états finis 198

13.4.1 Implémentation par un automate 198

13.4.1.1 Le problème 200

13.4.1.2 La solution 201

13.4.2 Implémentation par une série de fonctions d'un exemple récursif 202

13.4.2.1 Le problème 202

13.4.2.2 La solution 202

13.4.2.2.1 Les types de données 202

13.4.2.2.2 L'objet token et les opérations associées 202

13.5 L'arbre dictionnaire 204

13.5.0.1 Données et Types de données: 204

13.6 Tirage au hasard 205

13.6.1 Utilisation des packages inclus dans le langage 205

13.6.2 Utilisation d'un algorithme particulier: "mersenne twister" 207

14 Annexes: les codes complets 211

14.1 Le package read_write 211

14.2 Le code de la table de hashing en tableau simple 220

14.3 Le code de la table de hashing en tableau chaîné 225

14.4 Le code du stack (tableau) 231

14.5 Le code du stack (pointeurs) 235

14.6 Le code de la queue (tableau) 240

14.7 Le code de la queue (pointeurs) 244

14.8 Le code de l'anneau 249

14.9 Le code de l'arbre binaire (tableau) 260

14.10 Le code de l'arbre binaire (pointeurs) 268

14.11 Le code du tri bulle 277

14.12 Le code du tri en tas 277

14.13 Le code du tri fusion 280

14.14 Le code du test de l'expression algébrique: automate 282

14.15 Le code du test de l'expression algébrique: Fonctions 283

14.16 Le code de l'arbre dictionnaire 287

15 L'algorithmique en action, exemple 1: un calculateur simple 293

15.1 Analyse 293

15.1.1 Première approche du découpage 293

15.1.2 Entrée du calcul 293

15.1.3 Test de la validité 293

15.1.4 Traduction du découpage précédent en postfix pour le calcul 293

15.1.5 Calcul à partir de la traduction postfix. 293

15.1.6 Affichage du résultat 293

15.1.7 Découpage en tâches indépendantes 294

15.1.8 Dépendances des modules 294

15.2 Définitions des données 294

15.2.1 Identification des données 294

15.2.2 Le stockage des données 294

15.2.3 Les types de données 294

15.2.3.1 Chaîne de caractères 294

15.2.3.2 Tableau de chaînes de caractères 294

15.2.4 Les données dans la spécification d'un « package » commun 295

15.2.4.1 Le code 295

15.3 Relations entre les modules 295

15.3.0.1 Nom du module 295

15.3.0.2 Données en sortie 295

15.3.1 Le module principal 295

15.3.1.1 Nom du module 295

15.3.1.2 Données à l'entrée 295

15.3.1.3 Traitement des données 296

15.3.1.4 Données en sortie 296

15.3.2 Le module entrée utilisateur 296

15.3.2.1 Nom du module 296

15.3.2.2 Données à l'entrée 296

15.3.2.3 Traitement des données 296

15.3.2.4 Données en sortie 296

15.3.3 Le module test de la validité 296

15.3.3.1 Nom du module 296

15.3.3.2 Données à l'entrée 296

15.3.3.3 Traitement des données 296

15.3.3.4 Données en sortie 296

15.3.3.5 Le Module découpage en opérateur opérande 297

15.3.3.5.1 Nom du module 297

15.3.3.5.2 Données à l'entrée 297

15.3.3.5.3 Traitement des données 297

15.3.3.5.4 Données en sortie 297

15.3.4 Le module traduction du découpage précédent en postfix 297

15.3.4.1 Nom du module 297

15.3.4.2 Données à l'entrée 297

15.3.4.3 Traitement des données 297

15.3.4.4 Données en sortie 297

15.3.5 Le module Calcul à partir du postfix 297

15.3.5.1 Nom du module 297

15.3.5.2 Données à l'entrée 297

15.3.5.3 Traitement des données 297

15.3.5.4 Données en sortie 298

15.3.6 Le module affichage du résultat 298

15.3.6.1 Nom du module 298

15.3.6.2 Données à l'entrée 298

15.3.6.3 Traitement des données 298

15.3.6.4 Données en sortie 298

15.3.7 Le code : le point de départ 298

15.3.7.1 data.ads 298

15.3.7.2 main.adb 298

15.3.7.3 calcul.ads 299

15.3.7.4 calcul.adb 299

15.3.7.5 data_io.ads 299

15.3.7.6 data_io.adb 299

15.3.7.7 decoupage.ads 300

15.3.7.8 decoupage.adb 300

15.3.7.9 traduction.ads 300

15.3.7.10 traduction.adb 300

15.3.7.11 validation.ads 300

15.3.7.12 validation.adb 301

15.4 Le Traitement des données 301

15.4.1 Le module définition des données 301

15.4.1.1 Définition des procédure et fonctions 301

15.4.1.2 Traitement 301

15.4.2 Le module principal 301

15.4.2.1 Définition des procédure et fonctions 301

15.4.2.2 Traitement 301

15.4.3 Le module entrée utilisateur 301

15.4.3.1 Définition des procédure et fonctions 301

15.4.3.2 Traitement 302

15.4.3.2.1 Lecture de la commande 302

15.4.3.2.2 Analyse du problème 302

15.4.3.2.3 Lecture de la ligne de commande 302

15.4.3.2.4 Entrée par l'utilisateur s'il n'y a pas d'arguments sur la ligne de commande. 304

15.4.3.3 Le code complet 304

15.4.4 Le module test de la validité 305

15.4.4.1 Définition des procédure et fonctions 305

15.4.4.2 Traitement 305

15.4.4.2.1 Introduction: la grammaire d'une expression arithmétique 305

15.4.4.2.2 Traduction de la grammaire dans un automate à états finis 305

15.4.4.2.3 Les transitions 305

15.4.4.2.4 La table de traduction caractères ==> transitions 305

15.4.4.2.5 La matrice états transitions 307

15.4.4.2.6 Le fonctionnement de l'automate 308

15.4.4.3 Le code complet 308

15.4.5 Le Module découpage en opérateur opérande 309

15.4.5.1 Définition des procédure et fonctions 309

15.4.5.2 Traitement 309

15.4.5.2.1 Le résumé 309

15.4.5.2.2 Les détails 310

15.4.5.2.3 Parties copiées et collées du module précédent 310

15.4.5.2.4 Les variables 310

15.4.5.2.5 La table de vérité 311

15.4.5.2.6 Les détails du déroulement 311

15.4.5.3 Le code complet 312

15.4.6 Le module traduction du découpage précédent en postfix 313

15.4.6.1 Définition des procédure et fonctions 313

15.4.6.2 Traitement 314

15.4.6.3 Nature des données d’entrée de l’algorithme 314

15.4.6.4 Algorithme de Traduction 314

15.4.6.4.1 Le stack 314

15.4.6.4.2 Priorité Des Opérateurs 315

15.4.6.5 Partie principale 316

15.4.6.6 L'algorithme plus détaillé 316

15.4.6.7 Analyse de l'algorithme détaillé 317

15.4.6.8 Le code du stack 317

15.4.6.8.1 Les variables 317

15.4.6.8.2 Le code 317

15.4.6.8.3 Push 317

15.4.6.8.4 Pop 317

15.4.6.8.5 Value 317

15.4.6.8.6 Clear 318

15.4.6.9 le code du test de priorité des opérateurs 318

15.4.6.9.1 Les variables 318

15.4.6.9.2 Le code 318

15.4.6.10 Le code du test opérande 319

15.4.6.11 Le code du programme principal 319

15.4.7 Calculs à partir du postfix 322

15.4.7.1 Définition des procédure et fonctions 322

15.4.7.2 Traitement 322

15.4.7.2.1 Résumé 322

15.4.7.2.2 Exemple 322

15.4.7.2.3 Détails des opérations 324

15.4.7.2.4 Le stack de réels 325

15.4.7.3 Le code complet 325

15.4.8 Le module affichage du résultat 326

15.4.8.1 Définition des procédure et fonctions 326

15.4.8.2 Traitement 326

15.4.8.2.1 Exploration des possibilités du langage 327

15.4.8.2.2 Utilisation de « image » 327

15.4.8.2.3 Utilisation du générique « Float_Io » 327

15.4.8.2.4 Utilisation du générique « Float_Io » avec une chaîne de caractères 328

15.4.8.2.5 Traduction du réel en une chaîne de caractères. 329

15.4.8.2.6 Élimination des espaces au début. 329

15.4.8.2.7 Remplacement de tous les chiffres non significatifs par des zéros. 329

15.4.8.2.8 Élimination des zéros non significatifs. 329

15.4.8.2.9 Affichage de la chaîne de caractères sur l'écran. 329

15.4.8.2.10 La gestion d'exception avec affichage en format scientifique. 330

15.4.8.3 Le code complet 330

16 L'algorithmique en action, exemple 2: Le codage et décodage "lzw" 331

16.1 Introduction 331

16.1.1 L'algorithme de compression 331

16.1.1.1 Initialisation de l'algorithme de compression 332

16.1.1.2 Détails de l'algorithme de compression 332

16.1.2 L'algorithme de décompression 332

16.1.2.1 Initialisation de l'algorithme de décompression 332

16.1.2.2 Détails de l'algorithme de décompression 332

16.1.3 L'algorithme LZW, détails supplémentaires 333

16.1.3.1 Exemple de codage 333

16.1.3.2 Exemple de décodage 334

16.2 Structures et opérations nécessaires 335

16.2.1 Chaînes de caractères de longueur variable 335

16.2.2 Table de hashing et opérations associées au codage 335

16.2.2.1 Initialisation de la table de hashing du codage 336

16.2.2.2 Ajout à la table de hashing du codage 336

16.2.2.3 Existe dans la table de hashing du codage 336

16.2.2.4 Lecture de la table de hashing du codage 337

16.2.3 Tableau de chaînes de caractères de longueur variable et opérations associées au décodage 337

16.2.3.1 Initialisation du tableau de chaînes de caractères du décodage 337

16.2.3.2 Ajout au tableau de chaînes de caractères du décodage 337

16.2.3.3 Existe dans le tableau de chaînes de caractères du décodage 338

16.2.3.4 Lecture du tableau de chaînes de caractères du décodage 338

16.2.4 Gestion de variables, codées sur 8, 9, 10, 11 ou 12 bits sans signe 338

16.2.5 Lecture d'un fichier par bytes, envoi au décodage et écriture codée sur 8, 9, 10, 11 ou 12 bits sans signe dans un fichier 338