MIAGE CRÉTEIL: Algorithmique & Génie Logiciel avec ADA 1999 – 2008
Algorithmique & Génie Logiciel avec ADA
Une Introduction
Version
1.0 , le
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