Mon premier programme

Cette page contient 3 exemples de programme hello word :

Le premier exemple est un projet en c, pour DOS.

le deuxième est la transformation du premier exemple, en langage c++

Enfin, on termine par un exemple de sortie pour WINDOWS

Pour tous les exemples, vous commencerez par consulter la source, en activant le lien que je vous proposerai. Si vous avez installé un compilateur c sur votre PC, (comme vcc de microsoft, ou bcc32 de borland) je vous indiquerai comment faire la compilation, à partir de l'invite de DOS. Si vous ne possédez pas de compilateur c, vous pourrez en télécharger gratuitement, en recherchant le mot compilateur, dans le champ de recherche de yahoo.

La source en langage c, du premier exemple, est dans le fichier exemple1.c, du répertoire protutor. Consultez-le en activant le lien ci-dessous. Si vous avez installé bc5 de borland sur votre PC, l'ouverture ou le téléchargement du fichier exemple1.c, se fera dans l'environnement bccw, car les fichiers de suffixe .c, sont mis en associacion avec cet utilitaire de borland. Si aucun utilitaire n'est associé aux .c, ouvrez exemple1.c avec un editeur comme wordpad, par exemple.

source de l'exemple1 en langage c

Les 3 premières lignes sont des commentaires. Remarquez l'instruction // qui permet d'écrire des commentaires. On trouve ensuite l'instruction #include Le caractère # placé en début de ligne, indique que la directive qui suit est destinée au précompilateur. Ici le mot réservé include, suivi d'un nom de fichier entre soufflet (ou entre guillemets) indique au précompilateur, d'insérer le fichier indiqué dans la source, à cet endroit.

Quand le nom du fichier est placé entre soufflets, le fichier est recherché dans le sous-répertoire include de bc5 (pour la version bc5 de borland) Sinon, le fichier est recherché dans le répertoire où se trouve la source .c, ou avec son chemin, s'il y a lieu.

L'instruction void main(void) suivie d'un bloc placé entre accolade, déclare une fonction appelée main (de l'anglais principal) Elle n'a pas d'argument, et ne renvoie aucune valeur. C'est pourquoi on a utilisé le type void, dans la parenthèse et devant le nom de la fonction. Un type correspond à un nombre d'octets, que le compilateur réserve en mémoire pour la représentation d'une variable. le type void correspond à 0 octet. Nous rencontrerons plus loin le type char, qui correspond à 1 octet, le type int qui correspond à 2 octets...

Toute application en c, doit posséder un et un seul main, qui est appelé le programme principal. les mots main et void sont des mots réservés du langage c, de même que char, int...

Dans le bloc de la fonction main, on trouve 2 instructions, chacunes terminées par le caractère ; (point virgule) La première utilise la fonction printf (de l'anglais print pour imprimer et f, pour format) pour écrire sur l'écran, la chaîne formatée "bonjour tout le monde\n" La seconde instruction est return; Vous remarquez les guillemets qui encadrent une chaîne de caractères. Le caractère spécial indiqué par \n, est un caractère d'echappement (escape) qui indique un retour à la ligne (caractère ASCII 13 ou CTRL + m)

Vous compilerez exemple1.c, en entrant, sur l'invite de DOS :

bcc32 exemple1.c

Cette commande effectue la compilation qui produit exemple1.obj, puis le link, qui produit exemple1.exe Exécutez alors exemple1.exe, et constatez que la sortie : bonjour tout le monde ! est écrite sur l'écran, puis que l'on sort de l'application pour se retrouver à l'invite de DOS.

Ce premier projet en c pour DOS, vous semblera puéril, mais il contient volontairement le minimum d'instructions, qu'un programme puisse avoir. Il va cependant nous permettre de commenter comment utiliser l'aide de borland, pour approfondir nos connaissances, et l'enrichir de nouvelles instructions, en connaissance de cause.

Le lien suivant vous permet d'activer l'aide bcdos.hlp de borland. Dans l'aide, choisissez l'index par ALT + i, puis tapez printf dans le champ d'édition.

aide bcdos.hlp de borland

Je commente les renseignements, que vous trouvez dans l'aide de borland sur le mot réservé printf.

La première indication est le nom du fichier d'en tête précompilé, dans lequel se trouve la fonction printf. Il s'agit ici de stdio.h (de l'anglais standard input output, entrées/sorties standard) C'est ce fichier que vous devez inclure dans votre source, par l'instruction #include

L'indication qui suit est le prototype de la fonction, c'est à dire l'écriture du type renvoyé par la fonction, suivi du nom de lafonction, et du type de ses arguments, dans l'ordre où il doivent être écrits.

Enfin, vous trouverez une description de la fonction et de ses arguments, et des liens apparentés (see also, de l'anglais voir aussi)

Les aides sur les langages sont en général écrites en anglais, mais cela ne doit pas vous gêner de trop, même si vous ne connaissez pas cette langue, car l'essentiel est de trouver les indications nécessaires, pour l'utilisation de la fonction dans votre source. Vous remarquez que la fonction printf permet d'écrire, sur l'ecran standard 25 lignes et 80 colonnes (stdout, écran standard) une sortie formatée. Vous remarquez qu'il existe des fonctions apparentées à printf, comme sprintf, fprintf... Par exemple sprintf (de l'anglais string print format, écrire dans une chaîne avec un format) possède un premier argument supplémentaire char *, qui est un pointeur de chaîne de caractère. sprintf est analogue à printf, mais elle écrit dans la chaîne indiquée, contrairement à printf, qui écrit dans le flux de sortie standard stdout. De même, fprintf permet d'écrire une chaîne formatée, dans un flux indiqué par son premier argument.

A part ce premier argument supplémentaire, la description des fonctions sprintf, fprintf... est identique à celle de printf.

A titre d'exercice, ajoutez dans exemple1.c, les instructions qui permettent, de placer l'entier ival dans la chaîne de caractère phr. On doit déclarer au début du main, la variable entière ival et la chaîne phr, par :

int ival;

char phr[80];

Remarquez qu'en c, toutes les déclarations doivent obligatoirement être placées, au début des fonctions. On a choisi ici, de déclarer une chaîne de 80 caractères, qui seront placés dans le tableau phr, le premier etant phr[0], et le dernier phr[79] Remarquez que le premier élément commence en 0 et non en 1 !

Ensuite, vous définirez les valeur de ival et de phr par :

ival=2003;

sprintf(phr,"bonjour tout le monde, et bonne année %d !\n",ival);

La sortie standard sur l'écran sera faite par :

printf("%s",phr);

Recompilez votre source exemple1.c, comme il l'a été dit plus haut par bcc32 exemple1.c, et regardez les messages d'erreur ou warnings éventuels, à la compilation et au link. Si vous n'avez pas d'erreur, l'exécution de exemple1.exe écrira sur l'écran : bonjour tout le monde, et bonne année 2003 !

Il se peut que vous n'ayez aucune erreur et que cependant, votre programme plante à l'exécution. Ce sera le cas, par exemple, si la liste d'argument à écrire est plus courte que le nécessite les caractères de formatage, dans la fonction printf. En effet, dans ce cas, le comportement de l'application en exécution, est imprévisible !

Les erreurs d'exécution sont beaucoup plus difficiles à détecter, que les erreurs de compilation, ou que les erreurs au link. Les erreurs de compilation sont souvent dues à des oublis de déclaration, des fautes de syntaxe, des appels de fonctions avec des arguments qui n'ont pas le type requis... Les erreurs au link, proviennent de fonctions non déclarées, ou non trouvée dans les bibliothéques requises. Cela peut être du à une erreur d'écriture du nom de la fonction, ou à l'absence d'un .h qui contient la fonction , ou à une variable globale que l'on a oublié de déclarer en extern...

Voici maintenant l'exemple 2, qui est l'analogue de ce premier projet, mais écrit en langage c++ Remarquez que exemple1.c, peut être compilé avec l'option -P du c++ Exécutez sur l'invite de DOS, la commande :

bcc32 -P exemple1.c

Les messages du compilateur ne sont pas exactement les même, que sans l'option -P, mais il n'y a pas d'erreur et exemple1.exe fonctionne comme précédemment. Cela provient de ce que toutes les instructions de la source, sont portables en c et en c++ Cela ne sera pas toujours vrai, car le c++ possède des règles de langage qui lui sont spécifiques, et que certaines fonctions du c ne sont pas portables en c++

En fait, il vaut mieux traiter les entrées / sorties, avec les flux du c++, plutôt que d'utiliser les fonctions du c, comme printf... Consultez le lien avec la source exemple2.cpp, qui contient la source en c++, analogue à la source exemple1.c en c

source exemple2.cpp

Vous constatez que le fichier stdio.h a été remplacé par iostream.h Ce fichier est celui qui contient les prototypes pour les fonctions cout, cin... du c++ L'instruction cout<<"bonjour tout le monde !"<

Vous ajouterez, à titre d'exercice, l'instruction qui écrira la sortie sur l'écran : bonjour tout le monde et bonne année 2003 !

Pour cela il suffit d'écrire une ligne comme :

cout<<"bonjour tout le monde et bonne année "<

après avoir déclaré puis défini la variable entière ivar.

Vérifiez que vous pouvez introduire la déclaration int ivar; n'importe où dans la fonction main, et non nécessairement au début de la fonction, comme cela était obligatoire en c. Ceci provient de ce que le c++ ne gère pas la mémoire de la pile comme le fait le langage c

On bénéficie en c++ des opérateurs new et delete, qui facilitent la gestion de cette mémoire. Elles remplacent avantageusement les fonctions malloc... du c (voir mem.h) Mais le langage c++ offre bien plus encore !

Il a été introduit pour permettre une plus grande sécurité, pour l'exécution des fonctions, en introduisant la notion de classe. Cette notion généralise la notion de structure, que l'on a déja en c, en introduisant des priorités d'accès (public private et protected)

L'idée est très simple : Elle consiste à regrouper les propriétés et les méthodes, qui sont les fonctions qui permettent de manipuler les propriétés d'un objet, dans un même ensemble, que l'on appelle une classe. les éléments de cet ensemble, sont appelés les objets de la classe. Si l'on donne l'accès aux propriétés d'un objet, uniquement aux méthodes de sa classe, on est assuré de ne pas faire d'opérations illicites.

Un objet d'une classe peut être construit en dehors de sa classe, par une fonction publique appelée son constructeur, et être détruit, quand on n'en a plus besoin, par son destructeur. On a ainsi, en plus d'un gain en sécurité, une meilleure gestion de la mémoire vive.

Il y a bien plus encore, avec la notion d'héritage (aussi appelé dérivation à partir d'une classe de base) Il devient alors facile de personnaliser une classe de base, en lui associant une classe dérivée, qui héritera de toutes les propriétés et méthodes de sa classe de base, et dans laquelle on ajoutera simplement quelques nouveaux champs personnels.

On peut ainsi profiter du travail des autres, en se concentrant sur les nouveautés à apporter, sans avoir à reprogrammer les outils de base. Par exemple, la bibliothéque owl (de l'anglais object windows library) permet d'utiliser tous les contrôles standards de windows, comme les boutons, les fenêtres, les cadres... dans vos programmes en c++

Le c++ offre bien d'autres possibilités, comme la surcharge des opérateurs, la création de template (de l'anglais patron ou modèle) d'héritage multiple...

J'ai fait ces quelques remarques, pour vous conseiller d'utiliser directement le c++, plutôt que le c, si vous ne connaissez aucun de ces langages. Le c++ n'est pas plus difficile que le c, et il vous apprendra à travailler en langage objet, ce qui sera utile pour d'autres langage comme java ou vb6.

Le dernier exemple est un programme hello word pour WINDOWS Consultez la source de cet exemple dans le fichier exemple3.c

source exemple3.c pour windows

le fichier windows.h remplace le fichier iostream.h de l'exemple2, dans l'instruction #include. C'est ce fichier, qui contient le prototype des fonctions de l'api de windows. Le programme principal ne s'appelle plus main, mais WinMain, et a des arguments, nécessaires au fonctionnement du système d'exploitation sous WINDOWS. La sortie bonjour tout le monde ! est faite, par la fonction MessageBox.

Vous remarquerez que les lettres qui marquent le début des noms, sont écrites en majuscules, comme on a l'habitude de le faire dans l'api de windows. Le dernier argument de la fonction, indique les évenements que l'on peut envoyer au contrôle MessageBox

Compilez exemple3.c en exécutant, a l'invite de DOS, la commande :

bcc32 -W exemple3.c

Modifiez l'exemple 3, en lui ajoutant la fonction sndPlaySound, qui permet de lire un fichier sonore .wav IL faut ajouter la ligne : #include car le prototype de sndPlaySound est dans ce fichier d'en tête

Ajoutez ensuite dans la fonction WinMain, la ligne :

sndPlaySound("c:\\sv3\\wav\\edition.wav",SND_SYNC);

On suppose que le fichier edition.wav est un fichier sonore, situé dans le répertoire de chemin c:\sv3\wav Vous remarquerez qu'il faut faire précéder le caractère backslash, d'un autre caractère backslash, pour qu'il soit reconnu comme tel, sinon il serait considéré comme précédent un caractère d'échappement, comme dans le retour à la ligne \n par exemple.

Le projet 3 n'est pas une application pour WINDOWS, telle que vous avez l'habitude d'en rencontrer, avec une fenêtre, qui contient un menu...

En fait, les 3 exemples ci-dessus, sont réduit au minimum, pour vous inciter à apprendre un langage, dans un cours spécialisé.

Si vous êtes intéressé par la programmation, consultez le dernier lien de ce tutorial.

suivant : conclusions et perspectives

retour au sommaire du cours protutor