Algorithmiques
Algorithmiques
Algorithmique
Olivier ZONGO, Ingénieur de Conception – MTDPCE/SPIVTEN
Doctorant en Intelligence Artificielle – UNB/LAMDI
Tel : 65 08 58 71, Email : olzoolivier659@[Link]
Evaluation
2 examens Théorique individuel : 70%
Projet, contrôles continus : 30%
2
Plan du cours
Chapitre 1 : Introduction, histoire et notions de base sur l’algorithmique
Chapitre 2 : Structures élémentaires l’algorithmique
Chapitre 3 : Les structures de contrôle conditionnelles, les structures de contrôle répétitives
Chapitre 4 : Les tableaux
Chapitre 5 : Procédures et fonctions
Chapitre 6 : Les enregistrements
Chapitre 7 : Les algorithmes de tri
Chapitre 8 : Les chaînes de caractères
Chapitre 9 : Notion de pointeurs, initiation aux listes et aux arbres binaires
3
Avant-Propos
Les 10 meilleurs metiers selon World Report en 2023
4
Chapitre 1 : Introduction, histoire et
notions de base sur l’algorithmique
5
Qu'est-ce qu'un algorithme ?
7
Qu'est-ce qu'un algorithme ?
Objectifs de l’algorithmique
▪ Résolution de problèmes : Décomposer une tâche
complexe en étapes simples.
▪ Efficacité : Trouver des solutions optimales en
termes de temps et de ressources.
▪ Généralisation : Concevoir des solutions
applicables à plusieurs cas.
8
Histoire de l'Algorithmique
Antiquité et Moyen Âge
Les premiers algorithmes remontent à l'Antiquité. Par exemple, Euclide,
dans son ouvrage "Les Éléments" (~300 avant J.-C.), a présenté un
algorithme pour trouver le plus grand commun diviseur (PGCD) de deux
nombres.
XXe siècle
L'algorithmique moderne prend forme avec l'invention des premiers ordinateurs
et des langages de programmation. Les pionniers comme Alan Turing, John
von Neumann, et Kurt Gödel ont contribué à formaliser les concepts
algorithmiques, en introduisant des notions comme la machine de Turing et les
théories de la calculabilité. 10
Les Phases de Création d’un Programme
Phase 3 : Implémentation
Une fois l’algorithme conçu, il doit être traduit en un langage
de programmation (Python, Java, C++, etc.). Cette phase
implique la rédaction du code qui implémente l’algorithme.
Phase 6 : Maintenance
Un programme doit être maintenu à travers le temps,
pour corriger des bugs, améliorer des fonctionnalités ou
le rendre compatible avec de nouvelles technologies.
13
Compilation & interprétation
❑ Les programmes écrits par les programmeurs
sont appelés PROGRAMMES SOURCES car rédigés
dans des langages de programmation
❑ Ces programmes sources sont ensuite :
➢ soit traduits en PROGRAMMES
EXECUTABLES pour pouvoir être exécutés par
les ordinateurs, après une succession de
traitements
➢ soit directement fournis à des
INTERPRETEURS
14
Production du code exécutable
❑ Le processus de production d’un code exécutable
(code binaire) est généralement employé quand :
➢ les programmes correspondants sont de grande
taille
➢ on souhaite que le temps d’exécution soit petit
➢on ne désire pas mettre le code source du
programme à la disposition de l’utilisateur final
❑ Les exécutions ne nécessitent plus aucune
traduction car se faisant à partir du code exécutable
15
Interprétation
❑ Le processus d’interprétation est employée
lorsque
➢ l’utilisateur souhaite écrire rapidement un petit
programme jetable (maquette)
➢ le source peut sans aucun problème être
communiqué à l’utilisateur
❑ A chaque exécution du programme, chacune des
instructions est analysée et traduite avant exécution,
et le résultat de cette traduction n’est pas conservée
dans un fichier exécutable
16
Phases du développement de programmes
Édition de texte
Débogage
Chargement et exécution
Édition de liens
17
Édition de texte
❑ Éditeur de texte = programme de
[Link] saisie de texte par l’utilisateur sans mise
en forme. Ce texte va correspondre à un
programme écrit dans un langage de
[Link] programmation (respect de la syntaxe
d’écriture du programme et des
instructions)
[Link]
❑ Un fichier source résulte de cette
opération et porte un nom dont
tata.c l’extension rappelle le langage de
programmation employé
18
Compilation
❑ Compilateur = programme
lisant un programme écrit dans
un premier langage – langage
[Link] source – et le traduisant en un
programme équivalent écrit dans
un autre langage – langage cible
ou objet -
Compilateur ❑ Lors de ce processus les
erreurs rencontrées sont
signalées à l’utilisateur dans un
fichier d’erreurs de syntaxe
❑ A chaque langage de
[Link]
programmation est associé un
[Link] compilateur.
19
Édition de liens ❑ Tous les liens irrésolus
(variables, étiquettes, fonctions
Biblio1
connues ailleurs que dans le
programme compilé) sont
[Link] Biblio2 traités, grâce à l’utilisation des
bibliothèques et autres fichiers
renfermant du code objet
fourni à l’éditeur de liens qui
Éditeur de liens est un programme
❑ Le fichier exécutable
résultant contient le
Autres fichiers [Link] programme traduit en langage
(map, err, …) machine (code binaire)
20
Chargement et exécution
❑ Chargeur = programme ayant pour rôle d’installer
en mémoire centrale le code exécutable d’un
programme dont on connaît le nom : trouver la place,
copier le code en mémoire centrale avec les
adaptations liées aux translations, préparer le
contexte d’exécution
❑ Un programme exécutable un nom de fichier
renfermant du code exécutable
❑ Lorsque le processeur sera attribué au processus
correspondant au programme chargé, celui-ci
s’exécutera et produira des résultats
21
Débogage
❑ Débogueur = programme ayant pour rôle d’aider à
la mise au point d’un autre programme en cours de
développement (détection des erreurs de logique
appelés en anglais « bugs »), en fournissant la
possibilité de suivre pas à pas
➢ le déroulement de chacune des instructions
constituant le programme testé
➢ l’évolution du contenu des variables, des
structures de données et autres zones en mémoire
centrale employées dans le programme
22
Introduction à l’algorithmique
23
Chapitre 2 : Structures élémentaires
l’algorithmique
24
Notion de variable (1/6)
• Une variable une boîte ou un récipient
• Cette boîte est caractérisée par au moins :
- un nom ou une étiquette ou un identificateur
- un contenu ou une valeur rangée dans la boîte
- un emplacement ou une adresse
Empla-
cement A Empla-
cement B
27
Notion de variable (4/6)
• Deux catégories de TYPES :
- Types scalaires ou non structurés : ils ne sont
plus décomposables car élémentaires. Ils sont soit
prédéfinis (entiers naturels, entiers relatifs, réels,
booléens, caractères, etc.), soit construits par le
programmeur par énumération des valeurs
(ensembles, intervalles, chaînes de caractères)
- Types structurés : construits à partir des types
scalaires grâce à des constructeurs de type
(exemple : tableau, enregistrement ou article, liste)
28
Notion de variable (5/6)
ATTENTION !!! Il y a deux différences majeures entre les variables
en mathématiques et celles en informatique.
⚫ Entier naturel
⚫ Entier relatif
⚫ Réel
⚫ Logique (booléen)
⚫ Caractère
⚫ Chaîne de caractères
32
Notion de constante (3/3)
Exemples
Constantes PI←3,1415 ;
IndicatifTelPays ← 226 ;
baseSysteme ← 16 ;
nomPays ← “Burkina Faso” ;
Separateur ← '/' ;
Trouve ← Faux ;
TaillePage ← 90.
33
Portée des variables et constantes (1/6)
• Une variable ou une constante est définie/déclarée dans un bloc
et n’est visible/manipulable qu’au sein de ce bloc (portée)
La variable b est déclarée dans le bloc rouge, n’est pas connue dans
le bloc vert mais est connue dans le bloc blanc
35
Portée des variables et constantes (3/6)
• Une variable ou une constante est définie/déclarée dans un bloc
et n’est visible/manipulable qu’au sein de ce bloc (portée)
38
Portée des variables et constantes (4/6)
• Exercice 2
Bloc vert
a
Bloc rouge
b
Bloc blanc
On demande d’indiquer la visibilité
c des différentes variables
Bloc jaune
d
Bloc bleu
e
39
Instructions de base (1/12)
- l’affectation
Instructions
- la lecture de transfert
Instructions (mouvement)
d’entrées-sorties (E/S)
- l’écriture
40
Instructions de base (2/12)
• L’affectation
- Sa syntaxe
nomVariable expression
- Sa sémantique
ranger dans la variable nomVariable
la valeur associée à expression
41
Instructions de base (3/12)
42
Instructions de base (4/12)
• Exemples
Surface 0 ; /* on range la valeur 0 dans la variable Surface */
Rayon 25.4 ; /* on range la valeur 25.4 dans la variable Rayon */
Surface 2xPIxRayon ; /* on suppose la constante PI connue */
Age 2024 - AnneeNaiss ; /* on suppose AnneeNaiss déjà
renseignée */
Nom “OUEDRAOGO” ;
Message Nom ;
Prenom “Justin” ;
Utilisateur Nom + “ ” + Prenom ;
Concaténation
44
Instructions de base (5/12)
• Exemples
Nom “OUEDRAOGO” ;
Prenom “Justin” ;
Message “Bonjour”+ “ ”+Nom+ “ ”+Prenom ;
Utilisateur Nom + “ ” + Prenom ;
indicatif IndicatifTelBF ;
pays nomPays ;
estAdmis (Moyenne ≥ 10) ;
trouve (Prenom = “Jean”);
estPresent (Moyenne ≠ 0) ;
toto “23456” ;
titi “23456” ;
somme toto+ titi ;
car “ ” ;
45
Instructions de base (6/12)
- Sa syntaxe
Lire nomVar
- Sa sémantique
Récupérer une valeur introduite par
l’utilisateur et la ranger dans la variable
de nom nomVar
46
Instructions de base (7/12)
47
Instructions de base (8/12)
• Généralisation de la lecture
- Sa syntaxe
Lire nomVar1, nomVar2, …, nomVarN
- Sa sémantique
Récupérer, au moyen d’une unique instruction , N
valeurs introduites par l’utilisateur et qui
seront respectivement stockées dans les variables
de nom nomVar1, nomVar2, …, nomVarN
48
Instructions de base (9/12)
• L’écriture
- Sa syntaxe
Ecrire nomVar
- Sa sémantique
récupérer la valeur présente dans la
variable nomVar et l’envoyer vers le
terminal de l’utilisateur
49
Instructions de base (10/12)
• L’écriture
Programme
Ordinateur en exécution
?
-
-
Ordre d’écriture
-
-
- Sa syntaxe
Ecrire nomVar1, nomVar2, …, nomVarN
- Sa sémantique
Récupérer, au moyen d’une unique instruction , le
contenu des N variables appelées respectivement
nomVar1, nomVar2, …, nomVarN, et les envoyer
vers le périphérique de sortie standard
51
Instructions de base (12/12)
Sortie /
Ecriture
Entrée / Référence
Lecture / Repère
52
Exercice 1
Ecrire l’algorithme permettant de ranger la valeur
entière 100 dans une variable dénommée X, de
ranger la valeur 900 dans une variable de nom Y, de
faire leur somme arithmétique et enfin de ranger le
résultat dans la variable Z.
Exercice 2
Ecrire l’algorithme permettant à l’utilisateur de
saisir une valeur entière et d’afficher cette valeur
augmentée de 100.
53
Exercice 4
Ecrire un algorithme qui calcule le volume V d’une sphère étant donné
son rayon R , V = 4PiR3.
Exercice 5
Ecrire un algorithme qui calcule et affiche la somme des n premiers
entiers naturels, la somme est égale à la division entière de n*(n+1) par 2.
Exercice 6
Ecrire un algorithme qui saisit le prix hors taxe d’une imprimante, le prix
TVA et affiche le prix total.
54
Chapitre 3 : Les structures de contrôle
55
Définition des structures de contrôle (1/2)
• Une structure de contrôle est une instruction
permettant de modifier ou d’orienter le fil ou la
séquence d’exécution des instructions en fonction des
conditions rencontrées ou des événements survenus lors
du déroulement de l’algorithme.
traitement1
traitement3
60
Structures de contrôle conditionnel (4/6)
• Structure complète de choix
Traitement1; Si la valeur retournée lors de
l’évaluation de la condition est
Si condition alors VRAI, alors on « entre » dans la 1re partie de la
structure de contrôle pour ne réaliser que
traitement2a
traitement2a.
Sinon
Autrement on « entre » dans la 2e partie de la
traitement2b structure de contrôle pour ne réaliser que
traitement2b.
FinSi ;
Et quel que soit le chemin emprunté, on finit
traitement3 par exécuter traitement3.
61
Structures de contrôle conditionnel (5/6)
• Structure complète de choix
traitement1
Vrai Faux
condition Dans la représentation
graphique (losange) les
deux moitiés de
traitement2a traitement2b l’alternative sont bien
visibles !
traitement3
62
Structures de contrôle conditionnel (6/6)
• Structures complètes de choix imbriquées
Traitement1;
Si condition1 alors traitement2a
traitement1’ ;
Si condition1’ alors ATTENTION !!! Des
traitement2a’ structures de choix peuvent
Sinon « renfermer » d’autres
traitement2b’ structures de choix : on dit
FinSi ; qu’elles sont imbriquées.
traitement3’
Sinon
traitement2b
FinSi ;
traitement3 63
Structures de contrôle répétitif (1/8)
• On les appelle aussi structures (de contrôle) de
répétition ou structures itératives ou structures
de boucle.
• Elles permettent de réaliser un même traitement un
certain nombre de fois (répétition du traitement).
• Deux principales structures de contrôle itératives
existent : celle nécessitant la connaissance
préalable du nombre d’itérations à faire, et celle
ne nécessitant pas cette connaissance.
64
Structures de contrôle répétitif (2/8)
• Structure de contrôle de répétition TANT QUE
Traitement1; Après avoir exécuté traitement1, la
réalisation de traitement2 est
Tant que condition faire conditionnée par le fait que la valeur de
l’évaluation de condition est à VRAI.
A chaque fois que traitement2 est
traitement2 effectué, la rencontre du FinTantque
oblige qu’on aille au début du Tant que
vérifier que condition est toujours VRAI.
FinTantque ; Dès que l’évaluation de condition donne
traitement3 FAUX, on « sort » de la boucle et le
traitement3 est effectué.
65
Structures de contrôle répétitif (3/8)
• Structure de contrôle de répétition TANT QUE
Traitement1 ; Le nombre d’itérations à faire
n'est pas requis au préalable.
Tant que condition faire
MAIS ATTENTION !!!
ATTENTION
FinTantque ; aux boucles infinies !
traitement3 S’assurer de la condition d’arrêt !
67
Structures de contrôle répétitif (5/8)
• Structure de contrôle de répétition POUR
Traitement1 ; On se sert d’un compteur, ici la
variable i de type entier, pour gérer le
Pour i allant de 1 à N faire
nombre de fois que traitement2 sera
exécuté. Si N est supérieur ou égal à 1
alors traitement2 est effectué au
traitement2 moins une fois, autrement jamais.
Ce n’est qu’après avoir réalisé la
FinPour ; dernière itération qu’on « sort » de la
boucle, la valeur de i valant N+1 ou
traitement3 même indéterminée, et que
traitement3 est effectué.
68
Structures de contrôle répétitif (6/8)
• Structure de contrôle de répétition POUR
Traitement1 ; ATTENTION !!!
L’incrément ou le pas K correspond à la
Pour i allant de 1 à N faire valeur à rajouter à la valeur actuelle de i
pour obtenir sa valeur suivante.
Par défaut K vaut 1 et on ne précise pas.
traitement2 Mais si K venait à être différent de 1
(même négatif) il faudrait le préciser, et
dans ce cas il faudrait employer plutôt la
FinPour ;
forme :
traitement3
Pour i allant de 1 à N par pas de K faire
69
Structures de contrôle répétitif (7/8)
• Structure de contrôle de répétition POUR
Traitement1 ; ATTENTION !!!
70
Structures de contrôle répétitif (8/8)
• Structures de contrôle de répétition imbriquées
Boucle1
Boucle2 ATTENTION !!!
Des structures de contrôle de
répétition peuvent « renfermer »
Boucle3
d’autres structures de contrôle de
répétition : on dit qu’elles sont
imbriquées.
FinBoucle3
On veillera à la bonne maîtrise
FinBoucle2 des conditions d’arrêt de
chacune d’elles.
FinBoucle1
71
Structures de contrôle conditionnel
• Exercice 1
72
Structures de contrôle conditionnel
• Exercice 2
73
Structures de contrôle conditionnel
• Exercice 3
74
Structures de contrôle conditionnel
• Exercice 4
75
Structures de contrôle conditionnel
• Exercice 5
77
Structures de contrôle répétitif
Exercice 2
Ecrire un algorithme permettant à l’utilisateur de faire
autant de fois qu’il le souhaite, la somme de 2
entiers relatifs qu’il aura à introduire.
78
Structures de contrôle répétitif
Exercice 3
1) En s’appuyant sur une structure de répétition, écrire
un algorithme permettant de calculer la somme
des n (n > 0) premiers entiers naturels strictement
positifs. On supposera la valeur de n déjà connue.
80
Structures de contrôle répétitif
Exercice 5
En s’appuyant sur les structures de contrôle, on vous
demande d’écrire un algorithme qui, à partir de la
fourniture par l’utilisateur d’un nombre entier
correspondant à un nombre de secondes, calcule et
affiche l’équivalent en heures, minutes et secondes.
81
Structures de contrôle répétitif
Exercice 6
Ecrire un algorithme qui, à partir de la
fourniture par l’utilisateur de deux nombres entiers
A et B, calcule et affiche leur plus grand commun
diviseur connu sous le vocable de PGCD.
82
Structures de contrôle répétitif
Exercice 7 Début
Qu'obtient-on à
l'écran de son Lire x ;
ordinateur si l'on i←5 ;
exécutait le Tant que i>0 faire
programme
x←x*i ;
correspondant au bloc
algorithmique i←i-1
ci-contre ? FinTantque ;
i et x sont des variables Ecrire "x à la fin = ",x
entières et l'on suppose
avoir saisi la valeur 8.
Fin.
83
Structures de contrôle répétitif
Exercice 8 Début
Qu'obtient-on à
l'écran de son Lire x ;
ordinateur si l'on Pour i allant de 1 à 5 faire
exécutait le Ecrire i,") x=", x ;
programme
AllerALaLigne ;
correspondant au bloc
algorithmique x←x+((i-2)*2) ;
ci-contre ? FinPour ;
i et x sont des variables Ecrire "A la fin x vaut ",x
entières et l'on suppose
avoir saisi la valeur 8.
Fin.
84
Structures de contrôle répétitif
Exercice 9 Début
Donnez l'équivalent de
l'enchaînement logique Lire x ;
ci-contre utilisant plutôt Pour i allant de 1 à 5 faire
une structure de contrôle Ecrire i,") x=", x ;
de répétition TANT QUE.
AllerALaLigne ;
x←x+((i-2)*2) ;
FinPour ;
Ecrire "A la fin x vaut ",x
Fin.
85
Structures de contrôle répétitif
Exercice 10
On suppose disposer :
- de billets de 10000, 5000, 2000, 1000 et 500 F CFA ;
- de pièces de 100, 50, 25, 10 et 5 F CFA.
On vous demande d'écrire l'algorithme qui permet à un
caissier de savoir ce qu'il faut donner comme nombre
minimum de billets et de pièces à un client qui lui
communique un montant à payer.
86
Chapitre 4 : Les Tableaux
87
Introduction aux tableaux
• On appelle tableau une structure de données
constituée de plusieurs éléments de même type
qu’on peut référencer au moyen d’un indice.
88
Introduction aux tableaux
• Exemple : on voudrait conduire une étude sur la
taille des étudiants de IAM.
89
Introduction aux tableaux
Une façon rébarbative de le faire serait de déclarer
une liste de 100 variables de type réel,
chacune associée à la taille d’un étudiant de IAM :
t1 est de type réel, correspondant à la taille du 1er étudiant de IAM ;
t2 est de type réel, correspondant à la taille du 2e étudiant de IAM ;
t3 est de type réel, correspondant à la taille du 3e étudiant de IAM ;
t4 est de type réel, correspondant à la taille du 4e étudiant de IAM ;
t5 est de type réel, correspondant à la taille du 5e étudiant de IAM ;
t6 est de type réel, correspondant à la taille du 6e étudiant de IAM ;
…
t99 est de type réel, correspondant à la taille du 99e étudiant de IAM ;
t100 est de type réel, correspondant à la taille du 100e étudiant de IAM.
90
Introduction aux tableaux
Quelles difficultés
aurions-nous eues s’il
y avait mille, dix
mille, un million de
variables à manipuler ?
91
Tableaux à une dimension
On les appelle aussi :
- tableaux à une entrée
- vecteurs
92
Tableaux à une dimension
• Exemple
Elément d’indice 100 à l’adresse de début du tableau + 99x (taille d’un élément)
95
Tableaux à une dimension
- Initialisation
- Affichage
- Repérage/recherche d’une valeur dans le tableau
- Somme des éléments de deux tableaux
- Calcul de la moyenne des éléments du tableau
- Comptage des occurrences d’une valeur dans le tableau
- Etc.
97
Tableaux à une dimension
Exercice 1
Ecrire un algorithme permettant d’initialiser
interactivement un tableau de 10 entiers naturels.
Exercice 1bis
Ecrire un algorithme permettant d’initialiser
interactivement un tableau A donné de 10 entiers naturels.
Exercice 2
Ecrire un algorithme permettant d’afficher les 50
valeurs réelles d’un tableau. On suppose le tableau
initialisé.
98
Tableaux à une dimension
Exercice 3
On suppose avoir deux tableaux A et B initialisés
avec les valeurs correspondant aux notes des 80
étudiants pour les 2 évaluations en algorithmique.
Ecrire un algorithme permettant de calculer et de
conserver la moyenne des 2 évaluations de chacun
des étudiants.
99
Tableaux à une dimension
Exercice 4
On suppose avoir un tableau T initialisé avec 1000
réels. Ecrire un algorithme permettant de récupérer
la plus petite valeur de ce tableau et de l’afficher.
Exercice 5
On suppose avoir un tableau T initialisé avec 1000
réels. Ecrire un algorithme permettant de récupérer
la plus petite et la plus grande valeur de ce tableau.
100
Tableaux à une dimension
Exercice 6
On suppose avoir un tableau T initialisé avec 1000
réels. Ecrire un algorithme permettant de compter
le nombre de valeurs réelles nulles de T.
Exercice 7
On suppose avoir un tableau T initialisé avec 200
entiers relatifs. Ecrire un algorithme permettant de
compter le nombre de valeurs strictement positives
de T.
101
Tableaux à une dimension
Exercice 8
On suppose avoir un tableau T initialisé avec 20
entiers relatifs. Ecrire un algorithme permettant de
retrouver l’indice du premier 0 du tableau quand
celui-ci existe effectivement.
Exercice 9
On suppose avoir un tableau T initialisé avec 10
entiers naturels. Ecrire un algorithme permettant de
calculer le produit des valeurs de ce tableau.
102
Tableaux à une dimension
Exercice 10
On suppose avoir un tableau T initialisé avec N
(N>0) valeurs réelles. Ecrire un algorithme
permettant à l’utilisateur de saisir une valeur dont il
faudra calculer le nombre d’apparitions dans le
tableau T.
103
Tableaux à deux dimensions
On les appelle aussi :
- tableaux à deux entrées
- matrices
104
Tableaux à deux dimensions
A 6,50 12,75 11
B 16,50 10,75 10
D 13,50 12,50 14
105
Tableaux à deux dimensions
106
Tableaux à deux dimensions
T
6,50 12,75 11
16,50 10,75 10
13,50 12,50 14
107
Tableaux à deux dimensions
Colonne 3
pour les notes
Colonne 1 Colonne 2
de maths
pour les notes pour les notes
de français d’anglais
108
Tableaux à deux dimensions
T
13,50 12,75 11
Désignation des éléments de la matrice
16,50 10,75 10
Lignes T(i, j) avec :
9,50 9,75 11,50 i comme indice de la ligne
j comme indice de la colonne
13,50 12,50 14
Exemples :
10 correspond à T(2, 3)
Colonnes
11 correspond à T(1, 3)
13,50 correspond à T(4, 1)
109
Tableaux à deux dimensions
Généralisation
Une matrice M de N lignes et de P colonnes
d’objets sera déclarée :
Nombre Nombre
de lignes de colonnes
110
Tableaux à deux dimensions
111
Tableaux à deux dimensions
T
6,50 12,75 11
16,50 10,75 10 Si un élément de type objet de T est
9,50 9,75 11,50 représenté sur k octets, alors en
mémoire centrale on aura ce qui suit :
13,50 12,50 14
T 112
Tableaux à deux dimensions
Soit α l’adresse de début du tableau T [1..N, 1..P] objet en mémoire
centrale.
Si un élément de type objet est représenté sur k octets, alors en
mémoire centrale l’élément T(i, j) tel que 1 ≤ i ≤ N et 1 ≤ j ≤ P
sera logé à l’adresse :
α + (i-1)*P*k + (j-1)*k
T 113
Tableaux à deux dimensions
Exercice 2
Ecrire un algorithme permettant d’afficher ligne
par ligne, les 15 valeurs réelles d’une matrice
A[1..5, 1..3]. On supposera la matrice déjà
initialisée.
116
Tableaux à deux dimensions
Exercice 3
On suppose avoir deux matrices X et Y de
L lignes et C colonnes de réels initialisées.
Ecrire un algorithme permettant de calculer
la matrice Z contenant les moyennes des valeurs
de X et Y, c’est-à-dire :
Z(i, j)=moyenne(X(i, j),Y(i, j)), i [1..L] et j [1..C].
117
Tableaux à deux dimensions
Exercice 4
On suppose avoir une matrice M[1..N, 1..P] de réels
initialisée.
Ecrire un algorithme permettant de récupérer
la première plus petite valeur de cette matrice, de
l’afficher ainsi que les indices de ligne et colonne lui
correspondant. Le parcours de la matrice s’effectue
de la 1re ligne à la dernière ligne.
118
Tableaux à deux dimensions
Exercice 5
On suppose avoir une matrice M de 3 lignes et 5
colonnes initialisée avec des valeurs réelles.
Ecrire un algorithme permettant de compter le
nombre de valeurs strictement positives dans cette
matrice.
119
Tableaux à deux dimensions
Exercice 6
On suppose avoir une matrice carrée M initialisée
avec 25 entiers relatifs. Écrire un algorithme
permettant de rechercher dans la matrice, une valeur
V saisie par l’utilisateur. En cas de succès de la
recherche, les coordonnées en ligne et en colonne de
la valeur dans la matrice sont à afficher.
120
Tableaux à deux dimensions
Exercice 7
On suppose avoir une matrice d’entiers naturels M
de L lignes et de C colonnes initialisée. Écrire un
algorithme permettant à l’utilisateur de saisir une
valeur entière dont il faudra calculer le nombre
d’apparitions dans la matrice.
121
Tableaux à deux dimensions
Exercice 8
Les 12 valeurs réelles suivantes correspondent à une
matrice M implantée en mémoire centrale.
6,51 10,52 -0,11 19,03 17,35 10,40 9,55 -2,95 11,50 13,50 -9,50 1,45
122
Chapitre 5 : Les Procédures et fonctions
123
Introduction aux procédures
• Une procédure est semblable à une « boite » capable d’utiliser
des données en entrée pour produire, parfois en utilisant des
données intermédiaires, des données en résultat.
• L’emploi des procédures augmente la lisibilité et la
réutilisabilité des algorithmes produits, en évitant les
séquences répétitives et en favorisant l’analyse aisée des erreurs
de logique.
124
Introduction aux procédures
• Une procédure porte un nom et doit être complètement
décrite avant toute utilisation.
126
Introduction aux procédures
127
Introduction aux procédures
129
Introduction aux procédures
• Une procédure est utilisée par simple invocation de son
nom : on parle d’appel de procédure.
133
Introduction aux procédures
Procédure CalculerMoyenneDeChaqueEtudiant
/* Elle réalise le calcul de la moyenne en algorithmique de chacun
des étudiants */
Paramètres en entrée :
N est de type entier, correspondant au nombre d’étudiants concernés ;
Note1 est de type Tableau[1..N] réels, correspondant au tableau des notes
du 1er devoir en algorithmique ;
Note2 est de type Tableau[1..N] réels, correspondant au tableau des notes
du 2e devoir en algorithmique ;
Paramètres en sortie :
TMoy est de type Tableau[1..N] réels, correspondant au tableau des
moyennes des étudiants en algorithmique ;
134
Introduction aux procédures
Paramètres en entrée-sortie : néant ;
// Cette procédure emploie 4 arguments lors de son appel.
Variables locales :
i est de type entier, correspondant à l’indice de parcours des tableaux ;
TMoy(i)← (Note1(i)+Note2(i))/2
FinPour
FinProcédure CalculerMoyenneDeChaqueEtudiant
135
Introduction aux procédures
Procédure CalculerStatistiquesClasse
/* Elle calcule les statistiques de la classe en algorithmique */
Paramètres en entrée :
/* A préciser dans le cadre d’un TD */
Paramètres en sortie :
/* A préciser dans le cadre d’un TD */
Paramètres en entrée-sortie :
/* A préciser dans le cadre d’un TD */
Variables locales :
/* A préciser dans le cadre d’un TD */
Bloc logique
/* A préciser dans le cadre d’un TD */
FinProcédure CalculerStatistiquesClasse
136
Introduction aux procédures
Procédure AfficherStatistiquesClasse
/* Affichage des statistiques de la classe en algorithmique */
Paramètres en entrée :
MoyClasse est de type réel, correspondant à la moyenne de la classe à
afficher ;
MaxMoyClasse est de type réel, correspondant à la meilleure moyenne de
la classe à afficher ;
MinMoyClasse est de type réel, correspondant à la plus faible moyenne de
la classe à afficher ;
Paramètres en sortie : néant ;
Paramètres en entrée-sortie : néant ;
// Cette procédure emploie 3 arguments lors de son appel.
Variables locales : néant ;
137
Introduction aux procédures
Ecrire "La moyenne de la classe est ", MoyClasse ;
Ecrire "La meilleure moyenne de la classe est ", MaxMoyClasse ;
Ecrire "La plus faible moyenne de la classe est ", MinMoyClasse
FinProcédure AfficherStatistiquesClasse
138
Introduction aux procédures
• Exemple d’utilisation des procédures
/* On suppose :
- la constante Nb initialisée ;
- les tableaux Nom, Prenom, NoteA, NoteB et TabMoy bien initialisés ;
- les variables MoyCl, MaxMoy, MinMoy déclarées ;
- les descriptions correctes des procédures SaisirNotesEtudiants,
CalculerMoyenneDeChaqueEtudiant, CalculerStatistiquesClasse et
AfficherStatistiquesClasse disponibles.
*/
7) Description de l'enchaînement logique
Début Appel
SaisirNotesEtudiants (Nb, Nom, Prenom, NoteA, NoteB) ; des 4
CalculerMoyenneDeChaqueEtudiant (Nb, NoteA, NoteB, TabMoy) ; procédures
CalculerStatistiquesClasse (Nb, TabMoy, MoyCl, MaxMoy, MinMoy) ; l’une après
AfficherStatistiquesClasse (MoyCl, MaxMoy, MinMoy) l’autre
Fin.
139
Introduction aux procédures
Exercice no1
Ecrire une procédure qui calcule la somme des
éléments d’un tableau de N réels et la met à
disposition à travers l’un de ces paramètres.
Exercice no2
Ecrire une procédure qui calcule la distance entre
deux points A(ax,ay) et B(bx,by) et la met à
disposition à travers l’un de ces paramètres.
140
Introduction aux procédures
Exercice no3
Ecrire une procédure qui élève un réel x à la
puissance b, avec entier naturel supérieur à 0, le
résultat étant mis à disposition à travers l’un de
ces paramètres.
141
Introduction aux fonctions
• Une fonction est une procédure dont le nom est capable
de supporter un résultat.
142
Introduction aux fonctions
• Allure d’une fonction
Fonction nomFonction est de type typeFonction
/* Commentaires sur ce que fait la fonction et sur
le type du résultat supporté par le nom de la fonction*/
Liste descriptive des paramètres en entrée
Liste descriptive des autres paramètres en sortie
Liste descriptive des paramètres en entrée/sortie
Liste descriptive des variables locales
Description de l’enchaînement logique associé
Retourner expression
FinFonction nomFonction
143
Introduction aux fonctions
• Exemple 1 de description de fonction
Fonction Moy2Val est de type réel
/* Elle calcule la moyenne de deux nombres réels qu’elle retourne comme
résultat par l’intermédiaire du nom de la fonction*/
Paramètres en entrée :
Val1 est de type réel, correspondant à la 1re valeur à employer pour la moyenne ;
Val2 est de type réel, correspondant à la 2e valeur à employer pour la moyenne ;
Autres paramètres en sortie : néant ;
Paramètres en entrée-sortie : néant ;
// cette fonction emploie 2 arguments lors de son appel
Variables locales :
MoySimple est de type réel, correspondant à la moyenne calculée ;
MoySimple← (Val1+Val2)/2 ;
Retourner MoySimple
FinFonction Moy2Val 144
Introduction aux fonctions
• Exemple 2 de description de fonction
Fonction Moy2Val est de type réel
/* Elle calcule la moyenne de deux nombres réels qu’elle retourne comme
résultat par l’intermédiaire du nom de la fonction*/
Paramètres en entrée :
Val1 est de type réel, correspondant à la 1re valeur à employer pour calculer la
moyenne ;
Val2 est de type réel, correspondant à la 2e valeur à employer pour calculer la
moyenne ;
Paramètres en sortie : néant ;
Paramètres en entrée-sortie : néant ;
// Cette fonction emploie 2 arguments lors de son appel
Variables locales : néant ;
Retourner (Val1+Val2)/2
FinFonction Moy2Val
145
Introduction aux fonctions
• Une fonction est utilisée par invocation de son nom : on
parle d’appel de fonction.
• Exemple :
moy←Moy2Val(m1, m2) ; // m1 et m2 étant des variables
// de type réel censées initialisées
148
Introduction aux fonctions
/* On suppose :
- la constante N initialisée ;
- les tableaux NoteX et NoteY bien initialisés ;
- le tableau TablMoy déclaré et devant être initialisé ;
- la variable i déclarée comme de type entier naturel ;
- la fonction Moy2Val déjà décrite.
*/
Pour i allant de 1 à N faire
/* appel de la fonction N fois avec la
paire de notes de chaque étudiant */
TablMoy(i)← Moy2Val (NoteX(i), NoteY(i));
FinPour
149
Introduction aux fonctions
• Remarques
- L’emploi de la fonction suppose le respect de l’interface de
communication avec la fonction.
- Le nom de la fonction supporte un résultat, ce qui a permis de le
placer à droite dans une instruction d’affectation ou dans une
expression algébrique, traitement interdit avec une procédure.
- L’affectation, au sein de la fonction, du résultat obtenu au nom de la
fonction est obligatoire et ne se réalise qu’à travers l’instruction
« Retourner expression » toujours présente dans une fonction.
- Le type de la fonction doit être compatible avec le type de la
variable censée recevoir le résultat retourné par le nom de la
fonction.
150
Introduction aux fonctions
Exercice no1
Ecrire une fonction calculant et retournant la somme des éléments d’un
tableau de N réels.
Exercice no2
Ecrire une fonction calculant et retournant la distance entre deux
points A(ax,ay) et B(bx,by) du plan réel.
Exercice no3
Ecrire une fonction qui élève un réel x à la puissance b correspondant à
un entier naturel supérieur à 0, le résultat étant mis à disposition à
travers le nom de la fonction.
151
Modes de passage des paramètres
• Définition
Le mode de passage d'un paramètre désigne la manière dont
une fonction/procédure récupère les valeurs
communiquées via son interface de communication.
Deux principaux modes de passage de paramètres existent :
- le mode de passage par valeur
- le mode de passage par adresse
153
Modes de passage des paramètres
• Contexte d'emploi du mode de passage par valeur
154
Modes de passage des paramètres
Mode de passage de paramètre par valeur
Avantages Inconvénients
156
Modes de passage des paramètres
• Contexte d'emploi du mode de passage par adresse
157
Modes de passage des paramètres
Mode de passage de paramètre par adresse
Avantages Inconvénients
158
Modes de passage des paramètres
La valeur La valeur
modifiée du modifiée du
paramètre ne vous paramètre vous
intéresse pas à la intéresse à la fin de
fin de l’exécution l’exécution de la
de la procédure ou procédure ou de la
de la fonction ? fonction ?
passage par valeur passage par adresse
Paramètre Paramètre
= =
copie de la variable variable originale
159
Modes de passage des paramètres
Les variables en entrée sont transmises par mode de passage
par Valeur
Les variables en entrée sortie, les variables en sortie sont
transmises par le mode de passage par Adresse
Exercice
Préciser les paramètres employés dans l’écriture de chacune des
procédures et fonctions décrites précédemment.
160
Fonction récursive (1/4)
• Définition
Une fonction récursive est une fonction qui, dans sa
description, fait appel à elle-même : on dit qu'elle
s'auto-appelle. Sa description ressemble à celle d'une
suite/série dans laquelle le résultat à une étape n est
obtenue à partir de celui à l'étape n-1, et ainsi de suite.
• Exemple : le factoriel n
n ! = n x (n-1) x (n-2) x . . . x 2 x 1 = n x (n-1) !
161
Fonction récursive (2/4)
• Plusieurs types de récursivité
- Récursivité simple : cas de la fonction qui s'auto-appelle
une seule fois dans sa description.
162
Fonction récursive (3/4)
• Avantages de la récursivité
- Ecriture concise, adaptée au prototypage.
• Inconvénients de la récursivité
- Est consommatrice d'espace mémoire centrale car nécessite
la présence au moins d'une pile pour la gestion des
contextes d'appel qui sont pour chaque instant l'ensemble
de couples (variable,valeur associée).
- Est grande consommatrice de temps machine du fait de la
gestion de la pile (empilement et dépilement), avec très
souvent une complexité exponentielle.
163
Fonction récursive (4/4)
164
Exemple de fonction récursive (1/9)
• Version récursive de la fonction factorielle
Fonction Factoriel est de type entier
/* Elle calcule le factoriel d'un nombre entier naturel qu’elle retourne
comme résultat par l’intermédiaire du nom de la fonction.
Factoriel(4) = 4 x Factoriel(3)
Factoriel(3) = 3 x Factoriel(2)
Factoriel(2) = 2 x Factoriel(1)
Factoriel(1) = 1 x Factoriel(0)
Factoriel(0) = 1
Factoriel(1) = 1 x 1 = 1
Factoriel(2) = 2 x 1= 2
Factoriel(3) = 3 x 2 = 6
Factoriel(4) = 4 x 6 = 24
166
Exemple de fonction récursive (3/9)
• Version récursive de la fonction de Fibonacci
Fonction Fibonacci est de type entier
/* Elle calcule les nombres de Fibonacci qu’elle retourne
comme résultat par l’intermédiaire du nom de la fonction
Fibonacci(0) = 1 ;
Fibonacci(1) = 1 ;
Fibonacci(n) = Fibonacci(n-1) + Fibonacci(n-2) si (n>1).
*/
167
Exemple de fonction récursive (4/9)
Version récursive de la fonction de Fibonacci
Paramètres en entrée :
n est de type entier naturel, correspondant à l'ordre du nombre de la
valeur à calculer ;
Autres paramètres en sortie : néant ;
Paramètres en entrée-sortie : néant ;
Variables locales : néant
Si n <2 alors
Retourner 1 /* condition d'arrêt de la récursivité */
Sinon
Retourner Fibonacci(n-1) + Fibonacci(n-2)
FinSi
FinFonction Fibonacci
168
Exemple de fonction récursive (5/9)
• Exemple de traces d'exécution de la fonction de Fibonacci
Fibonacci(4) = Fibonacci(3) + Fibonacci(2)
Fibonacci(1) =1
Fibonacci(0) =1
Fibonacci(2) = 1 + 1 = 2
Fibonacci(3) = 2 + 1 = 3
Fibonacci(4) = 3 + 2
= 5 : valeur finale retournée par la fonction
169
Exemple de fonction récursive (6/9)
• Version récursive de la fonction d'Ackermann
Fonction Ackermann est de type entier
/*
Elle calcule le nombre d'Ackermann qu’elle retourne
comme résultat par l’intermédiaire du nom de la fonction
Akermann(m, n) = n + 1 si (m = 0) ;
= Akermann(m-1, 1) si (m ≠ 0) et (n = 0) ;
= Akermann(m-1, Akermann(m, n- 1)) si (m ≠ 0) et (n ≠ 0) ;
*/
170
Exemple de fonction récursive (7/9)
• Version récursive de la fonction d'Ackermann
Paramètres en entrée :
m est de type entier naturel, correspondant au 1er élément de calcul du résultat ;
n est de type entier naturel, correspondant au 2e élément de calcul du résultat ;
Autres paramètres en sortie : néant ;
Paramètres en entrée-sortie : néant ;
Variables locales : néant
Si m = 0 alors
Retourner n+1 /* condition d'arrêt de la récursivité */
Sinon
Si n=0 alors
Retourner Ackermann(m-1, 1)
Sinon
Retourner Ackermann(m-1, Ackermann(m, n-1))
FinSi
FinSi
FinFonction Ackermann
171
Exemple de fonction récursive (8/9)
• Exercice 1
Retrouver la trace d'exécution de Ackermann(4, 3).
172
Exemple de fonction récursive (9/9)
• Exercice 2
Trouver la version itérative de la fonction Factoriel(n).
• Exercice 3
Trouver la version itérative de la fonction Fibonacci(n).
• Exercice 4
Trouver la version itérative de la fonction de Ackermann(M,
n).
173
Chapitre 6 : Les Enregistrements
174
Enregistrements
175
Enregistrements
Exemple 1 : l’adresse d’une entreprise
176
Enregistrements
Exemple 1 :
- le nom de l’entreprise chaîne de 30 caractères
- le numéro de l’entrée dans la rue Entier naturel
- le nom de la rue chaîne de 40 caractères Diffé-
- le numéro de la boîte postale rents
Entier naturel
types
- le code postal de la ville Entier naturel
- le nom de la ville chaîne de 35 caractères
- le nom du pays chaîne de 20 caractères
177
Enregistrements
Exemple 2 : la date
la date est une information que nous employons
régulièrement. Elle est constituée d’un nom de
jour, le numéro de jour (quantième), du nom du
mois, le numéro de l’année.
178
Enregistrements
Exemple 2 : la date
179
Enregistrements
Déclaration du type enregistrement
Liste déclarative
de tous les champs,
telle que donnée dans les
paragraphes de déclaration
des données en entrée et sortie
FinEnregistrement
180
Enregistrements
Exemples de déclaration du type enregistrement
FinEnregistrement
181
Enregistrements
ADRESSESOC = Type Enregistrement regroupant
nomSoc est de type chaîne de caractères, correspondant
au nom de la société ;
numEntree est de type entier, correspondant au numéro de
l’entrée sur la rue ;
nomRue est de type chaîne de caractères, correspondant au
nom de la rue ;
bp est de type entier, correspondant au numéro de la
boîte postale ;
cp est de type entier, correspondant au code postal ;
nomVille est de type chaîne de caractères, correspondant
au nom de la ville ;
nomPays est de type chaîne de caractères, correspondant
au nom du pays
FinEnregistrement
182
Enregistrements
Déclaration des variables de type enregistrement
183
Enregistrements
Référence aux champs des variables de type enregistrement
NomVariable●NomChamp
Exemples :
.
depart nomJour pour désigner le nom du jour de la variable
depart
.
adressClient bp pour désigner la boite postale de la variable
adressClient
184
Enregistrements
185
Enregistrements
Exercice : On veut gérer les étudiants inscrits au
cours d’algorithmique et structures de données
statiques.
1) Lister les informations associées à un étudiant.
2) Décrire la structure de données qu’il faudrait
employer.
3) Ecrire un algorithme qui initialise les données
concernant un étudiant.
4) Ecrire un algorithme qui initialise les données des
N étudiants inscrits au cours d’algorithmique et
structures de données statiques.
186
Enregistrements
1) Nom Chaîne de 30 caractères
2) Prénom Chaîne de 50 caractères
3) Genre Caractère
4) Année de naissance Entier naturel
5) Lieu de naissance Chaîne de 30 caractères
6) Numéro de téléphone Chaîne de 20 caractères
7) Email Chaîne de 50 caractères
8) Filière Chaîne de 4 caractères
9) Niveau d’étude Entier naturel
10) Numéro secteur d’habitation Entier naturel
11) Ville d’habitation Chaîne de 20 caractères
12) Boîte postale Chaîne de 10 caractères
13) Statut travail caractère
14) Nationalité Chaîne de 15 caractères
15) Pays de résidence Chaîne de 30 caractères
187
Enregistrements
FinEnregistrement
188
Enregistrements
ETUDIANT = Type Enregistrement regroupant
Nom est de type chaîne de 30 caractères, correspondant à ...
Prenom est de type chaîne de 50 caractères, correspondant à ...
Genre est de type caractère, correspondant à ...
AnNais est de type entier, correspondant à ...
LieuNais est de type chaîne de 30 caractères, correspondant à ...
Filiere est de type chaîne de 4 caractères, correspondant à ...
Niveau est de type entier naturel, correspondant à ...
StatuTravail est de type caractère, correspondant à ...
Nationalite est de type chaîne de 15 caractères, correspondant à ...
Adr est de type ADRESSE, correspondant à ...
FinEnregistrement
189
Enregistrements
Exemples de déclarations de variables
toto est de type ADRESSE, correspondant à ...
bonEtudiant est de type ETUDIANT, correspondant à ...
dernier est de type ETUDIANT, correspondant à ...
[Link] "70726931" ;
[Link] "mdandjinou@[Link]" ;
[Link] 28
190
Enregistrements
Exemples de déclarations de variables
toto est de type ADRESSE, correspondant à …
bonEtudiant est de type ETUDIANT, correspondant à …
dernier est de type ETUDIANT, correspondant à …
[Link] "OUEDRAOGO" ;
[Link] "WENDPANGA" ;
[Link] 'H' ;
[Link] "20202020" ;
[Link] "Bobo-Dioulasso"
191
Enregistrements
Exemples d’initialisation des champs des variables
[Link] "ZIRCONGO" ;
[Link] "Sannom" ;
[Link] 'H’ ;
[Link] "50505050" ;
[Link] "Ouagadougou"
T : tableau [1..6] ETUDIANT
T(1).Nom "SARE" ;
T(1).Prenom "Oussou" ;
T(2).Nom "ZAN" ;
T(2).Prenom "Moussa"
192
Enregistrements
Exerice 1: Gestion d'un calendrier de rendez-vous
Créez un enregistrement RendezVous qui contient les champs suivants :
• titre (chaîne de caractères),
• date (chaîne de caractères),
• heure (chaîne de caractères),
• lieu (chaîne de caractères).
Créez une fonction afficherRendezVous qui prend un enregistrement RendezVous et
affiche les détails du rendez-vous.
194
Chapitre 8 : Les chaînes de caractères
195
Les chaînes de caractères sont des séquences de symboles (lettres, chiffres,
symboles, etc.) traitées comme des unités de données en algorithmique.
Elles sont très courantes dans le développement logiciel et l'analyse de
texte. Voici un aperçu de la manière dont elles sont utilisées et manipulées
en algorithmique, ainsi que quelques opérations courantes associées.
196
Définition d'une chaîne de caractères
197
Opérations sur les chaînes de caractères
198
Opérations sur les chaînes de caractères
200
Exercice 1 : Vérifier si une chaîne est un palindrome
Écrire un algorithme qui vérifie si une chaîne de caractères est un palindrome
(se lit de la même manière de gauche à droite et de droite à gauche).
201
Chapitre 9 : Notion de pointeurs, initiation
aux listes et aux arbres binaires
202
Notion de pointeurs
Un pointeur est une variable qui contient l'adresse mémoire d'une autre
variable, plutôt que sa valeur. Les pointeurs sont utilisés pour accéder
indirectement à des données stockées ailleurs en mémoire. Ils sont
particulièrement utiles pour manipuler des structures de données complexes
comme les listes chaînées, les arbres binaires, etc.
203
Pourquoi utiliser des pointeurs ?
204
Exemple simple d'utilisation d'un pointeur (en pseudocode) :
variable x = 10
pointeur p vers un entier
205
Listes chaînées (Linked Lists)
Une liste chaînée est une structure de données linéaire dans laquelle
chaque élément (appelé nœud) contient une donnée et un pointeur
vers l'élément suivant dans la liste. Contrairement aux tableaux, une
liste chaînée permet une gestion dynamique de la mémoire, ce qui
permet de modifier la taille de la liste à tout moment.
fonction parcourir_liste(tête):
courant = tête
tant que courant != NULL:
afficher [Link]ée
courant = [Link]
Exemple de liste chaînée :
[10] -> [20] -> [30] -> NULL
fonction parcours_in_order(racine):
si racine != NULL:
parcours_in_order([Link])
afficher [Link]ée
parcours_in_order([Link])
209
Arbres binaires (Binary Trees)
1
/\
2 3
/\
4 5
• La racine est 1.
• L'arbre contient les sous-arbres gauche (avec la racine 2 et
ses enfants 4 et 5) et droit (avec la racine 3).
210
211