Bases de Programmation I Algorithmique
Embed Size (px)
Transcript of Bases de Programmation I Algorithmique

DUT Réseaux & Télécommunications 1ère annéeIUT d’Aix-Marseille
J. Seinturier
Laboratoire des Sciences de l’Information et des SystèmesUmr CNRS 7296
Equipe Images & Modèles
[email protected]://www.seinturier.fr
Bases de Programmation I
Algorithmique

« Un programme informatique est une séquence d'instructionsqui spécifie étape par étape les opérations à effectuer pourobtenir un résultat.»
A. Michael Noll, Principles of modern communications technology, Artech House - 2001
Qu’est-ce qu’une instruction ?
Comment décrire un programme de manière universelle ?
Comment grouper des actions informelles en programme ?
1 / 74

Pour faire du café, il faut placer une dosette dans une cafetière, y mettre del’eau, la faire chauffer puis se servir.
Les instructions sont elles claires?
Le programme est-il répétable ?
Comment placer la dosette dans une cafetière ?
…
Instructions simples
Pouvant être répétées, partagées
2 / 74

« Un algorithme est une suite finie d'instructions simplespermettant de résoudre un problème donné en un temps fini.»
Le nombre d’instruction doit être limité et connu.
Chaque instruction doit être compréhensible et effectuablepar un humain ou une machine.
Un algorithme doit produire un résultat en temps voulu.
Mise en place d’un cadre standard pour écrire la suite d’instructions.
3 / 74

Délimité par les mots réservés début et fin
algorithme nomdébutinstruction 1…instruction n
fin
Caractérisé par un nom
Exemple:
algorithme additiondébut
1 + 2fin
nom
Instruction 1
4 / 74

Une seule instruction par ligne
Respect des mots réservés (algorithme, début, fin)
Respect de la casse (Algorithme ≠ algorithme)
Ecriture claire et indentation
Exemple:
algorithme nouvel_algodébutinstruction 1instruction 2
fin
Exemple:
algorithme nouvel algoDébutinstruction 1 instruction 2FIN
5 / 74

Première nature d’un algorithme: faire des calculs
Instructions de base: opérations numériques binaires
Exemple:
algorithme opérationsdébut1 + 53 % 124 - 6
fin
Addition: +
Soustraction: -
Multiplication: ×
Division (quotient): /
Modulo (reste): %
Opérations pouvant être groupées en une instruction grâce aux parenthèses
((2 + 3) × 7) - 1
6 / 74
1 instruction

Conserver des données entre plusieurs instructions
Donner des noms à des valeurs particulières
Nom (ou étiquette, comment identifier la variable)
Type (de quel type est la données stockée dans la variable)
Valeur (donnée elle même)
7 / 74

Toutes les variables d’un algorithme doivent être déclarées dans une section données située au début de l’algorithme.
Syntaxe de déclaration de variable: nom: type
Exemple:
algorithme algo1données
résultat: entierarg1: entier
début…
fin
Deux variables entières déclarées
nom commence par une lettre et ne contient que lettres et chiffres.
type est un type prédéfini.
8 / 74

Nombres:entier – Nombres entier relatifs (1, 2, 109 867, 0, -12, …)réel – Nombres réels relatifs (1.5, 3.6, …)
Logique:booléen – valeur de vérité (vrai, faux)
Textuelle:caractère – lettre, chiffre entourés de côtes (‘A‘, ‘2‘, …)
chaine – chaine de caractères entourés de guillemets ("Bonjour" , …)
9 / 74

Affection d’une valeur à une variable nom ← valeur
Considéré comme une instruction de l’algorithme.
Une variable peut être utilisée comme une valeur normale.
Le résultat d’opération numérique peut être affecté.
Exemple:
algorithme additiondonnées
résultat: entierdébut
résultat ← 0résultat ← 1 + 2 résultat ← résultat + 5
fin
Affecte une valeurAffecte un résultatd’opération Incrémentation d’une variable
10 / 74

Un algorithme est destiné à produire des données en sortie à partir de données passées en entrée.
Exemple:
Algorithme qui calcule la somme de deux nombres donnés par unutilisateur.
Par convention un algorithme peut avoir: Un nombre quelconque d’entrées; Une seule sortie.
Les entrées et la sortie d’un algorithme sont traitées comme des variables.
11 / 74

Les variables d’entrées d’un algorithme doivent être déclarées dans la section entrées située au début de l’algorithme.La variable de sortie d’un algorithme doit être déclarée dans la section sortie située au début de l’algorithme.Par convention la section entrées précède la section sortie.
Exemple:
algorithme addition_paramentrées
a: entierb: entier
sortierésultat: entier
débutrésultat ← a + b
fin
12 / 74

Il est possible de réaliser des entrées / sorties vers des variables dans un algorithme en utilisant des instructions spécifiques:
entrée: lire() – retourne une valeur demandée à l’utilisateur;
sortie: ecrire(nom) – écrit la variable identifiée par nom.
Exemple:
algorithme addition_iodonnées
a: réel b: réelrésultat: entier
débuta ← lire() b ← lire()résultat ← a + b ecrire(résultat)
fin
L’utilisateur entre la valeur de aL’utilisateur entre la valeur de b
Affichage du résultat
13 / 74

Opérations ou calcul (+, -, ×, /, %)Peuvent être utilisées comme des valeurs;Peuvent être associées et imbriquées à l’aide de parenthèses ( et );
Ont les mêmes propriétés algébriques qu’en mathématiques.
Exemple:
algorithme moyennedonnées
a: réel b: réel
débuta ← lire() b ← lire()ecrire((a + b)/2)
finExpression composée utilisée comme valeur
14 / 74

Un algorithme peut être lui-même une instruction
Il est appelé en utilisant son nom et ses variables d’entréeavec la syntaxe: nom(var1, var2, …, varn)
Chaque variable vari doit être remplacée par sa valeur dans l’ordre de déclaration des données de l’algorithme nom;
Si l’algorithme appelé possède une variable de sortie, alors il peut être utilisé comme une valeur et être affecté à une autre variable.
myvar: typemyvar ← nom(var1, var2, …, varn)
15 / 74

algorithme addition_paramentrées
a: entierb: entier
sortierésultat: entier
débutrésultat ← a + b
fin
algorithme moyennedonnées
alpha: entier beta: entier m: réel
débutalpha ← lire() beta ← lire()m ← addition_param(alpha, beta)m ← m / 2ecrire(m)
fin
16 / 74

algorithme addition_paramentrées
a: entierb: entier
sortierésultat: entier
débutrésultat ← a + b
fin
algorithme moyennedonnées
alpha: entier beta: entier m: réel
débutalpha ← lire() beta ← lire()m ← addition_param(alpha, beta)m ← m / 2ecrire(m)
fin
1. Appel de l’algorithme addition_paramcomme une instruction de moyenne.
16 / 74

algorithme addition_paramentrées
a: entierb: entier
sortierésultat: entier
débutrésultat ← a + b
fin
algorithme moyennedonnées
alpha: entier beta: entier m: réel
débutalpha ← lire() beta ← lire()m ← addition_param(alpha, beta)m ← m / 2ecrire(m)
fin
2. Utilisation de la valeur de alpha comme entrée aet de la valeur de beta comme entrée b.
16 / 74

algorithme addition_paramentrées
a: entierb: entier
sortierésultat: entier
débutrésultat ← a + b
fin
algorithme moyennedonnées
alpha: entier beta: entier m: réel
débutalpha ← lire() beta ← lire()m ← addition_param(alpha, beta)m ← m / 2ecrire(m)
fin3. La valeur de résultat est affectée à la
variable m à la fin de l’algorithme
16 / 74

algorithme addition_paramentrées
a: entierb: entier
sortierésultat: entier
débutrésultat ← a + b
fin
algorithme moyennedonnées
alpha: entier beta: entier m: réel
débutalpha ← lire() beta ← lire()m ← addition_param(alpha, beta)m ← m / 2ecrire(résultat)
fin
1. Appel de l’algorithme addition_paramcomme une instruction de moyenne.
2. Utilisation de la valeur de alpha comme entrée aet de la valeur de beta comme entrée b.
3. La valeur de résultat est affectée à lavariable m à la fin de l’algorithme
16 / 74

Lorsque l’on utilise un algorithme comme une fonction:Les types des entrées / sorties de l’algorithme fonction et de celui qui l’appelle doivent être compatibles;
On ne peut affecter un algorithme qui n’a pas de sortie à une variable;
Il faut passer le bon nombre de variables d’entrées à l’algorithme appelé;
algorithme affiche_chainesentrées
a: chaineb: chaine
débutecrire(a)ecrire(b)
fin
algorithme moyennedonnées
alpha: entier beta: entier m: réel
débutm ← affiche_chaines(alpha, beta, theta)ecrire(m)
fin Pas de sortie
Mauvais type
# variables
17 / 74

Un algorithme est une suite linéaire d’instruction
Changer de comportement dans des cas particuliers ?
Exemple:
La valeur absolue |X| d’un nombre est X s’il est positif ou –X s’il est négatif (|2| = 2 mais |-2| = -1 × -2 = 2)
En langage naturel, utilisation de si alors … sinon …
Exemple:
Si X est positif alors |X| = X sinon |X| = -X.
18 / 74

Définition d’un bloc conditionnel
si condition alorsinstruction1… instructionn
sinoninstruction1… instructionm
finsi
Mots réservés: si, alors, sinon, finsi
Le bloc sinon est optionnel
condition doit être une expression, une variable ou une fonctionde type booléen
si condition alorsinstruction1… instructionn
finsi
19 / 74

Sur l’ensemble {vrai, faux}
Opérateurs binaires (ou, et) et unaire (non) permettant de réaliser des conditions complexes
Définis par des tables de vérité
2 valeurs possibles {vrai, faux}
Peuvent être obtenues depuis d’autre types à l’aide de fonctions booléennes.
Pour les nombres : <, ≤ , >, ≥ , =, ≠Pour les caractères et les chaines : =, ≠
20 / 74

Conjonction logique, notée etTable de vérité
Si a et b sont deux variables booléennes alors a et b est vrai si etseulement si a est vrai et b est vrai.
Exemple:Soit a = 4 et b = 5, la condition a > 3 et b ≠ 2 à pour valeur vrai.La condition a ≠ 4 et b ≠ 2 a pour valeur faux
21 / 74
et vrai Faux
vrai vrai faux
faux faux faux

Disjonction logique, notée ouTable de vérité
Si a et b sont deux variables booléennes alors a ou b est vrai si etseulement si l’une des deux variables au moins a pour valeur vrai.
Exemple:Soit a = 4 et b = 5, la condition a > 3 ou b ≠ 2 à pour valeur vrai.La condition a ≠ 4 et b ≠ 2 a pour valeur vrai.
22 / 74
ou vrai Faux
vrai vrai vrai
faux vrai faux

Négation logique, notée nonTable de vérité
Si a est une variable booléenne alors non a vaut vrai si a vaut faux etnon a vaut faux si a vaut vrai.
Exemple:Soit a = 4 et b = 5, la condition non a > 3 à pour valeur faux.La condition non a ≠ 4 a pour valeur vrai.
23 / 74
vrai faux
non faux vrai

Les opérations booléennes peuvent être utilisées comme des instructions.
Mots réservés et, ou, non
Instructions composables avec des parenthèses
Pouvant être affecté à une variable de type booléen
algorithme op_booldonnées
a: booléenb: booléenc: booléend: booléen
débutc ← non ((a ou b) et d)
fin
24 / 74

Exemple
algorithme absentréesval: entier
sortieabsolue: entier
débutsi val ≥ 0 alorsabsolue ← val
sinonabsolue ← -1 × val
finsi fin
25 / 74

Les expressions booléennes peuvent être composées en utilisant les opérateurs et, ou, non et les parenthèses
Exemple
algorithme dummyentréesval: entier
sortieres: booléen
débutres ← fauxsi non ((val ≥ 0) et (val ≠ 2)) ou (val < 0) alorsres ← vrai
finsifin
26 / 74

Exécuter plusieurs fois des instructions sans avoir à les réécrire.
Répéter des instructions en fonction de certaines conditions,
Exemple:
Calculer la somme de tous les entiers inférieurs ou égaux à un nombreentier n donné: n + (n – 1) + (n – 2) × + … + 1
Pour 5 on a 5 + 4 + 3 + 2 + 1 = 15
27 / 74

Définition d’un bloc itératifMots réservés: tantque, faire, fintq
tantque condition faireinstruction1… instructionn
fintq
Le bloc itératif peut contenir des instructions ou d’autres blocs
condition est une expression ou une variable booléenne
Tant que condition est vraie, les instructions du bloc sontrépétées.
28 / 74

Fonctionnement
tantque condition faireinstruction1… instructionn
fintq
1. Evaluation de condition.
2. Si condition est vraie, continuer, sinon, aller à 5.
3. Exécution de toutes les instructions contenues dans le bloc.
4. Retour à 1.
5. Continuer l’algorithme après le fintantque.
29 / 74

Fonctionnement
tantque condition faireinstruction1… instructionn
fintq
1. Evaluation de condition.
2. Si condition est vraie, continuer, sinon, aller à 5.
3. Exécution de toutes les instructions contenues dans le bloc.
4. Retour à 1.
5. Continuer l’algorithme après le fintantque.
29 / 74

Fonctionnement
tantque condition faireinstruction1… instructionn
fintq
1. Evaluation de condition.
2. Si condition est vraie, continuer, sinon, aller à 5.
3. Exécution de toutes les instructions contenues dans le bloc.
4. Retour à 1.
5. Continuer l’algorithme après le fintantque.
29 / 74

Fonctionnement
tantque condition faireinstruction1… instructionn
fintq
1. Evaluation de condition.
2. Si condition est vraie, continuer, sinon, aller à 5.
3. Exécution de toutes les instructions contenues dans le bloc.
4. Retour à 1.
5. Continuer l’algorithme après le fintantque.
29 / 74

Fonctionnement
tantque condition faireinstruction1… instructionn
fintq
1. Evaluation de condition.
2. Si condition est vraie, continuer, sinon, aller à 5.
3. Exécution de toutes les instructions contenues dans le bloc.
4. Retour à 1.
5. Continuer l’algorithme après le fintantque.
29 / 74

Exemple:
Calculer la somme de tous les entiers inférieurs ou égaux à 3.
algorithme sommenentréesn: entier
sortieresultat: entier
débutresultat ← 0tantque n > 0 faire resultat ← resultat + n n ← n - 1
fintq fin
30 / 74

Exemple:
Calculer la somme de tous les entiers inférieurs ou égaux à 3.
algorithme sommenentréesn: entier
sortie:resultat: entier
débutresultat ← 0tantque n > 0 faire resultat ← resultat + n n ← n - 1
fintq fin
Valeur des variables:
n resultat n > 0
30 / 74
3 0 vrai

Exemple:
Calculer la somme de tous les entiers inférieurs ou égaux à 3.
algorithme sommenentréesn: entier
sortieresultat: entier
débutresultat ← 0tantque n > 0 faire resultat ← resultat + n n ← n - 1
fintq fin
n resultat n > 0
30 / 74
3 0 vrai
3 3 vrai

Exemple:
Calculer la somme de tous les entiers inférieurs ou égaux à 3.
algorithme sommenentréesn: entier
sortieresultat: entier
débutresultat ← 0tantque n > 0 faire resultat ← resultat + n n ← n - 1
fintq fin
n resultat n > 0
30 / 74
3 0 vrai
3 3 vrai
2 3 vrai

Exemple:
Calculer la somme de tous les entiers inférieurs ou égaux à 3.
algorithme sommenentréesn: entier
sortieresultat: entier
débutresultat ← 0tantque n > 0 faire resultat ← resultat + n n ← n - 1
fintq fin
n resultat n > 0
30 / 74
3 0 vrai
3 3 vrai
2 3 vrai

Exemple:
Calculer la somme de tous les entiers inférieurs ou égaux à 3.
algorithme sommenentréesn: entier
sortieresultat: entier
débutresultat ← 0tantque n > 0 faire resultat ← resultat + n n ← n - 1
fintq fin
n resultat n > 0
30 / 74
2 3 vrai

Exemple:
Calculer la somme de tous les entiers inférieurs ou égaux à 3.
algorithme sommenentréesn: entier
sortieresultat: entier
débutresultat ← 0tantque n > 0 faire resultat ← resultat + n n ← n - 1
fintq fin
n resultat n > 0
30 / 74
2 3 vrai
2 5 vrai

Exemple:
Calculer la somme de tous les entiers inférieurs ou égaux à 3.
algorithme sommenentréesn: entier
sortieresultat: entier
débutresultat ← 0tantque n > 0 faire resultat ← resultat + n n ← n - 1
fintq fin
n resultat n > 0
30 / 74
2 3 vrai
2 5 vrai
1 5 vrai

Exemple:
Calculer la somme de tous les entiers inférieurs ou égaux à 3.
algorithme sommenentréesn: entier
sortieresultat: entier
débutresultat ← 0tantque n > 0 faire resultat ← resultat + n n ← n - 1
fintq fin
n resultat n > 0
30 / 74
2 3 vrai
2 5 vrai
1 5 vrai

Exemple:
Calculer la somme de tous les entiers inférieurs ou égaux à 3.
algorithme sommenentréesn: entier
sortie:resultat: entier
débutresultat ← 0tantque n > 0 faire resultat ← resultat + n n ← n - 1
fintq fin
n resultat n > 0
30 / 74
1 5 vrai

Exemple:
Calculer la somme de tous les entiers inférieurs ou égaux à 3.
algorithme sommenentréesn: entier
sortieresultat: entier
débutresultat ← 0tantque n > 0 faire resultat ← resultat + n n ← n - 1
fintq fin
n resultat n > 0
30 / 74
1 5 vrai
1 6 vrai

Exemple:
Calculer la somme de tous les entiers inférieurs ou égaux à 3.
algorithme sommenentréesn: entier
sortieresultat: entier
débutresultat ← 0tantque n > 0 faire resultat ← resultat + n n ← n - 1
fintq fin
n resultat n > 0
30 / 74
1 5 vrai
1 6 vrai
0 6 faux

Exemple:
Calculer la somme de tous les entiers inférieurs ou égaux à 3.
algorithme sommenentréesn: entier
sortieresultat: entier
débutresultat ← 0tantque n > 0 faire resultat ← resultat + n n ← n - 1
fintq fin
n resultat n > 0
30 / 74
1 5 vrai
1 6 vrai
0 6 faux

Exemple:
Calculer la somme de tous les entiers inférieurs ou égaux à 3.
algorithme sommenentréesn: entier
sortieresultat: entier
débutresultat ← 0tantque n > 0 faire resultat ← resultat + n n ← n - 1
fintq fin
n resultat n > 0
30 / 74
0 6 faux

Exemple:
Calculer la somme de tous les entiers inférieurs ou égaux à 3.
algorithme sommenentréesn: entier
sortieresultat: entier
débutresultat ← 0tantque n > 0 faire resultat ← resultat + n n ← n - 1
fintq fin
n resultat n > 0
30 / 74
0 6 faux

Fin de l’algorithme avec n = 0 et résultat = 6.
Exemple:
Calculer la somme de tous les entiers inférieurs ou égaux à 3.
algorithme sommenentréesn: entier
sortieresultat: entier
débutresultat ← 0tantque n > 0 faire resultat ← resultat + n n ← n - 1
fintq fin
30 / 74

Besoin de traiter des valeurs groupées
Utilisables avec les types de base
Utilisable comme des variables
Avoir plusieurs entrées / sorties de taille variables
Représentation de données Mathématiques (vecteurs, matrices, …)
Textuelles (chaines de caractères)
31 / 74

DéclarationDans un bloc données, entrées ou sortie
nom: type[]
Ajout de deux crochets [] après le type
la variable nom est un tableau contenant des valeurs du type type
InitialisationDans un bloc d’instruction
nom ← type[X]
La variable nom est un tableau de X valeurs (0 ≤ X, X fini)
32 / 74

Taille du tableauFonction taille: taille(nom)
Retourne un nombre entier représentant le nombre de valeurs contenue dans le tableau (c’est à dire le X utilisé pour l’initialisation)
Accès à une valeur du tableau
Chaque valeur indexée par un entier de 0 à taille - 1
Accès grâce aux crochets: tab[i]
Accède à la valeur à l’index i du tableau, 0 ≤ i < taille(tab)
Index de la 1iere valeur: 0, index de la dernière valeur: taille(tab) - 1
ATTENTION: Index de la iieme valeur: i - 1
33 / 74

Récupération des valeurs à partir d’un index
Valeur directe: tab[i]
Affectation à une variable: myvar ← tab[i]
Affectation d’une valeur à un index
Valeur directe: tab[i] ← 12
Depuis une variable: tab[i] ← myvar
Valeur / variable doivent être du même type que les valeurs du tableau
Utilisation des valeurs du tableau = utilisation de variables
34 / 74

Exemple:
Représenter un tableau de 3 valeurs entières [12, -5, 3]
algorithme tableaudonnéestab: entier[] t: entier myvar: réel
débuttab ← entier[3]
t ← taille(tab) myvar ← tab[2]
fin
35 / 74
tab[0] ← 12tab[1] ← -5tab[3] ← 3

Exemple:
Représenter un tableau de 3 valeurs entières [12, -5, 3]
algorithme tableaudonnéestab: entier[] t: entier myvar: réel
débuttab ← entier[3]
Déclaration du tableau
t ← taille(tab) myvar ← tab[2]
fin
35 / 74
tab[0] ← 12tab[1] ← -5tab[3] ← 3

Exemple:
Représenter un tableau de 3 valeurs entières [12, -5, 3]
algorithme tableaudonnéestab: entier[] t: entier myvar: réel
débuttab ← entier[3]
Déclaration du tableau
Initialisation du tableau
t ← taille(tab) myvar ← tab[2]
fin
35 / 74
tab[0] ← 12tab[1] ← -5tab[3] ← 3

Exemple:
Représenter un tableau de 3 valeurs entières [12, -5, 3]
algorithme tableaudonnéestab: entier[] t: entier myvar: réel
débuttab ← entier[3]
Déclaration du tableau
Initialisation du tableauAffectation de la première valeur du tableau
t ← taille(tab) myvar ← tab[2]
fin
35 / 74
tab[0] ← 12tab[1] ← -5tab[3] ← 3

Exemple:
Représenter un tableau de 3 valeurs entières [12, -5, 3]
algorithme tableaudonnéestab: entier[] t: entier myvar: réel
débuttab ← entier[3] tab[0] ← 12tab[1] ← -5tab[3] ← 3t ← taille(tab) myvar ← tab[2]
fin
Déclaration du tableau
Initialisation du tableau Affectation de la première valeur du tableau
Affectation de la deuxième valeur du tableau
35 / 74

Exemple:
Représenter un tableau de 3 valeurs entières [12, -5, 3]
algorithme tableaudonnéestab: entier[] t: entier myvar: réel
débuttab ← entier[3] tab[0] ← 12tab[1] ← -5tab[3] ← 3t ← taille(tab) myvar ← tab[2]
fin
Déclaration du tableau
Initialisation du tableau Affectation de la première valeur du tableau
Affectation de la deuxième valeur du tableauAffectation de la troisième valeur du tableau
35 / 74

Exemple:
Représenter un tableau de 3 valeurs entières [12, -5, 3]
algorithme tableaudonnéestab: entier[] t: entier myvar: réel
débuttab ← entier[3] tab[0] ← 12tab[1] ← -5tab[3] ← 3t ← taille(tab) myvar ← tab[2]
fin
Déclaration du tableau
Initialisation du tableau Affectation de la première valeur du tableau
Affectation de la deuxième valeur du tableau Affectation de la troisième valeur du tableau
Récupération de la taille du tableau
35 / 74

Exemple:
Représenter un tableau de 3 valeurs entières [12, -5, 3]
algorithme tableaudonnéestab: entier[] t: entier myvar: réel
débuttab ← entier[3] tab[0] ← 12tab[1] ← -5tab[3] ← 3t ← taille(tab) myvar ← tab[2]
fin
Déclaration du tableau
Initialisation du tableau Affectation de la première valeur du tableau
Affectation de la deuxième valeur du tableau Affectation de la troisième valeur du tableau
Récupération de la taille du tableauRécupération de la troisième valeur du tableau
35 / 74

Exemple:
Représenter un tableau de 3 valeurs entières [12, -5, 3]
algorithme tableaudonnéestab: entier[] t: entier myvar: réel
débuttab ← entier[3] tab[0] ← 12tab[1] ← -5tab[3] ← 3t ← taille(tab) myvar ← tab[2]
fin
Déclaration du tableau
Initialisation du tableau Affectation de la première valeur du tableau
Affectation de la deuxième valeur du tableau Affectation de la troisième valeur du tableau
Récupération de la taille du tableauRécupération de la troisième valeur du tableau
35 / 74

Exemple:
Ecrire un algorithme qui calcule la valeur Δ d’un trinôme du second degré.
Rappel:Trinôme du second degré: ax² + bx + cΔ = b² - 4ac
Représentation:Tableau de trois valeurs t = [a, b, c]avec t[0] = a, t[1] = b, t[2] = c
Δ = b² - 4ac = t[1] × t[1] - 4 × t[0] × t[2]
36 / 74

Exemple:
Ecrire un algorithme qui calcule la valeur Δ d’un trinôme du second degré.
algorithme deltaentrées
coefs: réel[]sortie
delta: réeldébut
si taille(coefs) = 3 alorsdelta ← coefs[1] × coefs[1] - 4 × coefs[0] × coefs[2]
sinonecrire(‘’Trinôme invalide’’)
finsi fin
37 / 74

Utilisation de boucle tanque et d’un compteurParcours et affichage d’un tableau tab avec un compteur cpt
cpt ← 0tantque cpt < taille(tab) faireecrire(tab[cpt])cpt ← cpt + 1
fintq
Autant de passages dans le bloc tanque qu’il y a de valeurs dans letableau,
Réutilisable facilement pour des traitements plus lourds.
38 / 74

Exemple: Ecrire un algorithme qui calcule et retourne la moyenne des notes d’une promotion. Les notes sont données sous-forme d’un tableau de nombre réels.
algorithme moyenneentrées
notes: réel[]sortie
moy: réeldonnées
cpt: entierdébut
cpt ← 0moy ← 0tanque cpt < taille(notes) faire
moy ← moy +notes[cpt] cpt ← cpt +1
fintqmoy ← moy / taille(notes)
fin
39 / 74

Représenter des tableaux en deux dimensions:Matrices à n lignes et m colonnes (n × m)
Tables diverses (feuilles de calculs)
Représenter des tableaux en trois dimensions Ensembles de points ou de vecteurs dans un espace 3D
Ensemble de triplets quelconque de valeurs
Représenter des objets en 4 dimension ou plusObjets mathématiques complexes
Vecteurs de dimension > 3
40 / 74

Matrice de dimension 2:
Matrice de dimension 3:
2 1 5 6 7 38 6 3 1 3 23 7 5 1 6 4
8 1 2 3
41 / 74
2 18 6 3 1 3 23 7 5 1 6 4
[ 5 3 7 2 ][ 8 4 6 1 ]
[ 9 1 5 2 ]

Représenter des tableaux à n lignes et m colonnes (n × m)
… ]n - 1 [ vn,0 vn, m
Colonne 1
Chaque case du tableau est indicée par un couple (i, j) avec 0 ≤ i < net 0 ≤ j < m qui désignent respectivement un numéro de colonne etun numéro de ligne.
ATTENTION: par convention, les numéros de lignes / colonnes débutent à 0 !! La première colonne / ligne porte le numéro 0
42 / 74
0 1 … m - 1
0
…
[
[
… … … ]
]
Ligne 0v0,0 v0,1 … v0, m
…
vn,1

43 / 74
Exemple: Tableau t à deux dimension de taille 3 × 4 (3 lignes et 4 colonnes)
1ière1ière2ième2ième3ième
ligne, 1ièreligne, 2ièmeligne, 2ièmeligne, 4ièmeligne, 4ième
colonnecolonnecolonnecolonnecolonne
0 1 2 3
0 [ 5 3 7 2 ]1 [ 8 4 6 1 ]2 [ 9 1 5 2 ]
t0,0 = 5 – ligne 0, colonne 0 –t0,1 = 3 – ligne 0, colonne 1 -t1,1 = 4 – ligne 1, colonne 1 –t1,3 = 1 – ligne 1, colonne 3 –t2,3 = 2 – ligne 2, colonne 3 –

Dans un bloc données, entrées ou sortie
nom: type[]…[]
Ajout d’un couples crochets [] après le type pour chaque dimension
la variable nom est un tableau contenant des valeurs du type type
InitialisationDans un bloc d’instruction
nom ← type[dim1]…[dimn]
La variable nom est un tableau à n dimensions où chaquedimension contient dimi valeurs (0 ≤ dimi, dimi fini)
Déclaration
44 / 74

Taille du tableauFonction dimension: dimension(nom, i)
Retourne un nombre entier représentant le nombre de valeurs pour la dimension i du tableau.
Accès à une valeur du tableau
Chaque dimension k indexée par un entier ik de 0 à dimension(nom, i) - 1
Accès grâce aux crochets: tab[i1]…[in]
45 / 74

Dans un bloc données, entrées ou sortie
nom: type[][]
Ajout de deux couples crochets [][] pour les lignes et les colonnes
InitialisationDans un bloc d’instruction
nom ← type[nbLignes][nbColonnes]
La variable nom est un tableau à 2 dimensions ayant un nombrede lignes / colonnes égal à nbLignes / nbColonnes
Déclaration
46 / 74

Taille du tableauNombre de lignes: dimension(nom, 0)
Accès à une valeur du tableau
Accès grâce aux crochets: tab[i][j]
Nombre de colonnes: dimension(nom, 1)
i de 0 à dimension(nom, 0) - 1
j de 0 à dimension(nom, 1) - 1
47 / 74

Notion de tableau de tableaux
0 1 … m - 1
0
…
n - 1
[
[
[
v0,0 v0,1 v0, m… ]
]
]
… … … …vn,0 vn,1 vn, m…
Ligne 0
Ligne i
Ligne n - 1
Chaque ligne du tableau à 2 dimensions est un tableau à 1 dimension
Représentation à plat:
[ … … … … ], [ vn,0 vn,1 … vn, m[[
48 / 74
v0,0 v0,1 … v0, m
Ligne 0
], ]]Ligne i Ligne n - 1

Exemple: Tableau t à deux dimension de taille 3 × 4 (3 lignes et 4 colonnes)
t = [ [5, 3, 7, 2], [8, 4, 6, 1], [9, 1, 5, 2] ]
t[0] = [5, 3, 7, 2]t[1] = [8, 4, 6, 1]t[2] = [9, 1, 5, 2]
t[0][0] = 5t[1][2] = 6t[2][3] = 2
49 / 74
0 1 2 3
0 [ 5 3 7 2 ]1 [ 8 4 6 1 ]2 [ 9 1 5 2 ]

Exemple:
Créer un tableau nommé tab de dimensions 3 x 4 et contenant des valeursentières puis ensuite:- affecter la valeur 3 à la case sur trouvant sur la première ligne et la
deuxième colonne;- afficher la valeur de la case se trouvant sur la deuxième ligne et la
troisième colonne.
algorithme tableau2dentrées
50 / 74
tab: entier[][]début
tab ← entier[3][4]
Déclaration
Initialisation
tab[0][1] ← 3 Affectation
ecrire(tab[1][2])fin
Ecriture

Utilisation de blocs tanque imbriqués et de compteursParcours et affichage d’un tableau tab avec un compteur cpt
cpt_1 ← 0tantque cpt_1 < dimension(tab, 1) faire…cpt_n ← 0tantque cpt_n < dimension(tab, n) faire traitement de la case tab[cpt_1]…[cpt_n] cpt_n ← cpt_n + 1
fintq…cpt_1 ← cpt_1 + 1
fintq
51 / 74

Exemple: Ecrire un algorithme qui prend en entrée un tableau de réels de dimension 2 et qui affecte 0 à toutes ses cases.
algorithme affectetab2dentrées
tab: réel[][]données
cpt_1, cpt_2: entierdébut
cpt_1 ← 0tanque cpt_1 < dimension(tab, 0) faire
cpt_2 ← 0tanque cpt_2 < dimension(tab, 1) faire
tab[cpt_1][cpt_2] ← 0 cpt_2 ← cpt_2 + 1
fintqcpt_1 ← cpt_1 + 1
fintqfin
52 / 74

0 1 2
0
1
[
[
5 3 7 ]
]8 4 6
tanque cpt_1 < dimension(tab, 0)faire cpt_2 ← 0tanque cpt_2 < dimension(tab, 1) faire
tab[cpt_1][cpt_2] ← 0cpt_2 ← cpt_2 + 1
fintqcpt_1 ← cpt_1 + 1
fintq
53 / 74
dimension(tab, 0) = 2dimension(tab, 1) = 3
cpt_1 cpt_2
0 -

tanque cpt_1 < dimension(tab, 0)faire cpt_2 ← 0tanque cpt_2 < dimension(tab, 1) faire
tab[cpt_1][cpt_2] ← 0cpt_2 ← cpt_2 + 1
fintqcpt_1 ← cpt_1 + 1
fintq
53 / 74
0 1 2
0 [ 5 3 7 ]
1 [ 8 4 6 ]
cpt_1 cpt_2
0 0

0 1 2
0
1
[
[
5 3 7 ]
]8 4 6
tanque cpt_1 < dimension(tab, 0)faire cpt_2 ← 0tanque cpt_2 < dimension(tab, 1) faire
tab[cpt_1][cpt_2] ← 0cpt_2 ← cpt_2 + 1
fintqcpt_1 ← cpt_1 + 1
fintq
53 / 74
dimension(tab, 0) = 2dimension(tab, 1) = 3
cpt_1 cpt_2
0 0

tanque cpt_1 < dimension(tab, 0)faire cpt_2 ← 0tanque cpt_2 < dimension(tab, 1) faire
tab[cpt_1][cpt_2] ← 0cpt_2 ← cpt_2 + 1
fintqcpt_1 ← cpt_1 + 1
fintq
53 / 74
0 1 2
0 [ 0 3 7 ]
1 [ 8 4 6 ]
cpt_1 cpt_2
0 0

tanque cpt_1 < dimension(tab, 0)faire cpt_2 ← 0tanque cpt_2 < dimension(tab, 1) faire
tab[cpt_1][cpt_2] ← 0cpt_2 ← cpt_2 + 1
fintqcpt_1 ← cpt_1 + 1
fintq
53 / 74
0 3 7
0 1 2
0 [ ]
1 [ 8 4 6 ]
cpt_1 cpt_2
0 1

]
]8 4 6
0 1 2
0
1
[
[
tanque cpt_1 < dimension(tab, 0)faire cpt_2 ← 0tanque cpt_2 < dimension(tab, 1) faire
tab[cpt_1][cpt_2] ← 0cpt_2 ← cpt_2 + 1
fintqcpt_1 ← cpt_1 + 1
fintq
53 / 74
dimension(tab, 0) = 2dimension(tab, 1) = 3
0 3 7cpt_1 cpt_2
0 1

tanque cpt_1 < dimension(tab, 0)faire cpt_2 ← 0tanque cpt_2 < dimension(tab, 1) faire
tab[cpt_1][cpt_2] ← 0cpt_2 ← cpt_2 + 1
fintqcpt_1 ← cpt_1 + 1
fintq
53 / 74
0 0 7
0 1 2
0 [ ]
1 [ 8 4 6 ]
cpt_1 cpt_2
0 1

tanque cpt_1 < dimension(tab, 0)faire cpt_2 ← 0tanque cpt_2 < dimension(tab, 1) faire
tab[cpt_1][cpt_2] ← 0cpt_2 ← cpt_2 + 1
fintqcpt_1 ← cpt_1 + 1
fintq
53 / 74
0 0 7
0 1 2
0 [ ]
1 [ 8 4 6 ]
cpt_1 cpt_2
0 2

]
]8 4 6
0 1 2
0
1
[
[
tanque cpt_1 < dimension(tab, 0)faire cpt_2 ← 0tanque cpt_2 < dimension(tab, 1) faire
tab[cpt_1][cpt_2] ← 0cpt_2 ← cpt_2 + 1
fintqcpt_1 ← cpt_1 + 1
fintq
53 / 74
dimension(tab, 0) = 2dimension(tab, 1) = 3
0 0 7cpt_1 cpt_2
0 2

tanque cpt_1 < dimension(tab, 0)faire cpt_2 ← 0tanque cpt_2 < dimension(tab, 1) faire
tab[cpt_1][cpt_2] ← 0cpt_2 ← cpt_2 + 1
fintqcpt_1 ← cpt_1 + 1
fintq
53 / 74
0 0 0
0 1 2
0 [ ]
1 [ 8 4 6 ]
cpt_1 cpt_2
0 2

tanque cpt_1 < dimension(tab, 0)faire cpt_2 ← 0tanque cpt_2 < dimension(tab, 1) faire
tab[cpt_1][cpt_2] ← 0cpt_2 ← cpt_2 + 1
fintqcpt_1 ← cpt_1 + 1
fintq
53 / 74
0 0 0
0 1 2
0 [ ]
1 [ 8 4 6 ]
cpt_1 cpt_2
0 3

]
]8 4 6
0 1 2
0
1
[
[
tanque cpt_1 < dimension(tab, 0)faire cpt_2 ← 0tanque cpt_2 < dimension(tab, 1) faire
tab[cpt_1][cpt_2] ← 0cpt_2 ← cpt_2 + 1
fintqcpt_1 ← cpt_1 + 1
fintq
53 / 74
dimension(tab, 0) = 2dimension(tab, 1) = 3
0 0 0cpt_1 cpt_2
0 3

]
]
0 1 2
0
1
[
[
tanque cpt_1 < dimension(tab, 0)faire cpt_2 ← 0tanque cpt_2 < dimension(tab, 1) faire
tab[cpt_1][cpt_2] ← 0cpt_2 ← cpt_2 + 1
fintqcpt_1 ← cpt_1 + 1
fintq
53 / 74
0 0 0
8 4 6
cpt_1 cpt_2
1 3

]
]
0 1 2
0
1
[
[
tanque cpt_1 < dimension(tab, 0)faire cpt_2 ← 0tanque cpt_2 < dimension(tab, 1) faire
tab[cpt_1][cpt_2] ← 0cpt_2 ← cpt_2 + 1
fintqcpt_1 ← cpt_1 + 1
fintq
53 / 74
dimension(tab, 0) = 2dimension(tab, 1) = 3
0 0 0
8 4 6
cpt_1 cpt_2
1 3

]
]
0 1 2
0
1
[
[
tanque cpt_1 < dimension(tab, 0)faire cpt_2 ← 0tanque cpt_2 < dimension(tab, 1) faire
tab[cpt_1][cpt_2] ← 0cpt_2 ← cpt_2 + 1
fintqcpt_1 ← cpt_1 + 1
fintq
53 / 74
0 0 0
8 4 6
cpt_1 cpt_2
1 0

]
]
0 1 2
0
1
[
[
tanque cpt_1 < dimension(tab, 0)faire cpt_2 ← 0tanque cpt_2 < dimension(tab, 1) faire
tab[cpt_1][cpt_2] ← 0cpt_2 ← cpt_2 + 1
fintqcpt_1 ← cpt_1 + 1
fintq
53 / 74
dimension(tab, 0) = 2dimension(tab, 1) = 3
0 0 0
8 4 6
cpt_1 cpt_2
1 0

]
]
0 1 2
0
1
[
[
tanque cpt_1 < dimension(tab, 0)faire cpt_2 ← 0tanque cpt_2 < dimension(tab, 1) faire
tab[cpt_1][cpt_2] ← 0cpt_2 ← cpt_2 + 1
fintqcpt_1 ← cpt_1 + 1
fintq
53 / 74
0 0 0
0 4 6
cpt_1 cpt_2
1 0

0 1 2
0
1
[
[
]
]
tanque cpt_1 < dimension(tab, 0)faire cpt_2 ← 0tanque cpt_2 < dimension(tab, 1) faire
tab[cpt_1][cpt_2] ← 0cpt_2 ← cpt_2 + 1
fintqcpt_1 ← cpt_1 + 1
fintq
53 / 74
0 0 0
0 4 6
cpt_1 cpt_2
1 1

0 1 2
0
1
[
[
]
]
tanque cpt_1 < dimension(tab, 0)faire cpt_2 ← 0tanque cpt_2 < dimension(tab, 1) faire
tab[cpt_1][cpt_2] ← 0cpt_2 ← cpt_2 + 1
fintqcpt_1 ← cpt_1 + 1
fintq
53 / 74
dimension(tab, 0) = 2dimension(tab, 1) = 3
0 0 0
0 4 6
cpt_1 cpt_2
1 1

0 1 2
0
1
[
[
]
]
tanque cpt_1 < dimension(tab, 0)faire cpt_2 ← 0tanque cpt_2 < dimension(tab, 1) faire
tab[cpt_1][cpt_2] ← 0cpt_2 ← cpt_2 + 1
fintqcpt_1 ← cpt_1 + 1
fintq
53 / 74
0 0 0
0 0 6
cpt_1 cpt_2
1 1

0 1 2
0
1
[
[
]
]
tanque cpt_1 < dimension(tab, 0)faire cpt_2 ← 0tanque cpt_2 < dimension(tab, 1) faire
tab[cpt_1][cpt_2] ← 0cpt_2 ← cpt_2 + 1
fintqcpt_1 ← cpt_1 + 1
fintq
53 / 74
0 0 0
0 0 6
cpt_1 cpt_2
1 2

0 1 2
0
1
[
[
]
]
tanque cpt_1 < dimension(tab, 0)faire cpt_2 ← 0tanque cpt_2 < dimension(tab, 1) faire
tab[cpt_1][cpt_2] ← 0cpt_2 ← cpt_2 + 1
fintqcpt_1 ← cpt_1 + 1
fintq
53 / 74
dimension(tab, 0) = 2dimension(tab, 1) = 3
0 0 0
0 0 6
cpt_1 cpt_2
1 2

0 1 2
0
1
[
[
]
]
tanque cpt_1 < dimension(tab, 0)faire cpt_2 ← 0tanque cpt_2 < dimension(tab, 1) faire
tab[cpt_1][cpt_2] ← 0cpt_2 ← cpt_2 + 1
fintqcpt_1 ← cpt_1 + 1
fintq
53 / 74
0 0 0
0 0 0
cpt_1 cpt_2
1 2

]
]
53 / 74
0 1 2
0
1
[
[
tanque cpt_1 < dimension(tab, 0)faire cpt_2 ← 0tanque cpt_2 < dimension(tab, 1) faire
tab[cpt_1][cpt_2] ← 0cpt_2 ← cpt_2 + 1
fintqcpt_1 ← cpt_1 + 1
fintq
0 0 0
0 0 0
cpt_1 cpt_2
1 3

]
]
53 / 74
0 1 2
0
1
[
[
tanque cpt_1 < dimension(tab, 0)faire cpt_2 ← 0tanque cpt_2 < dimension(tab, 1) faire
tab[cpt_1][cpt_2] ← 0cpt_2 ← cpt_2 + 1
fintqcpt_1 ← cpt_1 + 1
fintq
dimension(tab, 0) = 2dimension(tab, 1) = 3
0 0 0
0 0 0
cpt_1 cpt_2
1 3

tanque cpt_1 < dimension(tab, 0)faire cpt_2 ← 0tanque cpt_2 < dimension(tab, 1) faire
tab[cpt_1][cpt_2] ← 0cpt_2 ← cpt_2 + 1
fintqcpt_1 ← cpt_1 + 1
fintq
53 / 74
0 1 2
0 [ 0 0 0 ]1 [ 0 0 0 ]
cpt_1 cpt_2
2 3

0 1 2
0
1
[
[
0 0 00 0
]
]0
tanque cpt_1 < dimension(tab, 0)faire cpt_2 ← 0tanque cpt_2 < dimension(tab, 1) faire
tab[cpt_1][cpt_2] ← 0cpt_2 ← cpt_2 + 1
fintqcpt_1 ← cpt_1 + 1
fintq
53 / 74
dimension(tab, 0) = 2dimension(tab, 1) = 3
cpt_1 cpt_2
2 3

53 / 74
tanque cpt_1 < dimension(tab, 0)faire cpt_2 ← 0tanque cpt_2 < dimension(tab, 1) faire
tab[cpt_1][cpt_2] ← 0cpt_2 ← cpt_2 + 1
fintqcpt_1 ← cpt_1 + 1
fintq
0 1 2
0 [ 0 0 0 ]1 [ 0 0 0 ]

Interfaçage avec le langage courant
Deux types associés:caractère: symbole atomique syntaxique quelconque (lettre, …)
entouré de côtes (‘’)
syntaxe: ‘A’, ‘3’, ‘@’
Gestion de données textuelles
chaine: ensemble de caractères (mots, …)entouré de guillemets (‘’ et ‘’)
syntaxe: ‘’Hello’’
54 / 74

Types primitifs: caractère et chaine
Une chaine peut être vue et utilisée comme un tableau de caractères:
‘’Hello‘’ ←→ [‘H’, ‘e’, ‘l’, ‘l’, ‘o’]
Une variable de type chaine peut être affectée d’une autre chaine ou d’un caractère:ch: chaine
chaine ← ‘’Ma chaine’’
chaine ← ‘A’
55 / 74

Accepte les fonction de tableaux:
Soit ch une chaine, la fonction taille(ch) retourne le nombrede caractères composant ch.
Opérateur de concaténation +
Permet d’ajouter une chaine de caractère à une autre.
Syntaxe: chaine_1 + chaine_2
Exemple: ‘’Bonjour’’ + ‘’ ‘’ + ‘’a tous’’ = ‘’Bonjour a tous’’
56 / 74

Types de bases appropriés pour des algorithmes simplesCalcul numériques
Opérations simples sur les ensembles (tableaux)
Difficulté de représentation de structure plus complexes
Agrégations de données
Objets réels ou abstrait
Exemple: Ecrire un algorithme permettant de saisir une promotion de 20étudiants. Chaque étudiant est caractérisé par un nom, un prénom et unnuméro INE.
57 / 74

Exemple: Ecrire un algorithme permettant de saisir une promotion de 20 étudiants. Chaque étudiant est caractérisé par un nom, un prénom et un numéro INE.
algorithme saisiedonnéesnoms: chaines[] prénoms: chaine[] ine: entier[] cpt: entier
débutnoms ← chaine[20] prénoms ← chaine[20] ine ← entier[20]cpt ← 0tanque cpt < 20 faire noms[cpt] ← lire() prénoms[cpt] ← lire() ine[cpt] ← lire()cpt ← cpt + 1
fintqfin
58 / 74

Approche naïveDéclarations de tableaux différents
Chaque colonne i d’un tableau représente l’information relative à auième étudiant
noms[i] prénoms[i] ine[i]
Etudiant i
Permet de résoudre le problème
Ne représente pas les notions réelles (une entité étudiant)
Appartenance des données à une étudiant définieimplicitement (grâce à un index commun)
59 / 74

Un type complexe (ou structure) est un type composé de plusieurs valeurs de types différents pouvant être eux même primitifs ou complexes. Chaque valeur composant un type complexe est appelée champ.
Syntaxe algorithmique:
Type nomdonnéeschamp1: type1…champn: typen
fintype
Nom du type
Champs composant le type
60 / 74

Exemple: Ecrire un type complexe nommé Etudiant qui permet de représenter un étudiant grâce à son nom (chaine), son prénom (chaine) et son INE (entier).
type Etudiantdonnées
nom: chaine prénom: chaine ine: entier
fintype
Nom du type
champ 1champ 2champ 3
Le type complexe est nommée Etudiant
Il comporte 3 champs
61 / 74

3 étapes:Définition du type (hors de l’algorithme)Type NomTypedonnéeschamp1: type1…
fintype
Déclaration dans la section données de l’algorithme
NomVar: NomType
Instanciation dans le corps de l’algorithme (mot clé nouveau)
NomVar ← nouveau NomType
62 / 74

Exemple: Ecrire un type complexe nommé Etudiant qui permet de représenter un étudiant grâce à son nom (chaine), son prénom (chaine) et son INE (entier).
type Etudiantdonnées
nom: chaine prénom: chaine ine: entier
fintype
Définition
algorithme monAlgodonnées
et: Etudiantdébut
Algorithme utilisant le type complexe
Déclaration
et ← nouveau Etudiant Instanciation, la variable est prête à êtrefin utilisée
63 / 74

Accès aux données:Opérateur de déréférencement . (point)
nomVar: NomTypeType NomTypedonnéeschampi: typei…
fintype nomvar.champi
Le couple nomvar.champi est considéré comme une variable detype typei
Le déréférencement ne peut être appliquée à une variable qui n’apas été instanciée (nouveau)
64 / 74

Exemple: Ecrire un type complexe nommé Etudiant qui permet de représenter un étudiant grâce à son nom (chaine), son prénom (chaine) et son INE (entier).
type Etudiantdonnées
nom: chaine prénom: chaine ine: entier
fintype
algorithme monAlgodonnées
et: Etudiantdébut
et ← nouveau Etudiant
65 / 74
et.nom ← ‘’Bulot’’ ecrire(et.nom) et.ine ← et.ine + 1
fin
Affecte « Bulot » au champ nom de la variable etEcrit « Bulot »Utilisation des champs comme variable

Exemple: Ecrire un algorithme permettant de saisir une promotion de 20 étudiants. Chaque étudiant est caractérisé par un nom, un prénom et un numéro INE.
algorithme saisiedonnéespromo: Etudiant[] cpt: entier
débutpromo ← Etudiant[20] cpt ← 0tanque cpt < 20 faire promo[cpt] ← nouveau Etudiant promo[cpt].nom ← lire() promo[cpt].prénom ← lire() promo[cpt].ine ← lire()cpt ← cpt + 1
fintq fin
type Etudiantdonnées
nom: chaine prénom: chaine ine: entier
fintype
66 / 74

Il n’est pas possible d’utiliser un type complexe avec les fonctionslire() et écrire().
La lecture / écriture doit se faire champ par champ:
type Etudiantdonnées
nom: chaineprénom: chaineine: entier
fintype
algorithme faux données
et: Etudiantdébut
et ← lire() ecrire(et)
fin
algorithme correct données
et: Etudiantdébut
et ← nouveauEtudiant et.nom ← lire() et.prénom ← lire() et.ine ← lire()
finL’affectation d’une variable de type complexe vers une autre variable du même type est possible.
67 / 74

Une variable de type complexe qui ne contient aucune donnée estappelée null (mot réservé)
Peut être utilisé comme affectation à une variable afin d’effaces les données qu’elle contient
ATTENTION: Une variable de type complexe valant null ne peut être déréférencée (.)
type Etudiantdonnées
nom: chaine prénom: chaine ine: entier
fintype
algorithme videdonnées
et: Etudiantdébut
et ← null fin
algorithme pbdonnées
et: Etudiantdébut
et ← nullecrire(et.prénom)
fin
68 / 74

La valeur null peut être utilisée pour tester l’existence d’une variable de type complexe
type Etudiantdonnées
nom: chaine prénom: chaine ine: entier
fintype
algorithme testentrées
et: Etudiantdébut
si et ≠ null alors ecrire(et.nom)
finsifin
Très utile pour tester des entrées avant déréférencement:
algorithme test2entrées
et: Etudiantdébut
si et = null alors ecrire(‘’ERREUR’’)
finsifin
69 / 74

Un type complexe peut contenir des champs qui sont eux-mêmes detype complexes:
Type NomTypedonnéeschamp1: type1…
fintype
Type NomType2donnéeschampa: typeachampb: NomType
fintype
Permet de modulariser les types
Utilisation du déréférencement en cascade:
var: NomType2
var.champb.champ1 Champ du type NomType
70 / 74

Exemple: Ecrire un type complexe nommé Date qui permet de représenter une date grâce à son jour (entier), son mois (entier) et son année (entier).
type Datedonnées
jour: entiermois: entierannée: entier
fintype
Le type complexe est nommée Date
Il comporte 3 champs
71 / 74

Exemple: Modifier le type Etudiant en lui ajoutant un date de naissance (typecomplexe Date).
type Etudiantdonnées
nom: chaine prénom: chaine ine: entier naissance: Date
fintype
Le type complexe est nommée Etudiant.
Il comporte 4 champs.
Le champ naissance est lui-même du type complexe Date.
72 / 74

Exemple: Ecrire un algorithme permettant de saisir une promotion de 20 étudiants. Chaqueétudiant est caractérisé par un nom, un prénom et un numéro INE et sa date de naissance.
algorithme saisiedonnéespromo: Etudiant[] cpt: entier
débutpromo ← Etudiant[20] cpt ← 0tanque cpt < 20 faire promo[cpt] ← nouveau Etudiant promo[cpt].nom ← lire() promo[cpt].prénom ← lire() promo[cpt].ine ← lire()
promo[cpt].naissance ← nouveau Date promo[cpt].naissance.jour ← lire() promo[cpt].naissance.mois ← lire() promo[cpt].naissance.année ← lire()
cpt ← cpt + 1fintq
fin
type Etudiantdonnées
nom: chaine prénom: chaineine: entier naissance: Date
fintype
type Datedonnées
jour: entiermois: entierannée: entier
fintype
73 / 74

Un type complexe peut contenir un champ de ce même type, il s’agit alors d’un type récursif
Exemple: Modifier le type Etudiant en lui ajoutant un binôme qui est lui aussi un étudiant.
type Etudiantdonnées
nom: chaine prénom: chaine ine: entier naissance: Date binôme: Etudiant
fintype
L’utilisation de récursivité dans un type complexe ne change en rien son comportement ou son utilisation.
74 / 74