Complément sur les pointeurs

Slides:



Advertisements
Présentations similaires
Informatique 1A Langage C 6 ème séance 1. Objectifs de la séance 6  Allocation dynamique de mémoire  Application à la création de tableaux 2.
Advertisements

Cours de Langage C Les structures
CINI – Li115 1 Semaine 9 Algorithmes de tri ● Introduction ● Tri à bulle ● - principe ● - algorithme ● - efficacité ● Tri par sélection ● - principe, algorithme,
Guide de l'enseignant SolidWorks, leçon 1 Nom de l'établissement Nom de l'enseignant Date.
CINI – Li115 1 Semaine 11 Les pointeurs (suite) ● Tableaux et pointeurs ● Questions sur les pointeurs.
TP 1 BIS Programmation structurée à l’aide de fonctions (FC) et de bloc fonctionnels (FB)
Comment utiliser le débogueur de Visual Studio /8/2015 INF145 1 Créé par Julien Galarneau Allaire, révisé par Eric Thé S.E.G.
1 Programmation en C++ Cycle de vie ● La vie d'un objet ● Destructeur ● Gestion de mémoire dynamique.
annuités, mensualités remboursements constants VPM pendant une période ininterrompue
UE2 - M22 Licence acoustique
Tableaux en C Mardi 2/05.
Semaine 8 Retour sur les tableaux : fonctions et récursivité
Programmation en C++ Standard Library
Algorithmes en C Phelma 2015.
COURS EXCEL INITIATION EPN LES PICOULET Elsa DELAUNAY.
I- ANALYSE DU BESOIN / Plan
LES TABLEAUX EN JAVA.
Pointeurs et langage C.
Les Tableaux Mme DJEBOURI. D.
Algorithmique AU El harchaoui noureddine
Algorithmique demander jeu du pendu.
Ajouter le code dans une page html
Initiation aux bases de données et à la programmation événementielle
Semaine 11 Les pointeurs (suite)
L’Instruction de Test Alternatif
Gestion dynamique de la mémoire : new / delete
Bddictionnairique Phase 1
Bases de programmation en Python
Principes de programmation (suite)
Tableaux à plusieurs dimensions en langage C
Semaine #7 INF130 par Frédérick Henri.
Algorithmique & Langage C
VI. Tri par tas (Heap sort)
Programmation Impérative II
Semaine #4 INF130 par Frédérick Henri.
Codification et Représentation de l’information
Science du traitement rationnel de l'information
« Un langage de programmation est une convention pour donner des ordres à un ordinateur. Ce n’est pas censé être obscur, bizarre et plein de pièges subtils.
Concepts de base de la programmation
Création Et Modification De La Structure De La Base De Données
Cours N°10: Algorithmiques Tableaux - Matrices
Chapter 12: Structures de données
Exercice PHP DEUST TMIC
Université Abou Bakr Belkaid Faculté des Sciences Département d’informatique Algorithmique Avancée et Complexité Chap4: Structures de données élémentaires.
Formation sur les bases de données relationnelles.
Exercice : le jeu. Vous devez concevoir l’algorithme permettant de jouer avec votre calculatrice : elle détermine au hasard un nombre caché entier entre.
Chapitre 3 : Caractéristiques de tendance centrale
Programmation Android Première application Android
L1 Technique informatique
Révision du format des données
Assembleur, Compilateur et Éditeur de Liens
B.Shishedjiev - Informatique
Filière Génie Civil – 2018 Langage C Tableaux – Exercices de révision
Le code de Huffman: est une méthode de compression statistique de données qui permet de réduire la longueur du codage d'un alphabet. Le code de Huffman.
Chapitre V La Procédure Comptable
Reconnaissance de formes: lettres/chiffres
NUMÉRATION POSITIONNELLE / PRINCIPE DE GROUPEMENT
Opérateurs et fonctions arithmétiques Opérateurs de relation Opérateurs logiques Cours 02.
Tris Simples/Rapides.
Exercices récapitulatifs
Le langage C# : Partie 1.
Tableaux croisés dynamiques sous Excel: des outils simples pour une analyse rapide de jeux de données en cytométrie Camille SANTA MARIA Ingénieur d’étude.
Arbre binaire.
Retour d’expérience Solutions organisationnelles
STS Web Services libres Gérer les services libres
Python Nicolas THIBAULT
DICTIONNAIRES (MAPS).
Type Tableau Partie 1 : Vecteurs
CE1 Module 4 Séance 1
Transcription de la présentation:

Complément sur les pointeurs Les pointeurs de fonctions 1

Pointeurs de fonctions Nom de la fonction adresse de la fonction : on peut donc obtenir l’adresse d’une fonction Pointeur de fonction variable contenant l'adresse d'une fonction Déclarer un pointeur de fonction type_de_retour (*id_fonct) (déclaration paramètres); Executer la fonction pointée : 2 écritures (*id_fonct) (paramètres); id_fonct (paramètres); 2 2

Pointeurs de fonctions Exemple : pf1.c /* fonction qui affiche et retourne la somme de 2 entiers */ int somme (int a,int b){ printf("Somme %d %d\n",a,b); return(a+b); } /* fonction qui affiche et retourne le produit de 2 entiers */ int prod (int a,int b){ printf("Produit %d %d\n",a,b); return(a*b); main() { /* Le pointeur qui contiendra l’adresse des fonctions */ int (*f)(int, int); int i,j,k; i=2; j=3; /* On y met l’adresse de la fonction somme */ f=somme; printf("On fait la somme\n"); /* Appel de somme par (*f) */ k = (*f)(i,j); /* ou f(i,j); */ printf("%d + %d = %d\n",i,j,k); /* On y met l’adresse de la fonction produit*/ printf("On fait le produit\n"); f=prod; k = (*f)(i,j); printf("%d * %d = %d\n",i,j,k); } 3 3

Pointeurs de fonctions (2) Fonctions C standard : TRI : qsort, heapsort, RECHERCHE:bsearch /* Qsort est définie en standart dans la libC */ qsort(char * base, int nel, int width, int(*comp)(void* x, void* y)); base: Tableau a trier nel: Nombre d’elements à trier width: Taille des élements compar : pointeur vers la fonction qui compare deux éléments de base et retourne <0, =0, ou >0 int comparaison(void* x, void* y) {return( *((float *)x) - *((float*)y));} #define N 20 main () {float tab[N]; int i; for (i=0; i<N; i++) tab[i]=rand()/(double)rand(); for (i=0; i<N; i++) printf("%f ",tab[i]); puts(""); qsort(tab,N,sizeof(float),comparaison); } 4 4

Exercices Ex1 : Écrivez la fonction de comparaison pour effectuer un tri décroissant sur un tableau de float avec la fonction qsort Ex2 : Écrire un programme utilisant la fonction bsearch pour rechercher une chaîne de caractère dans un tableau de chaînes de caractères. Le prototype de bsearch : void* bsearch(void *key, void *base, int nmemb, int size, int (*compar)(void *, void *)); 5 5

Listes triées Listes dont les éléments sont en ordre croissant Ordre établi à l'insertion Point essentiel : attention à l'ordre dans lequel est fait le chaînage

Ajouter (1) Ajouter le réel 8 à la liste l contenant déjà les réels 0, 1 et 9 dans cet ordre 9 L 1 8 7

Ajouter (1) Pour ajouter 8 à la liste contenant 0,1 et 9, il faut donc Créer un nouveau maillon Mettre 8 dedans Insérer ce nouveau maillon au bon endroit (entre les maillons contenant 1 et 9) :faire les chaînages corrects Indiquer à ce nouveau maillon que son suivant est celui qui contient 9 Indiquer au maillon contenant 1 que son suivant est le nouveau maillon Ici, la tête de liste l n’est pas modifiée 9 L 1 p 8 8

Listes triées : Ajout Algorithme itératif 1 p 8 c 3 2 1 9 ... 3 2 1 9 ... Algorithme itératif fonction ajouter(element e, Liste L) : Liste variable c,p : Liste; Se positionner avec c juste avant le point d'insertion ; Créer un chainon p Stocker la valeur e dans la partie correspondante de p Remplir l’adresse du chainon suivant p (c'était la partie suivante de c) suivante de c) Modifier l’adresse du chainon suivant c, car c’est 8 qui suit 1 maintenant Liste ajouter(ELEMENT e, Liste L) { Liste p,c; if (est_vide(L) || compare(&e,&L->val)<0) return ajout_tete(e,L); for(c=L; !est_vide(c->suiv)&& compare(&e,&c->suiv->val)>0; c=c->suiv) ; p= calloc(1,sizeof(Cell)); p->val=e; p->suiv= c->suiv; c->suiv=p; return L; } 9

Ajout itératif Algorithme itératif #include "liste.h" main() { Liste l; l=creer_liste(); visualiser(l); l=ajouter(9,l); visualiser(l); l=ajouter(8,l); visualiser(l); l=ajouter(1,l); visualiser(l); l=ajouter(5,l); visualiser(l); l=ajouter(15,l); visualiser(l); } 10

Listes triées : Ajout récursif Algorithme récursif : La fonction ajouter ajoute l’élément e à la liste L et retourne la nouvelle liste ainsi formée fonction ajouter(element e, Liste L) : Liste Si c'est la bonne position (e plus petit que la partie valeur de L) créer une nouvelle cellule c Stocker la valeur e dans la partie correspondante de c Remplir la partie suivant de c (c'est L) retourner la nouvelle cellule c Sinon il faut rappeler la fonction ajouter sur la suite de la liste. cette fonction retourne la liste formée par l’ajout de e à la suite. Cette nouvelle liste est la nouveau suivant de L ie Mettre dans la partie suivant de L la liste retournée par l'insertion de e dans la suite de la liste retourner L, puisque ajouter doit retourner la nouvelle liste formée par l’ajout de e à L 11

Listes triées : Ajout (2) Ajouter récursif : Liste ajouter(ELEMENT e, Liste L) { if ( est_vide(L)|| compare(&e,&L->val)<0) return ajout_tete(e,L); else { /*ajouter qqpart après : la fonction nous renvoie la liste obtenue en ajoutant e dans le reste de la liste */ L->suiv=ajouter(e,L->suiv); return L; } main() { Liste l; l=creerliste(); l = ajout_tete(9,l); l = ajout_tete(1,l); l = ajouter(8,l); 12

Autres listes Listes doublement chaînées Listes circulaires permettent le retour en arrière la valeur de l'élément l'adresse du suivant l'adresse du précédent Listes circulaires la fin de liste pointe sur le début de la liste Listes circulaires doublement chaînées 1 8 9 1 8 9 1 8 9 13

Dictionnaires 14

Dictionnaire ou table Un dictionnaire est une structure de données gardant en mémoire des éléments de la forme (clé, valeur) Un dictionnaire de français contient des mots (les clés) et leurs définitions (les valeurs) Le but d’un dictionnaire est d’être capable d’accéder rapidement à une valeur, en donnant sa clé. Exemple de problèmes posés : Vérifier l’orthographe d’un texte, trouver la définition d’un mot Clé : un mot – Valeur : présence, définition, traduction Dictionnaire des mots connus dans une langue dans un fichier (N mots, N grand) Vérifier un mot = rechercher s’il est présent dans le dictionnaire Annuaire inversé : trouver le nom d’un individu à partir de son numéro de téléphone Clé : un numéro (un entier ?) – Valeur : nom et adresse Numéro à 10 chiffres  M=1010 numéros. Peut-on faire un tableau de M positions ? 15 15

Dictionnaire Quelles opérations peut on faire sur un dictionnaire ? Insérer un élément dans le dictionnaire Supprimer un élément dans le dictionnaire Rechercher un élément dans le dictionnaire Et aussi : énumérer les éléments, fusionner 2 dictionnaires Quelles structures de données peut on utiliser ? Tableaux et tableaux triés Listes Table de hachage Arbres binaires Arbres lexicographiques 16 16

Hachage 17

Table de hachage 18 Solution : l'adressage calculé ou hachage accès à l'élément à l'aide d’une clé : dans le cas du dictionnaire, la clé est le mot dont on recherche la définition. La clé est utilisée pour calculer un indice entier, qui donne la position du mot dans le tableau Ce calcul est fait par une fonction de hachage, application de l'ensemble des clés vers les entiers accès en temps constant, ne dépend pas du nombre d'éléments stockés Exemple : Construire le dictionnaire dans un tableau de N cases Clés : mots i.e. une chaîne de caractères fonction de hachage :hash(mot) : somme des lettres de la chaîne modulo N Clé : Lame ; Définition : partie coupante d'un couteau hash(lame) = (12 + 1 + 13 + 5) % N = 31%N = 31 (N=100). On mettra lame et sa définition à l’indice 31 de notre tableau Clé : Bac ; Définition : examen passé en terminale hash(bac)=(2+1+3)%N = 6 On mettra bac et sa définition à l’indice 6 de notre tableau 18 18

Table de hachage (2) 19 1 …. 6 bac examen passé en terminale … 31 lame 1 …. 6 bac examen passé en terminale … 31 lame partie coupante d'un couteau 99 Utiliser le dictionnaire : recherche du mot xxxx dans le dico Calculer hash(xxxx) qui donne l’indice n dans le tableau où doit se trouver le mot xxxx Si tableau[n] contient xxxx, alors le mot (et sa définition) est trouvé Sinon le mot n’existe pas dans le dictionnaire 19 19

Table de hachage (3) Problème : les collisions Où mettre le mot male avec notre fonction de hachage ? hash(lame) = hash(male) Une collision survient lorsque 2 clés ont la même valeur de hachage Gestion des collisions 2 solutions : Utiliser des listes pour stocker les mots qui collisionnent Dynamique avec pointeurs et allocation : hachage externe Statique dans le tableau : hachage interne coalescent (par chaînage) Utiliser un deuxième calcul : Prendre la case qui suit si elle est libre : hachage linéaire Utiliser une deuxième fonction de hachage différente de la première qui doit séparer et donner des indices différents : il est peu probable que deux mots aient deux valeurs de hachage identiques par deux fonctions distinctes: hachage double 20 20

Fonctions de hachage 21 Clés numériques Une bonne fonction de hachage Évite un grand nombre de collisions remplissage uniforme de la table rapide à calculer Considérons une table de taille N (de préférence premier) et un nombre d'entrées M Clés numériques Entiers : hash(k) = k modulo N réels : hash(k) = Partie entière de k*N Clés alphanumériques ou chaîne de caractères : c0c1c2c3....ck Première fonction hash(C) = (c0 + a*c1 + a2*c2 + a3*c3.... + ak*ck) modulo N a est quelconque , la table de hachage de JAVA prend a = 31 Fonction universelle a= 31415; b=27183 ( a et b premier entre eux) hash(C) = c0 + (a*b)%(N-1)*c1 + (a*b2)%(N-1)*c2 + (a*b3)%(N-1)*c3.... + (a*bk)%(N-1)*ck) modulo N probabilité de conflits en 1/N 21 21

Hachage par listes Listes chaînées (à l'extérieur du tableau) ... 22 toutes les clés ayant même hachage sont chaînées entre elles nombre moyen d'accès en recherche : 1+N/M ... 6 31 ba c Examen passé en terminale NUL L lam e Partie coupante d’un couteau mal e Qui est de sexe masculin me la 3ième personne du passé de meler NUL L 22 22