diff --git a/lessons/contenu_cours_3.md b/lessons/contenu_cours_3.md
new file mode 100644
index 0000000000000000000000000000000000000000..4e30a488dd3b721eceabcb7f5846218f12655c5b
--- /dev/null
+++ b/lessons/contenu_cours_3.md
@@ -0,0 +1,138 @@
+# Algorithmes et structures de données 2019-20
+
+Contenu du cours 3 du 2.10.2019
+
+*****
+
+##  Tableaux à deux dimensions
+
+-   Image noir et blanc avec des booléens : initialisation  
+```C
+      int n = 8, m = 8;
+      bool image_nb[n][m];
+      for (int i=0;i<n;i++) {
+          for (int j=0;j<m;j++) {
+              image_nb[i][j] = true;
+          }
+      }
+```
+-   Image en niveaux de gris : initialisation  
+```C
+      int n = 8, m = 8;
+      int image_gris[n][m];
+      for (int i=0;i<n;i++) {
+          for (int j=0;j<m;j++) {
+              image_gris[i][j] = rand()%256;
+          }
+      }
+```
+>
+* Négatif d'une image à 256 niveaux de gris  
+    - Appliquer à chaque pixel l'opération `pixel = 255 - pixel`  
+```C
+                  for (int i=0;i<n;i++) {
+                      for (int j=0;j<m;j++) {
+                          image_gris[i][j] = 255 - ­image_gris[i][j];
+                      }
+                  }
+
+```
+
+## Type énuméré
+
+-   On définit un type énuméré `semaine, coin, mois, couleur, direction` en énumérant toutes ses valeurs possibles.   
+    Explicitement
+
+```C
+        enum semaine {lu,ma,me,je,ve,sa,di};
+        enum coin {cinq_cts=5,dix_cts=10,vingt_cts=20,euro=100};
+        enum mois {
+            jan=1,feb,mar,apr,mai,jun,jul,aug,sep,oct,nov,dec
+        };
+        enum couleur {RED,GREEN,BLUE};
+        enum direction {EST=2,OUEST=3,NORD=0,SUD=1};
+```
+
+> Les valeurs d’un type énuméré peuvent être considérées comme des entiers.
+Sans précision particulière, le premier élément correspond à 0 et les suivants à 1, 2, etc. 
+Sinon on peut explicitement spécifier des valeurs.
+Rien n’empêche d'attribuer plusieurs fois le même nombre.
+
+## Opérateur de contrôle `switch`
+
+-   Comparaison entre une valeur et un ensemble de choix pour sélectionner une action à effectuer. Toutes les possibilités doivent être prises en compte.
+
+```C
+      void main() {
+          type data = id1;
+          int val;
+          switch(data) {
+              case ID1: val = data+1; break;
+              case ID2: val = data*2; break;
+              case ID3: val = data/3.0; break;
+          };
+          println!(\"val =%d\\n\",val);
+      }
+```
+
+## Exemple de la « couverture de la reine »
+
+```C
+    enum piece {SAFE,VULN,QUEEN};
+    int size = 8;
+    piece board[size][size];
+    // initialisation de l'échiquier
+    for (int i=0;i<size;i++) {
+        for (int j=0;j<size;j++) {
+            board[i][j] = SAFE;
+        }
+    }
+    int pos_reine[] = {3,4};
+    // couverture sans les diagonales !!!
+    for (int k=0;k<size;k++) {
+        board[k][pos_reine[1]] = VULN;
+        board[pos_reine[0]][k] = VULN;
+    }
+    board[pos_reine[0]][pos_reine[1]] = QUEEN;
+```
+
+## Matrices
+
+1. Tableau 2D de nombres
+
+2.  Opérations arithmétiques
+    1. Addition : `C = A+B`
+    2. Soustraction : `C = A-B`
+    3. Multiplication : `C = A*B` (produit lignes/colonnes)
+    4. Puissance entière : `C = A`<sup>n</sup>
+
+## Type article (enregistrement, record) : `struct`
+
+- Un article permet de regrouper des types de nature différente (appelés champs) comme composant d\'un type composé.  
+  Exemples :
+
+```C
+      struct fraction {
+          int num;
+          int den;
+      };
+
+      enum mois {
+          jan=1,feb,mar,apr,mai,jun,jul,aug,sep,oct,nov,dec
+      };
+
+      struct date {
+          int day;
+          mois month;
+          int year;
+      }
+
+      enum sexe {FEM, MASC, AUTRE};
+
+      struct employe {
+          char nom[80];
+          sexe genre;
+          int age;
+          float salaire;
+      }
+```
diff --git a/source_codes/refactor_with_functions/a.out b/source_codes/refactor_with_functions/a.out
new file mode 100755
index 0000000000000000000000000000000000000000..9b817796d23474e5d1a3a27319fa402cc1357ac6
Binary files /dev/null and b/source_codes/refactor_with_functions/a.out differ
diff --git a/source_codes/refactor_with_functions/anagramme_refactored.c b/source_codes/refactor_with_functions/anagramme_refactored.c
new file mode 100644
index 0000000000000000000000000000000000000000..fa4e22be87ef8d454e87c40bad476ca557a68155
--- /dev/null
+++ b/source_codes/refactor_with_functions/anagramme_refactored.c
@@ -0,0 +1,72 @@
+#include <stdio.h>
+#include <stdbool.h>
+#include <string.h>
+
+bool anagramme_1(char mot1[],char mot2[]);
+bool anagramme_2(char mot1[],char mot2[]);
+void sort(char mot[]);
+
+void main() {
+   char mot1[30];
+   char mot2[30];
+   printf("Entrez deux mots:\n");
+   scanf("%s%s",mot1,mot2);
+   printf("Les mots %s et %s",mot1,mot2);
+
+
+   
+   if (anagramme_1(mot1,mot2)) {
+      printf(" sont des anagrammes\n");
+   } else {
+      printf(" ne sont pas des anagrammes\n");
+   }
+}
+
+bool anagramme_1(char mot1[],char mot2[]) {
+   sort(mot1);
+   sort(mot2);
+   return (strcmp(mot1,mot2) == 0);
+}
+
+bool anagramme_2(char mot1[],char mot2[]) {
+   int lg1 = strlen(mot1), lg2 = strlen(mot2);
+   bool egal = true;
+   if (lg1 == lg2) {
+      for (int i=0;i<lg1;i++) {
+         if (mot1[i] != mot2[i]) {
+            egal = false;
+            break;
+         }
+      }
+   } else {
+      egal = false;
+   }
+   return egal;
+}
+
+int index_min(char mot[],int i) {
+   int ind_min = i;
+   for (int k=i+1;k<strlen(mot);k++) {
+      if (mot[k] < mot[ind_min]) {
+         ind_min = k;
+      }
+   }
+   return ind_min;
+}
+
+void permut(char mot[],int i,int j) { 
+   char tmp = mot[i];
+   mot[i] = mot[j];
+   mot[j] = tmp;
+}
+
+void sort(char mot[]) {
+   int lg = strlen(mot);
+   for (int i=0;i<lg-1;i++) {
+      int ind_min = index_min(mot,i);
+      char tmp = mot[i];
+      mot[i] = mot[ind_min];
+      mot[ind_min] = tmp;
+   }
+}
+   
diff --git a/source_codes/refactor_with_functions/array_1D_init_find_min_refactored.c b/source_codes/refactor_with_functions/array_1D_init_find_min_refactored.c
new file mode 100644
index 0000000000000000000000000000000000000000..57f0241d6b8a183eabf88d952978a109894a92dc
--- /dev/null
+++ b/source_codes/refactor_with_functions/array_1D_init_find_min_refactored.c
@@ -0,0 +1,51 @@
+#include <stdio.h> 
+#include <stdlib.h>
+#include <time.h>
+
+// remplissage d'un tableau avec des nombres aléatoires
+void random_init(int n,int tab[n]) {
+   for (int i=0;i<n;i++) {
+      tab[i] = rand()%100;
+   }
+   printf("\n");
+}
+
+// remplissage d'un tableau avec le carré de l'index
+void square_init(int n,int tab[n]) {
+   for (int i=0;i<n;i++) {
+      tab[i] = i*i;
+   }
+}
+
+// recherche de l'indice de la valeur min dans un tableau
+int index_min(int n,int tab[n]) {
+   int ind_min = 0; 
+   for (int i=1;i<n;i++) {
+      if (tab[i] < tab[ind_min]) {
+         ind_min = i;
+      }
+   }
+   return ind_min;
+}
+
+void print(int n,int tab[n]) {
+   for (int i=0;i<n;i++) {
+      printf("%d ",tab[i]);
+   }
+   printf("\n");  
+}
+
+void main() {
+   srand(time(NULL));
+   int size;
+   printf("size = ");
+   scanf("%d",&size);
+   int tab[size];
+   square_init(size,tab);
+   print(size,tab);
+   random_init(size,tab);
+   print(size,tab);
+   int ind_min = index_min(size,tab);
+   printf("Tab: index du min = %d / valeur min = %d de tab\n",ind_min,tab[ind_min]); 
+}
+   
diff --git a/source_codes/refactor_with_functions/chess_queen_refactored.c b/source_codes/refactor_with_functions/chess_queen_refactored.c
new file mode 100644
index 0000000000000000000000000000000000000000..d4da65ee4c9aebf4addee1ec805b645f7cca1f0d
--- /dev/null
+++ b/source_codes/refactor_with_functions/chess_queen_refactored.c
@@ -0,0 +1,71 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+typedef enum _piece {SAFE, VULN, QUEEN} piece;
+
+void print(int n,int m,piece tab[n][m]);
+void init(int n,int m,piece tab[n][m],piece pce);
+void couverture(int n,int m,piece tab[n][m],int r_x,int r_y);
+
+
+void main() {
+   int n=8;
+   piece board[n][n];
+   init(n,n,board,SAFE);
+   
+   print(n,n,board);
+   printf("Entrez la colonne de la reine (1..%d): ",n);
+   int r_j;
+   scanf("%d",&r_j);
+   r_j--;
+   printf("Entrez la ligne de la reine ('a'..'%c'): ",n-1+'a');
+   char ch[1];
+   scanf("%s",ch);
+   couverture(n,n,board,ch[0]-'a',r_j);
+   print(n,n,board);
+}
+
+void print(int n,int m,piece board[n][m]) {
+   for (int i=n-1;i>=0;i--) {
+      printf("%c ",'a'+i);
+      for (int j=0;j<m;j++) {
+         switch(board[i][j]) {
+            case VULN: printf(" *"); break;
+            case SAFE : printf(" o"); break;
+            case QUEEN: printf(" R");
+         }
+      }
+      printf("\n");
+   }
+   printf("\n  ");
+   for (int j=0;j<m;j++) {
+      printf(" %d",j+1);
+   }
+   printf("\n");
+}
+
+void couverture(int n,int m,piece board[n][m],int r_i,int r_j) {
+   for (int k=0;k<n;k++) {
+      board[k][r_j] = VULN; //colonne de la reine
+   }
+   for (int k=0;k<m;k++) { 
+      board[r_i][k] = VULN; //ligne de la reine
+      int tmp = r_j-k;
+      if (0 <= r_i+tmp && r_i+tmp < n) { //diagonale montante
+         board[r_i+tmp][k] = VULN; 
+      }
+      if (0 <= r_i-tmp && r_i-tmp < n) { //diagonale descendante
+         board[r_i-tmp][k] = VULN;
+      }
+   }
+   board[r_i][r_j] = QUEEN;
+}
+
+void init(int n,int m,piece tab[n][m],piece pce) {
+   for (int i=0;i<n;i++) {
+      for (int j=0;j<m;j++) {
+         tab[i][j] = pce;
+      }
+   }
+}
+
diff --git a/source_codes/refactor_with_functions/chess_queen_refactored_part.c b/source_codes/refactor_with_functions/chess_queen_refactored_part.c
new file mode 100644
index 0000000000000000000000000000000000000000..d3d3a91cd1dc35978b132fa0772b33bdb8a0ee9a
--- /dev/null
+++ b/source_codes/refactor_with_functions/chess_queen_refactored_part.c
@@ -0,0 +1,67 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+typedef enum _piece {SAFE, VULN, QUEEN} piece;
+
+void print(int n,int m,cell tab[n][m]);
+void init_board(int n,int m,cell tab[n][m]);
+void couverture(int n,int m,cell tab[n][m],int r_x,int r_y);
+
+void main() {
+   int n=8;
+   piece board[n][n];
+   init(n,n,board,SAFE);
+   
+   print(n,n,board);
+   printf("Entrez la colonne de la reine (1..%d): ",n);
+   int r_j;
+   scanf("%d",&r_j);
+   r_j--;
+   printf("Entrez la ligne de la reine ('a'..'%c'): ",n-1+'a');
+   char ch[1];
+   scanf("%s",ch);
+   couverture(n,n,board,ch[0]-'a',r_j);
+   print(n,n,board);
+}
+
+void print(int n,int m,piece board[n][m]) {
+   for (int i=n-1;i>=0;i--) {
+      printf("%c ",'a'+i);
+      for (int j=0;j<m;j++) {
+         switch(board[i][j]) {
+            case VULN: printf(" *"); break;
+            case SAFE : printf(" o"); break;
+            case QUEEN: printf(" R");
+         }
+      }
+      printf("\n");
+   }
+   printf("\n  ");
+   for (int j=0;j<m;j++) {
+      printf(" %d",j+1);
+   }
+   printf("\n");
+}
+
+void couverture(int n,int m,piece board[n][m],int r_i,int r_j) {
+   //colonne de la reine
+   for (int k=0;k<n;k++) {
+      board[k][r_j] = VULN; 
+   }
+   //ligne de la reine
+   for (int k=0;k<m;k++) { 
+      board[r_i][k] = VULN; 
+   }
+   //diagonale montante
+   for (int k=0;r_i+k<n && r_j+k<m;k++) { 
+      board[r_i+k][r_j+k] = VULN; 
+   }
+   //compléter les autres diagonales
+   
+   board[r_i][r_j] = QUEEN;
+}
+
+void init(int n,int m,piece tab[n][m],piece pce) {
+   // à compléter
+}
+
diff --git a/source_codes/refactor_with_functions/eratosthene_refactored.c b/source_codes/refactor_with_functions/eratosthene_refactored.c
new file mode 100644
index 0000000000000000000000000000000000000000..bb6332d32782970ba996ab65127f544f6486d878
--- /dev/null
+++ b/source_codes/refactor_with_functions/eratosthene_refactored.c
@@ -0,0 +1,55 @@
+#include <stdio.h>
+#include <stdbool.h>
+
+void init(int n,bool tab[n],bool val);
+void tracer_multiples(int n,bool tab[n],int i);
+void garder_nb1er(int n,bool tab[n]);
+void print_nb1er(int n,bool tab[n]);
+
+void main() {
+   int size;
+   printf("size = ");
+   scanf("%d",&size);
+   bool tab[size];
+   init(size,tab,true);
+   garder_nb1er(size,tab);
+   printf("Nombres 1er < %d:",size);
+   print_nb1er(size,tab);
+}
+
+void init(int n,bool tab[n],bool val) {
+   for (int i=0;i<n;i++) {
+      tab[i] = true;  
+   }
+}
+
+void tracer_multiples(int n,bool tab[n],int i) {
+   int j = i;
+   while (true) {
+      j += i;
+      if (j >= n) {
+         break;
+      }
+      if (tab[j]) {
+         tab[j] = false;
+      }
+   } 
+}
+
+void garder_nb1er(int n,bool tab[n]) {
+   for (int i=2;i<n;i++) {
+      if (tab[i]) {
+          tracer_multiples(n,tab,i);
+      } 
+   }
+}
+
+void print_nb1er(int n,bool tab[n]) {
+   for (int i=2;i<n;i++) {
+      if (tab[i]) {
+         printf("%d ",i);
+      }
+   }
+   printf("\n");
+}
+   
diff --git a/source_codes/refactor_with_functions/factorielle_refactored.c b/source_codes/refactor_with_functions/factorielle_refactored.c
new file mode 100644
index 0000000000000000000000000000000000000000..84c153cbcd3da85a639c4fefdc9243e25bb062af
--- /dev/null
+++ b/source_codes/refactor_with_functions/factorielle_refactored.c
@@ -0,0 +1,20 @@
+#include <stdio.h>
+
+// fonction calculant la factorielle d'un nombre
+int factorielle(int n);
+
+void main() {
+   int nb = 1;
+   printf("Entrer un nombre: ");
+   scanf("%d",&nb);
+   printf("Fact = %d\n",factorielle(nb));
+}
+
+int factorielle(int n) {
+   int facto = 1;
+   for(int i=2;i<=n;i++) {
+      facto *= i;
+   }
+   return facto;
+}
+
diff --git a/source_codes/refactor_with_functions/nb1er_refactored.c b/source_codes/refactor_with_functions/nb1er_refactored.c
new file mode 100644
index 0000000000000000000000000000000000000000..7834fd46bf78a5f2f84aa8e1da2c7af19a1885f8
--- /dev/null
+++ b/source_codes/refactor_with_functions/nb1er_refactored.c
@@ -0,0 +1,30 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include <stdbool.h>
+
+// fonction testant si un nombre est 1er
+bool is_prime(int nb);
+
+void main() {
+   int nb = 1;
+   printf("Entrez un nombre: ");
+   scanf("%d",&nb);
+
+   if (is_prime(nb)) {
+      printf("Le nombre %d est premier\n",nb);
+   } else {
+      printf("Le nombre %d n'est pas premier\n",nb);
+   }
+}
+
+bool is_prime(int nb) {
+   bool premier = true;
+   for (int div=2;div<=sqrt(nb);div++) {    
+      if (nb%div == 0) {
+         premier = false;
+         break;
+      }
+   }
+   return premier;
+}
diff --git a/source_codes/refactor_with_functions/palindrome_refactored.c b/source_codes/refactor_with_functions/palindrome_refactored.c
new file mode 100644
index 0000000000000000000000000000000000000000..fbfaa3a71a38557ffd8c5684d8009367f85d01db
--- /dev/null
+++ b/source_codes/refactor_with_functions/palindrome_refactored.c
@@ -0,0 +1,45 @@
+#include <stdio.h> 
+#include <stdlib.h>
+#include <string.h>
+#include <stdbool.h>
+
+bool is_palindrome_1(char mot[]);
+bool is_palindrome_2(char mot[]);
+
+void main() {
+   printf("Entrez une chaîne de caractères: ");
+   char mot[30];
+   scanf("%s",mot);
+
+   printf("Le mot %s",mot);
+   if (is_palindrome_1(mot)) {
+      printf(" est un palindrome\n");
+   } else {
+      printf(" n'est pas un palindrome\n");
+   }
+}
+
+bool is_palindrome_1(char mot[]) {
+   int lg = strlen(mot);
+   bool palindrome = true;
+   int first_idx = 0, last_idx = lg-1;
+   while (first_idx < last_idx) {
+      if (mot[first_idx] != mot[last_idx]) {
+         palindrome = false;
+         break;
+      } 
+      first_idx += 1;
+      last_idx  -= 1;
+   }
+   return palindrome;
+}
+
+bool is_palindrome_2(char mot[]) {
+   int lg = strlen(mot);
+   char inverse[lg+1];
+   for (int i=0;i<lg;i++) {
+      inverse[i] = mot[lg-1+i];
+   }
+   inverse[lg] = '\0';
+   return (strcmp(inverse,mot) == 0); 
+}  
diff --git a/source_codes/refactor_with_functions/pgcd_refactored.c b/source_codes/refactor_with_functions/pgcd_refactored.c
new file mode 100644
index 0000000000000000000000000000000000000000..31ad8ac699615a376c2815a7a62b4978da64bdb5
--- /dev/null
+++ b/source_codes/refactor_with_functions/pgcd_refactored.c
@@ -0,0 +1,41 @@
+#include <stdio.h>
+
+// calcul du PGCD de deux nombres: algorithme naif
+int pgcd_naif(int n, int m);
+// calcul du PGCD de deux nombres: algorithme d'Euclide
+int pgcd_euclide(int n, int m);
+
+void main() {
+   int n,m;
+   printf("n = ");
+   scanf("%d",&n);
+   printf("m = ");
+   scanf("%d",&m);
+   printf("Le pgcd de %d et %d est %d\n",n,m,pgcd_naif(n,m));
+   printf("Le pgcd de %d et %d est %d\n",n,m,pgcd_euclide(n,m));
+}
+
+// algorithme naif
+int pgcd_naif(int n, int m) {
+   int gcd = 1;
+   for (int div=n;div>=2;div--) {
+      if (n%div == 0 && m%div == 0) {
+         gcd = div;
+         break;
+      }
+   }
+   return gcd;
+}
+
+// algorithme d'Euclide
+int pgcd_euclide(int n, int m) {
+   int tmp_n = n;
+   int tmp_m = m;
+   while (tmp_n%tmp_m > 0) {
+      int tmp = tmp_n;
+      tmp_n = tmp_m;
+      tmp_m = tmp%tmp_m;
+   }
+   return tmp_m;
+}
+   
diff --git a/source_codes/refactor_with_functions/ppcm_refactored.c b/source_codes/refactor_with_functions/ppcm_refactored.c
new file mode 100644
index 0000000000000000000000000000000000000000..2a3619e05f2a7ed01327bed55f697130a0b4535c
--- /dev/null
+++ b/source_codes/refactor_with_functions/ppcm_refactored.c
@@ -0,0 +1,36 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include <stdbool.h>
+// fonctions calculant le plus petit commun multiple (PPCM) de deux nombres
+int ppcm_1(int n,int m);
+int ppcm_2(int n,int m);
+
+void main() {
+   int n,m;
+   printf("n = ");
+   scanf("%d",&n);
+   printf("m = ");
+   scanf("%d",&m);
+   printf("Le ppcm de %d et %d est %d\n",n,m,ppcm_1(n,m));
+   printf("Le ppcm de %d et %d est %d\n",n,m,ppcm_2(n,m));
+}
+
+int ppcm_1(int n,int m) {
+   int res = n*m;
+   for (int i=2;i<=m;i++) {
+      if (n*i%m == 0) {
+         res = n*i;
+         break;
+      }
+   }
+}
+
+int ppcm_2(int n,int m) {
+   int fact = 1;
+   while (n*fact%m != 0) {
+      fact++;
+   }
+   return fact*n;
+}
+   
diff --git a/source_codes/refactor_with_functions/tri_select_refactored.c b/source_codes/refactor_with_functions/tri_select_refactored.c
new file mode 100644
index 0000000000000000000000000000000000000000..e6edd0272444830534bf5880289101923ea1855c
--- /dev/null
+++ b/source_codes/refactor_with_functions/tri_select_refactored.c
@@ -0,0 +1,78 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+#include <stdbool.h>
+
+void print(int n,double tab[n]);
+
+void random_init(int n,double tab[n]);
+
+void tri_selection(int n,double tab[n]);  
+
+bool croissant(int n,double tab[n]);
+
+int main() {
+   srand(time(NULL));
+   int n;
+   printf("n=");
+   scanf("%d",&n);
+
+   double res[n];
+   random_init(n,res);
+   print(n,res);
+   tri_selection(n,res); 
+   print(n,res);
+   
+   if (!croissant(n,res)) {
+      return EXIT_FAILURE;
+   }
+   printf("sorted\n");
+   return EXIT_SUCCESS;
+}
+
+void print(int n,double tab[n]) {
+   for (int i=0;i<n;i++) {
+      printf("%.2lf ",tab[i]);
+   }
+   printf("\n");  
+}
+
+void random_init(int n,double tab[n]) {
+   for (int i=0;i<n;i++) {
+      tab[i] = 100.0*rand()/(double)RAND_MAX;
+   }
+}
+
+int index_min(int n,double tab[n],int i) {
+   int ind_min = i;
+   for (int k=i+1;k<n;k++) {
+      if (tab[k] < tab[ind_min]) {
+         ind_min = k;
+      }
+   }
+   return ind_min;
+}
+
+void permut(int n,double tab[n],int i,int j) { 
+   double tmp = tab[i];
+   tab[i] = tab[j];
+   tab[j] = tmp;
+}
+
+void tri_selection(int n,double tab[n]) {
+   for (int i=0;i<n-1;i++) {
+      int ind_min = index_min(n,tab,i);
+      if (tab[i] != tab[ind_min]) {
+         permut(n,tab,i,ind_min);
+      }
+   }
+}     
+
+bool croissant(int n,double tab[n]) {
+   for (int i=0;i<n-1;i++) {
+      if (tab[i] > tab[i + 1]) {
+         return false;
+      }
+   }
+   return true;
+}
diff --git a/source_codes/refactor_with_functions/tri_select_refactored_part.c b/source_codes/refactor_with_functions/tri_select_refactored_part.c
new file mode 100644
index 0000000000000000000000000000000000000000..9ad9082d9b9c5ca6f75aec38bc863bd2bf8b4a8b
--- /dev/null
+++ b/source_codes/refactor_with_functions/tri_select_refactored_part.c
@@ -0,0 +1,55 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+#include <stdbool.h>
+
+void print(int n,double tab[n]) {
+   //à compléter  
+}
+
+void random_tab(int n,double tab[n]) {
+   //à compléter
+}
+
+int index_min(int n,double tab[n],int i) {
+   int ind_min = i;
+   //à compléter
+   return ind_min;
+}
+
+void permut(int n,double tab[n],int i,int j) { 
+   //à compléter
+}
+
+void tri_selection(int n,double tab[n]) {
+   for (int i=0;i<n-1;i++) {
+      int ind_min = index_min(n,tab,i);
+      if (tab[i] != tab[ind_min]) {
+         permut(n,tab,i,ind_min);
+      }
+   }
+}     
+
+bool croissant(int n,double tab[n]) {
+   //à compléter
+   return true;
+}
+
+int main() {
+   srand(time(NULL));
+   int n;
+   printf("n=");
+   scanf("%d",&n);
+
+   double res[n];
+   random_tab(n,res);
+   print(n,res);
+   tri_selection(n,res); 
+   print(n,res);
+   
+   if (!croissant(n,res)) {
+      return EXIT_FAILURE;
+   }
+   printf("sorted\n");
+   return EXIT_SUCCESS;
+}
diff --git a/source_codes/refactor_with_functions/tri_select_to_refactor.c b/source_codes/refactor_with_functions/tri_select_to_refactor.c
new file mode 100644
index 0000000000000000000000000000000000000000..49916b138f5f0f7c91caad77c683cccbdd1b8cb6
--- /dev/null
+++ b/source_codes/refactor_with_functions/tri_select_to_refactor.c
@@ -0,0 +1,40 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+
+#define SIZE 10
+
+int main() {
+    srand(time(NULL));
+    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 min  = tab[i];
+        int ind_min = i;
+        for (int j = i + 1; j < SIZE; ++j) {
+            if (min > tab[j]) {
+                ind_min = j;
+                min     = tab[j];
+            }
+        }
+        double tmp   = tab[i];
+        tab[i]       = tab[ind_min];
+        tab[ind_min] = tmp;
+    }
+
+    for (int i = 0; i < SIZE; ++i) {
+        printf("%f ", tab[i]);
+    }
+    printf("\n");
+
+    for (int i = 0; i < SIZE - 1; ++i) {
+        if (tab[i] > tab[i + 1]) {
+            return EXIT_FAILURE;
+        }
+    }
+
+    return EXIT_SUCCESS;
+}
diff --git a/source_codes/tableaux_1d/anagramme.c b/source_codes/tableaux_1d/anagramme.c
new file mode 100644
index 0000000000000000000000000000000000000000..d81505e5655f88afe97ae60c3f29541261b2ed1b
--- /dev/null
+++ b/source_codes/tableaux_1d/anagramme.c
@@ -0,0 +1,57 @@
+#include <stdio.h>
+#include <stdbool.h>
+#include <string.h>
+void main() {
+   char mot1[30];
+   char mot2[30];
+   printf("Entrez deux mots:\n");
+   scanf("%s%s",mot1,mot2);
+   int lg1 = strlen(mot1), lg2 = strlen(mot2);
+   printf("Les mots %s et %s",mot1,mot2);
+
+   // tri de mot1
+   for (int i=0;i<lg1-1;i++) {
+      int ind_min = i; 
+      for (int k=i+1;k<lg1;k++) {
+         if (mot1[k] < mot1[ind_min]) {
+            ind_min = k;
+         }
+      }   
+      int tmp = mot1[i];
+      mot1[i] = mot1[ind_min];
+      mot1[ind_min] = tmp;
+   }
+
+   // tri de mot2
+   for (int i=0;i<lg2;i++) {
+      int ind_min = i; 
+      for (int k=i+1;k<lg2;k++) {
+         if (mot2[k] < mot2[ind_min]) {
+             ind_min = k;
+         }
+      }   
+      int tmp = mot2[i];
+      mot2[i] = mot2[ind_min];
+      mot2[ind_min] = tmp;
+   }
+
+   /*bool egal = true;
+   if (lg1 == lg2) {
+      for (int i=0;i<lg1;i++) {
+         if (mot1[i] != mot2[i]) {
+            egal = false;
+            break;
+         }
+      }
+   } else {
+      egal = false;
+   }*/
+   bool egal = (strcmp(mot1,mot2) == 0);
+   
+   if (egal) {
+      printf(" sont des anagrammes\n");
+   } else {
+      printf(" ne sont pas des anagrammes\n");
+   }
+}
+   
diff --git a/source_codes/tableaux_1d/array_1D_init_find_min.c b/source_codes/tableaux_1d/array_1D_init_find_min.c
new file mode 100644
index 0000000000000000000000000000000000000000..c8bc98c6764f05ebe97922ce9f5137deae8e5ae8
--- /dev/null
+++ b/source_codes/tableaux_1d/array_1D_init_find_min.c
@@ -0,0 +1,36 @@
+#include <stdio.h> 
+#include <stdlib.h>
+#include <time.h>
+const unsigned int SIZE = 13;
+
+void main() {
+   int tab[SIZE];
+   for (int i=0;i<SIZE;i++) { 
+      tab[i] = i*i;
+   }  
+   for (int i=0;i<SIZE;i++){ 
+      printf("%d ",tab[i]);
+   }
+   printf("\n");  
+
+   // remplissage d'un tableau avec des nombres aléatoires
+   srand(time(NULL));
+   for (int i=0;i<SIZE;i++) { 
+      tab[i] = rand()%100;
+   }  
+   for (int i=0;i<SIZE;i++) { 
+      printf("%d ",tab[i]);
+   }
+   printf("\n");
+
+   // recherche de l'indice de la valeur min dans un tableau
+   int val_min = tab[0],ind_min = 0; 
+   for (int i=0;i<SIZE;i++) {
+      if (tab[i] < val_min) {
+         ind_min = i;
+         val_min = tab[i];
+      }
+   }
+   printf("Tab: index du min = %d / valeur min = %d de tab\n",ind_min,tab[ind_min]); 
+}
+   
diff --git a/source_codes/tableaux_1d/eratosthene.c b/source_codes/tableaux_1d/eratosthene.c
new file mode 100644
index 0000000000000000000000000000000000000000..27355bec56de8a4d1ae654d5d91cf71d9a49a9d3
--- /dev/null
+++ b/source_codes/tableaux_1d/eratosthene.c
@@ -0,0 +1,30 @@
+#include <stdio.h>
+#include <stdbool.h>
+const int SIZE = 51;
+
+void main() {
+   bool tab[SIZE];
+   for (int i=0;i<SIZE;i++) {
+      tab[i] = true;  
+   }
+   for (int i=2;i<SIZE;i++) {
+      if (tab[i]) {
+         int j = i;
+         while (true) {
+            j += i;
+            if (j >= SIZE) {
+               break;
+            }
+            tab[j] = false;
+         } 
+      } 
+   }
+    
+   for (int i=2;i<SIZE;i++) {
+      if (tab[i]) {
+         printf("%d ",i);
+      }
+   }
+   printf("\n");
+}
+   
diff --git a/source_codes/tableaux_1d/palindrome.c b/source_codes/tableaux_1d/palindrome.c
new file mode 100644
index 0000000000000000000000000000000000000000..7c00e523272e134b4020b44078bf117b4c136c20
--- /dev/null
+++ b/source_codes/tableaux_1d/palindrome.c
@@ -0,0 +1,39 @@
+#include <stdio.h> 
+#include <stdlib.h>
+#include <string.h>
+#include <stdbool.h>
+
+void main() {
+   printf("Entrez une chaîne de caractères: ");
+   char mot[30];
+   scanf("%s",mot);
+   int lg = strlen(mot);
+ 
+   bool palindrome = true;
+   int first_idx = 0;
+   int last_idx = lg-1;
+   while (first_idx < last_idx) {
+      if (mot[first_idx] != mot[last_idx]) {
+         palindrome = false;
+         break;
+      } 
+      first_idx += 1;
+      last_idx -= 1;
+   }
+
+   //alternative
+   char inverse[30];
+   for (int i=0;i<lg;i++) {
+      inverse[i] = mot[lg-1-i];
+   }
+   inverse[lg] = '\0';
+   bool palindrome_alt = (strcmp(inverse,mot) == 0); 
+
+   printf("Le mot %s",mot);
+   if (palindrome_alt) {
+      printf(" est un palindrome\n");
+   } else {
+      printf(" n'est pas un palindrome\n");
+   }
+}
+   
diff --git a/source_codes/tableaux_1d/tri_select.c b/source_codes/tableaux_1d/tri_select.c
new file mode 100644
index 0000000000000000000000000000000000000000..18f5f9696b2abdcf0800578832f3a68afca21207
--- /dev/null
+++ b/source_codes/tableaux_1d/tri_select.c
@@ -0,0 +1,56 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+const int SIZE = 13;
+
+// Tri par sélection
+void main() {
+   srand(time(NULL));
+   float tab[SIZE];
+   // initialisation du tableau avec des valeurs aléatoires
+   for (int i=0;i<SIZE;i++) {
+      tab[i] = 100.0*(rand()/(float)RAND_MAX);
+   }
+   // impression du tableau
+   for (int i=0;i<SIZE;i++) {
+      printf("%.2f ",tab[i]);
+   }
+   printf("\n");
+
+   // recherche dans le tableau de l'indice de la plus petite valeur
+   int ind_min = 0; 
+   for (int k=1;k<SIZE;k++) {
+      if (tab[k] < tab[ind_min]) {
+         ind_min = k;
+      }
+   }
+   printf("index du min de tab: %d / valeur min de tab: %.2f\n",ind_min,tab[ind_min]); 
+
+   // échange de la 1ère valeur avec la plus petite du tableau
+   float tmp = tab[0];
+   tab[0] = tab[ind_min];
+   tab[ind_min] = tmp;
+   // impression du tableau
+   for (int i=0;i<SIZE;i++) {
+      printf("%.2f ",tab[i]);
+   }
+   printf("\n");
+   // tri par sélection
+   for (int i=0;i<SIZE-1;i++) {
+      ind_min = i; 
+      for (int k=i+1;k<SIZE;k++) {
+         if (tab[k] < tab[ind_min]) {
+            ind_min = k;
+         }
+      } 
+      tmp = tab[i];
+      tab[i] = tab[ind_min];
+      tab[ind_min] = tmp;
+   }
+   // impression du tableau
+   for (int i=0;i<SIZE;i++) {
+      printf("%.2f ",tab[i]);
+   }
+   printf("\n");
+}
+   
diff --git a/source_codes/tableaux_1d/tri_select_ebauche.c b/source_codes/tableaux_1d/tri_select_ebauche.c
new file mode 100644
index 0000000000000000000000000000000000000000..2ada6c532f5393d0e360f0826e7686399ede7f17
--- /dev/null
+++ b/source_codes/tableaux_1d/tri_select_ebauche.c
@@ -0,0 +1,47 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+const int SIZE = 13;
+
+// Tri par sélection
+void main() {
+   //déclaration et intialisation du tableau
+   srand(time(NULL));
+   double tab[SIZE];
+   for (int i=0;i<SIZE;i++) {
+      tab[i] = 100.0*(rand()/(double)RAND_MAX);
+   }
+   
+   //impression du tableau
+   for (int i=0;i<SIZE;i++) {
+      printf("%.2lf ",tab[i]);
+   }
+   printf("\n");
+   //à compléter
+   int debut = 0;
+   for (....) { //à compléter
+      // recherche du plus petit élément du sous-tableau de début à SIZE
+      int ind_min = 0; // à remplacer 0 par debut
+      double val_min = tab[0]; // à remplacer 0 par debut
+      for (int i = 1; i < SIZE; ++i) { //à remplacer 1 par debut+1
+         if (val_min > tab[i]) {
+            val_min = tab[i];
+            ind_min = i;
+         }
+      }
+      printf("val. min. = %.2lf / index min. = %d\n ",val_min,ind_min);
+      // permuter le plus petit élément avec le premier élément du tableau
+      double tmp = tab[0];   // à remplacer 0 par debut
+      tab[0] = tab[ind_min]; // à remplacer 0 par debut
+      tab[ind_min] = tmp;
+   }
+
+   //impression du tableau
+   for (int i=0;i<SIZE;i++) {
+      printf("%.2lf ",tab[i]);
+   }
+   printf("\n");
+
+   //validation que le tableau est trié
+   //à compléter
+}
diff --git a/source_codes/tableaux_2d/chess_queen.c b/source_codes/tableaux_2d/chess_queen.c
new file mode 100644
index 0000000000000000000000000000000000000000..60a7cb588ce6dce129c1f01fd2a3e035f3707eab
--- /dev/null
+++ b/source_codes/tableaux_2d/chess_queen.c
@@ -0,0 +1,71 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+typedef enum _piece {SAFE, VULN, QUEEN} piece;
+
+void print(int n,int m,cell tab[n][m]);
+void init_board(int n,int m,cell tab[n][m]);
+void couverture(int n,int m,cell tab[n][m],int r_x,int r_y);
+
+
+void main() {
+   int n=8;
+   piece board[n][n];
+   init(n,n,board,SAFE);
+   
+   print(n,n,board);
+   printf("Entrez la colonne de la reine (1..%d): ",n);
+   int r_j;
+   scanf("%d",&r_j);
+   r_j--;
+   printf("Entrez la ligne de la reine ('a'..'%c'): ",n-1+'a');
+   char ch[1];
+   scanf("%s",ch);
+   couverture(n,n,board,ch[0]-'a',r_j);
+   print(n,n,board);
+}
+
+void print(int n,int m,piece board[n][m]) {
+   for (int i=n-1;i>=0;i--) {
+      printf("%c ",'a'+i);
+      for (int j=0;j<m;j++) {
+         switch(board[i][j]) {
+            case VULN: printf(" *"); break;
+            case SAFE : printf(" o"); break;
+            case QUEEN: printf(" R");
+         }
+      }
+      printf("\n");
+   }
+   printf("\n  ");
+   for (int j=0;j<m;j++) {
+      printf(" %d",j+1);
+   }
+   printf("\n");
+}
+
+void couverture(int n,int m,piece board[n][m],int r_i,int r_j) {
+   for (int k=0;k<n;k++) {
+      board[k][r_j] = VULN; //colonne de la reine
+   }
+   for (int k=0;k<m;k++) { 
+      board[r_i][k] = VULN; //ligne de la reine
+      int tmp = r_j-k;
+      if (0 <= r_i+tmp && r_i+tmp < n) { //diagonale montante
+         board[r_i+tmp][k] = VULN; 
+      }
+      if (0 <= r_i-tmp && r_i-tmp < n) { //diagonale descendante
+         board[r_i-tmp][k] = VULN;
+      }
+   }
+   board[r_i][r_j] = QUEEN;
+}
+
+void init(int n,int m,piece tab[n][m],piece pce) {
+   for (int i=0;i<n;i++) {
+      for (int j=0;j<m;j++) {
+         tab[i][j] = pce;
+      }
+   }
+}
+
diff --git a/source_codes/tableaux_2d/chess_queen_part.c b/source_codes/tableaux_2d/chess_queen_part.c
new file mode 100644
index 0000000000000000000000000000000000000000..d3d3a91cd1dc35978b132fa0772b33bdb8a0ee9a
--- /dev/null
+++ b/source_codes/tableaux_2d/chess_queen_part.c
@@ -0,0 +1,67 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+typedef enum _piece {SAFE, VULN, QUEEN} piece;
+
+void print(int n,int m,cell tab[n][m]);
+void init_board(int n,int m,cell tab[n][m]);
+void couverture(int n,int m,cell tab[n][m],int r_x,int r_y);
+
+void main() {
+   int n=8;
+   piece board[n][n];
+   init(n,n,board,SAFE);
+   
+   print(n,n,board);
+   printf("Entrez la colonne de la reine (1..%d): ",n);
+   int r_j;
+   scanf("%d",&r_j);
+   r_j--;
+   printf("Entrez la ligne de la reine ('a'..'%c'): ",n-1+'a');
+   char ch[1];
+   scanf("%s",ch);
+   couverture(n,n,board,ch[0]-'a',r_j);
+   print(n,n,board);
+}
+
+void print(int n,int m,piece board[n][m]) {
+   for (int i=n-1;i>=0;i--) {
+      printf("%c ",'a'+i);
+      for (int j=0;j<m;j++) {
+         switch(board[i][j]) {
+            case VULN: printf(" *"); break;
+            case SAFE : printf(" o"); break;
+            case QUEEN: printf(" R");
+         }
+      }
+      printf("\n");
+   }
+   printf("\n  ");
+   for (int j=0;j<m;j++) {
+      printf(" %d",j+1);
+   }
+   printf("\n");
+}
+
+void couverture(int n,int m,piece board[n][m],int r_i,int r_j) {
+   //colonne de la reine
+   for (int k=0;k<n;k++) {
+      board[k][r_j] = VULN; 
+   }
+   //ligne de la reine
+   for (int k=0;k<m;k++) { 
+      board[r_i][k] = VULN; 
+   }
+   //diagonale montante
+   for (int k=0;r_i+k<n && r_j+k<m;k++) { 
+      board[r_i+k][r_j+k] = VULN; 
+   }
+   //compléter les autres diagonales
+   
+   board[r_i][r_j] = QUEEN;
+}
+
+void init(int n,int m,piece tab[n][m],piece pce) {
+   // à compléter
+}
+