Page 1
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
Page 2
« 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
Page 3
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
Page 4
« 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
Page 5
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
Page 6
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
Page 7
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
Page 8
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
Page 9
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
Page 10
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
Page 11
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
Page 12
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
Page 13
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
Page 14
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
Page 15
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
Page 16
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
Page 17
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
Page 18
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
Page 19
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
Page 20
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
Page 21
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
Page 22
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
Page 23
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
Page 24
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
Page 25
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
Page 26
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
Page 27
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
Page 28
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
Page 29
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
Page 30
Exemple
algorithme absentréesval: entier
sortieabsolue: entier
débutsi val ≥ 0 alorsabsolue ← val
sinonabsolue ← -1 × val
finsi fin
25 / 74
Page 31
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
Page 32
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
Page 33
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
Page 34
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
Page 35
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
Page 36
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
Page 37
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
Page 38
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
Page 39
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
Page 40
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
Page 41
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
Page 42
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
Page 43
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
Page 44
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
Page 45
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
Page 46
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
Page 47
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
Page 48
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
Page 49
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
Page 50
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
Page 51
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
Page 52
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
Page 53
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
Page 54
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
Page 55
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
Page 56
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
Page 57
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
Page 58
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
Page 59
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
Page 60
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
Page 61
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
Page 62
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
Page 63
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
Page 64
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
Page 65
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
Page 66
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
Page 67
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
Page 68
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
Page 69
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
Page 70
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
Page 71
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
Page 72
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
Page 73
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 ]
Page 74
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
Page 75
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 –
Page 76
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
Page 77
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
Page 78
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
Page 79
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
Page 80
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
Page 81
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 ]
Page 82
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
Page 83
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
Page 84
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
Page 85
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 -
Page 86
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
Page 87
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
Page 88
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
Page 89
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
Page 90
]
]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
Page 91
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
Page 92
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
Page 93
]
]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
Page 94
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
Page 95
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
Page 96
]
]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
Page 97
]
]
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
Page 98
]
]
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
Page 99
]
]
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
Page 100
]
]
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
Page 101
]
]
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
Page 102
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
Page 103
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
Page 104
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
Page 105
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
Page 106
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
Page 107
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
Page 108
]
]
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
Page 109
]
]
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
Page 110
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
Page 111
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
Page 112
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 ]
Page 113
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
Page 114
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
Page 115
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
Page 116
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
Page 117
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
Page 118
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
Page 119
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
Page 120
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
Page 121
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
Page 122
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
Page 123
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
Page 124
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
Page 125
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
Page 126
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
Page 127
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
Page 128
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
Page 129
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
Page 130
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
Page 131
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
Page 132
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
Page 133
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