diff --git a/lessons/contenu_cours_4.md b/lessons/contenu_cours_4.md new file mode 100644 index 0000000000000000000000000000000000000000..ec0a2cadc69a0f85e9ba305e4865421a7dfe0ca3 --- /dev/null +++ b/lessons/contenu_cours_4.md @@ -0,0 +1,142 @@ +# Algorithmes et structures de données 2019-20 + +Contenu du cours 4 du 9.10.2019 + +***** + +## Fonction cube d'un nombre + +```C + int cube(int x) { + return x*x*x; + } +``` + +## Fonction de parité + +```C + bool est_pair(int n) { + return n%2 == 0; + } +``` + +## Plus Petit Commun Multiple (PPCM) + +- Fonction PPCM: `int ppcm(int n,int m);` + +## Plus Grand Commun Diviseur (PGCD) + +- Fonction PGCD: `nt pgcd(int n,int m);` + +## Paramètres de fonction + +- Dans le langage C, les paramètres des fonctions sont toujours passés par copie. + Ainsi, la valeur d'une variable passée en paramètre à une fonction n'est pas modifiée, + puisque c'est une copie de cette variable qui est passée effectivement à la fonction. + Toutes les manipulations effectuées par la fonction le sont donc sur cette copie. + Celle-ci est détruite à la fin de l'exécution de la fonction, laissant la variable originelle inchangée. + +- Pour que des modifications puissent subsister après l'exécution, on peut procéder de deux manières : + 1. en retournant une valeur par la fonction ; + 2. en passant en paramètre un pointeur : celui-ci donne accès à une + zone mémoire hors de la portée (scope) de la fonction, zone qui + peut donc être modifiée durablement. + +- Fonction d'incrément + +```C + void sans_effet(int x) { + x++; + } + void increment(int* x) { + (*x)++; + } + + void main() { + int a = 2; + sans_effet(a); + printf("a=%d",a); // imprime 2, valeur de a inchangée + increment(&a); + printf(\"a=%d\",a); // imprime 3 + } +``` + +## Zones d'allocation mémoire + +- Un programme utilise deux types de zone mémoire lors de son exécution pour stocker les variables : la pile et le tas. +- A l'exécution d'un programme, les allocations de variables : + 1. sur la pile, sont faites par le système d'exploitation + - dans ce cas, on parle de variables statiques + 2. sur le tas, sont de la responsabilité de la programmeuse via un appel à la fonction `malloc()` + - dans ce cas, on parle de variables dynamiques +- La désallocation d'une variable statique survient lors de la sortie de sa portée (scope) et est donc automatique. +- Une variable dynamique doit être explicitement désallouée par la programmeuse avec un appel à la fonction `free()`. +- Il y a parfois une petite confusion entre la zone mémoire où réside un pointeur et celle où se situe l'espace pointé par le pointeur. +- Par exemple, l’instruction + `char* ptr_ch = malloc(3*sizeof(char));` + alloue un espace sur le tas pour 3 caractères, alors que la variable `ptr_ch` est allouée sur la pile. + + + +## Pseudo-code du tri par sélection + +``` + procedure tri_selection(tableau t[0..n-1]) + begin + for i = 0 to n-2 do + ind_min := index_min(t[i..n-1]) + if t[ind_min] ≠ t[i] then + echanger(t[i],t[ind_min]) + end if + end for + end tri_selection +``` + +## Le tri par insertion + +- Algorithme appliqué au tableau: **4 7 6 1 2** + - 1ère étape : 4 **7** 6 1 2 + - trouver la position `pos` de 7 dans le sous-tableau trié à 1 élément : **4** + - décaler de 1 les éléments de la position `pos=1` à la fin du sous-tableau + - insérer l'élément 7 en position `pos=1` + + - 2ème étape : 4 7 **6** 1 2 + - trouver la position `pos` de 6 dans le sous-tableau trié à 2 éléments : **4 7** + - décaler de 1 les éléments de la position `pos=1` à la fin du sous-tableau + - insérer l'élément 6 en position `pos=1` + + - 3ème étape : 4 6 7 **1** 2 + - trouver la position `pos` de 1 dans le sous-tableau trié à 3 éléments : **4 6 7** + - décaler de 1 les éléments de la position `pos=0` à la fin du sous-tableau + - insérer l'élément 1 en position `pos=0` + + - 4ème étape : 1 4 6 7 **2** + - trouver la position `pos` de 2 dans le sous-tableau trié à 4 éléments : **1 4 6 7** + - décaler de 1 les éléments de la position `pos=1` à la fin du sous-tableau + - insérer l'élément 2 en position `pos=1` + + - On obtient le tableau trié: **1 2 4 6 7** + +## Tri à bulles + +- Algorithme appliqué au tableau **4 7 6 2 1** + - Principe : on parcours le tableau depuis et on permute les éléments successifs s'ils sont dans le désordre + **4 7** 6 2 1 + 4 **7 6** 2 1 + 4 6 **7 2** 1 + 4 6 2 **7 1** + 4 6 2 1 7 +A la fin de cette traversée, le plus grand élément se trouve en dernière position. + + - On applique à nouveau ce principe, mais sur le tableau allant de la 1ère à l'avant-dernière case du tableau + **4 6** 2 1 7 + 4 **6 2** 1 7 + 4 2 **6 1** 7 + 4 2 1 6 7 + + - Et ainsi de suite ... + + - En 4 étapes nécessitant 4, puis 3, puis 2, et finalement 1, opérations de comparaison-échange, on obtient un tableau trié. + Donc en 4+3+2+1 = 5**·**4/2 = 10 opérations, on a un tableau trié. + + - Plus généralement, un tableau à N éléments se trie en N(N-1)/2 opérations avec le tri à bulles. \ No newline at end of file