name: inverse layout: true class: center, middle, inverse --- # INFORMATIQUE 3 - CM 1 ## Inès de Courchelle ## 2024-2025  --- layout: false # Lets go ## Objectifs - Faire un point sur toutes les notions vues l'année dernière - Réaliser des rappel autour de la récursivité - Partir sur de bonnes bases
--- # L'année dernière au S1 ## Qu'est ce que l'on a vu ? 1. ADO 2. Représentation des données 3. Éléments de base 4. Fonctions et Procédures 5. Récursivité 6. Introduction UNIX 7. Le langage C 8. Les tableaux statiques 9. Types structurés --- # L'année dernière au S2 ## Qu'est ce que l'on a vu ? 1. Les pointeurs 2. Les tableaux dynamiques 3. La compilation séparée 4. La complexité 5. Tris lents 6. Tris rapides 7. Tableaux de structures 8. Les fichiers 9. Les tests 10. Le versionning --- # TODAY ## Plan 1. Écrire un algo 2. Fonctions et procédures 3. La complexité 4. La récursivité 5. Le langage c 6. Les structures de données
--- # TODAY ## Plan 1. .under[Écrire un algo] 2. Fonctions et procédures 3. La complexité 4. La récursivité 5. Le langage c 6. Les structures de données
--- # Écrire un algo ## C'est quoi ? - Une recette de cuisine - Une suite d'instructions pour aller quelque part - Des consignes de sécurité ## Comment ?
--- # Écrire un algo ## Instructions - Un programme impératif est une suite finie d'instructions comprise en le début et la fin - L'instruction de base est l'écriture (sortie, affichage ...) d'informations dans le terminal - Exemple de programme complet : HELLO WORLD ``` PROGRAMME Bonjour DEBUT ECRIRE("bonjour tout le monde") FIN ``` --- # Écrire un algo ## Variable - C'est un élément du programme qui sert à stocker une valeur - Est définie par un nom et un type - Syntaxe : ``` nomVariable : type ``` ## Type - Un type définit un ensemble de valeurs sur lesquelles on peut appliquer des opérateurs - Exemple : entier, réel, booléen, chaîne, caractère ... --- # Écrire un algo ## Déclaration ``` VARIABLES : i,j : entiers x,y : réels estTrouvé : booleen reponse : chaine de caractères ``` ## Affectation - Une affectation est le fait de mettre une valeur dans une variable en cohérence avec son type - La première affectation de valeur à une variable est appelée initialisation - On la représente par une flèche #### Exemple ``` i ← 4 reponse ← "Bonjour" ``` .underR[Attention] : Avant d'affecter une valeur il ne faut pas oublier de déclarer la variable --- # Écrire un algo ## Les conditions .pull-left[ #### SI ...ALORS ``` SI [CONDITION] ALORS ... FIN SI ``` #### Si ... SINON SI... ``` SI [CONDITION] ALORS ... SINON SI [CONDITION] ALORS ... SINON ... FIN SI ``` ] .pull-right[ #### SI ... SINON ``` SI [CONDITION] ALORS ... SINON ... FIN SI ``` #### SELON ``` SELON [VARIABLE] CAS [VALEUR]: CAS [VALEUR]: CAS [VALEUR]: DEFAUT: FIN SELON ``` ] --- # Écrire un algo ## Une boucle #### Pour .pull-left[ Quand on sait combien de fois on veut réaliser une opération ] .pull-right[ ``` POUR i ALLANT de 0 à 10 FAIRE ... FIN POUR ``` ]
--- # Écrire un algo ## Une boucle #### Tant que Faire ... .pull-left[ Quand on doit répéter une opération en fonction tant qu'une condition est vérifiée ] .pull-right[ ``` TANT QUE [CONDITION EST VRAI] FAIRE ... FIN TANT QUE ``` ]
#### Faire ... Tant que .pull-left[ Quand on doit répéter une opération en fonction tant qu'une condition est vérifiée ] .pull-right[ ``` FAIRE ... TANT QUE [CONDITION EST VRAI] ``` ] --- # Écrire un algo ## La blagounette
--- # TODAY ## Plan 1. Écrire un algo 2. .under[Fonctions et procédures] 3. La complexité 4. La récursivité 5. Le langage c 6. Les structures de données
--- # Une fonction ## Définition Une fonction est une série d'instructions regroupés sous un nom, qui permet d'effectuer des actions. Elle peut prendre entre 0 et N paramètres. Elle renvoie forcement une variable. ## En algo ``` FONCTION nomFonction(param1 : type, param2 : type) : type VARIABLES ... DEBUT ... retourner maVar; FIN ``` .underR[Attention] : une fonction ne peut avoir qu'un seul "retourner" (à part en récursif où il peut il y en avoir plus de 2 ! --- # Une fonction ## Représentation
## Exemple .pull-left[
] .pull-right[
] --- # Une fonction ## L'algorithme de la fonction addition
**Attention** Si le type de retour est un entier la variable retournée doit être un entier --- # Une procédure ## Définition Une procédure est une série d'instructions regroupés sous un nom, qui permet d'effectuer des actions. Elle peut prendre entre 0 et N paramètres. ## En algo ``` PROCEDURE nomProcedure(param1 : type, param2 : type) VARIABLES ... DEBUT ... FIN ``` --- # Une procédure ## Représentation
## Exemple .pull-left[
] .pull-right[
] --- # Une procédure ## L'algorithme de la procèdure bonjour
**Attention** Pas de valeur de retour ! --- # Procédure - Fonction ## OBLIGATOIRE Pour chaque fonction et procédure, nous définirons : - **Un résumé** : décrit en une phrase ce que fait la fonction - **les préconditions** : décrit la nature de l'ensemble des contraintes sur tous les paramètres d'entrée, afin que la fonction puisse s'exécuter correctement - **la post-condition** : décrit le résultat produit par la fonction/procédures et ses contraintes éventuelles #### Où ? En haut du programme --- # Procédure - Fonction ## OBLIGATOIRE #### addition
#### bonjour
--- # TODAY ## Plan 1. Écrire un algo 2. Fonctions et procédures 3. .under[La complexité] 4. La récursivité 5. Le langage c 6. Les structures de données
--- # La complexité ## Définition .otro-blockquote[Étudier la quantité de ressource nécessaire à l'exécution d'un algorithme]
.pull-left[ #### Mais pourquoi on fait ça ? Pour trouver un bon algorithme ] .pull-right[ #### Mais Comment ? Avec du bon sens ] --- # La complexité ## Objectifs - Comparer et mesurer les performances d'algorithmes répondant à un même problème - Réduire le temps d'exécution d'algorithme - Utiliser au minimun la mémoire
.pull-left[ .under[Un bon algorithme doit : ] - répondre à un problème posé - être rapide - consommer peu de ressource ] .pull-right[
] .otro-blockquote[Vous savez, moi je ne crois pas qu'il y ait de bonne ou de mauvaise situation.] --- # La complexité ## Problématique - .under[complexité temporelle] - Réduire le temps d'exécution - Augmenter l'utilisation de la mémoire - .under[complexité spatiale] - Réduire l'utilisation de la mémoire - Augmenter le temps d'exécution
.pull-left[
] .pull-right[
] --- # La complexité ## Illustration .pull-left[ #### Algo 1 ```c PROGRAMME ALGO1 VARIABLE a,b :reel DEBUT a <- 40 b <- puissance(a,2) * puissance(a,2) FIN ``` ] .pull-right[ #### Algo 2 ```c PROGRAMME ALGO1 VARIABLE a,b,c :reel DEBUT a <- 40 c <- puissance(a,2) b <- c * c FIN ``` ]
#### Quel est le meilleur algorithme ?
--- # La réponse ## C'est le temps vs l'espace .pull-left[ #### Algo 1 ```c PROGRAMME ALGO1 VARIABLE a,b :reel DEBUT a <- 40 b <- puissance(a,2) * puissance(a,2) FIN ``` ] .pull-right[ #### Algo 2 ```c PROGRAMME ALGO1 VARIABLE a,b,c :reel DEBUT a <- 40 c <- puissance(a,2) b <- c * c FIN ``` ]
**Réponse** **Algo 1** - Il n'y a pas de variable intermédiaire, et le carré de a est calculé 2 fois - Nous avons économisé de la mémoire mais pas du temps de calcul ##### Algo 2 - Il y a une variable intermédiaire, et le carré de a est calculé qu'une seule fois - Nous avons économisé du temps de calcul mais pas de mémoire --- # La complexité ## Les différents types de complexité 1. La complexité en nombre de comparaisons 2. La complexité en nombre d'opérations 3. La complexité en nombre d'affectations
--- # De manière générale ## Appel de fonctions Si on regarde la complexité en terme d'appel de fonctions .pull-left[ #### Exemple 1 \\[ 2N + 5 \\] ] .pull-right[
La complexité est Ο(n); ]
.pull-left[ #### Exemple 2 \\[ N \over 2 \\] ] .pull-right[
La complexité est Ο(n); ]
.pull-left[ #### Exemple 3 \\[ 2N^2 + 3N + 5 \\] ] .pull-right[
La complexité est Ο(N²); ] --- # Les classes ## Appelation - Ο(1) : complexité constante - Ο(n) : complexité linéaire - Ο(n log n) : complexité quasi-linéaire - Ο(n^a) complexité polynomiale - Ο(e^n) : complexité exponentielle - Ο(log n) : complexité logarithmique - ... ## En pratique - Les algorithmes à complexité quasi-linéaire et en dessous sont très efficaces - Sur les données réduites, les algorithmes polynomiaux sont encore applicables - Un algorithme à complexité exponentielle est inutilisable --- # Les classes ## Représentation
--- # TODAY ## Plan 1. Écrire un algo 2. Fonctions et procédures 3. La complexité 4. .under[La récursivité] 5. Le langage c 6. Les structures de données
--- # La récursivité ## Définition Algorithme permettant de résoudre un problème en calculant des solutions d'instances plus petites du même problème ## Principes - Une fonction qui s'appelle elle même jusqu'à atteindre une condition d'arrêt - Le résultat de chaque fonction enfant est retourné dans les fonctions parents, jusqu’à retourner à la fonction originale ## Pourquoi ? - Pour gagner en temps d'execution - Pour gagner en mémoire --- # La récursivité ## Étapes 1. La condition d'arrêt 2. La résolution du problème 3. L'appel récursif ## Illustration Afin d'illustrer la récursivité nous allons prendre l'exemple du compte à rebours.
--- # La récursivité ## Le compte à rebours #### 1. La condition d'arrêt Lorsque le compteur arrive à zéro #### 2. La résolution du problème compteur = compteur -1 #### 3. L'appel récursif retourner le compteur
--- # La recursivité ## L'algo ``` FONCTION compteARebours (cpt : entier) : entier DEBUT SI cpt=0 FAIRE retourner 0 SINON ECRIRE(cpt) RETOURNER compteARebours(cpt-1) FIN FIN ``` ## Le code ``` int compteARebours (int cpt) { if (cpt==0) return 0; else { printf("%d \n",cpt); return compteARebours(cpt-1); } } ``` --- # La recursivité ## La var
Cette vidéo ne peut être affichée sur votre navigateur Internet.
Une version est disponible en téléchargement sous
adresse du lien
.
--- # La récursivité ## Terminale .otro-blockquote[Une fonction avec une récursivité terminale est une fonction où l'appel récursif est la dernière instruction à être évaluée. ] ## Non terminale C'est l'inverse ! --- # La récursivité ## Terminale ``` FONCTION exempleT(n : entier) : entier DEBUT SI condition d'arret FAIRE RETOURNER ... SINON RETOURNER exempleT(n-1) FIN ``` ## Non terminale ``` FONCTION exempleNonT(n : entier) : entier DEBUT SI condition d'arret FAIRE RETOURNER ... SINON RETOURNER n+ exempleT(n-1) FIN ``` --- # La récursivité ## Exemple : la factorielle ``` 0! = 1 1! = 1 2! = 1 × 2 = 2 3! = 1 × 2 × 3 = 6 4! = 1 × 2 × 3 × 4 = 24 ``` ## Identifier #### 1. La condition d'arrêt #### 2. La résolution du problème #### 3. L'appel récursif --- # La récursivité ## La factorielle #### En math n!=n*(n-1)! #### En gros ! 4! = 4 x 3! = 4 x (3 x 2!) = 4 x (3 x (2 x 1!)) = 4 x (3 x (2 x (1 x 0!)))
--- # La récursivité
--- # La récursivité
--- # La récursivité
--- # La récursivité ## La factorielle ``` FONCTION factorielle(n : entier) : entier DEBUT SI n=0 ALORS RETOURNER 1 SINON RETOURNER n * factorielle(n-1) FIN ``` --- # La récursivité ## La factorielle ``` FONCTION factorielle(n : entier) : entier DEBUT SI n=0 ALORS RETOURNER 1 SINON RETOURNER n * factorielle(n-1) FIN ```
--- # La récursivité ## La factorielle ``` FONCTION factorielle(n : entier) : entier DEBUT SI n=0 ALORS RETOURNER 1 SINON RETOURNER n * factorielle(n-1) FIN ```
--- # La récursivité ## La factorielle ``` FONCTION factorielle(n : entier) : entier DEBUT SI n=0 ALORS RETOURNER 1 SINON RETOURNER n * factorielle(n-1) FIN ```
--- # La récursivité ## La factorielle ``` FONCTION factorielle(n : entier) : entier DEBUT SI n=0 ALORS RETOURNER 1 SINON RETOURNER n * factorielle(n-1) FIN ```
--- # La récursivité ## La factorielle ``` FONCTION factorielle(n : entier) : entier DEBUT SI n=0 ALORS RETOURNER 1 SINON RETOURNER n * factorielle(n-1) FIN ```
--- # La récursivité ## La factorielle ``` FONCTION factorielle(n : entier) : entier DEBUT SI n=0 ALORS RETOURNER 1 SINON RETOURNER n * factorielle(n-1) FIN ```
--- # La récursivité ## La factorielle en terminal Est ce possible ? ## Comment ? - Avec un accumulateur - Stocker les résultats intermédiaires --- # La récursivité ## La factorielle en terminal ``` FONCTION factorielleTerminale(n : entier, acc : entier) : entier DEBUT SI n=0 ALORS RETOURNER acc SINON RETOURNER factorielleTerminale(n-1,acc*n) FIN ``` ## La factorielle en non terminal ``` FONCTION factorielle(n : entier) : entier DEBUT SI n=0 ALORS RETOURNER 1 SINON RETOURNER n * factorielle(n-1) FIN ``` --- # La récursivité ## La factorielle en terminal ``` FONCTION factorielleTerminale(n : entier, acc : entier) : entier DEBUT SI n=0 ALORS RETOURNER acc SINON RETOURNER factorielleTerminale(n-1,acc*n) FIN ``` #### Est ce bien Terminé ? --- # La récursivité ## La factorielle en terminal ``` FONCTION factorielleTerminale(n : entier, acc : entier) : entier DEBUT SI n=0 ALORS RETOURNER acc SINON RETOURNER factorielleTerminale(n-1,acc*n) FIN ``` #### Est ce bien terminé ? NONNNNNNNNNNNNNNNN --- # La récursivité ## La factorielle en terminal ``` FONCTION factorielleTerminale(n : entier, acc : entier) : entier DEBUT SI n=0 ALORS RETOURNER acc SINON RETOURNER factorielleTerminale(n-1,acc*n) FIN ``` #### Est ce bien Terminé ? NONNNNNNNNNNNNNNNN ## POURQUOI ? Lorsqu'on appel la fonction la première fois ``` factorielleTerminale(4,1) factorielleTerminale(5,1) ``` .underR[Ce n'est pas beau !!!] --- # La récursivité ## MOCHE Lorsqu'on appel la fonction la première fois ``` factorielleTerminale(4,1) factorielleTerminale(5,1) ``` ## JOLI Lorsqu'on appel la fonction la première fois ``` factorielleTerminale(4) factorielleTerminale(5) ``` --- # La récursivité ## JOLI Lorsqu'on appel la fonction la première fois ``` factorielleTerminale(4) factorielleTerminale(5) ``` ## COMMENT ? - Avec une fonction intermédiaire - Il en faudra deux ! --- # La récursivité ## La même d'avant ```c FONCTION factorielleTerminaleCache(n : entier, acc : entier) : entier DEBUT SI n=0 ALORS RETOURNER acc SINON RETOURNER factorielleTerminaleCache(n-1,acc*n) FIN ``` ## C'est que l'utilisateur appelera ```c FONCTION factorielleTerminale(n : entier) : entier DEBUT RETOURNER factorielleTerminaleCache(n,1) FIN ``` ## L'appel ``` factorielleTerminale(4) factorielleTerminale(5) ``` --- # La récursivité ## Les problèmes de performance Parfois, on se retrouve avec des appels récursifs exponentiels ## Le classique FIBONACCI
--- # La récursivité ## Fibonacci non terminal
## Fibonacci \\[ F(n) = F(n-1) + F(n-2) \\] --- # La récursivité ## Fibonacci .pull-left[ | F | res | | -- | --- | | 0 | 0 | | 1 | 1 | | 2 | 1 | | 3 | 2 | | 4 | 3 | | 5 | 5 | | 6 | 8 | | 7 | 13 | | 8 | 21 | | 9 | 34 | | 10 | 55 | | 11 | 89 | ] .pull-right[
] --- # La récursivité ## Fibonacci non terminal ```c FONCTION FiboNonT(n : entier ) : entier DEBUT SI (n < 2) ALORS RETOURNER 1 SINON RETOURNER FiboNonT(n - 1) + FiboNonT(n - 2) FIN SI FIN ``` ## Le problème ! - Un arbre récursif trop important ! - On recalcule des choses qui ont déjà été calculées --- # La récursivité ## Fibonacci non terminal
--- # La récursivité ## VAR
Cette vidéo ne peut être affichée sur votre navigateur Internet.
Une version est disponible en téléchargement sous
adresse du lien
.
#### Mais comment faire ? - Récursivité terminal - Calculer la suite petit à petit ! --- # La récursivité ## Fibonacci en terminal ``` FONCTION FiboT(n : entier, acc1 : entier, acc2 : entier) : entier DEBUT SI (n = 0) ALORS RETOURNER acc2 SINON RETOURNER FiboT(n - 1, acc1, acc1+acc2) FIN SI FIN ``` --- # La récursivité ## Fibonacci en terminal
--- # La récursivité ## Fibonacci en terminal
--- # La récursivité ## Fibonacci en terminal
--- # La récursivité ## Fibonacci en terminal
--- # La récursivité ## Fibonacci en terminal
--- # La récursivité ## Fibonacci en terminal
--- # La récursivité ## VAR
Cette vidéo ne peut être affichée sur votre navigateur Internet.
Une version est disponible en téléchargement sous
adresse du lien
.
--- # TODAY ## Plan 1. Écrire un algo 2. Fonctions et procédures 3. La complexité 4. La récursivité 5. .under[Le langage c] 6. Les structures de données
--- # Le langage C ## Un peu d'histoire - Créé en 1972 par Ken Thompson & Dennis Ritchie ; - Compromis entre le langage de bas niveau (assembleur) et de haut niveau (Fortran) ## La base - Le code source (compréhensible par un humain) est enregistré dans un fichier .c ; - C’est un langage compilé (vs interprété) ; - Compilation : ```shell gcc -Wall monCode.c -o monExecutable ``` - Exécution : ```shell ./monExecutable ``` --- # Le langage C ## Les boucles .pull-left[ ```c TANT QUE (expr) faire ... FIN TANT QUE ``` ] .pull-right[ ```c While (expr) { } ``` ]
.pull-left[ ```c RÉPETER ... TANT QUE (expr) ``` ] .pull-right[ ```c do { ... } while (expr); ``` ]
.pull-left[ ```c POUR i ALLANT DE debut À fin faire ... FIN POUR ``` ] .pull-right[ ```c for (int i=0; i
.pull-left[ ```c SI(...) alors ... SINON ... FIN SI ``` ] .pull-right[ ```c if (...) { ... } else { ... } ``` ] --- # Les structures de données ## Lesquelles ? - Les tableaux statiques - Les tableaux dynamiques - Les structures - Les tableaux de structures
--- # Les structures de données ## Les tableaux statiques - Les tableaux statiques 1D - Les tableaux statiques 2D
--- # Tableaux Statiques - 1D - 1/3 ## Définition Ensemble de variables de même type, de même nom et caractérisées par un index ## Déclaration ```c type nomTableau [taille]; ``` ## Accès aux éléments ```c nomTableau[index]; ``` .underR[Attention] - Au débordement dans le tableau - Le premier élément commence à l'index 0 - Les valeurs du tableau ne sont pas initialisées --- # Tableaux Statiques - 1D - 2/3 .pull-left[ ## Le code ```c /* Déclaration */ int t_monTab[5]; /* Affectation */ t_monTab[0]=10; t_monTab[1]=11; t_monTab[2]=12; t_monTab[3]=13; t_monTab[4]=14; /* Affichage */ for (int i=0;i<5;i++){ printf("%d \n",t_monTab[i]); } ``` ] .pull-right[ ## Contenu de t_monTab
| index | valeur | |-------|--------| | 0 | 10 | | 1 | 11 | | 2 | 12 | | 3 | 13 | | 4 | 14 | ] --- # Tableaux Statiques - 1D - 3/3 ## Mettre une variable globale .pull-left[ ```c #include
#include
/* ma variable globale */ #define TAILLE 5 int main(){ int t_tab[TAILLE]; t_monTab[0]=10; t_monTab[1]=11; t_monTab[2]=12; t_monTab[3]=13; t_monTab[4]=14; /*...*/ return 0; } ``` ] .pull-right[ .under[Pourquoi ?] Lorsque l'on manipule les tableaux .under[Quand ?] Quand on veut ! .under[Comment ?] - Définir la constante symbolique (ce n'est pas une variable globale car elle ne varie pas) en dehors du main - Donner le nom après le #define - Mettre une valeur après son nom - Utiliser les majuscules ! - Ne jamais mettre un ; à la fin d'une constante symbolique (vu que le compilateur fait bêtement un remplacement du nom par l'expression) ] --- # Tableaux Statiques - 2D - 1/3 ## Définition Ensemble de variables de même type, de même nom et caractérisées par 2 index - une Matrice ## Déclaration ```c type nomTableau [taille1] [taille2]; ``` ## Accès aux éléments ```c nomTableau[index1] [index2]; ``` .underR[Attention] - Au débordement dans le tableau - Le premier élément commence à l'index 0 - Les valeurs du tableau ne sont pas initialisées --- # Tableaux Statiques - 2D - 2/3 .pull-left[ ```c /* Déclaration */ int t_monTab[2][3]; /* Affectation */ t_monTab[0][0]=24; t_monTab[0][1]=25; t_monTab[0][2]=26; t_monTab[1][0]=34; t_monTab[1][1]=35; t_monTab[1][2]=36; /* Affichage */ for (int i=0;i<2;i++){ printf(" | "); for (int j=0;j<3;j++){ printf("%d | ",t_monTab[i][j]); } printf("\n"); } ``` ] .pull-right[ ## Contenu de t_monTab
| index | (0) | (1) | (2) | | --- | --- | --- | --- | | (0) | 24 | 25 | 26 | | (1) | 34 | 35 | 36 | ] --- # Tableaux Statiques - 2D - 3/3 ## Attention au parcours il nous faut 2 iterateurs : i et j ```c /* Affichage */ for (int i=0;i<2;i++){ printf(" | "); for (int j=0;j<3;j++){ printf("%d | ",t_monTab[i][j]); } printf("\n"); } ``` --- # Tableaux Dynamiques ## Pourquoi ? - pour gérer l'espace mémoire - pour créer des structures de données évolutives (listes,piles ...) ## Quand ? - On ne connait pas la taille finale de notre tableau - On veut faire des matrices .pull-right[
] ## Comment ? - avec des *pointeurs* - avec des *malloc* - avec des *free* --- # Création d'un tableau 1D dynamique ## Plusieurs étapes 1. Déclaration 2. Allocation 3. Affectation 4. Affichage 5. Libération ## Pourquoi ? On doit aller chercher des cases dispos pour stocker nos différentes lignes dans le tableau
--- # Création 1D dynamique ## Que se passe t-il en mémoire pour un tableau statique ? Le système doit trouver 4 cases contiguës vides .pull-left[ Si le tableau est utilisé, il bloque quand même la mémoire
] .pull-right[ Si le tableau n'est pas utilisé, il bloque quand même la mémoire !
] --- # Création 1D dynamique ## Que se passe t-il en mémoire pour un tableau dynamique ? .pull-left[ Si le tableau est utilisé, il bloque la mémoire
] .pull-right[ Si le tableau n'est pas utilisé, il débloque la mémoire !
]
--- # Création 1D dynamique ## Step by Step .pull-left-small[ 1. .under[Déclaration] 2. Allocation 3. Affectation 4. Affichage 5. Libération ] .pull-right-big[ ```c int* p_tab; p_tab=NULL; ```
]
.pull-left[ .under[remarque] afin de gérer le pointage initial, on peut faire pointer vers *NULL* (le néant) ] .pull-right[
] --- # Création 1D dynamique ## Step by Step .pull-left-small[ 1. Déclaration 2. .under[Allocation] 3. Affectation 4. Affichage 5. Libération ] .pull-right-big[ ```c int cases; cases =5; p_tab = malloc(cases * sizeof(int)); ```
]
.under[remarque]
Le pointeur pointe sur le premier élément du tableau (index 0) --- # Création 1D dynamique ## Step by Step .pull-left-small[ 1. Déclaration 2. Allocation 3. .under[Affectation] 4. Affichage 5. Libération ] .pull-right-big[ ```c p_tab[0]=42; p_tab[1]=66; p_tab[2]=9; p_tab[3]=2; p_tab[4]=3; ```
] --- # Création 1D dynamique ## Step by Step .pull-left-small[ 1. Déclaration 2. Allocation 3. Affectation 4. .under[Affichage] 5. Libération ] .pull-right-big[ ```c for (int i=0;i
] --- # Création 1D dynamique ## Step by Step .pull-left-small[ 1. Déclaration 2. Allocation 3. Affectation 4. Affichage 5. .under[Libération] ] .pull-right-big[ ```c free(p_tab); p_tab=NULL; ```
] --- # ATTENTION ## Il faut d'abord libérer le tableau puis faire pointer vers NULL .pull-left[ .underR[FAUX] ```c p_tab=NULL; free(p_tab); ```
Ici, on a perdu l'adresse initiale du tableau, on ne pourra jamais libérer la mémoire
] .pull-right[ .under[VRAI] ```c free(p_tab); p_tab=NULL; ```
Ici, on libére la mémoire, puis, on fait pointer l'adresse vers NULL
] --- # Création 1D dynamique ## Mini Bilan - un malloc = un free ! - deux malloc = deux free ! - ... - n malloc = n free ! .otro-blockquote[En bref si tu as free, tu as tout compris !]
--- # Gestion des chaînes ## Rappel - Une chaîne de caractères est un tableau contenant un caractère par case. - Une chaîne de caractères en c est %s - Un caractère en C est %c .under[Exemple : ] - Le mot en vrai : "tiktok" - La chaîne en C : .pull-left-small[ | index | valeur | |-------|--------| | 0 | t | | 1 | i | | 2 | k | | 3 | t | | 4 | o | | 5 | k | | 6 | \0 | ] .pull-right-big[
] --- # Gestion des chaînes ## Step by Step .pull-left-small[ 1. .under[Déclaration] 2. Allocation 3. Affectation 4. Affichage 5. Libération ] .pull-right-big[ ```c char* p_tab; ```
] --- # Gestion des chaînes ## Step by Step .pull-left-small[ 1. Déclaration 2. .under[Allocation] 3. Affectation 4. Affichage 5. Libération ] .pull-right-big[ ```c char* p_tab; int cases; cases=6; p_tab = malloc(cases * sizeof(char)); ```
] --- # Gestion des chaînes ## Step by Step .pull-left-small[ 1. Déclaration 2. Allocation 3. .under[Affectation] 4. Affichage 5. Libération ] .pull-right-big[ ```c printf("Veuillez saisir une chaine \n"); scanf("%s",p_tab); ```
] --- # Gestion des chaînes ## Step by Step .pull-left-small[ 1. Déclaration 2. Allocation 3. Affectation 4. .under[Affichage] 5. Libération ] .pull-right-big[ ```c printf("ma chaine : %s \n",p_tab); ```
] --- # Gestion des chaînes ## Step by Step .pull-left-small[ 1. Déclaration 2. Allocation 3. Affectation 4. Affichage 5. .under[Libération] ] .pull-right-big[ ```c free(p_tab); p_tab=NULL; ```
] --- # Tableau dynamique 1D ## En résumé 1. Déclaration 2. Allocation 3. Affectation 4. Traitements 5. Libération ```c
* p_tab; p_tab = malloc(
* sizeof(
)); ``` --- # Création d'un tableau 2D 1/5 ## Définition Un tableau 2D Dynamiques est un tableau de pointeurs
--- # Création d'un tableau 2D 2/5 ## Déclaration + allocation
```c int** p_tab; int taille1; int taille2; taille1=4; taille2=5; p_tab=malloc(taille1 * sizeof (int*)); for (int i=0;i
```c for (int i=0;i
--- # Pour nous ## Dans nos utilisations de tableaux dynamiques il faut une procédure/fonction - pour allouer - pour initialiser par defaut des valeurs - pour afficher - pour interagir avec l'utilisateur - ... Sans oublier les commentaires !
--- # Les Structures ## Représentation .pull-left[ #### En Algo ```c STRUCTURE nomType nomChamp1: type1, nomChamp2: type2 FIN STRUCTURE ``` ] .pull-right[ #### En C ```c struct nomType { type1 nomChamp1; type2 nomChamp2; }; ``` ]
## Concrétement .pull-left[ #### En Algo ```c STRUCTURE Eleve nom : chaîne de caractères, prénom : chaîne de caractères, niveau : entier, numéro : entier FIN STRUCTURE ``` ] .pull-right[ #### En C ```c struct Eleve { char* nom; char* prenom; int niveau; int numero; }; ``` ] --- # De l'aide ## Pour la récursivité -
ressource unisciel
-
Simulateur
## Pour l'algo -
Libre cours
-
Openclassroom
## Pour le C