Vous êtes sur la page 1sur 63

Thème 1 : Présentation du Langage C

THÈME 1

PRÉSENTATION DU LANGAGE C

Page 1 of 63
Thème 1 : Présentation du Langage C

1. Une brève histoire 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

C est un langage de programmation impératif, procédural et structuré. En C, chaque


instruction est conçue pour être compilée en un nombre d’instructions machine assez
prévisible en termes d’occupation mémoire et de charge de calcul : c’est un langage de bas
niveau. Cependant, C est un langage généraliste.

Le langage C a énormément évolué par rapport au C traditionnel (ou C K&R) défini à


l’origine. Ces différentes évolutions ont été certifiées par l’International Standard
Organization (ISO) qui en publie les normes.
Ainsi, après la norme C89, les normes majeures sont C99 et C11, C11 étant la norme adoptée
en 2011.

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

LES OUTILS POUR LA PROGRAMMATION

Page 3 of 63
Thème 2 : Les outils pour la programmation

1. Éditeur de texte, compilateur et débogueur

Pour programmer, on a besoin de trois principaux outils :

1.1. un éditeur de texte

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).

2. Présentation d’un IDE : Code::Blocks

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.

2.1. Les principaux composants de la fenêtre principale de Code Blocks

Lorsqu’on lance Code Blocks, sa fenêtre principale apparaît, présentant ses composants :

2.1.1. la barre de titre

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.

2.1.2. la barre des menus

La barre des menus est placée juste en dessous de la barre de titre.


Elle présente quinze (15) menus dont, de gauche à droite : File, Edit, View, Search et Project.
Les noms des menus sont écrits sur des onglets.
Cliquer sur un onglet permet d’afficher les commandes qu’elle renferme.

Page 4 of 63
Thème 2 : Les outils pour la programmation

2.1.3. la barre d’outils

La barre d’outils est placée juste en dessous de la barre des menus.


Elle présente de nombreuses icônes (ou boutons). Chaque icône représente une commande
précise. Lorsqu’on pointe une icône, son nom apparaît. Par défaut, la barre d’outils apparaît sur
trois lignes. Les icônes de la première ligne sont rangées en trois blocs :
 le premier bloc débute par les icônes New file, Open, Save et Save all.
 le deuxième bloc comprend les boutons Build, Run, Build and Run, Rebuild et Abort.
 le troisième bloc débute par l’icône Debug / Continue.

2.1.4. la zone de gestion de projet

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.

2.1.5. la zone principale

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.

2.1.6. la zone de notification

Elle est située en dessous de la zone principale.


C’est dans cette zone que Code Blocks affiche des messages relatifs :
 aux erreurs de compilation ;
 aux avertissements ;
 au succès de la compilation ;
 au temps d’exécution d’un programme.

Page 5 of 63
Thème 2 : Les outils pour la programmation

Fenêtre principale de Code Blocks 17.12

2.2. Les quatre boutons les plus utilisés lors de 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.

2.2.1. Build [Compiler]

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.

2.2.2. Run [Exécuter]

Cette icône permet de lancer le dernier exécutable compilé.

2.2.3. Build and run [Compiler et exécuter]

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.

2.2.4. Rebuild [Tout recompiler]

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

2.3. La création d’un nouveau projet

2.3.1. dossier de projet et type de programme

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).

Donc avant de débuter un projet, il faut savoir à l’avance :


 où l’on stockera le dossier du projet
 et le type de programme (console ou fenêtre).

Pour ce cours d’apprentissage, on créera (sur le bureau de l’ordinateur ou à un autre


emplacement) le dossier nommé Espace C qui recevra tous les projets à créer, et on optera pour
les programmes en mode console.

2.3.2. les étapes de la création d’un projet

Pour créer un nouveau projet, il faut suivre rigoureusement la procédure ci-dessous :

 dans la barre des menus, cliquer sur File


 dans le menu apparu, pointer New
 dans le deuxième menu apparu, cliquer sur Project…
 dans la fenêtre apparue, cliquer sur Console application puis sur Go
 dans l’assistant qui est apparu, cliquer sur Next
 dans la boîte de dialogue apparue, sélectionner C
 dans la boîte de dialogue apparue, indiquer :
 le nom/titre du projet à créer (Project title)
 le nom du dossier dans lequel les fichiers source du projet seront enregistrés
(Folder to create project in)

 cliquer sur Next


 dans la boîte de dialogue apparue, laisser les options par défaut :
 nom du compilateur : GNU GCC Compiler
 cocher les deux autres options si elles ne le sont pas

 cliquer sur Finish

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.

On peut maintenant commencer à écrire le code source du programme à créer.

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

STRUCTURE D’UN PROGRAMME C

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;

printf("\t\t CALCUL DE LA FACTORIELLE D'UN NOMBRE\n\n");

do
{
printf("Donnez un entier naturel : ");
scanf("%d", &nombre);
}
while(nombre < 0);

if((nombre == 0)||(nombre == 1))


{
resultat = 1;
}
else
{
resultat = 1;
temporaire = nombre;
while(temporaire > 1)
{
resultat = temporaire * resultat;
temporaire = temporaire - 1;
}
}

printf("La factorielle de %d est : %d", nombre, resultat);

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

2. Les principales parties d’un programme

Un programme C est constitué de petites fonctions. Certaines de ces fonctions sont


prédéfinies, et sont regroupées dans la bibliothèque standard, tandis que les autres sont créées
par le concepteur du programme.

Un programme C s’organise autour de deux principales parties : les lignes spéciales et la


fonction principale.

2.1. les lignes spéciales

Les lignes spéciales sont constituées de directives au préprocesseur, de constantes de


préprocesseur, de déclarations de variables externes (variables globales) et de déclarations
de fonctions secondaires.
Elles sont regroupées au début du fichier source du programme.

2.1.1. les directives au préprocesseur

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 :

 stdlib.h permet d’exécuter diverses opérations dont la conversion, la génération de


nombres pseudo-aléatoires, l’allocation de mémoire, le contrôle de processus, la
gestion de l’environnement et des signaux, la recherche et le tri ;

 stdio.h fournit les capacités centrales d’entrée/sortie, comme les fonctions d’affichage
et de saisie ;

 string.h permet de manipuler des chaînes de caractères ;

 math.h pour utiliser des fonctions mathématiques courantes.

2.1.2. les constantes de préprocesseur

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.

2.1.3. les déclarations de variables externes (variables globales)

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

2.1.4. les fonctions secondaires

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.

2.2. la fonction principale

Un programme C est en réalité constitué de deux groupes de fonctions : les fonctions de la


bibliothèque standard et les fonctions crées par l’auteur.

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 est l’équivalent de l’algorithme principal en algorithmique.

3. Schéma général (du fichier source) d’un programme

// les lignes spéciales


les directives au préprocesseur
les constantes de préprocesseur
les déclarations de variables globales
les 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).

À l’issue de la compilation, cet agrégat de fichiers est transformé en un programme


"matérialisé" par un fichier exécutable.

Réalisée par l’IDE, la compilation se déroule en trois grandes étapes :

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

Les étapes de la compilation sont résumées dans le schéma ci-dessous :

Schéma générale de la compilation

Page 15 of 63
Thème 3 : Objets et types

PARTIE 2

LES OBJETS UTILISÉS DANS UN PROGRAMME C

Page 16 of 63
Thème 3 : Objets et types

Lors de l’écriture d’un programme, en fonction du problème à résoudre, on a souvent besoin


d’utiliser des objets qui vont servir :
- soit à ranger des données (en entrée et en sortie) ;
- soit à contenir des instructions résultant de la décomposition du problème.

1. Les principaux objets utilisés

• les structures de données

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 :

Objets en langage C Objets en langage algorithmique


variables scalaires variables scalaires
constantes constantes
tableaux tableaux
énumérations énumérations
structures enregistrements
fonctions fonctions, procédures, fonctions prédéfinies

2. Les caractéristiques d’un objet

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.

Un pointeur est une variable qui contient l’adresse d’un objet.

Page 17 of 63
Thème 3 : Objets et types

PARTIE 3

LES TYPES DE BASE EN C

Page 18 of 63
Thème 3 : Objets et types

1. Notion de type d’un objet

Le type d’un objet est défini :


− d’une part, par l’ensemble des valeurs que cet objet peut prendre ;
− et d’autre part, par l’ensemble des opérateurs que l’on peut appliquer à ces valeurs.

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.

2. Les types élémentaires

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 :

Nature de l’information (mot-clé du) Type de base


nombres entiers int
nombres flottants float ou double
caractères char

2.1. les types entiers

Dénomination Spécificateurs Domaine minimal Taille (en octet)


short -32 767
entier court signé short int à
signed short +32 767
signed short int
entier court non unsigned short ≥2
0 à +65 535
signé unsigned short int
entier signé signed int -32 767 à +32 767
entier non signé unsigned int 0 à +65 535
entier long signé signed long -2 147 483 647 à
+2 147 483 647 ≥4
entier long non unsigned long 0 à 4 294 967 295
signé
entier très long signed long long -9 223 372 036 854 775 807 à
signé +9 223 372 036 854 775 807 ≥8
entier très long non unsigned long 0à
signé long +18 446 744 073 709 551 615

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

2.2. les types flottants

Ils permettent de représenter, de manière approchée, une partie des nombres réels.

Spécificateurs Domaine minimal Précision minimale


float 10-37 à 10+37 6 décimales
double 10-37 à 10+37 10 décimales
long double 10-37 à 10+37 10 décimales

2.3. le type caractère

Le type caractère est d’un usage particulier en C. En effet, il peut servir :


− soit à stocker des caractères alphabétiques et d’autres symboles (cf. Table ASCII) ;
− soit à stocker de petits nombres entiers variant de -128 à +127.

Spécificateurs Domaine minimal Taille (en octets)


char -128 à +127, ou 0 à +255, selon l’implémentation
signed char -128 à +127 ≥2
unsigned char 0 à +255

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).

2.4. le type booléen

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

3. Les opérateurs mathématiques

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.

Le type numérique supporte les opérateurs arithmétiques, les opérateurs relationnels


(appelés aussi opérateurs de comparaison) et les opérateurs logiques booléens.

Les opérateurs arithmétiques :

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--)

Les opérateurs relationnels :

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

Ne pas confondre les symboles = et == ; en effet on utilise :


 = pour effectuer une affectation (voir Thème 4) ;
 == pour tester une égalité (voir Thème 5)

Les opérateurs logiques booléens :

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

LES INSTRUCTIONS ÉLÉMENTAIRES

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).

2. Présentation des instructions élémentaires

2.1. la déclaration d’un objet

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.

Cette opération a pour format général :

< type de base > < identificateur_de_l’objet > ;

Exemples

int coefficient ;
float moyenmath ;

float coef1, coef2, coef3, discriminant, solution1, solution2 ;


char reponse ;

2.2. l’affectation

L’affectation est une opération qui consiste à stocker la valeur d’une expression dans une
variable.

Cette opération est réalisée à l’aide de l’opérateur =


Elle a pour syntaxe :

< identificateur_de_l’objet > = < expression > ;

Exemples

int anneescolaire, age ; // déclarations de variables


anneescolaire = 2018 ; // affectation
age = 22 ; // affectation

Page 23 of 63
Thème 4 : Les instructions élémentaires

Cas particulier des constantes

 les constantes classiques

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

const float tva = 0.18 ;


const char reponsefavorable = 'O' ;

 les constantes de préprocesseur

#define < IDENTIFICATEUR_DE_L’OBJET > < valeur >

Cette déclaration s’effectue dans les lignes spéciales, et l’identificateur de l’objet doit être écrit
en majuscule.

Exemples

#define TVA 0.18


#define REPONSEFAVORABLE 'O'

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.

Cette opération a pour syntaxe générale :

printf (format, liste_d’expressions)

Page 24 of 63
Thème 4 : Les instructions élémentaires

2.3.1. afficher du texte

Pour afficher la phrase J’aime le langage C à l’écran, on écrit :

printf ("J’aime le langage C") ;

2.3.2. afficher le contenu d’une variable (ou d’une constante)

 Pour afficher le contenu de la variable age à l’écran :

printf ("%d", age) ; // la variable age étant de type int

 Pour afficher le contenu de la constante tva à l’écran :

printf ("%f", tva) ; // la constante tva étant de type float

 Pour afficher le contenu de la constante reponsefavorable à l’écran :

printf ("%c", reponsefavorable) ; // la constante reponsefavorable étant de type char

2.3.3. afficher le contenu de plusieurs variables

 Pour afficher le contenu de annescolaire, tva et age à l’écran :

printf ("%d, %f, %d", annescolaire, tva, age) ;

2.3.4. afficher du texte et le contenu d’une variable

Pour afficher la phrase "La recette est de 14.3 millions FCFA" à l’écran :

printf ("La recette est de %f millions FCFA", montantrecette) ;

en supposant les instructions ci-dessous ont été préalablement écrites :

float montantrecette ;
montantrecette = 14.3
;

2.3.5. afficher la valeur d’une expression

printf ("La somme est de %f et %d est : %f ", nbre1, nbre2, nbre1 + nbre2) ;

nbre1 + nbre2 étant une expression.

Page 25 of 63
Thème 4 : Les instructions élémentaires

Les principales règles pour effectuer un affichage

 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 ;

 Tableau des principaux formats d’impression (codes de conversion à l’affichage)

Format Conversion en… Écriture


%d int
%ld long int décimale signée
%u unsigned int
%lu unsigned long int décimale non signée
%f float, double
%lf double décimale avec 6 chiffres après le point
%c unsigned char caractère

 Cas particulier du type char

Instructions Commentaires ou résultats à l’affichage


char lettre = 'A' ; // déclaration suivie d’une affectation
printf ("%c", lettre) ; A
printf ("%d", lettre) ; 65 // 65 est le code numérique de A

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 :

scanf (format, liste_d’adresses)

Page 26 of 63
Thème 4 : Les instructions élémentaires

Exemple

int age, nbrenfant ;


double poids ;
printf ("Quel âge avez-vous ? : ") ;
scanf ("%d", &age) ;
printf ("Combien d’enfants avez-vous ? : ") ;
scanf ("%d", &nbrenfant ) ;
printf ("Quel est votre poids ? : ") ;
scanf ("%lf", &poids ) ;
printf ("Ah ! Vous avez %d ans, %d enfants et vous pesez %f kg", age, nbrenfant, poids) ;

Les principales règles pour effectuer une saisie avec la fonction scanf

 Pour effectuer une saisie, on écrit scanf ("%<lettre>", &<identificateur_de_l’objet>)


où &identificateur représente l’adresse de la variable dans laquelle on stocke la valeur
saisie.

 Tableau des principaux formats de saisie

Format Type d’objet pointé Représentation de la donnée saisie


%d int
%hd short int décimale signée
%ld long int
%u unsigned int
%hu unsigned short int décimale non signée
%lu unsigned long int
%f float
%lf double flottante virgule fixe
%Lf long double
%c char caractère

Remarque : Les fonctions de saisie

 Les fonctions de saisie de données sont nombreuses (par exemples : scanf, gets, fgets)

 Chaque fonction a ses particularités (qualités et défauts)

 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

3. Utilisation des caractères non imprimables

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 \").

Voici la liste des caractères disposant d’une notation spéciale :

Par exemples

 printf ("Bonjour ") ;


Cette instruction permet d’afficher le mot Bonjour.

 printf ("Bonjour \n") ;


Cette instruction permet d’afficher le mot Bonjour suivi d’un retour à la ligne.

 printf ("\t Bonjour") ;


Cette instruction permet d’afficher le mot Bonjour précédé d’une tabulation mais
sans retour à la ligne.

 printf ("\t Bonjour \n") ;


Cette instruction permet d’afficher le mot Bonjour précédé d’une tabulation et suivi
retour à la ligne.

Page 28 of 63
Thème 6 : Les structures de contrôle

THÈME 5

LES STRUCTURES DE CONTRÔLE

Page 29 of 63
Thème 6 : Les structures de contrôle

PARTIE 1

LES STRUCTURES CONDITIONNELLES

Page 30 of 63
Thème 6 : Les structures de contrôle

1. La structure if… else

La structure if correspond à la structure conditionnelle Si en algorithmique.

Langage algorithmique Langage C


Structure conditionnelle alternative
Si <condition> if (expression booléenne)
Alors < instruction_1> {
Sinon < instruction_2> instruction_1 ;
FinSi }
else
{
instruction_2 ;
}
Structure conditionnelle simple
Si < condition > if (expression booléenne)
Alors < instruction > {
FinSi instruction ;
}
Commentaires

La structure if s’utilise exactement comme la structure conditionnelle Si en algorithmique.

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.

Exercice d’application 2 : Définition d’un intervalle de réels

Écrire un programme qui détermine si un réel x appartient à l’intervalle ]15 ; 35].

Exercice d’application 3 : Décision de fin d’année

La direction d’une école a pris la décision suivante :


 moyenne annuelle supérieure ou égale à 10,00 : l’élève est admis
 moyenne annuelle comprise entre 9,00 et 10,00 : l’élève redouble
 moyenne annuelle strictement inférieure à 9,00 : l’élève est exclu

Écrire un programme qui affiche la décision concernant un élève donné. On suppose que
l’utilisateur ne saisira pas de moyennes fantaisistes.

Exercice d’application 4 : Résolution d’une équation du premier degré

Écrire un programme qui résout une équation du premier degré dans ℝ.

Page 31 of 63
Thème 6 : Les structures de contrôle

2. La structure switch

La structure switch est équivalente à la structure de choix en algorithmique.

Langage algorithmique Langage C

Suivant <variable > Faire switch (expression)


< (liste de) valeurs > : < action1 > {
< (liste de) valeurs > : < action2 > case constante_1 : bloc d’instructions_1
< (liste de) valeurs > : < action3 > break ;
… case constante_2 : bloc d’instructions_2
< (liste de) valeurs > : < action_n > break ;
Sinon : < action par défaut > case constante_n : bloc d’instructions_n
FinSuivant break ;
default : bloc d’instructions
break ;
}

Commentaires

La structure switch s’utilise exactement comme la structure de choix en algorithmique.


Chaque bloc d’instructions est suivi de l’instruction break ; qui permet de sortir du bloc
d’instructions courant. L’action par défaut est introduite par le mot-clé default.

Exercices d’application

Exercice d’application 1 : Intervalles d’âges

É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

Exercice d’application 2 : Quel est le menu du jour ?

É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

LES STRUCTURES RÉPÉTITIVES

Page 33 of 63
Thème 6 : Les structures de contrôle

1. La boucle while

La boucle while correspond à la boucle Tant Que en algorithmique.

Langage algorithmique Langage C

TantQue (condition) Faire while (expression booléenne)


instruction_1 {
instruction_2 instruction_1 ;
… instruction_1 ;
instruction_n …
FinTantQue instruction_n ;
}

Commentaires

La boucle while s’utilise exactement comme la boucle TantQue en algorithmique.

Exercices d’application

Exercice d’application 1 : Saisie d’un nombre selon un critère

É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.

Exercice d’application 2 : Affichage d’un intervalle de nombres selon un critère

Écrire un programme qui affiche les entiers naturels de 1 à n, n étant un entier naturel
strictement supérieur à 1, saisi au clavier.

Exercice d’application 3 : Réponse à une question

Écrire un programme qui permet de saisir la réponse à la question :


"Aimez-vous le Langage C (O/N) ? "

Exercice d’application 4 : Quel est le menu du jour ?

Reprendre l’exercice d’application 2 de la page 4 (la structure switch).

Page 34 of 63
Thème 6 : Les structures de contrôle

2. La boucle do… while

La boucle do… while correspond à la boucle Répéter… Jusqu’à en algorithmique.

Langage algorithmique Langage C

Répéter do
instruction_1 {
instruction_2 instruction_1 ;
… instruction_2 ;
instruction_n …
Jusqu’à (condition) instruction_n ;
}
while (expression booléenne) ;

Commentaires

La boucle do… while correspond à la boucle Répéter… Jusqu’à en algorithmique.


Cependant :
 en algorithmique, la condition du Jusqu’à régit l’arrêt de la boucle ;
 en C, l’expression du while régit la poursuite de la boucle.

Exercices d’application

Exercice d’application 1 : Réponse à une question

Écrire un programme qui permet de saisir la réponse à la question :


"Aimez-vous le Langage C (O/N) ? ".

Exercice d’application 2 : Affichage d’un intervalle de nombres selon un critère

Écrire un programme qui affiche les entiers naturels de 1 à n, n étant un entier naturel
strictement supérieur à 1, saisi au clavier.

Exercice d’application 3 : Résoudre plusieurs fois une équation du premier degré

Écrire un programme qui permet de résoudre une équation du premier degré, autant de fois
que l’utilisateur le souhaite.

Exercice d’application 4 : Quel est le menu du jour ?

Reprendre l’exercice d’application 2 de la page 4 (la structure switch).

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.

Syntaxe générale en langage algorithmique

Pour < identificateur > ← < valeur initiale > à < valeur finale > [Pas de < incrément >] Faire
bloc d’instructions
FinPour

Syntaxe générale en langage C

for ([expression_1] ; [expression_2] ; [expression_3] ; … ; [expression_n])


{
bloc d’instructions
}

Formes courantes

Langage algorithmique Langage algorithmique

incrémentation (p ≤ q et on part de p à q)

Pour (i ← p à q) Faire for (i = p ; i <= q ; i++)


bloc instructions {
FinPour bloc instructions
}

décrémentation (p ≤ q et on part de q à p)

Pour (i ← q à p) Pas (-1) Faire for (i = q ; i >= p ; i--)


bloc instructions {
FinPour bloc instructions
}
Commentaires
En C :
 expression_1 est l’initialisation du compteur de boucle (ici i est le compteur) ;
 expression_2 est la condition de poursuite ou d’arrêt de la boucle ;
 expression_3 sert à indiquer la valeur de l’incrément ;
 n étant la valeur de l’incrément, on a toujours n ≥ 1 :
 si n = 1 et qu’on incrémente de 1 pas, alors on écrit : i++
 si n = 1 et qu’on décrémente de 1 pas, alors on écrit : i—
 si n ≠ 1 et qu’on incrémente de n pas, alors on écrit : i += n
 si n ≠ 1 et qu’on décrémente de n pas, alors on écrit : i -= n
 en cas de décrémentation, il faut veiller à la concordance des bornes ;
 les expressions sont séparées par des points-virgules (;)

Page 36 of 63
Thème 6 : Les structures de contrôle

REMARQUE : l’instruction break

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.

Exemple d’utilisation de l’instruction break dans ou boucle for

Page 37 of 63
Thème 6 : Les structures de contrôle

Exercices d’application

Exercice d’application 1 : Affichage d’un intervalle de nombres selon un critère

Écrire un programme qui affiche les entiers naturels de 1 à n, n étant un entier naturel
strictement supérieur à 1, saisi au clavier.

Exercice d’application 2 : Génération d’une table de multiplication quelconque

Écrire un programme qui génère une table de multiplication quelconque.

Exercice d’application 3 : Construction d’un triangle d’étoiles

É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 :
*
**
***
****
*****

Exercice d’application 4 : Génération de tables de multiplication

Écrire un programme qui génère les dix tables de multiplication.

Exercice d’application 5 : Calcul de la moyenne d’un ensemble de nombres [cas 1]

Calculer la moyenne des nombres fournis au clavier avec un dialogue de ce type :

nombre 1 : 235
nombre 2 : 50.47
… :…
… :…
… :…
nombre n : -1.031
Moyenne des n nombres : xxxxx

L’utilisateur indique au départ le nombre de nombres qu’il va fournir.

(ATTENTION : on n’utilisera pas de tableau)

Exercice d’application 6 : Calcul de la moyenne d’un ensemble de nombres [cas 2]

Reprendre l’exercice précédent sachant que chaque nombre est compris entre compris entre 0
et 20.

(ATTENTION : on n’utilisera pas de tableau)

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

LES TABLEAUX DE DIMENSION 1

Page 40 of 63
Thème 7 : Les tableaux

1. Déclaration d’un tableau de dimension 1

< type_du_tableau > < identificateur_du_tableau > [taille_du_tableau] ;

Par exemple

L’instruction int T[5] ; permet de déclarer un tableau nommé T, de taille 5 et de type entier.

2. Saisie et affichage des données

En C, on numérote les cellules d’un tableau à partir de 0. Donc, relativement au tableau de


l’exemple précédent, on a :
T[0] désigne la première cellule de T ;
T[1] désigne la deuxième cellule de T ;
T[2] désigne la troisième cellule de T ;
T[3] désigne la quatrième cellule de T ;
T[4] désigne la cinquième cellule de T.

2.1. saisie d’un tableau

Il y a deux façons de saisir un tableau :

 en adressant directement les cellules

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 ;

 en effectuant une saisie globale du tableau

for (i = 0 ; i < 5 ; i++)


{
printf ("Donnez l’élément numéro %d : ", (i + 1)) ;
scanf ("%d", &T[i]) ;
}

Remarque

for (i = 0 ; i < 5 ; i++) est équivalente à for (i = 0 ; i <=4 ; i++).

Page 41 of 63
Thème 7 : Les tableaux

2.1. affichage d’un tableau

 affichage d’un élément particulier du tableau T :

printf ("%d", T[i]) ; // on remplace i par sa valeur, i ∈ {0 ; 1 ; 2 ; 3 ; 4}

 On affiche tous les éléments du tableau T en le parcourant :

for (i = 0 ; i < 5 ; i++)


{
printf ("%d", T[i]) ;
}

3. Quelques règles

 indices, débordement d’indice, accès aux éléments

Soient : n, un entier naturel strictement supérieur à 1 ;


V[n], un vecteur de n cellules ;
i, l’indice de parcours V :

Les indices des cellules de V vont de 0 à n – 1 :


V[0] désigne la première cellule de V ;
V[1] désigne la deuxième cellule de V ;
V[2] désigne la troisième cellule de V ;
V[n - 2] désigne l’avant-dernière cellule de V ;
V[n - 1] désigne la dernière cellule de V.

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.

 expression de la dimension d’un tableau

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.

Exercice d’application 1 : Recherche des extrema d’un ensemble de nombres

Écrire un programme qui permet de déterminer, à partir de dix notes, le minimum et le


maximum de ces notes.

Exercice d’application 2 : Calculs sur un ensemble de nombres

É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.

Exercice d’application 3 : Tri d’un ensemble de nombres

Écrire un programme qui permet de trier dix notes dans l’ordre croissant.

Exercice d’application 4 : Recherche d’un élément dans un ensemble

Écrire un programme qui permet de rechercher une note parmi dix notes.

Page 43 of 63
Thème 7 : Les tableaux

PARTIE 2

LES TABLEAUX DE DIMENSION 2

Page 44 of 63
Thème 7 : Les tableaux

1. Déclaration d’un tableau de dimension 2

< type_du_tableau > < identificateur_du_tableau > [nbre_de_lignes] [nbre_de_colonnes] ;

Par exemple

La déclaration int M[5][3] ; réserve un tableau nommé M, organisé en 5 lignes et 3 colonnes,


et de type entier,.

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].

2. Saisie et affichage des données

On peut représenter le tableau M[5][3] par schéma ci-dessous :

M[0][0] M[0][1] M[0][2]


M[1][0] M[1][1] M[1][2]
M[2][0] M[2][1] M[2][2]
M[3][0] M[3][1] M[3][2]
M[4][0] M[4][1] M[4][2]

2.1. saisie d’un tableau

Il y a deux façons de saisir un tableau :

 en adressant directement les cellules

Par exemples :

M[0][0] = 12 ;
M[2][1] = 0 ;
M[2][2]= -12 ;
M[4][1] = 452 ;
M[4][2] = 1000 ;

 en effectuant une saisie globale du tableau

for (i = 0 ; i < 5 ; i++) // boucle pour les lignes


{
for (j = 0 ; j < 3 ; j++) // boucle pour les colonnes
{
printf("Entrez l'element de ligne %d colonne %d : ", (i+1), (j+1));
scanf ("%d", &M[i][j]) ;
}
}

Page 45 of 63
Thème 7 : Les tableaux

Ou encore :

for (i = 0 ; i < 5 ; i++) // boucle pour les lignes


{
printf("Entrez les elements de la ligne %d : ", (i+1));
for (i = 0 ; i < 3 ; i++) // boucle pour les colonnes
{
printf("Entrez l'element la colonne %d : ", (j+1));
scanf ("%d", &M[i][j]) ;
}
}

2.1. affichage d’un tableau

 affichage d’un élément particulier d’un tableau :

printf ("%d", M[i] [j]) ; // on remplace i et j par leurs valeurs respectives

 On affiche tous les éléments d’un tableau en le parcourant :

for (i = 0 ; i < 5 ; i++)


{
for (i = 0 ; i < 3 ; i++)
{
printf ("%d", M[i][j]) ;
}
}

3. Tableau de dimension 2 à taille variable

La norme C99 permet d’utiliser des tableaux de dimension 2 à tailles variables.

Par exemple : les instructions ci-dessous permettent de déclarer un tableau à taille variable.

#define NBRELIGNE 100


#define NBRECOLONNE 50

int Matrice [NBRELIGNE][NBRECOLONNE] ;

Page 46 of 63
Thème 7 : Les tableaux

Exercices d’application

Exercice d’application 1 : Saisie d’une matrice carrée

Écrire un programme qui remplit de réels une matrice carrée d’ordre 3, et ensuite l’affiche.

Exercice d’application 2 : Somme de deux matrices carrées

É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.

Il existe deux groupes de fonctions : la fonction principale et les fonctions secondaires.

Langage algorithmique Langage C Créateur


algorithme principal fonction principale concepteur/développeur
procédures fonctions concepteur/développeur
fonctions
fonctions prédéfinies, primitives fonctions prédéfinies Langage

Les fonctions de la bibliothèque standard sont des fonctions prédéfinies par le langage C.

2. Utilisation des fonctions (voir procédures et fonctions dans le cours d’algorithmique)

2.1. la création d’une fonction

2.1.1. schéma général d’une fonction

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

Dans ce cas particulier, le schéma devient :

void nom_de _la_fonction (listes des paramètres formels avec leurs types respectifs)
{
instruction_1 ;
instruction_2 ;
.
.
.
instruction_n ;
}

2.1.2. Application (Travaux Dirigés)

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.

2.2. l’appel d’une fonction

L’appel d’une fonction s’effectue dans la fonction principale ou dans une autre fonction.
Il doit se faire notamment :

 dans une instruction simple


 affichage ;
 ou affectation.

 dans une structure de contrôle


 conditionnelle simple ;
 alternative ;
 itérative.

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

LE PROGRAMME PRINCIPAL ET SES FONCTIONS

Page 52 of 63
Thème 8 : La programmation modulaire

1. Le prototype d’une fonction

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.

Soit fonction_test une fonction de schéma général :

type fonction_test (type_1 paramètre_1, type_2 paramètre_2, …, type_n paramètre_n)


{
instruction_1 ;
instruction_2 ;
.
.
instruction_n ;
return < expression > ;
}

Le prototype de fonction_test est l’instruction :

type fonction_test (type_1 paramètre_1, type_2 paramètre_2, …, type_n paramètre_n) ;

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 :

type fonction_test (type_1, type_2, …, type_n) ;

Les deux formes sont valables, l’essentiel est de :


 respecter l’ordre des paramètres ;
 respecter l’ordre des types des paramètres ;
 placer un point-virgule (;) à la fin de la déclaration.

Par exemple, la fonction calculerSurfaceRectangle, décrite ci-dessous :

float calculerSurfaceRectangle (float longueur, float largeur)


{
return (longueur*largeur) ;
}

a pour prototype :

float calculerSurfaceRectangle (float longueur, float largeur) ;

ou encore :

float calculerSurfaceRectangle (float, float ) ;

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

2. Les fichiers .c et les fichiers .h

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.

2.1. l’inclusion des fichiers .h

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 :

# include "nom_de_la _fonction.h"

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).

2.2. la compilation séparée

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).

À l’issue de la compilation, cet ensemble de fichiers est transformé en un fichier unique


appelé fichier exécutable ou tout simplement exécutable.

Réalisée par l’IDE, la compilation se déroule en trois grandes étapes :

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.

2.2.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.

Les étapes de la compilation sont résumées dans le schéma ci-dessous :

Schéma générale de la compilation

Page 55 of 63
Thème 8 : La programmation modulaire

3. Application pratique (TP)

É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

A. les fonctions, les headers et les inclusions

Le projet comprendra :

Trois fonctions :

 la fonction principale (main) qui a pour tâche de :


 récupérer les mesures du rectangle ;
 transmettre les mesures du rectangle en paramètres aux fonctions secondaires
calculerSurfaceRectangle et calculerPerimetreRectangle ;
 afficher les résultats des calculs effectués par les fonctions secondaires.

 la fonction secondaire calculerSurfaceRectangle


 calcule la surface du rectangle ;
 retourne le résultat à la fonction principale.

float calculerSurfaceRectangle (float longueur, float largeur)


{
return (longueur * largeur) ;
}

 la fonction secondaire calculerPerimetreRectangle


 calcule le périmètre du rectangle ;
 retourne le résultat à la fonction principale.

float calculerPerimetreRectangle (float longueur, float largeur)


{
return (2*(longueur + largeur)) ;
}

Deux fichiers headers dont les contenus respectifs sont :

float calculerSurfaceRectangle (float longueur, float largeur) ;

float calculerPerimetreRectangle (float longueur, float largeur) ;

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

B. développement du projet dans l’IDE Code::Blocks 17.12

B.1. créer un projet

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;

printf("\n\t\t\t\t\tSURFACE ET PERIMETRE D'UN RECTANGLE\n\n");


printf("\t\t\t\t\t\tSaisie des dimensions\n\n");

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");

printf("\t\t\tLa surface est : %f\n", calculerSurfaceRectangle(longueur, largeur));


printf("\t\t\tLe perimetre est : %f\n\n\n", calculerPerimetreRectangle(longueur, largeur));

return 0;
}

2. Créer un projet que l’on nommera Calculs dans un rectangle

3. Copier le code ci-dessous dans le fichier main (la fonction principale).

Page 57 of 63
Thème 8 : La programmation modulaire

B.2. créer les fichiers source des fonctions

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.

Ensuite : écrire la fonction.

Enfin : dans la barre d’outils, cliquer sur l’icône Save pour enregistrer le contenu du fichier
source.

B.3. créer les fichiers headers

On va créer les fichiers headers des fonctions écrites précédemment, la fonction main n’étant
pas concernée.

 effectuer File / New / File…


 dans la boîte de dialogue apparue, double-cliquer sur l’icône C/C++ header
 dans la boîte de dialogue apparue, 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 du prototype de la fonction)
o placé, dans la zone de gestion de projet, dans le dossier Headers, une icône
représentant le fichier header à créer.

Ensuite : écrire le prototype de la fonction.


L’IDE a pré-écrit des lignes spéciales dans le fichier header créé ; écrire le prototype de la
fonction, dans la zone située entre la deuxième ligne spéciale et la dernière ligne spéciale.

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

B.4. enregistrer, compiler et exécuter

En définitive, on a créé trois groupes de fichiers :


 le fichier de la fonction principale (main.c) ;
 les fichiers .c ;
 les fichiers .h

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 :

Liste des fichiers du projet Calculs dans un rectangle

On remarque qu’à tout fichier .c correspond un fichier .h, la fonction main.c n’étant pas
concernée.

La réalisation du projet étant terminée, dans la barre d’outils :


 d’abord, cliquer sur l’icône Save all files afin de s’assurer que tous les fichiers du
projet ont été enregistrés ;
 ensuite, compiler le projet en cliquant sur l’icône Build ;
 enfin, exécuter le projet (afin de le tester) en cliquant sur l’icône Run.

Remarque : Toute fonction doit contenir au moins les lignes spéciales ci-dessous :

#include <stdio.h>
#include <stdlib.h>

Ensuite s’ajouteront si cela s’avère nécessaire d’autres lignes spéciales.

Page 59 of 63
Thème 8 : La programmation modulaire

4. Variables locales et variables globales

4.1. les variables locales

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.

4.2. les variables globales

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.

5. Passage d’un tableau en paramètre à une fonction

On peut transmettre un ou plusieurs tableaux à une fonction pour la réalisation de diverses


opérations dont l’affichage, des calculs, la recherche et le tri.

nom_de_la_fonction (identificateur_du_tableau) ;

Travaux Dirigés / Travaux Pratiques : affichage de deux tableaux

É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\t\tSaisie d’un vecteur de 5 entiers\n\n");


saisirVecteur (T) ;

printf("\n\n") ;

printf("\n\t\tSaisie d'une matrice (2 × 3) d'entiers\n\n");


saisirMatrice (N) ;

system("cls"); // pour effacer l’écran

printf("Voici les éléments du vecteur…\n\n") ;


afficherVecteur(V) ;

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>

void saisirVecteur (int V[5])


{
int i;
for (i = 0; i < 5; i++)
{
printf("Entrez l’élément numéro %d : ", (i+1));
scanf("%d", &V[i]);
}
}

#include <stdio.h>
#include <stdlib.h>

void saisirMatrice (int M[2][3])


{
int i, j;

for (i = 0; i < 2; i++)


{
printf("Saisie des éléments de la ligne numéro %d", (i+1));
printf("\n\n");
for (j = 0; j < 3; j++)
{
printf("Entrez l’élément de la colonne numéro %d : ", (j+1));
scanf("%d", &M[i][j]);
}
printf("\n");
}
}

Page 62 of 63
Thème 8 : La programmation modulaire

void afficherVecteur (int V[5])


{
int i;
for(i = 0; i < 5; i++)
{
printf("\t%d", V[i]);
}
}

void afficherMatrice(int M[2][3])


{
int i, j;
for(i = 0; i < 2; i++)
{
printf("\n");
for(j = 0; j < 3; j++)
{
printf("\t%d", M [i][j]);
}
}
}

3. les prototypes

void saisirVecteur (int V[5]) ;


void saisirMatrice (int M[2][3]) ;
void afficherVecteur(int V[5]) ;
void afficherMatrice(int M[2][3]) ;

Page 63 of 63

Vous aimerez peut-être aussi