Académique Documents
Professionnel Documents
Culture Documents
THÈME 1
PRÉSENTATION DU LANGAGE C
Page 1 of 63
Thème 1 : Présentation du Langage C
Le langage C a été créé en 1972 par Dennis Richie et Kenneth Thompson, chercheurs aux
Laboratoires Bell, afin de réécrire le système d'exploitation UNIX. En 1978, Brian Kernighan
et Dennis Richie publient la définition classique du langage C dans le livre The C
Programming language. Le langage C devenant de plus en plus populaire dans les années 80,
plusieurs groupes mirent sur le marché des compilateurs comportant des extensions
particulières.
En 1983, l'American National Standard Institute (ANSI) décida de normaliser le langage.
Ce travail s'acheva en 1989 par la définition de la norme ANSI C appelée aussi C89.
2. Caractéristiques et normalisation
Le présent cours s’appuiera surtout sur la norme C89 car elle est reconnue par la plupart des
compilateurs C.
3. Intérêt du langage C
Le langage C est un langage libre et gratuit qui est très utilisé malgré l’apparition de langages
plus modernes (PHP, Python). Il met en œuvre un nombre restreint de concepts, facilitant
ainsi sa maîtrise. Il reste très utilisé dans la programmation système en général. On le retrouve
dans de nombreux domaines tels que la programmation embarquée sur microcontrôleurs, les
calculs intensifs, l’écriture de systèmes d’exploitation et les programmes où la rapidité de
traitement est importante.
De plus, il a influencé de nombreux langages plus récents dont C++, Java, C# et PHP, qui
reprennent largement sa syntaxe.
Page 2 of 63
Thème 2 : Les outils pour la programmation
THÈME 2
Page 3 of 63
Thème 2 : Les outils pour la programmation
En programmation, un éditeur de texte est un logiciel qui sert à écrire le code source d’un
programme. Un éditeur de texte comme Bloc-Notes sous Windows pourrait suffire. Cependant,
il est préférable d’utiliser un éditeur de texte intelligent comme Notepad++ ou Sublime Text.
1.2. un compilateur
Un compilateur est un logiciel qui transforme le code source d’un programme en code binaire
compréhensible par le processeur.
1.3. un débogueur
Un débogueur est un logiciel qui sert à retrouver les éventuelles erreurs dans le programme, et
de les analyser en vue des corriger.
On peut installer ces logiciels séparément. Cependant, il serait plus facile d’utiliser un logiciel
qui regroupe ces trois logiciels. Un tel logiciel est un Environnement de Développement Intégré
(EDI) ou Integrated Development Environnement, en anglais (IDE).
Les IDE sont nombreux. On utilisera l’IDE Code Blocks. Libre et gratuit, cet IDE fonctionne
sur les principaux systèmes d’exploitation dont MS Windows. Il est en anglais.
On utilisera la version 17.12 qui reconnait les normes C89 et C99 du langage C.
Son installation est très simple et rapide ; il faut laisser toutes les options par défaut.
Lorsqu’on lance Code Blocks, sa fenêtre principale apparaît, présentant ses composants :
Située dans la partie supérieure de la fenêtre, la barre de titre affiche le nom du fichier courant
et le nom du logiciel suivi de sa version.
Page 4 of 63
Thème 2 : Les outils pour la programmation
Cette zone est délimitée par un rectangle placée en dessous de la barre d’outils et
perpendiculaire à celle-ci.
Elle présente l’arborescence du projet en cours de développement ; on y voit tous les dossiers
et fichiers constituant le projet.
Cette zone est située en dessous de la barre d’outils et à la droite de la zone de gestion de projet.
C’est dans cette zone que l’on écrit le code du projet.
Page 5 of 63
Thème 2 : Les outils pour la programmation
Après l’écriture du code source d’un programme, il faut le tester. Pour ce faire, il faut d’abord
le compiler et ensuite l’exécuter si aucune erreur de compilation n’a été signalée.
Ce bouton permet d’envoyer les fichiers source du projet au compilateur dans le but de créer
un exécutable. Si des erreurs sont détectées, l’exécutable ne sera pas créé, et ces erreurs seront
indiquées dans la zone de notification.
Ce bouton combine les deux précédents boutons. Il permet de réaliser deux actions en une
seule. Cependant, si une erreur est détectée lors de la première action (la compilation), la
seconde ne s’effectuera pas et les erreurs détectées seront signalées dans la zone de
notification.
Cette commande permet de compiler tous les fichiers du projet au lieu de compiler
uniquement ceux qui ont été modifiés.
Page 6 of 63
Thème 2 : Les outils pour la programmation
Pour Code Blocks, tout programme à créer est vu comme un projet. Ce projet est représenté par
un dossier qui contiendra divers dossiers et fichiers dont l’exécutable du programme.
On peut créer deux types de programme sous Code Blocks : les programmes en mode console
et les programmes en mode fenêtres.
les programmes en mode console : ce sont des programmes qui s’exécutent dans un
environnement "noir et blanc", comme sous MS DOS. On peut y introduire de la
couleur.
les programmes en mode fenêtres : ce sont des programmes qui, à l’exécution, ont
l’aspect de MS Word, MS Excel ou Code Blocks, avec de nombreuses de couleurs et de
nombreux objets graphiques (icônes, barres, boîtes de dialogue).
Page 7 of 63
Thème 2 : Les outils pour la programmation
Dans le dossier Espace C, Code Blocks crée un dossier portant le nom du projet. Ce dossier
contient deux fichiers : l’un se nomme main et l’autre a pour nom le nom du projet.
Dans Code Blocks, un projet est créé dans la zone de gestion de projet. Dans Projects, cliquer
sur + pour afficher le dossier Sources du projet.
Ensuite, cliquer sur le + lié au dossier Sources pour afficher son contenu : le fichier main.c
apparaît.
Lorsqu’on double-cliquer sur main.c, le code minimal apparaît dans la zone de travail.
Page 8 of 63
Thème 3 : Objets et types
THÈME 3
OBJETS ET TYPES
Page 9 of 63
Thème 3 : Objets et types
PARTIE 1
Page 10 of 63
Thème 3 : Objets et types
1. Un exemple de programme
Voici un programme C qui calcule la factorielle d’un nombre. Il s’appuie sur l’algorithme
mettant en œuvre la structure itérative TANT QUE.
#include <stdio.h>
#include <stdlib.h>
int main ( )
{
int nombre, temporaire, resultat;
do
{
printf("Donnez un entier naturel : ");
scanf("%d", &nombre);
}
while(nombre < 0);
return 0;
}
Remarque
Ce programme écrit pour calculer la factorielle de tout entier naturel ne peut, en réalité, le
faire que pour les entiers naturels inférieurs à 13.
La Partie 3 (Les types de base en C) permettra de comprendre cette "faiblesse".
Page 11 of 63
Thème 3 : Objets et types
Introduites par la chaîne # include, elles permettent d’inclure le contenu d’un fichier dans un
autre. Ces fichiers inclus sont des fonctions de la bibliothèque standard.
En effet, la directive include permet d’incorporer des fichiers .h (ou fichiers en-tête ou
headers) issus de la bibliothèque standard à un code source.
Par exemples :
stdio.h fournit les capacités centrales d’entrée/sortie, comme les fonctions d’affichage
et de saisie ;
Différentes des constantes classiques, les constantes au préprocesseur sont introduites par la
chaîne # define. La directive define permet d’associer une valeur à un identificateur.
Les variables externes ou variables globales sont les variables déclarées en dehors de toutes
les fonctions, y compris la fonction principale.
La fonction principale en C correspond à l’algorithme principal en algorithmique.
Page 12 of 63
Thème 3 : Objets et types
Les fonctions secondaires sont les fonctions créées par l’auteur du programme. Une fonction
secondaire est l’équivalent d’une procédure ou d’une fonction en algorithmique.
Une fonction secondaire est introduite par la chaîne # include.
Bien que créée par l’auteur du programme, la fonction principale est différente d’une fonction
secondaire.
Les fonctions créées par l’auteur sont de deux groupes : un groupe constitué d’une seule
fonction qui est la fonction principale, et un groupe constitué des fonctions secondaires.
// la fonction principale
int main ( )
{
déclarations des variables locales
instruction_1
instruction_2
…
instruction_n
return 0 ; // dernière instruction du programme
}
Page 13 of 63
Thème 3 : Objets et types
Notion de compilation
Un projet en C est constitué de plusieurs fichiers source dont notamment le fichier principal
(fonction principale), les fichiers secondaires (les fonctions secondaires) et les fichiers de la
bibliothèque standard (les fonctions prédéfinies).
1. la précompilation
Le préprocesseur est un programme qui démarre avant la compilation. Son rôle est d’exécuter
les instructions spéciales qui lui sont données dans les directives au préprocesseur.
Lors de cette étape, le préprocesseur met à l’intérieur de chaque fichier .c (fichier source de
fonction secondaire) le contenu des fichiers .h qu’on a demandé d’inclure. Le principe
généralement appliqué consiste à écrire un fichier .h pour chaque fichier .c sauf pour la
fonction principale (main.c).
2. la compilation
Cette étape consiste à transformer les fichiers source en code binaire compréhensible par
l’ordinateur. Le compilateur compile les fichiers .c du projet un à un.
Le compilateur génère un fichier .o ou .obj (selon le compilateur utilisé) par fichier .c
compilé. Les fichiers obtenus sont des fichiers binaires.
3. L’édition de liens
L’éditeur de liens (ou linker en anglais) est un programme qui a pour rôle d’assembler les
fichiers binaires générés lors de la phase précédente en un seul "gros" fichier : l’exécutable.
Cet exécutable a pour extension .exe sous Windows.
Soit Mon_Projet, le nom du projet créé. Code Blocks a créé un dossier nommé Mon_Projet.
Ce dossier contient un autre dossier nommé Bin. Lorsqu’on ouvre Bin, on y trouve le dossier
nommé Debug. C’est à l’intérieur de Debug que se trouve l’exécutable. Ce dernier porte le
même nom que le projet.
Page 14 of 63
Thème 3 : Objets et types
Page 15 of 63
Thème 3 : Objets et types
PARTIE 2
Page 16 of 63
Thème 3 : Objets et types
Les structures de données sont utilisées pour le stockage et la manipulation des données.
On parle généralement de structure de données pour les objets permettant de stocker plusieurs
données tels que les tableaux, les énumérations et les structures.
Les objets ne stockant qu’une seule donnée sont les variables scalaires et les constantes.
• les fonctions
Il s’agit ici de la fonction principale, des fonctions secondaires et des fonctions prédéfinies.
Le tableau ci-dessous présente les objets qui seront utilisés dans ce cours d’initiation avec
leurs équivalents respectifs en algorithmique :
En C, tout objet doit être impérativement déclaré avant d’être utilisé dans un programme.
On donne alors ses caractéristiques : son identificateur, son type et si possible sa valeur.
Lorsque l’on déclare un objet, le système d’exploitation lui réserve un espace dans la mémoire
vive de l’ordinateur pour la mémorisation de cet objet. Cet objet est repéré en mémoire par
une adresse qui représente la quatrième caractéristique de l’objet.
La notion d’adresse est très importante en langage C ; en effet, avec l’adresse, on a, à la fois,
la localisation de l’objet en mémoire et sa valeur.
Pour manipuler un objet par l’intermédiaire de son adresse, on utilise un pointeur.
Page 17 of 63
Thème 3 : Objets et types
PARTIE 3
Page 18 of 63
Thème 3 : Objets et types
En C, la notion de type d’un objet repose aussi sur deux autres caractéristiques :
− le domaine minimal (couvert par les valeurs pouvant être prises par l’objet) ;
− et la taille minimale de l’objet en mémoire.
Les types de base sont les types à partir desquels on construit les types dits structurés ou
agrégés.
En C, les types de base se répartissent en trois grandes catégories selon la nature des
informations qu’ils permettent de représenter :
Dans le C standard, on dispose de trois types d’entiers introduits par le mot-clé int (short, int
et long) avec leurs variantes signed et unsigned.
Le type long long (avec ses variantes signed et unsigned) n’existe pas dans le C standard ; il a
été introduit par la norme C99.
Page 19 of 63
Thème 3 : Objets et types
Ils permettent de représenter, de manière approchée, une partie des nombres réels.
Le type unsigned char a été introduit par la norme C89 (il n’existe pas dans le C K&R).
Le type chaîne de caractères n’existe pas en C. Alors, on utilise un vecteur de type caractère
pour simuler une chaîne de caractères, d’où un traitement particulier du concept de chaîne de
caractères (voir Thème 8).
Le type booléen n’existe pas dans le C standard, il a été introduit par la norme C99.
On sait que ce type n’admet que deux valeurs : vrai et faux. Pour contourner ce manque, on
remplace vrai et faux respectivement par les entiers 1 et 0.
En C99, le type est bool et les valeurs sont true (vrai) et false (faux) dans stdbool.h
Dans tous les cas, les Tables de vérité (cf. algèbre de Boole) étudiées en algorithmique
demeurent valables.
Page 20 of 63
Thème 3 : Objets et types
Les types entiers, flottants et caractères peuvent être englobés par le terme type numérique.
Donc ce type regroupe tous les nombres : les entiers et les réels.
Opérations Opérateurs
addition +
soustraction -
multiplication *
division (ou division décimale)
division entière (ou division euclidienne) /
reste d’une division entière (ou modulo) %
incrémentation ++ (a ← a + 1 équivaut à a++)
décrémentation -- (a ← a - 1 équivaut à a--)
Opérateurs Signification
== est égal
> est strictement supérieur
< est strictement inférieur
>= est supérieur ou égal
<= est inférieur ou égal
!= est différent de
Opérateurs Signification
&& ET
|| OU
! NON
Remarque : Le symbole | (barre verticale) s’obtient sur clavier AZERTY par la combinaison
de touches Alt Gr + 6.
Page 21 of 63
Thème 4 : Les instructions élémentaires
THÈME 4
Page 22 of 63
Thème 4 : Les instructions élémentaires
1. Rappels
Une instruction est un ordre que l’on donne à l’ordinateur. Elle commande l’exécution
immédiate d’une opération.
Les instructions élémentaires sont des instructions simples. Il y en a quatre : la déclaration d’un
objet, l’affectation (ou assignation), l’affichage (ou écriture ou édition), et la saisie (ou
lecture).
En C, tout objet doit être impérativement déclaré avant d’être utilisé dans un programme.
Ici, on déclarera les variables simples. La déclaration des variables complexes s’effectuera au
fil des thèmes.
Exemples
int coefficient ;
float moyenmath ;
2.2. l’affectation
L’affectation est une opération qui consiste à stocker la valeur d’une expression dans une
variable.
Exemples
Page 23 of 63
Thème 4 : Les instructions élémentaires
const < type de base > < identificateur_de_l’objet > = < valeur > ;
Cette déclaration s’effectue à l’intérieur de la fonction dans laquelle l’objet sera utilisé.
Exemples
Cette déclaration s’effectue dans les lignes spéciales, et l’identificateur de l’objet doit être écrit
en majuscule.
Exemples
L’avantage principal des constantes de préprocesseur est qu’elles n’occupent pas d’espace en
mémoire, contrairement aux constantes classiques.
2.3. l’écriture
L’écriture ou (affichage) est une opération qui permet d’écrire (ou d’afficher ou d’éditer) une
valeur (ou la valeur d’une expression) à l’écran.
Page 24 of 63
Thème 4 : Les instructions élémentaires
Pour afficher la phrase "La recette est de 14.3 millions FCFA" à l’écran :
float montantrecette ;
montantrecette = 14.3
;
printf ("La somme est de %f et %d est : %f ", nbre1, nbre2, nbre1 + nbre2) ;
Page 25 of 63
Thème 4 : Les instructions élémentaires
on utilise le symbole % suivi d’une <lettre> pour afficher le contenu d’une variable de
type <type> , le tout étant délimité par des apostrophes (" ") ;
pour afficher les contenus de plusieurs variables dans un même printf, il faut d’abord
indiquer les formats (par exemples %d, %f, %c) aux emplacements où l’on veut faire
apparaître les contenus, et ensuite indiquer les variables correspondantes dans le même
ordre, séparées par des virgules ;
2.4. la lecture
La fonction prédéfinie scanf permet de récupérer des données et de les stocker aux adresses
indiquées par les arguments de la fonction. Elle a pour syntaxe générale :
Page 26 of 63
Thème 4 : Les instructions élémentaires
Exemple
Les principales règles pour effectuer une saisie avec la fonction scanf
Les fonctions de saisie de données sont nombreuses (par exemples : scanf, gets, fgets)
On privilégiera la fonction scanf pour sa relative facilité d’utilisation bien qu’elle ait
un fonctionnement interne complexe.
Page 27 of 63
Thème 4 : Les instructions élémentaires
On utilise des apostrophes pour désigner un caractère imprimable (par exemples : 'A', '£', '%').
Les caractères non imprimables tels que l’antislash (\), l’apostrophe ('), le point
d’interrogation (?) et les guillemets ("), ne peuvent pas être désignés de la même façon. On
les fait alors précéder d’un antislash pour les désigner (\\, \', \? et \").
Par exemples
Page 28 of 63
Thème 6 : Les structures de contrôle
THÈME 5
Page 29 of 63
Thème 6 : Les structures de contrôle
PARTIE 1
Page 30 of 63
Thème 6 : Les structures de contrôle
Exercices d’application
Exercice d’application 1 : Test de parité
Écrire un programme qui détermine la parité d’un nombre. On suppose que l’utilisateur ne
saisira que des entiers naturels.
Écrire un programme qui affiche la décision concernant un élève donné. On suppose que
l’utilisateur ne saisira pas de moyennes fantaisistes.
Page 31 of 63
Thème 6 : Les structures de contrôle
2. La structure switch
Commentaires
Exercices d’application
Écrire un programme qui intègre si possible un élève à une catégorie, à la saisie de son année
de naissance. On suppose que l’utilisateur ne saisira pas d’année de naissance fantaisiste.
Les catégories selon les tranches d’âge sont les suivantes :
Poussin : de 6 à 7 ans
Pupille : de 8 à 9 ans
Minime : de 10 à 11 ans
Cadet : 12 à 13 ans
Écrire un programme qui permet d’effectuer l’une ou l’autre des opérations ci-dessous sur
trois nombres, à partir d’un menu :
additionner
multiplier
rechercher le minimum
rechercher le maximum
On admettra qu’un menu est une liste d’options affichées à l’écran de l’ordinateur.
Page 32 of 63
Thème 6 : Les structures de contrôle
PARTIE 2
Page 33 of 63
Thème 6 : Les structures de contrôle
1. La boucle while
Commentaires
Exercices d’application
Écrire un programme qui demande la saisie d’un entier naturel strictement positif. Le
programme valide la saisie si elle est correcte, sinon il invite l’utilisateur à recommencer.
Écrire un programme qui affiche les entiers naturels de 1 à n, n étant un entier naturel
strictement supérieur à 1, saisi au clavier.
Page 34 of 63
Thème 6 : Les structures de contrôle
Répéter do
instruction_1 {
instruction_2 instruction_1 ;
… instruction_2 ;
instruction_n …
Jusqu’à (condition) instruction_n ;
}
while (expression booléenne) ;
Commentaires
Exercices d’application
Écrire un programme qui affiche les entiers naturels de 1 à n, n étant un entier naturel
strictement supérieur à 1, saisi au clavier.
Écrire un programme qui permet de résoudre une équation du premier degré, autant de fois
que l’utilisateur le souhaite.
Page 35 of 63
Thème 6 : Les structures de contrôle
3. La boucle for
La boucle for n’est pas l’équivalent strict de la "répétition avec compteur" telle qu’exprimée
avec la boucle Pour en algorithmique. Cependant, la boucle for est généralement utilisée
comme équivalent de la boucle Pour.
Pour < identificateur > ← < valeur initiale > à < valeur finale > [Pas de < incrément >] Faire
bloc d’instructions
FinPour
Formes courantes
incrémentation (p ≤ q et on part de p à q)
décrémentation (p ≤ q et on part de q à p)
Page 36 of 63
Thème 6 : Les structures de contrôle
L’instruction break peut être utilisée dans une boucle. Dans ce cas elle permet d’interrompre
le déroulement d’une boucle, en passant à l’instruction qui suit cette boucle.
Page 37 of 63
Thème 6 : Les structures de contrôle
Exercices d’application
Écrire un programme qui affiche les entiers naturels de 1 à n, n étant un entier naturel
strictement supérieur à 1, saisi au clavier.
Écrire un programme qui affiche un triangle rempli d’étoiles, s’étendant sur un nombre lignes
fourni en entrée et se présentant comme dans l’exemple ci-dessous :
*
**
***
****
*****
nombre 1 : 235
nombre 2 : 50.47
… :…
… :…
… :…
nombre n : -1.031
Moyenne des n nombres : xxxxx
Reprendre l’exercice précédent sachant que chaque nombre est compris entre compris entre 0
et 20.
Page 38 of 63
Thème 7 : Les tableaux
THÈME 6
LES TABLEAUX
Page 39 of 63
Thème 7 : Les tableaux
PARTIE 1
Page 40 of 63
Thème 7 : Les tableaux
Par exemple
L’instruction int T[5] ; permet de déclarer un tableau nommé T, de taille 5 et de type entier.
Supposons que le tableau T contienne dans cet ordre les entiers 12 ; 0 ; -12 ; 452 et 1000.
On procède par des affectations successives :
T[0] = 12 ;
T[1] = 0 ;
T[2] = -12 ;
T[3] = 452 ;
T[4] = 1000 ;
Remarque
Page 41 of 63
Thème 7 : Les tableaux
3. Quelques règles
V[n] désigne une cellule mémoire située en dehors du tableau : il y a débordement d’indice.
La plupart des compilateurs C n’effectuent aucun contrôle de débordement d’indice.
La notation V[i] désigne à la fois :
la cellule d’indice i,
et le contenu de la cellule d’indice i.
En C, la dimension d’un tableau ne peut être qu’une constante ou une expression constante
(cas de C99). Ainsi la construction :
#define N 50
…
int M[N] ;
float H[2*N - 1] ;
est admise. Cependant, cette construction ne serait pas admise si N était une constante
symbolique définie par const int N = 50, car les expressions N et 2*N - 1 ne seraient plus
calculables par le compilateur.
Page 42 of 63
Thème 7 : Les tableaux
Exercices d’application
Pour tous les exercices, on admettra qu’une note est un nombre compris entre 0 et 20, et que
les notes sont saisies au clavier.
Écrire un programme qui permet de déterminer, à partir de dix notes, combien d’entre elles
sont supérieures ou égales à la moyenne de la classe.
Écrire un programme qui permet de trier dix notes dans l’ordre croissant.
Écrire un programme qui permet de rechercher une note parmi dix notes.
Page 43 of 63
Thème 7 : Les tableaux
PARTIE 2
Page 44 of 63
Thème 7 : Les tableaux
Par exemple
Un élément quelconque de ce tableau est repéré par deux indices comme dans la notation :
M[0][1], M[3][2] et M[2][2].
Par exemples :
M[0][0] = 12 ;
M[2][1] = 0 ;
M[2][2]= -12 ;
M[4][1] = 452 ;
M[4][2] = 1000 ;
Page 45 of 63
Thème 7 : Les tableaux
Ou encore :
Par exemple : les instructions ci-dessous permettent de déclarer un tableau à taille variable.
Page 46 of 63
Thème 7 : Les tableaux
Exercices d’application
Écrire un programme qui remplit de réels une matrice carrée d’ordre 3, et ensuite l’affiche.
Écrire un programme qui effectue la somme de deux matrices carrées d’ordre 3 de réels.
Page 47 of 63
Thème 8 : La programmation modulaire
THÈME 7
LA PROGRAMMATION MODULAIRE
Page 48 of 63
Thème 8 : La programmation modulaire
PARTIE 1
LES FONCTIONS
Page 49 of 63
Thème 8 : La programmation modulaire
1. Rappels
Tout programme C est constitué de modules appelées fonctions. Une fonction est le résultat de
la décomposition d’un problème en sous-problèmes.
Les fonctions de la bibliothèque standard sont des fonctions prédéfinies par le langage C.
Le schéma de création d’une fonction en langage C suit le même principe que celui du
langage algorithmique :
type_de _la_fonction nom_de _la_fonction (listes des paramètres formels avec leurs types respectifs)
{
instruction_1 ;
instruction_2 ;
.
.
.
instruction_n ;
return < expression > ;
}
Une fonction doit contenir au moins une fois l’instruction return < variable > ou l’instruction
return valeur ou plus généralement l’instruction return < expression >.
Cette instruction permet à la fonction de retourner le résultat du traitement effectué chaque
fois que cela est nécessaire.
La fonction est du même type que la valeur retournée.
Une fonction qui ne retourne rien ne possède pas de return. Elle est alors du type void
Une telle fonction équivaut à la procédure en algorithmique.
Page 50 of 63
Thème 8 : La programmation modulaire
void nom_de _la_fonction (listes des paramètres formels avec leurs types respectifs)
{
instruction_1 ;
instruction_2 ;
.
.
.
instruction_n ;
}
Exercice 1 : écrire une fonction qui retourne le triple d’un entier qu’il reçoit en paramètre.
Exercice 2 : écrire une fonction qui retourne la somme de trois nombres reçus en paramètre.
Exercice 3 : écrire une fonction qui affiche la phrase "J’aime le langage C".
Exercice 4 : écrire une fonction qui retourne 1 si le nombre qu’il reçoit est pair, et 0 sinon.
L’appel d’une fonction s’effectue dans la fonction principale ou dans une autre fonction.
Il doit se faire notamment :
On écrit la fonction principale et les fonctions secondaires dans le même fichier source, mais
les fonctions secondaires doivent précéder la fonction principale.
Le fichier source devient de moins en moins lisible lorsque le nombre de fonctions s’accroit.
Dans la pratique, il est recommandé d’écrire une fonction par fichier. Il y aura alors autant
de fonctions (fonction principale et fonctions secondaires) que de fichiers.
Cette approche recommande de :
décomposer le problème en sous-problème ;
écrire une fonction pour chaque sous-problème ;
placer chaque fonction dans un fichier source distinct.
C’est le principe de la programmation modulaire.
Page 51 of 63
Thème 8 : La programmation modulaire
PARTIE 2
Page 52 of 63
Thème 8 : La programmation modulaire
Comme tout objet, une fonction doit être impérativement déclarée avant toute utilisation.
La déclaration d’une fonction se réalise à l’aide de son prototype.
Il existe une autre forme d’écriture de prototype. Dans cette dernière, on n’indique que les
types des paramètres, les identificateurs de ceux-ci étant omis :
a pour prototype :
ou encore :
On écrit le prototype d’une fonction dans un fichier particulier appelé fichier en-tête ou
header, en anglais. Un fichier header est un fichier qui contient le prototype d’une fonction.
Page 53 of 63
Thème 8 : La programmation modulaire
Un projet en C est composé de plusieurs fichiers classés en deux grands groupes dans la zone
de gestion de projet de l’IDE : les fichiers .c et les fichiers .h
Les .c sont les fichiers source, ils contiennent la description des fonctions (leurs instructions)
tandis que les .h sont les fichiers headers.
Il y a donc autant de fonctions que de headers, seule la fonction principale (main.c) n’en
possède pas.
Pour que la fonction principale puisse reconnaître les fonctions créées et les exécuter, il faut
inclure les fichiers .h de ces dernières.
On réalise cette opération à l’aide d’une directive au préprocesseur, en écrivant dans la zone
des lignes spéciales :
REMARQUES
1. On utilise
les chevrons < > pour inclure les fichiers de la bibliothèque standard ;
les guillemets " " pour inclure les fichiers headers des fonctions que l’on a
créées.
2. On peut regrouper tous les headers dans un fichier unique. Ce fichier sera inclus dans
tous les fichiers sources du programme (fonction main et les autres fonctions créées).
Un projet en C est constitué de plusieurs fichiers source dont le fichier principal (fonction
principale), les fichiers secondaires (les fonctions secondaires) et les fichiers de la bibliothèque
standard (les fonctions prédéfinies).
2.2.1. la précompilation
Le préprocesseur est un programme qui démarre avant la compilation. Son rôle est d’exécuter
les instructions spéciales qui lui sont données dans les directives au préprocesseur.
Lors de cette étape, le préprocesseur met à l’intérieur de chaque fichier .c (fichier source de
fonction secondaire) le contenu des fichiers .h qu’on a demandé d’inclure. Le principe
généralement appliqué consiste à écrire un fichier .h pour chaque fichier .c sauf pour la
fonction principale (main.c).
Page 54 of 63
Thème 8 : La programmation modulaire
2.2.2. la compilation
Cette étape consiste à transformer les fichiers source en code binaire compréhensible par
l’ordinateur. Le compilateur compile les fichiers .c du projet un à un.
Le compilateur génère un fichier .o ou .obj (selon le compilateur utilisé) par fichier .c
compilé. Les fichiers obtenus sont des fichiers binaires.
L’éditeur de liens (ou linker en anglais) est un programme qui a pour rôle d’assembler les
fichiers binaires générés lors de la phase précédente en un seul "gros" fichier : l’exécutable.
Cet exécutable a pour extension .exe sous Windows.
Page 55 of 63
Thème 8 : La programmation modulaire
Écrire un programme qui calcule la surface et le périmètre d’un rectangle. On supposera que
les unités de mesures concordent.
Solution
Le projet comprendra :
Trois fonctions :
Et deux lignes spéciales pour inclure les fichiers headers des fonctions créées :
# include "calculerSurfaceRectangle.h"
# include "calculerPerimetreRectangle.h"
Page 56 of 63
Thème 8 : La programmation modulaire
1. Le code ci-dessous est celui de la fonction principale (il peut être amélioré) :
1. numéroter les lignes du code ;
2. repérer les lignes d’inclusions des fichiers headers puis donner leurs rôles
respectifs ;
3. repérer les lignes d’appels des fonctions.
#include <stdio.h>
#include <stdlib.h>
#include "calculerSurfaceRectangle.h"
#include "calculerPerimetreRectangle.h"
int main()
{
float longueur, largeur;
do
{
printf("Donnez la mesure de la longueur : ");
scanf("%f", &longueur);
}
while(longueur <= 0);
printf("\n\n");
do
{
printf("Donnez la mesure de la largeur (largeur < %f): ", longueur);
scanf("%f", &largeur);
}
while(longueur <= largeur);
printf("\n\n");
return 0;
}
Page 57 of 63
Thème 8 : La programmation modulaire
On va créer les fichiers source des fonctions écrites précédemment, la fonction main n’étant
pas concernée.
D’abord :
effectuer File / New / File…
dans la boîte de dialogue apparue, double-cliquer sur l’icône C/C++ source
dans la boîte de dialogue apparue, cliquer sur le bouton Next
dans la boîte de dialogue apparue, cliquer sur C puis cliquer sur le bouton Next
dans la boîte de dialogue apparue :
o dans le champ Filename with full path, écrire le nom de la fonction
o puis indiquer son emplacement (l’enregistrer dans le dossier du projet)
o en-dessous, cocher Debug et Release (ou cliquer sur le bouton All)
o cliquer sur le bouton Finish
constater que l’IDE a :
o ouvert un fichier vierge (destiné à l’écriture d’une fonction)
o placé, dans la zone de gestion de projet, dans le dossier Sources, une icône
représentant le fichier de la fonction à créer.
Enfin : dans la barre d’outils, cliquer sur l’icône Save pour enregistrer le contenu du fichier
source.
On va créer les fichiers headers des fonctions écrites précédemment, la fonction main n’étant
pas concernée.
Enfin : dans la barre d’outils, cliquer sur l’icône Save pour enregistrer le contenu du fichier
header.
Page 58 of 63
Thème 8 : La programmation modulaire
Le fichier main.c et les fichiers .c sont regroupés dans le dossier Sources, tandis que les
fichiers .h sont regroupés dans le dossier Headers, comme le montre la figure ci-dessous :
On remarque qu’à tout fichier .c correspond un fichier .h, la fonction main.c n’étant pas
concernée.
Remarque : Toute fonction doit contenir au moins les lignes spéciales ci-dessous :
#include <stdio.h>
#include <stdlib.h>
Page 59 of 63
Thème 8 : La programmation modulaire
Une fonction peut déclarer ses propres variables : ce sont des variables locales.
Une telle variable n’est accessible qu’à l’intérieur de la fonction dans laquelle elle a été
déclarée, et son contenu se vide à la fin de l’exécution de la fonction.
Les variables déclarées dans la fonction main sont aussi des variables locales.
Les variables globales sont déclarées en dehors de toutes les fonctions, précisément juste
après les lignes spéciales.
Une variable globale est accessible dans toutes les fonctions, et son contenu ne se vide qu’à la
fin de l’exécution du programme.
Les variables globales sont déconseillées dans la pratique.
nom_de_la_fonction (identificateur_du_tableau) ;
Écrire un programme qui affiche un vecteur de 5 entiers et une matrice (2 × 3) d’entiers, ces
tableaux étant saisis en entrée.
Page 60 of 63
Thème 8 : La programmation modulaire
SOLUTION
1. la fonction principale
#include <stdio.h>
#include <stdlib.h>
#include "saisirVecteur.h"
#include "saisirMatrice.h"
#include "afficherVecteur.h"
#include "afficherMatrice.h"
int main( )
{
int T[5] ;
int N[2][3] ;
printf("\n\n") ;
printf("\n\n") ;
printf("Voici les éléments de la matrice…\n\n") ;
afficherMatrice(M) ;
printf("\n\n") ;
return 0 ;
}
Page 61 of 63
Thème 8 : La programmation modulaire
2. les fonctions
#include <stdio.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdlib.h>
Page 62 of 63
Thème 8 : La programmation modulaire
3. les prototypes
Page 63 of 63