diff --git a/slides/cours_3.md b/slides/cours_3.md
index 0f2ca366b80e6f8aab3592f2f56395c43312daeb..e0be64f4fbf6cd40bbb596a6ae2010f34fa4832c 100644
--- a/slides/cours_3.md
+++ b/slides/cours_3.md
@@ -1,6 +1,11 @@
+---
+title: "Introduction aux algorithmes"
+date: "2021-10-06"
+---
+
 # Quelques algorithmes simples
 
-## Voyons quelques algorithmes supplémentaires
+## Quelques algorithmes supplémentaires
 
 - Remplissage d'un tableau et recherche de la valeur minimale
 
@@ -135,7 +140,142 @@ boucle (ind < SIZE-1) {
 * Afficher le résultat trié;
 * Vérifier algorithmiquement que le résultat est bien trié.
 
+# Un type de tableau particulier
+
+## Les chaînes de caractères
+
+```C
+string = tableau + char + magie noire
+```
+
+# Le type `char`{.C}
+
+- Le type `char`{.C} est utilisé pour représenter un caractère.
+- C'est un entier 8 bits signé.
+- En particulier:
+    - Écrire
+        
+        ```C
+        char c = 'A';
+        ```
+    - Est équivalent à:
+
+        ```C
+        char c = 65;
+        ```
+- Les fonctions d'affichage interprètent le nombre comme sa valeur ASCII.
+
+# Chaînes de caractères (strings)
+
+- Chaîne de caractère `==` tableau de caractères **terminé par la valeur** `'\0'`{.C} ou `0`{.C}.
+
+## Exemple
+
+```C
+char *str  = "HELLO !";
+char str[] = "HELLO !";
+```
+
+Est représenté par
+
+| `H`  | `E`  | `L`  | `L`  | `O`  |      | `!`  | `\0`|
+|------|------|------|------|------|------|------|-----|
+| `72` | `69` | `76` | `76` | `79` | `32` | `33` | `0` |
+
+# Syntaxe
+
+```C
+char name[5];
+name[0] = 'P';  // = 70;
+name[1] = 'a';  // = 97;
+name[2] = 'u';  // = 117;
+name[3] = 'l';  // = 108;
+name[4] = '\0'; // = 0;
+char name[] = {'P', 'a', 'u', 'l', '\0'};
+char name[5] = "Paul";
+char name[] = "Paul";
+char name[100] = "Paul is not 100 characters long.";
+```
+
+# Fonctions
+
+- Il existe une grande quantités de fonction pour la manipulation de chaînes de caractères dans `string.h`.
+- Fonctions principales:
+
+    ```C
+    // longueur de la chaîne (sans le \0)
+    size_t strlen(char *str);
+    // copie jusqu'à un \0
+    char *strcpy(char *dest, const char *src);
+     // copie len char
+    char *strncpy(char *dest, const char *src, size_t len);
+    // compare len chars
+    int strncmp(char *str1, char *str2, size_t len);
+    // compare jusqu'à un \0
+    int strcmp(char *str1, char *str2);
+    ```
+
+- Pour avoir la liste complète: `man string`.
+
+. . .
+
+## Quels problèmes peuvent se produire avec `strlen`, `strcpy`, `strcmp`?
+
+# Les anagrammes
+
+## Définition
+
+Deux mots sont des anagrammes l'un de l'autre quand ils contiennent les mêmes 
+lettres mais dans un ordre différent.
+
+## Exemple
+
+| `t`  | `u`  | `t`  | `u`  | `t`  | `\0` | ` `  | ` ` |
+|------|------|------|------|------|------|------|-----|
+| `t`  | `u`  | `t`  | `t`  | `u`  | `\0` | ` `  | ` ` |
+
+
+## Problème: Trouvez un algorithme pour déterminer si deux mots sont des anagrammes.
 
-# La fin 
+# Les anagrammes
 
-## Des questions?
+## Il suffit de:
+
+1. Trier les deux mots.
+2. Vérifier s'ils contiennent les mêmes lettres.
+
+```C
+void tri(char tab[]);
+int strlen(char mot[]) {
+    int i = 0;
+    while (mot[i] != '\0') {
+        i++;
+    }
+    return i;
+}
+bool is_equal(char mot1[], char mot2[]) {
+    if (strlen(mot1) != strlen(mot2)) {
+        return false;
+    }
+    for (int i = 0; i < strlen(mot1); ++i) {
+        if (mot1[i] != mot2[i]) {
+            return false;
+        } 
+    }
+    return true;
+}
+
+int main() {
+    char mot1[] = "tutut";
+    char mot2[] = "tutut";
+    printf("%s et %s ", mot1, mot2);
+    tri(mot1);
+    tri(mot2);
+    boll anagramme = is_equal(mot1, mot2);
+    if (anagramme) {
+        printf("sont des anagramme!");
+    } else {
+        printf("ne sont pas des anagramme!");
+    }
+}
+```