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!"); + } +} +```