Bases de Programmation I Algorithmique

Post on 19-Jun-2022

11 views 1 download

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

Julien.seinturier@univ-amu.frhttp://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