Académique Documents
Professionnel Documents
Culture Documents
saadchakkor@gmail.com
1
Programme
Tableaux et chanes de caractres Les fonctions et Rcursivit Directives au pr processeur Mthodes de tri et de recherche Pointeurs et Fichiers Type compos et structures Listes chanes Arbres Tables de hachage Graphes
2
Evaluation
Remarque !! : la prsence et la ralisation des Exos de TD & de TP & mini-projet seront pris en considration dans la note finale de module.
Les tableaux
Un tableau reprsente selon ses dimensions, un vecteur ou une matrice d'lments d'un mme type. Un tableau est un ensemble fini d'lments de mme type, stocks en mmoire des adresses contigus.
Les tableaux
Dclaration de tableaux en C : <TypeSimple> <NomTableau>[<Dimension>]; Les noms des tableaux sont des identificateurs
Les tableaux
Les tableaux une dimension
Dclaration: type nom[dim];
Exemples: int compteur[10];
float nombre[20]; Utilisation: Un lment du tableau est repr par son indice. En langage C les tableaux commencent l'indice 0. L'indice maximum est donc dim-1. Appel: nom[indice] compteur[2] = 5; nombre[i] = 6.789; printf("%d",compteur[i]); scanf("%f",&nombre[i]);
Exemples:
Les tableaux
Les tableaux plusieurs dimensions:
Tableaux deux dimensions:
Dclaration: type nom[dim1][dim2]; Exemples : int compteur[4][5]; float nombre[2][10];
Utilisation: Un lment du tableau est repr par ses indices. En langage C les tableaux commencent aux indices 0. Les indices maximum sont donc dim1-1, dim2-1. Appel: nom[indice1][indice2] compteur[2][4] = 5; nombre[i][j] = 6.789; printf("%d",compteur[i][j]); scanf("%f",&nombre[i][j]);
Exemples:
Les tableaux
Initialisation des tableaux
On peut initialiser les tableaux au moment de leur dclaration: Exemples: int liste[10] = {1,2,4,8,16,32,64,128,256,528}; float nombre[4] = {2.67,5.98,-8,0.09}; int x[2][3] = {{1,5,7},{8,4,3}}; /* 2 lignes et 3 colonnes *
Les tableaux
Si la dimension n'est pas indique explicitement lors de l'initialisation, alors le compilateur rserve automatiquement le nombre d'octets ncessaires.
Exemples : int A[] = {10, 20, 30, 40, 50}; ==> rservation de 5*sizeof(int) octets (dans notre cas: 10 octets) float B[] = {-1.05, 3.33, 0.87, -12.3}; ==> rservation de 4*sizeof(float) octets (dans notre cas: 16 octets)
Les tableaux
Affichage et affectation :
Ecrire un programme qui permet de saisir N valeurs entires dans un tableau puis de les afficher horizontalement.
10
Exercice 6:
Ecrire un programme qui permet dinsrer une valeur entre au clavier dans un tableau dentiers.
Exercice 7:
Rechercher dans un tableau d'entiers une valeur VAL entre au clavier. Afficher la position de VAL si elle se trouve dans le tableau, sinon afficher un message correspondant. La valeur POS qui est utilise pour mmoriser la position de la valeur dans le tableau, aura la valeur -1 aussi longtemps que VAL n'a pas t trouve.
12
Exercice 8 :
Ecrire un programme qui permet de supprimer une valeur dun tableau dentiers en indiquant sa position dans ce tableau.
Exercice 9 :
Ecrire un programme qui permet de modifier une valeur dun tableau dentiers en indiquant sa position dans ce tableau.
13
char *mot ;
il faudra rserver dynamiquement la mmoire : on abordera plus loin ce sujet.
14
strlen
int longueur_mot ; longueur_mot = strlen(mot);
strcat
mot3 = strcat(mot1, mot2); mot3 est la concatnation de mot1 et mot2.
17
Les fonctions
Dclaration :
type_de_la_fonction nom_de_fonction(type arg1, type arg2, ...)
19
Les fonctions
Exemple :
int max(int x, y ) /* calcule le maximum de deux entiers */ { int m ; if (x > y) then m=x ; else m=y ; return (m) ; }
20
Les fonctions
Remarques:
On peut avoir des fonctions sans arguments, comme on peut avoir une fonction qui ne retourne rien; ce moment , on crit : void nom_fct (void) ou bien void nom_fct () Le type d'une fonction est implicitement entier. Le passage des arguments se fait toujours par valeur : on verra plus tard comment modifier les arguments d'une fonction.
21
Ecrire une fonction qui permet de calculer le carr dun entier. Exercice 2 : Ecrire une fonction qui permet de calculer la moyenne dun tableau. Exercice 3 : Ecrire une fonction qui permet de calculer la factorielle dun entier N!, une autre fonction pour calculer XN une troisime pour calculer XN! Exercice 4 : Ecrire une fonction permettant de vrifier quun nombre est parfait. Ecrire une fonction permettant dafficher la liste des nombres parfaits infrieurs un chiffre donn. Exercice 5 : Ecrire une fonction permettant de calculer pour une valeur X son image par un polynme P(X) de degr N.
22
Rcursivit
La rcursivit est une mthode de description dalgorithmes qui permet une fonction de sappeler ellemme ! Forme gnrale : If(condition) return valeur Else fonction rcursive Exemple : calcul de la factorielle :
Long fact (int N){ If(N==0) return 1; Else Return fact(N-1)*N; }
23
Rcursivit
Exercice 1 : Ecrire une fonction rcursive qui calcule le produit de deux valeurs entires A et B ? Exercice 2 : Ecrire une fonction rcursive qui calcule le PGCD de deux entiers A et B ? Exercice 3 : Ecrire une fonction rcursive permettant dafficher des entiers < N saisi au clavier selon lordre : Croissant ? Dcroissant ?
24
Rcursivit
Exercice 4 : Ecrire une fonction rcursive qui convertit un nombre donn en base 10 vers une base B 2<=B<=9 ? Ecrire une fonction rcursive qui ralise lopration inverse ?
25
26
Tri par slection Tri par insertion Tri par bulle Tri rapide Tri par fusion
29
30
32
33
34
36
On dcoupe en deux parties peu prs gales les donnes trier On trie les donnes de chaque partie On fusionne les deux parties
40
42
43
44
Tri rapide :
45
47
48
Recherche squentielle :
int Rech_Sequentielle(type_tus tab, int N, composante val) /*rend -1 si val non trouve, premire occurrence trouve sinon */ { int i; for(i=0;i<N;i++) { if(tab[i]==val) return(i); } return(-1); }
49
50
Recherche dichotomique :
Rech_dichotomie(int tab[], int N, composante val) { int g,m,d; /* gauche, milieu, droite */ g=0;d=N; while (g<=d) { m=(g+d)/2; /* division entire */ if(val<tab[m]) d=m-1; else if(val>tab[m]) g=m+1; else return(m) } return(-1);}
52
Les pointeurs
Dfinition : Un pointeur est une variable spciale qui contient ladresse dune autre variable. Une variable de type pointeur se dclare l'aide de l'objet point prcd du symbole * (oprateur d'indirection). Exemples : Int *p ; p est un pointeur pointant sur un objet de type int Char *c ; c est un pointeur pointant sur un objet de type char
53
Les pointeurs
il s'agit d'une technique de programmation trs puissante, permettant de dfinir des structures dynamiques, c'est-dire qui voluent au cours du temps (par opposition aux tableaux par exemple qui sont des structures de donnes statiques, dont la taille est fige la dfinition). un pointeur est une variable qui permet de stocker une adresse, il est donc ncessaire de comprendre qu'est ce quune adresse.
54
55
Les pointeurs
Soit la variable : Int a=7 ; a est reprsente par : Ladresse de lespace mmoire qui lui est rserve. Le contenu de cet espace mmoire. Int *pt ; Pt=&a si Pt contient ladresse dune variable a on dit que pt pointe sur a.
&a 7
&pt
Pt
56
Les pointeurs
Les oprateurs de base :
& : oprateur qui renvoie ladresse de lobjet dsign. * : oprateur qui renvoie le contenu de la variable pointe.
Exemples :
Int X=4,Y ; Int *p,*q ; P=&X ; /* p contient ladresse de X*/ Printf(%d,*P) : affiche le contenu de la variable pointe par P Y=*P-1 ; /* y vaut 3 */ *P+=1 ; /* incrmente X de 1*/ (*P)++ ; /* incrmente de 1 la variable pointe par P , X vaut 6*/
N.B : les parenthses sont importantes. Car *P++ incrmente le pointeur P(ladresse )et non pas la valeur de X(contenu).
57
Les pointeurs
Pointeurs et tableaux :
Les pointeurs ont une forte relation avec les tableaux, ils facilitent beaucoup plus leur manipulation.
Exemple :
Int * tab ; Tab=(int *)malloc(sizeof(int) *10) ; Rserve un espace mmoire pour dix entiers. Il faut imprativement utiliser une fonction pour allouer dynamiquement un espace Comme la fonction malloc de la bibliothque <malloc.h>.
58
Les pointeurs
Les critures suivantes sont quivalentes : *tab Tab *(tab+i) (tab+i) tab[0] ; &tab[0] ; tab[i] ; &tab[i] ;
59
Les pointeurs
Pointeurs et chanes de caractres : Une chane de caractre est un tableau de caractres : la manipulation des chanes de caractres est identique celle dun tableau. Dclaration : Char *ch ; Ch=(char *)malloc(sizeof(char)*20) ;
60
Les pointeurs
Passage des arguments dune fonction : Deux types de passage des arguments, passage par valeur et passage par adresse. Passage par valeur : Les paramtres sont passs par copie de valeur et ne seront pas modifis en dehors de la fonction. Exemple : #include <stdio.h> Void echanger(int x,int y) {int z ; z=x ; x=y ;y=z ; Printf(x= %d y=%d ,x,y) ; } main() { int x=5,y=7 ; Excution : Echanger(x,y) ; X=7 y=5 Printf(x= %d y=%d ,x,y) ; X=5 y=7 }
61
Les pointeurs
Passage par adresse :
Pour changer les paramtres x et y de la fonction, il faut le passage par adresse. Les pointeurs offrent la possibilit de modifier les contenus des variables de la fonction principale (fonction main()).
62
Les pointeurs
Exemple : #include <stdio.h> Void echanger(int *x,int *y) {int z ; z=*x ; *x=*y ;*y=z ; Printf(x= %d y=%d ,*x,*y) ; } Void main() { int *x=5,*y=7 ; Echanger(&x,&y) ; Printf(x= %d y=%d ,*x,*y) ; }
63
Les pointeurs
Allocation dynamique de la mmoire :
Lorsque lon dclare une variable de type char, int, ...lespace mmoire est rserv automatiquement. Pour les pointeurs lespace mmoire nest pas rserv. On utilise donc des fonctions permettant dallouer lespace mmoire un pointeur.
Les pointeurs
Fonction calloc() ; char *s ; s = (char *) calloc(256, sizeof(char)); rserve 256 octets initialiss '\0' Pour librer lespace mmoire rserv une variable on utilisera la fonction free() ; dont largument est un pointeur. Free(s) ; Free(c ) ;
65
Les pointeurs
La fonction realloc() modifie la taille du bloc mmoire. realloc () : permet daugmenter ou de diminuer la taille du tableau sans craser sans contenu. Exemple : #include<stdio.h> #include<stdlib.h> Int main() {int *tab, N ; Printf(donner la dimension ) ;scanf %d,&N) ; Tab=(int *)malloc(sizeof(int)*N) ;
66
Les pointeurs
For(int i=0 ;i<N ;i++) { Printf(donnez tab[%d] ,i) ;scanf(%d,(tab+i)) ; } Printf( ajout de 2 lments dans le tableau ) ; Tab=(int *)realloc(tab,(N+2)*sizeof(int)) ; Printf(donnez tab[%d] ,N) ;scanf(%d,(tab+N)) ; Printf(donnez tab[%d] ,N+1) ;scanf(%d,(tab+N+1)) ; For(int i=0 ;i<N+2 ;i++) Printf(d% ,*(tab+i)) ) ; Free(tab) ;/* libre lespace rserv */ }
67
Les pointeurs
Exercice 1:
1) Ecrire une fonction qui calcule la somme des lments dun tableau. 2) Ecrire une fonction qui dtermine le minimum dun tableau. 3) Ecrire un programme qui fait appel ces deux fonctions.
Exercice 2 :
Soit p un pointeur qui pointe sur un tableau A : Int A[]={12,23,27,42,67,70, 73,76,89,90} Int *p ; Int p=A ; Quelles valeurs fournissent ces expressions : *p+2 ; *(p+2) ;*(p+(*p-9)) ;*(p+*(p+8)-A[7]) ;
68
Les pointeurs
Exercice 3 : Ecrire un programme qui compte le nombre de lettres majuscules dans une chane de caractres entre par lutilisateur, en utilisant le formalisme pointeur ? Exercice 4 : Ecrire un programme qui convertie une chane de caractres majuscule en minuscule en utilisant les pointeurs ? Exercice 5 : Ecrire un programme qui lit une phrase puis dtermine le nombre de caractres et le nombre despaces existants dans cette phrase saisie ?
69
Les pointeurs
Exercice 6 : Ecrire un programme permettant de saisir les notes de N etudiants dune classe connus par leur CNE puis de calculer la moyenne de cette classe et de classer ces tudiants par ordre de mrite ? Indication : utiliser une structure tudiant, formalise pointeur ! Exercice 7 : Ecrire un programme qui teste si une chane de caractres entre par lutilisateur est palindrome (une chane de caractre est dite palindrome si elle se lit de droite comme de gauche), Exemple : NON, RESSASSER, AZIZA
70
Les fichiers
Un fichier (file) est un ensemble structur de donnes stock en gnral sur un support externe (disque dur, disque optique, ...). Un fichier structur contient une suite d'enregistrements homognes, qui regroupent le plus souvent plusieurs composantes.
71
Les fichiers
Oprations possibles avec les fichiers: Crer - Ouvrir - Fermer - Lire - Ecrire - Dtruire Renommer. La plupart des fonctions permettant la manipulation des fichiers sont ranges dans la bibliothque <STDIO.H>, certaines dans <IO.H>. Dclaration: FILE *fichier; /* majuscules obligatoires pour FILE */ La dclaration des fichiers doit figurer AVANT la dclaration des autres variables.
72
Les fichiers
Ouverture: FILE *fopen(char *nom, char *mode); FILE *fopen(filename, mode) /* dclaration dans stdio.h */ char filename[], mode[]; On passe donc 2 chanes de caractres nom: celui figurant sur le disque, exemple: C :\test.dat
73
Les fichiers
fopen a pour argument deux chanes de caractres, le nom du fichier et le mode d'ouverture. donne comme rsultat un pointeur NULL si l'ouverture a chou sinon le pointeur renvoy est utilis dans les critures, les lectures et les dplacements ultrieurs.
74
Les fichiers
Mode (pour les fichiers TEXTES) : r : lecture seule w : criture seule (destruction de l'ancienne version si elle existe) w+ : lecture/criture (destruction ancienne version si elle existe) r+ : lecture/criture d'un fichier existant (mise jour), pas de cration d'une nouvelle version. a+ : lecture/criture d'un fichier existant (mise jour), pas de cration d'une nouvelle version, le pointeur est positionn la fin du fichier.
75
Les fichiers
Mode (pour les fichiers BINAIRES) : On ajoute b devant les modes quon a vu : rb wb Exemple : FILE *fichier ; fichier = fopen( C:\test.dat, rb ) ;
76
Les fichiers
#include <stdio.h> /* Inclusion de la biblio standard */ int main() { /* Dclaration d'un fichier */ FILE* fichier; /* Ouverture du fichier test en lecture */ fichier = fopen("/home/users/manouvrier/test","r"); /* Test de l'ouverture pour vrifier les ventuels problmes */ if (fichier== NULL) /* Il y a eu un problme */ { /* Affichage d'un message d'erreur */ printf("Erreur ouverture fichier "); } /* Si l'ouverture a pu se faire */ else ... }
77
Les fichiers
Fermeture: Int fclose(FILE *fichier); Retourne 0 si la fermeture sest bien passe, EOF en cas derreur. Il faut toujours fermer un fichier la fin d'une session. mode (pour les fichiers TEXTE) : Exemple : FILE *fichier ; fichier = fopen( C:\test.dat , rb ) ; /* Ici instructions de traitement */ fclose(fichier) ;
78
Les fichiers
Destruction: int remove(char *nom); Retourne 0 si la fermeture sest bien passe. Exemple : remove( C:\test.dat ) ; Renommer: int rename(char *oldname, char *newname); Retourne 0 si la fermeture sest bien passe.
79
Les fichiers
Positionnement du pointeur au dbut du fichier :
void rewind(FILE *fichier); int feof(FILE *id) dit si on est en fin de fichier ou non (0). Rcupration de la position du curseur dans le fichier :
Les fichiers
Ecriture dans le fichier texte: int putc(char c, FILE *fichier); Ecrit la valeur de c la position courante du pointeur , le pointeur avance d'une case mmoire. Retourne EOF qui marque la fin de fichier, en cas derreur. Exemple : putc(A, fichier) ;
81
Les fichiers
int putw(int n, FILE *fichier); le pointeur avance du nombre de cases correspondant la taille d'un entier (4 cases). Retourne n si lcriture sest bien passe. int fputs(char *chane, FILE *fichier); le pointeur avance de la longueur de la chaine ('\0' n'est pas rang dans le fichier). signifie "met une chane dans un fichier" Retourne EOF en cas derreur. Exemple : fputs( BONJOUR ! , fichier) ;
82
Les fichiers
fputc : ce qui signifie "met un caractre dans un fichier". Comme son nom l'indique, cette fonction crit un octet dans un fichier. Exemple : char erreur; erreur = fputc('x', Pointeur_sur_fichier); putc putc(caractre, pointeur_sur_fichier) crit le caractre dans un fichier la position pointeur_sur_fichier (et renvoie le caractre).
83
Les fichiers
Ecriture dans le fichier binaire:
int fwrite(void *p,int taille_bloc,int nb_bloc,FILE *fichier);
p crit partir de la position courante du pointeur fichier nb_bloc X taille_bloc octets lus partir de l'adresse p. Retourne le nombre de blocs crits. Exemple : taille_bloc=4 (taille d'un entier en C), nb_bloc=3, criture de 3 octets. int tab[10] ; fwrite(tab,4,3,fichier) ;
84
Les fichiers
fwrite : crit dans un fichier des objets d'un type quelconque. Il faut prciser la taille d'un objet (par exemple avec sizeof(objet)), le nombre d'objets crire et le pointeur du fichier destination. la fonction renvoie le nombre d'lments effectivement crits.
85
Les fichiers
int fprintf(FILE *fichier, char *format, liste d'expressions);
rserve plutt aux fichiers ASCII. Retourne EOF en cas derreur. Exemples: fprintf(fichier,"%s","il fait beau"); fprintf(fichier,%d,n); fprintf(fichier,"%s%d","il fait beau",n);
86
Les fichiers
getc getc(pointeur_sur_fichier) renvoie le caractre lu dans un fichier l'endroit point par le pointeur_sur_fichier et incrmente ce pointeur, ou renvoie EOF si on est la fin du fichier.
87
Les fichiers
Exemple : copier un fichier dans un autre
void main(int argc, char *argv[] ) /* copier le fichier en premier argument dans le fichier en 2me argument */ { FILE *fopen(), *pf1, *pf2 ; int c ; if (argc <= 2) printf(" deux arguments SVP...") ; else { pf1 = fopen(argv[1] , "r") ; /* uverture du premier fichier en lecture */ pf2 = fopen(argv[2] , "w") ; /* ouverture du deuxime fichier en criture */ while ( (c = getc(pf1)) != EOF ) putc(c, pf2) ; fclose(pf1) ; fclose(pf2) ; } }
88
Les fichiers
Lecture dans un fichier : fscanf : lecture analogue scanf. Syntaxe : Nb_lu = fscanf(Pointeur_sur_fichier, format, liste de pointeurs); Nb_lu est le nombre d'arguments lus et accepts. Exemple : Nb_lu = fscanf(Pointeur_sur_fichier, "%s", Chane);
89
Les fichiers
Dans un fichier texte fgetc : ce qui signifie "prend un caractre dans un fichier". Exemple : int caractere; caractere = fgetc(Pointeur_sur_fichier);
90
Les fichiers
fgets : ce qui signifie "prend une chane dans un fichier". Lit un certain nombre de caractres dans un fichier et les met dans une chane en ajoutant le caractre nul la fin. Exemple : fgets(Chaine, 10, Pointeur_sur_fichier); Lit 10 caractres dans le fichier et les crits dans Chaine. Un dernier caractre nul est ajout. Si une fin de ligne (EOL) est rencontre avant le dixime caractre lu, seuls les caractres avant la fin de ligne seront lus et ils seront suivis dans la chane par EOL et NULL
91
Les fichiers
Dans un fichier binaire Syntaxe : Nb_lu = fread(pointeur_sur_tableau, taille_element, nb_elements, fichier); Nb_lu est gal nb_elements si l'criture s'est passe correctement.
92
Les fichiers
Exemple: #include <stdio.h> FILE *Pointeur_sur_fichier; fopen("C:\FSTT\essai.dat", "wb"); int tableau[5]; nb = fread(tableau, sizeof(int), 3, Pointeur_sur_fichier); Lit des nombres entiers et les range dans les trois premires cellules du tableau ; nb a pour valeur le nombre d'lments crits, 3 si tout s'est bien pass.
93
Les fichiers
Exercice 1: Ecrire un programme qui permet de crer un fichier dtudiants. Exercice 2 : Ecrire une procdure qui permet de modifier les informations dun tudiant.
94
Les structures
Une structure est un ensemble de donnes de mme type ou de types diffrents Dclaration: 2 manires : Struct nom_structure { Type var1 Type var2 : }; Typedef struct { Type var1; Type var2; : } Nouveau_nom;
Les structures
Exemple : struct point { int x; int y; int z; }; Typedef struct { int x; int y; int z; } point; Typedef struct { char nom[10]; char prenom[10]; int age; float note; }fiche;
97
Les structures
Utilisation:
On dclare des variables par exemple: fiche f1,f2; puis, par exemple: strcpy(f1.nom,"DUPONT"); strcpy(f1.prenom,"JEAN"); f1.age = 20; f1.note = 11.5; L'affectation globale est possible avec les structures: on peut crire: f2 = f1;
98
Exemples :
typedef struct { char nom[10]; char prenom[10]; int age; float note; } fiche;
99
100
101