Exemple Développement d’un filtre de spam (avec des exemples de B. Kernighan et R. Pike « La programmation en pratique ») Vladimir Makarenkov (Université.

Slides:



Advertisements
Présentations similaires
Premier programme en C :
Advertisements

La boucle for : init7.c et init71.c
Cours de C – Séance dexercices 12 Octobre Exercice 5 Idem quexercice 1 : lire une ligne au clavier Sans limitation de la longueur de la ligne (utilisez.
Introduction au Langage C,C++
A RECUPERER EN ENTRANT Le polycopié de Caml Partie 1
Introduction Langage très répandu Noyau Linux VLC … Des avantages indéniables mais aussi des contraintes ! Ceci nest quun rapide tour.
Rappels C.
Calculs de complexité d'algorithmes
Formation C débutant. Notion de compilation source.c executable Phase de compilation Fichier de texte brut, inexploitable directement par la machine Fichier.
La classe String Attention ce n’est pas un type de base. Il s'agit d'une classe défini dans l’API Java (Dans le package java.lang) String s="aaa"; // s.
GEF 243B Programmation Informatique Appliquée
C.
Exercice 1 1 (père) et 1 (fils) 1 (père) et 0 (fils)
FLSI602 Génie Informatique et Réseaux
Cours de C GTR 2003/ COURS DE PROGRAMMATION EN LANGAGE C ALBERT Arnauld.
Regrouper des éléments de même type et pouvoir y accéder à laide dun identificateur et dun indice. Objectif des tableaux.
Langage C Révision.
Rappel et compléments de la programmation en langage C
Les méthodes en java Une méthode est un regroupement d’instructions ayant pour but de faire un traitement bien précis. Une méthode pour être utilisée.
8PRO100 Éléments de programmation Allocation dynamique de la mémoire.
Programme de baccalauréat en informatique Algorithmique et programmation IFT-1001 Thierry EUDE Hatem Mahbouli Laboratoire #12 Département dinformatique.
TRAITEMENT DE STRUCTURES
FICHIERS.
Conception et implémentation de logiciels (avec des exemples de B
Base de programmation Script unity en c#.
Bases de la programmation en C++ 1 Les enchaînementsdinstruction Séquentiels. Exécutions dinstructions les unes à la suite des autres. Instructions séparées.
IFT-2000: Structures de données
Lecture et écriture de données
Principes de programmation
Miguel Garzon CrUise Lab - SITE. Introduction Data Types and Sizes Constants Logic Operators Type conversions Example.
Contrôle de types Les types en programmation Expressions de types Un contrôleur de types Equivalence de types Conversions de types Généricité.
COURS DE PROGRAMMATION ORIENTEE OBJET :
Introduction au Langage C
Tableaux Introduction aux tableaux à une dimension. Déclaration, stockage, initialisation et accès en lecture ou en écriture aux composantes d’un tableau.
Procédures et fonctions
Les Opérateurs Ils régissent toutes les opérations ou transformations sur les valeurs des variables. Opérateur d'affectation Opérateurs arithmétiques Opérateurs.
L’essentiel du langage C
Structures des données
Le langage C Structures de données
B.Shishedjiev - Informatique II
1 Notations Asymptotiques Et Complexité Notations asymptotiques : 0 et  Complexité des algorithmes Exemples de calcul de complexité.
Les pointeurs L'opérateur &.
9ième Classe (Mardi, 4 novembre) CSI2572. H Nous avons vu comment utiliser les directives #define #ifndef #endif Pour s’assurer de l’inclusion unique.
Les Pointeurs et les Tableaux Statiques et Tableaux Dynamiques
et quelques rappels sur certains éléments du langage C
Les adresses des fonctions
3 Les instructions. Cours 32 Plan du cours 3 Instruction Bloc Portée L’alternative Affectations =, +=, *=… Comment comparer –Comparer des réels –Comparer.
1 FICHIERS. 2 Les Fichiers  Les "entrées-sorties conversationnelles" échangent des informations entre le programme et l'utilisateur.  Le terme de fichier.
SIF-1053 Architecture des ordinateurs
Les types.
8PRO107 Éléments de programmation Les chaînes de caractères.
Un survol du language C.
1 Structures des données. 2  Le tableau permettait de désigner sous un seul nom un ensemble de valeurs de même type, chacune d'entre elles étant repérée.
La fonction alloue un bloc de taille size. Il faut indiquer la taille du bloc que l’on veut allouer. Le premier exemple: #include void main()
Structures de données élémentaires dans le contexte du TP #1
Les chaînes de caractères
TABLEAUX des POINTEURS TRAITEMENT DE STRUCTURES
8PRO100 Éléments de programmation Les pointeurs de caractères.
Chaînes de caractères en langage c, c'est en fait un tableau
Fiabilisation des lectures au clavier. Problèmes liés à scanf: rencontre de caractères invalides Sans arrêt prématuré: compte = scanf(``%d%c``;&n,&c);
CSI2520 Un langage de programmation impérative et concurrente.
Conception de Programmes - IUT de Paris - 1ère année – Cours 8 – Les entrées/sorties Comment fonctionnent les opérateurs > pour les types élémentaires.
Classe 1 CSI2572 Autres modificateurs de déclaration de variables: & volatile & register & static & auto & extern & const volatile Indique au compilateur.
1 Les caractères En informatique, les caractères sont très importants puisqu’ils sont utilisés pour la communication personne-machine. Puisque les ordinateurs.
Langage de programmation
PRO-1027 Programmation Scientifique en C
Informatique 2A Langage C 5ème séance. Déroulement de la séance 5 1 ère partie Étude des chaînes de caractères 2 ème partie Les structures 3.
M. BENJELLOUN : 2005 Le but final est de programmer un jeu où l'ordinateur choisira un nombre aléatoire entre 0 et 100 que vous devez deviner.
Informatique 2A Langage C 4ème séance
Coding party Écrire un programme qui élève un nombre au carré Écrire un programme qui teste si un nombre est pair Écrire un programme qui calcule la factorielle.
Transcription de la présentation:

Exemple Développement d’un filtre de spam (avec des exemples de B. Kernighan et R. Pike « La programmation en pratique ») Vladimir Makarenkov (Université du Québec à Montréal)

Première version de isspam /* isspam : teste mesg pour l’occurrence d’un motif */ int isspam(char *mesg) { int i; for (i = 0 ; i < npat; i++) if (strstr(mesg, pat[i]) != NULL) { printf(‘‘spam : correspondance pour ‘%s’\n’’, pat[i]); return 1; } return 0; }

Implémentation de base de strstr /* strstr simple : employer strchr pour vérifier le premier caractère */ char *strstr(const char *s1, const char *s2) { int n; n = strlen(s2); for ( ; ; ) { s1 = strchr(s1, s2[0]); if (s1 == NULL) return NULL; if (strncmp(s1, s2, n) == 0) return (char *) s1; s1++; }

Recherche d’une boucle efficace for (i = 0; i < npat; i++) if (strstr(mesg, pat[i]) != NULL) return 1; for (j = 0; mesg[j] != ‘\0’; j++) if ( un motif correspond au début du mesg[j] ) return 1;

int patlen[NPAT];/* longueur du motif */ int starting[UCHAR_MAX+1][NSTART];/* les motifs classés par caractères initiaux */ int nstarting[UCHAR_MAX+1];/* nombre de motifs de ce type */ … /* isspam : teste mesg pour l’occurrence d’un motif */ int isspam(char *mesg) { int i, j, k; unsigned char c; for (j = 0; (c = mesg[j]) != ‘\0’; j++) { for (i = 0 ; i < nstarting[c]; i++) { k = starting[c][i]; if (memcmp(mesg+j, pat[k], patlen[k]) == 0) { printf(‘’spam : correspondance pour ‘%s’\n’’, pat[k]); return 1; } return 0; } Nouvelle version de isspam

Structure de données

Code de construction des tables int i; unsigned char c; for (i = 0; i < npat; i++) { c = pat[i][0]; if (nstarting[c] >= NSTART) eprintf(‘’trop de motifs (>=%d) commençant par ‘%c’ ‘’, NSTART, c); starting[c][nstarting[c]++] = i; patlen[i] = strlen(pat[i]); }

Évaluation du temps #include … clock_t avant; double durée; avant = clock(); fonction_lente(); duree = clock() – avant; printf(‘’La fonction a utilisé %.3f secondes\n’’, duree/CLOCKS_PER_SEC);

Évaluation du temps (2) #include … clock_t avant; double durée; avant = clock(); for (i = 0; i < 1000; i++) fonction_rapide(); duree = (clock() – avant) / (double) i; printf(‘’La fonction a utilisé %.9f secondes\n’’, duree/CLOCKS_PER_SEC);

Profil de la première version de isspam secs%cum %cyclesinstructionsappelsfonction strchr strncmp strstr strlen isspam main _memccpy strcpy …………………

Profil de la version finale de isspam secs%cum %cyclesinstructionsappelsfonction memcmp isspam strlen main …………………

Mise au point du code Rassembler les sous-expressions communes sqrt(dx*dx + dy*dy) + ((sqrt(dx*dx + dy*dy) > 0) ? …); vs maDistance = sqrt(dx*dx + dy*dy); maDistance + ((maDistance > 0) ? …); for (i = 0; i < nstarting[c]; i++) {…} vs n = nstarting[c]; for (i = 0; i < n; i++) {…}

Mise au point du code (2) for (i = 0; i < 3; i++) a[i] = b[i] + c[i]; vs a[0] = b[0] + c[0]; a[1] = b[1] + c[1]; a[2] = b[2] + c[2]; for (i = 0; i < 3*n; i++) a[i] = b[i] + c[i]; vs for (i = 0; i < 3*n; i+=3) { a[i+0] = b[i+0] + c[i+0]; a[i+1] = b[i+1] + c[i+1]; a[i+2] = b[i+2] + c[i+2]; } Dérouler ou éliminer les boucles

Mise au point du code (3) Placer en mémoire cache les valeurs fréquemment utilisées if (c != lastc) /* met à jour le cache */ { lastc = c; lastcode = lookup(c); } show(lastcode);

Estimation de coûts d’opérations OpérationIntFloatDouble i++ i = j (pour float et double) 888 i = a + b12 i = a – b12 i = a * b1211 i = a / b i = a % b (pour int)114N.A.

Estimation de coûts d’opérations (2) Autres opérations Conversion float en int8 Conversion int en float8 Sur des vecteurs entiers v[i] = i49 v[v[i]] = i81 v[v[v[i]]] = i100

Estimation de coûts d’opérations (3) Structures de contrôle if (i == 5) a++4 if (i != 5) a++12 while (i < 0) a++3 a = sum1(b)57 a = sum2(b, c)58 a = sum3(b, c, d)54

Estimation de coûts d’opérations (4) Entrée / Sortie fputs(s, fp)270 fgets(s, 9, fp)222 fprintf(fp, ‘’%d\n’’, i)1820 fscanf(fp, ‘’%d\n’’, &i)2070 Malloc free(malloc(8))342

Estimation de coûts d’opérations (5) Fonctions de chaînes de caractères strcpy(s, ‘’ ’’)157 i = strcmp(s, s)176 i = strcmp(s, ‘’a ’’)64

Estimation de coûts d’opérations (6) Conversions chaînes / nombres i = atoi(‘’12345’’)402 sscanf(‘’12345’’, ‘’%d’’, &i)2376 sprintf(s, ‘’%d’’, i)1492 f = atof(‘’123.45’’)4098 sscanf(‘’123.45’’, ‘’%f’’, &f)6438 sprintf(s, ‘’%6.2f’’, )3902

Estimation de coûts d’opérations (7) Fonctions mathématiques i = rand()135 f = log(f1)418 f = exp(f1)462 f = sin(f1)514 f = sqrt(f1)112