Vous êtes sur la page 1sur 107

Facult des Sciences et Techniques de Tanger Maroc

Module : Algorithmes & Structures de Donnes en Langage C MIPC II-4


Ralis par : Professeur Chakkor Saad 2010-2011

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.

CC1 CC2 Examen de TP


3

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

Algorithmique & Programmation : Langage C

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:

Algorithmique & Programmation : Langage C

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:

Algorithmique & Programmation : Langage C

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.

Calculer et afficher la somme des lments de ce tableau.

10

Algorithmique & Programmation : Langage C

Les tableaux : Exercices


Exercice 1: Ecrire un programme qui permet de chercher le maximum et lindice de n lments dun tableau. Exercice 2 : Ecrire un programme qui permet de calculer la somme de n lments dun tableau Exercice 3: Ecrire un programme qui permet de compter le nombre doccurance dun lment dans un tableau de n lments. Exercice 4: Ecrire un programme permettant de saisir et dafficher les lments dune matrice de n colonnes et m lignes. Exercice 5: Ecrire un programme permettant de calculer le dterminant dune matrice (2X2)
11

Algorithmique & Programmation : Langage C

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

Algorithmique & Programmation : Langage C

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

Algorithmique & Programmation : Langage C

Les chanes de caractres


Les chanes de caractres sont des tableaux de caractres dont le dernier lment est \0. On peut les dclarer comme : * char mot[80] ;
il faudra dans ce cas s'assurer que la longueur du mot ne dpasse pas 80 caractres.
*

char *mot ;
il faudra rserver dynamiquement la mmoire : on abordera plus loin ce sujet.

14

Algorithmique & Programmation : Langage C

Les chanes de caractres : exemple


# include <stdio.h> # define MAXCHAINE 80 main() /* copie une chane de caractres lue sur l'entre standard dans une autre chane */ { char mot1[MAXCHAINE], mot2[MAXCHAINE] ; int i ; printf("entrez une chane de caractres : mot1 =?\n") ; scanf("%80s", mot1) ; i=0; while ((mot1[i] != '\0') && (i < MAXCHAINE)) { mot2[i] = mot1[i] ; i++ ; } if (i >= MAXCHAINE) printf("mot trop long\n") ; else { mot2[++i] = '\0' ; printf(" mot2 = %s\n", mot2) ; } }
15

Algorithmique & Programmation : Langage C

Manipulation des chanes


Strcmp
cette fonction compare lexicographiquement deux chanes de caractres. Exemple: char *mot1, *mot2 ; ... if (strcmp(mot1, mot2) < 0) then printf("mot1 < mot2") ; else if (strcmp(mot1, mot2) > 0) then printf("mot1> mot2") ; else printf("mot1 = mot2") ;
16

Algorithmique & Programmation : Langage C

Manipulation des chanes strcpy


strcpy(mot1,mot2); copie la chane mot2 dans mot1.

strlen
int longueur_mot ; longueur_mot = strlen(mot);

strcat
mot3 = strcat(mot1, mot2); mot3 est la concatnation de mot1 et mot2.
17

Algorithmique & Programmation : Langage C

Manipulation des chanes : Exercices


Exercice 1 : Ecrire un programme qui lit une ligne de texte (ne dpassant pas 200 caractres) la mmorise dans une variable chane et affiche ensuite: a) la longueur L de la chane. b) le nombre de 'e' contenus dans le texte. c) toute la phrase rebours, sans changer le contenu de la variable TXT Exercice 2 : Ecrire un programme qui lit un texte TXT (de moins de 200 caractres) et qui enlve toutes les apparitions du caractre a' en tassant les lments restants. Les modifications se feront dans la mme variable TXT. Exercice 3 : Ecrire un programme qui lit deux chanes de caractres CH1 et CH2, les compare lexico graphiquement et affiche le rsultat: Exercice 4 : Ecrire un programme qui lit deux chanes de caractres CH1 et CH2 et qui copie la premire moiti de CH1 et la premire moiti de CH2 dans une troisime chane CH3. Afficher le rsultat.
18

Algorithmique & Programmation : Langage C

Les fonctions
Dclaration :
type_de_la_fonction nom_de_fonction(type arg1, type arg2, ...)

{ dclarations instructions return(valeur_de_la_fonction) ; }

19

Algorithmique & Programmation : Langage C

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

Algorithmique & Programmation : Langage C

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

Algorithmique & Programmation : Langage C

Les fonctions : Exercices


Exercice 1:

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

Algorithmique & Programmation : Langage C

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

Algorithmique & Programmation : Langage C

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

Algorithmique & Programmation : Langage C

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

Algorithmique & Programmation : Langage C

Les directives au prprocesseur


Le prprocesseur est la premire tape de la compilation en C. Plus exactement le prprocesseur sexcute avant le compilateur. Le prprocesseur soccupe seulement deffectuer des remplacements de valeurs ou des inclusions de fichier. Le prprocesseur permet galement de crer des constantes. Il nest en aucun cas capable de dtecter les erreurs quelle soit logiques ou syntaxiques.

26

Algorithmique & Programmation : Langage C

Les directives au prprocesseur


les directives dinclusion
linclusion peut se faire de deux faons diffrentes :

#include <nom_de_fichier> #include "nom_de_fichier "


Exemple:

#include <stdio.h> #include <math.h>

Les directives de dfinition de variables


on dfinit une variable avec le prprocesseur de la faon suivante :

#define NOM valeur de remplacement.

Ainsi pour lexemple prcdent on a :


#define PI 3.14159265358979
27

Algorithmique & Programmation : Langage C

Les directives au prprocesseur


Exemple:
#include <stdio.h> #define FONCTION_PRINCIPALE void main () #define BEGIN { #define END } #define DEBUT_AFFICHAGE printf( #define FIN_AFFICHAGE ); FONCTION_PRINCIPALE BEGIN DEBUT_AFFICHAGE "define c'est bien !!! " FIN_AFFICHAGE END
28

Algorithmique & Programmation : Langage C

Les tableaux : algorithmes de Tri


Le tri est le classement dans ordre croissant ou dcroissant des lments dun tableau. Plusieurs mthodes de tri :

Tri par slection Tri par insertion Tri par bulle Tri rapide Tri par fusion

29

Algorithmique & Programmation : Langage C

Les tableaux : algorithmes de Tri


Tri par slection :
Problme : Classer les lments d'un tableau A par ordre dcroissant. Principe : Parcourir le tableau de gauche droite l'aide de l'indice I. Pour chaque lment A[I] du tableau, dterminer la position PMAX du (premier) maximum droite de A[I] et changer A[I] et A[PMAX].

30

Algorithmique & Programmation : Langage C

Algorithme de Tri par slection :


tab_entiers[MAX] PROCEDURE selection (tab_entiers t) POUR CHAQUE i entier dans [0 ; MAX - 1 [ min i POUR CHAQUE j entier dans [ i+1 ; MAX [ SI t[j] < t[min] ALORS min j SI min i ALORS t[i] t[min]
31

Algorithmique & Programmation : Langage C

Les tableaux : algorithmes de Tri


Exercice 1 : Ecrire un programme permettant de raliser le tri par slection des lments dun tableau dentiers selon lordre dcroissant ?

32

Algorithmique & Programmation : Langage C

Les tableaux : algorithmes de Tri


Tri par propagation ou par bulle (bubble sort) :
Problme : Classer les lments d'un tableau A par ordre croissant. Principe : On parcourt la liste, et on compare les couples d'lments successifs. Lorsque deux lments successifs ne sont pas dans l'ordre croissant, ils sont changs. Aprs chaque parcours complet de la liste, l'algorithme recommence l'opration. Lorsque aucun change n'a lieu pendant un parcours, cela signifie que la liste est trie : l'algorithme peut s'arrter. (comme une bulle qui remonte la surface d'un liquide).

33

Algorithmique & Programmation : Langage C

Tri par propagation ou par bulle (bubble sort) :

34

Algorithmique & Programmation : Langage C

Tri par propagation ou par bulle (bubble sort) :


Prenons la liste de chiffres suivante "5 1 4 2 8" et trions-la de manire croissante en utilisant l'algorithme de tri bulles. Premire tape: ( 5 1 4 2 8 ) ( 1 5 4 2 8 ) Ici, l'algorithme compare les deux premiers lments (5 et 1) et les intervertit. (15428) (14528) (14528) (14258) (14258) (14258) Deuxime tape: Troisime tape: (14258) (14258) (12458) (12458) (14258) (12458) (12458) (12458) (12458) (12458) (12458) (12458) (12458) (12458) (12458) (12458)
35

Algorithmique & Programmation : Langage C

Les tableaux : algorithmes de Tri


Exercice 2 : Ecrire un programme permettant de raliser le tri par bulle des lments dun tableau dentiers selon lordre croissant ?

36

Algorithmique & Programmation : Langage C

Les tableaux : algorithmes de Tri

Tri par insertion :


Problme : Classer les lments d'un tableau A par ordre croissant. Principe : on suppose les i-1 premiers lments tris. On prend le i me lment, et on essaie de le mettre sa place dans les lments dj tris. Et on continue jusqu' i=N. Pour classer le i me lment du tableau A, on regarde successivement en marche arrire partir du i-1me . On dcale les lments visits vers la droite pour pouvoir mettre A[i] sa juste place. Dcaler les lments du tableau pour insrer l'lment considr sa place dans la partie dj trie.
37

Algorithmique & Programmation : Langage C

Les tableaux : algorithmes de Tri Algorithme de Tri par Insertion :


DEBUT Const N=/*Valeur positive*/ Var Tab: tableau(1..N) entier Aux,i,k : entier Pour i<---2 N faire Aux <--- Tab[i] k <--- i Tantque(k>1 et Tab[k-1]>Aux) faire Tab[k] <--- Tab[k-1] k <--- k-1 FinTantque Tab[k] <--- Aux FinPour FIN
38

Algorithmique & Programmation : Langage C

Les tableaux : algorithmes de Tri


Tri par insertion : Exercice 4 : Ecrire un programme permettant de raliser le tri par insertion des lments dun tableau dentiers selon lordre croissant ?
39

Algorithmique & Programmation : Langage C

Les tableaux : algorithmes de Tri


Tri par fusion :
Problme : Classer les lments d'un tableau A par ordre croissant. Principe :
1) 2) 3)

On dcoupe en deux parties peu prs gales les donnes trier On trie les donnes de chaque partie On fusionne les deux parties

40

Algorithmique & Programmation : Langage C

Les tableaux : algorithmes de Tri


Tri par fusion : Fusionner [1;2;5] et [3;4] : On sait que le premier lment de la liste fusionne sera le premier lment d'une des deux listes d'entre (soit 1, soit 3), proprit non remarquable sur des listes non tries. On compare donc 1 et 3 1 est plus petit. [2;5] - [3;4] [1] On compare 2 et 3 2 est plus petit. [5] - [3;4] [1;2] On compare 5 et 3 3 est plus petit. [5] - [4] [1;2;3] On compare 5 et 4 4 est plus petit. [5] [1;2;3;4] [1;2;3;4;5]
41

Algorithmique & Programmation : Langage C

Tri par fusion :

42

Algorithmique & Programmation : Langage C

Les tableaux : algorithmes de Tri


Exercice 3 : On dispose de deux tableaux A et B (de dimensions respectives N et M), tris par ordre croissant. Fusionner les lments de A et B de faon obtenir un seul tableau tri selon lordre croissant ? Exercice 4 : Ecrire un programme permettant de raliser le tri par fusion dun tableau dentiers selon lordre croissant ?

43

Algorithmique & Programmation : Langage C

Les tableaux : algorithmes de Tri


Tri rapide :
Problme : Classer les lments d'un tableau A par ordre croissant. Principe : On place un lment d'un tableau trier (pivot) sa place dfinitive en permutant tous les lments de telle sorte que tous ceux qui lui sont infrieurs soient sa gauche et que tous ceux qui lui sont suprieurs soient sa droite. Cette opration s'appelle le partitionnement. Pour chacun des sous-tableaux, on dfinit un nouveau pivot et on rpte l'opration de partitionnement. Ce processus est rpt rcursivement, jusqu' ce que l'ensemble des lments soit tri.

44

Algorithmique & Programmation : Langage C

Tri rapide :

45

Algorithmique & Programmation : Langage C

Algorithme de Tri rapide :


Tri_rapide(a, gauche, droite) tant que droite-gauche+1 > 1 slectionner une valeur de pivot a[pivotIndex] pivotNewIndex := partition(a, gauche, droit, pivotIndex) si pivotNewIndex-1 - gauche < droit - (pivotNewIndex+1) tri_rapide(a, gauche, pivotNewIndex-1) gauche := pivotNewIndex+1 sinon tri_rapide(a, pivotNewIndex+1, droit) droit := pivotNewIndex-1 fin_si fin_tant_que
46

Algorithmique & Programmation : Langage C

Les tableaux : algorithmes de Tri


Exercice 5 : Ecrire un programme permettant de raliser le tri rapide dun tableau dentiers selon lordre croissant ?

47

Algorithmique & Programmation : Langage C

Les tableaux : algorithmes de Recherches Recherche squentielle :


Principe : Lire le tableau du dbut vers la fin. Si le tableau n'est pas tri, arriver en fin du tableau signifie que l'lment n'existe pas, dans un tableau tri le premier lment trouv suprieur l'lment recherch permet d'arrter la recherche, de plus cette position correspond celle o il faudrait insrer l'lment cherch pour garder un tableau tri.

48

Algorithmique & Programmation : Langage C

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

Algorithmique & Programmation : Langage C

Les tableaux : algorithmes de Recherches Recherche dichotomique :


Dans le cas d'un tableau tri, en cherchant limiter l'espace de recherche. On compare la valeur cherche l'lment central du tableau, si ce n'est pas la bonne, un test permet de trouver dans quelle moiti du tableau on trouvera la valeur. On continue rcursivement jusqu' un sous-tableau de taille 1.

50

Algorithmique & Programmation : Langage C

Les tableaux : algorithmes de Recherches Algorithme dichotomie :


//dclarations dbut, fin, val, mil : Entier t : Tableau [0..100] d'entier trouv : Boolen //initialisation dbut <- 0 fin <- 100 trouv <- faux //Question Rpter Afficher "Valeur recherche ? (entre 0 et 100) Saisir val Jusqu' dbut<=val et val<=fin //Boucle de recherche Rpter mil <- dbut + ((fin-dbut) / 2) Si t[mil] = val alors trouv <- vrai Sinon Si val > t[mil] Alors dbut <- mil + 1 Si t[dbut] = val Alors mil <- dbut trouv <- Vrai FinSi Sinon fin <- mil 1 Si t[fin] = val Alors mil <- fin trouv <- vrai FinSi FinSi FinSi Jusqu trouv ou ( dbut >= fin )
51

Algorithmique & Programmation : Langage C

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

Algorithmique & Programmation : Langage C

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

Algorithmique & Programmation : Langage C

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

Algorithmique & Programmation : Langage C

Intrt des pointeurs


Les pointeurs ont un grand nombre d'intrts : manipuler des donnes pouvant tre importantes (au lieu de passer une fonction un lment trs grand (en taille) : fournir un pointeur vers cet lment...) Les tableaux ne permettent de stocker qu'un nombre fix d'lments de mme type. En stockant des pointeurs dans les cases d'un tableau, il sera possible de stocker des lments de taille diverse, rajouter des lments au tableau en cours d'utilisation (notion de tableau dynamique qui est trs troitement lie celle de pointeur) crer des structures chanes, c'est--dire comportant des maillons

55

Algorithmique & Programmation : Langage C

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

Algorithmique & Programmation : Langage C

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

Algorithmique & Programmation : Langage C

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

Algorithmique & Programmation : Langage C

Les pointeurs
Les critures suivantes sont quivalentes : *tab Tab *(tab+i) (tab+i) tab[0] ; &tab[0] ; tab[i] ; &tab[i] ;

59

Algorithmique & Programmation : Langage C

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

Algorithmique & Programmation : Langage C

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 :

Algorithmique & Programmation : Langage C

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

Algorithmique & Programmation : Langage C

Excution : X=7 y=5 X=7 y=5

Algorithmique & Programmation : Langage C

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.

Exemple : fonction malloc de la bibliothque <malloc.h> Char *c ; C=(char *)malloc(sizeof(char)*10)


64

Les pointeurs

Algorithmique & Programmation : Langage C

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

Algorithmique & Programmation : Langage C

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

Algorithmique & Programmation : Langage C

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:

Algorithmique & Programmation : Langage C

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

Algorithmique & Programmation : Langage C

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

Algorithmique & Programmation : Langage C

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 :

int ftell (FILE * fichier) ; Exemple :


#include <stdio.h> FILE* fichier; int pos; pos=ftell(fichier);
80

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

Algorithmique & Programmation : Langage C

Les types composs


typedef int entier ; /* on dfinit un nouveau type "entier" synonyme de "int" */ typedef int vecteur[3]; Exemple :
#include <stdio.h> typedef int entier; typedef float point[2]; void main() { entier n = 6; point xy; xy[0] = 8.6; xy[1] = -9.45; etc ... }
95

/* on dfinit un nouveau type "vecteur" synonyme */ /* de "tableau de 3 entiers" */

Algorithmique & Programmation : Langage C

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;

N.B: une structure peut contenir une autre structure.


96

Algorithmique & Programmation : Langage C

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

Algorithmique & Programmation : Langage C

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

Algorithmique & Programmation : Langage C

Les structures et les tableaux


Une structure peut contenir des tableau. Un tableau peut contenir des structures.

Exemples :

typedef struct { char nom[10]; char prenom[10]; int age; float note; } fiche;
99

/* On dfinit un type struct */

Algorithmique & Programmation : Langage C

Les structures et les tableaux


Exemples :
fiche f[10]; Utilisation: strcpy(f[i].nom,"DUPONT") strcpy(f[i].prenom,"JEAN"); f[i].age = 20; f[i].note = 11.5; /* on dclare un tableau de 10 fiches */

100

Algorithmique & Programmation : Langage C

Les structures : Exercices


Exercice 1 :
Crer une structure point {int num; float x; float y;} Saisir des points, les ranger dans un tableau puis les afficher. Calculer la distance entre 2 points saisis ? Utiliser deux fonctions : lune pour la lecture des donnes et lautre pour laffichage.

101

Algorithmique & Programmation : Langage C

Les structures : Exercices


Exercice 2 : Ecrire un programme qui permet de dfinir une structure de donnes regroupant toutes les informations (Nom, Prenom, CIN, CC1(40%), CC2(60%), Moy, Resultat) pour N tudiants. Ajouter une fonction qui permet de trouver ltudiant qui a la 1re note et celui qui a la dernire note. La variable Resultat est de type Char qui prend les valeurs : V si Moy >= 10 Valid R si 8 <= Moy < 10 Rattrapage N si Moy < 8 Non valid
102

Algorithmique & Programmation : Langage C

Les structures : exercices


Sujet de Travaux Pratiques N1 : On se propose de raliser un rpertoire dadresses : un rpertoire est un ensemble dinformation dont chaque lment possde les informations suivantes : Contact : Nom*, Prnom*, Lien de parent, adresse, Tl.dom, Tl.entreprise, GSM*, email* Adresse : NumroRue, Nom Rue, Code Postal, Ville, Pays.
Le lien de parent est un indice de la liste suivante : 0 : Mre 1 : Pre 2 : Sur
103

3 : Frre 4 : cousin 5 : Parent

6 : Ami 7 : Relation personnelle 8 : Relation professionnelle

Algorithmique & Programmation : Langage C

Les structures : exercices


Les informations indiques par * sont obligatoires 1) 2) 3) 4) 5) 6) 7) 8) 9) Fonctions programmer : Ajouter un contact Afficher la liste des contacts Consulter un contact Modifier un contact Supprimer un contact Recherche par Nom Recherche multicritre : Nom, Prnom, Ville, Amlioration : lajout doit vrifier si le contact existe dj.
104

Algorithmique & Programmation : Langage C

Les structures : exercices


Sujet de Travaux Pratiques N2 : Gestion dun compte bancaire Chaque client est identifi par : nom, prnom, numro du compte (type long), solde(type double) ; Dfinir la structure compte. Implmenter les fonctions suivantes : Une fonction char menu () ; qui affiche les choix suivants : Printf(_______Ajouter un compte ______ A\n) ; Printf(_______Supprimer un compte ______S\n) ; Printf(_______Oprations sur un compte ______ O\n) ; Printf( * Affichage A\n) ; Printf( * virement V\n) ; Printf( * Retrait R\n) ; Printf(_______lister les dbiteurs ______D\n) ; Printf(_______Lister les comptes ______L\n) ; Printf(_______Quitter ______Q\n) ; Printf(Entrer votre choix : ) ;
105

Algorithmique & Programmation : Langage C

Les structures : exercices


Ajouter :
Une fonction char sous_menu() qui retourne le choix de lutilisateur et qui affiche : Printf( ** Affichage ** A\n) ; Printf( ** virement** V\n) ; Printf( ** Retrait** R\n) ; Printf( *pour quitter taper** Q\n) ; Printf(Entrer votre choix : ) ; Une fonction void saisir () qui permet de saisir toutes les infos dun client. Une fonction void Afficher(compte T_compte [], Long num_compte ) ; Une fonction void Ajouter (compte T_compte [], compte C) ;
106

Algorithmique & Programmation : Langage C

Les structures : exercices


Une fonction int position(long num) ; si le compte est trouv la fonction retourne la position du compte dans le tableau, sinon elle retourne -1 ; Une fonction void operation (compte T_compte[]) ; qui fait appel aux fonctions (verser(),ajouter() et afficher suivant le choix, cest dans cette fonction quon fait appel au sous_menu() ;). Une fonction void verser (long num_compte, double solde) ; Une fonction void retirer (long num_compte, double solde) ; Une fonction : void lister_debiteurs(compte T_compte[]) ;pour lister les dbiteurs(on fait appel la fonction afficher() pour les afficher.) Une fonction : void lister_comptes(compte T_compte[]) ;pour lister tous les comptes.
107