Académique Documents
Professionnel Documents
Culture Documents
SDD M3-Etd
SDD M3-Etd
EN LANGAGE C
Une seule de ces fonctions existe obligatoirement; c’est la fonction principale appelée main. Cette
fonction principale peut, éventuellement, appeler une ou plusieurs fonctions secondaires.
La définition d’une fonction est la donnée du texte de son algorithme, qu’on appelle corps de la fonction.
Elle est de la forme :
type nom-fonction ( type-1 arg-1,..., type-n arg-n)
{
[ déclarations de variables locales ]
liste d’instructions
}
arg-1,..., arg-n : les arguments de la fonction sont appelés paramètres formels.
Par opposition aux paramètres effectifs qui sont les paramètres avec lesquels la fonction est effectivement
appelée.
3
Dr MAHAMAT HABIB SENOUSSI HISSEIN
EXEMPLES DE PROTOTYPES ET DÉFINITIONS
Exemples de définitions
On appelle procédure ou fonction sans retour, toutes fonctions ayant le type void comme type
de retour.
Exemple :
void ma_fonction(....);
void affiche_n_hello(int n)
{
int i;
for (i=0; i<n; i++)
printf("hello");
return;
}
L’ordre et le type des paramètres effectifs de la fonction doivent concorder avec ceux donnés dans
l’en-tête de la fonction.
9
Dr MAHAMAT HABIB SENOUSSI HISSEIN
EXEMPLE FONCTIONS
void echange (int a, int b)
{ imprime
int t; début programme principal :
printf("début fonction :\n a = %d \t b = %d\n", a, b);
a=2b=5
t = a;
début fonction :
a = b;
b = t; a=2b=5
printf("fin fonction :\n a = %d \t b = %d\n", a, b); fin fonction :
return; a=5b=2
}
main()
{
int a = 2, b = 5;
printf("debut programme principal :\n a = %d \t b = %d\n", a, b);
echange(a, b);
printf("fin programme principal :\n a = %d \t b = %d\n", a, b);
}
Dr MAHAMAT HABIB SENOUSSI HISSEIN 10
EXEMPLE FONCTIONS
#include <stdio.h>
La valeur de k est 30
11
Dr MAHAMAT HABIB SENOUSSI HISSEIN
LE PASSAGE DE PARAMÈTRES
Lors de l’appel d’un sous-programme, il est possible de transmettre des données du module
appelant vers
❖ le passage par valeur : seule une copie des valeurs des paramètres effectifs est reçue par
le sous programme,
❖ le passage par adresse : l’adresse en mémoire du paramètre effectif est reçue par
le sous programme.
12
Dr MAHAMAT HABIB SENOUSSI HISSEIN
LE PASSAGE PAR VALEUR
void permuter(int a, int b)
{
int temp;
printf ("Avant permutation la valeur de a est %d et de b est %d",a,b) ;
temp =a ;
a=b ;
b= temp ;
printf ("Après permutation la valeur de a est %d et de b est %d",a,b) ;
}
Void main( )
{
int a = 10 ;
int b = 200 ;
permuter (a, b) ;
printf ("la valeur de a est %d et de b est %d",x,y) ;
}
13
Dr MAHAMAT HABIB SENOUSSI HISSEIN
LE PASSAGE PAR ADRESSE
Dans ce type de passage, la procédure utilise l'adresse du paramètre effectif.
Lorsqu'on utilise l'adresse du paramètre, on accède directement à son contenu. La
valeur de la variable effectif sera donc modifiée.
#include <stdio.h>
#include <stdlib.h>
void Echange(int *p1, int *p2)
{
int temp = *p1;
*p1 = *p2;
*p2 = temp;
}
void main()
{
int n=2, m=5;
Echange(&n, &m);
printf("n=%d \t m=%d \n",n,m);
}
14
Dr MAHAMAT HABIB SENOUSSI HISSEIN
PASSER UN TABLEAU EN PARAMÈTRE D’UNE FONCTION
considérons la fonction suivante, qui prend un tableau comme un argument et leur taille, et elle retourne la
moyenne
15
Dr MAHAMAT HABIB SENOUSSI HISSEIN
TYPES COMPOSÉS : LES TABLEAUX
Un tableau est un ensemble fini d’éléments de même type, stockés en mémoire à des
adresses contiguës.
La déclaration d’un tableau à une dimension se fait de la façon suivante :
type nom-du-tableau[nombre-éléments];
16
Dr MAHAMAT HABIB SENOUSSI HISSEIN
TYPES COMPOSÉS : LES TABLEAUX
Exemple :
int tab[10]; indique que tab est un tableau de 10 éléments de type int.
Cette déclaration alloue donc en mémoire pour l’objet tab un espace de 10 × 4
octets consécutifs.
17
Dr MAHAMAT HABIB SENOUSSI HISSEIN
TYPES COMPOSÉS : LES TABLEAUX
Pour plus de clarté, il est recommande de donner un nom à la constante (nombre-éléments)
par une directive au préprocesseur, par exemple #define
#define nombre-éléments 10
Le programme suivant imprime les éléments du tableau tab :
#define N 10
main()
{
int tab[N];
int i;
for (i = 0; i < N; i++)
printf("tab[%d] = %d\n", i, tab[i], tab[i] = i );
}
18
Dr MAHAMAT HABIB SENOUSSI HISSEIN
TYPES COMPOSÉS : LES TABLEAUX
Notamment, un tableau ne peut pas figurer à gauche d’un opérateur d’affectation.
#define N 10
main()
{
int tab1[N], tab2[N];
int i;
for (i = 0; i < N; i++)
tab1[i] = tab2[i];
}
19
Dr MAHAMAT HABIB SENOUSSI HISSEIN
TYPES COMPOSÉS : LES TABLEAUX
Remarque :
20
Dr MAHAMAT HABIB SENOUSSI HISSEIN
TYPES COMPOSÉS : LES TABLEAUX
On peut initialiser un tableau lors de sa déclaration par une liste de constantes de
la façon suivante :
type nom-du-tableau[N] = { val_1, val_2,...,val_N };
Par exemple, on peut écrire
#define N 4
int tab[N] = {10, 20, 30, 40};
main()
{
int i;
for (i = 0; i < N; i++)
printf("tab[%d] = %d\n", i, tab[i]);
}
21
Dr MAHAMAT HABIB SENOUSSI HISSEIN
TYPES COMPOSÉS : LES TABLEAUX
#define L 2
#define C 3
int tab[L][C] = {{1, 2, 3}, {4, 5, 6}};
main()
{
int i, j;
for (i = 0 ; i < L; i++)
{
for (j = 0; j < C; j++)
printf ("tab[%d][%d]=%d\n", i, j, tab[i][j]);
}
}
24
Dr MAHAMAT HABIB SENOUSSI HISSEIN
DÉCLARATION D'UNE CHAÎNE DE CARACTÈRES
Une chaîne de caractères se déclare sous la forme d'un tableau de caractères de
longueur fixe.
Attention, comme signalé auparavant, ne dépassez pas la longueur du tableau.
Exemple : char ma_chaine [20] ;
permettra d'enregistrer des chaînes de 19 caractères maximum.
25
Dr MAHAMAT HABIB SENOUSSI HISSEIN
DÉCLARATION D'UNE CHAÎNE DE CARACTÈRES
tableau de caractères se termine par ' \0 ’ (backlash 0)
26
Dr MAHAMAT HABIB SENOUSSI HISSEIN
LES TABLEAUX : CHAÎNES DE CARACTÈRES
D'autre part, il est possible de déclarer une chaîne de caractères sans en spécifier
la longueur de départ de la façon suivante :
char chaine [ ] = "info" ; //on ne connaît sa taille que par son contenu
27
Dr MAHAMAT HABIB SENOUSSI HISSEIN
LES TABLEAUX : CHAÎNES DE CARACTÈRES
un tableau de caractères peut être initialisé par une liste de caractères;
le compilateur complète toute chaıne de caractères avec un caractère nul ’\0’.
Il faut donc que le tableau ait au moins un élément de plus que le nombre de caractères de la
chaıne littérale.
#define N 8
char tab[N] = "exemple";
main()
{
int i;
for (i = 0; i < N; i++)
printf("tab[%d] = %c\n", i, tab[i]);
}
Exemple :
char ch[ ] = "info" ;
printf ("La longueur de %s est : %d", ch, strlen (ch)) ;
Exemple :
30
Dr MAHAMAT HABIB SENOUSSI HISSEIN
ACCÈS AUX ÉLÉMENTS D’UN TABLEAU
31
Dr MAHAMAT HABIB SENOUSSI HISSEIN
INITIALISATIONS D’UN TABLEAU
32
Dr MAHAMAT HABIB SENOUSSI HISSEIN
LES STRUCTURES
Une structure contient une ou plusieurs variables groupées sous le même nom pour être traitées
comme une seule entité.
Contrairement aux variables stockées dans un tableau, les variables d’une structure peuvent être de
types différents.
Une structure peut contenir tous les types de données C, y compris les tableaux et les autres
structures.
les différents éléments d’une structure n’occupent pas nécessairement des zones contiguës en
mémoire.
Chaque élément de la structure, appelé membre ou champ, est désigné par un identificateur.
struct Ident_struct
{
type-1 champ-1;
type-2 champ-2;
...
type-n champ-n;
};
34
Dr MAHAMAT HABIB SENOUSSI HISSEIN
DÉCLARATION D’UNE STRUCTURES
Note : Les types des champs d’une structure peuvent aussi être des types
composés, par exemple des tableaux ou des structures.
struct livre
Exemple : struct point
{
char titre[80]; {
char auteur[40]; char nom;
char editeur[40]; float x, y;
char ISBN10[11]; };
int nombre_pages;
int annee_edition;
double prix_chf;
} un_livre ;
35
Dr MAHAMAT HABIB SENOUSSI HISSEIN
DÉCLARATION D’UNE STRUCTURES
Une fois le type de la structure déclarée, on peut utiliser son nom, précédé du mot
struct, comme tout autre type pour déclarer des variables :
struct Nom_du_type nom_de_la_variable;
Exemples :
struct Personne
{
char nom[40];
double taille;
int age;
char sexe;
};
struct Personne untel;
36
Dr MAHAMAT HABIB SENOUSSI HISSEIN
INITIALISATION D’UNE STRUCTURES
Exemple :
struct Patient
{
float taille;
int poids;
int age;
};
struct Patient p1 = { 180.75 , 73, 23 };
37
Dr MAHAMAT HABIB SENOUSSI HISSEIN
UTILISATION DE TYPEDEF
La façon la plus pratique de définir un type « structure » est sûrement d’utiliser conjointement typedef :
Exemples :
{
char nom[ 40];
double taille;
int age;
char sexe;
} Personne untel;
Une structure définie de cette façon pourra alors être utilisée sans avoir besoin d’ajouter « struct »
avant : Personne untel;
Exemple :
typedef struct
{
char nom[40];
double taille;
int age;
char sexe;
} Personne;
Personne untel = {"Tal", 1.90, 18, 'M' };
39
Dr MAHAMAT HABIB SENOUSSI HISSEIN
L’ACCÈS AUX MEMBRES D’UNE STRUCTURE
On peut accéder aux champs d’une structure en utilisant la syntaxe suivante :
Syntaxe : nom_struct.nom_var
Exemples : Exemples :
Initialisation à la déclaration :
struct athlete
struct athlète A1={ "Bolt", "Usain", 23, 9.58};
{
char nom[30] ;
char prenom[30] ; accès aux champs par l’opérateur «.»
float temps ;
};
struct athlete A1, A2, A3 ; /* A1, A2, A3 sont des structures de type athlete */
int main ()
{
personne p;
printf("Veuillez entrer le nom de la personne :");
scanf("%s", p.nom);
printf("Veuillez entrer le prénom de la personne:");
scanf("%s", p.prenom);
printf("Veuillez entrer l’âge de la personne:");
scanf("%d", &p.age); /* ne pas oublier le & !!! */
printf("Voici les caractéristiques de cette personne:\n");
printf("nom=%s\n", p.nom);
printf("prénom=%s\n", p.prenom);
printf("âge=%d\n", p.age);
return 0;
}
42
Dr MAHAMAT HABIB SENOUSSI HISSEIN
LES POINTEURS
Lorsque l’on déclare une variable, par exemple un entier i,
l’ordinateur réserve un espace mémoire pour y stocker la valeur de i
L’emplacement de cet espace dans la mémoire est nommé adresse
Un pointeur est une variable qui permet de stocker une adresse
Par exemple si on déclare une variable entière i (initialisée a 10) et que l’on
déclare un pointeur p dans lequel on range l’adresse de i (on dit que p pointe
sur i), on a par exemple le schéma suivant :
Vous pouvez utiliser l’opérateur d’adresse (&) pour placer dans ptr l’adresse d’une variable
particulière du type convenable (ici int) : ptr = &x;
Par cette instruction, vous rangez dans ptr l’adresse de la variable x. On dit alors que ptr pointe
vers x
45
Dr MAHAMAT HABIB SENOUSSI HISSEIN
INTRODUCTION AUX POINTEURS
La variable x a une adresse en mémoire(dans l’exemple précédent c’est B01C).
Pour manipuler les adresses on définit un nouveau type de variable : les pointeurs
Un pointeur est une variable qui contient l’adresse d’une autre variable. C’est
une adresse typée.
int i , j ;
int *p;
47
Dr MAHAMAT HABIB SENOUSSI HISSEIN
INTRODUCTION AUX POINTEURS
Opérateurs * et &
variable pointée
48
Dr MAHAMAT HABIB SENOUSSI HISSEIN
INTRODUCTION AUX POINTEURS
Opérateurs * et &
i = 10
P = &i; // p pointe sur i
*p = *p+2; // ajoute 2 a i
49
Dr MAHAMAT HABIB SENOUSSI HISSEIN
INTRODUCTION AUX POINTEURS
50
Dr MAHAMAT HABIB SENOUSSI HISSEIN
INTRODUCTION AUX POINTEURS
Pointer sur la case suivante :
p+1 pointe sur le double suivant en mémoire.
double y;
double *p;
p = &y;
51
Dr MAHAMAT HABIB SENOUSSI HISSEIN
INTRODUCTION AUX POINTEURS
52
Dr MAHAMAT HABIB SENOUSSI HISSEIN
INTRODUCTION AUX POINTEURS : VALEUR ET ADRESSE
main() main()
{ {
int i = 3, j = 6; int i = 3, j = 6;
int *p1, *p2; int *p1, *p2;
p1 = &i; p1 = &i;
p2 = &j; p2 = &j;
*p1 = *p2; p1 = p2;
}
}
après exécution
après exécution
53
Dr MAHAMAT HABIB SENOUSSI HISSEIN
INTRODUCTION AUX POINTEURS
Par défaut lorsque l’on déclare un pointeur, on ne sait pas sur quoi il pointe
Comme toute variable, il faut l’initialiser.
On peut dire qu’un pointeur ne pointe sur rien en lui affectant la valeur NULL
int i ;
int *p1, *p2;
p1=&i;
p2=NULL;
affichera :
0x4
0x8
54
Dr MAHAMAT HABIB SENOUSSI HISSEIN
POINTEUR VERS UN POINTEUR
Comme un pointeur est lui-même une variable numérique, il est situé dans la mémoire de
l’ordinateur à une adresse particulière.
Nous pouvons alors créer un pointeur vers un pointeur, c’est-à-dire une variable dont la valeur est
l’adresse d’un pointeur
int a[5];
*a=7; /* affecte 7 à a[0] */
*(a+1)=2; /* idem a[1] = 2 */
int *pa = a; /* idem. pa = &a[0]; */
*(a+2)=12; /* idem. a[2]=12*/
56
Dr MAHAMAT HABIB SENOUSSI HISSEIN
TABLEAUX ET POINTEURS
Exemple :
adf est un pointeur sur une fonction à deux arguments (double et int) retournant un résultat de type
int.
58
Dr MAHAMAT HABIB SENOUSSI HISSEIN
LES POINTEURS DE FONCTION
Exemple :
#include <stdio.h>
int carre(int a)
{
return a * a;
}
int main(void)
{
int (*pt)(int) = &carre;
printf("%d.\n", (*pt)(5));
return 0;
}
59
Dr MAHAMAT HABIB SENOUSSI HISSEIN
ALLOCATION DYNAMIQUE DE LA MÉMOIRE <STDLIB.H>
Allocation dynamique : La réservation de la mémoire pendant l'exécution du programme.
Exemple :
int *tab , n;
printf( "n=");
60
Dr MAHAMAT HABIB SENOUSSI HISSEIN
ALLOCATION DYNAMIQUE DE LA MÉMOIRE <STDLIB.H>
Libération mémoire: Exemple
main()
{
int i = 3;
int *p;
p = (int *)malloc(sizeof(int));
*p=i;
printf("*p = %d \n",*p);
free(p);
printf("i = %d \n",i);
}
*p=3
i=3
61
Dr MAHAMAT HABIB SENOUSSI HISSEIN