Académique Documents
Professionnel Documents
Culture Documents
Département de Mathématiques et
Informatique
Filière : MIP – S4
Année universitaire : 2021- 2022
Chapitre 1 : Langage C
2
Pr . A. Zannou FST d’ Al-Hoceima
Langage C
• Structure d’un programme C
3
Pr . A. Zannou FST d’ Al-Hoceima
Langage C
• La compilation
4
Pr . A. Zannou FST d’ Al-Hoceima
Langage C
• Les phases de compilation
La première étape consiste à écrire le programme (on parle de code source) dans
un fichier texte à l’aide d’un éditeur.
La deuxième étape est l’étape de pré-compilation. Elle consiste a traiter les
directives de compilation (comme l’inclusion de fichiers d’entête de bibliothèques).
Elle génère un fichier texte qui est encore un fichier source en C.
L’étape suivante est la compilation. Elle consiste a transformer les instructions du
programme en langage compréhensible par le processeur (langage machine). Elle
génère un fichier binaire dit fichier objet (extension .o).
La dernière étape consiste à effectuer l’édition de liens (par l’éditeur de liens).
Le code génère à la compilation est complété par le code des fonctions des
bibliothèques utilisées. C’est seulement après cette étape que l’on génère un fichier
exécutable.
5
Pr . A. Zannou FST d’ Al-Hoceima
Les variables
• Définition
6
Pr . A. Zannou FST d’ Al-Hoceima
Les variables
• types
8
Pr . A. Zannou FST d’ Al-Hoceima
Les constantes
• Définition et déclaration
Une constante est une zone mémoire qui conserve sa valeur pendant
toute l’exécution d’un programme.
On associe une valeur à une constante en utilisant :
la directive #define :
#define nom_constante valeur;
Exemple:
#define pi 3.14;
#define nom "ahmed";
La constante ne possède pas de type
le mot clé const :
const type nom_constante = valeur;
Exemple:
const float Pi =3.14;
const int taille= 200;
la constante est typée
9
Pr . A. Zannou FST d’ Al-Hoceima
Expression et opérations
• Définition
Une expression peut être une valeur, une variable ou une opération.
Par exemple:
2; a, 2*a, 2*a+c
Une expression fournit une seule valeur, elle est évaluée en respectant
des règles de priorité et d’associativité.
Un opérateur est un symbole qui permet de manipuler des variables
(opérandes) pour produire un résultat.
10
Pr . A. Zannou FST d’ Al-Hoceima
Expression et opérations
• Opérateurs du langage C
11
Pr . A. Zannou FST d’ Al-Hoceima
Les variable
• Opérateurs arithmétiques
Les opérandes peuvent être des entiers ou des réels sauf pour % qui
agit uniquement sur des entiers.
Lorsque les types des deux opérandes sont différents il y’a conversion
implicite dans le type le plus fort.
La conversion implicite se fait comme suit :
int → long → float → double → long double.
12
Pr . A. Zannou FST d’ Al-Hoceima
Les variable
• Opérateur de forçage de type (cast)
13
Pr . A. Zannou FST d’ Al-Hoceima
Les variable
• Opérateur conditionnel ?
Syntaxe :
exp1 ? exp2 : exp3
exp1 est évaluée, si sa valeur est vérifiée, c’est exp2 qui est
exécutée, sinon exp3 qui est exécutée.
Exemple 1 :
max = (a > b) ? a : b;
Si a>b alors on affecte à max le contenu de a, sinon on lui
affecte b.
Exemple 2 :
int i=10;
(a > b) ? i++ : i--;
Si (a>b) on incrémente i sinon on décrémente i
14
Pr . A. Zannou FST d’ Al-Hoceima
Les variable
• Sizeof
15
Pr . A. Zannou FST d’ Al-Hoceima
Entrées/sorties
• Printf()
Syntaxe :
printf("format", expr1, expr2, …);
expr1, expr2, …: variables et expressions dont on veut afficher la valeur.
Format : chaîne de caractères qui peut contenir :
• du texte.
• des séquences d’échappement (\n).
• des spécificateurs de format : indiquant le format d’affichage
16
Pr . A. Zannou FST d’ Al-Hoceima
Entrées/sorties
• Les spécificateurs de format
17
Pr . A. Zannou FST d’ Al-Hoceima
Entrées/sorties
• Scanf()
Syntaxe :
scanf("format", AdrVar1, AdrVar2, …);
Format : format de lecture de données (le même que pour printf).
adrVar1, adrVar2, … : adresses des variables auxquelles les données
seront attribuées. Ces adresses sont indiquées par le nom des variables
précédé du signe &
18
Pr . A. Zannou FST d’ Al-Hoceima
Structures de contrôle
• Introduction
19
Pr . A. Zannou FST d’ Al-Hoceima
Structures de contrôle
• if .. else
Syntaxe (1):
#include <stdio.h>
if (condition)
int main()
instruction;
{
else
float age;
instruction;
scanf("%f\n", &age);
if (age>=18)
printf("Accepté \n");
else
printf("refusé \n");
}
20
Pr . A. Zannou FST d’ Al-Hoceima
Structures de contrôle
• if .. else
21
Pr . A. Zannou FST d’ Al-Hoceima
Structures de contrôle
• if .. else
else est toujours associé au dernier if qui ne possède pas une partie else.
Pour éviter toute ambiguïté ou pour forcer une certaine interprétation, il
vaut mieux utiliser les accolades : {….}
22
Pr . A. Zannou FST d’ Al-Hoceima
Structures de contrôle
• Switch .. case
Instruction while:
L’instruction s’exécute tant que le résultat du test est vrai.
L’instruction n’est pas exécutée si le résultat du test est faux la
première fois. Exemple: afficher les nombres entre 1 et 10
Syntaxe:
#include <stdio.h>
while(condition) int main()
{
{
int i=1;
Instruction(s) while(i<=10)
{
}
printf(”%d\n”,i);
i=i+1;
}
}
24
Pr . A. Zannou FST d’ Al-Hoceima
Structures de contrôle
• do .. while
Instruction do .. while :
L’instruction est exécutée une fois, puis répétée si le résultat du
test est vrai.
L’instruction est exécutée au moins une fois.
Syntaxe: Exemple: Entrer un entier qui doit être positif,
do
sinon on repose la question.
{
printf(”Entrez un nombre #include <stdio.h>
positif.\n”);
int main()
scanf(”%d”,&a);
{
} int a;
while (condition); do
{
printf(”Entrez un nombre positif.\n”);
scanf(”%d”,&a);
}
while (a<0);
}
25
Pr . A. Zannou FST d’ Al-Hoceima
Structures de contrôle
• for
26
Pr . A. Zannou FST d’ Al-Hoceima
Structures de contrôle
• Les instructions break et continue : break
L’instruction break peut être utilisée dans une boucle (for, while,
ou do .. while) pour arrêter le déroulement de la boucle et passer
à la première instruction qui la suit .
En cas d’imbrication de boucles, break ne quitte que la boucle
(ou le switch) le plus interne.
27
Pr . A. Zannou FST d’ Al-Hoceima
Structures de contrôle
• Les instructions break et continue : continue
L’instruction Continue peut être utilisée dans une boucle (for, while, ou do ..
while) pour abandonner l’itération courante et passer à l’itération suivante.
#include <stdio.h>
int main()
{
int i;
for (i=1;i<5;i++)
{
printf("début itération%d\n",i);
if (i<3)
continue;
printf("Fin itération%d\n",i);
}
}
28
Pr . A. Zannou FST d’ Al-Hoceima
Les tableaux
• Caractéristiques
29
Pr . A. Zannou FST d’ Al-Hoceima
Les tableaux
• Tableaux unidimensionnels
30
Pr . A. Zannou FST d’ Al-Hoceima
Les tableaux
• Tableaux multidimensionnels
31
Pr . A. Zannou FST d’ Al-Hoceima
Les tableaux
• Tableaux multidimensionnels
Initialisation à la déclaration
float A[3][4] = { {-1.5, 2.1, 3.4, 0},{8, 7.5,1, 2.7 }, {3.1, 0, 2, -1} } ;
32
Pr . A. Zannou FST d’ Al-Hoceima
Les fonctions
• Syntaxe de définition
L‘appel d'une fonction se fait par simple écriture de son nom avec la liste
des paramètres :
nom_fonction (para1, para2, …, paraN);
Lors de la définition d'une fonction, les paramètres sont appelés paramètres
formels.
Lors de l'appel, les paramètres sont appelés paramètres effectifs.
L'ordre et les types des paramètres effectifs doivent correspondre à ceux des
paramètres formels.
34
Pr . A. Zannou FST d’ Al-Hoceima
Les fonctions
• Syntaxe de déclaration
35
Pr . A. Zannou FST d’ Al-Hoceima
Les fonctions
• Syntaxe de déclaration
#include <stdio.h>
float carre(float);//declaration de la fonction
int main()
{
float c;
scanf(" Entrer un nombre %f\n",&c);
printf("Le carré de %f est %f \n", c, carre(c));//appel de la fonction
return 0;
}
float carre( float x)//définition de la fonction
{
return x*x;
}
36
Pr . A. Zannou FST d’ Al-Hoceima
Les fonctions
• Variables locales et globales
Exemple
#include <stdio.h>
float puissance( float x);
float x=1; // variable globale
int main()
{
float c; // variable locale
return 0;
}
float puissance( float x) {
int i; //variable locale
}
37
Pr . A. Zannou FST d’ Al-Hoceima
Les fonctions
• Variables locales et globales
38
Pr . A. Zannou FST d’ Al-Hoceima
Les fonctions
• Variables locales et globales
39
Pr . A. Zannou FST d’ Al-Hoceima
Les fonctions
• header
Exemple :
surface.h main.c
return 3.14*r*r;
}
40
Pr . A. Zannou FST d’ Al-Hoceima
Les fonctions
• Récursivité
Une fonction récursive est une fonction qui fait appel à elle-même.
Toute fonction récursive doit posséder un cas limite (cas trivial) qui arrête
la récursivité.
Exemple : Un fonction qui calcule le factorielle d’un entier :
#include <stdio.h>
int factorielle(int);//declaration de la fonction
int main()
{
int n;
scanf(" %f",&n);
printf("La factorielle de %i est %i \n", n, factorielle(n));//appel de la fonction
}
int factorielle( int n)//définition de la fonction
{
if (n=0)
return 1;
else
return n*factorielle(n-1);
}
41
Pr . A. Zannou FST d’ Al-Hoceima
Les pointeurs
• Définition
P 2E01 3D14
A 10 2E01
Mémoire
42
Pr . A. Zannou FST d’ Al-Hoceima
Les pointeurs
• Définition
43
Pr . A. Zannou FST d’ Al-Hoceima
Les pointeurs
• Déclaration
44
Pr . A. Zannou FST d’ Al-Hoceima
Les pointeurs
• Opérateurs de manipulation
45
Pr . A. Zannou FST d’ Al-Hoceima
Les pointeurs
• Passage par valeur
Lors de l'appel d'une fonction, on lui donne des valeurs sous forme de
paramètres. Il existe donc le type de passages qu'on appelle par valeur,
qui consiste à passer une copie de notre valeur à la fonction. Ainsi la
fonction ne manipulera que cette copie de notre valeur, et tous les
changements qui y seront apportés, ne seront pas pris en compte
ailleurs.
46
Pr . A. Zannou FST d’ Al-Hoceima
Les pointeurs
• Passage par valeur
Exemple :
Passage par valeur
void ma_fonction(int n)
{
n = 10;
}
void main ()
{
int var = 123;
ma_fonction(var);
printf("La valeur de variable est %d\n",var);
}
Affichage:
La valeur de variable est 123
47
Pr . A. Zannou FST d’ Al-Hoceima
Les pointeurs
• Passage par adresse
48
Pr . A. Zannou FST d’ Al-Hoceima
Les pointeurs
• Passage par adresse
Exemple :
Passage par adresse
void ma_fonction(int * n)
{
*n = 10;
}
void main ()
{
int var = 123;
ma_fonction(&var);
printf("La valeur de variable est %d\n",var);
}
Affichage:
La valeur de variable est 10
49
Pr . A. Zannou FST d’ Al-Hoceima
Les pointeurs
• Passage par adresse et par valeur
Exemple
Passage par valeur Passage par adresse/référence
void echange(int x, int y) void echange(int* x, int*y)
{ {
int temp; int temp;
temp=x; temp=*x;
x=y; *x=*y;
y=temp; *y=temp;
} }
void main() void main()
{ {
int a=2, b=3; int a=2, b=3;
echange(a,b); echange(&a,&b);
printf("a = %d et b=%d",a,b); printf("a = %d et b=%d",a,b);
} }
Affichage: Affichage:
a= 2 et b=3 a= 3 et b=2
50
Pr . A. Zannou FST d’ Al-Hoceima
Les pointeurs
• Initialisation
A la déclaration d’un pointeur p (int *p; ), on ne sait pas sur quel zone
mémoire il pointe. Ceci peut générer des problèmes.
Conseil :
Toute utilisation d’un pointeur doit être précédée par une initialisation.
On peut initialiser un pointeur en lui affectant :
l’adresse d’une variable :
Exemple : int a, *p1; p1=&a;
Un autre pointeur déjà initialisé :
Exemple : int *p2; p2=p1;
51
Pr . A. Zannou FST d’ Al-Hoceima
Les pointeurs
• Pointeurs et tableaux
P .
3 20 6
T[0] T[1] T[2]
52
Pr . A. Zannou FST d’ Al-Hoceima
Les pointeurs
• Pointeurs et tableaux
P .
3 20 6
T[0] T[1] T[2]
53
Pr . A. Zannou FST d’ Al-Hoceima
Les chaines de caractères
M I P \0
54
Pr . A. Zannou FST d’ Al-Hoceima
Les chaines de caractères
55
Pr . A. Zannou FST d’ Al-Hoceima
Les chaines de caractères
• Initialisation
On peut initialiser une chaîne de caractères à la définition par l’une des trois
méthodes suivantes :
Comme un tableau.
char ch[] = {‘e’, ’c’, ’o’, ’l’, ’e’, ’\0’};
Par une chaîne constante.
char ch[] = "ecole";
Par un pointeur : en attribuant l'adresse d'une chaîne de caractères
constante à un pointeur de type char.
char *ch = "ecole";
56
Pr . A. Zannou FST d’ Al-Hoceima
Les chaines de caractères
• Manipulation
57
Pr . A. Zannou FST d’ Al-Hoceima
Les chaines de caractères
• Manipulation
Bibliothèque <string.h> :
58
Pr . A. Zannou FST d’ Al-Hoceima
Les chaines de caractères
• Manipulation
59
Pr . A. Zannou FST d’ Al-Hoceima
Allocation dynamique de la mémoire
• Introduction
Gaspillage de la mémoire
60
Pr . A. Zannou FST d’ Al-Hoceima
Types d’allocation de mémoire
• Introduction
61
Pr . A. Zannou FST d’ Al-Hoceima
Allocation dynamique de la mémoire
• Introduction
62
Pr . A. Zannou FST d’ Al-Hoceima
Allocation dynamique de la mémoire
• Fonction malloc()
Syntaxe :
malloc(N); //N:nombre d’octets
La fonction malloc retourne :
Un pointeur de type char * pointant vers le premier octet.
Le pointeur NULL s’il n’y a pas assez de mémoire libre à allouer.
Exemple : Réserver la mémoire pour un texte de 100 caractères :
char *T;
T = malloc(100);
➢ Cette instruction fournit l'adresse d'un bloc de 100 octets et l'affecte à T.
➢ S'il n'y a pas assez de mémoire, T obtient la valeur NULL.
63
Pr . A. Zannou FST d’ Al-Hoceima
Allocation dynamique de la mémoire
• Fonction free()
64
Pr . A. Zannou FST d’ Al-Hoceima
Allocation dynamique de la mémoire
• Fonction free()
Remarques :
Si on appelle pas la fonction free, on s'expose à des fuites de mémoire (le
programme risque au final de prendre beaucoup de mémoire alors qu'il n'a en
réalité plus besoin de tout cet espace).
Si on ne libère pas explicitement la mémoire à l'aide de free, alors elle est
libérée automatiquement à la fin du programme
65
Pr . A. Zannou FST d’ Al-Hoceima
Allocation dynamique de la mémoire
• Malloc et free
Exemple
void main()
{
/*Traitement de p1*/
int *p1=malloc(3*sizeof(int));
*(p1+0)=2;
*(p1+1)=5;
*(p1+2)=7;
printf("%p",p1); // 20CD23EF
free(p1);
/*Traitement de p2*/
int *p2=malloc(2*sizeof(int)); // 20CD23EF
*(p2+0)=2;
*(p2+1)=5;
printf("%p",p2);
}
66
Pr . A. Zannou FST d’ Al-Hoceima
Allocation dynamique de la mémoire
• Calloc
67
Pr . A. Zannou FST d’ Al-Hoceima
Allocation dynamique de la mémoire
• Calloc
Exemple.
En utilisant malloc En utilisant calloc
68
Pr . A. Zannou FST d’ Al-Hoceima
Allocation dynamique de la mémoire
• La foncion realloc
La fonction realloc permet de réallouer un bloc de mémoire dans le tas (le heap
en anglais).
Si l’espace mémoire libre suit le bloc à réallouer est suffisamment grand, alors
le bloc de mémoire est simplement agrandi.
Si l’espace mémoire libre suit le bloc à réallouer est n’est pas suffisant, alors
le contenu de la zone d’origine recopié dans la nouvelle zone et le bloc mémoire
d’origine sera libéré automatiquement.
La syntaxe de realloc:
void* realloc (pointeur, taille_octets)
La fonction calloc retourne :
Un pointeur de type char * pointant vers le premier octet.
Le pointeur NULL s’il n’y a pas assez de mémoire libre à allouer.
69
Pr . A. Zannou FST d’ Al-Hoceima
Allocation dynamique de la mémoire
• Calloc
Exemple.
En utilisant malloc En utilisant calloc
En utilisant realloc
void main()
{
int *p1=malloc(3*sizeof(int));
p1=realloc(p1, 5*sizeof(int))
*(p1+4)=10;
*(p1+5)=20;
}
70
Pr . A. Zannou FST d’ Al-Hoceima
La gestion des fichiers
• Introduction
71
Pr . A. Zannou FST d’ Al-Hoceima
La gestion des fichiers
• Ouverture et fermeture d'un fichier
72
Pr . A. Zannou FST d’ Al-Hoceima
La gestion des fichiers
• Ouverture et fermeture d'un fichier
#include <stdio.h>
void main()
{
FILE * fp=fopen("fichier.txt","r");
if (fp==NULL)
printf("Erreur!\n");
else
printf(" Réusite!\n");
fclose(fp);
}
Affichage
Erreur!
73
Pr . A. Zannou FST d’ Al-Hoceima
La gestion des fichiers
• Fonction fopen()
La fonction fopen est de type FILE* ouvre un fichier et lui associe un flot
de données.
La valeur retournée par fopen est un flot de données.
Si l'exécution de cette fonction (fopen) ne se déroule pas normalement,
la valeur retournée est le pointeur NULL.
Il est donc recommandé de toujours tester si la valeur renvoyée par la
fonction fopen est égale à NULL afin de détecter les erreurs (lecture d'un
fichier inexistant...).
La fonction fclose retourne un entier qui vaut zéro si l'opération s'est
déroulée normalement (et une valeur non nulle en cas d'erreur).
74
Pr . A. Zannou FST d’ Al-Hoceima
La gestion des fichiers
• Ouverture et fermeture d'un fichier
#include <stdio.h>
#define pt "fichier.txt";
// #define pt "C:\\dossier1\\fichier.txt"
void main()
{
FILE * fp=fopen(pt,"r");
if (fp==NULL)
printf("Erreur!\n");
else
printf(" Réusite!\n");
fclose(fp)
}
75
Pr . A. Zannou FST d’ Al-Hoceima
La gestion des fichiers
• Mode d’accès aux fichiers
76
Pr . A. Zannou FST d’ Al-Hoceima
La gestion des fichiers
• Mode d’accès aux fichiers
77
Pr . A. Zannou FST d’ Al-Hoceima
La gestion des fichiers
• La fonction d’ écriture fprintf
78
Pr . A. Zannou FST d’ Al-Hoceima
La gestion des fichiers
• fonction d'écriture fscanf
La fonction fscanf, analogue à scanf, permet de lire des données dans un
fichier.
Syntaxe est semblable à celle de scanf :
fscanf(flot,"chaîne de contrôle",argument-1,...,argument-n)
où flot est le flot de données retourné par fopen. Les spécifications de format
sont ici les mêmes que celles de la fonction scanf.
79
Pr . A. Zannou FST d’ Al-Hoceima
La gestion des fichiers
• La fonction d’ écriture fprintf
#include <stdio.h>
void main()
{
FILE * fp=fopen("fichier.txt","a");
char nom[20];
if (fp==NULL)
printf("Erreur!");
else
{
printf("Entrer votre nom: \n");
scanf("%s",nom);
fprintf(fp,"%s \n",nom);
}
fclose(fp);
}
80
Pr . A. Zannou FST d’ Al-Hoceima
La gestion des fichiers
• La fonction d’ écriture fputs
#include <stdio.h>
void main()
{
FILE * fp=fopen("fichier.txt","a");
char nom[20];
if (fp==NULL)
printf("Erreur!");
else
{
puts("Entrer votre nom:");
gets(nom);
fputs(nom,fp);
}
fclose(fp);
}
81
Pr . A. Zannou FST d’ Al-Hoceima
La gestion des fichiers
• La fonction de saisie fscanf
82
Pr . A. Zannou FST d’ Al-Hoceima
La gestion des fichiers
• La fonction de saisie fscanf - la fonction feof
83
Pr . A. Zannou FST d’ Al-Hoceima
La gestion des fichiers
• La fonction de saisie fgets
84
Pr . A. Zannou FST d’ Al-Hoceima
La gestion des fichiers
• La fonction de saisie fgetc
85
Pr . A. Zannou FST d’ Al-Hoceima