From 67b81904599425fab20551a193d36de22c56c68c Mon Sep 17 00:00:00 2001 From: Orestis <orestis.malaspinas@pm.me> Date: Mon, 25 Sep 2023 09:39:08 +0200 Subject: [PATCH] added next class --- slides/cours_1.md | 209 ------------------- slides/cours_2.md | 517 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 517 insertions(+), 209 deletions(-) create mode 100644 slides/cours_2.md diff --git a/slides/cours_1.md b/slides/cours_1.md index e4048a2..d516c99 100644 --- a/slides/cours_1.md +++ b/slides/cours_1.md @@ -347,212 +347,3 @@ bool d = 2.78; // 1 bool e = 1.0; // 1 ``` --> -# Expressions et opérateurs (1/6) - -Une expression est tout bout de code qui est **évalué**. - -## Expressions simples - -- Pas d'opérateurs impliqués. -- Les littéraux, les variables, et les constantes. - -```C -const int L = -1; // 'L' est une constante, -1 un littéral -int x = 0; // '0' est un litéral -int y = x; // 'x' est une variable -int z = L; // 'L' est une constante -``` - -## Expressions complexes - -- Obtenues en combinant des *opérandes* avec des *opérateurs* - -```C -int x; // pas une expression (une instruction) -x = 4 + 5; // 4 + 5 est une expression - // dont le résultat est affecté à 'x' -``` - -# Expressions et opérateurs (2/6) - -## Opérateurs relationnels - -Opérateurs testant la relation entre deux *expressions*: - - - `(a opérateur b)` retourne `1`{.C} si l'expression s'évalue à `true`{.C}, `0`{.C} si l'expression s'évalue à `false`{.C}. - -| Opérateur | Syntaxe | Résultat | -|-----------|--------------|----------------------| -| `<`{.C} | `a < b`{.C} | 1 si a < b; 0 sinon | -| `>`{.C} | `a > b`{.C} | 1 si a > b; 0 sinon | -| `<=`{.C} | `a <= b`{.C} | 1 si a <= b; 0 sinon | -| `>=`{.C} | `a >= b`{.C} | 1 si a >= b; 0 sinon | -| `==`{.C} | `a == b`{.C} | 1 si a == b; 0 sinon | -| `!=`{.C} | `a != b`{.C} | 1 si a != b; 0 sinon | - -# Expressions et opérateurs (3/6) - -## Opérateurs logiques - -| Opérateur | Syntaxe | Signification | -|-----------|--------------|----------------------| -| `&&`{.C} | `a && b`{.C} | ET logique | -| `||`{.C} | `a || b`{.C} | OU logique | -| `!`{.C} | `!a`{.C} | NON logique | - -# Quiz: opérateurs logiques - -## [Quiz: opérateurs logiques](https://cyberlearn.hes-so.ch/mod/evoting/view.php?id=501928) - -<!-- TODO: Quiz --> -<!-- ```C -1 && 0 == 0 -7 && 3 == 1 -4 || 3 == 1 -!34 == 0 -!0 == 1 - -Soit n un unsigned char initialisé à 127: -!n == 0 -``` --> - -# Expressions et opérateurs (4/6) - -## Opérateurs arithmétiques - -| Opérateur | Syntaxe | Signification | -|-----------|--------------|----------------------| -| `+`{.C} | `a + b`{.C} | Addition | -| `-`{.C} | `a - b`{.C} | Soustraction | -| `*`{.C} | `a * b`{.C} | Multiplication | -| `/`{.C} | `a / b`{.C} | Division | -| `%`{.C} | `a % b`{.C} | Modulo | - -# Expressions et opérateurs (5/6) - -## Opérateurs d'assignation - -| Opérateur | Syntaxe | Signification | -|-----------|--------------|---------------------------------------------| -| `=`{.C} | `a = b`{.C} | Affecte la valeur `b` à la variable `a` | -| | | et retourne la valeur de `b` | -| `+=`{.C} | `a += b`{.C} | Additionne la valeur de `b` à `a` et | -| | | assigne le résultat à `a`. | -| `-=`{.C} | `a -= b`{.C} | Soustrait la valeur de `b` à `a` et | -| | | assigne le résultat à `a`. | -| `*=`{.C} | `a *= b`{.C} | Multiplie la valeur de `b` à `a` et | -| | | assigne le résultat à `a`. | -| `/=`{.C} | `a /= b`{.C} | Divise la valeur de `b` à `a` et | -| | | assigne le résultat à `a`. | -| `%=`{.C} | `a %= b`{.C} | Calcule le modulo la valeur de `b` à `a` et | -| | | assigne le résultat à `a`. | - -# Expressions et opérateurs (6/6) - -## Opérateurs d'assignation (suite) - -| Opérateur | Syntaxe | Signification | -|-----------|--------------|---------------------------------------------| -| `++`{.C} | `++a`{.C} | Incrémente la valeur de `a` de 1 et | -| | | retourne le résultat (`a += 1`). | -| `--`{.C} | `--a`{.C} | Décrémente la valeur de `a` de 1 et | -| | | retourne le résultat (`a -= 1`). | -| `++`{.C} | `a++`{.C} | Retourne `a`{.C} et incrémente `a` de 1. | -| `--`{.C} | `a--`{.C} | Retourne `a`{.C} et décrémente `a` de 1. | - - -# Structures de contrôle: `if`{.C} .. `else if`{.C} .. `else`{.C} (1/2) - -## Syntaxe - -```C -if (expression) { - instructions; -} else if (expression) { // optionnel - // il peut y en avoir plusieurs - instructions; -} else { - instructions; // optionnel -} -``` - -```C -if (x) { // si x s'évalue à `vrai` - printf("x s'évalue à vrai.\n"); -} else if (y == 8) { // si y vaut 8 - printf("y vaut 8.\n"); -} else { - printf("Ni l'un ni l'autre.\n"); -} -``` - -# Structures de contrôle: `if`{.C} .. `else if`{.C} .. `else`{.C} (2/2) - -## Pièges - -```C -int x, y; -x = y = 3; -if (x = 2) - printf("x = 2 est vrai.\n"); -else if (y < 8) - printf("y < 8.\n"); -else if (y == 3) - printf("y vaut 3 mais cela ne sera jamais affiché.\n"); -else - printf("Ni l'un ni l'autre.\n"); - x = -1; // toujours évalué -``` - -# Quiz: `if ... else`{.C} - -## [Quiz: `if ... else`{.C}](https://cyberlearn.hes-so.ch/mod/evoting/view.php?id=501931) - - -# Structures de contrôle: `while`{.C} - -## La boucle `while`{.C} - -```C -while (condition) { - instructions; -} -do { - instructions; -} while (condition); -``` - -## La boucle `while`{.C}, un exemple - -```C -int sum = 0; // syntaxe C99 -while (sum < 10) { - sum += 1; -} -do { - sum += 10; -} while (sum < 100) -``` - -# Structures de contrôle: `for`{.C} - -## La boucle `for`{.C} - -```C -for (expression1; expression2; expression3) { - instructions; -} -``` - -## La boucle `for`{.C} - -```C -int sum = 0; // syntaxe C99 -for (int i = 0; i < 10; i++) { - sum += i; -} - -for (int i = 0; i != 1; i = rand() % 4) { // ésotérique - printf("C'est plus ésotérique.\n"); -} -``` diff --git a/slides/cours_2.md b/slides/cours_2.md new file mode 100644 index 0000000..c25a134 --- /dev/null +++ b/slides/cours_2.md @@ -0,0 +1,517 @@ +--- +title: "Introduction aux algorithmes" +date: "2023-09-26" +--- + +# Rappel + +* Quel est l'algorithme pour le calcul des nombres 1ers? + +. . . + +```C +bool est_premier(int nombre) { + int i = 2; // bonne pratique! + while (i < nombre) { // penser à bien indenter! + if (0 == nombre % i) { // ça rend le code LISIBLE! + return false; + } + i += 1; + } + return true; +} +``` + +# Expressions et opérateurs (1/6) + +Une expression est tout bout de code qui est **évalué**. + +## Expressions simples + +- Pas d'opérateurs impliqués. +- Les littéraux, les variables, et les constantes. + +```C +const int L = -1; // 'L' est une constante, -1 un littéral +int x = 0; // '0' est un litéral +int y = x; // 'x' est une variable +int z = L; // 'L' est une constante +``` + +## Expressions complexes + +- Obtenues en combinant des *opérandes* avec des *opérateurs* + +```C +int x; // pas une expression (une instruction) +x = 4 + 5; // 4 + 5 est une expression + // dont le résultat est affecté à 'x' +``` + +# Expressions et opérateurs (2/6) + +## Opérateurs relationnels + +Opérateurs testant la relation entre deux *expressions*: + + - `(a opérateur b)` retourne `1`{.C} si l'expression s'évalue à `true`{.C}, `0`{.C} si l'expression s'évalue à `false`{.C}. + +| Opérateur | Syntaxe | Résultat | +|-----------|--------------|----------------------| +| `<`{.C} | `a < b`{.C} | 1 si a < b; 0 sinon | +| `>`{.C} | `a > b`{.C} | 1 si a > b; 0 sinon | +| `<=`{.C} | `a <= b`{.C} | 1 si a <= b; 0 sinon | +| `>=`{.C} | `a >= b`{.C} | 1 si a >= b; 0 sinon | +| `==`{.C} | `a == b`{.C} | 1 si a == b; 0 sinon | +| `!=`{.C} | `a != b`{.C} | 1 si a != b; 0 sinon | + +# Expressions et opérateurs (3/6) + +## Opérateurs logiques + +| Opérateur | Syntaxe | Signification | +|-----------|--------------|----------------------| +| `&&`{.C} | `a && b`{.C} | ET logique | +| `||`{.C} | `a || b`{.C} | OU logique | +| `!`{.C} | `!a`{.C} | NON logique | + +# Quiz: opérateurs logiques + +## [Quiz: opérateurs logiques](https://cyberlearn.hes-so.ch/mod/evoting/view.php?id=501928) + +<!-- TODO: Quiz --> +<!-- ```C +1 && 0 == 0 +7 && 3 == 1 +4 || 3 == 1 +!34 == 0 +!0 == 1 + +Soit n un unsigned char initialisé à 127: +!n == 0 +``` --> + +# Expressions et opérateurs (4/6) + +## Opérateurs arithmétiques + +| Opérateur | Syntaxe | Signification | +|-----------|--------------|----------------------| +| `+`{.C} | `a + b`{.C} | Addition | +| `-`{.C} | `a - b`{.C} | Soustraction | +| `*`{.C} | `a * b`{.C} | Multiplication | +| `/`{.C} | `a / b`{.C} | Division | +| `%`{.C} | `a % b`{.C} | Modulo | + +# Expressions et opérateurs (5/6) + +## Opérateurs d'assignation + +| Opérateur | Syntaxe | Signification | +|-----------|--------------|---------------------------------------------| +| `=`{.C} | `a = b`{.C} | Affecte la valeur `b` à la variable `a` | +| | | et retourne la valeur de `b` | +| `+=`{.C} | `a += b`{.C} | Additionne la valeur de `b` à `a` et | +| | | assigne le résultat à `a`. | +| `-=`{.C} | `a -= b`{.C} | Soustrait la valeur de `b` à `a` et | +| | | assigne le résultat à `a`. | +| `*=`{.C} | `a *= b`{.C} | Multiplie la valeur de `b` à `a` et | +| | | assigne le résultat à `a`. | +| `/=`{.C} | `a /= b`{.C} | Divise la valeur de `b` à `a` et | +| | | assigne le résultat à `a`. | +| `%=`{.C} | `a %= b`{.C} | Calcule le modulo la valeur de `b` à `a` et | +| | | assigne le résultat à `a`. | + +# Expressions et opérateurs (6/6) + +## Opérateurs d'assignation (suite) + +| Opérateur | Syntaxe | Signification | +|-----------|--------------|---------------------------------------------| +| `++`{.C} | `++a`{.C} | Incrémente la valeur de `a` de 1 et | +| | | retourne le résultat (`a += 1`). | +| `--`{.C} | `--a`{.C} | Décrémente la valeur de `a` de 1 et | +| | | retourne le résultat (`a -= 1`). | +| `++`{.C} | `a++`{.C} | Retourne `a`{.C} et incrémente `a` de 1. | +| `--`{.C} | `a--`{.C} | Retourne `a`{.C} et décrémente `a` de 1. | + + +# Structures de contrôle: `if`{.C} .. `else if`{.C} .. `else`{.C} (1/2) + +## Syntaxe + +```C +if (expression) { + instructions; +} else if (expression) { // optionnel + // il peut y en avoir plusieurs + instructions; +} else { + instructions; // optionnel +} +``` + +```C +if (x) { // si x s'évalue à `vrai` + printf("x s'évalue à vrai.\n"); +} else if (y == 8) { // si y vaut 8 + printf("y vaut 8.\n"); +} else { + printf("Ni l'un ni l'autre.\n"); +} +``` + +# Structures de contrôle: `if`{.C} .. `else if`{.C} .. `else`{.C} (2/2) + +## Pièges + +```C +int x, y; +x = y = 3; +if (x = 2) + printf("x = 2 est vrai.\n"); +else if (y < 8) + printf("y < 8.\n"); +else if (y == 3) + printf("y vaut 3 mais cela ne sera jamais affiché.\n"); +else + printf("Ni l'un ni l'autre.\n"); + x = -1; // toujours évalué +``` + +# Quiz: `if ... else`{.C} + +## [Quiz: `if ... else`{.C}](https://cyberlearn.hes-so.ch/mod/evoting/view.php?id=501931) + + +# Structures de contrôle: `while`{.C} + +## La boucle `while`{.C} + +```C +while (condition) { + instructions; +} +do { + instructions; +} while (condition); +``` + +## La boucle `while`{.C}, un exemple + +```C +int sum = 0; // syntaxe C99 +while (sum < 10) { + sum += 1; +} +do { + sum += 10; +} while (sum < 100) +``` + +# Structures de contrôle: `for`{.C} + +## La boucle `for`{.C} + +```C +for (expression1; expression2; expression3) { + instructions; +} +``` + +## La boucle `for`{.C} + +```C +int sum = 0; // syntaxe C99 +for (int i = 0; i < 10; i++) { + sum += i; +} + +for (int i = 0; i != 1; i = rand() % 4) { // ésotérique + printf("C'est plus ésotérique.\n"); +} +``` + + +# Exercice: la factorielle + +Écrire un programme qui calcule la factorielle d'un nombre +$$ +N! = 1\cdot 2\cdot ... \cdot (N-1)\cdot N. +$$ + +## Par groupe de 3: écrire un pseudo-code + +. . . + +```python +entier factorielle(entier n) + i = 1 + fact = 1 + tant que i <= n + fact *= i + i += 1 + retourne fact +``` + +# Exercice: la factorielle + +\footnotesize + +Écrire un programme qui calcule la factorielle d'un nombre +$$ +N! = 1\cdot 2\cdot ... \cdot (N-1)\cdot N. +$$ + +## Par groupe de 3: écrire un code en C + +Quand vous avez fini postez le code sur le salon matrix. + +. . . + +```C +#include <stdio.h> +int main() { + int nb = 10; + int fact = 1; + int iter = 2; + while (iter <= nb) { + fact *= iter; + iter++; + } + printf("La factorielle de %d est %d\n", nb, fact); +} +``` + +. . . + +## Comment améliorer ce code? (notez ça sur une feuille) + + +# Exercice: la factorielle en mieux + +## Individuellement + +1. Écrivez l'algorithme de calcul de deux façon différentes. +2. Que se passe-t-il si $n>=15$? +3. Pour celles et ceux qui ont fini pendant que les autres essaient: faites-le + en récursif (sans aide). + +. . . + +## Postez vos solutions sur **matrix**! + +# Exercice: test si un nombre est premier + +## Avec tout ce que vous avez appris jusqu'ici: + +* Écrivez le code testant si un nombre est premier. +* Quels sont les ajouts possibles par rapport au code de la semaine passée? +* Rencontrez-vous des problèmes éventuels de compilation? +* Voyez-vous une façon de générer des nombres premiers avec votre programme? + +. . . + +## Implémentez-la et postez votre code sur le salon matrix (10 min). + +# Corrigé: enfin pas vraiment mais juste un possible + +\footnotesize + +```C +#include <stdio.h> +#include <stdlib.h> +#include <math.h> +#include <stdbool.h> +int main() { + int nb = 1; + printf("Entrez un nombre: "); + scanf("%d", &nb); + bool premier = true; + for (int div = 2; div <= sqrt(nb); div++) { + if (nb % div == 0) { + premier = false; + break; + } + } + if (premier) { + printf("Le nombre %d est premier\n", nb); + } else { + printf("Le nombre %d n'est pas premier\n", nb); + } + return 0; +} +``` + +# Quelques algorithmes simples + +## Voyons quelques algorithmes supplémentaires + +- Plus petit commun multiple (PPCM) de deux nombres +- Autre algorithme de calcul du PPCM de deux nombres +- Plus grand commun diviseur (PGCD) de deux nombres + +# Le calcul du PPCM (1/5) + +## Définition + +Le plus petit commun multiple (PPCM), `p`, de deux entiers non nuls, `a` et `b`, +est le plus petit entier strictement positif qui soit multiple de ces deux +nombres. + +Exemples: + +```C +PPCM(3, 4) = 12, +PPCM(4, 6) = 12, +PPCM(5, 15) = 15. +``` + +. . . + +## Mathématiquement + +Décomposition en nombres premiers: + +$$ +36 = 2^2\cdot 3^2,\quad 90=2\cdot 5\cdot 3^2, +$$ +On garde tous les premiers à la puissance la plus élevée +$$ +PPCM(36, 90)=2^2\cdot 3^2\cdot 5=180. +$$ + +# Le calcul du PPCM (2/5) + +## Exemple d'algorithme + +```C +PPCM(36, 90): +36 < 90 // 36 + 36 +72 < 90 // 72 + 36 +108 > 90 // 90 + 90 +108 < 180 // 108 + 36 +144 < 180 // 144 + 36 +180 = 180 // The End! +``` + +* 5 additions, 5 assignations, et 6 comparaisons. + +. . . + +## Transcrivez cet exemple en algorithme (groupe de 3), 5min + +. . . + +## et codez-le! + + +# Le calcul du PPCM (3/5) + +## Tentative de correction + +```C +int main() { + int m = 15, n = 12; + int mult_m = m, mult_n = n; + while (mult_m != mult_n) { + if (mult_m > mult_n) { + mult_n += n; + } else { + mult_m += m; + } + } + printf("Le ppcm de %d et %d est %d\n", n, m, mult_m); +} +``` + +. . . + +* Combien d'additions / comparaisons au pire? + +# Le calcul du PPCM (4/5) + +## Réusinage: Comment décrire une fonction qui ferait ce calcul (arguments, sorties)? + +. . . + +En `C` on pourrait la décrire comme + +```C +int ppcm(int a, int b); // La **signature** de cette fonction +``` + +. . . + +## Algorithme + +Par groupe de 3 (5-10min): + +* réfléchissez à un algorithme alternatif donnant le PPCM de deux nombres; +* écrivez l'algorithme en pseudo-code. + +# Le calcul du PPCM (5/5) + +## Indication + +Si un nombre, `p`, est multiple de `a` et de `b` alors il peut s'écrire `p = a +* i = b * j` ou encore `p / a = i` et `p / b = j`. + +. . . + +## Pseudo-code + +```C +int ppcm(int a, int b) { + for (i in [1, b]) { + if a * i est divisible par b { + return a * i + } + } +} +``` + +# Le code du PPCM de 2 nombres (1/2) + +## Implémentez le pseudo-code et postez le code sur matrix (5min). + +. . . + +## Un corrigé possible + + +```C +#include <stdio.h> +#include <stdlib.h> +int main() { + int n = 15, m = 12; + int i = 1; + while (n * i % m != 0) { + i++; + } + printf("Le ppcm de %d et %d est %d\n", n, m, n*i); +} +``` + +# Le code du PPCM de 2 nombres (2/2) + +## Corrigé alternatif + +```C +#include <stdio.h> +#include <stdlib.h> +int main() { + int res = n*m; + for (int i = 2; i <= m; i++) { + if (n * i % m == 0) { + res = n * i; + break; + } + } + printf("Le ppcm de %d et %d est %d\n", n, m, res); +} +``` + + + + -- GitLab