From b6e98fd5697c585dad3e86b809880b2ff44abe63 Mon Sep 17 00:00:00 2001 From: Orestis Malaspinas <orestis.malaspinas@hesge.ch> Date: Wed, 23 Sep 2020 12:57:23 +0200 Subject: [PATCH] maj cours --- base_2.md | 202 +++++++++--------------------------------------------- base_3.md | 166 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 199 insertions(+), 169 deletions(-) diff --git a/base_2.md b/base_2.md index 800e115..88025fd 100644 --- a/base_2.md +++ b/base_2.md @@ -18,7 +18,7 @@ switch (expression) { } ``` -**Que se passe-t-il si `break`{C} est absent?** +**Que se passe-t-il si `break`{.C} est absent?** # Structures de contrôle: `switch`{.C} .. `case`{.C} (2/2) @@ -43,7 +43,7 @@ switch (x) { ## [Quiz: `switch ... case`{.C}](https://cyberlearn.hes-so.ch/mod/evoting/view.php?id=1033916) -# Structures de contrôle: `for`{.C} (1/2) +# Structures de contrôle: `for`{.C} ## La boucle `for`{.C} @@ -66,7 +66,7 @@ for (int i = 0; i != 1; i = rand() % 4) { // ésotérique } ``` -# Structures de contrôle: `continue`{.C}, `break`{.C} (2/2) +# Structures de contrôle: `continue`{.C}, `break`{.C} - `continue`{.C} saute à la prochaine itération d'une boucle. @@ -92,6 +92,36 @@ for (int i = 0; i != 1; i = rand() % 4) { // ésotérique } ``` +# Représentation des variables en mémoire (1/2) + +## La mémoire + +* La mémoire est: + - ... un ensemble de bits, + - ... accessible via des adresses, + + +------+----------+----------+------+----------+------+------+ + | bits | 00110101 | 10010000 | .... | 00110011 | .... | .... | + +======+==========+==========+======+==========+======+======+ + | addr | 2000 | 2001 | .... | 4000 | .... | .... | + +------+----------+----------+------+----------+------+------+ + + - ... gérée par le système d'exploitation. + - ... séparée en deux parties: **la pile** et **le tas**. + +## Une variable + +* Une variable, `type a = valeur`{.C}, possède: + - un type (`char`{.C}, `int`{.C}, ...), + - un contenu (une séquence de bits qui encode `valeur`{.C}), + - une adresse mémoire (accessible via `&a`{.C}), + - une portée. + + +# Représentation des variables en mémoire (2/2) + +{#fig:memory width=100%} + # Les fonctions (1/7) - Les parties indépendantes d'un programme. @@ -280,169 +310,3 @@ $ echo $? $ if [ $? -eq 0 ]; then echo "OK" ; else echo "ERROR"; fi ERROR # si tout s'est mal passé ``` - -# Les tableaux (1/6) - -## Généralités - -- `C` offre uniquement des tableaux statiques - - Un tableau est un "bloc" de mémoire contiguë associé à un nom - - taille fixe déterminée à la déclaration du tableau - - la taille ne peut pas être changée. - - Pas d’assignation de tableaux. - - Un tableau déclaré dans une fonction ou un bloc est détruit à la sortie de celle/celui-ci - - $\Rightarrow$ Un tableau local à une fonction ne doit **jamais être retourné** (aussi valable pour toute variable locale)! -- Les éléments d’un tableau sont accédés avec `[i]`{.C} où `i`{.C} est l’index de l’élément. -- Le premier élément du tableau à l’index `0`{.C}! -- Lorsqu’un tableau est déclaré, la taille de celui-ci doit toujours être spécifiée, sauf s’il est initialisé lors de sa déclaration. - -# Les tableaux (2/6) - -## Exemple - -```C -float tab1[5]; // tableau de floats à 5 éléments - // ses valeurs sont indéfinies - -int tab2[] = {1, 2, 3}; // tableau de 3 entiers, - // taille inférée - -int val = tab2[1]; // val vaut 2 à présent - -int w = tab1[5]; // index hors des limites du tableau - // comportement indéfini! - // pas d'erreur du compilateur -``` - -<!-- TODO QUIZ: - -```C -int a1[5]; // OK -int a2[] = { 1, 2, 3 }; // OK -int a3[4][5]; // OK -int [] a4; // Erreur -int a5[]; // Erreur - -int[] function(void) { // Erreur - int array[5]; // OK - return array; // Erreur -} - -void foo(int a[]) { // OK - a[3] = 0; // OK -} - -void bar(void) { - int a[5]; // OK - foo(a); // OK - a = a5; // Erreur -} -``` --> - -<!-- ```C -#include <stdio.h> - -int main(void) { - char i; - char a1[] = { 100,200,300,400,500 }; - char a2[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; - a2[10] = 42; - - for (i = 0; i < 5; i++) { - printf("a1[%d] = %d\n", i, a1[i]); - } - - return 0; -} -``` --> -# Les tableaux (3/6) - -## Itérer sur les éléments d'un tableau - -```C -int x[10]; -for (int i = 0; i < 10; ++i) { - x[i] = 0; -} -int j = 0; -while (j < 10) { - x[j] = 1; - j += 1; -} -int j = 0; -do { - x[j] = -1; - j += 1; -} while (j < 9) -``` - - -# Les tableaux (4/6) - -## Les tableaux comme argument - -- Un tableau est le pointeur vers sa première case. -- Pas moyen de connaître sa taille: `sizeof()`{.C} inutile. -- Toujours spécifier la taille d'un tableau passé en argument. - - ```C - void foo(int tab[]) { // sans taille... - for (int i = 0; i < ?; ++i) { - // on sait pas quoi mettre pour ? - printf("tab[%d] = %d\n", i, tab[i]); - } - } - // n doit venir avant tab, [n] optionnel - void bar(int n, int tab[n]) { - for (int i = 0; i < n; ++i) { - printf("tab[%d] = %d\n", i, tab[i]); - } - } - ``` - -# Les tableaux (5/6) - -## Quels sont les bugs dans ce code? - -```C -#include <stdio.h> - -int main(void) { - char i; - char a1[] = { 100,200,300,400,500 }; - char a2[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; - a2[10] = 42; - - for (i = 0; i < 5; i++) { - printf("a1[%d] = %d\n", i, a1[i]); - } - - return 0; -} -``` - -# Les tableaux (6/6) - -## Quels sont les bugs dans ce code? - -```C -#include <stdio.h> - -int main(void) { - char i; - // 200, .., 500 char overflow - char a1[] = { 100,200,300,400,500 }; - char a2[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; - a2[10] = 42; // [10] out of bounds - - for (i = 0; i < 5; i++) { - printf("a1[%d] = %d\n", i, a1[i]); - } - - return 0; -} -``` - -<!-- TODO quiz: --> - -<!-- que retourne sizeof(tab[]) --> diff --git a/base_3.md b/base_3.md index ed52aeb..0bef38e 100644 --- a/base_3.md +++ b/base_3.md @@ -2,6 +2,172 @@ % Inspirés des slides de F. Glück % 2 octobre 2019 +# Les tableaux (1/6) + +## Généralités + +- `C` offre uniquement des tableaux statiques + - Un tableau est un "bloc" de mémoire contiguë associé à un nom + - taille fixe déterminée à la déclaration du tableau + - la taille ne peut pas être changée. + - Pas d’assignation de tableaux. + - Un tableau déclaré dans une fonction ou un bloc est détruit à la sortie de celle/celui-ci + - $\Rightarrow$ Un tableau local à une fonction ne doit **jamais être retourné** (aussi valable pour toute variable locale)! +- Les éléments d’un tableau sont accédés avec `[i]`{.C} où `i`{.C} est l’index de l’élément. +- Le premier élément du tableau à l’index `0`{.C}! +- Lorsqu’un tableau est déclaré, la taille de celui-ci doit toujours être spécifiée, sauf s’il est initialisé lors de sa déclaration. + +# Les tableaux (2/6) + +## Exemple + +```C +float tab1[5]; // tableau de floats à 5 éléments + // ses valeurs sont indéfinies + +int tab2[] = {1, 2, 3}; // tableau de 3 entiers, + // taille inférée + +int val = tab2[1]; // val vaut 2 à présent + +int w = tab1[5]; // index hors des limites du tableau + // comportement indéfini! + // pas d'erreur du compilateur +``` + +<!-- TODO QUIZ: + +```C +int a1[5]; // OK +int a2[] = { 1, 2, 3 }; // OK +int a3[4][5]; // OK +int [] a4; // Erreur +int a5[]; // Erreur + +int[] function(void) { // Erreur + int array[5]; // OK + return array; // Erreur +} + +void foo(int a[]) { // OK + a[3] = 0; // OK +} + +void bar(void) { + int a[5]; // OK + foo(a); // OK + a = a5; // Erreur +} +``` --> + +<!-- ```C +#include <stdio.h> + +int main(void) { + char i; + char a1[] = { 100,200,300,400,500 }; + char a2[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; + a2[10] = 42; + + for (i = 0; i < 5; i++) { + printf("a1[%d] = %d\n", i, a1[i]); + } + + return 0; +} +``` --> +# Les tableaux (3/6) + +## Itérer sur les éléments d'un tableau + +```C +int x[10]; +for (int i = 0; i < 10; ++i) { + x[i] = 0; +} +int j = 0; +while (j < 10) { + x[j] = 1; + j += 1; +} +int j = 0; +do { + x[j] = -1; + j += 1; +} while (j < 9) +``` + + +# Les tableaux (4/6) + +## Les tableaux comme argument + +- Un tableau est le pointeur vers sa première case. +- Pas moyen de connaître sa taille: `sizeof()`{.C} inutile. +- Toujours spécifier la taille d'un tableau passé en argument. + + ```C + void foo(int tab[]) { // sans taille... + for (int i = 0; i < ?; ++i) { + // on sait pas quoi mettre pour ? + printf("tab[%d] = %d\n", i, tab[i]); + } + } + // n doit venir avant tab, [n] optionnel + void bar(int n, int tab[n]) { + for (int i = 0; i < n; ++i) { + printf("tab[%d] = %d\n", i, tab[i]); + } + } + ``` + +# Les tableaux (5/6) + +## Quels sont les bugs dans ce code? + +```C +#include <stdio.h> + +int main(void) { + char i; + char a1[] = { 100,200,300,400,500 }; + char a2[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; + a2[10] = 42; + + for (i = 0; i < 5; i++) { + printf("a1[%d] = %d\n", i, a1[i]); + } + + return 0; +} +``` + +# Les tableaux (6/6) + +## Quels sont les bugs dans ce code? + +```C +#include <stdio.h> + +int main(void) { + char i; + // 200, .., 500 char overflow + char a1[] = { 100,200,300,400,500 }; + char a2[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; + a2[10] = 42; // [10] out of bounds + + for (i = 0; i < 5; i++) { + printf("a1[%d] = %d\n", i, a1[i]); + } + + return 0; +} +``` + +<!-- TODO quiz: --> + +<!-- que retourne sizeof(tab[]) --> + # Représentation des variables en mémoire (1/N) ## La mémoire -- GitLab