From a95bd13a2df2dcb3bf6f1dc084b3a482673be3b4 Mon Sep 17 00:00:00 2001 From: "paul.albuquer" <paul.albuquerque@hesge.ch> Date: Sun, 17 Oct 2021 16:15:15 +0200 Subject: [PATCH] added content lesson 2, put source code separately --- lessons/{lesson_1 => }/contenu_cours_1.md | 0 lessons/contenu_cours_2.md | 94 +++++++++++++++++++ source_codes/loops_tests/factorielle.c | 21 +++++ .../loops_tests}/nb1er.c | 0 source_codes/loops_tests/pgcd.c | 28 ++++++ source_codes/loops_tests/ppcm.c | 24 +++++ source_codes/loops_tests/ppcm_bis.c | 44 +++++++++ 7 files changed, 211 insertions(+) rename lessons/{lesson_1 => }/contenu_cours_1.md (100%) create mode 100644 lessons/contenu_cours_2.md create mode 100644 source_codes/loops_tests/factorielle.c rename {lessons/lesson_1 => source_codes/loops_tests}/nb1er.c (100%) create mode 100644 source_codes/loops_tests/pgcd.c create mode 100644 source_codes/loops_tests/ppcm.c create mode 100644 source_codes/loops_tests/ppcm_bis.c diff --git a/lessons/lesson_1/contenu_cours_1.md b/lessons/contenu_cours_1.md similarity index 100% rename from lessons/lesson_1/contenu_cours_1.md rename to lessons/contenu_cours_1.md diff --git a/lessons/contenu_cours_2.md b/lessons/contenu_cours_2.md new file mode 100644 index 0000000..2993834 --- /dev/null +++ b/lessons/contenu_cours_2.md @@ -0,0 +1,94 @@ +# Algorithmes et structures de données 2019-20 + +Contenu du cours 2 du du 25.09.2019 + +***** + +## Plus petit commun multiple (PPCM) de deux nombres + +- Algorithme de PPCM: exemple avec 12 et 15 + + | Tester si| `>, <` ou `=`| | + |-----------|:------------:|:---------| + | | `12 < 15` | | + | | `24 > 15` | | + | | `24 < 30` | | + | | `36 > 30` | | + | | `36 < 45` | | + | | `48 > 45` | | + | | `48 < 60` | | + | | `60 = 60` | **Fin !**| + + +## Plus grand diviseur commun (PGCD) de deux nombres + +- Algorithme naïf du PGCD + - Pseudo-code du calcul du `PGCD` de `N` et `M` + +``` + si M rem N = 0 alors + PGCD := N + sinon + pour I de sqrt(N) à 1 faire + si N rem I = 0 et M rem I = 0 alors + PGCD := I + exit + fin si + fin pour + fin si +``` + +- Algorithme d'Euclide : exemple avec N = 35 et M = 60 + + | Dividende | = | Diviseur \* Quotient | + | Reste | + |:----------:|:----:|:---------------------:|:---:|:-------:| + | 35 | = | 60 \* 0 | + | 35 | + | 60 | = | 35 \* 1 | + | 25 | + | 35 | = | 25 \* 1 | + | 10 | + | 25 | = | 10 \* 2 | + | 5 | + | 10 | = | 5 \* 2 | + | 0 | + +> > => PGCD = 5 + + +## Exercice : Montrer que `PGCD(M,N)*PPCM(M,N) = M*N` + +- Utiliser la décomposition en facteurs 1<sup>er<sup/> + +## Type composé : tableaux statiques à une dimension + +- Collection ordonnée d'objets de même type dont le nombre est connu à la compilation +- La taille d'un tableau statique ne peut pas changer en cours d'exécution +- Allocation contiguë en mémoire et sur la pile + +```C + int entiers[] = {1,2,3,4,5}; + int tab[3]; +``` +- Accès aux éléments d’un tableau via l’opérateur `[index]` où `index` est l’indice de l’élément à accéder, `index` va de 0 à la taille du tableau moins un +```C + int premier = entiers[0]; + int dernier = entiers[4]; +``` +> **Attention!** L'accès à un indice hors de l'intervalle zéro à la taille du tableau moins un ne produit pas d'erreur à la compilation, mais possible à l'exécution. + +- Tableau de nombres flottants +```C + const int SIZE = 13; + float tab[SIZE]; +``` + +- Initialisation d'un tableau de floats avec `i*i`, puis avec des nombres aléatoires +```C + for (int i=0;i<SIZE;i++) { + tab[i] = (float)rand()/(float)(RAND_MAX) ; + } +``` +- Recherche d'un indice de la valeur minimale d'un tableau de floats et permutation avec l'élément en 1<sup>ère</sup> position +- Répétition de l'opération précédente sur des tranches du tableau +- Tri par sélection avec illustration sur un exemple +- Algorithme de vérification que deux mots sont des anagrammes en utilisant un tri + +## Palindrome avec parcours de boucle + +## Le crible d'Eratosthène diff --git a/source_codes/loops_tests/factorielle.c b/source_codes/loops_tests/factorielle.c new file mode 100644 index 0000000..761a79a --- /dev/null +++ b/source_codes/loops_tests/factorielle.c @@ -0,0 +1,21 @@ +#include <stdio.h> +// Programme calculant la factorielle d'un nombre +void main() { + int nb = 1; + printf("Entrer un nombre: "); + scanf("%d",&nb); + int fact = 1; + for(int i=2;i<=nb;i++) { + fact *= i; + } + /*int iter = 2; + while(iter <= nb) { + fact *= iter; + iter++; + } + do { + fact *= iter; + iter++; + } while(iter <= nb);*/ + printf("Fact = %d\n",fact); +} diff --git a/lessons/lesson_1/nb1er.c b/source_codes/loops_tests/nb1er.c similarity index 100% rename from lessons/lesson_1/nb1er.c rename to source_codes/loops_tests/nb1er.c diff --git a/source_codes/loops_tests/pgcd.c b/source_codes/loops_tests/pgcd.c new file mode 100644 index 0000000..0181ae7 --- /dev/null +++ b/source_codes/loops_tests/pgcd.c @@ -0,0 +1,28 @@ +#include <stdio.h> +// calcul du PGCD de deux nombres +void main() { + int n = 90; + int m = 78; + printf("n = %d et m = %d\n",n,m); + + // algorithme naif + int gcd = 1; + for (int div=n;div>=2;div--) { + if (n%div == 0 && m%div == 0) { + gcd = div; + break; + } + } + printf("Le pgcd de %d et %d est %d\n",n,m,gcd); + + // algorithme d'Euclide + 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; + } + printf("Le pgcd de %d et %d est %d\n",n,m,tmp_m); +} + diff --git a/source_codes/loops_tests/ppcm.c b/source_codes/loops_tests/ppcm.c new file mode 100644 index 0000000..dfd224e --- /dev/null +++ b/source_codes/loops_tests/ppcm.c @@ -0,0 +1,24 @@ +#include <stdio.h> +#include <stdlib.h> +#include <math.h> +#include <stdbool.h> +// Programme calculant le plus petit commun multiple (PPCM) de deux nombres +void main() { + int n = 15,m = 12; + + 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); + + int i = 1; + while (n*i%m != 0) { + i++; + } + printf("Le ppcm de %d et %d est %d\n",n,m,n*i); +} + diff --git a/source_codes/loops_tests/ppcm_bis.c b/source_codes/loops_tests/ppcm_bis.c new file mode 100644 index 0000000..c25cbbe --- /dev/null +++ b/source_codes/loops_tests/ppcm_bis.c @@ -0,0 +1,44 @@ +#include <stdio.h> +#include <stdlib.h> +#include <math.h> +#include <stdbool.h> + +void main() { + int n = 15,m = 12; + printf("Entrez n et m:\n"); + scanf("%d %d",&n,&m); + int tmp_n = n,tmp_m = m; + +/* + while (tmp_n != tmp_m) { + if (tmp_n < tmp_m) { + tmp_n += n; + } else { + tmp_m += m; + } + } + + while (true) { + if (tmp_n < tmp_m) { + tmp_n += n; + } else if (tmp_n > tmp_m) { + tmp_m += m; + } else { + break; + } + } +*/ + + do { + if (tmp_n < tmp_m) { + tmp_n += n; + } else { + tmp_m += m; + } + } while (tmp_n != tmp_m); + + printf("Le ppcm de %d et %d est %d\n",n,m,tmp_m); +} + + + -- GitLab