Vous êtes sur la page 1sur 27

M1.2 SDI

Leçon n° 2 Compléments C

M1.2 SDI Leçon n ° 2 – Compléments C STRUCTURES DE DONNÉES Université Med V Souissi
STRUCTURES DE DONNÉES
STRUCTURES
DE
DONNÉES

Université Med V Souissi

Prof. A. EL FAKER © ENSIAS 2008

M1.2 SDI

Leçon n° 2 Compléments C

M1.2 SDI Leçon n ° 2 – Compléments C COMPLEMENT C Fonctions Prof. A. EL FAKER
COMPLEMENT C Fonctions
COMPLEMENT C
Fonctions

Prof. A. EL FAKER © ENSIAS 2008

M1.2 SDI

Leçon n° 2 Compléments C

Fonctions en C Définition
Fonctions en C
Définition
n ° 2 – Compléments C Fonctions en C Définition int f ( int tab [

int f(int tab[],int n,int x)

{ for(int i=0; i<n; i++) if(x == tab[i]) return 1; return 0; } f est
{
for(int i=0; i<n; i++)
if(x == tab[i]) return 1;
return 0;
}
f est une adresse
int (* f) (int [],int,int) )
int (* f) (int [],int,int) )

Prof. A. EL FAKER © ENSIAS 2008

M1.2 SDI

Leçon n° 2 Compléments C

Fonctions en C Déclaration
Fonctions en C
Déclaration
n ° 2 – Compléments C Fonctions en C Déclaration int f ( int tab [

int f(int tab[],int n,int x)

en C Déclaration int f ( int tab [ ], int n, int x) int f

int f(int [],int ,int)

Avertir le compilateur Faciliter la documentation
Faciliter la documentationAvertir le compilateur

x) int f ( int [ ], int , int ) Avertir le compilateur Faciliter la
x) int f ( int [ ], int , int ) Avertir le compilateur Faciliter la
x) int f ( int [ ], int , int ) Avertir le compilateur Faciliter la
x) int f ( int [ ], int , int ) Avertir le compilateur Faciliter la
x) int f ( int [ ], int , int ) Avertir le compilateur Faciliter la
x) int f ( int [ ], int , int ) Avertir le compilateur Faciliter la

Prof. A. EL FAKER © ENSIAS 2008

M1.2 SDI

Leçon n° 2 Compléments C

Fonctions en C Type de retour
Fonctions en C
Type de retour

int f() ;

// Par défaut

void f() ; // Ne renvoie aucune valeur

Par défaut void f ( … ) ; // Ne renvoie aucune valeur int [] Pas

int []

Pas de tableau/

fonction/structure

aucune valeur int [] Pas de tableau/ fonction/structure Mais peut être un pointeur article * saisie(void)
Mais peut être un pointeur article * saisie(void) { article a; scanf(“%s”,a.design);… return (&a); }
Mais peut
être un
pointeur
article * saisie(void) {
article a;
scanf(“%s”,a.design);…
return (&a);
}
article * saisie(void) { article a; scanf(“%s”,a.design);… return (&a); } Prof. A. EL FAKER © ENSIAS
article * saisie(void) { article a; scanf(“%s”,a.design);… return (&a); } Prof. A. EL FAKER © ENSIAS

Prof. A. EL FAKER © ENSIAS 2008

M1.2 SDI

Leçon n° 2 Compléments C

M1.2 SDI Leçon n ° 2 – Compléments C Passage de paramètres entre fonctions Prof. A.
Passage de paramètres entre fonctions
Passage de
paramètres entre
fonctions

Prof. A. EL FAKER © ENSIAS 2008

M1.2 SDI

Leçon n° 2 Compléments C

Passage de paramètres Transmission par valeur
Passage de paramètres
Transmission par valeur

void echange(int a, int b){ int c =a; a=b; b=c;

}

main(){ int n=10, m=20; echange(n,m);

}

Pour permettre la modification d'un objet on doit passer son adresse et non une copie
Pour permettre la modification d'un
objet on doit passer son adresse et
non une copie de sa valeur
10 20
10
20
10 20
10
20
d'un objet on doit passer son adresse et non une copie de sa valeur 10 20
d'un objet on doit passer son adresse et non une copie de sa valeur 10 20

Prof. A. EL FAKER © ENSIAS 2008

M1.2 SDI

Leçon n° 2 Compléments C

Passage de paramètres Transmission par adresse
Passage de paramètres
Transmission par adresse

void echange(int *pa, int *pb){ int c =*pa; *pa=*pb; *pb=*c;}

main(){

int n=10, m=20; echange(&n,&m);

}

*pb=*c;} main(){ int n=10, m=20; echange( & n, & m); } 10 20 20 10 Prof.
*pb=*c;} main(){ int n=10, m=20; echange( & n, & m); } 10 20 20 10 Prof.
*pb=*c;} main(){ int n=10, m=20; echange( & n, & m); } 10 20 20 10 Prof.
*pb=*c;} main(){ int n=10, m=20; echange( & n, & m); } 10 20 20 10 Prof.
10 20
10
20
20 10
20
10

Prof. A. EL FAKER © ENSIAS 2008

M1.2 SDI

Leçon n° 2 Compléments C

Passage de paramètres
Passage de paramètres
Transmission par adresse  Pour les structures et les fonctions
Transmission par adresse
 Pour les structures et les fonctions

float prixTotalHT(article *p,int q) { return (p->prixUnit * q);

}

double sqr(double x) {return x*x;}

void show( double (*f) () ) {

for (int i=0 ; i< 10 ; i++) printf("%d %e \n",i,f((double) i));

}

main(){ show(sqr); }

i< 10 ; i++) printf("%d %e \n",i, f ((double) i)); } main(){ show(sqr); } Prof. A.
i< 10 ; i++) printf("%d %e \n",i, f ((double) i)); } main(){ show(sqr); } Prof. A.

Prof. A. EL FAKER © ENSIAS 2008

M1.2 SDI

Leçon n° 2 Compléments C

Pointeurs et tableaux Exercice
Pointeurs et tableaux
Exercice
a 6 3 4
a
6
3
4
b 2 12 7 21 53 5 20
b
2
12
7
21
53
5
20
Produit scalaire
Produit scalaire

int prodsc(int *a, int *b, int n){ for( int i=0,s=0; i<n ; i++) s += a[i] * b[i] ; return s;

}

On passe des pointeurs
On passe des pointeurs

Prof. A. EL FAKER © ENSIAS 2008

M1.2 SDI

Leçon n° 2 Compléments C

M1.2 SDI Leçon n ° 2 – Compléments C CHAÎNES DE CARACTÈRES Prof. A. EL FAKER
CHAÎNES DE CARACTÈRES
CHAÎNES
DE CARACTÈRES

Prof. A. EL FAKER © ENSIAS 2008

M1.2 SDI

Leçon n° 2 Compléments C

Chaines de caractères Définition Tableau de caractères
Chaines de caractères
Définition
Tableau de caractères

terminé par \0’

Définition Tableau de caractères terminé par ‘ \ 0’ char chaine[ ] = "MONT"; chaine ‘M’
Définition Tableau de caractères terminé par ‘ \ 0’ char chaine[ ] = "MONT"; chaine ‘M’

char chaine[ ] = "MONT";

chaine
chaine

‘M’

‘O’

‘N’

‘T’

\0’

] = "MONT"; chaine ‘M’ ‘O’ ‘N’ ‘T’ ‘ \ 0’ Prof. A. EL FAKER ©
] = "MONT"; chaine ‘M’ ‘O’ ‘N’ ‘T’ ‘ \ 0’ Prof. A. EL FAKER ©
] = "MONT"; chaine ‘M’ ‘O’ ‘N’ ‘T’ ‘ \ 0’ Prof. A. EL FAKER ©
] = "MONT"; chaine ‘M’ ‘O’ ‘N’ ‘T’ ‘ \ 0’ Prof. A. EL FAKER ©

Prof. A. EL FAKER © ENSIAS 2008

M1.2 SDI

Leçon n° 2 Compléments C

Chaines de caractères Pourquoi les chaînes sont-elle
Chaines de caractères
Pourquoi les chaînes sont-elle

particulières

caractères Pourquoi les chaînes sont-elle particulières Parce que le langage fournit des chaînes de caractères
caractères Pourquoi les chaînes sont-elle particulières Parce que le langage fournit des chaînes de caractères

Parce que le langage fournit des chaînes de caractères littérales

Un tableau anonyme de caractères de classe statique

"MONT"

littérales  Un tableau anonyme de caractères de classe statique "MONT" Prof. A. EL FAKER ©
littérales  Un tableau anonyme de caractères de classe statique "MONT" Prof. A. EL FAKER ©
littérales  Un tableau anonyme de caractères de classe statique "MONT" Prof. A. EL FAKER ©
littérales  Un tableau anonyme de caractères de classe statique "MONT" Prof. A. EL FAKER ©

Prof. A. EL FAKER © ENSIAS 2008

M1.2 SDI

Leçon n° 2 Compléments C

Chaines de caractères char *p= "MONT"; //correcte
Chaines de caractères
char *p= "MONT"; //correcte
 "MONT" est convertit en pointeur vers ‘M’ qui affecte la valeur de p p
 "MONT" est convertit en pointeur
vers ‘M’ qui affecte la valeur de p
p
M
O
N
T „\0‟
convertit en pointeur vers ‘M’ qui affecte la valeur de p p M O N T
convertit en pointeur vers ‘M’ qui affecte la valeur de p p M O N T
convertit en pointeur vers ‘M’ qui affecte la valeur de p p M O N T
convertit en pointeur vers ‘M’ qui affecte la valeur de p p M O N T

Prof. A. EL FAKER © ENSIAS 2008

M1.2 SDI

Leçon n° 2 Compléments C

Chaines de caractères  Mais une règle à respecter
Chaines de caractères
 Mais une règle à respecter

La modification d’une chaîne littérale est interdite

char *p = "MONT"; p[0] = „P‟ ; printf("MONT"); //Interdit
char *p = "MONT";
p[0] = „P‟ ;
printf("MONT");
//Interdit
p P O N T „\0‟
p
P
O
N
T „\0‟
p[0] = „P‟ ; printf("MONT"); //Interdit p P O N T „\0‟ Prof. A. EL FAKER
p[0] = „P‟ ; printf("MONT"); //Interdit p P O N T „\0‟ Prof. A. EL FAKER
p[0] = „P‟ ; printf("MONT"); //Interdit p P O N T „\0‟ Prof. A. EL FAKER
p[0] = „P‟ ; printf("MONT"); //Interdit p P O N T „\0‟ Prof. A. EL FAKER

Prof. A. EL FAKER © ENSIAS 2008

M1.2 SDI

Leçon n° 2 Compléments C

Entrées/sorties de chaînes Perroquet: exécution
Entrées/sorties de chaînes
Perroquet: exécution

Une première ligne

Une première ligne

Une seconde Une seconde Et la dernière ligne ^z

Et la dernière ligne

ligne Une seconde Une seconde Et la dernière ligne ^z Et la dernière ligne Prof. A.
ligne Une seconde Une seconde Et la dernière ligne ^z Et la dernière ligne Prof. A.
ligne Une seconde Une seconde Et la dernière ligne ^z Et la dernière ligne Prof. A.
ligne Une seconde Une seconde Et la dernière ligne ^z Et la dernière ligne Prof. A.

Prof. A. EL FAKER © ENSIAS 2008

M1.2 SDI

Leçon n° 2 Compléments C

Entrées/sorties de chaînes Perroquet: main
Entrées/sorties de chaînes
Perroquet: main

#include<stdio.h>

#include<stdef.h>

main( ) {

#include<stdio.h> #include<stdef.h> main( ) { if( gets (chaine) != NULL) puts (chaine); }

if( gets (chaine) != NULL)

puts (chaine);

}

#include<stdef.h> main( ) { if( gets (chaine) != NULL) puts (chaine); } Prof. A. EL FAKER
#include<stdef.h> main( ) { if( gets (chaine) != NULL) puts (chaine); } Prof. A. EL FAKER
#include<stdef.h> main( ) { if( gets (chaine) != NULL) puts (chaine); } Prof. A. EL FAKER
#include<stdef.h> main( ) { if( gets (chaine) != NULL) puts (chaine); } Prof. A. EL FAKER

Prof. A. EL FAKER © ENSIAS 2008

M1.2 SDI

Leçon n° 2 Compléments C

Entrées/sorties de chaînes char chaine[81];
Entrées/sorties de chaînes
char chaine[81];

if(

if( != NULL)

!= NULL)

 Remplace ‘\n’ par ‘\0’  Retourne NULL si erreur  Suppose que l’allocation est
 Remplace ‘\n’ par ‘\0’
 Retourne NULL si erreur
 Suppose que l’allocation est déjà faite

scanf("%s", ch) gets(ch)

 S’arrête au premier ESPACE
 S’arrête au premier ESPACE

puts(ch) printf("%s\n", ch)

 gets(ch)  S’arrête au premier ESPACE puts(ch)  printf("%s\n", ch) Prof. A. EL FAKER ©
 gets(ch)  S’arrête au premier ESPACE puts(ch)  printf("%s\n", ch) Prof. A. EL FAKER ©
 gets(ch)  S’arrête au premier ESPACE puts(ch)  printf("%s\n", ch) Prof. A. EL FAKER ©
 gets(ch)  S’arrête au premier ESPACE puts(ch)  printf("%s\n", ch) Prof. A. EL FAKER ©

Prof. A. EL FAKER © ENSIAS 2008

M1.2 SDI

Leçon n° 2 Compléments C

Traitement des chaînes Copie de chaînes
Traitement des chaînes
Copie de chaînes

Char *strcpy(char * s1, const char *s2 );

Utilisation
Utilisation
#include<string.h> main( ){ char s1[120], s2[81]; // …… s2 …… // recopie s2 dans s1

#include<string.h>

main( ){ char s1[120], s2[81]; // …… s2 ……

// recopie s2 dans s1

strcpy(s1,s2);

}

#include<string.h> main( ){ char s1[120], s2[81]; // …… s2 …… // recopie s2 dans s1 strcpy

Prof. A. EL FAKER © ENSIAS 2008

M1.2 SDI

Leçon n° 2 Compléments C

Traitement des chaînes Comparaison de chaînes
Traitement des chaînes
Comparaison de chaînes

int strcmp(const char * s1, const char *s2 );

Utilisation #define identique(s1,s2) \ (! strcmp( (s1), (s2))
Utilisation
#define identique(s1,s2) \
(! strcmp( (s1), (s2))
* s1, const char *s2 ); Utilisation #define identique(s1,s2) \ (! strcmp( (s1), (s2)) Prof. A.
* s1, const char *s2 ); Utilisation #define identique(s1,s2) \ (! strcmp( (s1), (s2)) Prof. A.
* s1, const char *s2 ); Utilisation #define identique(s1,s2) \ (! strcmp( (s1), (s2)) Prof. A.
* s1, const char *s2 ); Utilisation #define identique(s1,s2) \ (! strcmp( (s1), (s2)) Prof. A.

Prof. A. EL FAKER © ENSIAS 2008

M1.2 SDI

Leçon n° 2 Compléments C

Traitement des chaînes Pour toutes les fonctions …
Traitement des chaînes
Pour toutes les fonctions …
C Traitement des chaînes Pour toutes les fonctions …  Prototypes déclarés dans: string.h  Supposent

Prototypes déclarés dans: string.h Supposent que les chaînes

déclarés dans: string.h  Supposent que les chaînes ● Sont convenablement allouées ● Se terminent par
● Sont convenablement allouées ● Se terminent par ‘\0’
● Sont convenablement allouées
● Se terminent par ‘\0’
que les chaînes ● Sont convenablement allouées ● Se terminent par ‘\0’ Prof. A. EL FAKER
que les chaînes ● Sont convenablement allouées ● Se terminent par ‘\0’ Prof. A. EL FAKER
que les chaînes ● Sont convenablement allouées ● Se terminent par ‘\0’ Prof. A. EL FAKER
que les chaînes ● Sont convenablement allouées ● Se terminent par ‘\0’ Prof. A. EL FAKER

Prof. A. EL FAKER © ENSIAS 2008

M1.2 SDI

Leçon n° 2 Compléments C

STRUCTURES en C
STRUCTURES
en C

Prof. A. EL FAKER © ENSIAS 2008

M1.2 SDI

Leçon n° 2 Compléments C

STRUCTURES en C Enregistrements
STRUCTURES en C
Enregistrements
Une pure abstration
Une pure abstration
struct article { int code; char design[25]; float prixUnit; int quantite; } ; struct article

struct article { int

code;

char

design[25];

float

prixUnit;

int

quantite;

}

;

struct article tv;

struct article { int code; char design[25]; float prixUnit; int quantite; } ; struct article tv;
design[25]; float prixUnit; int quantite; } ; struct article tv; Prof. A. EL FAKER © ENSIAS
design[25]; float prixUnit; int quantite; } ; struct article tv; Prof. A. EL FAKER © ENSIAS

Prof. A. EL FAKER © ENSIAS 2008

M1.2 SDI

Leçon n° 2 Compléments C

STRUCTURES en C Enregistrements
STRUCTURES en C
Enregistrements
Un nouveau type
Un nouveau type
typedef struct article { int code; char design[25]; prixUnit; quantite; float int } article ;

typedef struct article {

int

code;

char

design[25];

prixUnit;

quantite;

float int } article;

article tv, *p;

typedef struct article { int code; char design[25]; prixUnit; quantite; float int } article ; article
design[25]; prixUnit; quantite; float int } article ; article tv, *p; Prof. A. EL FAKER ©
design[25]; prixUnit; quantite; float int } article ; article tv, *p; Prof. A. EL FAKER ©

Prof. A. EL FAKER © ENSIAS 2008

M1.2 SDI

Leçon n° 2 Compléments C

STRUCTURES en C
STRUCTURES en C
Accès aux champs Un nouveau type article tv, *p; tv . code =23798;  Accès
Accès aux champs
Un nouveau type
article tv, *p;
tv . code =23798;
 Accès par valeur
p = & tv
;
p -> prixUnit = 989.50;
 Accès par adresse
code
prixUnit
23798
989.50
p
tv

Prof. A. EL FAKER © ENSIAS 2008

M1.2 SDI

Leçon n° 2 Compléments C

STRUCTURES en C
STRUCTURES en C
Affectation  OK
Affectation
 OK

article a; article copie; copie = a;

23798 989.50 23798 989.50 a copie
23798 989.50
23798
989.50
a
copie

Comparaison

 NON … pourquoi ?
 NON … pourquoi ?
989.50 23798 989.50 a copie C o m p a r a i s o n
989.50 23798 989.50 a copie C o m p a r a i s o n
989.50 23798 989.50 a copie C o m p a r a i s o n
989.50 23798 989.50 a copie C o m p a r a i s o n

Prof. A. EL FAKER © ENSIAS 2008

M1.2 SDI

Leçon n° 2 Compléments C

STRUCTURES en C Contraintes d’alignement
STRUCTURES en C
Contraintes d’alignement
 Pour optimiser le temps d’accès mémoire
 Pour optimiser le temps d’accès mémoire

Espaces ajoutés par des compilateurs

2 i prixUnit code design quantite tv
2
i
prixUnit
code
design
quantite
tv
mémoire Espaces ajoutés par des compilateurs 2 i prixUnit code design quantite tv Prof. A. EL
mémoire Espaces ajoutés par des compilateurs 2 i prixUnit code design quantite tv Prof. A. EL
mémoire Espaces ajoutés par des compilateurs 2 i prixUnit code design quantite tv Prof. A. EL
mémoire Espaces ajoutés par des compilateurs 2 i prixUnit code design quantite tv Prof. A. EL

Prof. A. EL FAKER © ENSIAS 2008