Beruflich Dokumente
Kultur Dokumente
du langage C
1
Rappels
2
Rappel
3
Types d’objet
◮ Types scalaires : objets élémentaires proches du
matériel
Types arithmétiques : pour faire des calculs au sens
classique
Pointeurs : référence à d’autres objets ou fonctions
◮ Types structurés
Vecteurs : répétition ordonnée d’un même type
Structures : rassemble éléments hétérogènes
Union : fait coexister plusieurs types au même
endroit mémoire
• Types de fonction : précise à la fois type valeur de
retour et type
arguments
• Types incomplets
◮ Incomplétude totale void
◮ Vecteur de taille non précisée
4
Types synonymes
5
Principaux codes de conversion
- printf
6
Principaux codes de conversion
- scanf
c char
d int
u unsigned int
hd short int
hu unsigned short int
ld long int
lu unsigned long int
f, e float écrit indifféremment dans l’une
des deux notations: décimale
(éventuellement sans point, c’est-à-dire
comme un entier) ou exponentielle(avec la
lettre e ou E)
lf , le double avec la même présentation
que ci-dessus
s chaîne de caractères
7
Les classes d’allocation
de mémoire
8
Déclaration et définition
9
Variables et déclarations
10
Avec prototype – sans
prototype
Exemple avec prototype ;
long i = 1;
int fonction (int j) {
short k;
…
}
Exemple sans prototype :
long i =1;
int fonction(j)
int j;
{
short k;
…
}
Ci-dessus i est une variable globale, k une
variable locale et j un argument formel
(paramètre)de fonction
11
Règle fondamentale de visibité
12
Exemple
int a; /*variable globale*/
void f1(){
long a; ; /*variable locale à f1*/
a = 50; /*modification locale à f1*/
}
void f2(void){
a= 10; /*modification globale*/
}
void f3(float a ){/*paramètre de f3*/
a = 10; /*modification paramètre local à f3*/
}
les règles de visibilité de noms nous permettent de dire
:
1. la fonction f3 peut appeler les fonctions f3, f2, et f1 ;
2. la fonction f2 peut appeler la fonction f2, et f1 ;
3. la fonction f1 ne peut que s’appeler elle-même ;
13
Les classes d’allocation
mémoire
14
Les classes d’allocation
mémoire
Les classes mémoire sont :
global cette classe est celle des variables définies en
dehors d’une fonction. Ces variables sont accessibles à
toutes les fonctions. La durée de vie des variables de type
global est la même que celle du programme en cours
d’exécution.
local ou auto : cette classe comprend l’ensemble des
variables définies dans un bloc. C’est le cas de toute
variable définie à l’intérieur d’une fonction. L’espace
mémoire réservé pour ce type de variable est alloué dans
la pile d’exécution. C’est pourquoi elles sont appelées
aussi auto c.a.d automatique car l’espace mémoire
associé est créé lors de l’entrée dans la fonction et il
est détruit lors de la sortie de la fonction. La durée
de vie des variables de type local est celle de la
fonction dans laquelle elles sont définies.
15
Les classes d’allocation
mémoire
16
Exemple sur l’utilisation de
static
17
Exemple sur l’utilisation de
static : commentaire
18
Les classes d’allocation
mémoire
extern ce qualificatif permet de spécifier que la ligne
correspondante n’est pas une tentative de définition mais
une déclaration . Il précise les variables globales
(noms et types) ou fonctions qui sont définies dans
un autre fichier source et qui sont utilisées dans ce
fichier source.
19
Qualificatifs d’aide au
compilateur
Une définition de variable qualifiée du mot const informe le compilateur
que cette variable est considérée comme constante et ne doit pas être
utilisée dans la partie gauche d’une affectation. Ce type de définition
autorise le compilateur à placer la variable dans une zone
mémoire accessible en lecture seulement à l’exécution.
Le qualificatif volatile informe le compilateur que la variable
correspondante est placée dans une zone de mémoire qui peut
être modifiée par d’autres parties du système que le programme
lui-même. Ceci supprime les optimisations faites par le compilateur lors
de l’accès en lecture de la variable. Ce type de variable sert à décrire des
zones de mémoire partagées entre plusieurs programmes ou encore des
espaces mémoires correspondant à des zones d’entrées-sorties de la
machine.
Les deux qualificatifs peuvent être utilisés sur la même variable, spécifiant
que la variable n’est pas modifiée par la partie correspondante du
programme mais par l’extérieur.
20
Les pointeurs
21
Introduction
22
Illustration
23
Pointeur - définition
type *identifiant;
définit identifiant comme variable de
type pointeur vers type
24
Illustration
25
Illustration
26
Quelques remarques utiles
Pour différencier un pointeur d'une variable ordinaire, on
fait précéder son nom de l’opérateur de référencement
(d’indirection) '*' lors de sa déclaration.
27
Quelques remarques utiles
28
TABLEAUX ET POINTEURS
29
TABLEAUX ET POINTEURS
30
Tableaux - Rappel
32
Arithmétique d’adresse et
tableaux
33
TABLEAUX ET POINTEURS
tab 6
int *pTab; 8
ptab est un pointeur vers un entier
4
pTab = Tab; 3
ptab 9
1
5
ptab prend l’adresse du premier 4
élément de tab
NB. Les noms de tableaux étant des 3
constantes, il n’est pas possible de les
affecter 2
34
TABLEAUX ET POINTEURS
7
tab
8
pTab[0]++;
4
3
ptab 9
1
5
4
3
2
35
TABLEAUX ET POINTEURS
pTab++; tab 7
ptab 8
4
3
9
le pointeur contient maintenant
l'adresse du deuxième élément 1
du tableau
!on ne peut pas incrémenter le 5
pointeur Tab car c'est un 4
pointeur constant.
3
2
36
Exemple de manipulation
int t[10];
int i;
for (i = 0 ; i < 10 ; i++)
*(t+i) = 1;
37
Tableaux multidimensionnels
38
Adresses des sous-tableaux et Noms des
différents éléments du tableau mat
mat mat[0][0]mat[0][1]mat[0][2]mat[0][3]mat[0][4]
mat[0]
mat[1][0]mat[1][1]mat[1][2]mat[1][3]mat[1][4]
mat+1
mat+2
mat+3
Mat[4][0]
mat+4
39
Allocation dynamique de la
mémoire
40
Allocation dynamique de la
mémoire
41
Allocation dynamique de la
mémoire
42
Illustration
Schématiquement:
p
43
Exemple
int *p = malloc(10*sizeof(int));
if(p)
{ for (i=0;i<10;i++)
{ p[i] = i;
printf("%d",p[i]);
}
free(p);
}
Dans cet exemple l'instruction malloc nous retourne
un pointeur sur une zone mémoire de la taille de 10
entiers. Ce qui correspond à un tableau de 10
entiers.
La fonction free() permet de libérer la mémoire
précédemment réservée. Sa syntaxe est : void
free(void* p)
44
Fonction calloc
p = (int*)calloc(N,sizeof(int));
p = (int*)malloc(N * sizeof(int));
for (i = 0; i < N; i++)
*(p + i) = 0;
45
Pointeur vers pointeur
46
Pointeurs et tableaux
multidimensionnels
47
Schéma illustratif de la
mémoire
pt
Pt[0]
=*pt Pt[1] =*(pt+1)
Pt[0][0]
Pt[1][0]
Pt[0][1]
Pt[1][1]
Pt[1][2]
48
Commentaire
La première allocation dynamique réserve
pour l'objet pointé par pt l'espace mémoire pour
nl pointeurs vers des réels.
Ces nl pointeurs correspondent aux lignes .
Les allocations dynamiques suivantes
réservent pour chaque pointeur pt[i] l'espace
mémoire nécessaire pour stocker nc réels.
On peut choisir des tailles différentes pour
chacune des lignes pt[i].
for (i = 0; i < nl; i++) pt[i] = (int*)malloc((i
+ 1) * sizeof(double));
pour initialiser tous les éléments du tableau à
zéro, on met:
pt[i] = (double*)calloc(nc, sizeof(double));
49
Schéma illustratif : nl = 6 nc =
5
50
Pointeurs et tableaux
multidimensionnels
51
LES STRUCTURES
52
LES STRUCTURES
Le langage C permet de définir des modèles de structures
comme les autres langages évolués.
struct art // déclaration de structure
{ int numero;
int qte;
double prix;
};
Typedef struct
{ int numero;
int qte;
double prix;
}article;
53
Opérations sur structures
54
Pointeurs et structures
55
Pointeurs et structures
Exemple :
(*p).prix p->prix
56
Exemple: tableau et structures
#include <stdio.h>
#include <stdlib.h>
Typedef struct
{ int numero, qte;
double prix;
}article;
main()
{ int n, i; article* tab;
printf("nombre d‘articles = ");
scanf("%d",&n);
tab = (article *)malloc(n * sizeof(article));
/* saisie des articles dans un tableau*/
for (i =0 ; i < n; i++) {
57
Exemple: tableau et structures
58
Unions
59
Exemple
60
Exemple
61
Accès aux champs
62
Pointeurs et fonctions
63
Pointeurs comme paramètres de
fonctions
64
Illustration
À l’appel
x 10 y 11
a b
Début d’exécution
x 10 y 11
*a = *b;
2
a b
t = *a; 1 10 t
65
Illustration
x 11 y 11
a b
3 *b = t;
t 10
x 11 y 10
a b
10 t
66
passage de paramètres sous
forme de pointeur tableau
67
TRANSMISSION DE LA VALEUR
D’UNE STRUCTURE
#include <stdio.h>
Struct enreg { int a;double b;}
int main (void)
{ struct enreg x;
void fct (struct enreg y);
x.a = 1; x.b = 12.5;
printf(" \navant appel fct : %d %e",x.a,x.b);
fct(x);
printf(" \nretour à main: %d %e: "x.a,x.b);
Return 0;
}
void fct(struct enreg s){
s.a = 0; s.b = 1;
Printf(" \ndans fct %d %e ", s.a, s.b);
}
68
TRANSMISSION DE L’ADRESSE
D’UNE STRUCTURE
#include <stdio.h>
Struct enreg { int a;double b;}
int main (void)
{ struct enreg x;
void fct (struct enreg *);
x.a = 1; x.b = 12.5;
printf(" \navant appel fct : %d %e",x.a,x.b);
fct(&x);
printf(" \nau retour à main: %d %e: "x.a,x.b);
return 0;
}
void fct(struct enreg *ps){
s->a = 0; s->b = 1;
Printf(" \ndans fct %d %e ", ps->a, ps->b);
}
69
Exécution
70
Fonction qui renvoie un objet
de type structure.
71
Pointeurs génériques
72
Pointeurs génériques
73
La fonction memcpy
74
Applications
75
Fonction echange version
générique
76
Utilisation
Ainsi en déclarant :
int i =2, j=3; float x=3.4, y=6.5;
Struct complexe cx={1,2},cy={3,4};
L’appel peut être effectué pour
différents types de données
echange(&i,&j,sizeof(i));
echange(&x,&y,sizeof(x));
echange(&cx,&cy,sizeof(cx);
77
Les pointeurs de fonction
78
Les pointeurs de fonction
79
Pointeurs de fonctions
80
Exemples d’utilisation
int(*pmax)(int*, int);
pmax = max;
pmax prend comme valeur l’adresse du
code exécutable de la fonction max
pmax(Tab,10) max(tab,10)
81
Recherche du minimum d’une
fonction y =f(x) entre deux
bornes- sans pointeur de fonction
#include <stdio.h>
float carre(float x)
{ return x*x; }
float parabole(float x)
{ return x∗x - 4 ∗ x + 2; }
float min_carre(float a, float b)
{ int i; float pas; float vmin; float valeur;
pas =(b-a)/100;
vmin = carre(a);
for (i =1 ; i < 101 ; i++){
valeur = carre(a+i*pas);
if (vmin > valeur)
vmin = valeur;
}
return vmin;
}
82
Recherche du minimum d’une
fonction y =f(x) entre deux
bornes- sans pointeur de fonction
(suite)
83
Exemple : Recherche du minimum
d’une fonction y =f(x) entre deux
bornes
#include <stdio.h>
float carre(float x)
{ return x*x; }
float parabole(float x)
{ return x∗x - 4 ∗ x + 2; }
float min_fct(float a, float b, float
(* pF) ( float x))
{ int i; float pas; float vmin; float
valeur;
pas =(b-a)/100;
vmin = pF(a);
84
Recherche du minimum d’une
fonction y =f(x) entre deux bornes
(suite)
85
Les fichiers
86
Les fichiers
87
Accès séquentiel - Accès direct
88
Fichiers binaires - Fichiers texte
89
Déclaration
Lorsqu’un programme doit lire ou écrire des données dans
un fichier, ces données sont acheminées à leur destination
en passant par un tampon (buffer). Ce tampon est une
zone de mémoire RAM dans laquelle on range une quantité
(assez importante ) de données.
L’emplacement mémoire du tampon d’E/S d’un fichier est
donné par une variable structurée de type FILE.
Le type FILE est défini dans le header stdio.h. Ses champs
contiennent l’adresse du tampon ainsi que d’autres
informations sur le fichier concerné.
La déclaration d’un fichier se fait par l’instruction suivante:
FILE *f;
f est défini en tant que pointeur sur un objet de type FILE.
Cette déclaration réserve un emplacement pour le pointeur
f. f est une variable logique qui sera associée dans le
programme au fichier physique en mémoire.
90
Instruction d’ouverture d’un
fichier
Exemple :
FILE *f;
f = fopen(" exemple.dat ", " wb ");
91
Le valeurs possibles de mode pour
les fichiers textes :
92
Mode pour les fichiers binaires:
93
Opérations de lecture et
d’écriture
94
Lecture et écriture en mode
caractère
95
Exemple : lecture caractère par
caractère
#include<stdio.h>
#include <stdlib.h>
void main()
{
FILE * fichier; char c, nom[21];
printf ("entrer le nom du fichier");
gets(nom);
if ((fichier = fopen(nom, "r "))== NULL) {
printf( "erreur d’ouverture"); exit (-1);
}
while ((c = fgetc(fichier)) !=EOF)
printf("%c",c);
fclose(fichier);
}
96
Lecture et écriture en mode
chaine
97
Lecture et écriture formatées
La fonction fprintf écrit des données dans un fichier en les
formatant. Elle admet le prototype :
int fprintf(FILE *fichier, char *format, liste d’expressions);
Comme printf, fprintf accepte un nombre variable de
paramètres. Elle retourne comme résultat le nombre de
caractères écrits. Une valeur de retour négative (comme EOF)
indique une erreur.
fprintf(stdout, … ) et printf( …) sont équivalents.
98
Ecriture dans un fichier texte
#include <stdio.h>
#include <stdlib.h>
main () {
char c; int x, y; char nomfich[21]; FILE *sortie;
printf("nom du fichier à créer :");
scanf("%20s", nomfich);
sortie = fopen (nomfich,"w");
if (!sortie ){
printf ("erreur d'ouverture"); exit(-1);
}
printf("donner les noms (* pour finir) et les coordonnées
des points");
do {
scanf(" %c%d%d", &nom, &x, &y);
if (c != ‘*’ )
fprintf(sortie, "%c%d%d",c, x, y);
} while (c != ‘*’ )
fclose(sortie);
}
99
Lecture à partir d’un fichier
texte
#include <stdio.h>
#include <stdlib.h>
main () {
char c; int x, y; char nomfich[21]; FILE *entree;
printf("nom du fichier à lister :"); scanf("%20s",
nomfich);
entree = fopen (nomfich,"r");
if (!entree ){
printf ("erreur d'ouverture"); exit(-1);
}
do{
fscanf(entree, " %c%d%d", &c, &x, &y);
if ( !feof(entree) )
printf( "%c%d%d",c, x, y);
} while (!feof(entree) );
printf("***fin de fichier***");
fclose(entree);
}
100
Instructions de lecture et
d’écriture
101
Instruction de lecture
102
La fonction feof
Syntaxe :
int feof(FILE *fichier);
Cette fonction est surtout utilisée en lecture.
Elle retourne 0 tant que la fin de fichier n’est pas
atteinte. elle est vrai lorsque le pointeur est
positionné au-delà de la fin du fichier c à d quand
la dernière lecture a échoué
feof n’est jamais vrai après l’ouverture (en lecture )
du fichier même lorsque celui-ci est vide. Il faut au
moins une lecture.
Exemple :
do
{ fread(&n, sizeof(int), 1, fichier);
if (!feof(fichier)) printf(« \n %d », n);
} while (!feof(fichier));
103
Fermeture d’un fichier
104
Création d’un fichier
#include <stdio.h>
#include <stdlib.h>
int main()
{char *nom = " exemple.dat "; int n;
FILE *fichier = fopen(nom, "wb ");
if (fichier == NULL) {
printf ("erreur d'ouverture"); exit(-1);
}
do {
printf(" donner un entier ");
scanf(" %d ", &n);
fwrite(&n, sizeof(int), 1, fichier);
}while (n);
fclose(fichier);
return 0;
}
105
Liste séquentielle d’un fichier
#include <stdio.h>
#include <stdlib.h>
void main()
{char *nom = " exemple.dat "; int n; FILE
*fichier;
fichier = fopen(nom, " rb ");
if (!fichier ){
printf ("erreur d'ouverture"); exit(-1);
}
do
{ fread(&n, sizeof(int), 1, fichier);
if (!feof(fichier)) printf("\n %d " , n);
} while (!feof(fichier));
fclose(fichier);
}
106
Accès direct
Il est possible d’accéder à partir d’une position dans le fichier
vers une autre position à l’aide de la fonction fseek.
Cette fonction est utilisée surtout pour les fichiers binaires.
int fseek(FILE * f, int p, int position); déplace le pointeur
de p cases à partir de position.
Valeurs possibles pour position :
SEEK_SET (ou 0) : à partir du début du fichier
SEEK_CUR (ou 1) : à partir de la position courante du pointeur.
SEEK_END (ou 2) : en arrière à partir de la fin du fichier
Retourne 0 si le pointeur a pu être déplacé.
long int ftell(FILE *f); retourne le nombre d'octets du
début de fichier jusqu'à la position courante. Cette fonction
est habituellement utilisée avant fseek.
107
Exemple
#include <stdio.h>
#include <stdlib.h>
void main()
{char *nom = "exemple.dat"; int n; long num;
FILE *fichier = fopen (nom," rb ");
if (!fichier ){
printf ("erreur d'ouverture"); exit(-1);
}
do {
printf(" rang dans le fichier : ");
scanf("%d" , &num);
if (num) {
fseek(fichier, (num -1) *sizeof(int), SEEK_SET);
fread(&n,sizeof(int),1,fichier);
printf ("%d \n" , n);
}
} while (num)
fclose(fichier);
}
108
ANNEXES
109
Les chaînes de caractères
110
Principales fonctions de la
bibliothèque string.h pour la
manipulation des chaines de
caractères
La fonction strlen(chaine) fournit la longueur de chaine.
La fonction strcat(ch1,ch2) recopie la seconde chaine ch2 à la
suite de la première ch1.
La fonction strncat(ch1,ch2,lgmax) travaille de la même façon
que strcat en offrant un contrôle sur le nombre de caractères
concaténés.
La fonction strcmp(ch1,ch2) compare deux chaines et fournit
une valeur positive entière si ch1>ch2, nulle si ch1=ch2,
négative si ch1<ch2.
La fonction strncmp(ch1,ch2,lgmax) travaille comme strcmp
mais limite la comparaison au nombre lgmax de caractères.
Les fonctions stricmp(ch1,ch2) et strnicmp(ch1,ch2,lgmax)
travaillent comme strcmp et strncmp mais sans tenir compte de
la différence entre majuscules et minuscules.
La fonction strcpy(destin,source) recopie le chaine source dans
l’emplacement d’adresse detin.
La fonction strncpy(destin,source,lgmax) limite la copie au
nombre de caractères lgmax.
La fonction strchr(ch,caractere) recherche dans ch la première
position où apparaît le caractère mentionné.
La fonction strrchr(ch,caractere) opère de même mais en
partant de la fin de ch.
La fonction strstr(ch,ssch) recherche dans ch la première
occurrence de la sous chaine ssch.
111
Branchement multiple switch
switch (expression )
{case constante-1: liste d’instructions 1 ; break;
case constante-2: liste d'instructions 2 ;break;
...
case constante-n: liste d'instructions n; break;
default: liste d'instructions ;break;
}
Si la valeur de expression est égale à l'une des
constantes, la liste d'instructions correspondant est
exécutée. Sinon la liste d'instructions correspondant
à default est exécutée. L'instruction default est
facultative
112
Branchement non conditionnel
break
113
Branchement non conditionnel
continue
114
Exemple
115