Initiation la programmation imprative et algorithmique Cours 6






![Les tableaux Opérateurs • l’opérateur [ ] permet d’accéder à une valeur spécifique du Les tableaux Opérateurs • l’opérateur [ ] permet d’accéder à une valeur spécifique du](https://slidetodoc.com/presentation_image/2b05bbfa3bd4c1512d3ee54cf0313427/image-7.jpg)

![Déclaration d’un tableau Pseudo-code • tab : Tableau [1. . 26] de Reel Ø Déclaration d’un tableau Pseudo-code • tab : Tableau [1. . 26] de Reel Ø](https://slidetodoc.com/presentation_image/2b05bbfa3bd4c1512d3ee54cf0313427/image-9.jpg)

![Exemple : affectation & représentation Declaration : tab : Tableau[3. . 5] de Reel Exemple : affectation & représentation Declaration : tab : Tableau[3. . 5] de Reel](https://slidetodoc.com/presentation_image/2b05bbfa3bd4c1512d3ee54cf0313427/image-11.jpg)
![Exemple : remplissage Constante MAX = 100 Type Notes = Tableau[1. . MAX] de Exemple : remplissage Constante MAX = 100 Type Notes = Tableau[1. . MAX] de](https://slidetodoc.com/presentation_image/2b05bbfa3bd4c1512d3ee54cf0313427/image-12.jpg)






























- Slides: 42
Initiation à la programmation impérative et algorithmique Cours 6 – Tableaux Largement inspiré des cours : Vercouter, Del Mondo & Delestre, Hérault, Mainguenaud (INSA de Rouen) Elodie Laine– – 11. 09. 2014 18. 10. 2018 H. Richard
D’une variable par valeur… Types simples dénombrables Booléen Caractère Types simples indénombrables Entier Chaîne de caractères Réel … à plusieurs valeurs pour une variable Comment gérer un ensemble de valeurs ? Types complexes…? valeur 1 valeur 2 valeur 3 Elodie Laine– – 11. 09. 2014 18. 10. 2018 H. Richard
Une variable par valeur Ø Exemple : Calcul de la moyenne d’un ensemble de nombres fonction calculer. Moyenne(n 1, n 2, n 3, n 4, n 5 : Reel) : Reel Declaration resultat : Reel debut resultat ← n 1+n 2+n 3+n 4+n 5 resultat ← resultat / 5 retourner resultat fin Inconvénient : cet algorithme est très peu flexible car le nombre de variables dont on peut calculer la moyenne est fixe (en l’occurrence 5). Elodie Laine– – 11. 09. 2014 18. 10. 2018 H. Richard
Nombre de variables surdimensionné Ø Exemple : Calcul de la moyenne d’un ensemble de nombres fonction calculer. Moyenne(n 1, n 2, n 3, n 4, n 5 : Reel) : Reel Declaration resultat : Reel, nb : Entier debut resultat ← 0 nb ← 0 si n 1 ≠ -1 alors resultat ← resultat + n 1 nb ← nb + 1 finsi si n 2 ≠ -1 alors resultat ← resultat + n 2 nb ← nb + 1 finsi … retourner resultat / nb fin Inconvénient : pour une réutilisation maximale de l’algorithme, il sera nécessaire de définir un grand nombre de variables (espace mémoire requis important). Elodie Laine– – 11. 09. 2014 18. 10. 2018 H. Richard
Calcul interactif Ø Exemple : Calcul de la moyenne d’un ensemble de nombres fonction calculer. Et. Afficher. Moyenne(): None Declaration une. Note, i : Entier somme, nb. Eleves : Reel debut Variable d’accumulation somme ← 0 nb. Eleves ← lire(“Nombre d’eleves : ”) pour i ← 1 a nb. Eleves faire une. Note ← lire(“Note de l’eleve numero ”, i, “ : ”) somme ← somme + une. Note finpour ecrire(“La moyenne est de : ”, somme/nb. Eleves) fin Inconvénient : l’utilisation de cette fonction impose un appel systématique à l’interface avec l’utilisateur, et interdit toute opération ultérieure sur les nombres. Elodie Laine– – 11. 09. 2014 18. 10. 2018 H. Richard
Les tableaux Définition Un tableau est un type complexe de données permettant de représenter plusieurs valeurs dans une même variable Propriétés Un tableau est caractérisé par : • une taille déterminée • un unique type de données pour toutes ses valeurs Elodie Laine– – 11. 09. 2014 18. 10. 2018 H. Richard
Les tableaux Opérateurs • l’opérateur [ ] permet d’accéder à une valeur spécifique du tableau • l’affectation copie toutes les valeurs d’un tableau dans un autre • les opérateurs = et ≠ testent si toutes les valeurs de deux tableaux sont égales ou différentes • les opérateurs sur les valeurs du tableau sont ceux du type de données Elodie Laine– – 11. 09. 2014 18. 10. 2018 H. Richard
Déclaration d’un tableau Intervalle de déclaration • La taille d’un tableau est définie strictement lors de sa déclaration par un intervalle, qui indique les indices valides pour les valeurs du tableau. • Les bornes de l’intervalle sont des constantes. • Par exemple, un tableau d’entiers défini sur l’intervalle 5. . 20 contiendra 16 valeurs entières indicées de 5 à 20. Indices • L’indice sert à désigner une valeur spécifique du tableau. En reprenant l’exemple ci-dessus, soit tab une variable de ce type de tableau, tab[6] désignera une valeur entière stockée en deuxième position dans le tableau (celle d’indice 6). Elodie Laine– – 11. 09. 2014 18. 10. 2018 H. Richard
Déclaration d’un tableau Pseudo-code • tab : Tableau [1. . 26] de Reel Ø déclare une variable de type tableau de 26 réels Ø les indices valides vont de 1 à 26 • tab 2 : Tableau [5. . 15] de Caractere Ø déclare une variable de type tableau de 16 caractères Ø les indices valides vont de 5 à 15 Définition de type La déclaration d’un type spécifique facilite l’écriture • Type Notes = Tableau [1. . 26] de Reel Ø définit un nouveau type appelé Notes, qui est un tableau de 26 réels • tab 3 : Notes Ø déclare une variable de type Notes (tableau de 26 réels) Ø les indices valides vont de 1 à 26 Elodie Laine– – 11. 09. 2014 18. 10. 2018 H. Richard
Accès et affectation On accède à la ième valeur d’un tableau en utilisant la syntaxe suivante : nom_de_la_variable[indice] Soit tab un tableau de 10 entiers (tab : Tableau[1. . 10] d’Entier) : tab[2] ← -5 met la valeur -5 dans la 2ème case du tableau a ← tab[2] met la valeur de la 2ème case du tableau dans la variable (entier) a lire(tab[1]) met l’entier saisi par l’utilisateur au clavier dans la 1ère case du tableau ecrire(tab[1]) affiche la valeur de la 1ère case du tableau Elodie Laine– – 11. 09. 2014 18. 10. 2018 H. Richard
Exemple : affectation & représentation Declaration : tab : Tableau[3. . 5] de Reel debut tab[3] ← 2. 3 tab[4] ← -3. 6 tab[5] ← tab[3] + 1. 9 fin tab : 2. 3 -3. 6 4. 2 3 4 5 Elodie Laine– – 11. 09. 2014 18. 10. 2018 H. Richard
Exemple : remplissage Constante MAX = 100 Type Notes = Tableau[1. . MAX] de Reel Declaration les. Notes : Notes fonction saisir. Notes() : None Declaration i : Entier debut repeter nb. Eleves ← lire(“Nombre d’eleves (maximum ”, MAX, “) : ”) jusqu’a ce que nb. Eleves > 0 et nb. Eleves ≤ MAX pour i ← 1 a nb. Eleves faire les. Notes[i] ← lire(“Note de l’eleve numero ”, i, “ : ”) finpour fin Elodie Laine– – 11. 09. 2014 18. 10. 2018 H. Richard
Exemple : calcul de moyenne fonction calculer. Moyenne(les. Notes : Notes, nb. Eleves : Entier) : Reel Declaration i : Entier, somme : Reel debut somme ← 0 pour i ← 1 a nb. Eleves faire somme ← somme + les. Notes[i] finpour retourner somme/nb. Eleves fin Elodie Laine– – 11. 09. 2014 18. 10. 2018 H. Richard
Exemple : dépassement de tableau Dépassement Le dépassement de tableau se produit lors de l’accès à un indice n’existant pas. Declaration : tab : Tableau [1. . 10] de Reel debut tab[11] ← 3. 4 fin Effet L’effet d’un dépassement de tableau peut : • provoquer une erreur à l’exécution (arrêt du programme) • modifier de manière aléatoire d’autres variables • n’avoir aucun effet Elodie Laine– – 11. 09. 2014 18. 10. 2018 H. Richard
Les tableaux en Python (1) Les tuples Le tuple est une structure de données non modifiable représentant une collection d’élements. Il se construit à l’aide de parenthèses. tup = (1, 2) tup[1] 1 in tup + tup for i in tup: print(i) Þ Þ 2, l’indexation commence à zéro True, test d’appartenance d’un élément (1, 2, 1, 2), concaténation de tuples 1 2, parcours du tuple Contrairement aux tableaux, les tuples python peuvent contenir des éléments de types différents Elodie Laine– – 11. 09. 2014 18. 10. 2018 H. Richard
Les tableaux en Python (2) Les listes La liste est une structure de données modifiable représentant une collection d’éléments. Elle se construit à l’aide de crochets. arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] arr[0] = 7 arr. append(42) arr[0: 6] arr[0: 6: 2] Þ [7, 2, 3, 4… modification d’un élément Þ … 10, 11, 12, 42] ajout d’un élément à la fin Þ [1, 2, 3, 4, 5, 6] sous-tableau Þ [1, 3, 5] extraction en tranches Contrairement aux tableaux, les listes python peuvent contenir des éléments de types différents Elodie Laine– – 11. 09. 2014 18. 10. 2018 H. Richard
Les tableaux en Python (3) Les tableaux de la bibliothèque numpy possèdent les même propriétés que les listes (tableaux python par défaut), mais se comportent différemment visà-vis des opérations arithmétiques. Ceci leur confère un intérêt particulier pour la manipulation de vecteurs. nar = numpy. array([1, 2, 3, 4]) arr + arr * arr Þ [2, 4, 6, 8], addition et non pas concaténation Þ [1, 4, 9, 16] multiplication élément à élément Contrairement aux tableaux, les tableaux numpy peuvent contenir des éléments de types différents Elodie Laine– – 11. 09. 2014 18. 10. 2018 H. Richard
Algorithmes simples sur les tableaux • Notion de complexité algorithmique • Parcours de tableaux • Insertion/Suppression de valeurs • Recherche dans un tableau non trié Elodie Laine– – 11. 09. 2014 18. 10. 2018 H. Richard
Complexité algorithmique La complexité est le critère principal de qualité d’un programme. Elle correspond au nombre d’opérations nécessaires lors de l’exécution de l’algorithme, indépendamment des capacités matérielles de la machine d’exécution. • Elle est fonction de la taille du problème n • Elle est notée Ο dans le pire des cas, Ω dans le cas moyen, θ dans le meilleur des cas Elodie Laine– – 11. 09. 2014 18. 10. 2018 H. Richard
Complexité Valeurs classiques • Ο(1) – constante (ex. : une suite séquentielle d’instructions) • Ο(logn) – logarithme (ex. : boucle qui divise n à chaque itération) • Ο(n) – linéaire (ex. : simple parcours complet d’un tableau) • Ο(n²) – quadratique (ex. : boucle imbriquée dans une boucle) Elodie Laine– – 11. 09. 2014 18. 10. 2018 H. Richard
Parcours d’un tableau Parcours séquentiel Il consiste à parcourir systématiquement les éléments d’un tableau, dans le but d’effectuer une opération donnée (modification, affichage, lecture…). Dans certains cas, le parcours pourra être seulement partiel : • Il est possible de ne pas considérer tous les éléments • Le parcours peut être interrompu avant la fin Elodie Laine– – 11. 09. 2014 18. 10. 2018 H. Richard
Exemple : Parcours ascendant (1) Calcul de taille de génome On dispose d’un tableau de réels où chaque élément correspond à un événement de duplication, fusion ou perte de gènes dans un génome donné. On souhaite calculer le nombre de gènes (en supposant qu’il était de 10 avant la première opération). Constante MAX = 100 Type Tab. Reels = Tableau[1. . MAX] de Reel fonction calcule. Nb. Genes (evenements : Tab. Reels, taille : Entier) : Reel Declaration nb. Genes : Reel, i : Entier debut nb. Genes ← 10 pour i ← 1 a taille faire nb. Genes ← nb. Genes + evenements[i] finpour retourner nb. Genes fin Elodie Laine– – 11. 09. 2014 18. 10. 2018 H. Richard
Exemple : Parcours ascendant (2) Calcul des pertes de gènes On souhaite calculer le nombre total de gènes perdus. fonction calcule. Nb. Genes. Perdus (evenements : Tab. Reels, taille : Entier) : Reel Declaration Nb. Genes. Perdus : Reel, i : Entier debut nb. Genes. Perdus ← 0 pour i ← 1 a taille faire si evenements[i] < 0 alors nb. Genes. Perdus ← nb. Genes. Perdus +evenements[i] finsi finpour retourner nb. Genes. Perdus fin Elodie Laine– – 11. 09. 2014 18. 10. 2018 H. Richard
Exemple : Parcours descendant Afficher les évolutions de taille On souhaite afficher les évolutions de la taille du génome depuis la taille actuelle jusqu’à sa valeur initiale. fonction affichage. Evol (evenements : Tab. Reels, taille : Entier) : None Declaration Nb. Genes : Reel, i : Entier debut nb. Genes ← calcule. Nb. Genes(evenements, taille) pour i ← taille a 1 faire nb. Genes ← nb. Genes - evenements[i] ecrire(nb. Genes) finpour fin Elodie Laine– – 11. 09. 2014 18. 10. 2018 H. Richard
Exemple : Ajout/Retrait d’élément (1) Ajout en fin de tableau L’ajout d’un élément en fin de tableau nécessite de modifier, au plus, deux variables : • la valeur après le dernier indice utilisé • la taille du tableau fonction ajout. En. Fin(val : Reel, evenements : Tab. Reels, taille : Entier) : None debut si taille < MAX alors taille ← taille + 1 evenements[taille] ← val finsi fin Elodie Laine– – 11. 09. 2014 18. 10. 2018 H. Richard
Exemple : Ajout/Retrait d’élément (2) Retrait en fin de tableau Le retrait d’un élément en fin de tableau nécessite de modifier, au plus, deux variables : la valeur correspondant au dernier indice utilisé la taille du tableau fonction retrait. En. Fin(evenements : Tab. Reels, taille : Entier) : None debut si taille > 0 alors taille ← taille - 1 finsi fin Elodie Laine– – 11. 09. 2014 18. 10. 2018 H. Richard
Exemple : Ajout/Retrait d’élément (3) Ajout à une position quelconque Pour modifier le tableau à une position pos différente de la dernière utilisée, il faut : • modifier la taille du tableau • décaler toutes les valeurs situées entre pos et la fin du tableau • éventuellement ajouter la nouvelle valeur à pos fonction ajout(val : Reel, pos : Entier, evenements : Tab. Reels, taille : Entier) : None Déclaration i : Entier debut si (taille < MAX) ET (pos ≥ 1) ET (pos ≤ taille) alors pour i ← taille a pos faire evenements[i+1] ← evenements[i] finpour evenements[pos] ← val taille ← taille + 1 finsi fin Elodie Laine– – 11. 09. 2014 18. 10. 2018 H. Richard
Exemple : Ajout/Retrait d’élément (4) Retrait à une position quelconque Pour modifier le tableau à une position pos différente de la dernière utilisée, il faut : • modifier la taille du tableau • déclarer toutes les valeurs situées entre pos et la fin du tableau • éventuellement ajouter la nouvelle valeur à pos fonction retrait(val : Reel, pos : Entier, evenements : Tab. Reels, taille : Entier) : None Declaration i : Entier debut si (pos ≥ 1) ET (pos < taille) alors pour i ← pos a taille - 1 faire evenements[i] ← evenements[i+1] finpour taille ← taille - 1 finsi fin Elodie Laine– – 11. 09. 2014 18. 10. 2018 H. Richard
Exemple : Recherche d’élément (1) Type de recherche • par indice • par valeur • par critères Recherche par indice C’est le plus simple. On accède directement à la valeur de l’indice souhaité par l’opérateur []. Ex : pour accéder à l’événement d’indice 3 evenements[3] Elodie Laine– – 11. 09. 2014 18. 10. 2018 H. Richard
Exemple : Recherche d’élément (2) Recherche par valeur On souhaite trouver le dernier indice d’une valeur donnée. fonction recherche(val : Reel, evenements : Tab. Reels, taille : Entier) : Entier Declaration resultat : Entier debut resultat ← taille tant que (evenements[resultat] ≠ val ) et (resultat > 0) faire resultat ← resultat – 1 fintantque retourner resultat fin Elodie Laine– – 11. 09. 2014 18. 10. 2018 H. Richard
Tableaux triés Principe Un tableau trié est un tableau dont les valeurs sont stockées dans l’ordre qui correspond à celui de leur type de données selon la règle suivante : si tab[i] < tab[j] alors i < j. La réciproque est-elle vraie ? Initialement : 5 -3 4 8 -1 4 5 8 Exécution d’une fonction de tri Après exécution : -3 -1 Elodie Laine– – 11. 09. 2014 18. 10. 2018 H. Richard
Tri par insertion (1) Principe • On considère que le tableau est initialement trié (par ex. tableau vide) • Chaque fois qu’une valeur doit être ajoutée, on cherche dans le tableau l’indice i d’une valeur immédiatement supérieure • Si une telle valeur n’existe pas, on ajoute la nouvelle valeur à la fin du tableau • Si elle existe, on ajoute la nouvelle valeur à la position i Elodie Laine– – 11. 09. 2014 18. 10. 2018 H. Richard
Tri par insertion (2) fonction ajout. Trie(val : Reel, evenements : Tab. Reels, taille : Entier) : None Declaration pos : Entier debut si taille < MAX alors pos ← taille + 1 tant que (pos > 1) ET (evenements[pos - 1] > val) faire evenements[pos] ← evenements[pos - 1] pos ← pos - 1 fintantque evenements[pos] ← val taille ← taille + 1 finsi fin Elodie Laine– – 11. 09. 2014 18. 10. 2018 H. Richard
Algorithmes sur les tableaux triés • Parcours de tableaux triés • Insertion/suppression de valeurs dans un tableau trié • Recherche dans un tableau trié Elodie Laine– – 11. 09. 2014 18. 10. 2018 H. Richard
Parcours d’un tableau trié (1) Parcours ascendant et descendant Dans un cas général, les algorithmes sont les mêmes que pour les tableaux non triés. Dans un cas spécifique, les algorithmes donnés précédemment en exemple sont-ils valides ? Optimisés ? • calcule. Nb. Genes. Perdus • affichage. Evol Elodie Laine– – 11. 09. 2014 18. 10. 2018 H. Richard
Parcours d’un tableau trié (2) Calcul des pertes de gènes On souhaite calculer le nombre total de gènes perdus. fonction calcule. Nb. Genes. Perdus (evenements : Tab. Reels, taille : Entier) : Reel Declaration Nb. Genes. Perdus : Reel, i : Entier debut nb. Genes. Perdus ← 0 i← 1 tant que (i ≤ taille) ET (evenements[i] < 0) faire nb. Genes. Perdus ← nb. Genes. Perdus +evenements[i] i←i+1 fintantque retourner nb. Genes. Perdus fin Elodie Laine– – 11. 09. 2014 18. 10. 2018 H. Richard
Ajout/Retrait dans un tableau trié Ajout L’ajout d’une valeur peut se faire : • par la fonction du tri par insertion, ou • en fin de tableau, suivi de l’exécution d’un algorithme de tri Retrait Dans un cas général, les algorithmes sont les mêmes que pour les tableaux non triés. Elodie Laine– – 11. 09. 2014 18. 10. 2018 H. Richard
Recherche dans un tableau trié Par indice Aussi simple que pour des tableaux non triés. Par critères Si le critère a un lien avec l’ordre des valeurs, la recherche peut être améliorée. Par dichotomie La propriété de tri est utilisée pour diviser l’espace de recherche par deux après chaque test. Elodie Laine– – 11. 09. 2014 18. 10. 2018 H. Richard
Conclusion • Un tableau est un type complexe de données permettant de représenter plusieurs valeurs dans une même variable. • Les valeurs d’un tableau sont spécifiquement désignées par un indice. On accède directement à la valeur de l’indice souhaité en utilisant l’opérateur []. • En Python, les types de données assimilables aux tableaux sont les tuples, les listes et les tableaux de la bibliothèque numpy. • La complexité d’un algorithme est le nombre d’opérations nécessaires à son exécution. • Pour ajouter ou retirer une valeur à un tableau, il est nécessaire de le parcourir. • Un tableau trié est un tableau dont les valeurs sont ordonnées selon la règle suivante : si tab[i] < tab[j] alors i < j. Elodie Laine– – 11. 09. 2014 18. 10. 2018 H. Richard
Elodie Laine– – 11. 09. 2014 18. 10. 2018 H. Richard
Recherche par dichotomie (1) Principe La propriété de tri est utilisée pour diviser l’espace de recherche par deux après chaque test. Déroulement 1) On cherche une valeur x dans un tableau de N valeurs triées 2) On compare x à la valeur située à l’indice N/2 3) Tant que x est différent de cette valeur, on recommence la recherche, en se concentrant sur la première ou la seconde moitié du tableau (selon que x est plus petit ou plus grand que la valeur testée) 4) L’algorithme s’arrête quand x a été trouvé ou quand l’espace de recherche n’est plus divisible Elodie Laine– – 11. 09. 2014 18. 10. 2018 H. Richard
Recherche par dichotomie (2) fonction recherche. Dichotomie(val : Reel, E/S evenements : Tab. Reels, taille : Entier) : Entier Declaration min, max, pos, res : Entier debut res ← 0 min ← 0 max ← taille tant que max > min faire pos ← (min + max + 1) div 2 si evenements[pos] < val alors min ← pos sinon si evenements[pos] > val alors max ← pos – 1 sinon res ← pos max ← min – 1 finsi fintantque retourner res fin Elodie Laine– – 11. 09. 2014 18. 10. 2018 H. Richard