diff --git a/examples/tri_selection/tri.c b/examples/tri_selection/tri.c new file mode 100644 index 0000000000000000000000000000000000000000..5bbc7f32a088c42b4a6c8e3880fe0269c5465ff0 --- /dev/null +++ b/examples/tri_selection/tri.c @@ -0,0 +1,26 @@ +#include <stdio.h> +#include <stdlib.h> + +#define SIZE 10 + +void find_min(double tab[], int i0, int *ind) { + double min = tab[i0]; + *ind = i0; + for (int i = i0 + 1; i < SIZE; ++i) { + if (min > tab[i]) { + *ind = i; + min = tab[i]; + } + } +} + +int main() { + double tab[SIZE]; + for (int i = 0; i < SIZE; ++i) { + tab[i] = rand() / (double)RAND_MAX; + } + + for (int i = 0; i < SIZE - 1; ++i) { + double + } +} diff --git a/slides/cours_2.md b/slides/cours_2.md index 2b50f95edb054c691b1bc8914571c97870a89335..a25d847a69eaf8ac00278156c6529b545d9ef808 100644 --- a/slides/cours_2.md +++ b/slides/cours_2.md @@ -374,23 +374,132 @@ void main() { # Collections: tableaux statiques -* Collection d'objets de même type dont le nombre est connu à la - compilation; -* Stockés contigüement en mémoire, sur la pile; +* Objets de même type: leur nombre est **connu à la compilation**; +* Stockés contigüement en mémoire (très efficace); ```C + #define SIZE 10 int entiers[] = {2, 1, 4, 5, 7}; // taille 5, initialisé int tab[3]; // taille 3, non initialisé + float many_floats[SIZE]; // taille 10, non initialisé ``` -* Les indices sont numérotés de `0` à `taille-1`. +* Les indices sont numérotés de `0` à `taille-1`; ```C - int premier = entier[0]; - int dernier = entier[4]; + int premier = entier[0]; // premier = 2 + int dernier = entier[4]; // dernier = 7 ``` -* Les tableaux sont **non-initialisés** par défaut. +* Les tableaux sont **non-initialisés** par défaut; +* Les bornes ne sont **jamais** vérifiées. ```C - int indetermine = tab[1]; + int indetermine_1 = tab[1]; // undefined behavior + int indetermine_2 = entiers[5]; // UB ``` +# Remarques + +* Depuis `C99` possibilité d'avoir des tableaux dont la taille est *inconnue à + la compilation*; + + ```C + int size; + scanf("%d", &size); + char string[size]; + ``` + + . . . + +* Considéré comme une mauvaise pratique: que se passe-t-il si `size == 1e9`? +* On préfère utiliser l'allocation **dynamique** de mémoire pour ce genre de + cas-là (spoiler du futur du cours). + +# Initialisation + +* Les variables ne sont **jamais** initialisées en `C` par défaut. +* Question: Que contient le tableau suivant? + + ```C + double tab[4]; + ``` + +. . . + +* Réponse: On en sait absolument rien! +* Comment initialiser un tableau? + +. . . + + ```C + #define SIZE 10 + double tab[SIZE]; + for (int i = 0; i < SIZE; ++i) { + tab[i] = rand() / (double)RAND_MAX * 10.0 - 5.0; // double [-5;5] + } + ``` + +# Recherche du minimum dans un tableau (1/2) + +## Problématique + +Trouver le minimum d'un tableau et l'indice de l'élément le plus petit. + +## Écrire un pseudo-code résolvant ce problème (groupe de 3), 2min + +. . . + +```C +index = 0 +min = tab[0] +for i in [1; SIZE] { + if min > tab[i] { + min = tab[i] + index = i + } +} +``` + +# Recherche du minimum dans un tableau (2/2) + +## Implémenter ce bout de code en C (groupe de 3), 4min + +. . . + +```C +int index = 0; +float min = tab[0]; +for (int i = 1; i < SIZE; ++i) { + if min > tab[i] { + min = tab[i]; + index = i; + } +} +``` + +# Tri par sélection (1/2) + +## Problématique + +Trier un tableau par ordre croissant. + +## Idée d'algorithme + +```C +ind = 0 +boucle (ind < SIZE) { + Trouver le minimum du tableau, tab_min[ind:SIZE]. + Échanger tab_min avec tab[ind] + ind += 1 +} +``` + +# Tri par sélection (2/2) + +## Implémentation par groupe de 3 + + + + +# La fin + +## Des questions?