| PDF С( [Théorie] Les bases du débutant- Partie 2) |

Console ou fenêtre ?
Nous en avons rapidement parlé 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 2 types de programmes, pas plus :
Ce sont les programmes que vous connaissez.
Voici un exemple de programme en fenêtres que vous connaissez sûrement :

Le programme Paint
Ca donc, c'est un programme avec des fenêtres.
Je suppose que vous aimeriez bien créer ce type de programmes, mmh ? Eh ben vous allez pas pouvoir de suite
En effet, créer des programmes avec des fenêtres en C / 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 console ont été les premiers à apparaître. A 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 presque tout le 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. Voici 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
Plusieurs remarques ceci dit :
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êtres).
Notez que la console a évolué : elle peut afficher des couleurs, et rien ne vous empêche de mettre une image de fond. Voici une autre capture d'écran de console Linux honteusement pompée sur Internet

La console, ça peut aussi être joli
Et sous Windows ? 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".
Et voici 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 ensuite pouvoir 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
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.
Ah oui, je le reprécise quand même au cas où : nous allons maintenant apprendre le langage C, comme je vous l'ai dit plus tôt. Tout ce que je vais vous apprendre maintenant, vous le réutiliserez lorsque nous verrons le C++, donc vous avez intérêt à être attentifs tout le temps
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 précédent 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 :
Code : C - Sélectionner
|
Notez la présence d'une ligne vide à la fin de ce code. Chaque fichier en C devrait normalement se terminer par une ligne vide comme celle-là. Si vous ne le faites pas, ce n'est pas grave, mais le compilateur risque de vous afficher un avertissement (warning).
Notez que la ligne :
Code : C - Sélectionner
|
... peut aussi s'écrire :
Code : C - Sélectionner
|
Les 2 é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 de s'attarder dessus donc, surtout que nous n'avons pas encore le niveau pour analyser ce que ça signifie.
Si vous êtes sous un autre IDE, copiez-collez 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).
Ce code minimal qu'on vient de voir n'est, j'imagine, rien que du charabia pour vous. 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 2 premières lignes qui se ressemblent beaucoup :
Code : C - Sélectionner
|
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 ? :p ). 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 de mettre 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 2 lignes, donc 2 fichiers inclus. Ces fichiers s'appellent stdio.h et stdlib.h. Ce sont des fichiers qui 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, les 2 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 :
Code : C - Sélectionner
|
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 ! (c'est beau la technologie !)
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 2 lignes :
Code : C - Sélectionner
|
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 en fait 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é)
TRES IMPORTANT : toute instruction se termine O-BLI-GA-TOI-RE-MENT par un point-virgule " ; ". C'est d'ailleurs comme ça qu'on reconnaît ce qui est une instruction et ce qui n'en est pas une. Si vous oubliez de mettre un point-virgule à la fin d'une instruction, votre programme ne compilera pas !
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;
Bon ben ç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.
Hein ? 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é (0 = tout s'est bien passé, n'importe quelle autre valeur = 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, sinon c'est l'embrouille assurée
D'ailleurs, en parlant d'embrouille, ça va 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, d'ailleurs comme je suis de bonne humeur je vous fais un schéma qui récapitule le vocabulaire qu'on vient d'apprendre

Le vocabulaire du programme minimal
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.
Si la compilation ne fonctionne pas et que vous avez une erreur de ce type :
Code : Console - Sélectionner
|
"My-program - Release" uses an invalid compiler. Skipping... Nothing to be done. |
... Cela signifie que vous avez téléchargé la version de Code::Blocks sans mingw (le compilateur). Retournez sur le site de Code::Blocks pour télécharger la version avec mingw.
Après un temps d'attente insupportable (la compilation ), votre premier programme va apparaître sous vos yeux totalement envahis de bonheur.

Votre premier programme !
Le programme affiche "Hello world!" (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 c'est nul, c'est moche, c'est tout ce que vous voulez
Mais bon, quand même ! C'est un premier programme, un instant dont vous vous souviendrez toute votre vie
... Non ?
...
Bon, avant que vous me fassiez déjà une première déprime, je propose qu'on passe à la suite sans plus tarder
A 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 2 lignes ?
Code : C - Sélectionner
|
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).
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 2 parenthèses, puis un point-virgule.
Code : C - Sélectionner
|
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 :
Code : C - Sélectionner
|
On a donc 2 instructions qui commandent dans l'ordre à l'ordinateur :
Voici 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" quoi)
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 sont des lettres spéciales qui permettent d'indiquer qu'on veut aller à la ligne, faire une tabulation, etc. Les caractères spéciaux sont faciles à reconnaître : c'est un ensemble de 2 caractères. Le premier d'entre eux est toujours un anti-slash ( \ ), et le second un nombre ou une lettre. Voici 2 caractères spéciaux courants que vous aurez probablement besoin d'utiliser, ainsi que leur signification :
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 devrai taper :
printf("Bonjour\n");
Votre ordinateur comprend qu'il doit afficher "Bonjour" suivi d'un retour à la ligne.

Le programme Bonjour avec un saut de ligne
C'est un peu mieux déjà non ?
Vous pouvez écrire à la suite du \n sans aucun problème. Tout ce que vous écrirez à la suite du \n sera placé sur la deuxième ligne. Vous pourriez donc vous entraîner à écrire :
printf("Bonjour\nAu Revoir\n");
Cela affichera "Bonjour" sur la première ligne et "Au revoir" sur la ligne suivante.
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
A partir de là vous avez 2 solutions :
Pour ne pas être gêné, vous devrez donc écrire sans accent :
Code : C - Sélectionner
|
On remercie notre ami Gérard pour nous avoir soulevé ce problème
ps : si d'aventure vous vous appeliez Gérard, sachez que je n'ai rien contre ce prénom :p 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
Avant de terminer ce premier chapitre de "véritable" programmation, je dois absolument vous montrer un truc génial qu'on appelle 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 :
Il y a plusieurs manières de rajouter un commentaire. Tout dépend de la longueur du commentaire que vous voulez écrire :
Code : C - Sélectionner
|
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 :
Code : C - Sélectionner
|
Notez que ce type de commentaire a normalement été introduit par le langage C++, mais vous n'aurez pas de problème en l'utilisant pour un programme en langage C (sauf si vous êtes un puriste)
Code : C - Sélectionner
|
Reprenons notre code source qui écrit "Bonjour", et ajoutons-lui quelques commentaires juste pour s'entraîner :
Code : C - Sélectionner
|
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. A 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.
Ce que je vais vous apprendre dans ce chapitre a donc un rapport direct avec la mémoire de votre ordinateur.
Tout être humain normalement constitué a une mémoire. Eh bien c'est pareil pour un ordinateur... à un détail près : un ordinateur a plusieurs types de mémoire !
Pourquoi un ordinateur aurait-il plusieurs types de mémoire ? Une seule mémoire aurait suffi, non ?
Non, en fait le problème c'est qu'on a besoin d'avoir une mémoire à la fois rapide (pour récupérer une information très vite) et importante (pour stocker beaucoup de choses). Or, vous allez rire, mais jusqu'ici nous avons été infichus de créer une mémoire qui soit à la fois très rapide et importante. Plus exactement, la mémoire rapide coûte cher, donc on n'en fait qu'en petites quantités. Du coup, pour nous arranger, nous avons dû doter les ordinateurs de mémoires très rapides mais pas importantes, et de mémoires importantes mais pas très rapides (vous suivez toujours ?)
Pour vous donner une idée, voici les différents types de mémoire existant dans un ordinateur, de la plus rapide à la plus lente :
Comme je vous l'ai dit, j'ai classé les mémoires de la plus rapide (les registres) à la plus lente (le disque dur). Si vous avez bien suivi, vous avez compris aussi que la mémoire la plus rapide était la plus petite, et la plus lente la plus grosse. Les registres sont donc à peine capables de retenir quelques nombres, tandis que le disque dur peut stocker de très gros fichiers.
Quand je dis qu'une mémoire est "lente", c'est à l'échelle de votre ordinateur bien sûr. Eh oui, pour un ordinateur 8 millisecondes pour accéder au disque dur c'est déjà trop long !
Que faut-il retenir dans tout ça ?
En fait, c'est pour vous situer un peu. Vous savez désormais qu'en programmation, on va surtout travailler avec la mémoire vive. On verra aussi comment lire et écrire sur le disque dur, pour lire et créer des fichiers (mais on ne le fera que plus tard). Quant à la mémoire cache et aux registres, on n'y touchera pas du tout ! C'est votre ordinateur qui s'en occupe.
Dans des langages très bas niveau, comme l'assembleur (abrégé "ASM"), on travaille au contraire plutôt directement avec les registres. Je l'ai fait, et je peux vous dire que faire une simple multiplication dans ce langage est un véritable parcours du combattant ! Heureusement, en langage C (et dans la plupart des autres langages de programmation), c'est beaucoup plus facile.
Il faut ajouter une dernière chose très importante : seul le disque dur retient tout le temps les informations qu'il contient. Toutes les autres mémoires (registres, mémoire cache, mémoire vive) sont des mémoires temporaires : lorsque vous éteignez votre ordinateur ces mémoires se vident !
Heureusement, lorsque vous rallumerez l'ordinateur, votre disque dur sera toujours là pour rappeler à votre ordinateur qui il est
Vu qu'on va travailler pendant un moment avec la mémoire vive, je pense qu'il serait bien de vous la présenter
On va y aller par zooms successifs. Ca, c'est votre ordinateur :

Vous reconnaissez le clavier, la souris, l'écran et l'unité centrale (la tour). Intéressons-nous maintenant à l'unité centrale, le cœur de votre ordinateur qui contient toutes les mémoires :

Ce qui nous intéresse, c'est ce qu'il y a à l'intérieur de l'unité centrale, si on l'ouvre :

C'est un joyeux petit bazar
Rassurez-vous, je ne vous demanderai pas de savoir comment tout cela fonctionne. Je veux juste que vous sachiez où se trouve la mémoire vive là-dedans. Je vous l'ai encadrée en rouge.
Je n'ai pas indiqué les autres mémoires (registres et mémoire cache) car de toute façon elles sont bien trop petites pour être visibles à l'oeil nu
Voici à quoi ressemble une barrette de mémoire vive de plus près :

La mémoire vive est aussi appelée RAM, ne vous étonnez donc pas si par la suite j'utilise plutôt le mot RAM qui est un peu plus court.
En photographiant de plus près la mémoire vive, on n'y verrait pas grand-chose. Pourtant, il est très important de savoir comment ça fonctionne à l'intérieur. C'est d'ailleurs là que je veux en venir depuis tout à l'heure
Je vais vous faire un schéma du fonctionnement de la mémoire vive. Il est ultra-simplifié (comme mes schémas de compilation :p ), mais c'est parce que nous n'avons pas besoin de trop de détails. Si vous retenez ce schéma déjà, ça sera très bien

Comme vous le voyez, il faut en gros distinguer 2 colonnes :
Notre RAM ne peut stocker que des nombres.
Mais alors, comment fait-on pour retenir des mots ?
Bonne question. En fait, même les lettres ne sont que des nombres pour l'ordinateur ! Une phrase est une simple succession de nombres ! Il existe un tableau qui fait la correspondance entre les nombres et les lettres. C'est un tableau qui dit par exemple : le nombre 89 correspond à la lettre Y. Je ne rentre pas dans les détails, on aura l'occasion de reparler de cela plus loin dans le cours.
Revenons à notre schéma. Les choses sont en fait très simples : si l'ordinateur veut retenir le nombre 5 (qui pourrait être le nombre de vies qu'il reste au joueur), il le met quelque part en mémoire où il y a de la place et note l'adresse correspondante (par exemple 3 062 199 902) Plus tard, lorsqu'il veut savoir à nouveau quel est ce nombre, il va chercher à la "case" mémoire n°3 062 199 902 ce qu'il y a, et il trouve la valeur... 5 !
Voilà en gros comment ça fonctionne. C'est peut-être un peu flou pour le moment (quel intérêt de stocker un nombre s'il faut à la place retenir l'adresse ?) mais tout va rapidement prendre du sens dans la suite de ce chapitre je vous le promets
Croyez-moi, cette petite introduction sur la mémoire va nous être plus utile que vous ne le pensez. Maintenant que vous savez ce qu'il faut, on peut retourner programmer
Alors une variable, c'est quoi ?
Eh bien c'est une petite information temporaire qu'on stocke dans la RAM. Tout simplement.
On dit qu'elle est "variable" car c'est une valeur qui peut changer pendant le déroulement du programme. Par exemple, notre nombre 5 de tout à l'heure (le nombre de vies restant au joueur) risque de diminuer au fil du temps. Si ce nombre atteint 0, on saura que le joueur a perdu.
Nos programmes, vous allez le voir, sont remplis de variables. Vous allez en voir partout, à toutes les sauces
En langage C, une variable est constituée de 2 choses :
En langage C, chaque variable doit donc avoir un nom. Pour notre fameuse variable qui retient le nombre de vies, on aimerait bien l'appeler "Nombre de vies" ou quelque chose du genre.
Hélas, il y a quelques contraintes. Vous ne pouvez pas appeler une variable n'importe comment :
Enfin, et c'est très important à savoir, le langage C (comme le C++) fait la différence entre les majuscules et les minuscules. Pour votre culture, sachez qu'on dit que c'est un langage qui "respecte la casse". Donc, du coup, les variables largeur, LARGEUR ou encore LArgEuR sont 3 variables différentes en langage C, même si pour nous ça a l'air de signifier la même chose !
Voici quelques exemples de noms de variable corrects : nombreDeVies, nombre_de_vies, prenom, nom, numero_de_telephone, numeroDeTelephone.
Chaque programmeur a sa propre façon de nommer des variables. Pendant ce cours, je vais vous montrer ma manière de faire :
Je vais vous demander de faire de la même manière que moi, ça nous permettra d'être sur la même longueur d'onde
Quoi que vous fassiez, faites en sorte de donner des noms clairs à vos variables. On aurait pu abréger nombreDeVies, en l'écrivant par exemple ndv. C'est peut-être plus court, mais c'est beaucoup moins clair pour vous quand vous relisez votre code. N'ayez donc pas peur de donner des noms un peu plus longs pour que ça reste compréhensible.
Notre ordinateur, vous pourrez le constater, n'est en fait rien d'autre qu'une (très grosse) machine à calculer. Il ne sait traiter que des nombres.
Oui mais voilà, j'ai un scoop ! Il existe plusieurs types de nombres !
Par exemple, il y a les nombres entiers positifs :
Mais il y a aussi des nombres décimaux, c'est-à-dire des nombres à virgule :
En plus de ça, il y a aussi des nombres entiers négatifs :
... Et des nombres négatifs décimaux !
Votre pauvre ordinateur a besoin d'aide ! Lorsque vous lui demandez de stocker un nombre, vous devez dire de quel type il est. Ce n'est pas vraiment qu'il ne soit pas capable de le reconnaître tout seul, mais... Ca l'aide beaucoup à s'organiser, et à faire en sorte de ne pas prendre trop de mémoire pour rien.
Lorsque vous créez une variable, vous allez donc devoir indiquer son type. Voici les principaux types de variables existant en langage C (il y en aura un autre qui fera son apparition en C++) :
| Nom du type | Nombres stockables |
| char | -128 à 127 |
| int | -2 147 483 648 à 2 147 483 647 |
| long | -2 147 483 648 à 2 147 483 647 |
| float | -3.4 x 10 puissance 38 à 3.4 x 10 puissance 38 |
| double | -1.7 x 10 puissance 308 à 1.7 x 10 puissance 308 |
(Je suis loin d'avoir mis tous les types, mais j'ai conservé les principaux)
Les 3 premiers types (char, int, long) permettent de stocker des nombres entiers : 1, 2, 3, 4...
Les 2 derniers (float, double) permettent de stocker des nombres décimaux : 13.8, 16.911...
Les types float et double permettent de stocker des nombres décimaux extrêmement grands.
Si vous ne connaissez pas les puissances de 10, dites-vous par exemple que le type double permet de stocker le nombre 1 suivi de 308 zéros derrière !
C'est-à-dire : 10000000000000000000000000000000000000000000000000000..... (je ne vais quand même pas écrire 308 zéros pour vous)
Vous remarquerez qu'int et un long ont l'air identiques. Avant ce n'était pas le cas (un int était plus petit qu'un long), mais aujourd'hui les mémoires ont évolué et on a assez de place pour stocker des grands nombres, donc on se moque un peu de la différence entre un int et un long. Le langage C "conserve" tous ces types pour des raisons de compatibilité, même si certains sont un peu de trop.
En pratique, j'utilise principalement char, int et double.
Vous verrez que la plupart du temps on manipule des nombres entiers (tant mieux, parce que c'est plus facile à utiliser)
Attention avec les nombres décimaux ! Votre ordinateur ne connaît pas la virgule, il utilise le point. Vous ne devez donc pas écrire 54,9 mais plutôt 54.9 !
Ce n'est pas tout ! Pour les types stockant des entiers (char, int, long...), il existe d'autres types dits "unsigned" (non signés) qui eux ne peuvent stocker que des nombres positifs. Pour les utiliser, il suffit d'écrire le mot "unsigned" devant le type :
| unsigned char | 0 à 255 |
| unsigned int | 0 à 4 294 967 295 |
| unsigned long | 0 à 4 294 967 295 |
Comme vous le voyez, les unsigned sont des types qui ont le défaut de ne pas pouvoir stocker de nombre négatif, mais qui ont l'avantage de pouvoir stocker des nombres 2 fois plus grands (char s'arrête à 128, tandis que unsigned char s'arrête à 255 par exemple).
Pourquoi avoir créé 3 types pour les nombres entiers ? Un seul type aurait été suffisant non ?
Oui, mais on a créé plusieurs types à l'origine pour économiser de la mémoire. Ainsi, quand on dit à l'ordinateur qu'on a besoin d'une variable de type "char", on prend moins d'espace en mémoire que si on avait demandé une variable de type "int".
Toutefois, c'était utile surtout à l'époque où la mémoire était limitée. Aujourd'hui, nos ordinateurs ont largement assez de mémoire vive pour que ça ne soit plus vraiment un problème. Il ne sera donc pas utile de se prendre la tête pendant des heures sur le choix d'un type. Si vous ne savez pas si votre variable risque de prendre une grosse valeur, mettez int. Et je dis ça sérieusement. Ne vous prenez pas trop la tête sur le choix d'un type pour le moment
En résumé, on fera surtout la distinction entre nombres entiers et décimaux :
On y arrive. Maintenant, créez un nouveau projet console que vous appellerez "variables".
On va voir comment déclarer une variable, c'est-à-dire demander à l'ordinateur la permission d'utiliser un peu de mémoire.
Une déclaration de variable, c'est très simple maintenant que vous savez tout ce qu'il faut
Il suffit d'indiquer dans l'ordre :
Par exemple, si je veux créer ma variable nombreDeVies de type int, je dois taper la ligne suivante :
Code : C - Sélectionner
|
Et c'est tout !
Quelques autres exemples stupides pour la forme :
Code : C - Sélectionner
|
Bon bref, vous avez compris le principe je pense
Ce qu'on fait là s'appelle une déclaration de variable (un vocabulaire à retenir là) Vous devez faire les déclarations de variables au début des fonctions. Comme pour le moment on n'a qu'une seule fonction (la fonction main), vous allez déclarer la variable comme ceci :
Code : C - Sélectionner
|
Si vous lancez le programme ci-dessus, vous constaterez avec stupeur... qu'il ne fait rien
Quelques explications
Alors, avant que vous ne m'étrangliez en croyant que je vous mène en bateau depuis tout à l'heure, laissez-moi juste dire une chose pour ma défense
En fait, il se passe des choses, mais vous ne les voyez pas. Lorsque le programme arrive à la ligne de la déclaration de variable, il demande bien gentiment à l'ordinateur s'il peut utiliser un peu d'espace dans la mémoire vive. Si tout va bien, l'ordinateur répond "Oui bien sûr, fais comme chez toi". Généralement, cela se passe sans problème.
Le seul problème qu'il pourrait y avoir, c'est qu'il n'y ait plus de place en mémoire... Mais cela arrive rarement heureusement, car pour remplir toute la mémoire rien qu'avec des int il faut vraiment être un bourrin de première
Soyez sans crainte donc, vos variables devraient normalement être créées sans souci.
Une petite astuce à connaître : si vous avez plusieurs variables du même type à déclarer, inutile de faire une ligne pour chaque variable. Il vous suffit de séparer les différents noms de variable par des virgules sur la même ligne :
Code : C - Sélectionner
|
Et maintenant ?
Maintenant qu'on a créé notre variable, on va pouvoir lui donner une valeur
C'est tout ce qu'il y a de plus bête. Si vous voulez donner une valeur à la variable nombreDeVies, il suffit de procéder comme ceci :
Code : C - Sélectionner
|
Rien de plus à faire. Vous indiquez le nom de la variable, un signe égal, puis la valeur que vous voulez mettre dedans. Ici, on vient de donner la valeur 5 à la variable nombreDeVies. Notre programme complet ressemble donc à ceci :
Code : C - Sélectionner
|
Là encore, rien ne s'affiche à l'écran, tout se passe dans la mémoire. Quelque part dans les tréfonds de votre ordinateur, une petite case de mémoire vient de prendre la valeur 5. C'est pas magnifique ça ? Pour un peu on en pleurerait
On peut s'amuser si on veut à changer la valeur par la suite :
Code : C - Sélectionner
|
Dans cet exemple, la variable va prendre d'abord la valeur 5, puis 4, et enfin 3. Comme votre ordinateur est très rapide, tout cela se passe extrêmement vite. Vous n'avez pas le temps de cligner des yeux que votre variable vient de prendre les valeurs 5, 4 et 3... et ça y est votre programme est fini
Voici une question très importante que je veux vous soumettre :
Quand on déclare une variable, quelle valeur a-t-elle au départ ?
En effet, quand l'ordinateur lit cette ligne :
Code : C - Sélectionner
|
Il réserve un petit emplacement en mémoire, d'accord. Mais quelle est la valeur de la variable à ce moment-là ? Y a-t-il une valeur par défaut (par exemple 0) ?
Eh bien, accrochez-vous : la réponse est non. Non non et non, il n'y a pas de valeur par défaut. En fait, l'emplacement est réservé mais la valeur ne change pas. On n'efface pas ce qui se trouve dans la "case mémoire". Du coup, votre variable prend la valeur qui se trouvait là avant dans la mémoire, et cette valeur peut être n'importe quoi !
Si cette zone de la mémoire n'a jamais été modifiée, la valeur est peut-être 0. Mais vous n'en êtes pas sûrs, il pourrait très bien y avoir le nombre 363 ou 18 à la place, c'est-à-dire un reste d'un vieux programme qui est passé par là avant ! Il faut donc faire très attention à ça si on veut éviter des problèmes par la suite. Le mieux est d'initialiser la variable dès qu'on la déclare. En C, c'est tout à fait possible. En gros, ça consiste à combiner la déclaration et l'affectation d'une variable dans la même instruction :
Code : C - Sélectionner
|
Ici, la variable nombreDeVies est déclarée et elle prend tout de suite la valeur 5.
L'avantage, c'est que vous êtes sûrs après que cette variable contient une valeur correcte, et pas du n'importe quoi
Il arrive parfois que l'on ait besoin d'utiliser une variable dont on voudrait qu'elle garde la même valeur pendant toute la durée du programme. C'est-à-dire qu'une fois déclarée, vous voudriez que votre variable conserve sa valeur et que personne n'ait le droit de changer ce qu'elle contient.
Ces variables particulières sont appelées constantes, justement parce que leur valeur reste constante.
Pour déclarer une constante, c'est en fait très simple : il faut utiliser le mot "const" juste devant le type quand vous déclarez votre variable. Par ailleurs, il faut obligatoirement lui donner une valeur au moment de sa déclaration comme on vient d'apprendre à le faire. Après, il sera trop tard : vous ne pourrez plus changer la valeur de la constante.
Exemple de déclaration de constante :
Code : C - Sélectionner
|
Ce n'est pas une obligation, mais par convention on écrit les noms des constantes entièrement en majuscules comme je viens de le faire là. Cela nous permet ainsi de distinguer facilement les constantes des variables. Notez qu'on utilise l'underscore _ à la place de l'espace.
A part ça, une constante s'utilise comme une variable normale, vous pouvez afficher sa valeur si vous le désirez. La seule chose qui change, c'est que si vous essayez de modifier la valeur de la constante plus loin dans le programme, le compilateur vous indiquera qu'il y a une erreur avec cette constante.
Les erreurs de compilation sont affichées en bas de l'écran, dans ce que j'appelle la "zone de la mort", vous vous souvenez ? Dans un tel cas, le compilateur vous afficherait un mot doux du genre : [Warning] assignment of read-only variable ' NOMBRE_DE_VIES_INITIALES' (traduction : "mais t'es vraiment idiot, pourquoi t'essaies de modifier la valeur d'une constante ?" )
On sait afficher du texte à l'écran avec la fonction printf. Maintenant, on va voir comment afficher la valeur d'une variable avec cette même fonction.
On utilise en fait printf de la même manière, sauf que l'on rajoute un symbole spécial à l'endroit où on veut afficher la valeur de la variable.
Par exemple :
Code : C - Sélectionner
|
Ce "symbole spécial" dont je viens de vous parler est en fait un % suivi de la lettre "d". Cette lettre permet d'indiquer ce que l'on doit afficher. "d" signifie que c'est un nombre entier.
Il existe plusieurs autres possibilités, mais pour des raisons de simplicité on va se contenter de retenir ces deux-là :
| Symbole | Signification |
| %d | Nombre entier (ex. : 4) |
| %f | Nombre décimal (ex. : 5.18) |
Je vous parlerai des autres symboles en temps voulu. Pour le moment, sachez que si vous voulez afficher un int vous devez utiliser %d, et pour un double vous utiliserez %f.
On a presque fini. On a indiqué qu'à un endroit précis on voulait afficher un nombre entier, mais on n'a pas précisé lequel ! Il faut donc indiquer à la fonction printf quelle est la variable dont on veut afficher la valeur.
Pour ce faire, vous devez taper le nom de la variable après les guillemets et après avoir rajouté une virgule, comme ceci :
Code : C - Sélectionner
|
Le %d sera remplacé par la variable indiquée après la virgule, à savoir nombreDeVies.
On se teste ça un petit coup dans un programme ?
Code : C - Sélectionner
|
Ca pourrait presque être un jeu vidéo (il faut juste beaucoup d'imagination ^^ ). Ce programme affiche ceci à l'écran :
Code : Console - Sélectionner
| Vous avez 5 vies |
| **** B A M **** |
| Ah desole, il ne vous reste plus que 4 vies maintenant ! |
Vous devriez reconnaître ce qui se passe dans votre programme :
Bref, c'est plutôt simple
Il est possible d'afficher la valeur de plusieurs variables dans un seul printf. Il vous suffit pour cela d'indiquer des %d ou des %f là où vous voulez, puis d'indiquer les variables correspondantes dans le même ordre, séparées par des virgules.
Par exemple :Code : C - Sélectionner
|
Veillez à bien indiquer vos variables dans le bon ordre. Le premier %d sera remplacé par la première variable (nombreDeVies), et le second %d par la seconde variable (niveau). Si vous vous trompez d'ordre, votre phrase ne voudra plus rien dire
Allez un petit test maintenant. Notez que j'enlève les lignes tout en haut (les directives de préprocesseur commençant par un #), je vais supposer que vous les mettez à chaque fois maintenant :
Code : C - Sélectionner
|
Ce qui affichera :
Code : Console - Sélectionner
| Vous avez 5 vies et vous etes au niveau n°1 |
Les variables vont en fait commencer à devenir intéressantes maintenant. On va apprendre à demander à l'utilisateur de taper un nombre dans la console. Ce nombre, on va le récupérer et le stocker dans une variable. Une fois que ça sera fait, on pourra faire tout un tas de choses avec, vous verrez
Pour demander à l'utilisateur de rentrer quelque chose dans la console, on va utiliser une autre fonction toute prête : scanf Cette fonction ressemble beaucoup à printf. Vous devez mettre un %d pour indiquer que l'utilisateur doit rentrer un nombre entier (pour les décimaux je vais y revenir). Puis vous devez indiquer après le nom de la variable qui va recevoir le nombre.,/p>
Voici comment faire par exemple :
Code : C - Sélectionner
|
On doit mettre le %d entre guillemets. Par ailleurs, il faut mettre le symbole & devant le nom de la variable qui va recevoir la valeur.
Euh, pourquoi mettre un & devant le nom de la variable?
Là, il va falloir que vous me fassiez confiance. Si je dois vous expliquer ça tout de suite, on n'est pas sortis de l'auberge croyez-moi Que je vous rassure quand même : je vous expliquerai un peu plus tard ce que signifie ce symbole. Pour le moment, je choisis de ne pas vous l'expliquer pour ne pas vous embrouiller, c'est donc plutôt un service que je vous rends là
Attention : si vous voulez faire rentrer un nombre décimal (de type double), cette fois il ne faut pas utiliser %f comme on pourrait s'y attendre mais... %lf. C'est une petite différence avec le printf qui lui prenait %f.
Code : C - Sélectionner
|
Revenons à notre programme. Lorsque celui-ci arrive à un scanf, il se met en pause et attend que l'utilisateur rentre un nombre. Ce nombre sera stocké dans la variable "age".
Voici un petit programme simple qui demande l'âge de l'utilisateur et qui le lui affiche ensuite :
Code : C - Sélectionner
|
Code : Console - Sélectionner
| Quel age avez-vous ? 20 |
| Ah ! Vous avez donc 20 ans ! |
Le programme se met donc en pause après avoir affiché la question "Quel age avez-vous ?". Le curseur apparaît à l'écran, vous devez taper un nombre entier (votre âge). Tapez ensuite sur Entrée pour valider, et le programme continuera à s'exécuter. Ici, tout ce qu'il fait après c'est afficher la valeur de la variable "age" à l'écran ("Ah ! Vous avez donc 20 ans !").
Voilà, vous avez compris le principe
Grâce à la fonction scanf, on peut donc commencer à interagir avec l'utilisateur, histoire de lui demander 2-3 informations privées
Notez que rien ne vous empêche de taper autre chose qu'un nombre entier :
nombre de visites: 1703
