Apprenez à programmer en C !

Apprenez à programmer en C !

Mis à jour le mercredi 4 juin 2014

On a préparé le terrain jusqu'ici, maintenant il serait bien de commencer à programmer un peu, qu'en dites-vous ? C'est justement l'objectif de ce chapitre ! À la fin de celui-ci, vous aurez réussi à créer votre premier programme !

Bon d'accord, ce programme sera en noir et blanc et ne saura que vous dire bonjour, il semblera donc complètement inutile mais ce sera votre premier ; je peux vous assurer que vous en serez fiers.

Console ou fenêtre ?

Nous avons rapidement parlé de la notion de « programme console » et de « programme fenêtre » dans le chapitre précédent. Notre IDE nous demandait quel type de programme nous voulions créer et je vous avais dit de répondre console.

Il faut savoir qu'en fait il existe deux types de programmes, pas plus :

  • les programmes avec fenêtres ;

  • les programmes en console.

Les programmes en fenêtres

Ce sont les programmes que vous connaissez.
La fig. suivante est un exemple de programme en fenêtres que vous connaissez sûrement.

Le programme Paint

Ça donc, c'est un programme avec des fenêtres. Je suppose que vous aimeriez bien créer ce type de programmes, hmm ? Eh bien… vous n'allez pas pouvoir de suite !

En effet, créer des programmes avec des fenêtres en C c'est possible, mais… quand on débute, c'est bien trop compliqué !
Pour débuter, il vaut mieux commencer par créer des programmes en console.

Mais au fait, à quoi ça ressemble un programme en console ?

Les programmes en console

Les programmes console ont été les premiers à apparaître. À cette époque, l'ordinateur ne gérait que le noir et blanc et il n'était pas assez puissant pour créer des fenêtres comme on le fait aujourd'hui.

Bien entendu, le temps a passé depuis. Windows a rendu l'ordinateur « grand public » principalement grâce à sa simplicité et au fait qu'il n'utilisait que des fenêtres. Windows est devenu tellement populaire qu'aujourd'hui beaucoup de monde a oublié ce qu'était la console. Oui vous là, ne regardez pas derrière vous, je sais que vous vous demandez ce que c'est !

J'ai une grande nouvelle ! La console n'est pas morte ! En effet, Linux a remis au goût du jour l'utilisation de la console. La fig. suivante est une capture d'écran d'une console sous Linux.

Un exemple de console, ici sous Linux

Brrr… Terrifiant, hein ? Voilà, vous avez maintenant une petite idée de ce à quoi ressemble une console.

Ceci dit, plusieurs remarques :

  • aujourd'hui on sait afficher de la couleur, tout n'est donc pas en noir et blanc comme on pourrait le croire ;

  • la console est assez peu accueillante pour un débutant ;

  • c'est pourtant un outil puissant quand on sait le maîtriser.

Comme je vous l'ai dit plus haut, créer des programmes en mode « console » comme ici, c'est très facile et idéal pour débuter (ce qui n'est pas le cas des programmes en mode « fenêtre »).

Notez que la console a évolué : elle peut afficher des couleurs, et rien ne vous empêche de mettre une image de fond.

Et sous Windows ? Il n'y a pas de console ?

Si, mais elle est un peu… « cachée » on va dire.
Vous pouvez avoir une console en faisant Démarrer / Accessoires / Invite de commandes, ou bien encore en faisant Démarrer / Exécuter…, et en tapant ensuite cmd.

La fig. suivante représente la maaagnifique console de Windows.

La console de Windows

Si vous êtes sous Windows, sachez donc que c'est dans une fenêtre qui ressemble à ça que nous ferons nos premiers programmes. Si j'ai choisi de commencer par des petits programmes en console, ce n'est pas pour vous ennuyer, bien au contraire ! En commençant par faire des programmes en console, vous apprendrez les bases nécessaires pour pouvoir ensuite créer des fenêtres.

Soyez donc rassurés : dès que nous aurons le niveau pour créer des fenêtres, nous verrons comment en faire.

Un minimum de code

Pour n'importe quel programme, il faudra taper un minimum de code. Ce code ne fera rien de particulier mais il est indispensable.
C'est ce « code minimum » que nous allons découvrir maintenant. Il devrait servir de base pour la plupart de vos programmes en langage C.

Demandez le code minimal à votre IDE

Selon l'IDE que vous avez choisi dans le chapitre précédent, la méthode pour créer un nouveau projet n'est pas la même. Reportez-vous à ce chapitre si vous avez oublié comment faire.

Pour rappel, sous Code::Blocks (qui est l'IDE que je vais utiliser tout au long de ce cours), il faut aller dans le menu File / New / Project, puis choisir Console Application et sélectionner le langage C.

Code::Blocks a donc généré le minimum de code en langage C dont on a besoin. Le voici :

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

int main()
{
    printf("Hello world!\n");
    return 0;
}

Notez que la ligne :

int main()

… peut aussi s'écrire :

int main(int argc, char *argv[])

Les deux écritures sont possibles, mais la seconde (la compliquée) est la plus courante. J'aurai donc tendance à utiliser plutôt cette dernière dans les prochains chapitres.
En ce qui nous concerne, que l'on utilise l'une ou l'autre des écritures, ça ne changera rien pour nous. Inutile donc de s'y attarder, surtout que nous n'avons pas encore le niveau pour analyser ce que ça signifie.

Si vous êtes sous un autre IDE, copiez ce code source dans votre fichier main.c pour que nous ayons le même code vous et moi.

Enregistrez le tout. Oui je sais, on n'a encore rien fait, mais enregistrez quand même, c'est une bonne habitude à prendre. Normalement, vous n'avez qu'un seul fichier source appelé main.c (le reste, ce sont des fichiers de projet générés par votre IDE).

Analysons le code minimal

Ce code minimal qu'on vient de voir n'est rien d'autre que du chinois pour vous, j'imagine. Et pourtant, moi je vois là un programme console qui affiche un message à l'écran.
Il va falloir apprendre à lire tout ça !

Commençons par les deux premières lignes qui se ressemblent beaucoup :

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

Ce sont des lignes spéciales que l'on ne voit qu'en haut des fichiers source. Ces lignes sont facilement reconnaissables car elles commencent par un dièse #. Ces lignes spéciales, on les appelle directives de préprocesseur (un nom compliqué, n'est-ce pas ?). Ce sont des lignes qui seront lues par un programme appelé préprocesseur, un programme qui se lance au début de la compilation.

Oui : comme je vous l'ai dit plus tôt, ce qu'on a vu au début n'était qu'un schéma très simplifié de la compilation. Il se passe en réalité plusieurs choses pendant une compilation. On les détaillera plus tard : pour le moment, vous avez juste besoin d'insérer ces lignes en haut de chacun de vos fichiers.

Oui mais elles signifient quoi, ces lignes ? J'aimerais bien savoir quand même !

Le mot include en anglais signifie « inclure » en français. Ces lignes demandent d'inclure des fichiers au projet, c'est-à-dire d'ajouter des fichiers pour la compilation.
Il y a deux lignes, donc deux fichiers inclus. Ces fichiers s'appellent stdio.h et stdlib.h. Ces fichiers existent déjà, des fichiers source tout prêts. On verra plus tard qu'on les appelle des bibliothèques (certains parlent aussi de librairies mais c'est un anglicisme). En gros, ces fichiers contiennent du code tout prêt qui permet d'afficher du texte à l'écran.

Sans ces fichiers, écrire du texte à l'écran aurait été mission impossible. L'ordinateur à la base ne sait rien faire, il faut tout lui dire. Vous voyez la galère dans laquelle on est !

Bref, en résumé les deux premières lignes incluent les bibliothèques qui vont nous permettre (entre autres) d'afficher du texte à l'écran assez « facilement ».

Passons à la suite. La suite, c'est tout ça :

int main()
{
    printf("Hello world!\n");
    return 0;
}

Ce que vous voyez là, c'est ce qu'on appelle une fonction. Un programme en langage C est constitué de fonctions, il ne contient quasiment que ça. Pour le moment, notre programme ne contient donc qu'une seule fonction.

Une fonction permet grosso modo de rassembler plusieurs commandes à l'ordinateur. Regroupées dans une fonction, les commandes permettent de faire quelque chose de précis. Par exemple, on peut créer une fonction ouvrir_fichier qui contiendra une suite d'instructions pour l'ordinateur lui expliquant comment ouvrir un fichier.
L'avantage, c'est qu'une fois la fonction écrite, vous n'aurez plus qu'à dire ouvrir_fichier, et votre ordinateur saura comment faire sans que vous ayez à tout répéter !

Sans rentrer dans les détails de la construction d'une fonction (il est trop tôt, on reparlera des fonctions plus tard), analysons quand même ses grandes parties. La première ligne contient le nom de la fonction, c'est le deuxième mot.
Oui : notre fonction s'appelle donc main. C'est un nom de fonction particulier qui signifie « principal ». main est la fonction principale de votre programme, c'est toujours par la fonction main que le programme commence.

Une fonction a un début et une fin, délimités par des accolades { et }. Toute la fonction main se trouve donc entre ces accolades. Si vous avez bien suivi, notre fonction main contient deux lignes :

printf("Hello world!\n");
return 0;

Ces lignes à l'intérieur d'une fonction ont un nom. On les appelle instructions (ça en fait du vocabulaire qu'il va falloir retenir).
Chaque instruction est une commande à l'ordinateur. Chacune de ces lignes demande à l'ordinateur de faire quelque chose de précis.

Comme je vous l'ai dit un peu plus haut, en regroupant intelligemment (c'est le travail du programmeur) les instructions dans des fonctions, on crée si on veut des « bouts de programmes tout prêts ». En utilisant les bonnes instructions, rien ne nous empêcherait donc de créer une fonction ouvrir_fichier comme je vous l'ai expliqué tout à l'heure, ou encore une fonction avancer_personnage dans un jeu vidéo, par exemple.

Un programme, ce n'est au bout du compte rien d'autre qu'une série d'instructions : « fais ceci », « fais cela ». Vous donnez des ordres à votre ordinateur et il les exécute. Du moins si vous l'avez bien dressé.

La première ligne : printf("Hello world!\n"); demande à afficher le message « Hello world! » à l'écran. Quand votre programme arrivera à cette ligne, il va donc afficher un message à l'écran, puis passer à l'instruction suivante.

Passons à l'instruction suivante justement :
return 0;
Eh bien ça, en gros, ça veut dire que c'est fini (eh oui, déjà). Cette ligne indique qu'on arrive à la fin de notre fonction main et demande de renvoyer la valeur 0.

Pourquoi mon programme renverrait-il le nombre 0 ?

En fait, chaque programme une fois terminé renvoie une valeur, par exemple pour dire que tout s'est bien passé. En pratique, 0 signifie « tout s'est bien passé » et n'importe quelle autre valeur signifie « erreur ». La plupart du temps, cette valeur n'est pas vraiment utilisée, mais il faut quand même en renvoyer une.
Votre programme aurait marché sans le return 0, mais on va dire que c'est plus propre et plus sérieux de le mettre, donc on le met.

Et voilà ! On vient de détailler un peu le fonctionnement du code minimal.

Certes, on n'a pas vraiment tout vu en profondeur, et vous devez avoir quelques questions en suspens. Soyez rassurés : toutes vos questions trouveront une réponse petit à petit. Je ne peux pas tout vous divulguer d'un coup, cela ferait trop de choses à assimiler.

Vous suivez toujours ? Si tel n'est pas le cas, rien ne presse. Ne vous forcez pas à lire la suite. Faites une pause et relisez ce début de chapitre à tête reposée. Tout ce que je viens de vous apprendre est fondamental, surtout si vous voulez être sûrs de pouvoir suivre après.

Tenez : comme je suis de bonne humeur, je vous fais un schéma qui récapitule le vocabulaire qu'on vient d'apprendre (fig. suivante).

Le vocabulaire du programme minimal

Testons notre programme

Tester devrait aller vite. Tout ce que vous avez à faire c'est compiler le projet, puis l'exécuter (cliquez sur l'icône Build & Run sous Code::Blocks).
Si vous ne l'avez pas encore fait, on vous demandera d'enregistrer les fichiers. Faites-le.

Après un temps d'attente insupportable (la compilation), votre premier programme va apparaître sous vos yeux totalement envahis de bonheur (fig. suivante).

Votre premier programme !

Le programme affiche « Hello world! » (sur la première ligne).
Les lignes en dessous ont été générées par Code::Blocks et indiquent que le programme s'est bien exécuté et combien de temps s'est écoulé depuis le lancement.

On vous invite à appuyer sur n'importe quelle touche du clavier pour fermer la fenêtre. Votre programme s'arrête alors. Oui je sais, ce n'est pas transcendant. Mais bon, quand même ! C'est un premier programme, un instant dont vous vous souviendrez toute votre vie ! … Non ?

Écrire un message à l'écran

À partir de maintenant, on va modifier nous-mêmes le code de ce programme minimal.
Votre mission, si vous l'acceptez : afficher le message « Bonjour » à l'écran.

Comme tout à l'heure, une console doit s'ouvrir. Le message « Bonjour » doit s'afficher dans la console.

Comment fait-on pour choisir le texte qui s'affiche à l'écran ?

Ce sera en fait assez simple. Si vous partez du code qui a été donné plus haut, il vous suffit simplement de remplacer « Hello world! » par « Bonjour » dans la ligne qui fait appel à printf.

Comme je vous le disais plus tôt, printf est une instruction. Elle commande à l'ordinateur : « Affiche-moi ce message à l'écran ».
Il faut savoir que printf est en fait une fonction qui a déjà été écrite par d'autres programmeurs avant vous.

Cette fonction, où se trouve-t-elle ? Moi je ne vois que la fonction main !

Vous vous souvenez de ces deux lignes ?

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

Je vous avais dit qu'elles permettaient d'ajouter des bibliothèques dans votre programme.
Les bibliothèques sont en fait des fichiers avec des tonnes de fonctions toutes prêtes à l'intérieur. Ces fichiers-là (stdio.h et stdlib.h) contiennent la plupart des fonctions de base dont on a besoin dans un programme. stdio.h en particulier contient des fonctions permettant d'afficher des choses à l'écran (comme printf) mais aussi de demander à l'utilisateur de taper quelque chose (ce sont des fonctions que l'on verra plus tard).

Dis Bonjour au Monsieur

Dans notre fonction main, on fait donc appel à la fonction printf. C'est une fonction qui en appelle une autre (ici, main appelle printf). Vous allez voir que c'est tout le temps comme ça que ça se passe en langage C : une fonction contient des instructions qui appellent d'autres fonctions, et ainsi de suite.

Donc, pour faire appel à une fonction, c'est simple : il suffit d'écrire son nom, suivi de deux parenthèses, puis un point-virgule.

printf();

C'est bien, mais ce n'est pas suffisant. Il faut indiquer quoi écrire à l'écran. Pour faire ça, il faut donner à la fonction printf le texte à afficher. Pour ce faire, ouvrez des guillemets à l'intérieur des parenthèses et tapez le texte à afficher entre ces guillemets, comme cela avait déjà été fait sur le code minimal.

Dans notre cas, on va donc taper très exactement :

printf("Bonjour");

J'espère que vous n'avez pas oublié le point-virgule à la fin, je vous rappelle que c'est très important ! Cela permet d'indiquer que l'instruction s'arrête là.

Voici le code source que vous devriez avoir sous les yeux :

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

int main()
{
  printf("Bonjour");
  return 0;
}

On a donc deux instructions qui commandent dans l'ordre à l'ordinateur :

  1. affiche « Bonjour » à l'écran ;

  2. la fonction main est terminée, renvoie 0. Le programme s'arrête alors.

La fig. suivante vous montre ce que donne ce programme à l'écran.

Un programme poli qui dit Bonjour

Comme vous pouvez le voir, la ligne du « Bonjour » est un peu collée avec le reste du texte, contrairement à tout à l'heure.
Une des solutions pour rendre notre programme plus présentable serait de faire un retour à la ligne après « Bonjour » (comme si on appuyait sur la touche « Entrée »).

Mais bien sûr, ce serait trop simple de taper « Entrée » dans notre code source pour qu'une entrée soit effectuée à l'écran ! Il va falloir utiliser ce qu'on appelle des caractères spéciaux…

Les caractères spéciaux

Les caractères spéciaux sont des lettres spéciales qui permettent d'indiquer qu'on veut aller à la ligne, faire une tabulation, etc.
Ils sont faciles à reconnaître : c'est un ensemble de deux caractères. Le premier d'entre eux est toujours un anti-slash ( \ ), et le second un nombre ou une lettre. Voici deux caractères spéciaux courants que vous aurez probablement besoin d'utiliser, ainsi que leur signification :

  • \n : retour à la ligne (= « Entrée ») ;

  • \t : tabulation.

Dans notre cas, pour faire une entrée, il suffit de taper \n pour créer un retour à la ligne.
Si je veux donc faire un retour à la ligne juste après le mot « Bonjour », je devrais taper :

printf("Bonjour\n");

Votre ordinateur comprend qu'il doit afficher « Bonjour » suivi d'un retour à la ligne (fig. suivante).

Le programme Bonjour avec un saut de ligne

C'est déjà un peu mieux, non ?

Le syndrome de Gérard

Bonjour, je m'appelle Gérard et j'ai voulu essayer de modifier votre programme pour qu'il me dise « Bonjour Gérard ». Seulement voilà, j'ai l'impression que l'accent de Gérard ne s'affiche pas correctement… Que faire ?

Tout d'abord, bonjour Gérard. C'est une question très intéressante que vous nous posez là. Je tiens en premier lieu à vous féliciter pour votre esprit d'initiative, c'est très bien d'avoir eu l'idée de modifier un peu le programme. C'est en « bidouillant » les programmes que je vous donne que vous allez en apprendre le plus. Ne vous contentez pas de ce que vous lisez, essayez un peu vos propres modifications des programmes que nous voyons ensemble !

Bien ! Maintenant, pour répondre à la question de notre ami Gérard, j'ai une bien triste nouvelle à vous annoncer : la console de Windows ne gère pas les accents. Par contre la console de Linux, oui.

À partir de là vous avez deux solutions.

  • Passer à Linux. C'est une solution un peu radicale et il me faudrait un cours entier pour vous expliquer comment vous servir de Linux. Si vous n'avez pas le niveau, oubliez cette possibilité pour le moment.

  • Ne pas utiliser d'accents. C'est malheureusement la solution que vous risquez de choisir. La console de Windows a ses défauts, que voulez-vous. Il va vous falloir prendre l'habitude d'écrire sans accents. Bien entendu, comme plus tard vous ferez probablement des programmes avec des fenêtres, vous ne rencontrerez plus ce problème-là. Je vous recommande donc de ne pas utiliser d'accents temporairement, pendant votre apprentissage dans la console. Vos futurs programmes « professionnels » n'auront pas ce problème, rassurez-vous.

Pour ne pas être gêné, vous devrez donc écrire sans accent :

printf("Bonjour Gerard\n");

On remercie notre ami Gérard pour nous avoir soulevé ce problème !
Si d'aventure vous vous appeliez Gérard, sachez que je n'ai rien contre ce prénom. C'est simplement le premier prénom avec un accent qui m'est passé par la tête… Et puis bon, il faut toujours que quelqu'un prenne pour les autres, que voulez-vous !

Les commentaires, c'est très utile !

Avant de terminer ce premier chapitre de « véritable » programmation, je dois absolument vous faire découvrir les commentaires. Quel que soit le langage de programmation, on a la possibilité d'ajouter des commentaires à son code. Le langage C n'échappe pas à la règle.

Qu'est-ce que ça veut dire, « commenter » ?
Cela signifie taper du texte au milieu de votre programme pour indiquer ce qu'il fait, à quoi sert telle ligne de code, etc. C'est vraiment quelque chose d'indispensable car, même en étant un génie de la programmation, on a besoin de faire quelques annotations par-ci par-là. Cela permet :

  • de vous retrouver au milieu d'un de vos codes source plus tard. On ne dirait pas comme ça, mais on oublie vite comment fonctionnent les programmes qu'on a écrits. Si vous faites une pause ne serait-ce que quelques jours, vous aurez besoin de vous aider de vos propres commentaires pour vous retrouver dans un gros code ;

  • si vous donnez votre projet à quelqu'un d'autre (qui ne connaît a priori pas votre code source), cela lui permettra de se familiariser avec bien plus rapidement ;

  • enfin, ça va me permettre à moi d'ajouter des annotations dans les codes source de ce cours. Et de mieux vous expliquer à quoi peut servir telle ou telle ligne de code.

Il y a plusieurs manières d'insérer un commentaire. Tout dépend de la longueur du commentaire que vous voulez écrire.

  • Votre commentaire est court : il tient sur une seule ligne, il ne fait que quelques mots. Dans ce cas, vous devez taper un double slash (//) suivi de votre commentaire. Par exemple :

    // Ceci est un commentaire
    

    Vous pouvez aussi bien écrire un commentaire seul sur sa ligne, ou bien à droite d'une instruction. C'est d'ailleurs quelque chose de très pratique car ainsi, on sait que le commentaire sert à indiquer à quoi sert la ligne sur laquelle il est. Exemple :

    printf("Bonjour"); // Cette instruction affiche Bonjour à l'écran
    
  • Votre commentaire est long : vous avez beaucoup à dire, vous avez besoin d'écrire plusieurs phrases qui tiennent sur plusieurs lignes. Dans ce cas, vous devez taper un code qui signifie « début de commentaire » et un autre code qui signifie « fin de commentaire » :

    • pour indiquer le début du commentaire : tapez un slash suivi d'une étoile (/*) ;

    • pour indiquer la fin du commentaire : tapez une étoile suivie d'un slash (*/).

    Vous écrirez donc par exemple :

    /* Ceci est
    un commentaire
    sur plusieurs lignes */
    

Reprenons notre code source qui écrit « Bonjour », et ajoutons-lui quelques commentaires juste pour s'entraîner :

/*
Ci-dessous, ce sont des directives de préprocesseur.
Ces lignes permettent d'ajouter des fichiers au projet, 
fichiers que l'on appelle bibliothèques.
Grâce à ces bibliothèques, on disposera de fonctions toutes prêtes pour afficher
par exemple un message à l'écran.
*/

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

/*
Ci-dessous, vous avez la fonction principale du programme, appelée main.
C'est par cette fonction que tous les programmes commencent.
Ici, ma fonction se contente d'afficher Bonjour à l'écran.
*/

int main()
{
  printf("Bonjour"); // Cette instruction affiche Bonjour à l'écran
  return 0;          // Le programme renvoie le nombre 0 puis s'arrête
}

Voilà ce que donnerait notre programme avec quelques commentaires. Oui, il a l'air d'être plus gros, mais en fait c'est le même que tout à l'heure. Lors de la compilation, tous les commentaires seront ignorés. Ces commentaires n'apparaîtront pas dans le programme final, ils servent seulement aux programmeurs.

Normalement, on ne commente pas chaque ligne du programme. J'ai dit (et je le redirai) que c'était important de mettre des commentaires dans un code source, mais il faut savoir doser : commenter chaque ligne ne servira la plupart du temps à rien. À force, vous saurez que le printf permet d'afficher un message à l'écran, pas besoin de l'indiquer à chaque fois.

Le mieux est de commenter plusieurs lignes à la fois, c'est-à-dire d'indiquer à quoi sert une série d'instructions histoire d'avoir une idée. Après, si le programmeur veut se pencher plus en détail dans ces instructions, il est assez intelligent pour y arriver tout seul.

Retenez donc : les commentaires doivent guider le programmeur dans son code source, lui permettre de se repérer. Essayez de commenter un ensemble de lignes plutôt que toutes les lignes une par une.

Et pour finir sur une petite touche culturelle, voici une citation tirée de chez IBM :

Citation

Si après avoir lu uniquement les commentaires d'un programme vous n'en comprenez pas le fonctionnement, jetez le tout !

En résumé
  • Les programmes peuvent communiquer avec l'utilisateur via une console ou une fenêtre.

  • Il est beaucoup plus facile pour nos premiers programmes de travailler avec la console, bien que celle-ci soit moins attirante pour un débutant. Cela ne nous empêchera pas par la suite de travailler avec des fenêtres dans la partie III. Tout vient à point à qui sait attendre. ;)

  • Un programme est constitué d'instructions qui se terminent toutes par un point-virgule.

  • Les instructions sont contenues dans des fonctions qui permettent de les classer, comme dans des boîtes.

  • La fonction main (qui signifie « principale ») est la fonction par laquelle démarre votre programme. C'est la seule qui soit obligatoire, aucun programme ne peut être compilé sans elle.

  • printf est une fonction toute prête qui permet d'afficher un message à l'écran dans une console.

  • printf se trouve dans une bibliothèque où l'on retrouve de nombreuses autres fonctions prêtes à l'emploi.

Exemple de certificat de réussite
Exemple de certificat de réussite