Anda di halaman 1dari 198

BTS Services informatiques aux organisations

1re anne
lisabeth Martins Da Silva

Bases de la programmation
Cours

Directeur de publication: Serge Bergamelli


Les cours du Cned sont strictement rservs lusage priv de leurs destinataires et ne sont pas destins une utilisation collective.
Les personnes qui sen serviraient pour dautres usages, qui en feraient une reproduction intgrale ou partielle, une traduction sans
le consentement du Cned, sexposeraient des poursuites judiciaires et aux sanctions pnales prvues par le Code de la proprit
intellectuelle. Les reproductions par reprographie de livres et de priodiques protgs contenues dans cet ouvrage sont effectues par le
Cned avec lautorisation du Centre franais dexploitation du droit de copie (20, rue des Grands Augustins, 75006 Paris).

Sommaire
Conseils gnraux

Squence 1: Programmation procdurale

Squence 2: Programmation vnementielle

97

Squence 3: Initiation la programmation objet

127

Corrigs des exercices

145

Conseils gnraux
Importance du cours pour lexamen
Ce cours est fondamental car il permet dacqurir les bases indispensables dans le
domaine du dveloppement dapplications. Il est abord au premier semestre de la premire anne, donc il concerne les deux options.
Mme si ce cours est particulirement important pour les tudiants qui vont choisir
loption SLAM (Solutions Logicielles et Applications Mtiers), il nest pas ngliger
par les tudiants qui vont choisir loption SISR (Solutions dInfrastructure, Systmes et
Rseaux). En effet, les bases de la programmation sont essentielles, mme dans le cadre
de configurations de rseaux.
Au niveau de lexamen, lpreuve crite U5 "Production et fourniture de services"
comportera une partie sur les notions de programmation : cette partie sera bien sr
plus importante pour loption SLAM. Lpreuve technique U4 "Conception et maintenance de solutions informatiques" sera, pour loption SLAM, une dmonstration des
capacits acquises entre autres dans ce cours. Enfin, en ce qui concerne lpreuve orale
U6 "Parcours de professionnalisation", l encore, en particulier pour loption SLAM,
lutilisation professionnelle des notions acquises sera primordiale. Pour l'option SISR, les
preuves U4 et U6 peuvent tre loccasion de montrer aussi des capacits en programmation, toujours apprciables dans ce domaine.

Organisation du cours
Le cours est divis en 3 squences qui doivent tre traites dans lordre. Mme si vous
avez des connaissances en programmation, il est conseill de suivre chaque squence
pour acqurir les bonnes mthodes qui seront utiles pour lexamen.
Les squences sont ponctues d'exercices : chaque exercice est trs important pour
contrler le niveau d'acquisition des notions abordes. Donc ne faites pas d'impasse.
De mme, vous tes rgulirement invit aller raliser un TP sur machine: ces TP se
trouvent dans le fascicule de TP correspondant ce cours. Ne ngigez pas les TP qui
reprsentent l'occasion de coder et ainsi d'acqurir des connaissances pratiques importantes.
Squence 1 : Programmation procdurale. Vous allez tre initi aux fondements de la
programmation travers lapprentissage du raisonnement algorithmique et la mise en
pratique sous C++ en mode console.
Squence 2 : Programmation vnementielle. Vous allez dcouvrir la programmation
dans un environnement graphique avec la gestion des vnements. La mise en pratique
sera sous Visual Basic 6.
Squence 3: Initiation la programmation objet. Vous allez apprendre manipuler les
concepts fondamentaux de la programmation objet, avec une mise en pratique sous C#.
Le choix des langages nest pas anodin : le C++ est la rfrence inconteste, le Visual
Basic 6 est ancien mais cest le plus simple et donc le plus adapt pour dcouvrir la programmation vnementielle, et enfin le C# est actuellement un des langages les plus
utiliss et cest aussi un langage "tout objet".
Enfin, vous trouverez en fin de fascicule une squence d'autocorrection contenant la
correction de tous les exercices.

Page 3

Outils utiliss dans ce cours et le fascicule TP correspondant


travers ce cours et aussi le fascicule de TP, vous allez travailler avec trois langages diffrents. Voici comment rcuprer et installer les diffrents langages.

8 2944 TG PA 00

C++
Le but est de rcuprer ce fichier: eclipsecpppack-0.1.zip
Vous l'avez normalement en tlchargement sur le site du CNED, dans la partie correspondant ce cours. Si pour une raison quelconque, vous ne le trouvez pas, faites une
rapide recherche sur internet partir de ce nom.
Si vous avez l'habitude de travailler avec un autre IDE, faites comme vous voulez mais
attention, certaines explications sont spcifiques cet IDE.
Une fois le fichier rcupr, il n'y a rien installer: il suffit de le dzipper puis de lancer
Eclipse.bat qui se trouve dans le dossier. Sur la page d'accueil, lors du premier lancement,
cliquez sur le rond qui contient une flche, droite. Vous accdez la zone de travail
d'Eclipse. Voil c'est termin.

Visual Basic 6
Vous avez, avec le cned, accs un abonnement tudiant msdnaa qui vous permet de
rcuprer plusieurs logiciels dont Visual Basic 6. Aprs votre inscription vous allez recevoir un mail contenant tous les lments dactivation de cet abonnement. Si ce nest pas
le cas, veuillez en faire la demande en utilisant la rubrique contact du site de votre
BTS.
Une fois le logiciel rcupr, vous devez l'installer avant de l'utiliser.

C#
Comme Visual Basic 6, vous trouverez C# dans Visual Studio que vous pourrez aussi rcuprer avec l'abonnement msdnaa.
Le logiciel doit aussi tre install.

Devoirs
Page 4

Vous avez raliser 2 devoirs: le premier est faire lissue de la squence 1 et donc
ne porte que sur la programmation procdurale, le second est faire la fin du cours et
porte sur la programmation vnementielle et la programmation objet.

Bon courage tous.

8 2944 TG PA 00

Squence 1

Programmation procdurale
La programmation procdurale regroupe l'ensemble des notions de base de la programmation dun ordinateur. Ces concepts vont vous permettre dcrire vos premiers
programmes en mode console (donc non graphique) mais vont reprsenter aussi les fondements pour pouvoir ensuite passer la programmation graphique, dans la prochaine
squence.

X Prrequis
Aucune connaissance pralable nest ncessaire pour aborder ce cours.

X Capacits attendues en fin de squence


Avoir acquis les connaissances lies la programmation procdurale : structures de base (affectation, saisie, affichage, alternatives, itrations), variables
simples, tableaux et modules paramtrs.

X Contenu

Squence 1

1. Votre premier programme .............................................................................. 6

Programmation
procdurale

2. Logique algorithmique .................................................................................. 22


3. Tableaux ......................................................................................................... 49

Page 5

4. Modules et paramtres ................................................................................. 65


5.

Synthse
.........................................................................................................................
94

8 2944 TG PA 00

1.

Votre premier programme

Avant d'apprendre les bases de la programmation, vous allez dcouvrir travers un


premier exemple le monde du dveloppement. Soyez attentif toutes les explications
donnes: le but n'est pas de retenir par cur ce qui est prsent mais de comprendre le
principe gnral de la logique de programmation.

1A. Qu'est-ce qu'un programme?


Les programmes sont partout
Un programme est un ensemble dordres crits dans un langage convertissable afin
dtre excut par la machine.
Quand vous lancez un programme, lordinateur se contente de faire exactement ce qui
lui est demand de faire, en excutant un par un les ordres contenus dans le programme.
Ralisez bien qu chaque fois que vous utilisez un ordinateur, vous utilisez un ou
plusieurs programmes. Un ordinateur sans programme ne fait rien. Il a besoin de programmes excuter pour offrir des fonctionnalits. Quand vous ouvrez un traitement
de texte, quand vous utilisez internet, quand vous jouez, chaque fois vous lancez des
programmes. Ces programmes ont t crits par des programmeurs. Jusqu maintenant,
vous avez t utilisateur de programmes crits par dautres. Avec ce cours, vous allez
apprendre passer dans le monde des programmeurs en crant vos propres programmes.

Excution d'un programme


Squence 1
Programmation
procdurale

Page 6

En qualit dutilisateur, vous savez excuter un programme : il suffit par exemple de


double cliquer sur un fichier, ou de passer par une option dun menu.
En ralit, ds le dmarrage de lordinateur, un premier programme se lance automatiquement: cest le systme dexploitation. Il y a quelques annes, les systmes dexploitation taient non graphiques et il fallait connatre les commandes textuelles du systme
pour savoir, entre autres, excuter un programme. Depuis, les systmes dexploitation
ont beaucoup volu et offrent un environnement graphique intuitif qui permet nettement plus facilement dexcuter diffrents programmes. Plusieurs programmes peuvent
mme tre lancs simultanment.
Mais que se passe-t-il quand vous demandez lexcution dun programme (par exemple
en double cliquant sur une icne)?

tapes de vie d'un programme


Lorsque vous demandez dexcuter un programme (par exemple en demandant douvrir
un traitement de texte), un fichier, contenant le programme, est excut par le systme
dexploitation. Ce fichier possde un format particulier et contient un programme crit
normalement en langage machine.
Si vous tentez douvrir ce fichier avec par exemple un diteur, vous narriverez pas comprendre son contenu qui sera un ensemble de caractres fantaisistes. En fait, un fichier
excutable contient du code crit en binaire (une succession de 0 et de 1).
Pourquoi ce codage? Car lordinateur est compos de circuits lectriques qui ne peuvent
avoir que 2 tats: ouvert ou ferm (donc laissant passer le signal lectrique ou bloquant
ce signal). Comme chaque circuit ne peut avoir que 2 tats, on code ces 2 tats sous
forme de 0 et de 1. Inutile de rentrer plus en dtail sur ce fonctionnement: le but est
juste que vous compreniez mieux le principe.
Vous vous doutez bien que les programmeurs ncrivent pas leurs programmes en
binaire. Alors, comment a marche ? Sachant que lordinateur nest capable de comprendre que le binaire...

8 2944 TG PA 00

En fait le programmeur va crire son programme dans une syntaxe nettement plus
accessible: cest ce quon appelle un langage volu. La question qui vient alors naturellement l'esprit : lordinateur ne comprenant que le binaire, comment fait-il pour
comprendre un programme crit dans un langage volu ? Eh bien tout simplement
il ne le comprend pas: il faut quun autre programme traduise le programme crit en
langage volu, dans le langage machine. Voici un schma pour essayer dexpliquer le
fonctionnement:

programme
crit en langage
volu

compilation

programme
crit en langage
machine

excution

rsultat
de
l'excution

Un programmeur va crire un programme dans un langage volu (C++, C#, Java, PHP,
javascript, Delphi, Windev...).
Une fois le programme crit, il faut utiliser un programme spcifique (gnralement
appel un compilateur) pour traduire le programme en langage machine.
Une fois le programme traduit en langage machine, il est possible de lexcuter : la
machine comprend les ordres contenus dans le programme.
En ralit, les choses sont un peu plus complexes, mais cette explication est suffisante
pour comprendre le principe global.

1B. Exemple de programme en C++


Vous allez dcouvrir un tout premier programme simpliste qui permet de jouer au jeu
du nombre cach, en mode console (donc pas dans un environnement graphique : a
viendra plus tard).

Squence 1
Programmation
procdurale

Page 7

But du programme
Un premier utilisateur va saisir une valeur puis passe la main un second utilisateur qui,
ne connaissant pas cette valeur, doit la deviner en saisissant plusieurs essais successifs.
chaque essai, un message saffiche pour lui dire si lessai est trop grand ou trop petit
par rapport la valeur de dpart. Le jeu sarrte quand la bonne valeur est trouve. Le
programme affiche alors le nombre dessais pour arriver trouver la bonne valeur.

Code en C++
Voici le code du programme dans le plus connu des langages volus: le C++.

8 2944 TG PA 00

/* Jeu du nombre cach


* auteur: Emds
* date: 27/04/2011
*/
//--- bibliothques ncessaires --#include <stdio.h>
// pour le printf et scanf
#include <conio.h>
// pour le getch
#include <stdlib.h>
// pour le system("cls")
//--- programme principal --int main () {
// dclarations
int valeur, essai, nbre = 1;
// saisie du nombre chercher
printf("Entrez le nombre \x85 chercher =");
scanf("%d",&valeur);
system("cls");
// boucle sur la saisie des essais
printf("Entrez un essai =");
scanf("%d",&essai);
while (essai != valeur) {
if (essai > valeur) {
printf("trop grand !");
}else{
printf("trop petit !");
}
printf("\nEntrez un nouvel essai =");
scanf("%d",&essai);
nbre++;
}

Squence 1
Programmation
procdurale

Page 8

// rsultat
printf("Vous avez trouv\x82 en %d essais", nbre);
getch();
return 0;
}
En voyant ce code, il est tout fait naturel que vous ne compreniez rien ou pas grand
chose (sauf si vous savez dj coder). Il y a tout de mme quelques phrases en franais,
mais surtout des instructions obscures avec certains termes en anglais.
Ce code, une fois compil, va donner un code machine que lordinateur va pouvoir
excuter. Pour que ce soit plus comprhensible, partir de maintenant on ne fera plus
mention du code machine et on va ragir comme si le code volu tait directement
excut. Donc, voyons ensemble, tape par tape, ce que lordinateur va faire en excutant ce code.

8 2944 TG PA 00

Environnement dexcution
Pour excuter un code, lordinateur utilise son microprocesseur (la zone qui s'occupe des
calculs et des tests), sa mmoire centrale et les priphriques ncessaires avec, en tout
premier, le clavier et lcran.
Avec le clavier, lutilisateur peut saisir des informations. Avec lcran, lutilisateur peut
visualiser des messages. La mmoire centrale offre des tas de petites cases qui peuvent
stocker temporairement des informations.
Voyons donc ce qui se passe au niveau de la mmoire, de la saisie et de laffichage au fur
et mesure de lexcution du programme.

Analyse de l'excution
Voyons tape par tape comment lordinateur excute le code. Il prend les lignes tout
simplement dans l'ordre (sauf quelques exceptions qui seront abordes plus loin).
/* Jeu du nombre cach
* auteur: Emds
* date: 27/04/2011
*/
Cette premire partie est crite en clair. C'est ce qu'on appelle un commentaire. tout
moment, il est possible d'ajouter des commentaires dans le code, pour expliquer certains points. Les commentaires ne sont pas obligatoires et la machine n'en tient pas du
tout compte, mais ils sont fortement conseills pour que le programme soit facilement
comprhensible par un autre programmeur... ou par le programmeur lui-mme ! Car
parfois, en se replongeant dans un programme que l'on a crit, certains aspects ne nous
paraissent plus trs clairs.
Traditionnellement, un programme commence par une "cartouche": c'est un commentaire de plusieurs lignes mis en dbut de programme pour donner les informations de
base, du genre le titre, l'auteur, la date de cration.

Squence 1
Programmation
procdurale

Page 9

Chaque langage utilise des syntaxes spcifiques. En C++, les commentaires peuvent se
noter de 2 faons:
entre /* et */: le commentaire peut tre sur plusieurs lignes;
aprs //: le reste de la ligne est un commentaire.
//--- bibliothques ncessaires --#include <stdio.h>
// pour le printf et scanf
#include <conio.h>
// pour le getch
#include <stdlib.h>
// pour le system("cls")
Vous remarquez au passage les commentaires prsents dans cette partie: un en dbut
de bloc pour expliquer ce que reprsente ce bloc de code, un par ligne pour expliquer
clairement chaque ligne de code. Vous verrez plus loin qu'il n'y a pas systmatiquement
un commentaire par ligne. C'est mme assez rare. Ici, le commentaire est bien utile car
il explique chaque "include".
L'instruction include permet d'intgrer dans un programme des bibliothques d'autres
programmes offrant des fonctionnalits qui sont donc dj codes. Ici, 3 bibliothques
sont utilises: une pour grer les saisies et affichages (instructions printf et scanf), une
autre pour grer la saisie d'un seul caractre sans valider (getch) et une dernire pour
grer l'effacement de l'cran (system("cls")).

8 2944 TG PA 00

//--- programme principal --int main () {


Cette fois c'est le programme principal qui dmarre. L'excution relle des ordres d'un
programme commence toujours dans le programme principal. Pourquoi cette syntaxe
particulire?
main: en anglais cela signifie "principal". Un programme peut tre constitu de diffrentes parties, appeles "modules" qui peuvent interagir. Le module principal, donc le
premier s'excuter, s'appelle obligatoirement "main" (bien videmment, on est ici toujours dans la syntaxe C++: on verra d'autres syntaxes avec d'autres langages plus tard).
() : les parenthses sont vides mais pourraient contenir des informations qui viennent
de l'extrieur du programme. Dans ce cours d'initiation, elles resteront toujours vides.
int: chaque "module", donc cela concerne aussi le "main", peut retourner une information, c'est--dire donner un rsultat final sous forme d'une valeur. Il faut donc prciser le type de cette valeur ("int" reprsente le type "entier" donc un nombre entier).
Traditionnellement le "main" est cens retourner un entier. On intgrera donc un retour
d'une valeur entire en fin de programme, sans pour autant s'en proccuper vraiment
car, dans ce cours d'initiation, on n'exploitera pas cette valeur retourne.
{: enfin l'accolade dmarre le bloc qui concerne le "main". Donc, tout ce qui va tre mis
entre cette accolade ouvrante et l'accolade fermante qui est la fin du programme fera
partie du "main".
Squence 1
Programmation
procdurale

Page 10

// dclarations
int valeur, essai, nbre = 1;
Un programme a gnralement besoin de mmoriser des informations afin de les exploiter. C'est la mmoire centrale qui est sollicite. Pour cela, il est possible de donner un
nom chaque case de la mmoire centrale et affecter une valeur chaque case nomme.
Ici, 3 cases sont rserves. Elles porteront les noms de "valeur", "essai" et "nombre". Les
noms donns aux variables sont libres mais doivent tout de mme respecter les rgles
suivantes:
ne pas commencer par un chiffre;
ne pas contenir d'espace;
contenir uniquement des caractres alphabtiques, ventuellement des chiffres et
le caractre "_";
viter les caractres accentus (plusieurs langages n'apprcient pas).
Gnralement, les noms des variables sont choisis pour tre le plus parlantes possible,
donc bien reprsenter le contenu.
Dans ce programme, voici le rle que va jouer chaque variable:
valeur: elle contiendra la valeur d'origine qu'il faut trouver;
essai: elle contiendra les diffrents essais pour trouver la valeur d'origine;
nbre: elle contiendra le nombre d'essais pour trouver la valeur d'origine.
Remarquez le "int" en dbut de ligne: cela signifie que les 3 variables sont de type "int"
donc elles contiendront des valeurs numriques entires.
Remarquez aussi le "= 1" la fin: cela signifie que la variable "nbre" est initialise 1,
donc la valeur 1 est affecte dans la case mmoire qui porte le nom "nbre".

8 2944 TG PA 00

Le ";" en fin de ligne marque la fin d'un ordre envoy l'ordinateur. On appelle ces
ordres, des "instructions".
Pour le moment, l'excution du programme n'affiche rien mais la mmoire centrale a
dj t sollicite:
cran

mmoire centrale
valeur
essai
nbre

// saisie du nombre chercher


printf("Entrez le nombre \x85 chercher =");
scanf("%d",&valeur);
printf : est une fonction dj crite, accessible grce l'include stdio mis en dbut
de programme, et permettant d'afficher une information l'cran. Le texte mis entre
guillemets s'affiche. Le "\x85" est juste un cas particulier: les accents n'tant pas directement compris par le compilateur, il existe des codes spcifiques pour chaque caractre
accentu. Ici , le code reprsente le caractre "". Pour le moment, ne vous proccupez
pas trop de ces problmes d'encodage.
scanf: est aussi une fonction dj crite et provenant de stdio. Cette fonction attend
que l'utilisateur saisisse une information au clavier puis, une fois l'information saisie et
la touche "entre" utilise, l'information est transfre en mmoire centrale dans la
case dont le nom est prcis (ici, c'est dans "valeur"). Quelques remarques syntaxiques
propres ce langage: il faut mettre & devant le nom de la variable (pour accder son
adresse) et "%d" indique le type de l'information saisie (d comme dcimal, donc numrique).

Squence 1
Programmation
procdurale

Page 11

Imaginons que, lors de l'excution du programme, la personne saisisse 37 puis utilise la


touche "entre". Voil o en sont l'affichage cran et le contenu de la mmoire centrale:
cran
Entrez le nombre chercher = 37

mmoire centrale
valeur

37

essai
nbre

system("cls");
Cette instruction permet juste d'effacer l'cran. La fonction est accessible suite l'include
de stdlib.
L'cran tant effac, le second joueur peut commencer tenter de deviner le nombre
chercher.

8 2944 TG PA 00

// boucle sur la saisie des essais


printf("Entrez un essai =");
scanf("%d",&essai);
Le commentaire parle de "boucle" mais en ralit la boucle n'a pas encore commenc.
Vous comprendrez dans quelques instants ce qu'est une boucle.
Ici, il y a un nouvel affichage pour le second joueur qui vient de s'installer sur l'ordinateur. Cet affichage invite le second joueur saisir un essai. Juste aprs l'affichage, vous
retrouvez "scanf" qui permet d'attendre que l'utilisateur ait saisi une information. Le
programme reste en attente tant que la saisie n'est pas faite.
Une fois la saisie effectue et valide, l'information est transfre en mmoire centrale
dans la case nomme "essai". Imaginons ici que le second joueur a saisi 50.
cran
Entrez un essai = 50

mmoire centrale
valeur

37

essai

50

nbre

while (essai != valeur) {


Squence 1
Programmation
procdurale

Page 12

La traduction en franais de cette instruction est: "tant que essai est diffrent de valeur."
Le signe "!=" reprsente le "diffrent". Vous remarquez aussi qu'une accolade s'ouvre.
Cela signifie que plusieurs lignes de code, jusqu' la fermeture de l'accolade, vont tre
concernes par cet ordre. Voil les lignes concernes:
while (essai != valeur) {
if (essai > valeur) {
printf("trop grand !");
}else{
printf("trop petit !");
}
printf("\nEntrez un nouvel essai =");
scanf("%d",&essai);
nbre++;
}
Comment va ragir l'ordinateur? Il va comparer le contenu de "essai" avec le contenu
de "valeur". Si les 2 informations sont diffrentes, alors il va excuter les ordres qui sont
dans le "while" donc entre les 2 accolades, puis il va remonter au niveau du "while" pour
nouveau comparer "essai" avec "valeur". Cet ordre "while" est appel une "boucle"
ou "itration" car l'ordinateur va boucler sur plusieurs instructions tant que la condition
de dpart est vrifie.
Ici, pour le moment "essai" contient 50 et "valeur" contient 37. Les 2 informations sont
bien diffrentes donc on "entre" dans la boucle pour y excuter les instructions.

8 2944 TG PA 00

Le contenu de la boucle commence par un test:


if (essai > valeur) {
printf("trop grand !");
}else{
printf("trop petit !");
}
Ce test se traduit par : "si essai est suprieur valeur". C'est ce que l'on appelle une
"condition" ou une "alternative". Encore une fois, une accolade suit l'instruction et
annonce un bloc d'instructions qui s'excuteront uniquement si le test est vrai: cette partie est appele la partie "alors". Ici, le bloc d'instruction se limite une seule instruction:
printf("trop grand !");
Cet affichage ne sera excut que si le test est vrifi (essai > valeur). Dans le cas
contraire, c'est le bloc d'instructions qui suit le "else" qui est excut : partie appele
"sinon". Ici, ce sera l'instruction:
printf("trop petit !");
Actuellement, valeur contient 37 et essai contient 50. Donc le test est vrifi (essai est
plus grand que valeur). On obtient l'affichage suivant:
cran
Entrez un essai = 50
trop grand !

mmoire centrale
valeur

37

essai

50

nbre

Squence 1
Programmation
procdurale

Page 13

Les lignes de code suivantes sont ensuite excutes:


printf("\nEntrez un nouvel essai =");
scanf("%d",&essai);
Vous connaissez dj ces instructions : un message va s'afficher puis l'ordinateur va
attendre une saisie de la part de l'utilisateur. Ne vous proccupez pas du "\n": c'est un
caractre spcial qui permet juste d'obtenir un retour la ligne dans l'affichage.
Imaginons que cette fois l'utilisateur saisisse 25. Aprs ces lignes de code et cette saisie,
voici l'tat de l'cran et de la mmoire:
cran
Entrez un essai = 50
trop grand !
Entrez un nouvel essai = 25

mmoire centrale
valeur

37

essai

25

nbre

Remarquez bien que la nouvelle valeur saisie (25) a cras l'ancienne valeur (50) qui se
trouvait dans la case "essai".

8 2944 TG PA 00

Vous vous demandez peut-tre: pourquoi cette nouvelle saisie alors que juste avant le
while, on avait dj fait une saisie d'un essai? Parce qu'il faut raliser bien sr plusieurs
saisies et celle avant le while ne s'excutera qu'une fois puisqu'elle n'est pas dans la
boucle. Alors que la saisie dans la boucle va s'excuter plusieurs fois. Du coup vous vous
posez juste titre peut-tre une autre question : pourquoi alors avoir mis une saisie
avant la boucle puisqu'il y en a une dans la boucle qui va se rpter plusieurs fois? Parce
que ds le dbut de la boucle, on teste si la saisie de l'essai correspond la valeur cherche. Donc avant mme de rentrer dans la boucle, il faut bien avoir quelque chose dans
"essai" pour faire le test. D'o cette toute premire saisie avant la boucle. Cette notion
est classique et trs importante comprendre.
Continuons l'excution. Voici la dernire instruction qui se trouve dans la boucle:
nbre++;
C'est un raccourci d'criture qui correspond cette ligne de code:
nbre = nbre + 1;
Les 2 lignes sont quivalentes. Cette instruction permet d'ajouter 1 la valeur contenue
dans la case "nbre". Comme la variable "nbre" contenait 1, elle passe 2 (1+1). On dit
que la variable est "incrmente". Voici l'tat de la mmoire aprs cette instruction.
cran

Squence 1

Entrez un essai = 50
trop grand !
Entrez un nouvel essai = 25

mmoire centrale
valeur

37

essai

25

nbre

Programmation
procdurale

Page 14

Que se passe-t-il maintenant ? Que va faire l'ordinateur ? N'oubliez pas la boucle


"while". On en arrive l'accolade qui ferme cette boucle. Puisque la boucle se ferme,
l'ordinateur va remonter au dbut de la boucle (c'est tout l'intrt d'une boucle: pouvoir rpter plusieurs fois les mmes instructions).
Le test est donc nouveau valu:
while (essai != valeur) {
Actuellement, "valeur" contient toujours 37 et "essai" contient la nouvelle valeur saisie,
donc 25. Donc "essai" est diffrent de "valeur": le test tant juste, on entre nouveau
dans la boucle.
if (essai > valeur) {
printf("trop grand !");
}else{
printf("trop petit !");
}

8 2944 TG PA 00

travers la condition, les variables "essai" et "valeur" sont nouveau compares. Mais
cette fois le test est faux car "essai" est plus petit que "valeur". Donc ce n'est pas la premire instruction qui est excute, mais celle qui se trouve aprs le "else". On obtient
donc l'affichage suivant:
cran
Entrez un essai = 50
trop grand !
Entrez un nouvel essai = 25
trop petit !

mmoire centrale
valeur

37

essai

25

nbre

Les instructions suivantes dans la boucle sont alors excutes:


printf("\nEntrez un nouvel essai =");
scanf("%d",&essai);
Le message va nouveau s'afficher et l'ordinateur va attendre une saisie. Imaginons
cette fois que l'utilisateur saisisse 37.
cran
Entrez un essai = 50
trop grand !
Entrez un nouvel essai = 25
trop petit !
Entrez un nouvel essai = 37

mmoire centrale
valeur

37

essai

37

nbre

Squence 1

2
Programmation
procdurale

Page 15

Le nouvel essai saisi va tre transfr en mmoire dans la variable "essai".


L'incrmentation est alors excute:
nbre++;
Ainsi, la case mmoire "nbre" est nouveau incrmente de 1:
cran
Entrez un essai = 50
trop grand !
Entrez un nouvel essai = 25
trop petit !
Entrez un nouvel essai = 37

mmoire centrale
valeur

37

essai

37

nbre

nouveau, on arrive l'accolade de fin de boucle, donc l'ordinateur remonte en dbut


de boucle et ralise nouveau le test:
while (essai != valeur) {

8 2944 TG PA 00

Cette fois, le test est faux car "essai" contient 37, comme "valeur". Les 2 variables ne
sont plus diffrentes. Que se passe-t-il dans ce cas? L'ordinateur arrte de boucler et se
positionne directement sur la premire instruction qui se trouve aprs la boucle, donc
aprs l'accolade qui ferme la boucle:
// rsultat
printf("Vous avez trouv\x82 en %d essais", nbre);

Vous connaissez cette instruction : elle permet d'afficher un message. Mais cette fois
le message est constitu d'une partie fixe, et d'une variable: le contenu de la variable
"nbre" va s'afficher dans le message, l'endroit o se trouve "%d". Ne vous proccupez
pas de "\x82": vous l'avez peut-tre compris, c'est un caractre spcial qui permet juste
d'afficher un "".
Comme la variable "nbre" contient actuellement la valeur 3, on va donc obtenir l'affichage suivant:
cran
Entrez un essai = 50
trop grand !
Entrez un nouvel essai = 25
trop petit !
Entrez un nouvel essai = 37
Vous avez trouv en 3 essais
Squence 1

37

essai

37

nbre

L'ordinateur continue l'excution des instructions suivantes:


getch();

Programmation
procdurale

Page 16

mmoire centrale
valeur

Cette fonction est accessible grce l'include conio. Elle permet d'attendre la frappe
d'une touche au clavier. Pourquoi avoir mis ici cette fonction? Parce qu'en son absence,
nous n'aurions mme pas le temps de voir l'affichage du message final que la fentre
d'excution du programme se fermerait. Donc c'est juste pour avoir le temps de lire, puis
ds l'utilisation d'une touche, la fentre se fermera.
return 0;
Cette instruction est obligatoire en fin de programme : rappelez-vous que votre programme principal commence par "int main" et en particulier "int" qui signifie que le
programme principal est en mesure de "retourner" la fin une information de type
numrique entire. Comme cela a t prcis plus haut, dans cette initiation nous n'utiliserons jamais cette possibilit. Cependant, le retour d'une valeur reste obligatoire: il
faudra donc toujours penser mettre en fin de programme principal un "return" suivi
d'une valeur entire. Pourquoi 0? En ralit cela n'a aucune importance: vous pouvez
retourner ce que vous voulez puisque ce retour ne sera pas exploit. Le 0 est plutt une
convention, rien de plus.
}
Il reste cette dernire accolade: elle est l pour fermer l'accolade qui ouvre le "main".
Le programme est donc termin est la fentre d'excution se ferme.

8 2944 TG PA 00

Bilan
Globalement, qu'avez-vous remarqu?
les instructions d'un programme s'excutent les unes la suite des autres;
premire exception: dans le cas d'une itration (while), lorsque la fin de boucle est
atteinte, l'ordinateur remonte en dbut de boucle;
deuxime exception : dans le cas d'une alternative (if), certaines instructions sont
excutes sous condition;
seule la saisie met le programme en suspend et attend que l'utilisateur ait saisi une
information;
tous les blocs d'instructions sont dlimits (ici, entre accolades): bloc du programme
principal, bloc d'une itration, blocs dans une alternative...;
les blocs peuvent s'imbriquer (ici, l'alternative est dans l'itration qui est dans le
programme principal).
Toutes ces remarques sont finalement valables quel que soit le langage, quelques
nuances syntaxiques prs.

1C. Passage sur machine


Avant d'approfondir au niveau thorique ces notions, il est temps de voir concrtement
comment faire marcher ce petit programme sur votre ordinateur.

Comment faire pour excuter notre programme?


Le code source d'un programme peut tre crit dans n'importe quel diteur (par exemple
notepad). Il existe cependant des diteurs plus volus, qui apportent une colorisation
au code (pour distinguer les mots rservs, les variables, etc.). Encore plus volus que
ces diteurs, il existe des environnements de dveloppement qui offrent de nombreux
services (aide la recherche d'erreurs, tests, aide l'criture du code...). On les appelle
des IDE (Integrated Development Environment). Pour chaque langage, il existe des IDE
gratuits, d'autres payants. Certains IDE sont multi-langages.

Squence 1
Programmation
procdurale

Page 17

Pour le C++, il existe de nombreux IDE, les plus connus sont Visual C++ de Microsoft,
Borland C++ et parmi les gratuits, entre autres devC++, Code::Blocks et Eclipse. Nous
allons travailler avec ce dernier, trs connu pour tre un IDE pour le langage Java mais
aussi trs performant pour le C++.
Le pack Eclipse que vous allez utiliser comporte le compilateur MinGW. Parfois le compilateur doit s'installer sparment du reste: c'est en particulier vrai si vous utilisez un
simple diteur de texte pour taper votre code. La plupart des IDE intgrent l'installation
du compilateur associ.

Installation d'un IDE: Eclipse


Les explications de l'installation de l'IDE sont donnes dans les "conseils gnraux" au
dbut de ce fascicule. Suivez donc ces informations afin d'avoir sur votre ordinateur l'IDE
ncessaire pour raliser la suite du travail.

Test de l'IDE
Faisons un rapide premier test pour contrler que tout marche bien. Avant tout, crez
l'endroit de votre choix sur votre disque, un dossier qui contiendra vos projets.
Une fois Eclipse lanc, crez un nouveau projet (file/new/c++ project). Donnez un nom
au projet (par exemple essai). La case "use default location" est coche: dcochez-la et

8 2944 TG PA 00

slectionnez le dossier de projets que vous avez cr, en rajoutant la fin "\essai" pour
que dans ce dossier de projets, le dossier essai soit cr pour mmoriser le nouveau projet. Ainsi, chacun de vos projets sera mis dans un dossier spcifique. N'oubliez pas par la
suite, chaque cration d'un nouveau projet, de prciser ainsi le nom du nouveau dossier. Puis, slectionnez "empty project" dans la partie "Executable" qu'il suffit d'ouvrir
en cliquant sur le +. Enfin cliquez sur finish.
gauche, dans "project explorer", slectionnez votre projet. Vous allez crer un fichier
source pour insrer du code : file/new/source file. Dans la fentre, comme nom de fichier,
tapez "essai.cpp" (sans oublier lextension cpp) puis cliquez sur finish.
Dans la partie centrale, une page sest ouverte, vide. Tapez le code suivant :
#include <stdio.h>
int main () {
printf("coucou");
return 0;
}

O Surtout n'oubliez pas la ligne vide aprs la dernire accolade


Sauvez (avec ctrl-S). Remarquez que la petite toile qui tait ct du nom du fichier,
dans longlet, a disparu (cela prouve que le fichier est sauv).
Squence 1
Programmation
procdurale

Page 18

Pour compiler le projet, dans project explorer ( gauche) slectionnez le projet, puis
faites "project/build all".
Contrlez que le fichier excutable a t cr en allant directement dans le dossier de
votre projet, sur le disque, et dans le sous-dossier debug. Vous devriez trouver le fichier
"essai.exe". Lancez ce fichier. Une fentre s'ouvre et se referme aussi vite: c'est normal,
juste aprs avoir affich "coucou", la fentre se ferme car le programme est termin.
Revenez dans Eclipse et cette fois, toujours aprs avoir slectionn le projet dans la
colonne de gauche, cliquez sur la flche blanche dans le rond vert (en haut). Remarquez
en bas, dans l'onglet "console", le mot "coucou" s'est affich. Ce moyen d'excution,
qui peut vous paratre bien pratique, ne sera pas utiliser par la suite car il ne permet
pas de saisir.
Ce premier test vous a permis une toute premire dcouverte de l'environnement et un
contrle du bon fonctionnement du pack.

Prsentation de l'IDE
Eclipse est un IDE complet qui offre de nombreux outils. Seuls certains seront exploits
dans ce cours. Nous allons dans un premier temps prsenter l'environnement global.
Dans un test prcdent, vous avez dj eu l'occasion de dcouvrir l'environnement.
Repositionnez-vous sur ce test, ou, si vous l'avez perdu, recrez-le (en vous rfrant aux
explications prcdentes).

8 2944 TG PA 00

Vous obtenez un environnement qui ressemble ceci:


menus

Les chiers
du projet

Excution dans l'IDE

Zone de travail: code


source (coloris)

Les composants
du chier

Onglet pour lister


les erreurs
Onglet pour afcher la
console de visualisation

Squence 1
Programmation
procdurale

Par la suite, nous verrons comment utiliser les aides d'Eclipse pour rechercher les erreurs
dans un programme.
Vous remarquerez rapidement que la zone centrale, rserve l'criture du code, offre
de nombreuses facilits de saisies (indentations automatiques, fermeture des parenthses et guillemets, soulignement des erreurs, colorisation).
Pour tous les programmes qui vont tre raliss dans ce cours, prenez l'habitude de
coder sous Eclipse puis de lancer directement le fichier exe, donc l'extrieur d'Eclipse.
Vous l'avez dj fait lors d'un premier test. Le fichier exe se trouve dans le dossier debug
qui est dans le dossier du projet.
Vous pourriez lancer le test par la flche, mais certaines commandes ne s'excutent pas
dans la console: seuls les affichages simples apparaissent. La console sert normalement
de zone de test. Dans une application graphique, on utilise la commande printf juste
pour afficher des informations de tests dans la console.

Page 19

Saisie du programme
Crez un nouveau projet et, dans ce projet, un fichier source du nom de test1.cpp. Si le
fichier qui s'ouvre contient des commentaires, supprimez-les. Dans ce fichier, tapez le code
du programme vu prcdemment (le jeu du nombre cach), ligne par ligne, en prenant
le temps d'observer les ractions de l'IDE et les aides apportes. Il est trs important que
vous observiez ce qui se passe, le but de cet exercice tant de dcouvrir dans un premier
temps l'IDE. Attention, respectez bien la syntaxe et en particulier la casse (majuscules/
minuscules): le C++ n'interprte pas de la mme faon "Else" et "else", par exemple.

8 2944 TG PA 00

Excution du programme
Une fois le programme crit, slectionnez le projet ( gauche) et compilez (Poject/Build
all). l'extrieur d'Eclipse, excutez le programme (en allant chercher le fichier exe dans
le dossier debug du projet).
Si vous ne trouvez pas le fichier exe dans le dossier debug, c'est que la compilation a
trouv des erreurs. Contrlez votre programme et corrigez les erreurs avant de compiler
nouveau. Les erreurs sont normalement affiches en bas de l'cran. On reviendra en
dtail sur cet aspect.
Au final, vous devriez obtenir une excution qui ressemble ceci:

Squence 1
Programmation
procdurale

Page 20

Voil, votre premier programme s'est excut. En fin d'excution, aprs le message final,
tant que vous n'appuyez pas sur une touche, la fentre d'excution ne se ferme pas.
Vous avez eu une analyse dtaille des tapes d'excution du code dans les pages prcdentes de ce cours: vous comprenez mieux donc ce qui s'est pass lors de l'excution de
ce programme. Avant de passer la suite, revenons sur quelques points fondamentaux
dans la programmation qui sont essentiels la comprhension du code.

Rgles retenir
Les commentaires
Plusieurs commentaires ont t placs dans le code. Il existe 2 types de commentaires.
Les commentaires sur plusieurs lignes, entours de /* et */: c'est la notation officielle,
d'ailleurs vous avez remarqu les lignes de commentaires qui se sont construites automatiquement quand vous avez tap /*.
Les commentaires sur une ligne ou une partie de ligne: ds que le signe // est rencontr
par le compilateur, le reste de la ligne est considr comme un commentaire. Ce systme
est pratique pour mettre juste un petit message de commentaire. De plus, il est plus
rapide crire que le prcdent car il ne ncessite pas une balise de fin de commentaire.
Lorsque l'on code, il faut respecter une "charte de code". Celle-ci est souvent impose
dans les entreprises, mais peut varier en contenu d'une entreprise l'autre. Dans tout
ce cours, quelques lments de charte de code vont tre utiliss pour vous apprendre
tre rigoureux ce niveau l.
Par exemple, si vous observez bien les commentaires du code, vous remarquerez qu'en
ralit 4 types de commentaires ont t utiliss:
Le cartouche : bloc de commentaire en dbut de programme qui prsente les
caractristiques du programme.

8 2944 TG PA 00

/* Jeu du nombre cach


* auteur: Emds
* date: 27/04/2011
*/
Les commentaires de blocs et de modules : pour le moment il y a le bloc
des includes et le module principal (main). Plus tard, on retrouvera ce type
de commentaires en tte de chaque module (notion tudie plus loin). Ici les
3 traits qui l'entourent servent juste le mettre un peu plus en vidence.
//--- Programme principal -- Les commentaires de blocs de code dans un module: ils prcisent le rle des
lignes de code qui le suivent.
// saisie du nombre chercher
Les commentaires informatifs de ligne : ils apportent une prcision sur une
seule ligne de code (souvent utiliss pour les dclarations).
#include <stdio.h>

// pour le printf et scanf

Vous n'tes pas oblig de suivre cette charte, cependant il est indispensable que vous en
suiviez une. Gardez toujours la mme faon de prsenter votre code. La charte de code
porte sur les commentaires, mais aussi sur les indentations et les noms de variables.
En ce qui concerne les commentaires, certains IDE proposent une charte qui permet
ensuite de gnrer automatiquement une documentation lie au programme. C'est le
cas par exemple de la javadoc pour le langage java. Vous aurez l'occasion de dcouvrir
cet aspect dans un autre cours, si vous choisissez l'option SLAM.

Ne tombez pas dans l'erreur classique qui consiste dire "je code d'abord et je commente ensuite". Un dveloppeur crit toujours les commentaires AVANT d'crire le
code correspondant pour 2 raisons: d'abord le commentaire aide rflchir sur le
code que l'on doit crire, ensuite le programme est trs facile comprendre quand
il est comment et l'on peut s'y rfrer sans problme. Vous ne serez jamais un vrai
dveloppeur si vous ne suivez pas cette rgle.

Squence 1
Programmation
procdurale

Page 21

Les indentations
Le programme est aussi facile comprendre grce aux indentations. Les indentations
reprsentent les dcalages de certaines lignes par rapport la marge de gauche.
Vous avez remarqu que le code s'est spontanment indent (gestion automatique des
dcalages) au fur et mesure de la saisie. C'est l'IDE qui gre les indentations automatiquement, ce qui est bien pratique. Si vous tapez votre code dans un diteur simple, il
faut alors les grer soi-mme.
Ces indentations sont indispensables pour bien comprendre le sens du code: elles permettent de reprer rapidement les imbrications entre les diffrentes structures. Par
exemple, ici on repre la boucle gnrale sur la saisie des diffrents essais, et dans la
boucle, la condition pour contrler si l'essai est trop grand ou trop petit.
Il existe plusieurs mthodes d'indentations. Celle prsente ici est la plus officiellement
reconnue.
Voici les rgles d'indentations utilises:
accolade ouvrante en fin de ligne;
accolade fermante aligne verticalement sur le dbut du bloc correspondant;
dcalages d'une tabulation;
"else" mis sur la mme ligne entre l'accolade fermante de la partie "alors" et l'accolade ouvrante de la partie "sinon".

8 2944 TG PA 00

Vous dcouvrirez par la suite d'autres aspects de ces rgles d'indentation et prsentation
du code.

Les noms des variables


Les noms des variables utiliss dans le programme reprsentent aussi une aide la comprhension gnrale.
Les noms de variables doivent toujours tre trs explicites pour mieux les reprer dans
le code. Eclipse apporte une aide supplmentaire ce niveau l : double cliquez sur
une des variables (par exemple, essai) pour la slectionner et observez que la variable
a t repre dans tout le code. Remarquez aussi que sur la droite du code, ct de
l'ascenseur, des petites marques sont apparues: si vous cliquez sur l'une d'elles, vous tes
directement positionn sur une ligne contenant la variable. Ces petits repres, nous les
retrouverons plus tard lors de la recherche d'erreurs.
Pour revenir au choix des noms de variables, pour le moment nous nous contentons de
donner des noms parlants. Par la suite, vous apprendrez qu'il existe des rgles de nommage: par exemple, les constantes en majuscules, les noms des objets graphiques avec
les 3 premires lettres prcisant le type d'objet, etc.

2.
Squence 1
Programmation
procdurale

Page 22

Logique algorithmique

Ce premier programme vous a donn une ide de la logique de programmation. Vous


avez compris que l'ordinateur excute pas pas les instructions du programme, qu'il
revient en arrire lorsqu'il est dans une boucle, qu'il peut sauter des lignes dans une
condition et qu'il est capable d'attendre une saisie de l'utilisateur.
Vous avez sans doute compris la logique globale du programme: pourquoi une boucle,
pourquoi un test, etc. Mais vous vous tes aussi peut-tre dit: "oh mais c'est bien compliqu tous ces petits dtails, comme savoir qu'il faut mettre un ";" en fin d'instruction,
des accolades pour entourer un bloc de code, ...". Effectivement, le C++ impose des
rgles d'critures qui sont trs prcises. C'est le cas d'ailleurs de chaque langage avec des
nuances parfois importantes d'un langage un autre.
Le point commun entre les langages reste la logique du programme: savoir quand il faut
afficher, saisir, boucler, tester...
Rsoudre un problme informatique suppose donc avant tout de rflchir sur la logique
du programme avant de se proccuper de la syntaxe spcifique au langage.
Voil comment est ne la notion d'algorithme informatique. Le but d'un algorithme est
de rflchir sur la logique d'un programme en oubliant les rgles de syntaxe d'un langage. Une fois un algorithme crit, il ne reste plus qu' la traduire dans le langage de
programmation souhait. Cette traduction ne demande aucune rflexion particulire.

2A. Qu'est-ce qu'un algorithme?


Un algorithme est donc un ensemble de traitements informatisables crits dans une syntaxe simple et ensuite traduisible dans un langage informatique volu.
L'intrt d'crire d'abord un algorithme pour rsoudre un problme est de clarifier et
structurer le problme d'informatisation en vue d'un futur codage. Utilisant une syntaxe
simple, il se dtache de toute rgle spcifique chaque langage.
La syntaxe algorithmique existe cependant: elle est nettement moins contraignante que
celle lie aux langages mais respecte certaines normes.
Si vous parcourez des livres sur le sujet, ou des sites sur Internet, vous verrez qu'il existe
des nuances dans la prsentation des algorithmes. Ce n'est pas trs grave: l'important

8 2944 TG PA 00

rside dans le sens. Ce cours va vous prsenter une norme: si vous tes habitu une
autre norme, vous pouvez la garder. Vous devez juste tre rigoureux et prsenter les
mmes notions toujours de la mme faon.
l'examen, vous pourrez crire directement du code. Quand vous aurez une certaine
habitude de la programmation, vous crirez sans doute directement des programmes
sans passer par l'criture d'un algo. Mais tant que vous tes dbutant, cette tape va
vous permettre de vous concentrer sur la rflexion sans vous proccuper de problmes
de syntaxes.
travers ce cours, vous allez aussi dcouvrir les possibilits offertes par la plupart des
langages.

2B. Version algorithmique du premier programme


Ce cours a directement prsent un premier programme crit en C++: le but tait d'tre
concret et de vous montrer rapidement ce qu'est un programme. Nous avons donc commenc par la fin: le programme tait dj crit et nous avons essay de le comprendre,
puis de l'excuter dans un IDE. La dmarche aurait du tre la suivante: pauser le problme, crire l'algorithme correspondant, le traduire en C++ puis le tester.
Voici la version algorithmique du programme:
programme nombreCach
// dclarations
valeur, essai, nbre: entier
debut

Squence 1

// initialisation
nbre 1

Programmation
procdurale

// saisie du nombre chercher


afficher "Entrez le nombre chercher ="
saisir valeur

Page 23

// effacer l'cran cet endroit


// boucle sur la saisie des essais
afficher "Entrez un essai ="
saisir essai
tantque essai <> valeur
si essai > valeur alors
afficher "trop grand !"
sinon
afficher "trop petit !"
finsi
afficher "Entrez un nouvel essai ="
saisir essai
nbre nbre + 1
fintantque
// rsultat
afficher "Vous avez trouv en " + nbre + " essais"
fin

8 2944 TG PA 00

Observez cet algorithme. Vous retrouvez la logique du programme mais cette fois crit
en franais et dans une syntaxe plus simple (plus d'accolades, de ";"...). Pour les commentaires, la norme C++, qui reste celle utilise dans de nombreux langages, est souvent
utilise.
Remarquez que le bloc principal du code est mis entre les mots "debut" et "fin". Avant
le mot "debut", vous retrouvez la dclaration des variables ncessaires au programme.
Certains mettent les dclarations directement dans le programme, comme c'est le cas
en C++. Pourquoi pas: cela se justifie mme parfois dans certains cas que nous aurons
l'occasion d'tudier plus tard.
Ce petit programme vous a permis d'avoir un panel assez large des possibilits globales:
affichage d'informations l'cran;
saisie de donnes au clavier;
boucle sur un groupe de traitements;
traitements excuts sous condition;
affectation d'une valeur dans une variable;
calculs dans une variable.
Nous allons revoir tout cela de faon plus formelle.

2C. Traitements possibles


Voici les traitements de base utilisables dans un algorithme et qui correspondent aux
instructions de base qui peuvent tre excutes par un ordinateur.
Squence 1
Programmation
procdurale

Page 24

Structure gnrale
Un programme se prsente sous la forme suivante:
programme nomDuProgramme
// dclarations
nomVariable: typeVariable
...
debut
// instructions
...
fin
Le nom du programme est libre. La partie dclaration permet de connatre la liste des
cases mmoire ncessaires pour l'excution du programme, ainsi que le type de chaque
case. Voici les types les plus courants:
numrique : ce type gnrique regroupe tous les types numriques. On peut
cependant tre plus prcis (entier, rel);
chane ou texte: ce type gnrique regroupe tous les types base de caractres
quelconques. Lorsque la variable ne contient qu'un seul caractre, cela peut tre
prcis par le type 'caractre";
boolen: une variable de ce type ne peut prendre que 2 valeurs (vrai ou faux);
date: ce type permet de contenir une date et de la traiter comme tel (possibilit
de calculs spcifiques aux dates).

Saisie
Syntaxe
saisir nomVariable

8 2944 TG PA 00

But
Saisie au clavier d'une valeur et mmorisation de cette valeur.

Fonctionnement
Arrt momentan de l'excution du programme en attendant la saisie.
Une fois la saisie faite et valide, transfert de l'information saisie dans la variable en
mmoire dont le nom est prcis la suite de l'ordre "saisir".
Reprise de la suite de l'excution du programme.

Cas d'erreurs
Si l'information saisie n'est pas du mme type que la variable qui attend l'information. Par exemple, si du texte est saisi alors que la variable est de type numrique.
Si la variable n'existe pas.
Si ce qui suit le mot "saisir" n'est pas une variable.

Afchage
Syntaxe
// affichage d'un message en toutes lettres
afficher "bonjour tous"
// affichage du contenu d'une variable
afficher uneVariable
// affichage d'une valeur numrique
afficher 3
// affichage d'un calcul
afficher (uneVariable * 3)
// affichage d'une combinaison texte/variable
afficher "Bonjour " + unPrenom + " !"

Squence 1
Programmation
procdurale

But
Affichage d'une information l'cran.

Page 25

Fonctionnement
Construction de l'information puis transfert vers l'cran.
Les calculs sont mis entre parenthses, en particulier lorsqu'ils sont intgrs dans une
concatnation de chane.

Cas d'erreurs
Si la ou les variables n'existe(nt) pas.
Si la partie texte n'est pas mise entre guillemets.
S'il n'y a pas de "+" entre la partie texte et les variables.

Variante
La virgule est admise la place du signe "+".
afficher "Bonjour ", unPrenom, " !"
Cependant je vous dconseille ce formalisme. Vous verrez par la suite que dans la quasi
totalit des langages, il faut "additionner" les diffrentes parties pour en faire une
seule. On appelle cela de la "concatnation" de chanes.

8 2944 TG PA 00

Exercice 1
Deux variables sont dclares et initialises en mmoire centrale:
prenom: chaine // cette variable contient la chane "Nicolas"
age: entier // cette variable contient la valeur 16
Prcisez ce que vous obtiendrez l'affichage aprs chaque instruction:
a) afficher prenom
b) afficher nom
c) afficher age + " * 2 = " + (age*2)
d) afficher "age + " * 2 = " + (age*2)"
Prcisez chaque fois l'instruction crire pour obtenir les affichages suivants, en
utilisant les variables donnes:
e) Bonjour Nicolas
f) Tu as 16 ans
g) Tu seras majeur dans 2 ans
pour ce dernier cas, on prendra pour hypothse que age est < 18.

Affectation
Syntaxe
// affectation d'une valeur dans une variable
uneVariable "bonjour"
uneAutreVariable 3
// affectation du contenu d'une variable dans une autre
uneVariable uneSecondeVariable

Squence 1
Programmation
procdurale

Page 26

But
Transfert d'une information dans une variable.

Fonctionnement
La valeur ou le contenu de la variable qui se trouve droite de l'affectation est transfr
en mmoire centrale dans la variable qui se trouve gauche de l'affectation.
Si la variable qui reoit la valeur contenait une autre valeur, celle-ci est efface pour
laisser la place la nouvelle valeur.

Cas d'erreurs

8 2944 TG PA 00

Si
Si
Si
Si

la variable qui se trouve gauche de l'affectation n'existe pas.


ce qui est gauche de l'affectation n'est pas une variable.
la variable qui se trouve droite de l'affectation n'existe pas.
l'information transfre n'est pas du mme type que la variable de gauche.

Exercice 2
Deux variables sont dclares en mmoire centrale et ne contiennent rien pour le
moment:
prenom: chane
age: entier
Dites pourquoi les instructions suivantes ne sont pas correctes:
a) prenom Nicolas
b) age 16 ans
c) age "18"
Prcisez chaque fois l'instruction crire pour obtenir les rsultats suivants:
d) la variable prenom doit contenir le prnom Alain
e) la variable age doit contenir l'age d'Alain c'est dire 18 ans

Calcul
Syntaxe
// calcul
uneVariable
// calcul
uneVariable

partir de valeurs fixes


(2 * 9) / 3
partir de variables
uneAutreVariable * 5

But
Transfert du rsultat d'un calcul dans une variable.

Fonctionnement

Squence 1

Le calcul qui se trouve droite de l'affectation est valu. Son rsultat est transfr dans
la variable qui se trouve gauche de l'affectation.
Si la variable qui reoit le rsultat du calcul contenait une autre valeur, celle-ci est efface
pour laisser la place la nouvelle valeur.

Programmation
procdurale

Page 27

Cas d'erreurs

Si la variable qui se trouve gauche de l'affectation n'existe pas.


Si ce qui est gauche de l'affectation n'est pas une variable.
Si la ou les variables qui se trouvent droite de l'affectation n'existent pas.
Si le calcul demand n'est mathmatiquement pas possible (division par 0...).
Si une valeur ou une variable qui se trouve droite est une chane (sauf dans le cas
de concatnation de chanes que l'on verra plus loin).
Si le rsultat du calcul n'est pas du mme type que la variable de gauche.

Oprateurs possibles
+

addition

somme somme + prix

soustraction

nbannee 18 - age

multiplication

prix prix * 0,2

division

moyenne somme / nbarticle

**

puissance

surface longueur ** 2

div

division entire

nbHeures nbMinutes div 60

mod

reste de division

minutesRestantes nbMinutes mod 60

()

parenthses

total (ht + tva) * (1 + remise/100)

8 2944 TG PA 00

Expression logique
Une expression logique (comme les tests vus dans les conditions ou les boucles) peut aussi
tre affecte une variable. Le rsultat d'une expression logique tant de type boolen
(vrai ou faux), la variable qui reoit le rsultat doit tre de type boolen.
Voici un exemple:
uneVariable (A < B) ou non (B >= C)
Si le rsultat de l'expression logique est vrai, alors uneVariable recevra Vrai. uneVariable
recevra Faux dans le cas contraire.

Exercice 3
crire l'algorithme qui permet de saisir un nom d'article puis de saisir son prix HT et
d'afficher le nom de l'article suivi du montant TTC aprs remise de 5% (la remise est
accorde sur le montant TTC, tva=19,6). L'affichage doit tre sous la forme:
Veste: 67,55

Alternative
Syntaxe
// traitements excuter si la condition est vraie
si condition alors
traitements(s)
finsi

Squence 1
Programmation
procdurale

// traitements excuter si la condition est vraie ou


// autres traitements excuter si la condition est fausse
si condition alors
traitements(s)
sinon
traitements(s)
finsi

Page 28

But
Excution de traitements sous condition.

Fonctionnement
La condition est value.
Si la condition est vraie, les traitements contenus dans la partie "alors" sont excuts. S'il
y a une partie "sinon", les traitements contenus dans cette partie sont ignors.
Si la condition est fausse, les traitements contenus dans la partie "alors" sont ignors.
Dans ce cas, s'il y a une partie "sinon", les traitements contenus dans cette partie sont
excuts.

Cas d'erreurs
Si la condition n'est pas une expresSion logique valide (ne retourne pas un boolen).
Si la partie "alors" ne contient pas de traitements.
s'il y a plusieurs parties "alors" ou plusieurs parties "sinon" pour une seule condition.

8 2944 TG PA 00

Qu'est-ce qu'une condition?


Une condition est une expression logique contenant une ou plusieurs variables et/ou
valeurs ainsi que des oprateurs arithmtiques et/ou logiques. Quel que soit le contenu
de la condition, son rsultat doit tre de type boolen.
Voici quelques exemples de conditions correctes:
//
si
//
si

total et somme sont des variables numriques


(total > somme * 2)
valeur est numrique et result est boolen
(valeur > 0) et (result = vrai)

Cas particulier du test d'un boolen


Si la variable teste est un boolen, il existe des raccourcis d'criture.
// valeur est numrique et result est boolen
si (valeur > 0) et (result = vrai)
// voici l'expression quivalente
si (valeur > 0) et (result)
La comparaison d'un boolen avec "vrai" quivaut tester directement le boolen luimme.
//
si
//
si

valeur est numrique et result est boolen


(valeur > 0) et (result = faux)
voici l'expression quivalente
(valeur > 0) et (non result)

La comparaison d'un boolen avec "faux" quivaut tester directement le contraire du


boolen lui-mme.
Vous devez savoir lire les 2 faons d'crire, cependant vous pouvez utiliser la mthode
que vous prfrez.

Squence 1
Programmation
procdurale

Page 29

Oprateurs logiques
Voici les oprateurs logiques que vous avez le droit d'utiliser:
et

les 2 conditions doivent tre vraies

ou

il suft que l'une des 2 conditions soit vraie

non

donne le contraire de la condition

()

ordonne les conditions (indispensable partir de 3 conditions)

galit entre 2 expressions

<>

diffrence

<

infrieur strictement

>

suprieur strictement

<=

infrieur ou gal

>=

suprieur ou gal

Exercice 4
crire l'algorithme qui permet de saisir un ge et d'afficher "majeur" si la personne
a au moins 18 ans, "mineur" si la personne n'a pas atteint cet ge.

8 2944 TG PA 00

Cas de: "si" multiple


Il arrive parfois que suivant les valeurs d'une variable, diffrents traitements doivent tre
excuts.
Par exemple, si la personne a le choix entre 3 options pour la livraison (express, normal,
lent) avec le prix qui varie suivant l'option, on pourrait l'crire ainsi:
// choix est une variable de type chane
// total est de type numrique et contient le montant payer
cas de choix
"express": afficher total * 0,3
"normal": afficher total * 0,1
"lent": afficher total
fincas
// autre solution, s'il n'y a vraiment que 3 cas possibles
cas de choix
"express": afficher total * 0,3
"normal": afficher total * 0,1
sinon
afficher total
fincas
Certains mettent "selon" la place de "cas de".
Bien sr, il aurait t possible de l'crire avec plusieurs "si":
Squence 1
Programmation
procdurale

Page 30

si choix = "express" alors


afficher total * 0,3
sinon
si choix = "normal" alors
afficher total * 0,1
sinon
afficher total
finsi
finsi
Voici la syntaxe du "cas de":
cas de variable
valeur1: traitement(s)
...
valeurN: traitement(s)
sinon
traitement(s)
fincas

Itration
L'itration reprsente la possibilit de rpter plusieurs fois une squence de traitements. Il existe 3 types d'itrations.

tantque
tantque conditionPourBoucler
traitement(s)
fintantque
Les traitements s'excutent tant que la condition est vraie. Lorsque l'ordinateur arrive
sur le "fintantque", il remonte au niveau du "tantque" et la condition est nouveau

8 2944 TG PA 00

value. Lorsque la condition devient fausse, l'ordinateur continue les traitements aprs
le "fintantque".
Attention, les traitements doivent entre autres modifier au moins une des variables testes dans la condition: il faut qu' un moment ou un autre, la condition devienne fausse
sinon la boucle est infinie.
Le "tantque" est la boucle la plus gnrale. Elle marche dans toutes les situations. Elle
boucle de 0 N fois: elle peut effectivement boucler 0 fois car la condition est au dbut
de la boucle et peut tre fausse ds le dbut.

Exercice 5
crire l'algorithme qui permet de saisir l'ge de plusieurs personnes en arrtant la
saisie lorsque l'ge saisi est gal 0. Au final, la somme des ges doit tre affiche.

repeter
repeter
traitement(s)
jusqu' conditionPourSortir
Les traitements s'excutent jusqu' ce que la condition soit vraie. Lorsque l'ordinateur
arrive sur le "jusqu'", il value la condition et, si elle est fausse, il remonte au niveau du
"repeter". Lorsque la condition devient vraie, l'ordinateur arrte de boucler et continue
les traitements aprs le "jusqu'".
traitements doivent entre autres modifier au moins une des variables testes
O Les
dans la condition: il faut qu' un moment ou un autre, la condition devienne vraie
sinon la boucle est infinie.
Le "repeter" est la boucle idale pour les tests de saisie. Elle boucle de 1 N fois: elle
boucle effectivement au moins une fois car le test se situe en fin de boucle.

Squence 1
Programmation
procdurale

Page 31

Exercice 6
crire la squence algorithme qui permet de saisir une note en empchant la saisie
d'une valeur non comprise entre 0 et 20 (une squence algorithmique ou extrait
d'algorithme ne reprsente pas un algorithme complet et donc n'a ni dbut ni fin:
on suppose qu'il se passe des choses avant et peut-tre aussi aprs).
crire ensuite l'algorithme qui permet de saisir plusieurs notes avec contrle de saisie
de la note (entre 0 et 20) et affichage de la moyenne en fin de saisie. Aprs chaque
saisie, on demandera l'utilisateur s'il veut continuer ou non saisir. Vous contrlerez aussi la rponse (qui doit tre forcment "O" ou "N" et pas un autre caractre).

pour
pour cpt de depart arrivee [pas de pas]
traitement(s)
finpour
La variable "cpt" (ou n'importe quel autre nom de variable) est initialise la valeur
"depart" (qui peut tre une valeur en dur ou un nom de variable). Les traitements s'excutent et, une fois le "finpour" atteint, l'ordinateur remonte au niveau du "pour".
chaque passage au niveau du "pour", la variable "cpt" est automatiquement incrmen-

8 2944 TG PA 00

te de "pas" si un pas a t prcis, ou de 1 (par dfaut). La sortie de la boucle s'effectue


quand "cpt' a dpass la valeur "arrivee".
Les traitements contenus dans la boucle ne doivent pas modifier les informations du
"pour" (le contenu de "cpt", de "depart", de "arrivee" et de "pas").

Le "pour" est la boucle idale lorsque le nombre d'itrations est connu. Elle peut ne boucler aucune fois si la valeur de "arrivee" est infrieure la valeur de "depart" dans le cas
d'un "pas" positif (ou d'une absence de "pas"), et si la valeur "arrivee" est suprieure
la valeur "depart" dans le cas d'un "pas" ngatif.

Exercice 7
crire l'algorithme qui permet de saisir le nombre d'lves d'une classe puis, pour
chaque lve, saisir son ge. Il faudra au final afficher l'ge moyen des lves de la
classe.

Manipulations de chanes

Squence 1
Programmation
procdurale

Page 32

Tous les langages offrent diffrentes possibilits de manipulations des chanes.


Normalement, en algorithmique, il n'existe pas d'quivalent ou de normes dans ce
domaine, except pour "coller" (on dit "concatner") deux chaines l'une la suite de
l'autre. Cependant, il est admis d'utiliser des fonctions puisque de toute faon il sera
toujours possible de trouver une quivalence quel que soit le langage de programmation choisi. Les noms qui sont donns ici ces fonctions ont t choisis arbitrairement
puisqu'il n'y a pas de norme algorithmique ce niveau, cependant le choix a t fait en
suivant la logique du rle de chaque fonction.

Concatnation
Syntaxe
uneVariable unePremiereVariable + uneSecondeVariable
// exemples
nom "Dupont"
prenom "Christophe"
nomComplet prenom + " " + nom
// nomComplet contient "Christophe Dupont"

But
Cration d'une nouvelle chane partir de la concatnation de plusieurs autres chanes.
Nous avons dj utilis cette possibilit lors d'affichages composs de plusieurs parties.

Cas d'erreurs
Normalement les lments de la concatnation doivent tous tes de type "chane". Les
concatnations entre chanes et numriques sont cependant souvent admises en algo.
Dans ce cas la valeur numrique est gre comme une chane. Suivant les langages, il
faudra au pralable convertir la valeur numrique pour la transformer en chane. Dans
les exercices suivants, quand la conversion est optionnelle, elle ne sera pas systmatiquement applique.

8 2944 TG PA 00

Longueur
Syntaxe
uneLongueur longueur(uneChaine)
// uneChaine peut tre une
variable, une chane ou une combinaison des 2
// exemples
taille1 longueur("Dupont") // taille1 contient 6
prenom "Christophe"
taille2 longueur(prenom) // taille2 contient 10
taille3 longueur(prenom+ " Dupont") // taille3 contient 17

But
Calcul du nombre de caractres contenu dans une chane.

Cas d'erreurs
Les cas d'erreurs sont les mmes que ceux de la concatnation. Attention, une longueur
ne peut tre faite sur un numrique ou une variable numrique. La variable numrique
ne sera tolre que si elle est concatne une chane. Mais comme cela a t dit dans
la partie "concatnation", nous viterons d'utiliser cette possibilit.

Extraction
Syntaxe
uneAutreChaine extraire(uneChaine, depart, [longueur])
// uneChaine peut tre une variable, une chane ou une combinaison
des 2

Squence 1

// exemples
chaine1 extraire("Dupont", 1, 3) // chaine1 contient "Dup"
prenom "Christophe"
chaine2 extraire(prenom, 6) // chaine2 contient "tophe"
chaine3 extraire(prenom,2, 4) // chaine3 contient "hris"

Page 33

Programmation
procdurale

But
Construction d'une nouvelle chane en ralisant une extraction d'une sous-chane partir d'une chane de dpart.
La valeur "depart" permet de prciser partir de quel caractre l'extraction est faite.
La valeur "longueur" permet de prciser le nombre de caractres extraits partir de
"depart". En l'absence de "longueur", le reste de la chane est extrait.

Cas d'erreurs
Les cas d'erreurs sont les mmes que ceux de la fonction "longueur". De plus, la variable
"depart" ne peut pas contenir une valeur infrieure 1 et suprieure la longueur de
la chane. La variable "longueur" ne peut contenir une valeur infrieure 1. Il est admis
que si la variable longueur contient une valeur suprieure aux nombres de caractres qui
peuvent tre extraits, l'extraction s'arrte de toute faon la fin de la chane.

8 2944 TG PA 00

Recherche
Syntaxe
unePosition recherche(unSousChaine, uneChaine)
// uneSousChaine et uneChaine peuvent tre une variable, une
chane ou une combinaison des 2
// exemples
prenom "Christophe"
nom "Dupont"
pos1 recherche("top", prenom) // pos1 contient 6
pos2 recherche("h", prenom) // pos2 contient 2
pos3 recherche(" ", prenom + " " + nom) // pos3 contient 11
pos4 recherche(" ", prenom) // pos4 contient 0

But
Reprage de la premire occurrence de "uneSousChaine" dans "uneChaine". La valeur
retourne reprsente la position du premier caractre de "uneSousChaine" dans
"uneChaine". Si aucune occurrence n'est trouve, la valeur 0 est retourne.

Frquence
Syntaxe
laFrequence frequence(unSousChaine, uneChaine)
// uneSousChaine et uneChaine peuvent tre une variable, une
chane ou une combinaison des 2

Squence 1
Programmation
procdurale

// exemples
prenom "Christophe"
freq1 frequence("top", prenom) // freq1 contient 1
freq2 frequence("h", prenom) // freq2 contient 2
freq3 recherche(" ", prenom) // freq3 contient 0

Page 34

But
Comptabilisation du nombre d'occurrences de "uneSousChaine" dans "uneChaine".

Exercice 8
Deux variables sont dclares et initialises en mmoire centrale:
prenom: chaine // cette variable contient la chane "Nicolas"
nom: chaine // cette variable contient la chane "Dupont"
Les variables suivantes sont aussi dclares mais non initialises:
chaine1, chaine2, chaine3, chaine4: chaine
val1, val2: entier
Les insrtuctions suivantes sont excutes dans l'ordre. Aprs chaque instruction, vous
prciserez le contenu de la variable concerne (celle qui est gauche de l'affectation):
a) chaine1 prenom + nom
b) chaine2 prenom + " " + nom
c) val1 longueur(chaine2)
d) chaine3 extraire(chaine2, longueur(prenom)+2)
e) chaine4 extraire(chaine2, recherche(" ", chaine2)+1)
f) val2 val1 - frequence("o", chaine2)

8 2944 TG PA 00

2D. Fonctions prdfinies


Vous venez dj de dcouvrir plusieurs fonctions prdfinies sur les chaines. Il existe
des fonctions prdfinies dans de nombreux domaines. Nous allons voir ici deux grands
domaines de fonctions avec, chaque fois, deux des fonctions les plus connues. L
encore, il n'existe aucune norme algorithmique mais les fonctions prsentes ici sont tellement connues qu'elles sont couramment admises. Ne soyez pas tonn si vous trouvez
des syntaxes diffrentes dans les livres ou sur internet: en l'absence de norme, on peut
donner ces fonctions le nom que l'on veut, condition qu'il soit parlant. La plupart du
temps, le nom le plus utilis dans les langages est adopt.

Fonctions de conversions
Ces fonctions permettent de changer le type d'une variable.

Syntaxe
// conversion d'une chane en numrique
unNombre val(uneChaine)
// conversion d'une valeur numrique en chaine
uneChaine str(unNombre)

But
val: permet de convertir une chane en numrique. Cette conversion est indispensable
s'il est ncessaire de faire des calculs avec le nombre obtenu.
str: permet de convertir un nombre en chane. Comme nous l'avons vu prcdemment,
cette conversion est utile lorsque le nombre doit tre manipul comme une chane, par
exemple en le concatnant une autre chane.

Squence 1

Cas d'erreurs

Programmation
procdurale

La fonction val ne peut pas convertir autre chose qu'une chane.


La fonction str ne peut pas convertir autre chose qu'une valeur numrique.

Page 35

Fonctions mathmatiques
Voici 2 fonctions mathmatiques assez classiques. Il existe bien sr de nombreuses fonctions mathmatiques accessibles dans quasiment tous les langages.

Syntaxe
// valeur absolue d'un nombre
unNombre abs(unAutreNombre)
// partie entire d'un nombre
unNombre ent(unAutreNombre)

But
abs: donne la valeur absolue d'un nombre, donc le mme nombre sans son signe (un
nombre ngatif devient alors positif).
ent: donne la partie entire d'un nombre, donc sa valeur sans la partie aprs la virgule
(on obtient un nombre entier).

Cas d'erreurs
Les deux fonctions n'acceptent que des nombres.

8 2944 TG PA 00

Autres fonctions
Vous vous doutez bien qu'il existe des tas de fonctions prdfinies dans des domaines
varis comme la gestion des dates (pour rcuprer le jour d'une date, par exemple), la
comptabilit, etc.

Exercice 9
crire l'algorithme qui permet de convertir en binaire un nombre dcimal.
La conversion se fait en rcuprant les restes des divisions successives par 2 du
nombre dcimal, jusqu' ce que le quotient soit nul. Le nombre binaire se construit
en concatnant les restes dans une variable de type chane.
Le programme doit donc commencer par saisir un nombre dcimal, faire la conversion puis afficher au final la variable chane qui contient la conversion en binaire.
Aide
Pour ce programme, vous aurez besoin des oprateurs mod et div, de la fonction str
et de la concatnation de chanes.

2E. Optimisation
Un programme ne doit pas se contenter de "marcher". Il doit tre optimis pour tre le
plus performant possible. Il existe 4 niveaux d'optimisation.

Optimisation en lisibilit
Squence 1
Programmation
procdurale

Page 36

Un programme doit tre facile lire et relire. Une des plus grandes difficults en programmation est de se plonger dans un programme crit par un autre dveloppeur, voire
parfois de se replonger dans un de nos anciens programmes. Il arrive mme que l'on ait
du mal relire des parties d'un programme que l'on est en train de dvelopper !
Il faut donc respecter certaines rgles de prsentation du code pour que le programme
soit facile comprendre.
Ne suivez jamais ces rgles "aprs coup": c'est une erreur classique, malheureusement.
Suivez ces rgles au fur et mesure que vous crivez le code (ou l'algorithme) de votre
programme.

Indentations
Les indentations reprsentent les dcalages faits dans le code, ou l'algorithme, pour
amliorer sa lisibilit en permettant de reprer plus facilement les diffrentes structures et leurs imbrications. Les dcalages utiliss doivent toujours tre de mme taille.
Gnralement, c'est la tabulation qui est utilise. Certains utilisent 2 ou 3 espaces. Quelle
que soit la taille du dcalage que vous adoptez, utilisez toujours la mme.

8 2944 TG PA 00

Voici les rgles respecter:


// dcalage dans un programme principal
debut
traitements
fin
// dcalage dans une itration
tantque condition
traitements
fintantque
repeter
traitements
jusqu' condition
pour k de depart arrivee
traitements
finpour
// dcalage dans une alternative
si condition alors
traitements
sinon
traitements
finsi
Squence 1

// exemple d'imbrication des dcalages


tantque condition
traitements
si condition alors
si condition alors
traitements
finsi
sinon
traitements
finsi
fintantque

Programmation
procdurale

Page 37

Nom des variables


Les noms des variables et, nous verrons plus tard, beaucoup d'autres choses, doivent tre
choisis judicieusement.
Le choix doit suivre 2 rgles importantes:
le nom de la variable doit reprsenter clairement son contenu;
la norme du nom doit respecter des rgles prcises.
Pour le moment, nous allons nous contenter de suivre la premire rgle. Nous verrons
par la suite comment suivre la seconde, plus complexe et qui ncessite des connaissances
supplmentaires.

Commentaires
Vous l'avez dj vu, les commentaires permettent d'apporter une information claire sur
le contenu du code. Inutile de revenir sur les diffrents types de commentaires et leur
prsentation: tout a t dtaill dans les pages prcdentes.

8 2944 TG PA 00

C'est pourtant sur ce point que j'aimerais insister le plus. Trs souvent, les tudiants crivent du code sans mettre une seule ligne de commentaire puis les ajoutent la fin "pour
faire plaisir au prof qui va les interroger". Perdez cette vision des choses et ce mode de
fonctionnement car vous allez perdre beaucoup de temps. Ajouter les commentaires
la fin suppose qu'il faut se replonger dans tout le code et le comprendre nouveau. De
plus, c'est un travail long et fastidieux.
Le but d'un commentaire, au del du fait qu'il permet de relire plus facilement un code,
est de vous aider rflchir. Comment? Prenez l'habitude d'crire la ligne de commentaire de dbut de bloc avant mme d'crire votre bloc de code : cela vous permet de
clarifier ce que vous devez faire et vous aide coder. Donc retenez cette rgle qui vous
sera d'une grande aide:
commentaire de bloc doit toujours tre crit AVANT d'crire le code corresponO Un
dant.

Exercice 10
Voici un algorithme. Recrivez-le en suivant les rgles de lisibilit puis dites en clair
ce que fait cet algorithme.

Squence 1
Programmation
procdurale

Page 38

debut
a "O"
tantque a = "O"
saisir b
si b > 1 alors
pour c de 1 10
afficher (b*c)
finpour
sinon
afficher "impossible"
finsi
afficher "continuer? (O/N) "
repeter
saisir a
jusqu' a = "N" ou a = "O"
fintantque
fin

Optimisation en temps
Le but est d'optimiser le temps d'excution d'un programme. Un mme programme peut
tre crit de plusieurs faons diffrentes: toutes les solutions peuvent donner un rsultat
identique la fin, mais pas avec le mme temps d'excution.
La diffrence est parfois minime mais lorsqu'on se place un autre niveau (par exemple
des centaines d'internautes qui essayent d'excuter la mme fonctionnalit), on peut
obtenir des diffrences de temps trs significatives.
Il faut donc essayer de supprimer au maximum les redondances, les traitements inutiles
et optimiser ceux qui sont gourmands en ressources.
Par exemple, mfiez vous des boucles imbriques : si vous avez une itration qui va
boucler 20 fois et qui contient une autre itration qui va boucler 30 fois, l'air de rien le
nombre de boucles s'lve 20x30 donc 600 fois !

8 2944 TG PA 00

Optimisation en espace
L'espace reprsente la place de stockage. Pour le moment, vous n'avez abord que le
stockage en mmoire centrale (des diffrentes variables). Vous verrez plus tard d'autres
types de stockage, sur supports permanents (disque dur, DVD...).
Il y a quelques annes, il fallait faire trs attention la place prise en mmoire centrale
et sur les autres supports car leurs tailles taient trs limites. Actuellement, la marge
est plus importante mais ce n'est pas pour autant qu'il faut faire n'importe quoi. Il faut
donc essayer de ne pas tre trop gourmand, sans pour autant perdre en lisibilit ou en
optimisation du temps.

Optimisation fonctionnelle
Ce point ne sera pas dvelopp pour le moment, car vous n'avez pas encore les connaissances ncessaires. Vous aborderez ce type d'optimisation dans quelques pages, avec la
prsentation des modules.
Pour le moment, vous pouvez juste faire en sorte de minimiser les redondances dans le
code. Par exemple, si vous devez afficher plusieurs fois la mme phrase avec juste une
valeur qui change, autant afficher la phrase qu'une seule fois et utiliser une variable
pour la valeur.

Exercice 11
crire l'algorithme qui permet de saisir un montant. Si le montant est suprieur
40, la remise est de 10%. De 20 40, elle est de 5%. Afficher le taux de remise
et le montant payer.
Le but de cet exercice est de trouver une solution la plus propre et optimise possible. vitez donc de faire l'ordinateur des tests pour rien et vitez les rptitions
de code.

Squence 1
Programmation
procdurale

Page 39

2F. Tests
Lorsque vous crivez un programme, vous allez forcment tomber sur des erreurs lors de
l'excution. Au niveau d'un algorithme, vous n'avez pas cette possibilit de tests cependant vous pouvez tout de mme vous mettre la place de l'ordinateur et contrler pas
pas les fonctionnalits de l'algorithme, comme cela a t fait au tout dbut de ce cours
avec l'analyse dtaille du premier programme. On appelle ce type de test, une "trace".

Trace d'un algorithme


Faire une trace consiste se mettre la place de l'ordinateur et voir l'volution des
variables (tat de la mmoire) et des affichages (ou autres priphriques utiliss).
Plutt que de faire comme cela a t prsent en dbut de cours (redessiner la mmoire
centrale chaque tape), on prsente gnralement l'volution des variables dans un
tableau en mettant en en-tte de colonnes les noms des variables et, dans les colonnes,
ligne par ligne, les diffrentes valeurs prises par les variables au cours de l'excution.

8 2944 TG PA 00

Exercice 12
Voici un algorithme. Faites les 2 traces suivantes en simulant la saisie des valeurs
donnes:
a) 12; 8; 7; 0
b) 0

Squence 1
Programmation
procdurale

Page 40

// calcul de la moyenne des ages


debut
// saisie du premier age
afficher "entrer un age"
saisir age
// initialisation des variables
nb 0
total 0
// boucle sur la saisie des ages (arrt 0)
tantque age <> 0
// cumul des ages et comptabilisation du nombre de saisies
total total + age
nb nb + 1
// saisie d'un age
afficher "entrer un age"
saisir age
fintantque
// calcul et affichage de la moyenne
afficher "moyenne = " + str(total/nb)
fin
Pour chaque trace, faites un tableau de 3 colonnes (une par variable) et marquez
l'volution du contenu de chaque variable. Prcisez la fin l'information qui va
s'afficher.
Quel problme rencontrez-vous dans la 2e trace? Que faut-il modifier dans le programme pour viter ce problme?

Les types de tests


L'exercice prcdent vous a montr qu'un programme peut sembler marcher mais, suivant les tests, a ne va plus tre le cas.
Il faut donc penser tous les tests pertinents possibles pour contrler qu'un programme
va fonctionner quelle que soit la situation. On met au point ce qu'on appelle des "jeux
d'essais" qui reprsentent des batteries de tests afin de couvrir le maximum de possibilits que peut rencontrer un programme.
Les tests peuvent aborder diffrents domaines:
tests de saisie (contrler par exemple que la personne tape bien un "O" ou un "N");
tests de scurit (contrler que l'accs certaines pages d'un site soit limit certaines personnes);
tests de calculs (comme on l'a vu dans l'exercice prcdent);
tests de cohrence (si une date de dbut et une date de fin doivent tre choisies,
contrler que la date de fin soit bien suprieure la date de dbut);
etc.

8 2944 TG PA 00

Quand un programme est termin (ou une partie de programme), la phase de tests est
primordiale pour limiter les incidents.

Exercices rcapitulatifs
Voici quelques exercices pour commencer vous faire rflchir sur diffrents problmes
algorithmiques. Attention, chaque exercice est important et permet de mettre en pratique un aspect prcis. Donc, faites-les tous et n'hsitez pas passer du temps dessus.
Ces notions sont fondamentales pour la suite. Si certains points ne sont pas clairs, vous
risquez d'avoir d'importantes difficults dans la squence suivante. Vous tes en train de
mettre en place les fondations de vos connaissances: une maison qui n'a pas de fondations solides ne peut pas tenir debout.

Exercice 13
Voici une squence algorithmique:
si (A = B ou A <> C) et (B <> C) alors
A B C
si A < B alors
B A
C 3
sinon
A B
finsi
C 2 * C
sinon
A 2 * C
finsi
Donner la valeur des 3 variables aprs excution de la squence algorithmique si, au
dpart, ces variables sont initialises :
a)
A = 2, B = 5, C = 2
b)
A = 9, B = 9, C = 4
c)
A = 4, B = 2, C = -1

Squence 1
Programmation
procdurale

Page 41

Exercice 14
On vous propose l'algorithme suivant qui permet de saisir des nombres (arrt de la
saisie quand on tape 0), de faire le cumul de ces nombres et de l'afficher.
Trouvez les erreurs (erreurs qui peuvent tre de syntaxe ou de logique du programme).
programme cumul
nombre, cumul: numrique
debut
afficher "saisir un nombre"
saisir un nombre
tantque nombre = 0
cumul cumul + 1
afficher "saisir un nombre"
saisir un nombre
fintantque
afficher "le cumul est " + "cumul"
fin

8 2944 TG PA 00

Exercice 15
crire lalgorithme qui demande le nom de la ville, le nombre dhabitants, et qui
affiche un message du type:
Grasse possde 35000 habitants

Exercice 16
crire lalgorithme qui permet de saisir un prix en euro et qui affiche le rsultat en
Franc.

Exercice 17
crire l'algorithme qui permet de saisir une moyenne (vous n'avez pas la calculer
mais juste la saisir) et dafficher un message personnalis suivant sa valeur:
Si la moyenne atteint les 10, il faut afficher "Passage". Si la moyenne est en dessous
de 10 mais atteint au moins 8, alors il faut afficher "Redoublement". Enfin, pour une
moyenne trop basse (en dessous de 8), il y a "Exclusion".

Exercice 18

Squence 1
Programmation
procdurale

Page 42

Un robot conduit une voiture. Il peut excuter 3 actions: "s'arrter", "ralentir", "passer", en fonction de la couleur du feu qui sera une variable saisie. crire l'algorithme
qui permet de saisir la couleur du feu (en vrifiant la saisie) et d'afficher l'ordre du
robot correspondant la couleur.

Exercice 19
crire l'algorithme qui permet de saisir plusieurs notes et d'afficher la moyenne. On
arrtera la saisie en posant la question lutilisateur "Voulez-vous continuer?".

Exercice 20
crire l'algorithme qui permet de saisir 20 nombres et d'afficher le nombre de valeurs
positives ou nulles, et le nombre de valeurs ngatives qui ont t saisies.

Exercice 21
crire lalgorithme qui permet de saisir plusieurs notes sur 20 et qui affiche la note
la plus basse et la note la plus haute. On arrtera la saisie en posant la question
l'utilisateur.

Exercice 22
crire l'algorithme qui permet de saisir des tempratures (on arrtera la saisie en
posant la question) puis dafficher la temprature la plus basse et la temprature la
plus haute.

8 2944 TG PA 00

Exercice 23
crire l'algorithme qui permet de saisir une suite de valeurs numriques (on arrtera
la saisie en posant la question) puis d'afficher un message prcisant si la suite est
strictement croissante.

Exercice 24
crire l'algorithme qui permet de dire si un nombre est premier ou non. L'algorithme
doit fonctionner pour plusieurs nombres. Un nombre est premier s'il n'est divisible
que par 1 et par lui-mme.

Exercice 25
crire l'algorithme qui permet de saisir 365 tempratures et d'afficher au final les
extrmes.

Exercice 26
Lorsque l'inventeur du jeu d'chec prsenta son invention au roi des Perses, celuici fut merveill et informa le crateur qu'il tait prt satisfaire n'importe quelle
demande venant de sa part. Aprs un court instant de rflexion, l'inventeur demanda
qu'on lui mette 1 grain de bl dans la premire case, 2 dans la deuxime, 4 dans la
troisime et ainsi de suite en doublant chaque fois le nombre de grain. Bien que
surpris par la modestie de la demande, le roi ordonna son garde grenier de prparer le prsent. crire l'algorithme qui calcule le nombre de grains promis par le roi,
sachant qu'un chiquier est constitu de 64 cases.

Exercice 27

Squence 1
Programmation
procdurale

Page 43

crire le programme qui permet de saisir un nombre de secondes (contrler que ce


nombre soit entre 0 et 86400) et qui affiche la conversion sous forme HH:MM:SS.
Optimisez le programme pour bien avoir des positions pour chaque valeur (donc en
ajoutant si ncessaire des 0 l'affichage).

2G. Passage sur machine


Il y a bien longtemps que vous n'avez pas touch l'ordinateur. Depuis le premier
exemple qui vous avait permis de dcouvrir l'environnement de programmation et le
C++, vous ne vous tes concentr que sur la rflexion travers l'criture d'algorithmes.
Il est temps de mettre un peu en pratique les connaissances abordes.
Attention, vous aurez sans doute besoin des informations contenues dans le mmento
du C++ que vous trouverez la fin du fascicule TP correspondant ce cours. Pensez
vous y rfrer rgulirement.
Pour viter des erreurs de manipulations, vous pouvez chaque fois fermer le ou les
projets prcdents de l'espace de travail juste en faisant un clic droit dessus et en choisissant "close project". tout moment, vous pourrez le rouvrir si vous dsirez nouveau
travailler dessus.

8 2944 TG PA 00

Pensez donc crer un nouveau projet pour chaque nouvel exercice. Si vous ne savez
plus comment crer un projet, revenez au premier exemple du cours et la dcouverte
de l'environnement Eclipse.
Si vous avez l'habitude de travailler avec un autre IDE, vous pouvez continuer mais
attention, les explications donnes qui portent directement sur l'environnement (en
particulier lors des recherches d'erreurs) ne correspondront pas votre environnement.
Quel que soit l'environnement que vous utilisez, je vous conseille de prendre tout de
mme Eclipse, non pas qu'ils soit forcment meilleur que tous les autres, mais si vous ne
le connaissez pas, c'est aussi l'occasion de le dcouvrir.

Traduction d'un algorithme


La premire tape qui parait assez logique est de savoir traduire un algorithme dans un
langage. Plus tard, vous serez capable d'crire directement votre code dans le langage
dsir. Mais pour le moment, puisque l'on spare la rflexion du codage, il faut passer
par cette tape de traduction.
Pour cela il suffit de suivre les rgles de syntaxe du langage: prenez exemple sur le premier programme du cours et sur les informations contenues dans le mmento (rappel:
le mmento se trouve la fin du fascicule TP correspondant ce cours).

Exercice 28
Traduisez l'algorithme suivant:

Squence 1
Programmation
procdurale

Page 44

programme somme
valeur, total: entier
debut
total 0
afficher "entrer une valeur (0 pour arrter): "
saisir valeur
tantque valeur <> 0
total total + valeur
afficher "entrer une valeur (0 pour arrter): "
saisir valeur
fintantque
afficher "la somme des valeurs est de: " + total
fin
Puisque c'est le premier programme que vous allez vraiment crire par vous-mme,
il est possible que vous ayez des erreurs de compilations. Dans un premier temps,
essayez de les corriger en contrlant que vous avez bien respect la logique de l'algo
et la syntaxe du C++ (en rfrence au mmento). Si vous restez vraiment bloqu trop
longtemps, regardez la correction. Dans la squence suivante, vous allez apprendre
utiliser les aides d'Eclipse pour la recherche d'erreurs.

Exercice 29
Reprenez l'exercice sur le nombre cach et modifiez le de sorte que:
le nombre d'essais soit limit 10;
au final, si le joueur n'a pas trouv il faut lui signaler qu'il a perdu et lui afficher la valeur trouver, si le joueur a trouv en moins de 5 essais il faut lui dire
"bravo", en moins de 8 essais "bien" et au del "moyen".

8 2944 TG PA 00

Cette fois vous de faire comme vous le sentez: vous pouvez vous amuser traduire en
C++ plusieurs exercices que vous avez crit en algorithme.
Attention, vous ne pourrez pas tous les traduire. Vous pouvez traduire les exercices 14
26 l'exception des exercices 15 et 18. Pourquoi? Parce que certains exercices ncessitent la saisie de chanes et cet aspect est un peu plus complexe en C++. Inutile de se
compliquer la vie donc vous ne manipulerez que des valeurs numriques ou des variables
qui ne peuvent contenir qu'un seul caractre (type char).
Vous n'tes pas oblig de raliser ces traductions car cela ne demande pas plus de
rflexion. Cependant, dites-vous que plus vous coderez, plus vous prendrez des habitudes et vous trouverez facilement les erreurs dans vos programmes. C'est aussi une
bonne occasion de contrler les algos.

Recherche d'erreurs
Il existe 3 types d'erreurs.
Les erreurs de compilation
Ces erreurs sont dtectes lors de la compilation (par exemple un mot rserv mal crit,
un point virgule manquant, mais aussi des erreurs plus smantiques comme une variable
non dclare). Ces erreurs empchent la cration du fichier objet (code du programme
traduit en langage machine).
Le compilateur donne la liste des erreurs de compilations. L'IDE les repre et va les signaler directement dans le code. Trs souvent, il donne mme des solutions de corrections.
Les erreurs de link
On les assimile souvent aux erreurs de compilation pourtant il y a une petite nuance. Ces
erreurs se produisent une fois le fichier objet cr, au moment de l'tape de link, tape
dont on n'a pas encore parl et qui s'occupe de lier le fichier objet aux bibliothques
externes (et non les includes que vous avez vu pour le moment et qui permettent d'intgrer directement le code dans le programme). votre niveau, vous n'aurez pas utiliser
de bibliothques externes donc vous n'aurez pas d'erreur de link. Ces erreurs bloquent
la cration du fichier excutable (le fichier avec l'extension exe).
Le Linker donne la liste des erreurs de link. Comme ces erreurs proviennent de liens
externes, gnralement l'IDE n'apporte pas plus d'informations.

Squence 1
Programmation
procdurale

Page 45

Les erreurs d'excution


Cette fois le fichier exe a t cr, mais le programme provoque une erreur lors de son
excution. C'est donc la logique du programme qui n'est pas correcte.
Lors d'une erreur d'excution, l'excution s'arrte en affichant parfois l'origine de l'erreur (division par 0) mais pas toujours. L'IDE offre alors une batterie d'outils pour reprer ces erreurs, en permettant par exemple l'excution ligne par ligne du programme,
l'ajout de points d'arrts pour que l'excution stoppe un endroit prcis et continue pas
--pas, l'affichage de l'volution du contenu des variables, etc.
Il se peut aussi que le programme s'excute jusqu'au bout sans provoquer d'erreur d'excution, mais ne ralise pas les traitements attendus. Les outils prcits sont alors aussi
utiliss pour reprer ce qui ne se passe pas correctement.

Erreurs de compilation
En cas d'erreurs de compilations, le compilateur donne, dans l'onglet de la console, la
liste des erreurs. Le premier onglet ("Problems") dtaille plus clairement la liste des
erreurs. Mais l'aspect le plus visuel apparat directement dans le code, o chaque erreur
est souligne, reprable par une croix rouge dans la marge de gauche et un petit tiret
rouge dans la marge de droite.

8 2944 TG PA 00

Faisons tout de suite un essai pour mieux comprendre. Fermez les projets en cours et
crez le projet "erreur". Dans ce projet, crez le fichier source "erreur.cpp". Tapez le
code suivant, exactement comme il est prsent, sans chercher corriger par vous-mme
les erreurs. Le programme ne comporte aucune erreur de logique, mais juste des erreurs
de syntaxe.
/* recherche d'erreurs
* auteur: Emds
* date: 28/05/2011
*/
//--- bibliothques ncessaires --#include <stdio.h>
// pour le printf et scanf
//--- programme principal --int main () {

Squence 1
Programmation
procdurale

Page 46

int i, nb;
printf("Cherche si un nombre est premier")
printf("\nNombre (0 pour finir) = ");
scanf("%d", &nb);
while nb != 0 {
i == 2;
while (nb%i != 0 && i < nb) {
i++;
}
if (i==nb) {
printf("premier");
}else{
printf(pas premier);
}
printf("\n\nNombre (0 pour finir) = ");
scanf("%d", &nb);
}
return 0;
}
Voyons donc maintenant comment le compilateur va ragir. Slectionnez le projet et
lancez la compilation. Cette fois, dans la marge de gauche, des croix dans des ronds
rouges se sont ajoutes, signalant les erreurs de compilation, et des petits traits rouges
sont aussi dans la barre de droite, afin de se positionner directement sur la ligne d'erreur.
Cliquez sur le premier trait rouge afin de vous positionner sur la ligne concerne (qui est
aussi souligne en rouge). Normalement vous tes sur cette ligne:
printf("\nNombre (0 pour finir) = ");
Sans cliquer, mettez la souris soit sur la croix rouge, soit directement sur la ligne de code
et observez le message qui apparat (expected ; before "printf"). Traduisons : "point
virgule attendu avant printf". Effectivement, sur la ligne qui se trouve juste au dessus
de celle-ci, il manque le point virgule final. Ajoutez-le. La croix n'a pourtant pas disparu.
C'est normal car aucune compilation n'a t redemande. Avant de relancer le compilateur, on va s'occuper des autres erreurs.

8 2944 TG PA 00

Avec la mme logique et en vous aidant un peu du mmento, essayez de corriger l'erreur
qui se trouve cette ligne (rappel: le mmento se trouve la fin du fascicule TP correspondant ce cours):
while nb != 0 {
Une fois cette erreur corrige, vous remarquez qu'un triangle jaune avec un point d'exclamation se trouve dans la marge de droite, juste ct de cette ligne de code:
i == 2;
Le message dit: "statement has no effect".
Effectivement, ce n'est pas une erreur syntaxique, mais il y a tout de mme un problme.
On appelle ces erreurs, des "warnings". Elles ne sont pas bloquantes lors de la compilation, mais prdisent d'ventuelles erreurs de logique du programme, lors de l'excution.
Effectivement, le signe == en C++ signifie "galit" au niveau comparaison. Or ici, ce
n'est pas une comparaison que l'on veut faire mais une affectation. En C++, l'affectation
se fait par un simple =. Corrigez l'erreur.
Essayez de corriger les erreurs restantes et relancez une compilation, jusqu' qu'il n'y ait
plus d'erreurs. Contrlez lors de l'excution (toujours en lanant directement le fichier
exe l'extrieur d'Eclipse) que vous n'avez pas ajout des erreurs de logique: vrifiez
que le programme affiche le message correspondant au nombre saisi.

Exercice 30
Vous trouverez en fin de ce fascicule la version corrige de ce programme, si vous
n'tes pas arriv corriger toutes les erreurs.

Squence 1
Programmation
procdurale

Erreurs d'excution
Trs souvent, on pense que lorsqu'un programme passe l'tape de la compilation, c'est
gagn. C'est loin d'tre le cas. Gnralement c'est l que les vrais problmes commencent. En effet, avec un peu d'exprience, les erreurs de compilation sont faciles
corriger. Les erreurs d'excution peuvent tre nettement plus complexes trouver.
Avant la cration des IDE, le programmeur utilisait classiquement ce que l'on appelle
des affichages "tests" ou "drapeaux". En insrant dans le code, plusieurs affichages
des endroits stratgiques, cela permet de savoir l'volution du code, par o passe
l'excution, et mme l'volution de certaines variables, cette technique est encore trs
largement utilise. Cependant, les outils apports par les IDE permettent de nouvelles
techniques de recherche d'erreurs, gnralement plus rapides.
Sans faire une recherche d'erreurs, on va cependant observer comment ragit le dbuggeur face un programme. Restez sur le mme projet que vous avez normalement
corrig au niveau erreurs syntaxiques. Cliquez sur le petit cafard qui se trouve gauche
de la flche blanche dans le rond vert (ou passez par les menus : Run/Debug As/Local
C++Application).
Une fentre s'ouvre proposant l'utilisation de la perspective: cette option est trs pratique car elle offre un ensemble d'outils pour le dbogage. Cliquez sur Yes. L'aspect de
l'IDE a chang et plusieurs zones se sont ouvertes.
Vous allez ainsi pouvoir excuter le programme pas--pas et voir l'volution du contenu
des variables.

Page 47

8 2944 TG PA 00

volution des variables

Flches
pour
avancer
pas--pas
dans le
code
volution pas--pas
dans le code

Zone de saisie

Arrt de l'excution

Squence 1
Programmation
procdurale

Page 48

8 2944 TG PA 00

Faisons un test. Remarquez dans la partie des variables (en haut droite) les variables i
et nb qui sont utilises dans le programme. Vous constatez par la mme occasion qu'elles
contiennent des valeurs alatoires. Effectivement, contrairement certains langages qui
initialisent par dfaut les variables 0, le C++ n'en fait rien, d'o l'importance d'initialiser les variables lorsqu'elles doivent servir pour des calculs.
Cliquez sur la premire flche jaune qui permet d'avancer pas--pas dans le code (Step
into). Dans la zone du code, remarquez que la ligne verte s'est positionne sur le printf.
Malgr les dclarations des variables, leur contenu n'a pas chang, c'est normal.
Avancez 2 fois en pas--pas. Vous tes sur le scanf. Les affichages ne se voient pas dans
la console, c'est normal (les affichages ne se voient qu'en fin d'excution, mais cela ne
va pas nous empcher de tester le programme).
Avancez nouveau une fois: cette fois la ligne verte a disparu: en effet, le scanf est en
cours d'excution et attend une saisie. Dans la partie Console, saisissez le nombre 73 puis
validez. La ligne verte est rapparue sur le while, et cette fois, dans la partie variable,
vous remarquez que nb a pris la valeur 73.
Faites 2 avances pas--pas pour vous positionner sur le second while. Comme vous avez
excut la ligne "i = 2;", remarquez dans la partie des variables que la variable i a pris
la valeur 2.
Il arrive parfois que dans une excution pas--pas, on dsire sauter une partie de code
un peu trop longue au niveau excution. Ce serait le cas ici pour la recherche des diviseurs de 73. Pour sauter une partie de code, on utilise les points d'arrts. Dans la partie
code, marge de gauche, double cliquez dans la partie grise la hauteur de la ligne du if.
Vous remarquez le petit rond qui s'est mis en place: c'est un point d'arrt. Pour sauter
jusqu'au point d'arrt, cliquez sur la flche verte qui se trouve un peu plus gauche par

rapport la flche d'avance pas--pas (cette nouvelle flche porte le nom "Resume").
La ligne verte s'est bien positionne sur le if, et donc a excut la boucle sans y passer
de faon pas--pas. Remarquez le contenu des variables: i contient maintenant 73 car
effectivement aucun nombre jusqu' 73 n'est arriv diviser 73 (puisque ce nombre est
premier).
Avancez une fois avec le pas--pas: vous remarquez que la ligne verte est positionne
sur l'affichage "premier". Une avance pas pas permet donc aussi de voir par o passe
le programme, en particulier pour les tests. Donc l, c'est la partie "alors" du "if" qui est
excute (mme si on ne verra pas l'affichage). Avancez encore une fois pas pas pour
constater que la partie "sinon" a t saute, donc non excute.
Il est possible d'arrter l'excution du dbuggeur tout moment: cliquez sur le carr
rouge qui se trouve juste au dessus de la zone de saisie, vers la droite. Une fois que le
carr n'est plus rouge, vous pouvez sortir du mode debug en cliquant tout en haut
droite sur "C/C++" ( droite de "Debug").
Tous les IDE proposent des fonctionnalits de debuggage: pensez les utiliser pour vous
aider dans les recherches d'erreurs d'excution de vos programmes.

3.

Tableaux

Vous avez vu les bases de la logique de programmation. partir de maintenant, vous


allez aborder diffrents outils supplmentaires qui vont chaque fois rpondre des
problmes non rsolus dans ce que vous avez vu pour le moment. Les nouveaux outils
seront aussi parfois l pour amliorer le programme.
Le premier outil que nous allons aborder porte sur les types des variables. Pour le
moment vous ne connaissez que les types "simples" c'est dire qui ne prennent qu'une
"case" mmoire: numrique, chane, date, boolen. Vous allez dcouvrir que l'on peut
manipuler des types plus complexes.

Squence 1
Programmation
procdurale

Page 49

3A. Problme des tempratures


Imaginons le problme suivant:
"crire l'algorithme qui permet de saisir 365 tempratures puis d'afficher celles qui se
trouvent au dessus de la moyenne des tempratures saisies."

Limitation des possibilits avec les variables simples


Quel est le problme?
Pour contrler si chaque temprature est au dessus de la moyenne, il faut au pralable
avoir calcul la moyenne.
Pour calculer la moyenne, il faut au pralable avoir saisi toutes les tempratures.
Jusqu' maintenant, lorsque l'on ralisait plusieurs saisies successives d'une mme information, ces saisies taient chaque fois stockes dans la mme variable, donc chaque
saisie crasait la valeur prcdemment mmorise. Ce n'tait pas un problme car on
ralisait gnralement le calcul au fur et mesure de la saisie. Par exemple, pour obtenir la moyenne des tempratures, il suffit de cumuler les tempratures saisies dans une
variable de cumul, de compter en parallle le nombre de saisies effectues puis de faire
au final la division entre les 2 valeurs (le cumul des tempratures divis par le nombre de
tempratures). Donc, quand on obtient la moyenne, on a perdu toutes les tempratures
saisies, ce qui n'tait pas un problme jusque-l.

8 2944 TG PA 00

Cette fois, on a un vrai problme : on sait calculer la moyenne mais, une fois cette
moyenne calcule, on aura perdu toutes les valeurs qui ont t saisies et il ne sera plus
possible d'afficher les tempratures qui sont au dessus de la moyenne.
La seule solution dont nous disposons avec nos connaissances actuelles est l'utilisation de
365 variables pour mmoriser les 365 tempratures.

Quel algo possible?


Voil ce que l'on obtient au niveau de l'algo avec 365 variables:

Squence 1
Programmation
procdurale

Page 50

programme temperatures
// dclarations
moy: rel
t1, ... t365: entier
debut
// saisie des 365 tempratures
saisir t1
...
saisir t365
// calcul de la moyenne
moy (t1 + ... + t365) / 365
// test de chaque temprature avec la moyenne
si t1 > moy alors
afficher t1
finsi
...
si t365 > moy alors
afficher t365
finsi
fin
Vous vous doutez bien que les "..." n'existent pas, ni en algo et encore moins en programmation. titre indicatif, cet algo fait en ralit 1461 lignes ! (sans compter la longueur tout fait anormale de la ligne de calcul de la moyenne)
Vous sentez bien qu'il y a un malaise et que forcment, il existe une autre solution.

Une solution?
La solution, sans le vouloir vous l'avez dj: observez les noms des variables. Trs naturellement, puisqu'il y a 365 tempratures manipuler, cela a paru logique de nommer les
365 variables avec des noms contenant justement le numro de la temprature.
Donc l'idal serait d'avoir disposition une seule variable mais qui contiendrait 365 cases
dont chaque case serait repre par son numro: 1re case de la variable, 2e case de la
variable... 365e case de la variable.
Eh bien voil, c'est a la solution. Et ce nouveau type de variable s'appelle un tableau.

8 2944 TG PA 00

Voici plus concrtement ce qui se passe en mmoire centrale (juste pour 4 variables au
lieu de 365):
variables disperses
t3

variable de type tableau

t
t1

t4

25

34
t2

25

12

34

12

Remarquez gauche la dispersion des variables, alors qu' droite les variables sont les unes
la suite des autres, d'o un seul nom (t) et juste un indice pour accder la bonne case.
Rappelez-vous que le nom de la variable permet d'accder l'adresse de la case mmoire
correspondante: le nom de la variable tableau permet d'accder la premire case et la
valeur de l'indice permet d'avancer dans les cases suivantes puisqu'elles se suivent dans
la mmoire.
Donc, pour obtenir la 1re temprature, ce ne sera plus t1 mais t[1], premire case (indice
1) du tableau t.

Le type tableau
Voyons de faon plus formelle le principe du tableau et sa syntaxe.

Qu'est-ce qu'un tableau?


Un tableau, plus prcisment une variable de type tableau, est une variable compose
de plusieurs cases de mme type et contigus dans la mmoire centrale.
Le nombre de cases est fixe et dtermin au moment de la dclaration du tableau.
Chaque case est repre par le nom du tableau et son indice (son rang dans le tableau).

Squence 1
Programmation
procdurale

Page 51

Indice du tableau
Il est possible d'utiliser n'importe quelle variable ou directement une valeur pour indicer
un tableau et ainsi accder une des cases du tableau. L'important n'est pas le nom de
la variable mais son contenu: un indice est forcment un entier, reprsentant le rang de
la case dans le tableau.
Par convention algorithmique, l'indice des tableaux commence 1. Ce qui est assez
surprenant car dans quasiment tous les langages, l'indice commence 0. D'ailleurs on
trouve aussi parfois en algo le dmarrage de l'indice 0, voire mme une autre valeur,
cette dernire option tant tout de mme dconseille.

Valeur d'une case


Un tableau comporte plusieurs cases. Chaque case peut tre accde par le nom du
tableau avec l'indice de la case. Accder une case permet d'accder son contenu, sa
valeur.

Syntaxe, indice et valeur


Dclaration d'un tableau
Un tableau se dclare comme une variable, en prcisant son type, except qu'il faut aussi
prciser le nombre de cases.

8 2944 TG PA 00

nomTableau [indiceDepart..indiceArrivee]: typeCase


nomTableau: nom de la variable de type Tableau
indiceDepart: valeur de l'indice de la premire case (gnralement 1, parfois 0)
indiceArrivee: valeur de l'indice de la dernire case
typeCase: type du contenu de chaque case du tableau
// exemple de dclaration de tableau
t[1..365]: entier
Cette dclaration reprsente le tableau qu'il sera ncessaire d'utiliser pour rsoudre
notre problme sur les tempratures.

Utilisation d'un tableau


Un tableau s'utilise comme une variable, except qu'il faut chaque fois prciser l'indice
de la case concerne.
En effet, quand vous manipulez un tableau, c'est gnralement une case prcise du
tableau qui vous intresse.
Voici quelques exemples d'utilisation de tableaux et de manipulations d'indices:
total total + t[k]
// ajout du contenu de la case nk de t dans la variable total.
// pour que cette ligne fonctionne, il faut que la variable k
contienne un nombre entre 1 et 365 pour servir d'indice de case.
Squence 1
Programmation
procdurale

Page 52

afficher nombre[valeur+4]
// le contenu de valeur (qui est obligatoirement un entier) est
ajout 4. Le rsultat obtenu sert d'indice pour accder une
case du tableau nombre. Le contenu de cette case est alors affich.
vec[nombre[1]] 0
// Le contenu de la 1ere case du tableau nombre est rcupr. Cette
valeur doit forcment tre de type entier et doit reprsenter un
indice possible pour le tableau vec. La case du tableau vec qui se
trouve cet indice, reoit 0.
vec[j] vec[j] + 1
// Le contenu de la jme case du tableau vec est incrmente de 1
vec[j] vec[j+1]
// La jme case du tableau vec reoit le contenu de la (j+1)me
case du tableau vec (donc la case suivante).

Que peut-on utiliser comme indice?


Trs souvent les tudiants pensent que pour indicer un tableau, il faut obligatoirement
utiliser une variable unique qui est "lie" au tableau et s'interdisent d'utiliser cette
variable pour autre chose, ou d'utiliser autre chose que cette variable pour indicer le
tableau en question. Les exemples prcdents sont l pour vous convaincre du contraire.
Vous voyez bien qu'on peut mettre peu prs n'importe quoi dans les crochets: la seule
condition est que le contenu du crochet permette d'obtenir un entier qui puisse servir
pour indicer une case.

8 2944 TG PA 00

Confusion entre indice et valeur


Autre erreur classique: la confusion entre indice et valeur; l'indice est un numro qui
permet d'accder une case, la valeur est le contenu de la case qui se trouve cet indice.
Le schma prcdent montrant la mmoire centrale avec 4 variables disperses gauche,
et une variable de type tableau avec 4 cases qui se suivent, devraient vous aider comprendre. Vous remarquez bien dans ce schma que les 4 cases contiennent des valeurs
(les tempratures mises dans les cases) et comportent un indice (le numro de la case
plac ct de la case pour mieux vous aider comprendre.
partir de ce schma, crivons la squence algorithmique qui permet d'afficher le
contenu des 4 cases du tableau t.
pour k de 1 4
afficher t[k]
finpour
Cette squence permet d'afficher: 25 12 4 34
Effectivement, au premier tour de boucle, k vaut 1 donc t[k] reprsente t[1] qui contient
25. Au deuxime tour de boucle, k vaut 2 donc t[k] reprsente t[2] qui contient 12. Etc...

Solution du problme des tempratures


Il est possible maintenant de rsoudre le problme des tempratures. C'est bien sr vous
qui allez crire l'algorithme.

Exercice 31
crire l'algorithme qui permet de saisir 365 tempratures puis d'afficher celles qui se
trouvent au dessus de la moyenne des tempratures saisies.

Squence 1
Programmation
procdurale

Page 53

3B. Utilisation judicieuse du tableau


Maintenant que vous savez utiliser les tableaux, ce n'est pas une raison pour les utiliser
toutes les occasions. N'oubliez pas que l'optimisation en espace, donc le tableau, qui tout
de mme prend de la place en mmoire, ne doit tre utilis que s'il n'y a pas d'autres
possibilits.
Par exemple, pour le problme des tempratures au dessus de la moyenne, il n'y avait
pas d'autre solution. Mais pour juste afficher la moyenne des tempratures, passer par
un tableau n'est pas ncessaire, et ce serait dommage de rserver 365 cases en mmoire
centrale alors qu'une seule suffit.
L'exercice suivant, qui contient des explications dtailles dans l'autocorrection, va vous
permettre de voir si vous avez compris dans quel cas un tableau est indispensable et dans
quel cas il ne l'est pas.

8 2944 TG PA 00

Exercice 32
Prcisez, pour chaque problme, si l'utilisation d'un tableau est indispensable ou
non:
a) saisir 20 notes et afficher la moyenne
b) saisir 20 notes et afficher le % de notes suprieures la moyenne des notes saisies
c) saisir 20 notes et afficher le % de notes suprieures 10
d) saisir 20 notes et les afficher dans l'ordre inverse de la saisie
e) saisir 20 notes et les afficher tries dans l'ordre croissant
f) saisir 20 notes et afficher la note la plus basse et la note la plus haute

3C. Tableaux 1 dimension


Le type de tableau que l'on vient d'tudier est en fait un tableau 1 dimension. On
l'appelle aussi "vecteur".
Il ne comporte qu'un seul indice.

3D. Tableaux 2 dimensions


Il existe aussi des tableaux 2 dimensions, appels "matrices". Ces tableaux comportent
2 indices (indice de ligne et indice de colonne).

Dclaration
Squence 1
Programmation
procdurale

Page 54

Pour un tableau 2 dimensions, il faut prciser le nombre de lignes et de colonnes dans


la dclaration. Voici la syntaxe algorithmique:
tab[1..n, 1..m]: type

Utilisation
L'utilisation se fait en prcisant non pas 1 mais 2 indices. Le reste fonctionne sur la mme
logique que les tableaux 1 dimension.
// pour afficher la case qui se trouve la ligne i et la colonne j
afficher tab[i, j]

Exercice 33
crire l'algorithme qui permet de saisir une premire matrice 5x5 puis une seconde
matrice de mme taille (vous ne pouvez pas saisir les 2 matrices en mme temps). Une
fois les 2 matrices saisies, vous devez afficher la matrice somme.
Rappel mathmatique : une matrice somme est une matrice dont chaque case
contient la somme des 2 cases qui se trouvent la mme position dans les matrices de
dpart. Donc, par exemple la case (3, 2) de la matrice somme contient la somme entre
les 2 cases des 2 premires matrices, qui se trouvent chaque fois la position (3, 2).
Les tableaux 2 dimensions ne sont pas trs couramment utiliss.
On pourrait s'amuser aller plus loin dans les dimensions, mais cela sort du cadre de
notre programme.

3E. Tableaux de structures


Encore une petite variante, cette fois trs importante: les tableaux de structures. Voyons
cette variante travers un exemple.

8 2944 TG PA 00

Imaginons que l'on vous demande:


" Saisir les noms des tudiants et, pour chaque tudiant, sa moyenne. Afficher les noms
des tudiants qui sont au dessus de la moyenne de la classe."
Comment stocker les noms et pour chaque nom, la moyenne?
Un tableau 2 dimensions ? (2 colonnes, une pour les noms et une pour les
moyennes) Impossible car tous les lments d'un tableau doivent tre de mme
type et l, on manipule des chanes (les noms) et des nombres (les moyennes).
2 vecteurs? (un pour les noms et un pour les moyennes) Pourquoi pas, a marche
puisqu'il suffit d'utiliser le mme indice entre les 2 tableaux. Cependant ce n'est pas
trs pratique.
Il existe une autre solution: le tableau de structure

Principe
Plutt que d'avoir plusieurs tableaux diffrents, l'ide est d'avoir un seul tableau, 1
dimension, mais dont chaque case est structure en plusieurs parties.
2 tableaux spars

1 tableau de structure
etudiant

nom

(nom)

1 Alain

moy

2 Michel

12

3 Paul

4 Pierre

15

10

1 Alain
2 Michel

(moy)
12
9

3 Paul

15

4 Pierre

10

gauche, 2 tableaux spars, l'indice permet de retrouver la moyenne correspondant


un nom.
droite, 1 seul tableau une dimension (un seul indice) mais dont chaque case est compose de plusieurs parties. On dit que la case est "structure". Comment alors accder
une partie prcise d'une case? En prcisant tout simplement le nom de la partie. Donc, il
faut donner le nom du tableau, l'indice de ligne concerne, et enfin le nom de la partie
de la case qui nous intresse.

Squence 1
Programmation
procdurale

Page 55

Par exemple, pour accder la case qui contient "Paul", il faudrait crire:
etudiant[3].nom
Et pour accder la moyenne de Michel, il faudrait crire:
etudiant[2].moy

Intrt
L'intrt d'utiliser un tableau de structure est double:
toutes les informations lies par un sens commun sont runies et sont accessibles
partir d'une mme variable (le tableau de structure);
le tableau peut contenir des informations de types diffrents.

8 2944 TG PA 00

Syntaxe
Dclaration
Pour dclarer et manipuler un tableau de structure, il faut commencer par dclarer une
structure qui va reprsenter un nouveau type, et non une nouvelle variable. Une structure est un type compos de plusieurs parties, chaque partie ayant son propre nom et
type.
// dclaration d'une structure
nomStructure: structure
variable1: type1
..
variableN: typeN
finstructure
// exemple
sEtudiant: structure
nom: chaine
moy: entier
finstructure
Ensuite il est possible de dclarer le tableau 1 dimension, en prcisant que chaque case
sera du type de la structure.
// dclaration d'un tableau de structure
nomTableau[1..n]: nomStructure
Squence 1
Programmation
procdurale

Page 56

// exemple (en supposant qu'il n'y a pas plus de 40 tudiants)


etudiant[1..40]: sEtudiant

Utilisation
Une fois le tableau dclar, il est possible de l'utiliser. Pour accder une case, il faut
prciser le nom du tableau, l'indice de la case et le nom de la partie de la structure qui
nous intresse.
// accs une information prcise du tableau
nomTableau[unIndice].variableX
// exemple: accder la moyenne du 3me tudiant
etudiant[3].moy

Exercice 34
Vous pouvez maintenant rsoudre le problme pos au dbut de cette partie.
Saisir les noms des tudiants et, pour chaque tudiant, sa moyenne. Afficher les noms
des tudiants qui sont au dessus de la moyenne de la classe. Il n'y a pas plus de 40
tudiants et on arrtera la saisie en posant la question l'utilisateur.

3F. Tris dans un tableau


Il existe de nombreux algorithmes de tri qui permettent d'ordonner les informations
dans un tableau. Trois de ces mthodes vont vous tre prsentes. N'essayez pas de les
retenir par cur. Le but est juste de savoir que ces algos de tris existent et de voir qu'il
y en a plusieurs.
Ces algos ne concernent que les vecteurs (tableaux 1 dimension).

8 2944 TG PA 00

Pourquoi existe-t-il plusieurs algos de tri? Parce qu'il y a plusieurs mthodes pour trier et
que chaque mthode a ses avantages et ses inconvnients. Le choix de la mthode se fera
suivant la performance de l'algo qui dpend souvent de l'tat d'origine du vecteur trier.
Pour illustrer les principes de ses tris, observez bien l'volution des vecteurs prsents:
les indices des cellules concernes par les comparaisons sont en rouge, les cases concernes par les changes sont en rouge.

Tri par slection


Explication tape par tape
Voici par exemple un vecteur non tri:
vec

12

34

14

26

42

18

Recherche du plus petit lment dans tout le vecteur et change avec la premire case
du vecteur:
2
3
4
5
6
8
1
7
vec
34
5
14
26
42
18
3
12
Recherche du plus petit lement partir du 2e lment du vecteur (puisque le 1er est
maintenant tri) et change avec la 2e case du vecteur:
1
4
5
6
7
8
2
3
14
26
42
12
18
vec
3
5
34
Recherche du plus petit lment partir du 3e lment du vecteur (puisque les 2 premiers lments sont maintenant tris) et change avec la 3e case du vecteur:
1
2
4
5
6
8
3
7
vec
3
5
14
26
42
18
12
34
Ainsi de suite jusqu' ce que le vecteur soit tri:
vec

Squence 1
Programmation
procdurale

Page 57

12

14

18

26

34

42

Principe
Recherche du plus petit lment de la position i la position n.
change entre cet lment et celui de la ime position.
i variant de 1 n-1.

Remarque
C'est le tri le plus facile mettre en uvre. L'algo est facile crire et comprendre. En
revanche, ce type de tri n'est pas trs performant. Le nombre d'itrations est fixe.

Nombre d'itrations
(n-1) + (n-2) + ... + 2 + 1 = n(n-1)/2 fois

Algorithme
Vous avez maintenant toutes les explications ncessaires pour crire l'algorithme.

Exercice 35
crire la squence algorithmique qui permet de trier, en utilisant la mthode de tri
par slection, un vecteur VEC de 50 cases, entirement rempli.

8 2944 TG PA 00

Tri par insertion


Explication tape par tape
Reprenons le vecteur non tri:
vec

12

34

14

26

42

18

Comparaison du 2e lment avec le premier lment, avec change si ncessaire:


3
4
5
6
7
8
1
2
vec

12

34

14

26

42

18

Comparaison du 3e lment avec le second avec change si ncessaire, et si change,


comparaison entre le second et le premier, avec change si ncessaire:
1
4
5
6
7
8
2
3
14
26
42
3
18
vec
12
5
34

vec

1
5

2
12

34

14

26

42

18

Comparaison du 4e lment avec le 3e avec change si ncessaire, et si change, comparaison entre le 3e et le second, avec change si ncessaire, et si change, comparaison
entre le second et le premier, avec change si ncessaire:
1
2
5
6
7
8
3
4
26
42
3
18
vec
5
12
14
34
Squence 1
Programmation
procdurale

Page 58

vec

12

14

34

26

42

18

Ainsi de suite jusqu' ce que le vecteur soit tri:


vec

12

14

18

26

34

42

Principe
Insertion du ime lment parmi les i-1me premiers dj tris, en dcalant tous les lments du i-1me la position d'insertion.
i variant de 2 n.

Remarque
Plus le vecteur initial est tri, plus le tri est performant. Il sera de toute faon toujours
plus performant que le tri par slection.
Certaines tapes de l'exemple le montre bien: les changes s'arrtent ds que ce n'est
plus ncessaire.

Nombre d'itrations
Le nombre d'itrations n'est pas fixe.
au minimum: (n-1) fois
au maximum: n(n-1)/2 fois

Algorithme
Vous avez maintenant toutes les explications ncessaires pour crire l'algorithme.

8 2944 TG PA 00

Exercice 36
crire la squence algorithmique qui permet de trier, en utilisant la mthode de tri
par insertion, un vecteur VEC de 50 cases, entirement rempli.

Tri par bulle


Explication tape par tape
Reprenons le vecteur non tri:
vec

12

34

14

26

42

18

Comparaison des cases 2 2, du dbut la fin du vecteur, et change si ncessaire:


3
4
5
6
7
8
1
2
vec

12

34

14

1
12

2
5

3
34

vec

14

4
34

12

3
14

vec

26

42

18

14

5
34

12

4
26

42

18

vec

26

42

18

26

42

18

Squence 1
Programmation
procdurale

vec

12

14

26

34

42

18

vec

12

14

26

34

6
3

7
42

18

vec

12

14

26

34

7
18

8
42

Mme principe en reprenant ds le dbut:


3
4
1
2
vec
14
26
5
12

34

18

42

Page 59

vec

12

14

26

34

18

42

vec

12

14

26

34

18

42

vec

12

14

26

34

18

42

8 2944 TG PA 00

5
3

6
34

18

42

26

6
18

7
34

42

26

18

34

42

vec

12

14

26

vec

12

14

12

14

vec

Ainsi de suite jusqu' ce que le vecteur soit tri:


vec

12

14

18

26

34

42

Principe
Parcours du vecteur avec change de cases successives lorsqu'elles ne sont pas tries.
Rptition de cette squence jusqu' ce qu'il n'y ait plus d'change.

Remarque
Plus le vecteur initial est tri, plus le tri est performant. Mais dans le cas inverse, le tri est
peu performant.

Nombre d'itrations
Squence 1
Programmation
procdurale

Page 60

Le nombre d'itrations n'est pas fixe.


au minimum: (n-1) fois
au maximum: (n-1) fois

Algorithme
Vous avez maintenant toutes les explications ncessaires pour crire l'algorithme.

Exercice 37
crire la squence algorithmique qui permet de trier, en utilisant la mthode de tri
par bulle, un vecteur VEC de 50 cases, entirement rempli.

3G. Recherches dans un tableau


Autre type d'algorithme trs courant sur les tableaux : les recherches. Il est souvent
ncessaire de rechercher une information.
Les algos prsents ici ne sont valables que pour les vecteurs.

Recherche squentielle
Explication tape par tape
Reprenons le vecteur non tri:
vec

12

34

14

26

42

18

Et imaginons que le but est de trouver la valeur 26.


La recherche se fait partir de la premire case du tableau, en comparant chaque case
avec la valeur cherche. La recherche s'arrte ds que la valeur est trouve, ou en fin de
tableau si la valeur n'est pas prsente.

8 2944 TG PA 00

vec

12

34

14

5
26

42

18

Principe
Parcours squentiel du vecteur, partir de la premire case, en comparant chaque case
avec la valeur cherche. Arrt ds que la valeur est trouve, ou en fin de vecteur.

Remarque
C'est la mthode de recherche la plus simple et qui fonctionne que le vecteur soit tri
ou non. Cependant, cette mthode est peu performante dans le cas d'un vecteur tri.

Nombre d'itrations
Le nombre d'itrations n'est pas fixe.
au minimum: 1 fois (si la valeur se trouve dans la 1re case)
au maximum: n fois (si la valeur n'est pas trouve)

Algorithme
Vous avez maintenant toutes les explications ncessaires pour crire l'algorithme.

Exercice 38
crire la squence algorithmique qui permet de rechercher de faon squentielle la
valeur VAL dans le vecteur VEC de 50 cases totalement rempli. La squence affiche le
rang de la valeur trouve, ou 0 si la valeur n'est pas prsente dans le vecteur.
Squence 1

Recherche dichotomique

Programmation
procdurale

Explication tape par tape


Cette fois il faut travailler avec un vecteur tri:
vec

12

14

18

26

34

42

Page 61

Et imaginons que le but est de trouver la valeur 26.


Recherche de la case se trouvant au milieu du vecteur (en faisant taille du vecteur + 1
divis par 2, avec une division entire: ici on obtient 4) et comparaison de la valeur avec
cette case:
vec

12

34

14

26

42

18

Puisque la valeur cherche est plus grande que cette case, la recherche se fait entre la
case 5 et la case 8.
nouveau, il y a recherche du milieu de se sous-vecteur: (8+5)div2 = 6.
Comparaison entre la valeur cherche et la case 6:
vec

12

34

14

26

42

18

Puisque la valeur cherche est plus petite que cette case, la recherche se fait entre la case
5 (l'ancienne case minimum) et la case 5 (la nouvelle case maximum).
nouveau, il y a recherche du milieu de ce sous-vecteur: (5+5)div2 = 5.
Comparaison entre la valeur cherche et la case 5:
vec

12

34

14

26

42

18

La valeur est trouve au bout de 3 essais.

8 2944 TG PA 00

Principe
Divisions successives de la zone de recherche en 2 avec recherche dans le sous-vecteur
concern. La comparaison se fait chaque fois avec la valeur qui se trouve au milieu du
sous-vecteur.

Remarque
C'est la mthode de recherche la plus optimise pour un vecteur tri. Elle ne fonctionne
pas si le vecteur n'est pas tri.

Nombre d'itrations
Le nombre d'itrations n'est pas fixe.
au minimum: 1 fois
au maximum: log(n)/log2 fois (cette information est donne titre indicatif: inutile de
la retenir ! Ceux d'entre vous qui aiment les maths peuvent s'amuser chercher pourquoi
on obtient une telle formule)

Algorithme
Vous avez maintenant toutes les explications ncessaires pour crire l'algorithme.

Exercice 39
crire la squence algorithmique qui permet de rechercher de faon dichotomique
la valeur VAL dans le vecteur VEC de 50 cases totalement rempli et tri. La squence
affiche le rang de la valeur trouve, ou 0 si la valeur n'est pas prsente dans le vecteur.
Squence 1
Programmation
procdurale

Page 62

3H. Exercices rcapitulatifs


La notion de tableau n'est pas toujours facile comprendre et mettre en uvre. Voil
pourquoi il est trs important que vous ralisiez tous les exercices rcapitulatifs pour
bien assimiler cette notion.

Exercice 40
Faites la trace de ce programme et donnez le contenu des 2 tableaux "debut" et
"fin" en fin de programme.
programme serarien
debut[1..5]: entier
fin[1..5]: entier
val: entier
debut
pour val de 1 5
debut[val] ((10-val) mod 5) + 1
finpour
pour val de 1 5
fin[debut[val]] val*10
finpour
fin

8 2944 TG PA 00

Exercice 41
Voici un programme qui est cens saisir 100 tempratures puis afficher le pourcentage de tempratures au dessus de la moyenne des tempratures saisies. Trouvez et
corrigez les erreurs.
programme temperatures
temp[1..100], moyenne: reel
k, nb: entier
debut
moyenne 0
pour k de 1 100
afficher "entrer la temprature n k = "
saisir temp[k]
moyenne moyenne + temp
finpour
moyenne moyenne / 100
nb 0
pour k de 1 100
si temp[nb] > moyenne alors
nb nb + temp[k]
finsi
finpour
afficher "le % de t au dessus de la moyenne est de "+nb+"%"
fin
Squence 1

Exercice 42
crire le programme qui permet de saisir un vecteur de 100 nombres, puis de permuter les lments dans le mme vecteur et sans utiliser d'autre vecteur. La permutation
consiste inverser le 1er lment avec le 100e, le 2e lment avec le 99e, etc.

Programmation
procdurale

Page 63

Exercice 43
On se propose de faire une tude sur des tempratures releves 8h du matin pendant une anne sur un lieu donn.
On obtient donc 365 nombres entiers reprsentant les valeurs arrondies des tempratures releves, exprimes en C. Ces nombres peuvent s'chelonner de 20 +40
(bornes comprises).
crire le programme qui permet de faire les traitements suivants:
saisie de l'ensemble des tempratures ;
calcul et affichage, pour chaque valeur possible de temprature, du nombre de
jours o elle a t releve.

8 2944 TG PA 00

Exercice 44
crire lalgorithme qui va permettre de saisir plusieurs villes (on arrtera la saisie en
posant la question lutilisateur) puis qui doit afficher une seule fois chaque nom de
ville, avec, ct, le nombre de fois o ce nom a t saisi.
Exemple:
Si on saisit: Nice, Paris, Nice, Antibes, Montpellier, Nice, Montpellier, Nice, Marseille,
Antibes, on doit afficher:
Nice: 4
Paris: 1
Antibes: 2
Montpellier: 2
Marseille: 1

Exercice 45

Squence 1
Programmation
procdurale

Page 64

Un vecteur dj rempli contient la liste des erreurs de connexions. Vous avez votre
disposition les dclarations suivantes (que vous n'avez pas besoin de rcrire):
s_erreur: structure
nomlog: chaine
datelog: date
heurelog: chaine
finstructure
t_erreur[1..500]: s_erreur
nberreurs: entier
// contient le nombre de lignes effectivement
remplies dans t_erreur
t_erreur est dj tri sur nomlog.
crire la squence algorithmique qui permet d'afficher une seule fois chaque
nomlog, suivi du nombre d'erreurs pour ce nom (donc du nombre de lignes dans
t_erreur concernant ce nomlog).

Passage sur machine


Il est temps de faire quelques tests sur machine.
Vous avez crit plusieurs algorithmes sur les tableaux. Contrairement aux algorithmes
simples, la traduction des algos sur les tableaux en C++ va poser quelques problmes car
la plupart des algos sont des squences algorithmiques qui supposent que le vecteur est
dj rempli.
Si vous tenez raliser quelques traductions d'algorithmes, voici quelques conseils:
exercice 31 rduire la taille du vecteur;
exercices 35 38 remplir au pralable un vecteur (vous pouvez remplir par la saisie
ou directement dans le programme);
exercice 39 remplir au pralable un vecteur tri et saisir une valeur chercher (faites
en sorte de boucler sur la saisie pour faire plusieurs recherches);
exercices 41 43 rduire la taille des vecteurs;
exercice 44 remplacer la notion de ville par une lettre (pour manipuler le type char)
et ainsi avoir la frquence de lettres saisies.

8 2944 TG PA 00

Les corrections ne sont pas fournies puisque vous avez la correction des algorithmes.
Vous devez juste voir si vous arrivez utiliser la syntaxe du C++ et ventuellement le
debugger pour trouver les erreurs.

O Noubliez pas qu'en C++, les indices de tableaux commencent 0 !


TP 1
Vous pouvez raliser le TP1 que vous trouverez dans le fascicule de TP correspondant
ce cours.

4.

Modules et paramtres

Jusqu' maintenant, les programmes que vous avez crit taient en un bloc. Nous allons
apprendre maintenant moduler les programmes pour viter les rptitions de code et
aussi pour se crer des outils rutilisables.
est la notion la plus importante de l'anne : avec les 2 parties prcO Ceci
dentes, vous avez appris les fondements de la programmation. Cette nouvelle partie aborde la notion la plus importante en programmation. Si vous ne comprenez
pas cette notion, vous ne pourrez pas du tout poursuivre votre apprentissage. Donc
n'hsitez pas passer le temps qu'il faut pour tout comprendre. Attention, cela
concerne les futurs SLAM mais aussi les futurs SISR.

4A. viter les rptitions de code


Vous aurez souvent l'occasion de tomber sur des parties de code qui se rptent. Il a
dj t plusieurs fois question d'optimisation dans ce cours. Vous vous doutez bien
que laisser des rptitions de code n'est pas trs optimis. Il faut donc faire appel une
nouvelle notion.

Squence 1
Programmation
procdurale

Page 65

Problme de rptition de code


Reprenons le premier exemple du cours avec le programme du jeu du nombre cach.
Cette fois, nous aimerions obliger le second joueur saisir une valeur forcment entre
0 et 100. Cela oblige rajouter un test de saisie. Le problme est qu'il y a une premire
saisie avant la boucle et une seconde en fin de boucle. Donc le test doit tre plac aux
2 endroits.

8 2944 TG PA 00

Voil ce que cela donne:


programme nombreCach
// dclarations
valeur, essai, nbre: entier
debut
// initialisation
nbre 1
// saisie du nombre chercher
afficher "Entrez le nombre chercher ="
saisir valeur
// effacer l'cran cet endroit

Squence 1
Programmation
procdurale

Page 66

// boucle sur la saisie des essais


afficher "Entrez un essai ="
repeter
saisir essai
jusqu' essai>=0 et essai<=100
tantque essai <> valeur
si essai > valeur alors
afficher "trop grand !"
sinon
afficher "trop petit !"
finsi
afficher "Entrez un essai ="
repeter
saisir essai
jusqu' essai>=0 et essai<=100
nbre nbre + 1
fintantque
// rsultat
afficher "Vous avez trouv en " + nbre + " essais"
fin
Il a donc fallu ajouter chaque fois une boucle pour contrler la saisie. Ce qui donne 4
lignes de codes qui sont totalement identiques.
L'idal serait de remplacer ces 4 lignes de code par une seule, qui ferait appel aux 4
lignes crites une seule fois "ailleurs". C'est exactement ce que l'on va faire.

8 2944 TG PA 00

Cration d'une procdure


programme nombreCach
// dclarations
valeur, essai, nbre: entier
debut
// initialisation
nbre 1
// saisie du nombre chercher
afficher "Entrez le nombre chercher ="
saisir valeur
// effacer l'cran cet endroit
// boucle sur la saisie des essais

saisie()
tantque essai <> valeur
si essai > valeur alors
afficher "trop grand !"
sinon
afficher "trop petit !"
finsi

procedure saisie()
debut
afficher "Entrez un essai ="
repeter
saisir essai
jusqu' essai>=0 et essai<=100
fin

Squence 1
Programmation
procdurale

Page 67

saisie()
nbre nbre + 1
fintantque

Pour que a marche, la variable


"essai" doit tre visible dans le
programme principal et dans la
procdure

// rsultat
afficher "Vous avez trouv en " + nbre + " essais"
fin
Il suffit de crer une procdure qui reprsente un petit programme que l'on peut "appeler" quand cela est ncessaire.
Cette procdure n'est pas dans le programme principal: elle est crite l'extrieur. C'est
juste pour le besoin de l'explication qu'elle a t place ici juste ct du code du programme principal.
Pour le moment ne vous proccupez pas de la double parenthse qui se trouve juste
aprs le nom: vous allez trs rapidement avoir des explications dessus.

Fonctionnement
Que se passe-t-il, dans cet exemple, lors de l'excution du programme principal?
Lorsque l'ordinateur arrive sur la premire ligne "saisie()", il comprend qu'il doit faire
appel une procdure et va la chercher en mmoire. Il excute alors le contenu de la

8 2944 TG PA 00

procdure, exactement comme si le code de la procdure tait directement plac dans


le programme principal. Arriv en fin de procdure, l'ordinateur reprend l'excution du
code du programme principal, juste aprs "saisie()", comme si de rien tait.
Lorsque l'ordinateur arrive sur la seconde ligne "saisie()", il refait la mme chose: appel
de la procdure en mmoire, excution du code dans la procdure, comme si le code
tait prsent dans le programme principal, et en fin de procdure, reprise de l'excution
du code qui suit l'appel de "saisie()".
Cette procdure est donc rutilisable volont: il suffit de l'appeler au moment o cela
est ncessaire.

Porte des variables


Vous avez sans doute remarqu la petite information dans la bulle "pour que a marche,
la variable essai doit tre visible dans le programme principal et dans la procdure".
Effectivement, la variable "essai" reoit une information dans la procdure "saisie()", et
cette information est traite dans le programme principal. Cela suppose que la procdure et le programme principal voient de la mme faon cette variable.
Cela vous parait peut-tre vident et pourtant a ne l'est pas. Normalement une variable
n'est visible qu' l'endroit o elle a t dclare. Nous dvelopperons cette notion un
peu plus loin.

4B. Se crer des outils


L'esprit "outil"
Squence 1
Programmation
procdurale

Page 68

On a dj eu l'occasion de parler de "fonctions" dans ce cours, pour prsenter des outils


qui permettent de manipuler les chanes, par exemple.
Rappelez-vous de ceci:
nom "Dupont"
afficher longueur(nom)

// ce qui affiche 6

Qu'est-ce que ce "longueur" ? C'est en fait un petit programme, appel "fonction",


qui permet d'obtenir une information (la longueur) partir d'une autre information (le
contenu de la variable nom).

Besoin d'un outil


Vous aurez souvent l'occasion d'utiliser des outils dj crits, intgrs dans les langages
que vous utilisez ou rcuprs sur internet.
Mais il faut savoir que vous pouvez crer vos propres outils. Comme la procdure vue prcdemment, il est possible de crer ses propres fonctions rutilisables. Voici un exemple.
Imaginons le programme suivant, dont juste une partie est prsente:
programme machin
val, k: entier
...
debut
...
saisir val
tot 1
pour k de 2 val
tot tot * k
finpour
afficher tot
...
fin

8 2944 TG PA 00

Que fait cet extrait? il permet de saisir une valeur (val) et d'afficher le calcul de la factorielle de ce nombre.
Rappel: la factorielle d'un entier reprsente la multiplication de cet entier avec tous les
prcdents jusqu' 1.
Exemple: factoriel de 5 (not en mathmatique 5!) vaut 5*4*3*2*1 = 120
Du coup on peut se dire: ce calcul pourrait trs bien nous resservir !
On aimerait avoir notre disposition une fonction factoriel qui calcule la factorielle d'un
nombre. Et notre programme pourrait alors s'crire:
programme machin
val, k: entier
...
debut
...
saisir val
afficher factoriel(val)
...
fin
Mais imaginons que vous ne trouviez pas cet outil parmi ceux mis votre disposition.
Alors pourquoi ne pas le crer !
Voyons comment faire tape par tape.

Crer un outil
Reprenons le programme d'origine. On a envie, comme tout l'heure, d'isoler plusieurs
lignes de code. Celles qui correspondent au calcul:
programme machin
val, tot, k: entier
...
debut
...
saisir val
tot 1
pour k de 2 val
tot tot * k
finpour
afficher tot
...
fin
Sortir ce code suppose crer quelque chose en dehors du programme:
programme machin
val, tot, k: entier
...
debut
...
debut
saisir val
tot 1
pour k de 2 val
tot tot * k
finpour
fin
afficher tot
...
fin

Squence 1
Programmation
procdurale

Page 69

8 2944 TG PA 00

Voil le code est sorti, mais on ne va pas pour autant pouvoir crer comme tout l'heure
une procdure. Le but n'est pas d'appeler un extrait de code, comme un copier/coller,
pour qu'il s'excute un endroit prcis. Le but est plus complexe: on veut crer un outil
qu'on peut manipuler comme une valeur, par exemple en l'affichant ou en l'affectant,
ou encore en l'insrant dans un calcul. Ici il est question d'afficher le rsultat du calcul. Ce
type d'outil, vous le savez dj, s'appelle une fonction. On veut pouvoir ensuite afficher
directement l'appel de cette fonction:
programme machin
val, tot, k: entier
...
debut
...
saisir val
afficher factoriel(val)
...
fin

Squence 1
Programmation
procdurale

Page 70

fonction factoriel()
debut
tot 1
pour k de 2 val
tot tot * k
finpour
fin

On a bien la ligne dsire pour l'affichage (affichage de l'appel de la fonction) mais le


fait d'avoir mis "fonction factoriel()" au dbut de notre fonction ne suffit pas. En effet,
comment la fonction peut-elle savoir que c'est avec le contenu de "val" qu'il faut travailler? Pour le moment la fonction ne le sait pas. Vous avez peut-tre remarqu cette
double parenthse ct du nom: on l'avait dj fait avec la procdure sans prciser
pourquoi. En fait, ces parenthses permettent la communication avec l'extrieur, plus
prcisment elles permettent de contenir des variables un peu particulires, qu'on
appelle des paramtres, qui peuvent recevoir une valeur venant de l'extrieur.
programme machin
val, tot, k: entier
...
debut
...
saisir val
afficher factoriel(val)
...
fin

fonction factoriel(nb: entier)


debut
tot 1
pour k de 2 val
tot tot * k
finpour
fin

L a commence prendre un sens: effectivement, lors de l'appel de factoriel, l'information qui est dans la parenthse (val) est transfre dans le paramtre de la fonction (nb).
Pourquoi n'ont-ils pas le mme nom au fait? Parce qu'il n'y a aucune raison qu'ils aient
le mme nom; ce n'est pas interdit mais ce n'est pas obligatoire:
val est une variable qui n'appartient qu'au programme principal: la fonction factoriel ne connait pas val;
nb est un paramtre, donc une variable qui n'appartient qu' la fonction: le programme principal ne connait pas nb. Ce n'est pas pour rien qu'on est oblig de
dclarer nb en prcisant son type.
Ca veut dire qu'on a laiss des erreurs dans la fonction, puisqu'elle contient encore "val".
En ralit, on a dcid de l'appeler "nb", alors faisons les modifications ncessaires. Au
passage, on peut en profiter pour mettre toutes les dclarations au bon endroit: le programme principal n'a plus besoin de "k" et de "tot" alors que la fonction en a besoin.

8 2944 TG PA 00

programme machin
val: entier
...
debut
...
saisir val
afficher factoriel(val)
...
fin

fonction factoriel(nb: entier)


tot, k: entier
debut
tot 1
pour k de 2 nb
tot tot * k
finpour
fin

Bon, a prend forme: on sait appeler une fonction et lui envoyer une valeur. Il reste un
problme: il faut aussi pouvoir rcuprer une valeur de la fonction. En effet, elle doit
pouvoir nous renvoyer le rsultat, ici le calcul de la factorielle qui doit tre affich.
Puisqu'une fonction se manipule comme une valeur (on peut l'afficher, l'insrer dans un
calcul, l'affecter une variable...) alors elle doit toujours retourner une valeur.
Il suffit pour cela d'ajouter un ordre de retour en fin de fonction, pour prciser quelle
information doit tre retourne au programme appelant (ici le programme principal).
Il faut aussi prciser, dans l'en-tte de la fonction, le type de l'information retourne.
C'est logique: une fonction se manipulant comme une valeur, il faut connatre son type.
programme machin
fonction factoriel(nb: entier): entier
val: entier
tot, k: entier
...
debut
debut
tot 1
...
pour k de 2 nb
saisir val
tot tot * k
afficher factoriel(val)
finpour
...
retourner tot
fin
fin

Squence 1
Programmation
procdurale

Page 71

L'ordre "retourner" va permettre de retourner la valeur contenue dans "tot". Dans le


programme principal, l'appel de la fonction "factoriel(val)" va tre, lors de l'excution,
remplac par la valeur retourne par la fonction. Ce sera donc bien le calcul de la factorielle de "val" qui sera affich.
Voil: notre fonction factoriel est totalement termine.
Si, ce niveau, tout ne vous semble pas clair, n'essayez pas d'aller plus loin et reprenez les
explications tape par tape. Il est indispensable que vous ayez compris pour continuer.

Porte des variables


Vous commencez mieux comprendre la porte des variables.
Les variables appartiennent uniquement au programme qui les dclare. Ici, "val" n'est
connu que du programme principal. La fonction ne connait pas "val". En revanche, "tot"
et "k" ne sont connus que de la fonction. Le programme principal ne les connait pas. On
parle de variables locales car elles sont visibles localement et non l'extrieur.
Et en ce qui concerne "nb" ? C'est un paramtre. Il a les mmes proprits qu'une
variable locale : seule la fonction peut le voir. Le programme principal ne connait pas
"nb". Par contre, son rle de paramtre lui attribue une proprit supplmentaire, celle
de lui voir affecter une information qui vient de l'extrieur. C'est par lui que le programme principal va pouvoir transfrer une information vers la fonction.

8 2944 TG PA 00

Reprise de l'exemple de la saisie


Dans la prsentation de la notion de procdure, on avait crit une procdure "saisie()"
qui permettait d'viter de rcrire 2 fois le mme code. Cette procdure forait la saisie
de l'essai entre 0 et 100. Mais que se passe-t-il si le premier joueur saisit une valeur en
dehors de cette plage? Donc ce serait mieux qu'il y ait aussi un test de saisie ce niveau.

Version sans fonction ni procdure


En fait, on voudrait un programme qui fasse ceci:
programme nombreCach
// dclarations
valeur, essai, nbre: entier
debut
// initialisation
nbre 1
// saisie du nombre chercher
afficher "Entrez le nombre chercher ="
repeter
saisir valeur
jusqu' valeur>=0 et valeur<=100
// effacer l'cran cet endroit
Squence 1
Programmation
procdurale

Page 72

// boucle sur la saisie des essais


afficher "Entrez un essai ="
repeter
saisir essai
jusqu' essai>=0 et essai<=100
tantque essai <> valeur
si essai > valeur alors
afficher "trop grand !"
sinon
afficher "trop petit !"
finsi
afficher "Entrez un nouvel essai ="
repeter
saisir essai
jusqu' essai>=0 et essai<=100
nbre nbre + 1
fintantque
// rsultat
afficher "Vous avez trouv en " + nbre + " essais"
fin
Cette fois on a 3 blocs ressemblants mais pas totalement identiques. Qu'est-ce qui
change? Le message qui s'affiche et la variable qui reoit l'information.
Cela donne envie de faire une fonction qui reoit en paramtre le message afficher et
qui retourne l'information saisie et teste. nous, dans le programme principal, d'affecter cette valeur saisie dans la bonne variable ("valeur" ou "essai").

8 2944 TG PA 00

Version avec fonction paramtre


Voici donc ce que cela peut donner au niveau programme principal et fonction:
programme nombreCach
// dclarations
valeur, essai, nbre: entier
debut
// initialisation
nbre 1
// saisie du nombre chercher
valeur saisie("Entrez le nombre chercher =")
// effacer l'cran cet endroit
// boucle sur la saisie des essais
essai saisie("Entrez un essai =")
tantque essai <> valeur
si essai > valeur alors
afficher "trop grand !"
sinon
afficher "trop petit !"
finsi
essai saisie("Entrez un nouvel essai =")
nbre nbre + 1
fintantque
// rsultat
afficher "Vous avez trouv en " + nbre + " essais"

Squence 1
Programmation
procdurale

Page 73

fin
//--- fonction de test de saisie --fonction saisie (message: chaine): entier
val: entier
debut
afficher message
repeter
saisir val
jusqu' val>=0 et val<=100
retourner val
fin
chaque appel de "saisie", le message mis entre parenthses est envoy dans le paramtre "message" et donc affich dans la fonction. La fonction s'occupe alors de saisir
une valeur forcment entre 0 et 100 et de retourner cette valeur.
La valeur retourne est alors soit affecte valeur (lors du premier appel de "saisie"),
soit affecte "essai" (lors des deux autres appels).
Prenez le temps de bien comprendre le fonctionnement.

8 2944 TG PA 00

Allons plus loin


Finalement vous vous dites: ce serait pas mal si j'avais une fonction qui permet de tester
une saisie, en limitant la plage de valeur, mais pas forcment toujours entre 0 et 100.
Cela donnerait une fonction qui pourrait tre encore plus rutilisable.
Comment faire? En ajoutant 2 paramtres la fonction: la valeur minimum et la valeur
maximum.
Voil ce que cela donne:
programme nombreCach
// dclarations
valeur, essai, nbre: entier
debut
// initialisation
nbre 1
// saisie du nombre chercher
valeur saisie("Entrez le nombre chercher =", 0, 100)
// effacer l'cran cet endroit

Squence 1
Programmation
procdurale

Page 74

// boucle sur la saisie des essais


essai saisie("Entrez un essai =", 0, 100)
tantque essai <> valeur
si essai > valeur alors
afficher "trop grand !"
sinon
afficher "trop petit !"
finsi
essai saisie("Entrez un nouvel essai =", 0, 100)
nbre nbre + 1
fintantque
// rsultat
afficher "Vous avez trouv en " + nbre + " essais"
fin
//--- fonction de test de saisie --fonction saisie (message:chaine, min:entier, max:entier): entier
val: entier
debut
afficher message
repeter
saisir val
jusqu' val>=min et val<=max
retourner val
fin
Remarquez bien les modifications faites en rouge: 2 paramtres ont t ajouts et, dans
la fonction, ce n'est plus 0 et 100 mais min et max qui sont utiliss.

8 2944 TG PA 00

Dans notre exemple, on envoie en paramtre chaque fois 0 et 100. Mais on peut facilement imaginer l'utilisation de cette fonction d'autres occasions en envoyant une autre
plage de valeur (par exemple entre 0 et 20 pour saisir des notes...).

Un exemple de fonction sans paramtre


Est-ce qu'une fonction sans paramtre, c'est possible? Au premier abord cela parat un
peu surprenant, et pourtant, a existe. En ralit c'est un leurre: le programme appelant
n'envoie pas d'information la fonction, mais forcment la fonction utilise une information qui provient de quelque part pour retourner ensuite une information spcifique. Un
exemple va tout de suite vous aider comprendre.
afficher "la date d'aujourd'hui est: "+aujourdhui()
L'affichage fait appel la fonction "aujourdhui()" qui ne possde aucun paramtre.
Pourtant, suivant le moment de l'appel de cette fonction, nous n'obtiendrons pas le
mme rsultat.
Cela vient du fait que cette fonction contrle une variable directement intgre dans le
systme de l'ordinateur pour rcuprer la date d'aujourd'hui.
Voir le contenu de cette fonction n'a pas d'intrt. Le principal est que vous ayez compris
pourquoi de telles fonctions existent.
Le problme est bien sr diffrent pour les procdures : vous pouvez tout moment
crer des procdures sans paramtre, juste pour viter des recopies de code.

Questions sur le "retourner" d'une fonction?


Une fonction peut-elle avoir plusieurs "retourner"?

Squence 1

OUI et NON : elle peut avoir plusieurs "retourner" dans son code, mais il ne doit tre
possible de passer que par un seul "retourner" car aprs le "retourner", l'excution de
la fonction s'arrte.

Programmation
procdurale

Une fonction peut-elle n'avoir aucun "retourner"?

Page 75

NON : dans ce cas ce n'est pas une fonction mais une procdure. Attention, parfois le
terme "procdure" n'est pas utilis et dans ce cas on parle de fonction qui retourne ou
qui ne retourne pas d'information. La "fonction qui ne retourne pas d'information" a
donc un rle de procdure. Cela vient du fait que certains langages donnent le mme
nom aux deux catgories: ils les appellent "function". La distinction se fait alors par la
prsence ou l'absence du "return" dans le code. En algo, il est conseill de bien faire la
distinction.

Exercice 46
crire une squence algorithmique qui permet de saisir une rponse en bouclant sur
la saisie pour forcer la saisie de "O" ou "N": dans un premier temps vous ne devez
pas utiliser de fonction.
crire une fonction qui reoit en paramtre un caractre et qui retourne vrai si ce
caractre est "O" ou "N".
Rcrire la premire squence cette fois en utilisant la fonction.

4C. Structurer un programme


Lorsqu'il faut crire des programmes assez consquents, tout crire en un bloc n'est pas
une bonne ide: le programme devient vite illisible.

8 2944 TG PA 00

Au-del des avantages dj attribus aux modules (viter les rptitions, se crer des
outils rutilisables), ils peuvent aussi servir pour structurer un programme.
Reprer les grandes parties d'un programme et crer des modules pour chaque grande
partie permet de mieux organiser le code. On appelle cette approche:
le raisonnement descendant
qui est plus performant que le raisonnement linaire.

Les grandes tapes d'un programme


Reprenons l'exemple du programme du morpion que vous avez cod en C++.
Le mieux est de commencer rflchir sur les grandes tapes de l'algo. Attention ce n'est
pas de l'algo, mais juste la structure gnrale:

Squence 1
Programmation
procdurale

Page 76

programme morpion
debut
affichage de la grille
tant que pas gagn et pas 9 coups jous
saisie et affichage d'un coup
contrle si gagn
changement de joueur
fintantque
affichage du rsultat
fin
Ne trouvez-vous pas que cela ressemble trangement des commentaires? Effectivement,
rflchir sur la structure gnrale du programme consiste marquer les grandes tapes
qui peuvent facilement tre symbolises, dans le code, par des commentaires.

Les commentaires correspondants


Voici donc la structure du programme marque par des commentaires:
programme morpion
debut
// affichage de la grille
// tant que pas gagn et pas 9 coups jous
tantque...
// saisie et affichage d'un coup
// contrle si gagn
// changement de joueur
fintantque
// affichage du rsultat
fin
Il ne reste plus qu' remplir les blocs de codes qui doivent se situer sous les commentaires.
Prenez l'habitude de programmer ainsi. Une fois les grandes tapes du programme repres, il faut ensuite faire des choix et de penser modulaire: n'hsitez pas vous dire "a
je l'crirai dans un module".

8 2944 TG PA 00

La version modulaire
Voici un exemple de proposition de code pour ce programme:
programme morpion
coups: entier // compte le nombre de coups
gagne: booleen // pour savoir s'il y a un gagnant
joueur: entier // n du joueur actuel (1 ou 2)
debut
// affichage de la grille
afficheGrille()
// initialisations
coups 0
gagne faux
joueur 1
// tant que pas gagn et pas 9 coups jous
tantque non gagne et coups<9
// saisie et affichage d'un coup
saisieCoup()
// contrle si gagn
gagne testCoup()
coups coups + 1
// changement de joueur
joueur change(joueur)

Squence 1
Programmation
procdurale

Page 77

fintantque
// affichage du rsultat
si gagne alors
afficher le joueur n" + change(joueur) + " a gagn"
sinon
afficher "match nul"
finsi
fin
Si vous lisez ce programme, vous comprenez bien la structure globale et vous voyez qu'il
ne reste plus qu' crire certains modules. En crivant les modules, vous pouvez tre
amen faire des modifications, en particulier ajouter des paramtres.

criture des modules


Nous n'allons crire qu'un module, juste pour montrer le principe. Prenons celui qui
spontanment est prsent avec un paramtre:

8 2944 TG PA 00

Squence 1
Programmation
procdurale

Page 78

fonction change (unJoueur: entier): entier


debut
si unJoueur = 1 alors
retourner 2
sinon
retourner 1
finsi
fin
Que fait cette fonction? Elle reoit le numro du joueur qui est soit 1, soit 2. Si le numro
est 1, elle retourne 2, et si le numro est 2, elle retourne 1. Cette fonction permet donc
de changer de joueur.
Observez bien quels endroits du programme cette fonction est utilise:
juste avant le fintantque, donc dans la boucle, pour changer de joueur avant de
boucler nouveau (car chaque tour de boucle, il y a un coup de jou, donc il faut
changer de joueur);
dans le test final, au niveau de l'affichage du numro du gagnant. Mais pourquoi
donc changer de joueur ce moment-l ? Rflchissez : imaginons que le joueur
2 vient de jouer et qu'il a plac un coup gagnant, la variable "gagne" va recevoir
"vrai" lors de l'appel de la fonction "testCoup()". Cependant, cela n'empchera pas
les autres lignes de code de s'excuter : la variable "coups" va tre incrmente
de 1 et surtout la fonction "change" va tre appele donc la variable "joueur" va
recevoir la valeur 1 (pour changer de joueur). En remontant au niveau du tantque,
comme la variable "gagne" est vrai, l'ordinateur va sortir de la boucle et le message qui va s'afficher va tre "le joueur 1 a gagn" alors que c'est le 2 qui a gagn.
Voil pourquoi ce nouvel appel de "change" pour avoir le bon numro de gagnant.
Cette fonction n'a pas t choisie par hasard. C'est aussi l'occasion de vous montrer qu'il
peut y avoir plusieurs "retourner" dans une fonction. MAIS attention, condition que
seul un puisse tre appel. Ici c'est le cas puisque si le programme passe par le "alors", il
ne peut pas passer par le "sinon" et vice versa.
Pensez aussi que si vous mettez un "retourner" dans un "alors", il faut en mettre aussi
un dans le "sinon", ou ventuellement aprs le "finsi". Car il ne peut pas y avoir de chemin possible dans une fonction qui ne se termine pas par un retourner.
Pour mieux comprendre, voici diffrentes versions de cette mme fonction: une marche
et l'autre non.
fonction change (unJoueur: entier): entier
debut
si unJoueur = 1 alors
retourner 2
finsi
retourner 1
fin
Cette solution marche: soit le programme rentre dans le "alors" et ralise le "retourner
2" qui provoque automatiquement la sortie de la fonction (donc le "retourner 1" n'est
pas excut), soit le programme ne rentre pas dans le "alors", dans ce cas il passe directement aprs le "finsi" et excute le "retourner 1".

8 2944 TG PA 00

fonction change (unJoueur: entier): entier


debut
si unJoueur = 1 alors
retourner 2
finsi
fin
Cette version ne marche pas et de toute faon, elle provoque une erreur de syntaxe car
il y a un cas o il n'y a pas de "retourner" (le cas ou unJoueur est diffrent de 1) ce qui
n'est pas possible dans une fonction.

4D. Diffrents types de modules


Maintenant que vous avez vu des exemples prcis de procdures et fonctions, reprenons
tout cela de faon plus gnrale.

Notion de module
Qu'est-ce qu'un module?
Un module dsigne un groupe de code indpendant.
C'est un terme gnrique qui englobe les procdures, les fonctions ainsi que le programme principal (ce dernier tant aussi considr comme une fonction: rappelez-vous
le "return 0" que vous mettez chaque fois en C++ la fin de vos programmes).

Catgories de modules

Squence 1

Un peu de vocabulaire:
module principal

programme principal

module qui ne retourne pas de valeur

procdure (ou fonction sans retour)

module qui retourne une valeur

fonction

module interne

module crit dans le programme (utilisable uniquement dans ce


programme)

module externe

module non crit dans le programme mais intgr

module appelant

module qui appelle un autre module

module appel

module sollicit par un autre module

Programmation
procdurale

Page 79

Procdure
Qu'est-ce qu'une procdure?
Une procdure est un module qui ne retourne aucune information. Lors de son appel,
le code de la procdure est excut puis le module appelant continue son excution
l'instruction suivante.

Dclaration
procedure nomProc (param1:type, ..., paramN:type)
// dclarations locales
debut
// traitements
...
fin

8 2944 TG PA 00

La procdure peut avoir des paramtres (0 N) qui lui permettent une "communication"
avec le programme appelant.
moment de la dclaration de la procdure, VOUS DEVEZ dclarer le type des
O Au
paramtres (voil pourquoi chaque paramtre est suivi de ":" et de ton type)

Appel
...
nomProc (valeur1, ..., valeurN)
...
Pour appeler une procdure, il suffit de mettre son nom, suivi, dans la parenthse,
d'autant de valeurs que de paramtres attendus.
Ces valeurs peuvent tre des variables, des valeurs en dur ou des calculs. L'important est
la compatibilit des types (par exemple si le premier paramtre attendu doit tre de type
entier, la premire valeur envoye doit tre de type entier).
moment de l'appel d'une procdure VOUS NE DEVEZ PAS prciser le type des
O Au
valeurs envoyes. Le programme sait quel est le type des valeurs.
Ces 2 avertissements sont l pour insister sur 2 aspects qui reprsentent des erreurs trs
courantes chez les tudiants (et qui prouve au passage que les notions de paramtres
n'ont pas du tout t comprises).
Ces 2 avertissements sont tout aussi valables pour la fonction.
Squence 1
Programmation
procdurale

Page 80

Fonction
Qu'est-ce qu'une fonction?
Une fonction est un module qui retourne une information.
Dans le module appelant, la fonction est manipule comme une valeur. Elle est soit affiche, soit affecte dans une variable, soit intgre dans un calcul...
Une fonction ne s'appelle pas comme une procdure.
Lors de son appel, le code de la fonction est excut et le module appelant rcupre
l'information retourne par la fonction.

une fonction est une valeur


Dclaration
fonction nomFonc (param1:type, ..., paramN:type): typeRetour
// dclarations locales
debut
// traitements
retourner uneValeur
fin
La fonction a gnralement des paramtres (0 N) qui lui permettent une "communication" avec le programme appelant. Elle retourne forcment une valeur: le type de cette
valeur est marqu en fin d'en-tte de la fonction.

8 2944 TG PA 00

Appel
...
// exemple d'affichage
afficher "message = " + nomFonc (valeur1, ..., valeurN)
// exemple d'affectation
uneVariable nomFonc (valeur1, ..., valeurN)
// exemple d'intgration dans un calcul
uneVariable 5 * nomFonc (valeur1, ..., valeurN)
...
Une fonction se manipule comme une valeur, donc il ne faut pas l'appeler en dbut de
ligne.
Pour appeler une fonction, il suffit de mettre son nom, suivi, dans la parenthse, d'autant de valeurs que de paramtres attendus.
Ces valeurs peuvent tre des variables, des valeurs en dur ou des calculs. L'important est
la compatibilit des types.

4E. Paramtres
Vous avez dj utilis les paramtres, mais vous n'avez pas encore dcouvert toutes les
possibilits offertes par les paramtres.
Attention, n'abordez cette partie que si tout ce qui a t expliqu depuis le dbut des
modules a t totalement compris. Il va y avoir une petite gymnastique neuronale...

Qu'est-ce qu'un paramtre?


Un paramtre est un espace mmoire qui sert d'interface (d'intermdiaire) entre le
module appelant et le module appel.
Le paramtre est la proprit du module: il n'est utilisable que dans le module, comme
une variable locale.

Diffrentes catgories de paramtres


Pour le moment, vous n'avez vu qu'une seule catgorie de paramtres: celle qui permet
de rcuprer une information provenant du module appelant.
En ralis il existe 3 catgories de paramtres, cependant les 2 autres sont moins courantes et souvent dconseilles.

Squence 1
Programmation
procdurale

Page 81

Paramtre en entre
C'est le cas qui a t vu jusqu' maintenant : il reoit une information provenant du
module appelant.
Principe
Le paramtre peut recevoir une information provenant du module appelant.
Cette information sera recopie dans le paramtre.
Si le module modifie le contenu du paramtre, il n'y a aucune incidence sur le module
appelant.

8 2944 TG PA 00

Exemple
fonction machin (a: entier, b: entier): entier
debut
a a * 2
retourner (a + b)
fin

programme truc
x: entier
debut
x 8
afficher machin(x, 10)
// cela donne 26
afficher x
// cela donne 8
fin
Le contenu de "x" est transfr dans le premier paramtre "a". C'est une simple recopie
de valeur. Donc, mme si "a" est modifi dans la fonction, cette modification n'a aucune
incidence sur "x". Attention, cette remarque est valable mme si on donne le mme nom
aux 2 variables:

Squence 1

fonction machin (a: entier, b: entier): entier


debut
a a * 2
retourner (a + b)
fin

Programmation
procdurale

Page 82

programme truc
a: entier
debut
a 8
afficher machin(a, 10)
// cela donne 26
afficher a
// cela donne toujours 8
fin
On est dans le mme cas de figure que le prcdent. Les deux variables "a" ne sont pas
du tout les mmes. Le fait qu'elles aient le mme nom ne change absolument rien.
Le "a" dclar dans le programme n'est visible que par le programme. On est oblig de
le mettre dans la parenthse de l'appel de la fonction pour que son contenu soit transfr dans le paramtre "a".
Le paramtre "a" n'est visible que par la fonction. Il n'est pas du tout visible par le programme principal qui ne connat que son "a" local. Du coup, la modification du "a" de
la fonction n'a aucune incidence sur le "a" du programme.
Appellations possibles
On parle de paramtre en entre, mais aussi de:
paramtre en lecture : car la variable d'origine est simplement lue pour tre
copie dans le paramtre;
paramtre en valeur : car seule la valeur est rcupre. On parle d'ailleurs de
"passage par valeur";
paramtre "donne": car la variable sert juste comme une donne et n'est pas
un rsultat.

8 2944 TG PA 00

Notations possibles
En l'absence de notation, la catgorie est par dfaut "paramtre en entre".
Mais il est possible aussi de le prciser en faisant prcder le nom du paramtre par, soit
la catgorie en toutes lettres, soit la premire lettre de la catgorie. Diffrents noms
sont accepts:
E (Entre);
I (Input);
L (Lecture);
D (Donne);
V (Valeur).
Exemple
fonction machin (E a: entier, E b: entier): entier
(ou)
fonction machin (Entree a: entier, Entree b: entier): entier
(ou)
fonction machin (D a: entier, D b: entier): entier
(ou)
fonction machin (Donnee a: entier, Donnee b: entier): entier
(etc.)
Vous avez compris le principe. Bien sr il ne faut pas mlanger les notations. Si plusieurs
notations ont t donnes ici, c'est plutt pour vous informer que vous risquez de tomber sur toutes ces notations. Dans ce cours, nous n'utiliserons que la premire notation,
ou plutt, dans le cas des paramtres en entre, l'absence de catgorie mentionne.

Paramtre en entre/sortie
Ce cas vous ne le connaissez pas encore. Il est plus complexe et surtout plus dangereux.
Dans certains cas, il n'est pas possible de l'viter, mais le but est de l'viter au maximum.

Squence 1
Programmation
procdurale

Page 83

Principe
Le paramtre peut recevoir une information provenant du module appelant mais il peut
aussi modifier le contenu de la variable lie au paramtre.
Cette fois, ce n'est pas la valeur qui est transfre dans le paramtre, mais l'adresse en
mmoire centrale de la variable lie au paramtre. Le programmeur ne voit pas concrtement qu'il manipule une adresse, mais toute modification du contenu du paramtre
modifie directement le contenu de la variable lie ce paramtre.
Exemple
fonction machin (E/S a: entier, E b: entier): entier
debut
a a * 2
retourner (a + b)
fin

programme truc
x: entier
debut
x 8
afficher machin(x, 10)
// cela donne 26
afficher x
// cela donne 16 !!!
fin

8 2944 TG PA 00

La variable "x" est transfre dans le paramtre "a". En ralit c'est son adresse qui est
transfre. Du coup toute modification de "a" modifie directement "x". Puisque la fonction transforme "a" en le multipliant par 2, la variable "x" est elle aussi multiplie par 2.
Ceci est aussi valable si les 2 variables ont le mme nom. Pire encore, on peut s'amuser
inverser les noms. Regardez ce joli casse-tte:
fonction machin (E/S b: entier, E a: entier): entier
debut
b b * 2
retourner (a + b)
fin

programme truc
a: entier
debut
a 8
// cela donne 26
afficher machin(a, 10)
afficher a
// cela donne toujours 16 !!!
fin

Squence 1
Programmation
procdurale

Page 84

L a devient trs joli. Dans le programme principal, "a" reoit la valeur 8. Puis la fonction est appele en envoyant "a" dans le premier paramtre qui lui, s'appelle "b". Donc
le "a" du programme principal sera li au "b" de la fonction. Puisque "b" est modifi,
"a" du programme principal l'est aussi. Et, dans la fonction, l'addition de "a" et "b"
concerne uniquement le "a" et le "b" de la fonction...
Appellations possibles
On parle de paramtre en entre/sortie, mais aussi de:
paramtre en lecture/criture: car la variable d'origine est lue mais on peut aussi
crire dedans puisqu'on la modifie;
paramtre en adresse: car c'est l'adresse qui est rcupre. On parle d'ailleurs de
"passage par adresse";
paramtre "donne/rsultat": car la variable sert de "donne" mais rcupre aussi
un rsultat.
Notations possibles
Une notation est obligatoire. Il en existe encore une fois plusieurs:
E/S (Entre/Sortie);
I/O (Input/Output);
L/E (Lecture/Ecriture);
D/R (Donne/Rsultat);
A (Adresse).
Exemple
fonction test (E/S a: entier): entier
(ou)
fonction test (Entree/Sortie a: entier): entier
(etc.)

8 2944 TG PA 00

Vous avez compris le principe. Encore une fois, il ne faut pas mlanger les notations.
C'est cette premire notation que nous utiliserons.

Paramtre en sortie
Ce cas est trs similaire au prcdent et finalement trs rare car la plupart des langages
ne proposent que les 2 premiers cas. Il vous est tout de mme prsent titre indicatif.
Principe
Le paramtre ne peut pas recevoir d'information provenant du module appelant, cependant, comme le paramtre en E/S, il peut modifier le contenu de la variable lie au paramtre. C'est mme une obligation sinon il ne sert rien.
Comme pour le paramtre en E/S, c'est l'adresse qui est transfre. Voil pourquoi ce cas ne
parat pas diffrent du prcdent, mais l'algorithmique fait tout de mme la distinction.
Exemple
fonction machin (S a: entier, E b: entier): entier
debut
a 16
retourner (a + b)
fin

programme truc
x: entier
debut
afficher machin(x, 10)
// cela donne 26
afficher x
// cela donne 16
fin
Cette fois "x" n'est pas initialis dans le programme principal mais envoy dans le premier paramtre "a". Ce paramtre tant en sortie, il est forcment rempli dans la fonction et sa valeur va servir d'initialisation pour la variable "x" du programme appelant.
Tout le reste fonctionne sur la mme logique que les paramtres en E/S.

Squence 1
Programmation
procdurale

Page 85

Appellations possibles
On parle de paramtre en sortie, mais aussi de:
paramtre en criture: car la variable d'origine reoit en criture une information (et ne fait que recevoir);
paramtre en adresse: car c'est l'adresse qui est rcupre. Dans ce cas on ne fait
pas la distinction avec un paramtre en E/S;
paramtre rsultat: car la variable rcupre un rsultat.
Notations possibles
Une notation est obligatoire. Il en existe encore une fois plusieurs:
S (Sortie);
O (Output);
R (Rsultat);
A (Adresse).

8 2944 TG PA 00

Exemple
fonction test (S a: entier): entier
(ou)
fonction test (Sortie a: entier): entier
(etc.)
C'est cette premire notation que nous utiliserons.

Exercice 47
Voici un programme et une procdure:
programme nul
nbre1, nbre2, nbre3, d: entier
debut
nbre1 3
nbre2 2
nbre3 5
d 8
exemple(nbre1, nbre2, nbre3)
// contenu des variables?
fin

Squence 1
Programmation
procdurale

Page 86

procedure exemple (E a: entier, S b: entier, E/S c: entier)


d: entier
debut
b a * 2
a b c
d b - a
c a * 2
fin
Que contiennent les variables du programme nul (nbre1, nbre2, nbre3, d) lorsque le
programme arrive au niveau du commentaire (donc aprs l'appel de la procdure)?

4F. Variables, constantes, types


Avant de faire plusieurs exercices rcapitulatifs sur les modules, ce qui est totalement
indispensable, voyons d'abord les notions de variables, constantes et types. En ralit ces
notions sont directement lies aux modules.
Depuis le dbut de ce cours, vous avez dj manipul un grand nombre de variables de
types diffrents. Vous avez mme appris crer votre propre type (une structure). Dans
cette partie, vous allez avoir un rcapitulatif et un approfondissement de ces notions.
Vous allez aussi dcouvrir la notion de constante.
Vous aurez ainsi un dbut d'aperu de ce qui se passe en mmoire centrale.

Variables
Les variables sont prsentes dans vos programmes depuis le dbut de ce cours. Reprenons
et largissons ces connaissances.

Dfinition
Une variable est une zone mmoire nomme, type et dont le contenu est susceptible
de varier lors de l'excution d'un programme.

8 2944 TG PA 00

Effectivement, pour chaque variable, une zone mmoire lui est attribue.
Au moment de la dclaration d'une variable, vous lui donnez un nom et vous prcisez
son type. Le type va permettre l'ordinateur de dcider la taille attribue la variable
dans la mmoire centrale.
Une variable ainsi dfinie peut ensuite tre manipule dans le programme: il est possible
d'exploiter son contenu et de le changer.

initialisation d'une variable


Attention, certains langages initialisent les variables avec une valeur par dfaut, suivant
leur type (0 pour les types numriques et une chaine vide symbolise par "" pour les
types chaines), mais d'autres langages, comme le C++, ne touchent pas la mmoire tant
qu'une valeur n'est pas affecte. Ca veut dire que la variable, une fois dclare, peut trs
bien contenir n'importe quoi, rsidu du contenu de cette case lors de l'excution d'un
autre programme.

O Moralit: il faut toujours initialiser une variable avant de l'exploiter.


Que signifie exploiter une variable? L'afficher, l'utiliser dans un calcul, l'affecter une
autre variable...

Variables locales
Une variable locale est une variable dclare dans un module, voire dans un bloc, accessible uniquement dans ce module, ou ce bloc, et libre de la mmoire en fin de vie du
module, ou du bloc.
Vous avez appris utiliser uniquement ce type de variables jusqu' maintenant.
Un bloc est un groupe de lignes dlimit par un dbut et une fin : par exemple une
boucle reprsente un bloc, la partie "alors" d'un test reprsente aussi un bloc.
Il est toujours conseill de n'utiliser que des variables locales car elles aident la lisibilit
d'une application: on sait prcisment dans quel module elles sont utilises.

Squence 1
Programmation
procdurale

Page 87

Variables globales
Voil une notion que vous ne connaissez pas encore.
Une variable globale est une variable dclare avant le programme principal, utilisable
et modifiable dans tous les modules du programme et libre uniquement la fin de
l'excution du programme.
Au premier abord, l'utilisation de telles variables parait plus simple. Mais elles nuisent
la lisibilit d'un programme car on ne sait jamais trop o elles sont utilises. De plus,
elles prennent souvent de la place mmoire pour rien.
Les variables globales sont dclares avant mme le programme principal.

Constantes
Voil une nouvelle notion qui est cependant trs simple.

Dfinition
Une constante est une zone mmoire dans laquelle une valeur est affecte ds le dbut
de manire dfinitive, sans modification possible, pendant toute la dure de vie du
module concern ou du programme complet.
Une constante va donc pouvoir remplacer une valeur prcise, toujours la mme dans tout
le programme (ou module).

8 2944 TG PA 00

Voil comme une constante est dclare et initialise:


N = 500
PI = 3.1416
SIGNATURE = "++Emds"
Aucun type n'est prcis: l'ordinateur repre le type par rapport l'information qui est
affecte dans la constante.
Comme pour les variables, le nom est libre, mais par convention les noms des constantes
sont en majuscule.

Pourquoi des constantes?


Il faut viter au maximum de mettre des valeurs directement dans le programme. En
effet, en cas de modification d'une valeur (par exemple la taille d'un tableau), vous
risquez d'avoir beaucoup de choses modifier si la valeur se rpte plusieurs fois (par
exemple comme valeur maximum de plusieurs boucles). Il y a le problme aussi de
rechercher toutes les positions de cette valeur pour la modifier. En mettant directement
la valeur plusieurs fois dans un programme, on augmente le risque d'erreur.
La constante va permettre d'liminer ce risque et de faciliter la modification.
Voici un exemple

Squence 1
Programmation
procdurale

Page 88

programme test
const
N = 500
var
tab[1..N]: entier: entier
k: entier
debut
pour k de 1 N
...
finpour
...
fin
Remarquez que N est utilis pour fixer la taille du tableau, et pour boucler (de toute
vidence aussi sur le tableau. Sans passer par une constante, on pourrait retrouver la
valeur 500 plusieurs fois dans le programme. Et si un jour on a envie de changer la taille
du tableau, il faudrait rechercher dans tout le code la prsence du 500, sachant qu'une
simple recherche ne suffit pas car la valeur 500 est peut-tre aussi prsente dans le code
pour une autre raison qui n'a rien voir. Du coup un simple rechercher/remplacer automatique est dangereux et peut provoquer des erreurs.
L'utilisation de la constante "N" vite ce genre d'erreur et permet une modification trs
simple de la taille du tableau.

Types
Vous avez manipul plusieurs types pour dclarer vos variables. Vous avez mme appris
crer un type (lors de la cration des tableaux de structures). Reprenons ces notions.

Dfinition
Un type est un format de zone mmoire, prdfini ou non, qui permet de dcrire (on dit
"typer") des variables.
Toutes les variables dclares doivent forcment tre types (sauf les constantes mais ce
ne sont pas des variables !).

8 2944 TG PA 00

Types prdfinis
Les types prdfinis sont les types existants offerts par le langage. Il existe quelques
variantes d'un langage l'autre, mais globalement on retrouve les mmes types:
numrique (ou plus prcisment "entier" ou "rel"), caractre, chaine, date, boolen.

Types non prdfinis


Il est toujours possible de dfinir ses propres types.
Comment le dfinir?
Dans un module, avant la dclaration des variables et aprs la dclaration des ventuelles constantes, vous pouvez dfinir vos types.
Vous avez dj dfini une structure, qui tait un type, afin de dclarer ensuite un tableau
de structure. La structure serait donc dfinir dans la partie "type", avant la partie "var"
qui permettrait de dclarer le tableau.
Quel genre de type?
Il n'y a pas que les structures qui peuvent tre des types prdfinis. Vous pouvez dfinir
n'importe quel type, par exemple un tableau car vous savez que vous aurez plusieurs
tableaux identiques dclarer.
Intrt
Crer ses propres types, c'est rendre le programme encore plus structur, plus propre.
Vous vitez encore une fois les rptitions. L'air de rien, vous commencez aussi entrevoir une notion plus complexe (la notion d'objet) qui sera un peu aborde dans la
squence suivante sur la programmation vnementielle, et nettement plus dans la troisime squence sur la programmation objet. Mais nous n'en sommes pas l...
Exemple
Voici quelques exemples de dfinition de types et d'utilisation de ses types pour dclarer
des variables:

Squence 1
Programmation
procdurale

Page 89

programme test
const
N = 100
type
vec[1..N]: entier
// ceci n'est pas une variable mais un type
sPersonne: structure
nom: chaine
dateNaiss: date
finstructure
var
compteur: entier
// variable d'un type prdfini
vac1, vec2: vec
// variables de type vec (donc 2 tableaux)
tabPers[1..N]: sPersonne // tableau de structure
...
Dans le programme "test", il ne sera pas possible d'utiliser directement "vec" car "vec"
n'est pas une variable mais un type dfini par le programmeur. Il n'est l que pour pouvoir dclarer des variables (ici, "vec1" et "vec2"). Donc dans le programme, il n'est possible d'utiliser que "vec1" et "vec2" qui sont de type "vec", donc des tableaux d'entiers
de 100 cases.
De mme, il n'est pas possible d'utiliser directement sPersonne qui n'est l que pour
dfinir d'autres variables: ici il sert dfinir les cases du tableau tabPers.

8 2944 TG PA 00

4G. Exercices rcapitulatifs


Voici plusieurs exercices pour contrler vos connaissances sur les notions de modules et
de gestion de mmoire.
Tous les exercices sont importants et rappelez-vous que cette partie du cours, sur les
modules est la partie la plus importante de l'anne. Ne passez pas la squence suivante
tant que vous ne vous sentez pas l'aise avec ces notions.

Exercice 48
Donner l'tat des variables a, b, c, d la fin de l'excution de cette squence algorithmique:
// squence
...
a 1
b 5
c calcul2 (b) - b
d calcul1 (a, calcul1 (b, c)) - 2
...

Squence 1
Programmation
procdurale

Page 90

8 2944 TG PA 00

// fonction calcul1
fonction calcul1 (E/S a: entier, E b: entier): entier
debut
a 3 * b - a
retourner (calcul2 (a) - 4)
fin
// fonction calcul2
fonction calcul2 (E x: entier): entier
debut
x 2 * x
retourner (x - 2)
fin

Exercice 49
Vous avez la squence algorithmique suivante (les variables sont toutes de type
entier):
...
i 0
repeter
i i + 1
afficher "valeur n",i, "="
saisir vec[i]
afficher "Continuer? "
saisir rep
jusqu' rep = "N" ou i = 10
...
k 0
repeter
k k + 1
afficher "valeur n",k, "="
saisir tab[k]
afficher "Continuer? "
saisir reponse
jusqu' reponse = "N" ou k = 10
...
On prend pour hypothse que i et k ne sont utiliss que comme indice de boucle et
leur contenu n'est pas exploit dans la suite du programme. De plus, les vecteurs
manipuls sont toujours de 10 cases.
crire une procdure paramtre qui va permettre de remplacer ces 2 groupes de
lignes par, chaque fois, un simple appel de la procdure.

Squence 1
Programmation
procdurale

Page 91

Exercice 50
Voici une procdure qui calcule une distance entre 2 valeurs (donc le rsultat doit
rester positif):
procedure distance (val1: entier, val2: entier, S result: entier)
debut
si val1 > val2 alors
result val1 - val2
sinon
result val2 - val1
finsi
fin
a) crire la squence algorithmique qui permet de saisir 2 valeurs et d'afficher la
distance entre ces 2 valeurs, en utilisant la procdure ci dessus.
b) Transformer la procdure en fonction.
c) Rcrire la squence algorithmique prcdente, cette fois en utilisant la fonction.
d) Pour ce genre de traitement, quelle est la meilleure solution? procdure ou fonction?

8 2944 TG PA 00

Exercice 51
crire la fonction boolenne qui reoit en paramtre 2 nombres entiers et qui
retourne vrai si ces 2 nombres sont gaux.

Exercice 52
crire la fonction qui reoit en paramtre 2 entiers et qui retourne le plus grand des 2.

Exercice 53
Vous avez votre disposition le type suivant (dj dclar):
s_pers: structure
nom: chaine
age: entier
finstructure
crire la fonction boolenne qui reoit en paramtre un vecteur de type s_pers, de
100 cases, ainsi qu'un entier contenant le nombre de cases effectivement remplies
dans le vecteur, et qui retourne vrai si le vecteur est entirement tri dans l'ordre
alphabtique sur le nom.
Rappel:
les chaines se comparent comme des nombres ("a" < "b", "alain" < "amlie")
Squence 1
Programmation
procdurale

Page 92

Exercice 54
crire la procdure qui reoit en paramtre un tableau de 100 cases partiellement
rempli de noms, et un entier contenant le nombre de cases effectivement remplies
dans le tableau. Cette procdure devra afficher les noms au rythme de 2 par lignes.
Tous les noms doivent tre affichs (mme s'il n'en reste qu'un afficher sur la dernire ligne).
Attention, pour afficher 2 informations sur la mme ligne, vous devez les afficher en
mme temps:
afficher info1, info2
On prend donc pour hypothse que si vous mettez 2 affichages diffrents, ils seront
mis sur 2 lignes diffrentes.

Exercice 55
Deux entiers sont dits amis si les sommes des chiffres les composant sont identiques.
crire la fonction boolenne Amis qui reoit en paramtre 2 nombres entiers et qui
retourne vrai s'ils sont amis.
Petite aide : avant d'crire cette fonction, il est conseill d'crire une fonction qui
reoit en paramtre un nombre et qui retourne la somme des chiffres qui constituent
ce nombre.

8 2944 TG PA 00

4H. Passage sur machine


nouveau vous allez pouvoir faire des tests cette fois sur machine. Dans un premier
temps, vous pouvez traduire certains algos, puis vous allez faire le TP mastermind.
Vous avez crit plusieurs algorithmes sur les modules. Vous allez pouvoir en traduire
certains en C++ si vous le dsirez. Attention, il faudra chaque fois crer un programme
principal qui fait appel au module.
Voici quelques conseils si vous voulez vous lancer dans certaines traductions d'exercices:
exercice 50: pensez afficher, en fin de squence, les variables demandes;
exercice 53: crer un programme principal qui permet de boucler sur la saisie de
2nombres et qui affiche, chaque fois, un message prcisant si ces 2 nombres sont
gaux ou non;
exercice 54: crer un programme principal qui permet de boucler sur la saisie de
2nombres et qui affiche, chaque fois, le plus grand des 2;
exercice 57: crer un programme principal qui permet de boucler sur la saisie de
2nombres et qui affiche, chaque fois, un message prcisant si ces 2 nombres sont
amis ou non.
Les corrections ne sont pas fournies puisque vous avez dj les corrections des algorithmes correspondants.
pas qu'en C++, les modules doivent tre dclars (crits) avant d'tre
O N'oubliez
utiliss.

TP 2
Vous pouvez raliser le TP2 que vous trouverez dans le fascicule de TP correspondant
ce cours.

Squence 1
Programmation
procdurale

Page 93

8 2944 TG PA 00

Synthse

Squence 1
Programmation
procdurale

Page 94

8 2944 TG PA 00

Structures algorithmiques
// structure d'un programme
programme nomDuProgramme
// dclarations
nomVariable: typeVariable
...
debut
// instructions
...
fin
// saisie dans une variable
saisir nomVariable
// affichage d'un message en toute lettre
afficher "bonjour tous"
// affichage du contenu d'une variable
afficher uneVariable
// affichage d'une valeur numrique
afficher 3
// affichage d'un calcul
afficher (uneVariable * 3)
// affichage d'une combinaison texte/variable
afficher "Bonjour " + unPrenom + " !"
// affectation d'une valeur dans une variable
uneVariable "bonjour"
uneAutreVariable 3
// affectation du contenu d'une variable dans une autre
uneVariable uneSecondeVariable
// calcul partir de valeurs fixes
uneVariable (2 * 9) / 3
// calcul partir de variables
uneVariable uneAutreVariable * 5
// traitements excuter si la condition est vraie
si condition alors
traitements(s)
finsi
// traitements excuter si la condition est vraie ou
// autres traitements excuter si la condition est fausse
si condition alors
traitements(s)
sinon
traitements(s)
finsi

// cas de (si multiple)


cas de variable
valeur1: traitement(s)
...
valeurN: traitement(s)
sinon
traitement(s)
fincas
// boucle tantque
tantque conditionPourBoucler
traitement(s)
fintantque
// boucle rpter
repeter
traitement(s)
jusqu' conditionPourSortir
// boucle pour
pour cpt de depart arrivee [pas de pas]
traitement(s)
finpour
// concatnation de chanes
uneVariable unePremiereVariable + uneSecondeVariable
// longueur d'une chane
uneLongueur longueur(uneChaine)
// extraction d'une chane
uneAutreChaine extraire(uneChaine, depart, [longueur])
// recherche d'une sous-chane dans une chane
unePosition recherche(unSousChaine, uneChaine)
// frquence de la prsence d'une sous-chane dans une chane
laFrequence frequence(unSousChaine, uneChaine)
// conversion d'une chane en numrique
unNombre val(uneChaine)
// conversion d'une valeur numrique en chaine
uneChaine str(unNombre)
// valeur absolue d'un nombre
unNombre abs(unAutreNombre)
// partie entire d'un nombre
unNombre ent(unAutreNombre)
// tableau 1 dimension
tab[1..N]: typeCases // dclaration
afficher tab[k] // exemple d'utilisation
// tablau 2 dimensions
tab[1..N, 1..M]: typeCases // dclaration
afficher tab[i, j] // exemple d'utilisation
// tableaux de structures
uneStructure: debut // dclaration d'un type de structure
var1: type1
varN: typeN
finstructure
tabS[1..N]: uneStructure // dclaration
afficher tabS[k].var1 // exemple d'utilisation

Squence 1
Programmation
procdurale

Page 95

8 2944 TG PA 00

// dclaration d'une procdure


procedure nomProc (param1:type, ..., paramN:type)
// dclarations locales
debut
// traitements
...
fin
// utilisation d'une procdure
nomProc (valeur1, ..., valeurN)
// dclaration d'une fonction
fonction nomFonc (param1:type, ..., paramN:type): typeRetourn
// dclarations locales
debut
// traitements
...
retourner valeur
fin
// exemple d'utilisation d'une fonction
uneVariable nomFonc (valeur1, ..., valeurN)

Squence 1
Programmation
procdurale

Page 96

Paramtres
E (ou rien) : paramtre en entre (reoit une valeur mais ne modifie pas la
variable associe)
E/S: paramtre en entre/sortie (est associ une variable: reoit la valeur de la
variable et toute modification du paramtre modifie la variable)
S: paramtre en sortie (idem E/S mais ne reoit pas de valeur)
Variables, constantes, types
Variable globale : dclare avant le pogramme et visible partout ( limiter car
difficile de savoir o elle est utilise et prend de la place mmoire pour rien)
Variable locale: dclare dans un module ou un bloc et visible uniquement dans
ce module, ou ce bloc ( favoriser)
Constante : case mmoire recevant une valeur fixe ( favoriser pour viter de
mettre des valeurs en dur dans le programme)
Type : format de case mmoire prdfini ou non, servant pour dclarer des
variables
Optimisation
Lisibilit: attention aux indentations, aux commentaires et aux noms des variables
temps: viter les rptitions et les boucles imbriques inutiles
Espace : viter les variables inutiles (en particulier les tableaux lorsque ce n'est
pas ncessaire)
Fonctionnel: faire des modules pour structurer le programme et viter les rptitions
Erreurs et tests
Faire le maximum de tests (jeux d'essais).
Utiliser les possibilits de dbuggages offertes par l'IDE.

8 2944 TG PA 00

Squence 2

Programmation vnementielle
La programmation vnementielle va vous permettre de dcouvrir la programmation
dans un environnement graphique.

X Prrequis
Avoir acquis les notions de base de la programmation procdurale (ordres
algorithmiques fondamentaux comme les affectations, saisies, affichages, tests
et itrations, mais aussi les tableaux et structures, ainsi que les procdures et
fonctions paramtres). De prfrence avoir quelques connaissances en C++,
mais ce n'est pas une obligation. Le plus simple est d'avoir ralis la squence 1.

X Capacits attendues en fin de squence


Savoir crer et manipuler des objets graphiques, avoir compris les notions de
proprits, mthodes, vnements et savoir crire du code vnementiel.

X Contenu

Squence 2

1. Initiation aux rgles d'IHM ........................................................................... 98

Programmation
vnementielle

2. Procdural contre vnementiel ................................................................ 104


3. Objets graphiques de l'vnementiel ........................................................ 109

Page 97

4. Utilisation des objets graphiques ............................................................... 112


5. Algorithme en vnementiel ...................................................................... 113
6. Les trois modes de programmation ........................................................... 114
7. Les trois types d'vnements ..................................................................... 115
8. Exercices rcapitulatifs ................................................................................ 115

9.

......................................................................................................................
125
Synthse

8 2944 TG PA 00

1.

Initiation aux rgles d'IHM

Pour le moment, dans vos premiers pas de programmeurs, vous avez travaill dans des
interfaces non graphiques. Avant d'aborder la programmation graphique, voyons un
rapide aperu des diffrentes interfaces et des rgles qui y sont associes.

1A. Qu'est-ce qu'une IHM?


IHM: Interface Homme-Machine
L'IHM reprsente l'intermdiaire entre l'homme et la machine. Il permet donc la communication entre ces deux acteurs. travers l'IHM, la machine va pouvoir transmettre
l'homme des informations (en affichant un message...), et c'est aussi l'aide de l'IHM
que l'homme va pouvoir transmettre des informations (en cliquant sur un bouton, par
exemple).
Le but de l'IHM est de faciliter la communication. travers le temps, les IHM sont devenues de plus en plus conviviales et intuitives.
Les premires IHM ncessitaient de la part des utilisateurs une connaissance assez pointue des fonctionnalits de l'ordinateur. l'heure actuelle, les IHM sont trs intuitives et
ne ncessitent plus aucune connaissance (lorsqu'elles sont bien faites).

volution

Squence 2
Programmation
vnementielle

Dans le domaine des IHM, de gros progrs ont t faits depuis les dbuts de l'informatique:
avant 1975: IHM avec voyants lumineux;
1975 - 1985: IHM de type texte (TUI);
1985 - 1995: IHM de type graphique (GUI);
depuis 1995: IHM de type orient objet (OOUI).

TUI: Text User Interface


Page 98

Mode d'affichage: texte


Unit d'affichage: caractre (bas sur le code ascii)
Par rapport aux voyants lumineux, le progrs est considrable: l'information est lisible
et comprhensible par une personne non spcialiste.
Pour le moment, vous n'avez programm que dans ce mode d'affichage. Voici le genre
d'affichage que vous pouvez obtenir en TUI:

GUI: Graphic User Interface


Mode d'affichage: graphique
Unit d'affichage: pixel (point)
Par rapport au TUI, le progrs est encore une fois considrable: il est possible de dessiner donc de jouer sur l'illusion du rel (des dessins qui ressemblent par exemple des
boutons). Il y a aussi, en mme temps que la rvolution graphique, l'introduction d'un
nouvel outil de "saisie" d'information en plus du clavier: la souris. Cet outil de "pointage" permet de faciliter considrablement les manipulations.

8 2944 TG PA 00

Le GUI apporte la convivialit, la simplicit d'utilisation et un aspect visuel plus proche


du rel. En contrepartie, les ordinateurs doivent tre de plus en plus puissants car il faut
de plus en plus de ressources.
Voici quoi ressemblaient les premires interfaces graphiques:

Le travail sur le pixel permet enfin de faire des dessins "ralistes".


Avec l'introduction des GUI, la notion d'ergonomie prend tout son sens: il est possible de
travailler sur la prsentation des interfaces. C'est la naissance de l'illusion avec la notion
de mtaphore.

OOUI: Object Oriented User Interface


Mode d'affichage: graphique (objets)
Unit d'affichage: pixel (point)
A priori, on a le sentiment qu'il n'y a pas d'volution par rapport au GUI.
L'volution est pourtant trs importante : il est question d'objets graphiques donc de rutilisation d'objets.
L'ergonomie s'amliore, les illusions
visuelles sont de plus en plus utilises
avec en particulier l'introduction de la
visualisation 3D (les boutons...).
La zone de travail devient raliste: par
exemple, dans un traitement de texte,
on a le sentiment de travailler directement sur une feuille et ce que l'on
voit l'cran correspond exactement
au rsultat imprim. L'utilisation est
encore plus intuitive avec l'intgration
de liens entre documents et applications (il suffit de double cliquer sur le
document et l'application concerne
s'ouvre).

Squence 2
Programmation
vnementielle

Page 99

8 2944 TG PA 00

Concept WIMP
Window Icne Menu Pointeur
Ce concept est n avec la notion de fentre et l'introduction, la mme priode, du systme de pointage. Du coup, 4 notions sont interdpendantes et lies depuis les premiers
systmes d'exploitation graphiques.
Window: fentre qui permet d'excuter une application ( partir du moment o
les applications ont t excutes dans des fentres indpendantes, il a t possible
d'excuter plusieurs applications en mme temps);
Icne: pictogramme facilement identifiable visuellement (par exemple un bouton);
Menu: liste de commandes;
Pointeur: dispositif permettant de manipuler les objets graphiques de l'interface.

Concept WYSIWYG
What You See Is What You Get
Le concept WYSIWYG est la consquence de l'affichage graphique: puisqu'il est possible
de dessiner ce que l'on veut, il est alors possible de reprsenter visuellement la ralit (en
tout cas de s'en approcher le plus possible). C'est ainsi que, par exemple, les traitements
de textes montrent l'cran exactement ce que donnera l'impression.
Cela n'a pas toujours t le cas, loin de l ! Dans les premiers traitements de textes, en
mode texte, il fallait prciser par des balises les commandes appliquer. Par exemple,
pour demander que le mot "bonjour" soit imprim en gras, soulign et taille double, il
fallait crire dans le traitement de textes quelque chose dans ce genre:
Squence 2
Programmation
vnementielle

Page 100

<G><S><D>bonjour<D><S><G>
La balise <G> reprsente le gras, <S> le soulign et <D> le double.
Avec le concept WYSIWYG, on obtient l'affichage directement ceci, sans avoir entourer le texte de balises:

bonjour
Ainsi, la reprsentation l'cran correspond au rsultat imprim.

1B. Rgles de l'IHM


partir des TUI, des rgles de prsentation ont commenc natre. Avec les interfaces
graphiques, ces rgles se sont complexifies. La philosophie globale reste la mme :
l'interface est faite pour l'utilisateur et doit lui faciliter la tche.

But de l'IHM
Une IHM doit permettre l'utilisateur d'accomplir les tches proposes par le programme:
de faon efficace (on doit pouvoir raliser toutes les tches attendues);
en toute scurit (les manipulations doivent tre contrles pour viter les erreurs);
en prenant plaisir le faire (l'utilisation doit tre agrable et facile);
et aprs un apprentissage trs rapide.

Rgles classiques
Les premires IHM graphiques avaient gard certains dfauts directement lis aux interfaces textes: toutes les fonctionnalits taient spares et il fallait souvent changer de
fentres pour accder aux options voulues.

8 2944 TG PA 00

Par exemple, il y avait souvent une premire fentre ne contenant qu'un menu gnral
qui permettait ensuite d'accder diffrentes fentres (une pour la consultation, une
pour l'ajout, une pour la modification...).
Maintenant, le but est de regrouper les fonctionnalits portant sur les mmes informations dans une mme fentre.
L'autre rgle importante est la rgle des 3 clics: pour accder une fonctionnalit, on
ne doit jamais avoir besoin de faire plus de 3 clics.

Ergonomie
Le travail sur l'ergonomie fait appel des notions qui sortent du cadre de notre formation. Cela touche en ralit le mtier d'infographiste. Cependant, il n'est pas superflu
d'avoir quelques notions de base dans ce domaine.

Les 2 types d'applications


Toutes les applications ne se prsentent pas de la mme faon. Il existe deux types
d'applications qui ne suivent pas les mmes rgles:
les applications classiques (par exemple les applications de gestion): elles doivent
respecter l'ergonomie et les couleurs du systme d'exploitation utilis;
les applications spciales (jeux, multimdia...) : une personnalisation est possible
suivant le sujet trait.

Les 5 rgles ergonomiques


Voici les cinq rgles fondamentales qui doivent caractriser une interface:
cohrente : il faut garder les mmes rgles de prsentation (les objets similaires
doivent tre prsents de la mme faon et la mme position);
concise: il faut simplifier et rduire les manipulations (en regroupant les fonctionnalits et en respectant la rgle des 3 clics);
ractive : des retours d'informations (feedback) doivent tre proposs l'utilisateur, travers des messages (textuels ou visuels) prouvant que l'opration a bien
t effectue;
structure: le contenu doit tre organis de faon logique;
flexible: la prsentation doit tre modifiable pour s'adapter aux besoins et gots
de l'utilisateur.

Squence 2
Programmation
vnementielle

Page 101

pas des couleurs et attention aux contrastes. Il est souvent prfrable de


O N'abusez
faire simple.

Les pictogrammes
Les dessins sont favoriser: ils sont toujours plus parlants que les mots.
Par exemple, plutt qu'un bouton portant le mot "imprimer", faites le dessin d'une
imprimante:

La disposition
Le regard de l'utilisateur suit la lecture naturelle: lorsque vous lisez un livre, vous allez
de gauche droite et de haut en bas. Du coup, le parcours de pages de magazines se fait
en suivant cette rgle un peu plus rapidement, ce qui donne une lecture qu'on appelle
"en diagonale" allant du coin haut gauche au coin bas droit.
L'observation d'un cran suit cette mme rgle: c'est la lecture naturelle.

8 2944 TG PA 00

Le positionnement des objets graphiques doit suivre cette rgle par rapport l'ordre
d'utilisation des objets.

Les objets graphiques doivent aussi tre aligns le plus possible et les espaces vides
doivent tre minimiss.

Le focus

Squence 2
Programmation
vnementielle

Page 102

Le focus reprsente le positionnement du curseur. Il est important que le focus soit toujours l o on l'attend, donc sur l'objet qui est cens interagir ce moment-l.
Dans l'exemple ci-dessus, l'ouverture de la fentre il est logique de positionner le focus
sur la premire zone de saisie (l o l'on voit actuellement le "45"). Une fois que l'utilisateur a saisi une valeur et valid, il est logique de positionner le focus sur la deuxime
zone de saisie pour que l'utilisateur puisse rentrer une deuxime valeur. Aprs validation,
le focus ne doit pas se positionner sur la troisime zone de saisie (puisque cette zone est
remplie automatiquement lors du calcul) mais sur le premier bouton d'opration.
Il faut donc se mettre la place de l'utilisateur pour lui faciliter la tche. Mme si la souris est trs pratique d'utilisation, minimiser son utilisation au profit de raccourcis encore
plus performants est une bonne pratique.

Image et illusion
Le mode graphique permet d'exploiter les possibilits d'illusions cres par l'image.
Lorsqu'on observe une image qui prsente des simulations de zones d'ombre et de zones
claires, on obtient une illusion 3D. Mais en fait, cette illusion respecte une rgle bien
prcise: l'esprit pense toujours que la lumire vient du coin haut gauche de l'cran.
Vous n'en tes pas persuad? Alors observez ceci.
Voici une premire interface:

Vous avez le sentiment de voir des zones "creuses" qui vont vers l'arrire de l'cran (les
zones de saisie et d'affichage) et des zones "bombes" qui vont vers l'avant (les boutons). D'o vient cette illusion (car vous avez bien compris que, l'cran tant plat, ce n'est
qu'une illusion)? Vous pourriez penser que cela vient entre autres du fait qu'il y a des

8 2944 TG PA 00

grandes zones blanches (les zones de texte) et des grandes zones grises (les boutons).
Cela n'a en ralit aucune incidence.
N'oubliez pas: la lumire vient du coin haut gauche:

L'illusion est cre par les fins traits noirs qui reprsentent les zones d'ombre et les fins
traits blancs qui reprsentent les zones claires. Observez que chaque zone de "creux"
possde 2 cts avec des traits noirs (en haut et gauche) et 2 cts avec des traits blancs
(en bas et droite). Inversement, chaque zone de "bosse" possde 2 cts avec des traits
blancs (en haut et gauche) et 2 cts avec des traits noirs (en bas et droite).
Vous n'tes toujours pas persuad? Alors inversons l'image sans rien changer:
Squence 2
Programmation
vnementielle

Page 103

Cette fois vous voyez que les boutons donnent l'impression d'tre creuss alors que les
zones de texte ressortent. Vous voyez que trs nettement, le fait que les zones de texte
soient toutes blanches ne change absolument rien.
Ceci n'est qu'un exemple des possibilits d'illusions cres par les images.

8 2944 TG PA 00

Exercice 1
Imaginons que vous ayez rflchir sur la construction de l'IHM du jeu du nombre
cach (cette fois en mode graphique). Le nombre trouver sera cette fois gnr
alatoirement. Le joueur doit pouvoir saisir un essai et valider son essai en cliquant
sur un bouton. Un message s'affiche alors pour signaler si le nombre saisi est trop
grand ou trop petit.
Voici une proposition d'interface. Prcisez toutes les erreurs de cette interface et
faites une proposition de nouvelle interface.

Squence 2
Programmation
vnementielle

Page 104

2.

Procdural contre vnementiel

Vous avez normalement de bonnes connaissances en programmation procdurale. Ce


type de programmation vous permet de raliser des programmes qui s'excutent linairement, du dbut la fin, avec tout de mme des possibilits de tests (pour forcer ou
au contraire viter certaines instructions) et d'itrations (pour rpter plusieurs fois un
groupe d'instructions). Cela reste tout de mme de la programmation linaire qui force
l'utilisateur n'intervenir que lorsque le programme le dcide. La programmation procdurale classique s'excute dans un mode non graphique. Ceci dit, nous verrons que,
mme en faisant de la programmation vnementielle, voire de la programmation objet
(aborde dans un autre cours), les notions de procdural sont omniprsentes.
La programmation vnementielle va aborder les choses tout autrement, en laissant plus
de libert l'utilisateur qui va se trouver dans la position de dcider lui-mme quand

8 2944 TG PA 00

une action doit tre excute. Ce type de programmation ncessite un environnement


graphique pour offrir l'utilisateur des objets sur lesquels il va pouvoir interagir (boutons, zones de saisie, listes).
Pour illustrer tout ceci et bien voir la diffrence entre procdural pur et vnementiel,
voyons un exemple qui va tre dclin dans les 2 modes de programmation.

2A. Exemple de programme en procdural


Ce programme affiche un menu qui offre l'utilisateur la possibilit de faire la somme
ou la multiplication de 2 nombres. Le programme va boucler sur ces choix jusqu' ce que
l'utilisateur dcide d'arrter (3e choix du menu).
Programme Oprations
val1, val2: entier
choix: entier
dbut
choix 1
tantque choix 0
afficher "Ajouter 2 nombres ..............1"
afficher "Multiplier 2 nombres ...........2"
afficher "Fin du programme ...............0"
afficher "Votre choix:
"
saisir choix
si choix <> 0 alors
afficher "Saisir le 1er nombre: "
saisir val1
afficher "Saisir le 2me nombre: "
saisir val2
finsi
si choix = 1 alors
afficher val1, " + ", val2, " = ", (val1 + val2)
sinon
si choix = 2 alors
afficher val1, " * ", val2, " = ", (val1 * val2)
finsi
finsi
fintantque
fin

Squence 2
Programmation
vnementielle

Page 105

2B. Traduction et test en C++


Voyons la traduction de ce programme en C++. Cette version a t code sous Eclipse
mais peut tre ralise sous n'importe quel diteur accompagn d'un compilateur
standard C++ (ici, c'est le compilateur MinGW qui a t utilis). Vous trouverez dans les
sources que vous avez pu rcuprer avec ce cours, le fichier operations.cpp qui contient
le code source, et le fichier operations.exe que vous pouvez directement lancer pour
tester l'application.

8 2944 TG PA 00

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

// pour l'affichage et la saisie


// pour effacer l'cran

//--- Programme principal --int main() {


//--- Dclarations --int Val1, Val2, Choix = 1;
//--- Boucle sur le menu --while (Choix != 0) {
//--- Menu --printf("\nAjouter 2 nombres ..............1");
printf("\nMultiplier 2 nombres ...........2");
printf("\nFin du programme ...............0");
printf("\nVotre choix:
");
scanf("%d",&Choix);
system("cls");
//--- Saisie des 2 nombres --if (Choix != 0) {
printf("\nSaisir le 1er nombre: ");
scanf("%d",&Val1);
printf("\nSaisir le 2me nombre: ");
scanf("%d",&Val2);
};

Squence 2
Programmation
vnementielle

//--- Affichage du calcul suivant le choix --if (Choix == 1) {


printf("\n%d + %d = %d\n", Val1, Val2, (Val1+Val2));
} else {
if (Choix == 2) {
printf("\n%d * %d = %d\n", Val1, Val2, (Val1*Val2));
}
}

Page 106

}
return 0;
}
Que se passe-t-il lors de l'excution?
Une fentre s'ouvre pour obtenir l'affichage du menu:

8 2944 TG PA 00

ce moment-l, l'utilisateur n'a que 3 choix possibles. S'il voulait par exemple commencer par la saisie des 2 nombres avant de choisir le type d'opration, ce n'est pas possible.

S'il choisit le choix 1, la saisie du premier nombre lui est demande, puis ds qu'il a
valid, la saisie du second nombre lui est alors demande. Aprs validation, comme il
a demand dans le menu le choix de la somme, il obtient le message du calcul et du
rsultat. Juste aprs, le menu s'affiche nouveau pour qu'il puisse raliser une nouvelle
opration.
S'il choisit le choix 2, il devra nouveau saisir 2 nombres, mme s'il avait envie de faire
le calcul de la multiplication sur les mmes 2 premiers nombres.
Trs clairement, le programme s'excute dans un ordre bien prcis qui a t entirement
dcid par le programmeur.

2C. Mme exemple en vnementiel


Cette fois, basculons dans un environnement graphique qui offre l'utilisateur des
objets graphiques sur lesquels il va pouvoir interagir. Imaginons la fentre suivante:

Squence 2
Programmation
vnementielle

Page 107

On retrouve dans la fentre tous les objets graphiques ncessaires pour le bon fonctionnement de l'application:
2 zones de texte (txtValeur1 et txtValeur2) pour saisir les valeurs d'origine et 1 zone
de texte (txtResultat) pour afficher le rsultat du calcul;
2 boutons (cmdAjouter et cmdMultiplier) pour slectionner l'opration;
1 label (lblOperation) pour se souvenir de l'opration slectionne;
1 bouton (cmdEffacer) pour effacer les zones de texte, ce qui suppose que ces 2
zones de texte txtValeur1 et txtValeur2 gardent les valeurs saisies et du coup les
valeurs sont rutilisables, ce qui ajoute de la flexibilit au programme;
1 bouton (cmdQuitter) pour quitter l'application;
1 trait (lne1) juste pour l'esthtique de l'affichage.

8 2944 TG PA 00

Quelles sont les grandes diffrences par rapport la version procdurale?


l'utilisateur est matre de l'ordre d'excution: il peut dcider de saisir 2 nombres,
puis de cliquer sur l'opration voulue, ventuellement de cliquer sur la seconde
opration sans modifier les 2 nombres ou en n'en modifiant qu'un seul, etc. bref,
c'est lui qui choisit quel moment doit s'excuter une commande, en fonction des
objets graphiques qu'il va solliciter;
l'aspect visuel est nettement plus attractif et intuitif : l'opration est "pose"
pour tre plus claire (la ligne permet de bien voir la sparation entre la saisie des
nombres et l'affichage du rsultat), les dessins (signes d'oprations) sont plus parlants que le texte

2D. Traduction en VB6


Vous vous doutez bien que derrire certains objets graphiques se trouve du code qui va
s'excuter lorsque l'utilisateur le dcide. Par exemple, en cliquant sur le bouton qui porte
le signe "+", il va forcment se passer des choses, en particulier le calcul demand et
l'affichage dans txtResultat. Cette fois, au lieu d'avoir un seul programme qui s'excute
linairement, il existe une procdure par vnement, chaque procdure se dclenchant
lorsque l'vnement correspondant est sollicit.
Voici la traduction en Visual Basic 6 de ce petit programme.

Squence 2
Programmation
vnementielle

Page 108

'--- Si l'utilisateur clique sur le bouton Ajouter --Private Sub cmdAjouter_Click()


txtRsultat.Text = Val(txtValeur1.Text)+Val(txtValeur2.Text)
lblOpration.Caption = "+"
End Sub
'--- Si l'utilisateur clique sur le bouton Multiplier --Private Sub cmdMultiplier_Click()
txtRsultat.Text = Val(txtValeur1.Text)*Val(txtValeur2.Text)
lblOpration.Caption = "x"
End Sub
'--- Si l'utilisateur clique sur le bouton Quitter --Private Sub cmdQuitter_Click()
End
End Sub
'--- Si l'utilisateur clique sur le bouton Effacer --Private Sub cmdEffacer_Click()
txtValeur1.Text = ""
txtValeur2.Text = ""
txtRsultat.Text = ""
lblOpration.Caption = ""
End Sub
Vous retrouvez 4 procdures vnementielles indpendantes les unes des autres et qui
correspondent aux 4 boutons que peut solliciter l'utilisateur. Lorsque l'utilisateur saisit
des valeurs dans les zones de texte, il ne se passe rien, donc il n'y a pas de procdure
vnementielle correspondante. En revanche, ds qu'il clique sur l'un des 4 boutons,
il doit se passer des choses. Observez le code qui se trouve derrire chaque procdure
vnementielle pour mieux comprendre ce qui se passe. Les valeurs se trouvant dans

8 2944 TG PA 00

des zones de texte qui sont donc au format texte, vous remarquerez qu'il faut utiliser la
fonction Val pour transformer les textes en valeurs numriques afin de pouvoir raliser
les calculs ncessaires. Sans cette transformation, le + aboutirait la concatnation des 2
nombres (du genre 10+25 donnerait 1025) et le * aboutirait une erreur.
Vous pouvez tester cette application en lanant directement le fichier evenementiel.exe
qui se trouve dans les applications du cours que vous avez rcupres avec ce cours. Si
vous avez install VB6, vous pouvez aussi lancer le fichier prjCalcul.vbp qui reprsente le
fichier du projet: VB6 va alors s'ouvrir. C'est l'occasion de dcouvrir l'environnement de
ce langage (mme si vous allez le dcouvrir plus en dtail dans la suite de ce cours):

Squence 2
Programmation
vnementielle

Page 109

Pour visualiser la fentre, cliquez, dans la zone du projet, sur le "+" qui est gauche
de "feuilles" puis double cliquez sur "frmCalcul". La fentre de construction apparat.
Cliquez sur le bouton correspondant l'affichage du code (comme montr ci-dessus)
pour afficher le code de la fentre.
Vous pouvez excuter la fentre en cliquant sur la flche d'excution.

3.

Objets graphiques de l'vnementiel

Vous venez de dcouvrir qu'en programmation vnementielle, puisque le travail se fait


dans un environnement graphique, on manipule forcment des objets graphiques. Ces
objets existent dj et sont fournis dans l'environnement de dveloppement (quel que
soit le langage utilis). Il est possible aussi de crer ses propres objets graphiques mais
cela sort du cadre de ce cours.

3A. Caractristiques des objets graphiques


Chaque objet graphique est caractris par un aspect visuel et comporte:
des proprits qui dcrivent l'objet (position, taille, couleur, contenu les proprits correspondent des variables qui dcrivent l'objet);
des mthodes qui agissent sur l'objet (ajout d'un lment une liste les
mthodes correspondent des procdures ou fonctions lies l'objet);

8 2944 TG PA 00

des vnementsqui sont dclenchs suite une action sur l'objet (clic sur un bouton, saisie dans une zone de texte, dplacement d'un objet Il existe une importante liste d'vnements possibles sur chaque type d'objet).
Prenons le temps d'tudier le code de l'application exemple:
txtRsultat.Text
La proprit Text est une proprit commune tous les objets de type "zone de texte"
et permet d'accder et de modifier le contenu visuel de ce type d'objet.
lblOpration.Caption
La proprit Caption est une proprit commune tous les objets de type "label" et
permet d'accder et de modifier le contenu visuel de ce type d'objet. Contrairement
une zone de texte, un label sert juste afficher une information: l'utilisateur n'est pas
cens modifier son contenu.
cmdAjouter_Click()
L'vnement Click() est un vnement commun tous les objets de type "bouton" et
s'excute automatiquement ds que l'utilisateur clique sur le bouton concern.
End

Squence 2
Programmation
vnementielle

Page 110

Cette instruction, spcifique au langage, permet de fermer directement l'application


complte, mme si plusieurs fentres ont t ouvertes. Normalement, pour faire les
choses proprement, il faudrait fermer la fentre concerne.
Un objet graphique est aussi appel un contrle ou un contrle graphique (car il peut
tre "contrl" par l'utilisateur).

3B. Syntaxe algorithmique


L'exemple de code est en VB6 : vous vous doutez qu'il peut y avoir des nuances de
syntaxe suivant les langages utiliss. Chaque langage propose sa propre liste d'objets
graphiques (dont la plupart, il est vrai, sont assez standards) et les caractristiques qui
lui sont associes.
Comment alors crire un algorithme bas sur la programmation vnementielle ?
Vous ne pouvez pas inventer les objets ncessaires et les caractristiques (proprits,
mthodes et vnements) qui leurs sont associes. Donc, tout sujet demandant un algorithme vnementiel donne obligatoirement la liste des objets possibles avec le dtail de
leurs caractristiques. l'examen, mme si l'on vous place dans le cadre d'un langage,
la liste des objets graphiques vous sera donne.
Pour l'exemple prcdemment trait, voici ce que le sujet aurait d vous proposer.
Liste des objets graphiques:
objet

8 2944 TG PA 00

type

rle

frmCalcul

Feuille

fentre de l'application

txtValeur1

Texte

zone de saisie de la premire valeur

txtValeur2

Texte

zone de saisie de la seconde valeur

txtResultat

Texte

zone d'affichage du rsultat

cmdAjouter

Bouton

bouton pour dclencher l'ajout

cmdMultiplier

Bouton

bouton pour dclencher la multiplication

cmdEffacer

Bouton

cmdQuitter

Bouton

bouton pour effacer les affichages


bouton pour quitter l'application

lblOperation

Label

affichage du signe de l'opration

lne1

Ligne

dessin de la ligne de sparation

Notez le nom des objets graphiques : c'est le crateur du programme qui choisit leur
nom, comme n'importe quelle autre variable du programme. En revanche, les noms
des types sont donns. Donc, a priori, vous pouvez donner n'importe quel nom un
objet graphique. Cependant, comme il est habituellement conseill de donner des noms
"parlants" aux variables, le principe s'applique aussi pour les objets graphiques. On
va normalement mme plus loin dans cette logique en construisant gnralement les
noms avec les 3 premires lettres en minuscules pour rappeler le type d'objet graphique
(frm pour Frame, txt pour Text, cmd pour CommandButton, lbl pour Label) suivi du
nom explicite avec une lettre majuscule. Cette convention de notation est couramment
utilise. Remarquez que dans la liste, un seul objet n'a pas de nom "parlant": lne1. Il
commence bien par lne (pour Line) mais ensuite comporte un simple numro. Cela vient
du fait que l'objet n'a pas t renomm: chaque cration d'objet, le logiciel propose
des noms standards constitus gnralement de numros. Il est fortement conseill de
renommer les objets pour leur donner des noms explicites, cependant on se permet de
ne pas le faire quand les objets sont de la simple dcoration et ne seront pas sollicits
dans le code.
Liste des proprits des objets graphiques:
type d'objet

proprit

type

rle

Label

titre

chane

contenu textuel

Texte

texte

chane

contenu textuel

Pour chaque type d'objet, les proprits accessibles sont prcises avec leur type et leur
rle. Les proprits se manipulent comme des variables, except qu'il faut chaque fois
prciser l'objet concern.

Squence 2
Programmation
vnementielle

Page 111

Listes des mthodes des objets graphiques:


type d'objet
Feuille

mthode
fermer()

rle
ferme la fentre

Pour chaque type d'objet, les mthodes accessibles sont prcises avec leur signature
(paramtres et type de retour ventuel) et leur rle. Les mthodes se manipulent comme
des modules, except qu'il faut chaque fois prciser l'objet concern.
Liste des vnements pris en charge par les objets graphiques:
type d'objet
Bouton

vnement
clic()

intervient quand
l'utilisateur clique sur le bouton

Pour chaque type d'objet, les vnements accessibles sont prciss avec leur signature
(paramtres ventuels) et leur mode de dclenchement. Les vnements permettent
d'crire des procdures vnementielles qui se dclenchent lorsque l'vnement est
sollicit.

8 2944 TG PA 00

4.

Utilisation des objets graphiques

Vous l'avez vu dans l'exemple sous VB6, la syntaxe pour accder une proprit, une
mthode ou un vnement d'un objet graphique respecte des rgles prcises. Une proprit seule n'a pas de sens: il faut prciser l'objet concern. C'est valable aussi pour les
mthodes et les vnements.
L'oprateur "." (le point) permet de construire l'accs une proprit ou mthode:

.nomMthodeOuProprit. .nomMthodeOuProprit

nomObjet

mthode ou proprit de type


objet

objet

mthode ou proprit de type


simple

Il est possible d'accder une mthode ou une proprit d'un objet en mettant le nom
de l'objet, suivi d'un point puis du nom de la mthode ou proprit concerne. Quand
cette mthode ou proprit est elle-mme un objet (ce qui est possible !), alors il est
possible d'ajouter un point pour accder une mthode ou une proprit de ce nouvel
objet. Ceci est possible plusieurs fois, tant que la mthode ou la proprit est un objet.
Lorsque la mthode ou la proprit est de type simple (chane, entier, boolen) alors
la ligne s'arrte.
Squence 2
Programmation
vnementielle

Page 112

Voici quelques exemples algorithmiques:


'--- en passant par l'objet frmCalcul, il est possible d'accder
tous les objets graphiques contenus dans frmCalcul (donc par
exemple txtValeur1) et ainsi accder une proprit de l'objet
txtValeur1. Si le code est crit derrire la fentre frmCalcul,
prciser le nom de la fentre est optionnel. Si le projet comporte
plusieurs fentres, cela commence devenir intressant. --frmCalcul.txtValeur1.texte ""
'--- pour accder au contenu textuel d'un label --lblOperation.titre ""
'--- pour fermer la fentre --frmCalcul.fermer()
Attention, une mthode ou une proprit qui n'est pas prcde de l'objet concern n'a
pas de sens:
titre ""

"titre" tout seul n'a pas de sens:


"titre" de quel objet?

Le "_" (tiret) permet de construire l'en-tte d'une procdure vnementielle:

_nomvnement(paramtres ventuels)

nomObjet

objet

8 2944 TG PA 00

nom de l'vnement dclencheur

Attention, la syntaxe des vnements est donne: vous ne pouvez pas la modifier. Donc,
vous ne pouvez pas, par exemple, ajouter ou enlever des paramtres.

5.

Algorithme en vnementiel

En respectant les listes algorithmiques d'objets, de proprits, de mthodes et d'vnements qui viennent d'tre donnes, voici donc la syntaxe algorithmique du programme
prcdent:
procdure cmdAjouter_clic()
debut
txtRsultat.texte
Val(txtValeur1.texte)+Val(txtValeur2.
texte)
lblOpration.titre "+"
fin
procdure cmdMultiplier_clic()
debut
txtRsultat.texte=Val(txtValeur1.texte)*Val(txtValeur2.texte)
lblOpration.titre "x"
fin
procdure cmdQuitter_clic()
debut
frmCalcul.fermer()
fin
procdure cmdEffacer_clic()
debut
txtValeur1.texte ""
txtValeur2.texte ""
txtRsultat.texte ""
lblOpration.titre ""
fin

Squence 2
Programmation
vnementielle

Page 113

Dans des exercices crits, a priori vous aurez le choix du langage : vous pourrez donc
crire dans un langage ou en pseudo-langage (c'est dire en algorithmique). Les sujets
comporteront cependant toujours la liste prcise des objets utiliser ainsi que les proprits, mthodes et vnements accessibles. Il faudra systmatiquement vous limiter
au contenu du sujet, sans jamais ajouter de nouvel objet, proprit, mthode ou vnement, sauf si le sujet vous l'autorise explicitement.
Il faudra aussi bien respecter les noms donns ainsi que leur casse (majuscule/minuscule).

8 2944 TG PA 00

6.

Les trois modes de programmation

Maintenant que vous avez vu quoi pouvait ressembler la programmation vnementielle, faisons un rapide tour des 3 grands modes de programmation existants.

6A. Programmation procdurale (1960)


C'est le mode de programmation le plus ancien mais qui reste cependant totalement
d'actualit car les autres modes de programmation s'appuient obligatoirement sur lui.
L'excution du programme se fait dans un ordre prtabli par le programmeur. Il n'y a
qu'un seul dbut et une seule fin.
Un programme procdural pur s'excute dans un environnement non graphique.
Cependant, les autres modes de programmation utilisent les techniques du procdural
(avec par exemple des modules rutilisables) dans leur environnement graphique. On ne
parle alors plus de procdural pur.

6B. Programmation objet (1980)

Squence 2
Programmation
vnementielle

Page 114

C'est vritablement en 1980, avec le langage SmallTalk que ce type de programmation a


vu le jour. De nombreux langages ont alors pris la relve avec, en particulier, le C++ qui
reste l'ultime rfrence et qui est l'origine de la cration de nombreux autres langages.
La programmation objet utilise les outils du procdural en ajoutant la notion d'objet
(pour le moment, non graphique). Un objet reprsente une structure complexe qui peut
comporter des proprits qui lui sont propres et des mthodes qui peuvent agir sur lui.
Par exemple, il devient possible de crer des objets de la vie courante comme une facture
qui va contenir une liste d'articles, des quantits mais aussi sur laquelle il sera possible
d'interagir avec des mthodes pour ajouter ou enlever un article.
Ce principe de programmation a rvolutionn l'approche des applications. l'heure
actuelle, il reprsente une rfrence absolue et tous les nouveaux environnements sont
bass sur la programmation objet. Vous tudierez en dtail ce mode de programmation
dans un autre cours.

6C. Programmation vnementielle (1990)


La programmation vnementielle est ne bien sr aprs l'arrive des environnements
graphiques. C'est tout de mme en 1973 qu'est apparu le tout premier environnement
graphique (avec Xerox). Mais il faudra attendre quelques annes pour que ce systme
d'affichage par pixel, avec le principe de mtaphore (bouton) se gnralise. La programmation vnementielle s'est dmocratise plusieurs annes plus tard travers la
mise au point d'environnements intgrs de dveloppement comme Visual Basic version
1 (sorti en 1991).
La programmation vnementielle utilise les fondements de la programmation procdurale en ajoutant les possibilits de la programmation objet. La nouveaut provient
de la manipulation d'objets graphiques qui, en plus des proprits et mthodes de la
programmation objet classique, possdent des vnements et donc la possibilit d'crire
du code excutable lorsqu'un vnement est sollicit.
La programmation vnementielle permet de rendre les applications plus intuitives, en
particulier travers la cration d'applications graphiques bases sur la notion de mtaphore. Une application vnementielle bien construite doit permettre l'utilisateur de
trouver facilement comment accder l'option recherche.

8 2944 TG PA 00

7.

Les trois types d'vnements

travers l'exemple prsent dans cette squence, vous n'avez abord qu'un type d'vnement. En ralit il en existe 3.

7A. vnement externe


Un vnement externe est dclench par une action de l'utilisateur.
C'est le seul type d'vnement que vous avez abord. Sur le clic d'un bouton, la procdure vnementielle correspondante s'excute. Il existe de nombreux vnements
externes possibles, spcifiques chaque type d'objet. Pour simplifier, chaque fois que
l'utilisateur peut interagir sur un objet graphique (clic, double-clic, clic-droit dplacement, saisie, changement de taille, slection), il est possible d'crire une procdure
vnementielle qui correspond l'vnement. Suivant les environnements graphiques,
ces possibilits sont parfois un peu plus limites mais restent tout de mme trs importantes.

7B. vnement interne


Un vnement interne n'est pas directement dclench par une action de l'utilisateur.
Elle est dclenche par un changement d'tat interne.
Par exemple, au dmarrage de l'application, il est possible de solliciter l'vnement
correspondant. Autre cas possible: un vnement peut se dclencher automatiquement
suite une modification du contenu d'un objet, modification non ralise par un utilisateur mais par une opration interne (par exemple, si au chargement d'une fentre vous
remplissez une liste d'informations partir d'une base de donnes, vous pouvez faire
en sorte qu'un autre objet graphique se mette jour automatiquement pour afficher le
nombre de lignes contenues dans la liste).

7C. vnement inter-application


Ce type d'vnement, trs diffrent des 2 prcdents, offre la possibilit d'changer des
informations entre applications. Il est cit titre informatif mais ne sera pas abord dans
ce cours.

8.

Squence 2
Programmation
vnementielle

Page 115

Exercices rcapitulatifs

Ces exercices vont vous permettre de vous familiariser avec la syntaxe algorithmique de
la programmation vnementielle. Ils sont progressifs, donc il est conseill de les traiter
dans l'ordre.
Vous allez dcouvrir de nouveaux objets graphiques avec des proprits, mthodes et
vnements que vous ne connaissez pas encore. Le but est aussi de contrler votre pouvoir d'adaptation un nouveau contexte.
Attention, vous devez respecter scrupuleusement les consignes des exercices : vous ne
devez pas inventer de nouveaux objets, proprits, mthodes ou vnements mais vous
limiter ceux donns dans le sujet. Les indications d'un sujet ne peuvent pas non plus
servir un autre sujet.
Dernire remarque avant de commencer : chaque exercice est normalement ralisable
en une heure. Cela va vous permettre de voir votre progression au cours du temps. Au
dbut, ne soyez pas dcourag si vous mettez plus de temps. Ne passez pas non plus
un autre exercice si vous n'avez pas bien assimil la correction.

8 2944 TG PA 00

Exercice 2
Vous devez crer une petite application qui permet de visualiser en direct le rsultat du choix d'une police d'criture. Voici l'interface de l'application :

Vous trouverez en Annexe la liste des objets et types de l'application ainsi que les
seuls proprits, mthodes et vnements auxquels vous avez droit.
Travail faire

Squence 2
Programmation
vnementielle

Page 116

1. crire le code qui va permettre de fermer la fentre.


2. crire le code qui va permettre de supprimer un lment de la liste des polices
(lstPolice). Attention, avant de supprimer, il faut s'assurer qu'une ligne est bien
slectionne, sinon on ne fait rien.
3. crire le code qui va permettre de modifier l'apparence de lblVisu pour prendre
en compte la police qui vient d'tre slectionne dans lstPolice.
4. crire le code qui va permettre d'insrer dans lstPolice la police saisie dans txtPolice. Attention, il faudra au pralable vrifier que cette police n'est pas dj
prsente. Si elle est dj prsente, on ne fait rien.
5. crire le code qui doit s'excuter au chargement de la feuille et qui doit initialiser le label de visualisation avec la phrase "Voici le rsultat", puis qui doit
remplir la liste des polices avec les polices dj installes sur le disque. Pour cela,
vous avez votre disposition la procdure recupPolice :
procdure recupPolice (S tabPolice [1500]: chaine, S nbPolice : entier).
Cette procdure possde donc 2paramtres en sortie: tabPolice contiendra en
sortie la liste des polices installes sur l'ordinateur, et nbPolice contiendra en
sortie le nombre de polices prsentes dans le tableau. Au dpart IstPolice est
vide.
Annexe
Liste des types d'objets :
Type d'objet

8 2944 TG PA 00

Rle

Fenetre

Type graphique symbolis par une zone d'affichage permettant de regrouper plusieurs
objets graphiques.

Texte

Type graphique symbolis par une zone de saisie et de visualisation de texte.

Label

Type graphique symbolis par une zone de visualisation de texte.

Bouton

Type graphique symbolis par une zone d'interaction directe avec l'utilisateur
(activation par clic).

Font

Type non graphique permettant de grer les caractristiques d'une police d'criture.

Liste des objets graphiques (les contrles) :


Objet

Type

Rle

frmVisu

Fenetre

Fentre de l'application.

txtPolice

Texte

Zone de saisie pour un nouveau nom de police. Lorsque l'utilisateur valide


sa saisie, ce nom doit s'insrer dans la liste des polices.

lstPolice

Liste

Liste des polices. Lorsque l'utilisateur slectionne une police, celle-ci doit
tre applique au label de visualisation.

lblVisu

Label

Label de visualisation qui permet de voir l'effet de la police choisie.

cmdSuppr

Bouton

Bouton qui permet de supprimer l'lment slectionn dans la liste


des polices.

cmdQuitter

Bouton

Bouton qui permet de fermer la fentre.

Proprits des types d'objets :


Type d'objet
Liste

Proprit

Type

Signification

slectionn

boolen

Vrai si un lment est slectionn dans la liste.

nbElements

entier

Nombre d'lments de la liste

numSelect

entier

Numro de l'lment slectionn dans la liste.

element

tableau de chaine

Tableau contenant les lignes de la liste

Label

font

font

Informations sur la police d'criture du label

titre

chaine

Contenu du label

Font

nom

chaine

Nom de la police d'criture

Texte

text

chaine

Contenu de la zone de texte

Mthodes des types d'objets :


Type d'objet

Mthode

Rle

Fenetre

fermer()

Ferme la fentre

Liste

enlever(indice : entier)

Supprime l'lment de la liste qui se trouve l'indice pass en


paramtre

ajoute(element :
chaine)

ajoute(element : Ajoute en fin de liste l'lment pass en


paramtre

Squence 2
Programmation
vnementielle

Page 117

vnements sur les types d'objets :


Type d'objet

vnement

Intervient quand

Bouton

Clic

L'utilisateur a cliqu sur le bouton

Liste

Clic

L'utilisateur a cliqu sur un lment de la liste

Texte

Valide

L'utilisateur valide dans la zone de texte

Fenetre

Chargement

La fentre s'ouvre

Remarques :
Les indices de listes commercent 1.
L'ajout d'lments dans une liste doit obligatoirement se faire avec la mthode
ajoute.
La suppression d'lments dans la liste doit obligatoirement se faire avec la
mthode enlve.
Ces 2 mthodes mettent jour automatiquement la proprit nbElements.

8 2944 TG PA 00

Exercice 3
Vous devez raliser une petite application dans un environnement vnementiel
graphique. Cette application doit permettre d'couter de la musique suite une
slection de fichiers provenant des disques locaux.
Voici l'interface de l'application:

Squence 2
Programmation
vnementielle

Page 118

Description du fonctionnement de l'application


Au chargement de la fentre, la liste lstFichiers se rempli de tous les fichiers musicaux
qui se trouvent sur les disques locaux. La liste lstSelection est vide (vous n'aurez pas
crire le code du chargement de la fentre).
Si l'utilisateur clique sur le bouton cmdAjouter, le fichier slectionn dans la liste de
gauche (lstFichiers) est copi dans la liste de droite (lstSelection). Cette copie ne peut
se faire que si un fichier est effectivement slectionn dans la liste de gauche, et si ce
fichier n'est pas dj prsent dans la liste de droite, sinon rien ne se passe.
Si l'utilisateur clique sur le bouton cmdAjouterTout, la liste de droite est d'abord
vide puis tous les fichiers de la liste de gauche sont copis dans la liste de droite.
Si l'utilisateur clique sur le bouton cmdSupprimer, le fichier slectionn dans la liste
de droite sera supprim (vous n'aurez pas crire le code de ce bouton).
Si l'utilisateur clique sur le bouton cmdVider, la liste de droite est totalement vide.
chaque fois qu'une modification est apporte la liste de droite, le label lblNbSelection doit tre mis jour (il contient le nombre de fichiers prsents dans la liste
de droite).
Si l'utilisateur clique sur le bouton cmdJouer, les musiques de la liste de droite sont
joues (vous n'aurez pas crire le code de ce bouton).
Si l'utilisateur clique sur le bouton cmdQuitter, la fentre se ferme.
Travail faire
crire l'algorithme du code qui doit s'excuter derrire les boutons:
1. cmdQuitter
2. cmdVider
3. cmdAjouterTout
4. cmdAjouter
Au niveau des objets graphiques, vous n'avez le droit d'utiliser que les outils qui vous
sont donns en annexe.

8 2944 TG PA 00

Annexe
Liste de contrles:
Objets

Rle

frmMusique

Fentre

cmdAjouter

Bouton

cmdAjouterTout

Bouton

cmdSupprimer

Bouton

cmdVider

Bouton

cmdQuitter

Bouton

cmdJouer

Bouton

lstFichiers

Liste

lstSelection

Liste

lblNbSelection

Label

Proprits de contrles:
Contrle

Proprit

Type

Signification

Label

Titre

Chane

Contenu du label

Liste

Element

Tableau de chanes

Contient les valeurs des lments contenus dans la liste


(la numrotation commence 1)

NbElements

Entier

Nombre d'lments prsents dans la liste

NumSelect

Entier

Indice de l'lment slectionn (=0 si aucun lment


n'est slectionn)

Mthodes de contrles:
Contrle

Squence 2
Programmation
vnementielle

Page 119

Mthode

Rle

Fentre

Fermer()

Ferme la fentre

Liste

Ajouter(lment: chaine)

Ajoute l'lment la liste.

Supprimer(indice: entier)

Supprime l'lment qui se trouve la position "indice" dans


la liste. Tous les lments suivants sont automatiquement
renumrots (il n'y a donc pas de dcalages grer).

vnements sur les contrles:


Contrle
Bouton

vnements
Clic

Intervient quand ...


L'utilisateur a cliqu sur le bouton

Remarques:
L'ajout d'lments dans une liste doit obligatoirement se faire avec la mthode
Ajouter.
La suppression d'lments dans la liste doit obligatoirement se faire avec la mthode
Supprimer.
Ces 2 mthodes mettent jour automatiquement la proprit NbElements.

8 2944 TG PA 00

Exercice 4
Vous allez crer une petite application qui va servir de convertisseur de monnaie.
Voici quoi ressemble la fentre de l'application. Les noms des objets que vous aurez
manipuler sont mentionns.

Cette fentre frmConvert est appele partir d'un module que vous n'avez pas
crire. Ce module se charge de remplir un tableau partir d'une base de donnes.
Voici la dclaration du tableau en question, qui est dclar en global de l'application
complte:
s_convert: structure
nom: chaine
valeur: rel
finstructure
Squence 2
Programmation
vnementielle

Page 120

// contient le nom de la monnaie


// contient la valeur de la monnaie

t_convert[1..50]: s_convert
Vous disposez aussi d'une autre variable globale, initialise dans le mme module:
maxConvert. Cette variable, de type entier, contient le nombre de lignes effectivement remplies dans le tableau t_convert.
Au moment de l'ouverture de la fentre frmConvert, le tableau t_convert et la
variable maxConvert sont donc dj remplis. Vous pouvez les utiliser quand vous en
avez besoin.
Vous trouverez en annexe une explication dtaille du fonctionnement de la fentre
ainsi que la liste des objets avec les proprits, mthodes et vnements qui leurs
sont associs.
Vous avez aussi votre disposition les fonctions suivantes, que vous pouvez donc
utiliser:
Val (valeur: chaine): numrique
// converti le contenu de valeur en numrique
Str (valeur: numrique): chaine
// converti le contenu de valeur en chaine
Travail faire
1. crire la procdure vnementielle qui va permettre de fermer la fentre.
2. crire la procdure vnementielle qui permet de mettre jour txtConvert ds
qu'il y a modification dans txtEuro.
3. crire la procdure vnementielle qui doit s'excuter quand l'utilisateur slectionne une nouvelle monnaie dans cboMonnaie.
4. crire la procdure vnementielle qui doit s'excuter au chargement de la
feuille.

8 2944 TG PA 00

Annexe
Explication du fonctionnement de la fentre
cboMonnaie permet de slectionner une monnaie. Cette slection a pour incidence
la modification de txtValeur (affichage de la valeur correspondant la monnaie
slectionne) ainsi que le label lblMonnaie qui affiche le nom de la monnaie slectionne. txtConvert est alors automatiquement recalcul en fonction de la nouvelle
monnaie. Si un nouveau montant est saisi dans la zone txtEuro, alors (au fur et
mesure de la saisie ou modification, c'est--dire " la vole" sans attendre la validation) la zone txtConvert est recalcule.
Au chargement de la fentre, le combo est rempli des noms de monnaies provenant
du tableau t_convert (non vide) et se positionne automatiquement sur la premire
monnaie de la liste. Ce qui suppose que tous les traitements concernant le choix
d'une nouvelle monnaie sont raliss (remplissage de txtValeur et de lblMonnaie).
Liste des objets graphiques avec leur type:
Nom d'objet
frmConvert

Type

Rle

fentre

fentre de l'application

txtValeur

texte

contient la valeur de conversion correspondant la monnaie slectionne


dans cboMonnaie

cboMonnaie

combo*

contient la liste des noms des monnaies et ne fait apparatre que le nom
slectionn

lblMonnaie

label

contient le nom de la monnaie slectionne

txtEuro

texte

permet de saisir un montant en Euro

txtConvert

texte

affiche la conversion du montant en Euro, dans la monnaie slectionne

cmdQuitter

bouton

permet de fermer la fentre

*Un objet de type combo fonctionne avec la mme logique que les listes except qu'il peut s'ouvrir et se
fermer (en utilisant la petite flche). Quand il est ferm, il ne laisse apparatre que la ligne slectionne.

Squence 2
Programmation
vnementielle

Page 121

Liste des proprits des objets graphiques:


Type d'objet

Proprits

Type

Signification

label

titre

chane

texte du label

texte

txt

chane

contenu du texte

combo

numSelect** entier

numro de la ligne slectionne

element

tableau de chaines

chaque case contient une ligne du combo

nbElement

entier

nombre d'lments du combo

** Dans un combo, la numrotation des lignes commence 1.

Liste des mthodes des objets graphiques:


Type d'objet

Mthodes

Rle

fentre

fermer()

combo

ajout(valeur: chaine)

le contenu de valeur est ajout la fin du combo

vider()

vide tout le combo

ferme la fentre

8 2944 TG PA 00

Liste des vnements pris en charge par les objets:


Type d'objet

vnements

Intervient quand ...

fentre

Chargement

texte

Changement

l'utilisateur est en cours de modification du texte

combo

Selection

l'utilisateur slectionne une ligne du combo

bouton

Clic

l'utilisateur click sur l'objet correspondant

la fentre s'ouvre

Exercice 5

Squence 2
Programmation
vnementielle

Page 122

Vous trouverez en annexe la liste de tous les lments du pseudo langage utiliser.
Le but est de crer un jeu qui gnre un nombre entre 1 et 100 puis qui permet un
joueur d'essayer de trouver ce nombre.
Voici la liste des objets de cette application, avec leur type correspondant:
Nom d'objet

MType objet

Rle dans l'application

frmJeu

feuille

lblJeu

label

Contient "Essai"

lblResultat

label

Contient les messages retourns "trop grand" ou "trop


petit" ou le rsultat final "Trouv en 5 essais"

txtJeu

texte

Permet de saisir l'essai du joueur

cmdNouveau

bouton

Dmarre un nouveau jeu

cmdArret

bouton

Arrte le jeu en cours

cmdQuitter

bouton

Ferme l'application

Contient tous les objets de l'application

crire tous les modules ncessaires pour que l'application fonctionne.


Informations complmentaires:
Vous avez votre disposition les fonctions suivantes (que vous n'avez donc pas
crire):
fonction NvNbre(min: entier, max: entier): entier
//retourne un nbre alatoire compris entre min et max.
fonction Str(valeur: entier ): chane // transforme un nombre en chaine
fonction Val(valeur: chane): entier //transforme une chaine en nombre

8 2944 TG PA 00

L'application doit permettre de dmarrer un nouveau jeu : il faudra alors gnrer


un nouveau nombre, activer la zone de texte et la vider, activer le bouton Arrt et
dsactiver le bouton Nouveau. Ds que l'utilisateur saisit un nombre et valide, un
message doit lui prciser si le nombre est trop petit ou trop grand. La zone de saisie
est remise blanc. tout moment, l'utilisateur peut arrter la partie en cours: dans
ce cas, la zone de saisie doit redevenir vide et inactive, le bouton Nouveau doit redevenir actif alors que le bouton Arrt repasse inactif. Si l'utilisateur arrive trouver le
nombre, un message doit l'en avertir et lui prciser le nombre d'essais de l'utilisateur
pour trouver le nombre. Puis toutes les manipulations qui concernent l'arrt du jeu
doivent tre faites (dsactivation de la zone de saisie).
Le bouton quitter permet simplement d'arrter l'application.
Pensez crer des procdures non vnementielles pour viter d'crire plusieurs fois
la mme chose.
Vous avez totalement le droit:
de dclarer des variables globales ;
dappeler, dans une de vos procdures, une autre procdure vnementielle ou non
vnementielle.
Annexe
Liste des proprits des objets graphiques:
Type d'objet

Proprits

label

titre

chane

texte du label

texte

txt

chane

contenu du texte

actif

boolen

active/dsactive* l'objet

actif

boolen

active/dsactive* l'objet

bouton

Type

Signification
Squence 2

Page 123

Liste des mthodes des objets graphiques:


Type d'objet

Mthodes

fentre

fermer()

Programmation
vnementielle

Rle
ferme la fentre

Liste des vnements pris en charge par les objets:


Type d'objet

vnements

feuille

Chargement

Intervient quand ...

texte

Validation

l'utilisateur a fini de saisir une valeur et qui il valide

bouton

Clic

l'utilisateur click sur l'objet correspondant

la feuille est charge et affiche

* Un objet dsactiv est toujours visible par l'utilisateur mais il ne peut pas avoir d'action dessus.

Exercice 6
travers cet exercice, vous allez dcouvrir le principe des tableaux de contrles.
Il est effectivement possible de regrouper plusieurs contrles (objets graphiques),
sous le mme nom, en les numrotant. Laccs un de ces contrles se fait alors
comme pour un tableau classique, en prcisant lindice du contrle concern.
Par exemple, si vous avez un tableau de contrles qui sappelle cmdLettre et que vous
voulez le titre du 4e bouton, vous allez crire cmdLettre[4].titre.
Dessinez une fentre qui va prsenter le jeu du pendu (version simplifie).
Cette fentre doit contenir les contrles suivants:
une zone de texte qui va permettre de saisir le mot chercher;

8 2944 TG PA 00

un bouton "dbut jeu" qui va rendre invisible la zone de texte prcdente et faire
apparatre un label et 26 boutons:
le label: va contenir, au dpart, autant de _ que de lettres contenues dans
le mot, puis, au fur et mesure du mot, va contenir les lettres trouves,
26 boutons : cest un tableau de contrles. Chaque bouton contient, en
titre (ce qui est crit sur le bouton) une lettre de lalphabet;
un label message qui va contenir, soit rien si la lettre demande est dans le mot,
soit "lettre absente", si la lettre nest pas dans le mot.
Dans cette version du jeu, on ne soccupera pas du nombre dessais pour arriver
trouver le mot ni de la partie graphique (le dessin du pendu). Vous n'avez pas non
plus grer la fin de la partie (si le mot est compltement trouv).
Vous avez votre disposition les fonctions suivantes:
fonction Ln(pTexte: chane): num
// retourne le nombre de caractres contenus dans la chane pTexte
fonction Car(pTexte: chane, pPosition: num): carac
// retourne le caractre qui se trouve la position pPosition dans la chane pTexte
procedure Chg(pTexte: chane, pPosition: num, pNvCar: carac)
// remplace, dans la chane pTexte, le caractre qui se trouve la position pPosition
par le caractre pNvCar
Les types de contrles graphiques utiliser sont les suivants:
Fenetre, Bouton, Label, Texte
Squence 2
Programmation
vnementielle

Sur ces contrles, vous pouvez utiliser les proprits suivantes:


Contrle
Bouton

Page 124
Label
Texte

Proprits

Type

Explication

titre

chane

contenu du bouton

visible

boolen

vrai: le contrle est visible, faux sinon

titre

titre

contenu du label

visible

boolen

vrai: le contrle est visible, faux sinon

text

chane

contenu du texte

visible

boolen

vrai: le contrle est visible, faux sinon

Sur ces contrles, il existe les vnements suivants:


Contrle
Bouton

vnements
Clic

Explication
dclench sur le clic du bouton

Remarque: pour les tableaux de boutons, lvnement comporte un paramtre qui


contient automatiquement le numro du contrle dans le groupe. Syntaxe:
procedure nomBouton_Clic(index: entier)
crire tout le code ncessaire pour grer cette fentre.

TP 3
Vous pouvez raliser le TP3 que vous trouverez dans le fascicule de TP correspondant
ce cours.

8 2944 TG PA 00

Synthse

Qu'est-ce que la programmation procdurale pure?


Le programme s'excute dans l'ordre dcid par le programmeur. Il ne contient
qu'un dbut et qu'une fin. L'utilisateur n'interagit avec le programme que quand
celui-ci lui donne la main.
L'environnement est non graphique.
Les notions de programmation procdurales sont cependant utilises dans tous
les autres modes de programmation.
Qu'est-ce que la programmation vnementielle?
Le programme ragit aux interactions de l'utilisateur: c'est lui qui dcide l'ordre
d'excution.
L'environnement est graphique, bas sur le principe des smaphores (par
exemple, le dessin d'un bouton permet d'inciter l'utilisateur cliquer dessus).
La programmation vnementielle exploite les possibilits du procdural en intgrant les notions d'objets graphiques et d'vnements lis ces objets.
Les objets graphiques
nom de l'objet: aux choix du programmeur (mais gnralement les 3 premires lettres en minuscules sont rserves au type et les lettres suivantes,
commenant par une majuscule, dcrivent l'objet. Exemple: txtResultat);
type de l'objet: types prdfinis donns par le sujet, ou l'environnement
de dveloppement (par exemple Texte, Label, Bouton );
proprits de l'objet : variables qui dcrivent l'objet et qui sont
directement lies au type d'objet (par exemple, pour les
objets de type Label, la proprit titre contient le texte du Label)
syntaxe: nomObjet nomProprit;
mthodes de l'objet: modules qui permettent d'agir sur l'objet et qui sont
directement lis au type d'objet (par exemple, pour les objets de type Liste,
la mthode Ajouter(valeur: chaine) permet d'ajouter un lment la liste)
syntaxe: nomObjet nomMethode(paramtres ventuels);
vnements de l'objet : procdures vnementielles qui se dclenchent
lorsque l'utilisateur sollicite l'vnement concern et qui sont directement lies
au type d'objet (par exemple, pour les objets de type Bouton, l'vnement clic
dclenche la procdure correspondante quand l'utilisateur clique sur le bouton
syntaxe: nomObjet_nomEvenement(paramtres ventuels).

Squence 2
Programmation
vnementielle

Page 125

.
.

8 2944 TG PA 00

Squence 3

Initiation la programmation
objet
Cette squence reprsente une initiation la programmation objet. Vous n'allez pas
apprendre crer des classes mais utiliser des classes existantes, en comprenant plusieurs notions fondamentales lies ce type de programmation. L'apprentissage approfondi de la programmation objet et, entre autres, la cration de classes, seront abordes
dans un autre cours, spcifique l'option SLAM.

X Prrequis
Avoir acquis les connaissances des deux premires squences ou avoir de bonnes
connaissances en programmation procdurale (structures algorithmiques de
base, tableaux, modules) et avoir dj dvelopp dans un environnement graphique.

X Capacits attendues en fin de squence

Squence 3

Savoir crer des objets partir de classes existantes et savoir les manipuler.
Avoir compris les notions de classe, objet, constructeur, instanciation, encapsulation, hritage, polymorphisme, collections et bibliothques.

Initiation
la programmation
objet

Page 127

X Contenu
1. Prsentation ................................................................................................. 128
2. Classes et objets .......................................................................................... 129
3. Membres d'une classe ................................................................................. 130
4. Constructeur et instanciation ..................................................................... 131
5. Encapsulation ............................................................................................... 133
6. Hritage ........................................................................................................ 136
7. Polymorphisme ............................................................................................ 138
8. Collections .................................................................................................... 140
9. Bibliothques ............................................................................................... 143

Synthse
10. Bibliothques
.............................................................................................. 144

8 2944 TG PA 00

1.

Prsentation

En ralit, vous avez dj un aperu de ce qu'est la programmation objet. En abordant


la programmation vnementielle, vous avez eu l'occasion de manipuler des objets graphiques. Cela vous a permis de voir ce qu'est un objet et son fonctionnement.

1A. Qu'est-ce qu'un objet?


Avant d'apporter une dfinition formelle au terme "objet", reprenons ce que vous savez
dj. chaque fois que vous avez insr un nouveau bouton, une nouvelle zone de texte
ou une nouvelle liste dans une fentre, vous avez cr un nouvel objet graphique que
vous avez ensuite utilis.
En ralit, la notion d'objet ne se limite pas aux objets graphiques : il est possible de
crer des objets non graphiques. Pour le moment, vous n'allez apprendre qu' utiliser
des objets (graphiques et bientt non graphiques). Pour ceux qui s'orientent vers l'option SLAM, vous allez apprendre aussi crer les types l'origine de ces objets.
Un objet graphique, vous savez ce que c'est: c'est par exemple un bouton.
Un objet non graphique, c'est un objet qui permet de manipuler une notion qui comporte aussi des proprits et des mthodes, comme pour les objets graphiques, mais
qui n'est pas visuel. Par exemple, dans l'exercice guid que vous allez raliser en fin de
squence, vous allez mmoriser des rendez-vous dans un agenda, chaque rendez-vous
sera un objet qui comporte des proprits (date, heure, contenu, frquence...) mais aussi
des mthodes (entre autres pour dplacer le rendez-vous).
Squence 3
Initiation
la programmation
objet

Page 128

1B. Pourquoi des objets?


Dans l'exemple qui vient d'tre donn, vous comprenez que tout ce qui concerne un
rendez-vous va tre runi (ce qui le caractrise, donc ses proprits, et les actions qui
peuvent tre faites dessus, donc ses mthodes). Voil l'intrt principal de la programmation objet: l'organisation du code pour que tout ce qui est li soit runi.
Jusqu' maintenant, vous avez appris un premier niveau d'optimisation en apprenant
crer des modules. La programmation objet permet d'aller plus loin dans l'optimisation
en runissant les modules (mthodes) et les variables (proprits) qui caractrisent la
mme information.
Voici les 3 grands domaines d'amlioration de la programmation objet.

Lisibilit
Les variables et modules sont logiquement regroups pas thme. Le programme gagne
incontestablement en lisibilit.

Optimisation
L'organisation du code permet d'viter les rptitions inutiles. Cela va donc plus loin que
l'optimisation apporte par la cration de simples modules indpendants.

Rutilisabilit
Les types ainsi dfinis sont rutilisables, dans le mme programme, mais aussi ventuellement dans d'autres applications. On utilise d'ailleurs couramment dans nos programmes
des types d'objets dj dfinis.
Remarque : le terme "rutilisabilit" n'xiste pas en franais mais il est couramment
employ en programmation et surtout dans le monde de l'objet, car le terme "rutilisation" n'est pas assez fort: "rutilisabilit" signifie la capacit de rutilisation.

8 2944 TG PA 00

1C. Un peu d'histoire


Pour finir cette petite prsentation, parlons trs rapidement de l'histoire de la programmation objet.
La POO (Programmation Oriente Objet) consiste lier les donnes et les traitements
dans des objets.
Ce type de programmation existe depuis 1972 !
SmallTalk (1972) est l'anctre des langages objets.
C++ (1986) a vraiment fait de l'objet un standard: il reste le langage de rfrence.
Java (1995) a instaur la notion de "tout objet" (le programme principal lui-mme est
une classe). Il est aussi devenu une rfrence.
Les nouveaux langages (C#, Windev) intgrent tous la programmation objet, et sont
souvent aussi, sur le modle de Java, "tout objet".

1D. De l'vnementiel l'objet


Vous savez crer un objet et l'utiliser (par exemple une zone de texte). Cependant, ce
n'est pas vous qui avez crit le code qui permet de dfinir ce qu'est une zone de texte.
Vous tes l'utilisateur d'un code existant: sous VB6, vous avez cliqu dans les outils pour
placer une zone de texte sur votre fentre. Vous avez ensuite dfini sa taille, sa couleur,
son contenu ventuel... mais vous ne pouvez dfinir que ce qu'il est possible de dfinir.
Qui dcide? Celui qui a rellement cr le type "liste" propos dans la bote d'outils.
Ceux qui choisiront l'option SLAM apprendront crer ces types. Pour le moment, tout
en voyant plus en dtail la philosophie de la programmation objet, vous allez continuer
apprendre comment exploiter au mieux ces types existants.

2.

Classes et objets

Le terme "type d'objet", qui caractrise tout de mme assez bien ce dont on parle, n'est
pourtant pas le terme le plus appropri. Le type d'un objet s'appelle en ralit une classe.

Squence 3
Initiation
la programmation
objet

Page 129

2A. Classe
Une classe est un type complexe pouvant contenir des proprits et/ou des mthodes et/
ou des vnements.

2B. Objet
Un objet est une variable dont le type est une classe. On parle aussi d'une instance de
classe. La notion d'instance concerne plus prcisment la cration de l'objet, et non simplement sa dclaration.
Pour le moment, vous ne connaissez pas la diffrence entre dclarer et crer un objet. La
cration d'objets graphiques sous VB6 ne vous a pas permis de voir la diffrence. Vous
allez apprendre un peu plus loin comment dclarer puis crer un objet.

Classe/objet, pas de confusion


L'important pour le moment est que vous compreniez la diffrence entre une classe et
un objet. Dans VB6, les outils prsents sont en fait des classes: quand vous choisissez
une liste, vous pouvez ensuite en placer plusieurs dans votre fentre. Chaque liste positionne dans la fentre est un objet. Chaque liste a ses propres caractristiques (nom,
position, taille, contenu...), cependant chaque liste est issue de la mme classe: la classe
Liste.

8 2944 TG PA 00

classe Liste
proprits:
contenu[]: chane
...
mthodes:
ajouter(valeur: chane)
supprimer(index: entier)
...

objet lstPersonne
proprits:
contenu[]: "Dupont..."
...
objet lstVille
proprits:
contenu[]: "Paris..."
...
objet lstPays
proprits:
contenu[]: "France..."
...

Ici vous voyez la classe Liste avec un extrait des proprits et mthodes possibles sur les
listes. Par rapport cette classe, 3 objets diffrents ont t crs, chaque objet ayant
affect des valeurs diffrentes aux proprits concernes.

Exercice 1

Squence 3
Initiation
la programmation
objet

Page 130

partir de la classe Liste et des 3 objets prsents ci-dessus, crire les instructions qui
permettent de rpondre aux demandes suivantes:
a) ajouter "Bernard" la liste des personnes;
b) ajouter "Nice" la liste des villes;
c) supprimer le premier lment (d'indice 0) de la liste des pays.

3.

Membres d'une classe

Lorsque vous crez des objets partir d'une classe, vous pouvez ensuite a priori accder
aux proprits et aux mthodes de la classe. Si cette classe est graphique, vous avez aussi
la possibilit d'crire le code des vnements qui y sont associs.
Tous ces lments qui constituent la classe sont appels les membres de la classe.
Les proprits, mthodes et ventuellement vnements sont dcrits dans une classe,
mais sont utilisables partir d'un objet et influent sur l'objet en question. Il y a des cas
particuliers (proprits ou mthodes utilisables directement partir de la classe) qui
seront abords plus tard.

3A. Proprits
Une proprit est une variable incluse dans une classe. Elle permet de mmoriser une
information spcifique l'objet.

3B. Mthodes
Une mthode est un module inclus dans une classe. Il permet de raliser des traitements
sur l'objet cr partir de cette classe.

3C. vnements
Un vnement est un module dont le crateur de l'objet doit crire le contenu et qui
s'excute suite un vnement qui se dclenche sur l'objet.

8 2944 TG PA 00

Exercice 2
Dans un jeu, une classe Personnage a t cre afin de grer les personnages du jeu.
Voici en vrac la liste des membres de cette classe:
pseudo: chane
deplace (direction: entier)
estmort(): boolen
vie: entier
Pour chaque membre, vous prciserez si c'est une proprit ou une mthode. Vous
donnerez aussi son rle.

4.

Constructeur et instanciation

Sous VB6, vous avez cr des objets graphiques directement en les positionnant sur
la fentre. En ralit du code est automatiquement gnr dans VB6, sans que vous
le voyiez et qui permet de crer ces objets. Vous avez aussi compris qu'il peut exister
d'autres types d'objets, non graphiques.

4A. Vie d'un objet


D'une manire gnrale, il faut que vous sachiez que pour utiliser un objet, il faut
d'abord le dclarer, comme une variable classique, puis, suivant les langages, le crer.
La cration d'un objet passe par l'appel automatique d'une mthode un peu spciale
appele le constructeur de la classe. Dans la plupart des langages, le constructeur porte
le mme nom que la classe. Si ce n'est pas le cas, il porte un nom spcifique. L'ide est
que le langage soit capable de reconnaitre sans ambigit quelle mthode de la classe
est le constructeur.
En prenant l'exemple de l'exercice prcdant, imaginons que l'on veuille crer un joueur
puis l'utiliser. Cela pourrait donner ceci ( travers des extraits d'un programme):

Squence 3
Initiation
la programmation
objet

Page 131

programme jeu
// dclaration d'un objet du type de la classe Personnage
unJoueur: Personnage
...
debut
...
// cration de l'objet pour pouvoir ensuite l'utiliser
unJoueur new Personnage()
...
// utilisation des proprits et mthodes de l'objet
unJoueur.pseudo "Nicolas"
unJoueur.vie 10
...
unJoueur.deplace(1)
...
si unJoueur.estmort() alors
afficher unJoueur.pseudo + "vient de mourir"
finsi
...
fin

8 2944 TG PA 00

Vous voyez travers cet exemple les diffrentes tapes de vie d'un objet:
dclaration : l'objet, comme n'importe quelle autre variable, doit d'abord tre
dclar. Une fois dclar, l'objet contient la valeur null. Il ne peut donc pas tre
utilis (sauf ventuellement en le comparant null);
cration: une fois l'objet dclar, il faut lui affecter un contenu pour qu'il puisse
tre utilis. Ce contenu peut provenir de l'affectation d'une instance de la classe
concerne. Instancier une classe, c'est appeler le constructeur de la classe avec
l'oprateur new afin de crer en mmoire une zone nouvelle pour cet objet;
utilisation : une fois l'objet dclar et cr, il est possible alors d'exploiter ses
membres (proprits et mthodes).

4B. Qu'est-ce qu'un constructeur?


Revenons la syntaxe de l'appel du constructeur:
unJoueur new Personnage()

Squence 3
Initiation
la programmation
objet

Page 132

8 2944 TG PA 00

Vous remarquez l'oprateur new qui permet la cration d'une instance. L'oprateur new
est suivi du nom de la classe. Mais il y a aussi les 2 parenthses. Pourquoi? Parce que
Personnage() est un constructeur et un constructeur est une mthode.
Plus prcisment, un constructeur une mthode non type (elle ne retourne rien et n'est
mme pas type en tant que procdure classique), qui porte gnralement le mme
nom que la classe et s'excute automatiquement lors de la cration de l'objet (lorsque la
classe est instancie avec "new").
Un constructeur est non typ, mais il a tout fait le droit d'avoir des paramtres. Ces
paramtres servent gnralement initialiser certaines proprits de l'objet.
Reprenons l'exemple de la classe Personnage, et imaginons que le constructeur attende
2 paramtres: le premier pour initialiser le pseudo et le second pour initialiser la vie. On
pourrait alors imaginer ceci:
programme jeu
unJoueur: Personnage
unPseudo: chane
...
debut
...
// saisie du pseudo du nouveau joueur
afficher "Entrer un pseudo"
saisir unPseudo
// cration de l'objet unJoueur
unJoueur new Personnage(unPseudo, 10)
...
fin
Cette fois le constructeur est appel en lui envoyant des informations dans les 2 paramtres. Le premier paramtre attend un pseudo: celui-ci a t pralablement saisi. Le
second paramtre attend une valeur de vie: la valeur est ici envoye en dur, pourquoi
pas !
Donc, pour crer un objet, vous devez savoir ce que le constructeur attend comme paramtres. Cette information vous est bien sr toujours fournie.

Exercice 3
Voici la liste des membres de la classe Personnage et leur description dtaille:
Personnage (unPseudo: chane, uneVie: entier)
pseudo: chane
vie: entier
deplace (direction: entier)
estmort(): boolen
a) crire la fonction qui reoit en paramtre un pseudo et qui retourne un objet de
type Personnage cr partir de ce pseudo et en initialisant la vie 10.
b) crire la fonction qui reoit en paramtre un objet de type Personnage et qui
retourne:
si le personnage est vivant, une chane du type: "Nicolas: 5" (le 5 reprsente
ici la vie restant Nicolas) ;
si le personnage est mort, une chane du type: "Nicolas est mort"
c) crire la procdure qui reoit en paramtre un objet de type Personnage et une
valeur de direction, et qui fait dplacer ce personnage par rapport cette valeur.
d) crire la fonction qui reoit en paramtre un tableau d'objets de type Personnage
(tableau de 10 cases, non compltement rempli) et une variable contenant le nombre
de cases effectivement remplies dans le tableau. Cette fonction doit retourner le
pseudo du joueur possdant le plus de vie.
Squence 3

5.

Encapsulation

Pour le moment, vous avez accd aux proprits et aux mthodes des objets d'une
classe, avec le sentiment que tout le contenu d'une classe est accessible.
Il n'en est rien.
En ralit, vous ne pouvez avoir accs qu' ce que le programmeur de la classe veut bien
vous laisser accder. a veut dire quoi ? Tout simplement, que certains membres sont
accessibles de l'extrieur et d'autres non.

Initiation
la programmation
objet

Page 133

5A. Intrt de l'encapsulation


L'encapsulation est la capacit de cacher certains membres et de rendre visibles d'autres
membres.
Pourquoi cacher certains membres? Pour viter d'y accder de l'extrieur, au risque de
perdre la cohrence du contenu de l'objet. Par exemple, dans la classe Personnage, la vie
est directement accessible: cela suppose que l'on peut modifier la vie volont, et mme
pourquoi pas lui affecter une valeur ngative ! Le programmeur de la classe Personnage
n'a sans doute pas envie que l'on joue ainsi avec la vie: celle-ci ne doit tre modifie
que lorsque le personnage est bless (la vie diminue) ou lorsqu'il gagne des bonus (la vie
augmente). Dans ce cas, la proprit vie sera place dans la partie prive de la classe et
vous ne la verrez jamais.

5B. Priv/Public
Il y a donc 2 niveaux de protection dans une classe: chaque membre est plac dans un
niveau de protection.
Priv : un membre priv n'est pas accessible l'extrieur de la classe. Seules les
mthodes incluses dans la classe peuvent y accder.

8 2944 TG PA 00

Public: un membre public est accessible de partout, toujours condition de passer


par un objet de la classe.
En tant qu'utilisateur de classes existantes, vous n'aurez accs qu'au public.

5C. Accesseur/Mutateur
Mme si ce n'est pas une obligation, par convention toutes les proprits d'une classe
sont mises en priv et, lorsque le programmeur de la classe dsire tout de mme pouvoir
laisser l'accs certaines proprits, il cre des mthodes spcifiques.
Accesseur (appel aussi getter) : ce type de mthode permet de rcuprer le
contenu d'une proprit prive. Gnralement, elle porte le mme nom que la
proprit prcd de "get".
Mutateur (appel aussi setter): ce type de mthode permet de modifier le contenu d'une proprit prive (on dit "valoriser" une proprit, dans le sens "lui affecter une valeur"). Gnralement, elle porte le mme nom que la proprit prcd
de "set".
Voici ce que pourrait donner la nouvelle classe Personnage:

Squence 3
Initiation
la programmation
objet

Page 134

8 2944 TG PA 00

classe Personnage
priv:
pseudo: chane
vie: entier
public:
Personnage (unPseudo: chane, uneVie: entier)
deplace (direction: entier)
estmort(): boolen
getVie(): entier
getPseudo(): chane
setPseudo (unePseudo: chane)
En ralit, la partie prive n'est pas prsente puisque vous n'y avez pas accs. Ici, elle
a t prsente titre indicatif. Quand vous manipulez des classes existantes dans un
langage, la liste des membres prsente ne contient jamais les membres privs.
Remarquez la mthode getVie(). Elle va permettre de rcuprer la vie du personnage. En
revanche il n'y a pas de mthode pour modifier la vie. La modification se fera en interne,
par exemple lorsque le personnage est bless.
Remarquez les mthodes getPseudo et setPseudo: elles permettent finalement de tout
faire sur la proprit pseudo (rcuprer sa valeur mais aussi la modifier). Vous pourriez
vous dire: pourquoi ne pas avoir tout simplement mis la proprit pseudo en public?
C'est tout fait juste et possible. Mais comme cela a t dit plus haut, par convention
les proprits sont toutes mises en priv pour les protger. Du coup leur accs se fait
naturellement par les accesseurs et mutateurs, mme si les 2 doivent tre parfois crs.
Mme si vous n'tes pas cens connatre le contenu des mthodes, car ce qui vous
importe en tant qu'utilisateur de classes existantes, c'est ce qu'elles font et non comment
elles le font.

Voici titre indicatif le contenu d'un mutateur et d'un accesseur pour que vous compreniez mieux le principe:
// accesseur sur le pseudo: rcupre la proprit pseudo
getPseudo(): chane
debut
retourner pseudo
fin
// mutateur sur le pseudo: modifie la proprit pseudo
setPseudo (unPseudo: chane)
debut
pseudo unPseudo
fin

5D. Mthodes prives?


Beaucoup de dveloppeurs dbutants (et mme d'autres) pensent qu'il faut obligatoirement mettre toutes les proprits en priv et toutes les mthodes en public. Mme s'il
est rare (et dconseill) de mettre des proprits en public, il est trs courant (et fortement conseill) de mettre des mthodes en priv: celles qui ne doivent tre accessibles
que par les autres mthodes de la classe.
Imaginons, dans la classe Personnage, une mthode pour grer l'attaque du personnage
et une mthode qui ne va s'excuter que lorsque le personnage est touch par un autre.
Cette seconde mthode ne doit pas pouvoir tre appele n'importe quand, mais uniquement lorsqu'un joueur attaque et touche un autre. Donc, autant la mthode attaque
doit pouvoir tre appele de l'extrieur, autant la mthode estTouch est appele lors
de tests qui se font dans la classe.
On obtient alors la classe Personnage enrichie de 2 mthodes dont l'une est en priv:

Squence 3
Initiation
la programmation
objet

Page 135

classe Personnage
priv:
pseudo: chane
vie: entier
estTouch()
public:
Personnage (unPseudo: chane, uneVie: entier)
deplace (direction: entier)
estmort(): boolen
getVie(): entier
getPseudo(): chane
setPseudo (unePseudo: chane)
attaque()

8 2944 TG PA 00

Exercice 4
Imaginons l'objet unPerso de type Personnage, qui a t pralablement cr. Dites,
pour chaque instruction, si elle est syntaxiquement correcte et, dans le cas contraire,
pourquoi elle ne l'est pas.
unPerso.attaque()
unPerso.vie unPerso.vie + 1
unPerso.deplace()
unPerso.getVie() 5
unPerso.estmort()
unPerso.estTouch()
unPerso.Personnage("Nicolas", 10)
afficher unPerso.getPseudo()

Exercice 5
En utilisant la nouvelle classe Personnage donne ci-dessus, rcrire les modules
demands en b) et d) de l'exercice 3.

6.
Squence 3
Initiation
la programmation
objet

Page 136

Hritage

Dans les classes existantes que vous allez exploiter, vous verrez que trs souvent, il y a des
classes qui hritent d'autres classes. Quand vous rechercherez dans les aides ou sur internet de nouveaux outils ou des informations sur une classe, vous serez souvent confront
cette notion d'hritage.

6A. Qu'est-ce que l'hritage?


Une classe peut hriter d'une autre classe. Dans ce cas, la classe fille a accs tous les
membres qui ne sont pas privs dans la classe mre, comme s'ils taient ses propres
membres.

6B. Quel est l'intrt?


Lorsqu'une classe reprsente un cas particulier d'une autre classe, l'hritage parait
logique. Cela vite de redfinir des membres qui existent dj dans une autre classe.

6C. Quelques rgles de l'hritage


Une classe ne peut hriter que d'une seule autre classe (certains langages, comme le
C++, permettent l'hritage multiple mais il est dangereux et banni de tous les nouveaux
langages).
Une classe peut tre drive plusieurs fois. Driver une classe signifie crer une classe fille
qui hrite de cette classe.

8 2944 TG PA 00

La structure d'hritage est donc en arbre: une classe peut avoir plusieurs filles et une
seule mre. Voici un exemple en reprenant la classe Personnage. La classe mre va contenir tous les membres communs tous les personnages. Chaque classe fille ne contient
que les membres supplmentaires qui ne concerne qu'elle.
classe Personnage
priv:
pseudo: chane
vie: entier
estTouch()
public:
Personnage (unPseudo: chane)
deplace (direction: entier)
getPseudo(): chane
setPseudo (unePseudo: chane)
attaque()

classe Mortel
priv:
vie: entier
public:
Mortel (unPseudo: chane, uneVie: entier)
estmort(): boolen
getVie(): entier

classe Immortel
priv:
pouvoir: chane
public:
Immortel (unPseudo: chane, unPouvoir: chane)
getPouvoir(): chane

6D. Niveau de protection dans l'hritage


N'oubliez pas que les filles n'ont pas accs aux membres privs de la classe mre. Du
coup, on pourrait avoir un problme avec la mthode estTouch() qui doit tre accessible
partir des filles mais qui pour le moment ne l'est pas.
Une solution serait de mettre cette mthode en public. Mais ce n'est pas une bonne
ide car, on l'a vu plus haut, il n'y a aucune raison que cette mthode soit accessible de
l'extrieur, c'est--dire partir d'un objet de type Personnage ou Mortel ou Immortel.
L'idal serait que cette mthode ne soit accessible que par les mthodes qui sont dans
les 3 classes concernes. C'est pour rsoudre ce problme qu'il existe un 3e niveau de
protection: "protg".

Squence 3
Initiation
la programmation
objet

Page 137

classe Personnage
priv:
pseudo: chane
vie: entier
protg:
estTouch()
public:
Personnage (unPseudo: chane)
deplace (direction: entier)
getPseudo(): chane
setPseudo (unePseudo: chane)
attaque()
Lorsque vous crez des objets, vous n'avez accs qu' la partie "public" de la classe
concerne. Mais si vous dcidez de crer une classe qui hrite d'une classe existante, alors

8 2944 TG PA 00

vous pourrez accder aussi la partie protge. C'est un aspect que vous aurez l'occasion
de dvelopper si vous choisissez l'option SLAM. Pour le moment, cette information est
donne titre indicatif car, lors de vos recherches sur le contenu de classes existantes,
vous pouvez tomber sur ce terme. Il est donc intressant de savoir ce que c'est.

Exercice 6
Imaginons 3 objets qui ont t pralablement crs: unPerso de type Personnage,
unMortel de type Mortel et unImmortel de type Immortel. Vous devez utiliser les
classes qui viennent d'tre dcrites.
Dites, pour chaque instruction, si elle est syntaxiquement correcte et, dans le cas
contraire, pourquoi elle ne l'est pas.
unMortel.deplace(2)
afficher unMortel.getVie()
afficher unImmortel.getVie()
afficher unImmortel.pouvoir
unMortel.estTouch()
unPerso.estTouch()
afficher unPerso.pseudo
afficher unPerso.getVie()

Squence 3
Initiation
la programmation
objet

Page 138

7.

Polymorphisme

Derrire ce terme qui parait complexe se cache une notion finalement simple. Il y a polymorphisme lorsque plusieurs mthodes portent le mme nom.
Comment 2 mthodes peuvent-elles avoir le mme nom ? En fait, il existe 2 types de
polymorphismes et ainsi 2 faons de distinguer des mthodes qui portent le mme nom.

7A. Polymorphisme statique (surcharge)


Deux mthodes ont le mme nom mais des signatures diffrentes. La signature reprsente les paramtres d'une mthode. Avoir des signatures diffrentes consiste soit ne
pas avoir le mme nombre de paramtres, soit avoir le mme nombre de paramtres
mais avec au moins un, ayant un type diffrent.
Ainsi, l'ordinateur a la possibilit de distinguer les diffrentes mthodes, mme si elles
ont le mme nom.
Vous aurez l'occasion d'utiliser des environnements de dveloppements qui vous proposent, lorsque vous tapez le "point" aprs le nom de l'objet, la liste des mthodes
accessibles et ainsi parfois, plusieurs mthodes du mme nom.
Reprenons l'exemple de la classe classe Personnage
Personnage. Pour le moment, pour crer un priv:
nouveau personnage, il faut forcment son pseudo: chane
pseudo (qui est demand en paramtre du vie: entier
constructeur). On pourrait avoir besoin de protg:
crer des personnages de 2 faons: avec ou estTouch()
sans pseudo, le pseudo pouvant tre fourni public:
Personnage ()
plus tard. Du coup, la classe Personnage
Personnage (unPseudo: chane)
pourrait avoir 2 constructeurs de signatures
deplace (direction: entier)
diffrentes.
getPseudo(): chane
setPseudo (unePseudo: chane)
attaque()

8 2944 TG PA 00

7B. Polymorphisme dynamique (redfinition)


Deux mthodes ont le mme nom et la mme signature, mais se trouvent dans deux
classes diffrentes dont l'une hrite de l'autre. Avec le mme nom et la mme signature,
elles ne peuvent pas tre dans la mme classe.
Ainsi, l'ordinateur a la possibilit de les distinguer car elles ne sont pas dans la mme
classe.
Reprenons l'exemple d'hritage prcdent. Les immortels se dplacent de faon diffrente par rapport aux mortels. On pourrait imaginer que le dplacement est globalement le mme, mais les immortels sont plus rapides. Donc, ce serait dommage de grer
2 dplacements diffrents: un dans chaque classe. L'idal serait de crer une mthode
supplmentaire dans la classe Immortel pour grer le dplacement, mais cette mthode
ferait , entre autres, appel aussi la mthode de dplacement qui est dans la classe mre.
classe Personnage
priv:
pseudo: chane
vie: entier
estTouch()
public:
Personnage ()
Personnage (unPseudo: chane)
deplace (direction: entier)
getPseudo(): chane
setPseudo (unePseudo: chane)
attaque()

Squence 3
Initiation
la programmation
objet

classe Mortel
priv:
vie: entier
public:
Mortel (unPseudo: chane, uneVie: entier)
estmort(): boolen
getVie(): entier

classe Immortel
priv:
pouvoir: chane
public:
Immortel (unPseudo: chane, unPouvoir: chane)
getPouvoir(): chane
deplace (direction: entier)

Page 139

Vous avez appris qu'une fille pouvait accder aux mthodes publiques de la mre.
Comment alors l'ordinateur va savoir, quand vous crivez ceci:
unObjet.deplace(3)
s'il doit appeler la mthode qui se trouve dans la fille ou dans la mre? Il va tout simplement appeler la mthode qui correspond au type de unObjet. Si unObjet est de type
Immortel, il appellera la mthode qui se trouve dans Immortel. Si unObjet est de type
Personnage, il appellera la mthode qui se trouve dans Personnage.

8 2944 TG PA 00

Exercice 7
Vous allez travailler avec les 3 classes prcdentes.
a) Proposer une surcharge du constructeur dans chaque classe fille pour que cela
corresponde la surcharge dj faite sur le constructeur de la classe mre.
b) crire une fonction qui reoit en paramtre un pseudo et qui cre et retourne un
objet de type Personnage. Attention, si le pseudo est vide (""), il faut crer un personnage sans pseudo.

8.

Squence 3
Initiation
la programmation
objet

Collections

travers plusieurs exercices prcdents, vous avez manipul des objets soit comme une
variable unique, soit dans des tableaux d'objets. Trs souvent, il est ncessaire de regrouper les objets. Les tableaux reprsentent une solution mais qui n'est pas trs adapte
la manipulation d'objets.
Il existe d'autres solutions pour regrouper les objets. La plus connue est la Collection.
Les autres solutions sont des variantes de la Collection. Voyons donc juste le principe de
la Collection.
Tous les langages proposent une classe dj existante qui permet de regrouper des
objets. Elle s'appelle Collection ou d'un autre nom mais regroupe gnralement plus ou
moins les mmes membres.
Comme d'habitude, seule la partie publique de la classe est accessible. Dans un objet
de type Collection, vous allez pouvoir ajouter des objets (de mme type), en supprimer,
accder un objet prcis...
Voici quoi pourrait ressembler une classe Collection:

Page 140

classe Collection <unType>


priv:
...
public:
// retourne le nombre d'objets de la collection
cardinal(): entier
// ajoute l'objet unObjet dans la collection
ajouter(unObjet: <unType>)
// supprime de la collection l'objet se trouvant au rang
// index (les indices des collections commencent
// gnralement 0, mais cette information est prcise)
// lors de la suppression, il n'y a pas de "trou":
// tous les lments sont dcals et l'lment qui tait
// la position (index+1) est dplac la position index
supprimer(index: entier) // supprime un objet
// retourne l'objet qui se trouve au rang index
getElement(index: entier): <unType>

8 2944 TG PA 00

Remarquez le <unType>. Il peut prendre n'importe quelle valeur de type car on peut
faire une collection de n'importe quel type ( condition ensuite que tous les lments de
la collection soient de mme type). Donc, au moment de la dclaration, il faut prciser
le type de la collection.
Voici donc ce qu'il est possible de faire avec une collection ( travers des extraits d'un
programme):
programme machin
// dclaration de la collection
colPerso: Collection <Personnage>
// dclaration d'un objet de type Personnage
unPerso: Personnage
// un indice pour parcourir la collection
k: entier
debut
// cration de la collection (qui pour le moment est vide)
colPerso new Collection <Personnage>
...
// cration d'un personnage
unPerso new Personnage ("Nicolas", 10)
// ajout du personnage dans la collection
colPerso.ajouter(unPerso)
// suppression du 3me lment de la collection
colPerso.supprimer(2)
// affichage des pseudos de tous les personnages
pour k de 0 colPerso.cardinal() - 1
afficher colPerso.getElement(k).getPseudo()
finpour
...
fin

Squence 3
Initiation
la programmation
objet

Page 141

Prenez le temps de bien analyser cet exemple.


Pour l'ajout d'un objet dans la collection, l'exemple vous propose ceci:
// cration d'un personnage
unPerso new Personnage ("Nicolas", 10)
// ajout du personnage dans la collection
colPerso.ajouter(unPerso)
Vous crez d'abord un objet de type Personnage, puis il ne reste plus qu' insrer cet
objet dans la collection, en utilisant la mthode "ajouter".
Il est aussi possible d'viter la cration d'un objet intermdiaire. Il faut se rappeler que
l'oprateur "new" permet la cration d'un objet. Donc si unPerso n'est utilis que pour
crer un personnage afin ensuite de l'ajouter dans la collection, on peut en fait s'en
passer et crire directement:
// cration d'un personnage et ajout dans la collection
colPerso.ajouter(new Personnage ("Nicolas", 10))

8 2944 TG PA 00

Autre point intressant dans l'exemple prcdent: le parcours de la collection pour afficher les pseudos:
// affichage des pseudos de tous les personnages
pour k de 0 colPerso.cardinal() - 1
afficher colPerso.getElement(k).getPseudo()
finpour
Puisque la mthode cardinal() donne le nombre d'lments de la collection, la boucle
permet de parcourir correctement tous les lments de la collection (le fait de dmarrer
0 force l'arrte au nombre d'lments moins 1).
Ensuite, dans la boucle, pour afficher le pseudo du kme objet de la collection, il faut
d'abord rcuprer ce kme objet. Cette rcupration se fait l'aide de la mthode getElement qui attend en paramtre le rang de l'objet rcuprer. Une fois que l'on a crit
ceci:
colPerso.getElement(k)
on a accs l'objet qui se trouve la position k dans la collection. Cet objet est de
type Personnage. Donc, partir de cet objet, il est possible d'accder ses mthodes
publiques. Voil pourquoi on peut crire:
afficher colPerso.getElement(k).getPseudo()

Exercice 8
Squence 3
Initiation
la programmation
objet

Page 142

8 2944 TG PA 00

Vous allez travailler avec les classes donnes dans le cours.


a) crire une procdure qui reoit en paramtre une collection d'objets de type
Personnage et qui affiche le pseudo de chaque personnage
b) crire la fonction qui reoit en paramtre une collection d'objets de type Mortel
et qui retourne le nombre de morts.
c) crire la fonction qui reoit en paramtre une collection d'objets de type Mortel et
qui retourne une collection d'objets qui ne contient que ceux qui sont morts.
d) Vous travaillez dans un environnement graphique possdant:
une zone de texte appele txtPseudo et possdant la proprit txt qui reprsente son contenu;
un bouton appel cmdAjout et possdant l'vnement Clic() qui se dclenche
sur le clic du bouton.
Un objet colPerso, collection de Personnage, a dj t dclar en global et cr.
crire le code sur l'vnement Clic du bouton qui va ajouter un nouveau personnage
dans la collection, en prenant le constructeur adapt (suivant si la zone de texte est
vide ou non).

9.

Bibliothques

travers ce cours, vous n'avez vu que l'aspect exploitation de classes existantes. Ceux qui
s'orientent vers l'option SLAM apprendront aussi crer des classes. Mais l'exploitation
de classes existantes reste une pratique trs courante.
Tous les langages fournissent un grand nombre de classes qui sont organises dans des
bibliothques.
Une bibliothque est donc tout simplement un regroupement de classes qui touchent
gnralement un mme domaine.
Les bibliothques sont souvent organises hirarchiquement, comme des dossiers et
sous-dossiers sur un disque. En dbut de programme, pour accder aux classes d'une
bibliothque, vous devrez donc faire appel cette bibliothque (suivant les langages,
vous devrez faire un "include", un "import" ou tout autre terme spcifique au langage,
suivi du nom de la bibliothque concerne.
Vous pourrez aussi crer vos propres bibliothques et y faire appel lorsque cela est ncessaire.

TP 4
Vous pouvez raliser le TP4 que vous trouverez dans le fascicule de TP correspondant
ce cours.
Squence 3
Initiation
la programmation
objet

Page 143

8 2944 TG PA 00

Synthse

Classe
Une classe est un type complexe pouvant contenir des proprits et/ou des
mthodes et/ou des vnements.
Objet
Un objet est une variable dont le type est une classe. On parle aussi d'une instance de classe. La notion d'instance concerne plus prcisment la cration de
l'objet, et non simplement sa dclaration.
Membre
Un membre est une proprit ou une mthode de la classe.
Constructeur
Un constructeur est une mthode non type (elle ne retourne rien et n'est mme
pas type en tant que procdure classique), qui porte gnralement le mme
nom que la classe et s'excute automatiquement lors de la cration de l'objet
(lorsque la classe est instancie avec "new").

Squence 3
Initiation
la programmation
objet

Page 144

Encapsulation
L'encapsulation aborde la notion de protection des membres:
membre priv: uniquement accessible dans la classe;
membre protg: uniquement accessible dans la classe et les classes filles;
membre public : accessible dans la classe, les classes filles et l'extrieur (en
passant par un objet).
Accesseur/Mutateur
Mthode qui permet d'accder aux proprits prives:
accesseur (ou getter): permet de rcuprer le contenu d'une proprit prive;
mutateur (setter): permet de modifier le contenu d'une proprit prive.
Hritage
Une classe peut hriter d'une autre classe. Elle a alors accs tous les membres
non privs de la classe mre.
Une classe peut avoir plusieurs filles mais une seule mre.
Polymorphisme
Polymorphisme statique (surcharge) : 2 mthodes ont le mme nom mais des
signatures diffrentes (dans la mme classe ou dans une classe fille et une classe
mre).
Polymorphisme dynamique (redfinition): 2 mthodes ont le mme nom et les
mmes signatures (une dans la classe mre et l'autre dans la classe fille).
Collection
Une classe Collection permet de stocker plusieurs objets de mme type. La collection est plus puissante et plus maniable qu'un tableau. Elle n'a pas de taille fixe.
Elle se manipule comme un objet (un objet contenant plusieurs objets).

8 2944 TG PA 00

Corrigs des exercices


Squence1
Exercice 1
a) afficher prenom
Cette instruction permet dafficher le contenu de la variable prenom:
Nicolas
b) afficher nom
Cette instruction permet dafficher le contenu de la variable nom. Mais cette variable na
pas t dclare. Donc la demande daffichage va provoquer une erreur
c) afficher age + " * 2 = " + (age*2)
Le contenu de la variable age va tre coll la chane " * 2 = " puis au contenu du rsultat
du calcul (age*2):
16 * 2 = 32
d) afficher "age + " * 2 = " + (age*2)"
Il y a une premire chane ("age + ") mais ensuite, en dehors des guillemets, cette
chane est suivie du signe de multiplication, ce qui nest pas possible dans un affichage.
Remarquez bien la diffrence avec linstruction prcdente o le signe de multiplication
tait dans les guillemets, donc considr comme un caractre quelconque. Cette nouvelle instruction provoque donc une erreur.
e) Bonjour Nicolas
En utilisant la variable prnom, voici linstruction possible:

Corrigs des exercices

Page 145

afficher "Bonjour " + prenom


Remarquez bien lespace qui suit le mot Bonjour et qui est avant la fermeture des guillemets. Sil ny avait pas cet espace, les deux mots seraient colls.

f) Tu as 16 ans
En utilisant la variable age, voici linstruction possible:
afficher "Tu as " + age + " ans"
L encore, remarquez bien la position des espaces.
g) Tu seras majeur dans 2 ans
Si le but de cet affichage est de faire en sorte que le nombre dannes varie en fonction
du contenu de la variable age, alors il faut faire un calcul:
afficher "Tu seras majeur dans " + (18-age) + " ans"

8 2944 TG PA 00

Exercice 2
a) prenom Nicolas
Nicolas nest pas entour de guillemets, donc il nest pas considr comme une chane. Ce
nest pas non plus une variable dclare.
b) age 16 ans
age est une variable de type entier, donc il nest pas possible de lui affecter autre chose
quun entier. De plus, mme si age tait une variable de type chane, linstruction serait
tout de mme fausse cause de labsence des guillemets.
c) age "18"
age est de type entier, donc il ne peut pas recevoir une chane (entre guillemets) mme si
cette chane contient un nombre.
d) la variable prenom doit contenir le prnom Alain
prenom "Alain"
Il ne faut pas oublier les guillemets puisque "Alain" est une chane.
e) la variable age doit contenir lge dAlain cest dire 18 ans
age 18
Il ne faut pas mettre de guillemets puisque la variable age attend un entier.

Exercice 3
Voici lalgorithme demand:
Corrigs des exercices

Page 146

programme remise
nom: chaine
prixht: reel
debut
afficher "entrer un nom darticle = "
saisir nom
afficher "entrer le prix HT de larticle = "
saisir prixht
afficher nom + ": " + (prixht*1,196*0,95) + ""
fin
Aprs la saisie des deux informations, laffichage a t fait en une seule ligne. Il aurait
t aussi possible de passer par une ou deux variables intermdiaires pour raliser le
calcul (calcul du TTC puis calcul de la remise), mais le calcul peut aussi se faire directement au moment de laffichage. Notez bien que le calcul a t mis entre parenthses.

8 2944 TG PA 00

Exercice 4
Voici lalgorithme demand:
programme majeur
age: entier
debut
afficher "entrer un age = "
saisir age
si age >= 18 alors
afficher "majeur"
sinon
afficher "mineur"
finsi
fin
Aprs la saisie de lge, il suffit de faire un test sur le contenu de la variable age pour
afficher le message adquat. Cette alternative contient donc une partie "alors" et une
partie "sinon".

Exercice 5
Voici lalgorithme demand:
programme sommeAge
age, somme: entier
debut
somme 0
afficher "entrer un age (0 pour arrter) = "
saisir age
tantque age <> 0
somme somme + age
afficher "entrer un age (0 pour arrter) = "
saisir age
fintantque
afficher "somme des ages = " + somme
fin

Corrigs des exercices

Page 147

Ce programme reprend un principe intressant que vous avez dj vu dans le premier


exemple du cours : il y a une premire saisie avant la boucle et une seconde dans la
boucle. Cette premire saisie est obligatoire car la boucle teste linformation saisie, donc
il faut quil y ait une premire information saisie.
Noubliez pas aussi linitialisation de la variable somme puisquon sen sert dans un calcul.

8 2944 TG PA 00

Exercice 6
Voici la squence algorithmique demande:
afficher "entrer une note = "
repeter
saisir note
jusqu note>=0 et note<=20
Cet extrait permet juste de montrer comment boucler sur une saisie et forcer la saisie
entre deux valeurs. Lordinateur ne sortira de la boucle que lorsque la variable note
contiendra bien une valeur entre 0 et 20.
Voici lalgorithme complet demand:

Corrigs des exercices

Page 148

programme moyenneNotes
note, cumul, nb: entier
rep: caractere
debut
// initialisations
cumul 0
nb 0
// boucle sur la saisie des notes
repeter
// saisie dune note avec contrle de saisie
afficher "entrer une note = "
repeter
saisir note
jusqu note>=0 et note<=20
// cumul des notes et compteur pour le nombre de notes
cumul cumul + note
nb nb + 1
// demande si lutilisateur veut continuer, avec contrle
afficher "voulez-vous continuer? (0/N) = "
repeter
saisir rep
jusqu rep="O" ou rep="N"
// la boucle sarrte si lutilisateur a dit non
jusqu rep="N"
// calcul et affichage de la moyenne
afficher "moyenne = " + (cumul/nb)
fin
Les commentaires sont l pour donner le maximum dinformations. Remarquez la grande
boucle gnrale: cest un "repeter". On aurait pu faire un "tantque" mais le "repeter"
parait bien adapt car il y a forcment au moins une note saisie (puisque lutilisateur doit
ensuite dire sil veut continuer ou non). Le "repeter" vite ainsi la premire saisie avant
la boucle car le test est en fin de boucle.
La grande boucle contient 2 petites boucles (2 "repeter") qui permettent chaque fois
de contrler quune saisie est correcte.

8 2944 TG PA 00

Exercice 7
Voici lalgorithme demand:
programme moyenneAge
age, cumul, nb, k: entier
debut
cumul 0
afficher "entrer le nombre dlves = "
saisir nb
pour k de 1 nb
afficher "entrer lage de llve n" + k + " = "
saisir age
cumul cumul + age
finpour
afficher "moyenne des ages = " + (cumul/nb)
fin
Aprs avoir saisi le nombre dlves, la boucle "pour" est la plus adapte puisque le
nombre ditrations est connu. Il suffit ensuite de cumuler les ges saisis. Remarquez
laffichage pour la saisie de lge, incluant le numro de llve concern. Ce ntait pas
demand, mais pourquoi pas !
Petite remarque: le programme ne marche pas si on saisit 0 pour le nombre dlves.
Inutile de sattarder pour le moment plus longtemps sur ce problme qui va tre vu en
dtail plus loin.

Exercice 8
a) chaine1 prenom + nom
"NicolasDupont"

Corrigs des exercices

Page 149

Cest une simple concatnation entre les 2 variables.


b) chaine2 prenom + " " + nom
"Nicolas Dupont"
Cette fois, un espace est insr entre les 2.
c) val1 longueur(chaine2)
14
Cela reprsente le nombre de caractres contenu dans chaine2 (lespace est un caractre).
d) chaine3 extraire(chaine2, longueur(prenom)+2)
"Dupont"
longueur(prenom) donne le nombre 7 (7 lettres dans "Nicolas"). Du coup, la fonction
extraire va rcuprer tous les caractres de chaine2 partir du 9e (7+2).
e) chaine4 extraire(chaine2, recherche(" ", chaine2)+1)
"Dupont"
recherche va chercher la position de lespace qui est la 8e place. La fonction extraire va
donc donner le mme rsultat en rcuprant les caractres partir du 9e (8+1).
f) val2 val1 - frequence("o", chaine2)
12
val1 contient 14. La fonction frequence compte le nombre dapparitions du caractre
"o" dans chaine2. Il apparat 2 fois. Donc 14 - 2 = 12.

8 2944 TG PA 00

Exercice 9
Voici lalgorithme demand:
programme binaire
decimal: entier
binaire: chane
debut
binaire ""
afficher "entrer un nombre convertir: "
saisir decimal
tantque decimal > 0
binaire str(decimal mod 2) + binaire
decimal decimal div 2
fintantque
afficher binaire
fin
La variable "binaire" va permettre de concatner les informations (les restes des divisions) dans le sens inverse pour obtenir le bon rsultat.
On boucle tant quil reste quelque chose rcuprer. Dans la boucle, il suffit de rcuprer le reste pour le concatner la chane et de diviser le nombre par 2.
Le mieux est que vous fassiez une trace de ce programme pour bien comprendre le principe (dans le cas o vous ntes pas arriv lcrire).

Exercice 10
Corrigs des exercices

Page 150

Pour que lalgorithme soit comprhensible, il faut travailler plusieurs niveaux:


les indentations: vous avez remarqu que mme sur un petit programme comme
celui-l, labsence dindentation rend le programme trs difficile comprendre ;
les noms des variables : a, b et c, ce nest pas trs parlant. Une fois les variables
renommes, le programme gagne encore en lisibilit ;
les commentaires permettent de mieux cerner les diffrents blocs du programme
et leur fonction ;
les dclarations en dbut de programme permettent aussi de mieux reprer les
variables utilises.
Voici comment lalgorithme pourrait tre rcrit:
programme multiple
valeur, i: entier
rep: caractere
debut
// boucle pour permettre de traiter plusieurs nombres
rep "O"
tantque rep = "O"
// saisir dun nombre
saisir valeur

8 2944 TG PA 00

si valeur > 1 alors


// affichage des 10 premiers multiples du nombre
pour i de 1 10
afficher (valeur*i)
finpour
sinon
// message derreur si le nombre nest pas suprieur 1
afficher "impossible"
finsi
// demande lutilisateur sil veut continuer
afficher "continuer? (O/N) "
repeter
saisir rep
jusqu rep = "N" ou rep = "O"
fintantque
fin
Lobservation globale de cet algorithme permet de mieux voir le but. Ce qui tait quasiment impossible dans lancienne version.
Ce programme affiche les 10 premiers multiples dune valeur suprieure 1. Donc en
quelque sorte on obtient la table de multiplication dune valeur.

Exercice 11
Avant de vous montrer une version optimise, commenons par une version qui ne lest
pas. Sur un sujet de ce type, on retrouve 3 erreurs classiques:
les tests spars : faire 3 tests spars nest pas une bonne ide puisque les
plages de valeurs tester se suivent. Il faut donc faire en sorte que lordinateur fasse le moins de tests possible;
les affichages identiques multiples: plusieurs affichages se ressemblent fortement: autant faire un seul affichage la fin, en intgrant des variables;
les calculs identiques multiples : comme pour les affichages, autant faire un
seul calcul avec des variables.

Corrigs des exercices

Page 151

Voici une version "lourde" de lalgorithme demand:


programme remise
montant: rel
debut
afficher "entrer un montant: "
saisir montant
si montant > 40 alors
afficher "remise=10%, montant=", (montant*0.9)
finsi
si montant >= 20 et montant < 40 alors
afficher "remise=5%, montant=", (montant*0.95)
finsi
si montant < 20 alors
afficher "remise=0%, montant=", montant
finsi
fin

8 2944 TG PA 00

Vous remarquez toutes les erreurs qui viennent dtre cites.


Voici une version optimise de lalgorithme demand:
programme remise
montant: rel
remise: entier
debut
afficher "entrer un montant: "
saisir montant
remise 0
si montant > 40 alors
remise 10
sinon
si montant >= 20 alors
remise 5
finsi
finsi
afficher "remise=",remise,"%, montant=",(montant*(1-remise/100))

fin
Vous remarquez les si imbriqus: en effet, quand on est dans le "sinon", cela signifie
que montant est forcment infrieur ou gal 40, donc il est inutile de refaire le test. Il
ne reste plus qu tester montant avec 20.
Loptimisation est aussi au niveau du calcul et de laffichage qui ne sont grs quune
seule fois la fois.
Lalgorithme est ainsi optimis au niveau de lexcution et gagne en lisibilit.
Corrigs des exercices

Exercice 12
Page 152

Voici lvolution des variables avec la premire trace:


afficher "entrer un age"
saisir age
nb 0
total 0
tantque age <> 0
total total + age
nb nb + 1
afficher "entrer un age"
saisir age
fintantque
tantque age <> 0
total total + age
nb nb + 1
afficher "entrer un age"
saisir age
fintantque
tantque age <> 0
total total + age
nb nb + 1
afficher "entrer un age"
saisir age
fintantque
tantque age <> 0
afficher "moyenne = " + str(total/nb)

8 2944 TG PA 00

age
12

nb
0

total

0
12

20

3
0

27

Le dernier affichage va afficher:


moyenne = 9
car total contient 27 et nb contient 3
Voici lvolution des variables avec la seconde trace:
afficher "entrer un age"
saisir age
nb 0
total 0
tantque age <> 0
afficher "moyenne = " + str(total/nb)

age
0

nb
0

total

Cette fois on ne rentre mme pas dans la boucle et du coup, au final, lordinateur va
essayer de faire lopration suivante: total/nb. Mais comme nb contient 0, il y a division
par 0 donc une erreur dexcution.
En ltat, le programme ne marche pas dans ce cas. Il suffit donc dajouter un test en fin
de programme, avant laffichage.
// calcul de la moyenne des ges
debut
// saisie du premier ge
afficher "entrer un ge"
saisir age
// initialisation des variables
nb 0
total 0
// boucle sur la saisie des ges (arrt 0)
tantque age <> 0
// cumul des ages et comptabilisation du nombre de saisies
total total + age
nb nb + 1
// saisie dun ge
afficher "entrer un ge"
saisir age
fintantque
// calcul et affichage de la moyenne
si nb > 0 alors
afficher "moyenne = " + str(total/nb)
sinon
afficher "pas de moyenne possible"
finsi
fin

Corrigs des exercices

Page 153

Exercice 13
Voici la premire trace dtaille:

si (A = B ou A <> C) et (B <> C) alors


sinon
A 2 * C
finsi

A
2

B
5

C
2

8 2944 TG PA 00

Le premier test ntant pas vrifi, on passe directement au "sinon" du grand "si".
Voici la seconde trace dtaille:

si (A = B ou A <> C) et (B <> C) alors


A B - C
si A < B alors
B A
C 3
finsi
C 2 * C
finsi

A
9

B
9

C
4

5
5

3
6

Cette fois le premier test est vrifi, ainsi que le second.


Voici la troisime trace dtaille:

si (A = B ou A <> C) et (B <> C) alors


A B - C
si A < B alors
sinon
A B
finsi
C 2 * C
finsi

A
4

B
2

C
-1

3
2
-2

Remarquez qu partir du moment o vous entrez dans le "alors" du premier test, forcment vous passez par la ligne "C 2 * C".
Corrigs des exercices

Page 154

Exercice 14
Voici les erreurs:
programme cumul
nombre, cumul: numrique
debut
afficher "saisir un nombre"
saisir un nombre
tantque nombre = 0
cumul cumul + 1
afficher "saisir un nombre"
saisir un nombre
fintantque
afficher "le cumul est " + "cumul"
fin
Explication des erreurs:
un: va tre interprt comme une variable. Ce mot na rien faire l. Il faut lenlever et laisser juste le nom de la variable aprs lordre saisir ;
=: il faut boucler tant que cest diffrent de 0, et pas gal, puisque le but est de
sarrter de boucler ds quon a saisi 0 ;
1: le cumul doit se faire sur les nombres saisis (en ajoutant 1, on ne fait que compter
les nombres, on ne fait pas le cumul) ;
un: idem quau-dessus ;

8 2944 TG PA 00

cumul nest pas initialis ! Puisque cette variable est utilise dans un calcul, il faut
linitialiser en dbut de programme ;
"cumul": en mettant entre guillemets, cest le mot "cumul" qui va safficher et non
le contenu de la variable.
Voici la version corrige:
programme cumul
nombre, cumul: numrique
debut
cumul 0
afficher "saisir un nombre"
saisir nombre
tantque nombre <>0
cumul cumul + nombre
afficher "saisir un nombre"
saisir nombre
fintantque
afficher "le cumul est " + cumul
fin
Vous avez peut-tre converti cumul avant de lafficher (avec str): cest une bonne ide.
Ceci dit ce nest pas une obligation.

Exercice 15
Voici lalgorithme demand:
programme habitants
ville: chane
nbhab: entier
debut
afficher "entrez un nom de ville"
saisir ville
afficher "entrez le nombre dhabitants"
saisir nbhab
afficher ville + " possde " + nbhab + " habitants"
fin

Corrigs des exercices

Page 155

Voil un premier exercice dcriture complte dun algorithme, volontairement simpliste,


qui permet juste de contrler que vous savez saisir et afficher (en combinant des informations au niveau de laffichage).

Exercice 16
Voici lalgorithme demand:
programme conversion
prix: rel
debut
afficher "entrez un prix en Euro"
saisir prix
afficher (prix * 6.55957)
fin
Le calcul peut aussi se faire dans une variable intermdiaire avant laffichage.

8 2944 TG PA 00

Exercice 17
Voici lalgorithme demand:
programme conseil
moyenne: numrique
debut
afficher "entrez une moyenne"
saisir moyenne
si moyenne >= 10 alors
afficher "passage"
sinon
si moyenne >= 8 alors
afficher "redoublement"
sinon
afficher "exclusion"
finsi
finsi
fin
Cet exercice permet de bien contrler que vous avez bien compris les "si imbriqus".
Attention, toute autre solution nest pas optimise (except la solution qui consiste
inverser les tests et commencer par lexclusion).

Exercice 18
Voici lalgorithme demand:
Corrigs des exercices

Page 156

programme robot
couleur: chane
debut
afficher "entrez une couleur (rouge/orange/vert)"
saisir couleur
tantque couleur<>"rouge" et couleur<>"orange" et couleur<>"vert"

afficher "erreur de saisie"


afficher "entrez une couleur (rouge/orange/vert)"
saisir couleur
fintantque
cas de couleur
"rouge": afficher "sarrter"
"orange": afficher "ralentir"
"vert": afficher "passer"
fincas
fin
Cette fois, le contrle de saisie a t fait avec un tantque. Cela permet de personnaliser
laffichage (en sparant la premire saisie des autres). La solution avec un "repeter"
marche aussi.
Voil un des rares cas ou le "cas de" est intressant. Bien sr, le problme peut se
rsoudre avec des si imbriqus comme lexercice prcdent.

8 2944 TG PA 00

Exercice 19
Voici lalgorithme demand:
programme moyenne
note, cumul, nb: numrique
rep: caractre
debut
cumul 0
nb 0
rep "O"
tantque rep = "O"
afficher "entrer une note = "
saisir note
cumul cumul + note
nb nb + 1
afficher "voulez-vous continuer? (O/N)"
saisir rep
fintantque
afficher cumul/nb
fin
Cet exercice a dj t trait. Voici une autre variante. Cette fois cest une boucle
"tantque" qui est utilise, en forant lentre dans la boucle avec linitialisation de "rep".
Vous avez peut-tre gr des tests de saisie. Ce ntait pas demand cependant cest trs
bien si vous lavez fait.

Exercice 20
Voici lalgorithme demand:

Corrigs des exercices

Page 157

programme valeurs
positif, nb, valeur: numrique
debut
positif 0
pour nb de 1 20
afficher "entrer un nombre = "
saisir valeur
si valeur >= 0 alors
positif positif + 1
finsi
finpour
afficher "nombre de valeurs positives = " + positif
afficher "nombre de valeurs ngatives = " + (20 - positif)
fin
Observez quil est inutile de compter le nombre de valeurs ngatives. Une simple soustraction suffit.

8 2944 TG PA 00

Exercice 21
Voici lalgorithme demand:
programme minmax
min, max, note: numrique
rep: caractre
debut
min 20
max 0
rep = "O"
tantque rep = "O"
afficher "saisir une note"
saisir note
si note > max alors
max note
finsi
si note < min alors
min note
finsi
afficher "Voulez-vous continuer? (O/N) = "
saisir rep
fintantque
afficher "note la plus basse = " + min
afficher "note la plus haute = " + max
fin

Corrigs des exercices

Page 158

Dans ce cas, les bornes tant connues, elles peuvent tre utilises pour initialiser min et
max. La variable min est initialise avec la valeur la plus haute possible: ainsi, ds la premire saisie, si la valeur saisie est plus petite que cette valeur, elle viendra la remplacer.
Cest la mme logique, lenvers, pour la variable max.

Exercice 22
Voici lalgorithme demand:
programme temperatures
temp, min, max: numrique
rep: caractre
debut
afficher "entrez une temperature = "
saisir temp
min, max temp
afficher "voulez-vous continuer? (O/N) = "
saisir rep
tantque rep = "O"
afficher "entrez une temperature = "
saisir temp
si temp > max alors
max temp
finsi
si temp < min alors
min temp
finsi
afficher "voulez-vous continuer? (O/N) = "
saisir rep

8 2944 TG PA 00

fintantque
afficher "temperature la plus basse = " + min
afficher "temperature la plus haute = " + max
fin
Cette fois les bornes ne sont pas connues donc min et max doivent tre initialiss avec
une des valeurs relles (autant prendre la premire).

Exercice 23
Voici lalgorithme demand:
programme suite
valeur, ancval: numrique
croissant: boolen
rep: caractere
debut
afficher "entrer une valeur"
saisir ancval
croissant vrai
afficher "voulez-vous continuer? (O/N): "
saisir rep
tantque rep = "0"
afficher "entrer une valeur"
saisir valeur
si valeur <= ancval alors
croissant faux
finsi
ancval valeur
afficher "voulez-vous continuer? (O/N): "
saisir rep
fintantque
si croissant alors
afficher "la suite est strictement croissante"
sinon
afficher "la suite nest pas strictement croissante"
finsi
fin

Corrigs des exercices

Page 159

L a devient un peu plus complexe car il faut trouver une solution. Cest dailleurs ce
qui est intressant en programmation: on se trouve parfois confront des sortes de
"casse-ttes" rsoudre.
Ici, la solution est tout simplement de comparer une valeur avec la prcdente, mais pour
cela il faut 1 valeur davance.
Remarquez aussi que la variable "croissant" est initialise vrai et, dans la boucle, ds
que lon trouve un cas dcroissant, on passe cette variable faux, qui ne reviendra plus
jamais vrai dans le reste du programme. Attention donc lerreur classique qui consiste
mettre un "sinon" ce test: il ne faut surtout pas remettre "croissant" vrai.

8 2944 TG PA 00

Exercice 24
Voici lalgorithme demand:
programme premier
nombre, diviseur: entier
debut
diviseur 2
tantque nombre mod diviseur <> 0 et diviseur < nombre
diviseur diviseur + 1
fintantque
si diviseur = nombre alors
afficher nombre, " est premier"
sinon
afficher nombre, " nest pas premier"
finsi
fin
Le but est donc de boucler en essayant de diviser le nombre par tous les entiers de 2
ce nombre (-1). Si le reste de la division (mod) est nul, alors on a trouv un diviseur et le
nombre nest pas premier.
On dcouvre la boucle avec double condition, et du coup le test aprs la boucle.
Remarquez bien quaprs la boucle, il faut tester pourquoi on est sorti de la boucle (estce parce quon a trouv un diviseur ou parce quon est arriv au bout des tests?).

Corrigs des exercices

Page 160

La version un peu plus optimise consiste sarrter non pas nombre-1 mais la racine
carre du nombre. La version la plus optimise consiste nutiliser comme diviseurs que
des nombres premiers.

Exercice 25
Voici lalgorithme demand:
programme temperatures
temp, min, max: rel
k: entier
debut
afficher "entrer une temprature: "
saisir temp
min, max temp
pour k de 2 365
afficher "entrer une temprature: "
saisir temp
si temp < min alors
min temp
sinon
si temp > max alors
max temp
finsi
finsi
finpour
afficher "t min = " + min
afficher "t max = " + max
fin

8 2944 TG PA 00

On retrouve la recherche dun min et dun max dans une plage non connue. La diffrence
avec un exercice prcdemment fait est le fait que lon connait le nombre dinformations
saisir. Il faut tout de mme en saisir une premire avant la boucle pour initialiser min
et max. Voil pourquoi la boucle commence 2.

Exercice 26
Voici lalgorithme demand:
programme echecs
nbgrains, total, k: numrique
debut
nbgrains 1
total 1
pour k de 2 64
nbgrains nbgrains * 2
total total + nbgrains
finpour
afficher total
fin
Le programme est plutt simple. Il faut juste viter de se tromper sur linitialisation de
total (car une initialisation 0 ferait que le rsultat resterait nul !).
En fait, la principale difficult de cet exercice rside dans la comprhension du sujet.
Jusqu maintenant, vous avez eu des exercices trs "carrs" o les attentes taient
clairement prsentes. Cette fois, il faut dcrypter une histoire. lexamen, les histoires
ne seront pas exotiques comme celle l puisquelles seront issues de cas actuels et ralistes, mais vous aurez aussi vous plonger dans un contexte et comprendre ce qui est
demand.

Corrigs des exercices

Page 161

Exercice 27
Voici lalgorithme demand:
programme conversion
h, m, s: entier
result: chaine
debut
// saisie des secondes avec contrle
repeter
afficher "entrer une dure en secondes (entre 0 et 86400): "
saisir s
jusqu s >= 0 et s < 86400
// calcul des heures, minutes et secondes
h s div 3600
m (s mod 3600) div 60
s s mod 60
// dbut de cration de la chane, avec les secondes
result str(s)
// ajout dun "O" devant, si ncessaire
si s < 10 alors
result "0" + result

8 2944 TG PA 00

finsi
// suite de la cration de la chane avec les minutes
result str(m) + ":" + result
// ajout dun "O" devant, si ncessaire
si m < 10 alors
result "0" + result
finsi
// fin de la cration de la chane avec les heures
result str(h) + ":" + result
// ajout dun "O" devant, si ncessaire
si h < 10 alors
result "0" + result
finsi
// affichage de la chane complte
afficher result
fin
Lisez bien les commentaires qui vous expliquent la dmarche de lalgo. Vous tes peuttre parti dans une autre direction qui marche, aussi bien au niveau du calcul que de
la cration de la chane. Vrifiez tout de mme votre solution en faisant une trace, et
comparez votre solution celle-ci pour voir si elle est aussi optimise. Elle lest dailleurs
peut-tre encore plus !

Exercice 28
Voici le code C++ correspondant lalgorithme (des commentaires ont t ajouts):
Corrigs des exercices

Page 162

/* Traduction dun algorithme: somme de valeurs


* auteur: Emds
* date: 28/05/2011
*/
//--- bibliothques ncessaires --#include <stdio.h>
// pour le printf et scanf
#include <conio.h>
// pour le getch
//--- programme principal --int main () {
// variables
int valeur, total = 0;
// boucle sur la saisie des valeurs
printf("entrer une valeur (0 pour arrter): ");
scanf("%d", &valeur);
while (valeur != 0) {
total += valeur;// cumul des valeurs
printf("entrer une valeur (0 pour arrter): ");
scanf("%d", &valeur);
}
// affichage de la somme
printf("\nla somme des valeurs est de: %d", total);
getch();
return 0;
}

8 2944 TG PA 00

Exercice 29
Voici le code C++ attendu:
/* Jeu du nombre cach (modifi)
* auteur: Emds
* date: 27/05/2011
*/
//--- bibliothques ncessaires --#include <stdio.h>
// pour le printf et scanf
#include <conio.h>
// pour le getch
#include <stdlib.h>
// pour le system("cls")
//--- programme principal --int main () {
// dclarations
int valeur, essai, nbre = 1;
// saisie du nombre chercher
printf("Entrez le nombre \x85 chercher = ");
scanf("%d",&valeur);
system("cls");
// boucle sur la saisie des essais
printf("Entrez un essai = ");
scanf("%d",&essai);
while (essai != valeur && nbre < 10) {

Corrigs des exercices

if (essai > valeur) {

Page 163

printf("trop grand !");


}else{
printf("trop petit !");
}
printf("\nEntrez un nouvel essai = ");
scanf("%d",&essai);
nbre++;
}
// rsultat
if (essai != valeur) {

8 2944 TG PA 00

printf("perdu ! la valeur \x82tait %d", valeur);


}else{
printf("Vous avez trouv\x82 en %d essais: ", nbre);
if (nbre < 5) {
printf("bravo !");
}else{
if (nbre < 8) {
printf("bien !");
}else{
printf("moyen");
}
}
}
getch();
return 0;
}
Corrigs des exercices

Page 164

La limitation des essais consiste rajouter un second test au niveau de la boucle. Ensuite,
tout se passe aprs la boucle avec une succession de tests.

Exercice 30
Voici le code C++ corrig:
/* recherche derreurs
* auteur: Emds
* date: 28/05/2011
*/
//--- bibliothques ncessaires --#include <stdio.h> // pour le printf et scanf
//--- programme principal --int main () {
int i, nb;
printf("Cherche si un nombre est premier");
printf("\nNombre (0 pour finir) = ");
scanf("%d", &nb);
while (nb != 0) {
i = 2;
while (nb%i != 0 && i < nb) {
i++;

8 2944 TG PA 00

}
if (i==nb) {
printf("premier");
}else{
printf("pas premier");
}
printf("\n\nNombre (0 pour finir) = ");
scanf("%d", &nb);
}
return 0;
}
Les erreurs corriges sont marques en couleur.

Exercice 31
Voici lalgorithme attendu:
programme temperatures
temp[1..365]: entier
k: entier
moyenne: rel
debut
//--- saisie des 365 tempratures --moyenne 0
pour k de 1 365
afficher "entrer une temprature = "
saisir temp[k]
moyenne moyenne + temp[k]
finpour

Corrigs des exercices

Page 165

//--- calcul de la moyenne --moyenne moyenne / 365


//--- affichage des tempratures au dessus de la moyenne --pour k de 1 365
si temp[k] > moyenne alors
afficher temp[k]
finsi
finpour
fin
Toutes les tempratures sont stockes dans le tableau, puis la moyenne est calcule et
enfin toutes les tempratures sont testes par rapport la moyenne.

8 2944 TG PA 00

Exercice 32
a) Saisir 20 notes et afficher la moyenne
NON. Pour calculer la moyenne, il suffit de cumuler et de compter les notes. Ce type
dexercice a dj t fait.
b) Saisir 20 notes et afficher le % de notes suprieures la moyenne des notes saisies
OUI. Comme pour les tempratures, pour calculer ce pourcentage il va falloir comparer
chaque note avec la moyenne des notes qui ne peut tre calcule quaprs avoir saisi
toutes les notes.
c) Saisir 20 notes et afficher le % de notes suprieures 10
NON. Il suffit, au fur et mesure de la saisie, de compter le nombre de notes au dessus
de 10 et le nombre de notes au total.
d) Saisir 20 notes et les afficher dans lordre inverse de la saisie
OUI. Pour afficher dans lordre inverse, il faut au pralable les avoir mmorises. Il y
a cependant une autre solution un peu spciale : en mmorisant les notes dans une
variable chane, avec une concatnation inverse, pour ensuite afficher la variable chane
en une seule fois.
e) Saisir 20 notes et les afficher tries dans lordre croissant
OUI. Pour trier, il faut faire des comparaisons entre les notes, donc il faut les avoir toutes
mmorises.
f) Saisir 20 notes et afficher la note la plus basse et la note la plus haute
NON. Cet exercice a dj t fait: il suffit de comparer les notes chaque fois avec un
min et un max.
Corrigs des exercices

Page 166

Exercice 33
Voici lalgorithme attendu:
programme matrice
M1[1..10, 1..10]: numerique
M2[1..10, 1..10]: numerique
M[1..10, 1..10]: numerique
i, j: entier
debut
//--- saisie de la 1ere matrice --pour i de 1 10
pour j de 1 10
afficher "ligne " + i + " colonne " + j + ": "
saisir M1[i, j]
finpour
finpour
//--- saisie de la 2eme matrice --pour i de 1 10
pour j de 1 10
afficher "ligne " + i + " colonne " + j + ": "
saisir M2[i, j]
finpour
finpour

8 2944 TG PA 00

//--- calcul et affichage de la matrice somme --pour i de 1 10


pour j de 1 10
M[i, j] M1[i, j] + M2[i, j]
afficher M[i, j]
finpour
finpour
fin
Ici on ne sest pas proccup de la gestion du positionnement pour laffichage.
Limportant est le principe des 2 boucles imbriques: une pour parcourir les lignes et une
autre pour parcourir les colonnes. Faites une trace pour mieux comprendre.

Exercice 34
Voici lalgorithme attendu:
programme moyennesup
s_etudiants: structure
nom: chaine
moy: rel
finstructure
t_etudiant[1..40]: s_etudiant
moyenne: rel
rep: caractere
nb, k: entier
debut
nb 0
moyenne 0

// compteur dtudiants
// cumul des moyennes

Corrigs des exercices

Page 167

//--- saisie des informations --repeter


nb nb + 1
afficher "nom de ltudiant = "
saisir t_etudiant[nb].nom
afficher "moyenne de ltudiant = "
saisir t_etudiant[nb].moy
moyenne moyenne + t_etudiant[nb].moy
afficher "voulez-vous continuer? (O/N) "
afficher "voulez-vous continuer? (O/N) "
saisir rep
jusqu rep = "N" ou k = 40
//--- calcul de la moyenne --moyenne moyenne / nb
//--- affichage des tudiants au dessus de la moyenne --pour k de 1 nb
si t_etudiant[k].moy > moyenne alors
afficher t_etudiant[k].nom
finsi
finpour
fin

8 2944 TG PA 00

On pourrait amliorer le programme en vitant de poser la question pour continuer,


quand k = 40.
Mais limportant nest pas l: observez bien la syntaxe. Vrifiez que vous avez correctement manipul les tableaux de structures.

Exercice 35
Les exercices sur les tris et recherches sont des squences algorithmiques: le vecteur vec
utilis et considr comme dj rempli et contenant n valeurs.
Voici lalgorithme attendu:

Corrigs des exercices

Page 168

programme tri_selection
i, j, numcase: entier
sauv: num
debut
...
pour i de 1 n-1
numcase i
//--- recherche du plus petit lment de i n --pour j de i+1 n
si vec[j] < vec[numcase] alors
numcase j
finsi
finpour
//--- change des 2 cases --sauv vec[numcase]
vec[numcase] vec[i]
vec [i] sauv
finpour
...
fin
Faites la trace de ce programme en reprenant le tableau du cours et la trace propose.
Vous pourrez ainsi voir que cela correspond lexplication du cours.
Cette remarque est valable pour tous les algos de tris et de recherches.

Exercice 36
Voici lalgorithme attendu:
programme tri_insertion
i, j: entier
sauv: num
debut
...
pour i de 2 n
sauv vec[i]
//--- dcalages des valeurs pour positionner la nouvelle --j i-1
tantque sauv < vec[j] et j > 0
vec[j+1] vec[j]

8 2944 TG PA 00

j j 1
fintantque
//--- insertion de la nouvelle valeur --vec[j+1] sauv
finpour
...
fin

Exercice 37
Voici lalgorithme attendu:
programme tri_bulle
i: entier
sauv: num
echange: boolen
debut
...
//--- boucle tantque des changes sont faits --//--- (donc tantque le vecteur nest pas tri) --repeter
echange faux
//--- parcours avec comparaison des cases 2 2 --pour i de 2 n
si vec[i] < vec[i-1] alors
sauv vec[i]
vec[i] vec[i-1]
vec[i-1] sauv
echange vrai
finsi
finpour
jusqu non echange
...
fin

Corrigs des exercices

Page 169

Exercice 38
Dans les 2 exercices sur les recherches, la variable "valeur", qui contient la valeur chercher, est cense tre dclare et remplie (en plus du vecteur).
Voici lalgorithme attendu:
programme rech_sequentielle
i: entier
debut
...
i 1
tantque valeur <> vec[i] et i < n
i i + 1
fintantque
si valeur = vec[i] alors
afficher i
sinon
afficher "non trouv"
finsi
...
fin

8 2944 TG PA 00

Exercice 39
Voici lalgorithme attendu:
programme dichotomie
min, max, milieu: entier
debut
...
min 1
max n
milieu (min + max) div 2
tantque valeur<>vec[milieu] et min<max
si valeur<vec[milieu] alors
max milieu - 1
sinon
min milieu + 1
finsi
milieu (min + max) div 2
fintantque
si valeur = vec[milieu] alors
afficher milieu
sinon
afficher "non trouv"
finsi
...
fin

Corrigs des exercices

Page 170

Exercice 40
debut contient successivement: 5, 4, 3, 2, 1
fin contient successivement: 50, 40, 30, 20, 10
Lintrt de cet exercice rside dans lutilisation dindices un peu spciaux. Remarquez
bien dans la seconde boucle que le tableau fin est finalement rempli de la 5e la 1re case.
Si vous avez bien compris cette trace, vous ne devriez pas avoir de problme pour la
suite, en particulier au niveau des indices

Exercice 41
Voici les erreurs:
programme temperatures
temp[1..100], moyenne: reel
k, nb: entier
debut
moyenne 0
pour k de 1 100
afficher "entrer la temprature n " + k + " = "
saisir temp[k]
moyenne moyenne + temp[k]
finpour
moyenne moyenne / 100
nb 0

8 2944 TG PA 00

pour k de 1 100
si temp[k] > moyenne alors
nb nb + 1
finsi
finpour
afficher "le % de t au dessus de la moyenne est de "+nb+"%"
fin
Il y avait 4 erreurs: elles sont en couleur dans lalgo.

Exercice 42
Voici lalgorithme attendu:
programme permutation
vec[1..100], val: numerique
k: entier
debut
pour k de 1 100
afficher "entrer un nombre = "
saisir vec[k]
finpour
pour k de 1 50
val vec[k]
vec[101-k] val
finpour
fin
Petit pige : lors de la permutation, il faut sarrter au milieu du vecteur sinon, vous
faites une double permutation et ainsi vous revenez lordre initial.
Pour viter dutiliser 2 indices, un petit calcul sur lindice a t fait. En revanche, une
variable intermdiaire est utilise pour raliser lchange.

Corrigs des exercices

Page 171

Voici une autre solution sans variable intermdiaire:


programme permutation
vec[1..100]: numerique
k: entier
debut
pour k de 1 100
afficher "entrer un nombre = "
saisir vec[k]
finpour
pour k de 1 50
vec[101-k] vec[k] + vec[101-k]
vec[k] vec[101-k] - vec[k]
vec[101-k] vec[101-k] - vec[k]
finpour
fin
Observez l'astuce qui consiste rcuprer la temprature comme indice du tableau freq
(aprs un petit calcul).

8 2944 TG PA 00

Exercice 43
Voici l'algorithme attendu:
programme temperatures
freq[1..61], temp: entier
k: entier
debut
//---initialisation du tableau des frquences --pour k de 1 61
freq[k] 0
finpour
//--- boucle sur la saisie des tempratures --pour k de 1 365
repeter
afficher "entrer une temperature = "
saisir temp
jusqu' temp>=-20 et temp<=40
freq[temp+21] freq[temp+21] + 1
finpour
//--- affichage des frquences --pour k de 1 61
afficher "t ", (k-21), " frequence: ", freq[k)
finpour
fin
Corrigs des exercices

Observez l'astuce qui consiste rcuprer la temprature comme indice du tableau freq
(aprs un petit calcul).

Page 172

Exercice 44
Voici lalgorithme attendu:
programme villes
s_ville: structure
nom: chaine
freq: entier
finstructure
t_ville[1..100]: s_ville
uneville: chaine
k, nb: entier
rep: caractere
debut
//--- saisie de la premire ville --nb 1
afficher "ville = "
saisir t_ville[nb].nom
t_ville[nb].freq 1
//--- boucle sur les autres saisies --afficher "continuer? "
saisir rep
tantque rep = "O" et nb < 100

8 2944 TG PA 00

//--- saisie dune ville --afficher "ville = "


saisir uneville
//--- recherche de la ville dans le tableau --k 1
tantque k < nb et uneville <> t_ville[k].nom
k k + 1
fintantque
si uneville = t_ville[k].nom alors
//--- si elle existe, incrmentation de la frquence --t_ville[k].freq t_ville[k].freq + 1
sinon
//--- si elle nexiste pas, on lajoute --nb nb + 1
t_ville[nb].nom uneville
t_ville[nb].freq 1
finsi
afficher "continuer? "
saisir rep
fintantque
//--- boucle sur laffichage final --pour k de 1 nb
afficher t_ville[k].nom, ": ", t_ville[k].freq
finpour
fin
Observez les tapes du programme et les commentaires pour comprendre la logique
globale.

Corrigs des exercices

Page 173

Quand le sujet ne prcise pas la taille d'un tableau, il faut improviser. Cependant mettez
toujours une taille fixe.

Exercice 45
Cest votre premier exercice qui aborde la notion de "rupture". Cela signifie quil y a un
ensemble parcourir et que cet ensemble contient des sous-ensembles sur lesquels des
traitements doivent tre faits.
Cest un cas classique sur les vecteurs tris. Le vecteur est tri sur nomlog et il va falloir
grer les groupes qui ont le mme nomlog.
Il existe 2 solutions pour grer les ruptures: soit en faisant un "pour" afin de parcourir
tout le vecteur et un test dans la boucle pour reprer le changement de valeur, soit en
faisant un double tantque, le premier bouclant sur lensemble des valeurs et le second
sur les valeurs identiques. Il ny a pas une solution meilleure que lautre.
Par contre trs nettement, certains tudiants prfrent une solution et certains prfrent
lautre solution. vous de voir ce que vous prfrez, cependant vous devez tre capable
de comprendre les deux.

8 2944 TG PA 00

Premire solution:
programme erreurs
nb, k: entier
debut
...
nb 1
pour k de 2 nberreurs
si t_erreur[k].nomlog = t_erreur[k-1].nomlog alors
nb nb + 1
finsi
finpour
afficher t_erreur[nberreurs].nomlog, ": ", nb, " erreur(s)"
...
fin
Seconde solution:

Corrigs des exercices

Page 174

programme erreurs
ancnom: chaine
nb, k: entier
debut
...
k 1
tantque k <= nberreurs
ancnom t_erreur[k].nomlog
nb 0
tantque t_erreur[k].nomlog = ancnom et k <= nberreurs
nb nb + 1
k k + 1
fintantque
afficher ancnom, ": ", nb, " erreur(s)"
fintantque
...
fin

Exercice 46
Voici la premire squence algorithmique demande:
...
repeter
saisir reponse
jusqu reponse = "N" ou reponse = "O"
...
Ce genre de contrle de saisie a dj t abord.
Voici une fonction qui peut grer ce contrle:
fonction ON(c: caractere): booleen
debut
si c="O" ou c="N" alors
retourner vrai
sinon
retourner faux
finsi
fin

8 2944 TG PA 00

Cette fonction peut tre crite plus simplement:


fonction ON(c: caractere): booleen
debut
retourner (c="O" ou c="N")
fin
Le test du "si" est de type boolen (soit le test est vrai, soit il est faux) donc on peut
directement retourner le test puisque la fonction doit justement retourner un boolen.
Si cette version vous traumatise, ne lutilisez pas. Cependant cest tout de mme important de la comprendre. Et surtout cest tellement plus joli comme a...
Voici la squence algorithmique du dbut, rcrite en utilisant la fonction:
...
repeter
saisir reponse
jusqu ON(reponse)
...
Vous allez peut-tre trouver que cela na pas un grand intrt. Lintrt tait surtout de
vous montrer lcriture dune fonction boolenne et son utilisation.

Exercice 47
La gestion de la trace devient nettement plus complexe. En particulier lorsque certains
paramtres sont en E/S ou en S. Attention aux 2 variables d qui ne sont pas du tout les
mmes. Si vous arrivez faire cette trace, vous avez tout compris aux paramtres.
Au final, vous devez obtenir les valeurs suivantes:
nbre1 = 3
nbre2 = 6
nbre3 = 2
d=8

Corrigs des exercices

Page 175

Exercice 48
Encore une trace pour voir si tout est compris. Cette fois cest encore plus complexe
puisque les paramtres ont les mmes noms que les variables. Ne vous laissez pas impressionner par ces noms identiques: ces variables sont totalement diffrentes.
Si vous narrivez vraiment pas faire la trace, changez les noms des variables de la
squence pour viter de tout mlanger. Mais vous devez arriver comprendre que le fait
que les noms soient identiques ne change rien.
Voici les valeurs que vous devez obtenir:
a=5
b=4
c=3
d=2

8 2944 TG PA 00

Exercice 49
Voici la procdure qui pourrait tre cre pour viter les rptitions de code:
procedure remplirTab (E/S t[1..10]: entier)
k: entier
rep: caractere
debut
k 0
repeter
k k + 1
afficher "valeur n",k ,"="
saisir t[k]
afficher "Continuer? "
saisir rep
jusqu rep = "N" ou k = 10
fin
Le tableau a t mis en paramtre E/S car il est modifi dans la procdure donc le programme appelant doit rcuprer son contenu. Si vous avez mis le paramtre juste en
S cest correct aussi car la procdure soccupe de remplir le tableau et nexploite pas le
contenu existant.
Avec cette procdure, la squence peut tre remplace ainsi:

Corrigs des exercices

Page 176

...
remplirTab(vec)
...
remplirTab(tab)
...

Exercice 50
a) Voici la squence algorithmique demande:
programme ladistance
v1, v2, d: entier
debut
...
afficher "entrer la premier valeur = "
saisir v1
afficher "entrer la seconde valeur = "
saisir v2
distance (v1, v2, d)
afficher "distance entre les 2 valeurs: " + d
...
fin
Lappel de la procdure permet de remplir la variable d qui est ensuite affiche.
b) Transformation de la procdure en fonction:
fonction distance (val1: entier, val2: entier): entier
debut
si val1 > val2 alors
retourner (val1 - val2)

8 2944 TG PA 00

sinon
retourner (val2 - val1)
finsi
fin
La fonction na besoin que de 2 paramtres puisquelle va soccuper de retourner le
rsultat du calcul.
c) Rcriture de la squence algorithmique:
programme ladistance
v1, v2, d: entier
debut
...
afficher "entrer la premire valeur = "
saisir v1
afficher "entrer la seconde valeur = "
saisir v2
afficher "distance entre les 2 valeurs: " + distance(v1, v2)
...
fin
La fonction sutilise comme une valeur, donc il est possible de linsrer directement dans
laffichage.
d) La fonction est dans ce cas plus adapte. Elle vite la variable intermdiaire (d), elle
a un paramtre en moins et son utilisation est plus "naturelle": la 2e squence est plus
facile comprendre que la premire.
Dune manire gnrale, lorsquune procdure possde un paramtre en sortie, voire en
entre/sortie, la solution sous forme de fonction est normalement plus optimise.

Exercice 51

Corrigs des exercices

Page 177

Voici la fonction:
fonction egal (n1: num, n2: num): booleen
debut
si n1 = n2 alors
retourner vrai
sinon
retourner faux
finsi
fin
Il suffit de comparer les deux paramtres. Vous connaissez dj un moyen plus court pour
crire cette fonction:
fonction egal (n1: num, n2: num): booleen
debut
retourner (n1 = n2)
fin

8 2944 TG PA 00

Exercice 52
Voici la fonction:
fonction max (a, b: entier): entier
debut
si a > b alors
retourner a
sinon
retourner b
finsi
fin

Exercice 53
Voici la fonction:
fonction vectri (vec[1..100] : s_pers, taille : entier) :
boolen
i: entier
debut
pour i de 2 taille
si vec[i].nom < vec[i-1].nom alors
retourner faux
finsi
finpour
retourner vrai
fin
Corrigs des exercices

Page 178

Cette solution exploite le fait que le "retourner" force la sortie de la fonction. Du coup
on peut viter une boucle "tantque" avec 2 conditions et un test aprs le "tantque". En
effet, la boucle "pour" ne va peut-tre pas boucler jusquau bout car, dans le cas o la
condition dans la boucle est vrifie, le "retourner" sera excut. Dans le cas contraire,
si la boucle arrive jusquau bout, cest que tous les lments sont dans lordre et ce sera
le "retourner vrai" qui sera excut.

Exercice 54
Voici la fonction:
procedure affichedouble (tabnom[1..100] : chaine, taille :
entier)
k: entier
debut
pour k de 1 taille - 1 pas de 2
afficher tabnom[k], tabnom[k+1]
finpour
si taille mod 2 = 1 alors
afficher tabnom[taille]
finsi
fin
Voici une solution: lide est de se dire que soit le nombre dlments afficher est pair,
soit impair. La boucle avance de 2 en 2 donc, en sarrtant la position (taille - 1) si taille
est pair, (taille - 1) sera impair et la boucle aura donc tout affich (puisquon avance de
2 en 2 partir de 1, ce qui donne 1-3-5-7...). Aprs la boucle, si finalement taille tait
impair, on en a un dernier afficher.

8 2944 TG PA 00

Vous vous doutez bien quil existe des tas dautres solutions pour rsoudre ce problme.
Si vous avez une autre solution, faites une trace pour contrler son fonctionnement.

Exercice 55
Comme il est conseill, voici dans un premier temps une fonction qui retourne la somme
des chiffres dun nombre pass en paramtre:
fonction sommeChiffre(x: entier): entier
tot: entier
debut
tot 0
tantque x <> 0
tot tot + x mod 10
x x div 10
fintantque
retourner tot
fin
Pour faire la somme des chiffres, il faut trouver un moyen disoler chaque chiffre. Il suffit de prendre le reste de la division par 10 (on rcupre le dernier chiffre) et diviser le
nombre par 10 pour liminer ce chiffre. Faites une trace pour mieux comprendre.
Une fois cette fonction crite, la fonction Ami devient trs simple:
fonction Amis (a, b: entier): booleen
debut
retourner (sommeChiffre(a) = sommeChiffre(b))
fin

Corrigs des exercices

Si cette solution vous fait peur, vous pouvez lcrire avec un test.
Page 179

8 2944 TG PA 00

Squence2
Exercice 1
Voici toutes les erreurs que lon peut noter sur cette interface:
trop despaces vides;
couleur de fond trop vive et non adapte;
gros titre alors que le titre doit tre dans la barre de titre uniquement;
contrles graphiques non aligns;
diagonale non respecte;
valeur numrique mal aligne dans la zone de texte;
contrles similaires de tailles diffrentes (les boutons);
instructions non parlantes.
Bref, a ne donne pas envie de jouer...
Voici une solution de prsentation pour cette interface.

Corrigs des exercices

Page 180

Attention, une petite erreur sest glisse dans cette interface. Voyez-vous laquelle? Les
lettres soulignes reprsentent les raccourcis clavier pour remplacer le clic de la souris:
il ne peut pas y avoir, comme ici, deux fois la mme lettre souligne.

Exercice 2
Voici un premier exercice type dans le domaine de la programmation vnementielle. Le
dessin de linterface est donn avec la description de tous les objets graphiques ncessaires.
Vous retrouvez des objets graphiques dj abords dans le cours (boutons, zone de texte,
label, feuille) mais aussi un nouvel objet graphique qui permet dafficher et de grer une
liste dinformations textuelles (la liste). Au cours des exercices, vous allez parfois dcouvrir de nouveaux objets qui seront prcisment dcrits pour que vous sachiez les utiliser.
1. crire le code qui va permettre de fermer la fentre.
Cette premire question est a priori trs simple, cependant il faut dj apprendre bien
respecter les rgles de lvnementiel. Noubliez pas que vous navez droit qu ce que le
sujet vous propose. Donc ceux qui ont mis "End" dans la procdure, cest faux car cette
instruction nexiste pas dans ce sujet.

8 2944 TG PA 00

La premire question se poser est: quand dois-je fermer la fentre? Dis autrement:
sur quel vnement la fentre doit se fermer? Il faut effectivement reprer lvnement
dclencheur. Daprs le sujet, cest lorsque lutilisateur va cliquer sur le bouton cmdQuitter que la fentre doit se fermer. Donc on connat lobjet concern et lvnement qui
doit tre sollicit, ce qui donne dj len-tte de la procdure vnementielle. Regardez
dans lannexe, lvnement Clic existe sur les objets Bouton.
Une fois la procdure vnementielle repre, il faut savoir ce quon doit mettre dedans.
Lors du clic sur le bouton cmdQuitter, la fentre doit se fermer. Il n'y a quune fentre
dans lapplication: frmVisu. Donc on va forcment agir sur cette fentre. frmVisu est un
objet de type Fenetre: cherchons donc dans lannexe tout ce qui est en rapport avec les
objets de type Fenetre pour trouver quelque chose qui va permettre dagir sur la fentre
pour la fermer. Il y a effectivement la mthode fermer() qui sapplique aux objets de type
Fenetre et qui permet de fermer lobjet. Il ne reste plus qu appliquer cette mthode
lobjet concern.
procedure cmdQuitter_Clic()
debut
frmVisu.fermer()
fin
La dmarche pour crire cette premire procdure vnementielle a t volontairement
trs dtaille pour que vous compreniez bien comment procder par la suite. Si ce nest
pas explicitement prcis, il faudra toujours chercher dans un premier temps lobjet et
lvnement concern, puis crire le code lintrieur de la procdure vnementielle
ainsi cre.
2. crire le code qui va permettre de supprimer un lment de la liste des polices (lstPolice). Attention, avant de supprimer, il faut sassurer quune ligne est bien slectionne,
sinon on ne fait rien.
quel moment doit se faire cette suppression? Lorsque lutilisateur clique sur le bouton
cmdSuppr. Donc on a lobjet concern (cmdSuppr) et lvnement associ (Clic): len-tte
de la procdure vnementielle est crite.

Corrigs des exercices

Page 181

Avant de supprimer, il faut contrler quun lment de la liste est bien slectionn. Le
test doit donc se faire sur la liste lstPolice. Regardons dans lannexe les proprits accessibles partir des objets de type Liste: il y a entre autres la proprit "selectionn" qui
est de type boolen et qui permet de savoir si un lment est slectionn. Cest exactement ce que lon veut: il suffit de tester cette proprit sur lobjet lstPolice (attention, il
ne faut surtout pas oublier de mettre le nom de lobjet avant le nom de la proprit car
la proprit toute seule na pas de sens).
Une fois ce test effectu, sil y a effectivement un lment slectionn, il faut le supprimer. En regardant les possibilits offertes sur les objets de type Liste dans lannexe, on
trouve dans les mthodes, la mthode "enleve(indice: entier)" qui permet de supprimer
llment de la liste dont lindice est pass en paramtre. Cest bien la mthode quil
nous faut. Reste rcuprer lindice de llment slectionn. Dans les proprits des
objets de type Liste, on trouve la proprit "numSelect" qui retourne justement lindice
de llment slectionn. Remarquez bien du coup la ligne de code qui permet de supprimer un lment de la liste : vous devez, dans la parenthse, remarquer le nom de
lobjet lstPolice pour accder la proprit numSelect. En effet, mme si vous tes dans
la parenthse de la mthode "enleve" sur lobjet lstPolice,vous ne pouvez toujours pas
marquer un nom de proprit tout seul, sans prciser lobjet concern par la proprit.

8 2944 TG PA 00

Attention, ne cherchez pas supprimer llment directement dans la proprit "element": comme cela est not dans la remarque en fin dannexe, lajout et la suppression
dans un objet de type Liste doit se faire en passant par les mthodes correspondantes
car elles soccupent aussi de mettre jour les proprits de lobjet, aprs ce changement.
procedure cmdSuppr_Clic()
debut
si lstPolice.selectionn alors
lstPolice.enleve(lstPolice.numSelect)
finsi
fin
3. crire le code qui va permettre de modifier lapparence de lblVisu pour prendre en
compte la police qui vient dtre slectionne dans lstPolice.
Vous allez voir quau final le code nest pas difficile cependant il faut bien avoir compris
le principe de manipulation des proprits et mthodes.
Avant tout, comme dhabitude, il faut se demander quel moment doit se raliser ce
traitement: lidal est que laffichage se mette jour quand lutilisateur clic directement
sur un des lments de la liste. Lvnement Clic sur les objets de type Liste existe, donc
cest parfait.

Corrigs des exercices

Page 182

Ensuite, que faut-il modifier? Le style de la police dcriture de lblVisu. Lobjet lblVisu est
un Label: on trouve, sur les objets de type Label, la proprit font qui est de type Font.
Voil un type un peu particulier: ce nest pas un type simple (entier, boolen, chane)
ni un type graphique ! Dans le cours, on vous a parl de programmation objet o, avant
daborder des objets graphiques, il est question dobjets non graphiques. Font va vous
permettre den manipuler un dj prdfini. Le principe est exactement le mme : il
possde des proprits, ventuellement des mthodes (pas ici) mais pas dvnements
puisquil nest pas graphique.
Il suffit donc de suivre la logique habituelle : lobjet sur lequel on veut agir est donc
lblVisu. Il possde la proprit font (donc on peut y accder directement) qui permet
daccder la proprit "nom" spcifique aux objets de type Font. En modifiant le
contenu de la proprit "nom", on modifie la police dcriture utilise pour afficher
le message. O rcuprer le nom de la police dcriture ? Directement en prenant le
contenu de llment slectionn dans la liste. Attention, il ne suffit pas de rcuprer le
numro de llment slectionn mais bien le texte correspondant. Pour cela, vous avez
votre disposition la proprit "element" qui est un tableau dont chaque case contient
un lment textuel de la liste. Il faut donc, comme tous les tableaux, prciser lindice de
llment cherch.
procedure lstPolice_Clic()
debut
lblVisu.font.nom lstPolice.element[lstPolice.numSelect]
fin
Si vous avez compris cette ligne de code, vous avez bien progress dans la logique de la
programmation vnementielle et objet.

8 2944 TG PA 00

4. crire le code qui va permettre dinsrer dans lstPolice la police saisie dans txtPolice.
Attention, il faudra au pralable vrifier que cette police nest pas dj prsente. Si elle
est dj prsente, on ne fait rien.
Il ny a pas de bouton mis disposition pour ajouter le contenu de txtPolice dans la liste.
Comment faire? En regardant les vnements mis disposition, on remarque lvnement "Valide" sur les objets de type Texte. Cet vnement se dclenche lorsque lutilisateur appuie sur la touche entre, donc a priori en fin de saisie. Cest parfait.
On aurait pu contrler, avant de commencer toute recherche, que lutilisateur a bien saisi
quelque chose dans txtPolice (en vrifiant le contenu de la proprit text) mais ce nest
pas explicitement demand dans le sujet.
Lide est de contrler que la police saisie nest pas dj prsente dans la liste. Il faut
donc boucler sur le contenu de la liste tant quon ne trouve pas le mme nom et quon
narrive pas au bout de la liste: cest une recherche classique que vous devez savoir faire.
La seule diffrence par rapport au code procdural de recherche que vous avez pu crire
jusqu maintenant est que l, vous manipulez des proprits dobjets graphiques. Pour
la premire fois, on a besoin dune variable locale : lindice de la boucle. Vous remarquez quil suffit de la dclarer en local de votre procdure vnementielle, comme vous
lauriez fait pour nimporte quel type de procdure ou fonction.
la sortie de la boucle, il suffit de contrler pourquoi on est sorti : si on est sorti
sans trouver le mme texte, alors lajout peut se faire. La mthode "ajoute(element :
chaine)" va permettre de raliser cette opration. Comme il est prcis dans les
remarques, il faut obligatoirement passer par cette mthode pour ajouter un lment
un objet de type Liste. Si vous ne passez pas par cette mthode, les autres proprits de
lobjet ne sont pas correctement rinitialises, en particulier la proprit nbElements qui
permet de connatre le nombre dlments de la liste.
Petite prcision complmentaire: la remarque de fin dannexe prcise que les indices de
listes commencent 1. Cette information est primordiale car cela vous permet de savoir
comment initialiser votre indice de boucle. Normalement, cette prcision est donne
dans tous les sujets (lindice commence 0 ou 1) qui manipulent des proprits de type
Tableau. Vous devez bien sr respecter la consigne. Si cela nest pas prcis, alors vous
pouvez choisir de dmarrer 0 ou 1.

Corrigs des exercices

Page 183

procedure txtPolice_Valide()
k: entier
debut
k 1
tantque txtPolice.text<>lstPolice.element[k]
et k<lstPolice.nbElements
k k + 1
fintantque
si txtPolice.text <> lstPolice.element[k] alors
lstPolice.ajoute(txtPolice.text)
finsi
fin

8 2944 TG PA 00

5. crire le code qui doit sexcuter au chargement de la feuille et qui doit initialiser le
label de visualisation avec la phrase "Voici le rsultat", puis qui doit remplir la liste des
polices avec les polices dj installes sur le disque.
Lvnement concern est clairement prcis: ce code doit sexcuter automatiquement
au chargement de la feuille. Sur les objets de type Fenetre, il existe effectivement lvnement Chargement.
Le sujet prcise que vous pouvez utiliser une procdure non vnementielle recupPolice.
Cette procdure, qui possde 2 paramtres en sortie (donc pass par adresse), permet
de valoriser un tableau avec la liste des polices installes sur lordinateur, et une variable
contenant le nombre de polices ainsi rcupres.
Pour appeler cette procdure, il faut lui envoyer 2 paramtres qui vont tre automatiquement remplis mais qui doivent donc tre dclars en variable locale la procdure
vnementielle. Ensuite, si vous savez appeler une procdure classique (non vnementielle), le reste ne pose pas de problme.
Une fois la le tableau local rempli, il suffit de boucler sur son contenu pour remplir la
liste lstPolice avec la mthode ajoute.

Corrigs des exercices

procedure frmVisu_Chargement()
tab[1..500]: chaine
nb, k: entier
debut
lblVisu.titre "Voici le rsultat"
recupPolice(tab, nb)
pour k de 1 nb
lstPolice.ajoute(tab[k])
finpour
fin

Page 184

Exercice 3
Vous retrouvez le principe dune interface graphique prsente avec lensemble de ses
objets graphiques. Cette fois, vous ne devez pas deviner les procdures vnementielles
crire puisquelles sont clairement prcises (puisquon vous demande clairement
dcrire le code derrire certains boutons prcis). Dans lannexe, on trouve sans problme
lvnement Clic sur les objets de type Bouton.
1. Clic sur le bouton cmdQuitter.
Celui-ci est le plus simple et bas sur le mme principe que lexercice prcdent. Noubliez
pas de toujours contrler dans les informations du sujet que vous avez bien les outils
ncessaires pour raliser le travail, et surtout de nutiliser que ces outils l. Ici, frmMusique est un objet de type Fentre qui possde bien la mthode Fermer().
procedure cmdQuitter_Clic()
debut
frmMusique.Fermer()
fin
Cette fois jai crit la mthode Fermer() avec un F majuscule. Pourquoi? Juste pour vous
pousser bien suivre les rgles et ne pas recopier sans rflchir ce que vous avez fait
dans lexercice prcdent.

8 2944 TG PA 00

2. Clic sur le bouton cmdVider.


Ce bouton doit permettre de vider la liste lstSelection. Il y avait un joli pige et si vous
ntes pas tomb dedans, bravo. Mme avec de lexprience cest difficile de lviter. En
effet, spontanment on a envie de faire une boucle sur tous les lments de la liste et
de les effacer un par un en utilisant la mthode Supprimer(indice: entier) avec chaque
fois lindice de la ligne concerne. Cela donnerait une boucle du genre:
...
pour k de 1 lstSelection.NbElements
lstSelection.Supprimer(k)
finpour
...
Malheureusement cela ne marche pas. Pourquoi ? Regardez bien ce qui est expliqu
dans lannexe propos de la mthode Supprimer : "Supprime llment qui se trouve
la position indice dans la liste. Tous les lments suivants sont automatiquement
renumrots (il ny a donc pas de dcalages grer).". Ceci signifie que dans votre
boucle, lorsque k vaut 1, le premier lment va tre supprim, et automatiquement tous
les autres vont tre dcals pour ne pas laisser de trou. Du coup, lancien second lment
devient le nouveau premier lment. La boucle "pour", au deuxime tour, va incrmenter k qui va prendre la valeur 2 et va alors supprimer le nouveau second lment, en
laissant le premier et ainsi de suite. Vous supprimez finalement un lment sur 2. Sans
compter le fait que la proprit NbElements est elle aussi automatiquement mise jour,
donc au fur et mesure la borne de la boucle diminue. Bref, dcidment cette solution
ne marche vraiment pas.
Comment faire? Il existe plusieurs solutions, par exemple en partant de la fin. Mais celle
qui est nettement la plus simple consiste supprimer tout le temps le premier lment,
tant quil reste des lments dans la liste. Il fallait juste y penser.
Du coup ce nest plus un "pour" mais un "tantque" qui va tre utilis. Une fois toutes
les suppressions effectues, il ne faut pas oublier de mettre jour le label lblNbSelection
pour quil contienne le nombre dlments slectionns.

Corrigs des exercices

Page 185

procedure cmdVider_Clic()
debut
tantque lstSelection.NbElements > 0
lstSelection.Supprimer(1)
fintantque
lblNbSelection.Titre "0"
fin
Remarquez au passage que laffectation du "0" se fait au format texte (donc entre guillemets). Effectivement, la proprit Titre est de type Chane donc attend une chaine de
caractres.
3. Clic sur le bouton cmdAjouterTout.
Ce bouton permet de transfrer tous les lments de lstFichiers vers lstSelection. La
dmarche est donne: vous devez dabord vider la liste lstSelection. Comment faire?
Ce serait dommage de rcrire le code qui vient d'tre dj crit. Vous avez tout fait le
droit d'appeler directement une procdure vnementielle comme si c'tait une procdure non vnementielle. Au pire, l'autre solution consiste crire une simple procdure
non vnementielle pour grer la suppression totale, puis il suffit d'appeler cette proc-

8 2944 TG PA 00

dure dans cmdVider-clic() et dans cmdAjouter-clic(). Vous l'avez compris, quelle que soit
la solution, le but est toujours d'viter d'crire 2 fois le mme code.
Aprs avoir vid lstSelection, cette fois il est possible de parcourir avec un "pour" classique tous les lments de lstFichiers pour les copier dans lstSelection. Attention, il faut
obligatoirement passer par la mthode Ajouter qui soccupe dajouter proprement les
lments en mettant jour automatiquement les autres proprits de lstSelection.
Au final, il ne faut pas oublier de mettre jour le label lblNbSelection en valorisant sa
proprit Titre avec le nombre dlments contenus dans lblSelection.
procedure cmdAjouterTout_Clic()
k: entier
debut
--- vide la liste de droite --cmdVider_Clic()
--- copie tous les fichiers de gauche droite --pour k de 1 lstFichiers.NbElements
lstSelection.Ajouter (lstFichiers.Element[k])
finpour
lblNbSelection.Titre Str(lstSelection.NbElements)
fin

Corrigs des exercices

Remarquez au passage lutilisation de la fonction Str pour transformer la contenu de


NbElements, qui est de type Entier, en un type Chane. Pourquoi? Parce que la proprit
Titre est de type Chane.
4. Clic sur le bouton cmdAjouter.

Page 186

Cette procdure est la plus longue, sans tre forcment trs complexe. L encore, la
dmarche est donne.
Dans un premier temps, il faut contrler quun fichier a bien t slectionn dans lstFichiers. Lindice des listes commence 1 et la proprit NumSelect prend la valeur 0 si
aucun lment nest slectionn. Donc cest gagn.
Si un lment est slectionn, il faut alors contrler quil nest pas dj prsent dans
lstSelection. Pour cela, la boucle "tantque" est la plus adapte car elle permet de sarrter ds quon a trouv llment (ou daller jusquau bout si on ne le trouve pas). Cette
boucle ne sert donc qu avancer dans la liste et ne contient aucun autre traitement
que lincrmentation de lindice de boucle. Ce principe de recherche est toujours le plus
performant. Prenez donc lhabitude de lutiliser. Remarquez bien la syntaxe du test du
"tantque": on compare llment slectionn de lstFichiers (celui qui est la position
NumSelect) avec le kme lment de lstSelection.
Aprs la boucle, 2 possibilits: soit on a trouv llment dans lstSelection, soit non. Do
le test. Uniquement dans le cas o llment na pas t trouv, il faut alors lajouter. Il
ne reste plus qu mettre jour le contenu du label lblNbSelection.

8 2944 TG PA 00

procedure cmdAjouter_Clic()
k: entier
debut
--- contrle si un fichier est bien slectionn gauche --si lstFichiers.NumSelect <> 0 alors
--- vrifie si le fichier nest pas dj prsent dans la liste de droite
k 1
tantque lstFichiers.Element[lstFichiers.NumSelect] <>
lstSelection.Element[k]et k < lstSelection.NbElements
k k + 1
fintantque
--- ajoute si le fichier nest pas dj prsent --si lstFichiers.Element[lstFichiers.NumSelect] <>
lstSelection.Element[k] alors
lstSelection.Ajouter (lstFichiers.Element[lstFichiers.NumSelect])
lblNbSelection.Titre Str(lstSelection.NbElements)
finsi
finsi
fin

Les commentaires ont t mis avec la cte () dans lesprit VB6, cependant vous pouvez
garder votre notation propre (// tant le plus courant).

Exercice 4
Voil nouveau une interface graphique prsente de faon dtaille. Ce qui va tre
nouveau dans cet exercice, cest essentiellement lutilisation dun tableau de structure
qui, de plus, est en variable globale, donc accessible dans toutes les procdures vnementielles que vous allez crire.

Corrigs des exercices

Page 187

1. crire la procdure vnementielle qui va permettre de fermer la fentre.


On commence par quelque chose de simple et dj vu dans les exercices prcdents.
procedure cmdQuitter_Clic()
debut
frmConvert.fermer()
fin
2. crire la procdure vnementielle qui permet de mettre jour txtConvert ds quil y
a modification dans txtEuro.
Le but est que ce calcul se fasse ds quil y a modification du contenu de txtEuro. Dans
les vnements sur les objets de type texte, il existe lvnement Changement qui se
dclenche chaque fois que lutilisateur modifie le contenu de la zone de texte. Cest
exactement ce que lon veut.
Que faut-il alors faire ? Un simple calcul : multiplier le contenu de la proprit txt
de txtEuro avec le contenu de la proprit txt de txtValeur. Attention cependant aux
conversions !

8 2944 TG PA 00

procedure txtEuro_Changement()
debut
txtConvert.txt Str(Val(txtEuro.txt)*Val(txtValeur.txt))
fin
3. crire la procdure vnementielle qui doit sexcuter quand lutilisateur slectionne
une nouvelle monnaie dans cboMonnaie.
Vous dcouvrez ici un nouvel objet graphique: le combo. Lannexe explique clairement
son fonctionnement.
Lvnement Selection sur les objets de type combo rpond exactement nos attentes.
A priori, le combo va tre rempli avec les lments qui se trouvent dans le tableau
t_convert et ce, dans le mme ordre. Donc on peut sans problme partir du principe que
lindice de la ligne slectionne dans le combo correspond lindice de la case correspondante dans le tableau t_convert. Le tableau va nous permettre de rcuprer la valeur
de la monnaie slectionne. Cette valeur doit tre transfre dans txtValeur. Vous avez
bien sr le droit dutiliser t_convert puisque le tableau est dj rempli et surtout quil est
dclar en global.
Il reste ensuite valoriser le label lblMonnaie avec le nom de la nouvelle monnaie
slectionne : nom que vous pouvez rcuprer dans t_convert ou ventuellement
directement dans le combo cboMonnaie. Ici cest la premire solution qui a t choisie.
Remarquez au final lappel de la procdure vnementielle txtEuro_Changement() qui
va permettre, compte tenu du choix de cette nouvelle monnaie, de tout mettre jour.

Corrigs des exercices

Page 188

procedure cboMonnaie_Selection()
k: entier
debut
k cboMonnaie.numSelect
txtValeur.txt Str(t_convert[k].valeur)
lblMonnaie.titre t_convert[k].nom
txtEuro_Changement()
fin
Attention, ici on part trs nettement du principe que cboMonnaie ne peut pas tre
vide. Cest une hypothse qui tient la route puisque cboMonnaie est automatiquement
rempli lors du chargement de la fentre, avec le contenu du tableau t_convert. Est-ce
que t_convert peut tre vide? Le sujet dit que non. Si a avait t le cas, il aurait fallu
faire un test sur le nbElement du combo pour contrler quil contient bien au moins un
lment.
4. crire la procdure vnementielle qui doit sexcuter au chargement de la feuille.
Que se passe-t-il au chargement de la feuille? Le combo cboMonnaie doit tre rempli
avec tous les noms de monnaies qui se trouvent dans le tableau t_convert. La variable
globale maxConvert doit tre utilise pour ne pas parcourir tout le tableau: rappelezvous que le tableau nest pas compltement rempli.
Une fois le combo rempli, le sujet vous demande de faire en sorte que le premier lment soit automatiquement slectionn: il suffit donc de transfrer 1 dans la proprit
numSelect du combo.

8 2944 TG PA 00

Enfin, puisquune monnaie est slectionne, il faut lancer le processus qui se serait
dclench automatiquement si lutilisateur avait lui-mme slectionn une monnaie.
Do lappel de la procdure vnementielle cboMonnaie_Selection().
Vous remarquez au passage que lon prend bien pour hypothse que t_convert nest pas
vide. Cest en tout cas ce qui est prcis dans le sujet.
procedure frmConvert_Chargement()
debut
pour k de 1 maxConvert
cboMonnaie.ajout(t_convert[k].nom)
finpour
cboMonnaie.numSelect 1
cboMonnaie_Selection()
fin

Exercice 5
La prsentation de dpart semble assez similaire aux autres exercices : une interface
dtaille. Quelle est la diffrence fondamentale avec les exercices prcdents ? Cette
fois on vous dit comme travail raliser: "crire tous les modules ncessaires pour que
lapplication fonctionne".
Cest donc vous de construire tout le code en rflchissant sur lensemble du fonctionnement de la fentre.
Bon, on va commencer par ce quon sait bien faire: fermer la fentre !
Procedure cmdQuitter_Clic()
debut
frmJeu.Fermer()
fin

Corrigs des exercices

Page 189

Dans cet exercice, il est demand dactiver et dsactiver rgulirement des objets graphiques pour que, tout en restant visibles, ils soient ou ne soient pas accessibles par
lutilisateur.
Pour viter dcrire plusieurs fois des choses similaires, rflchissons sur le principe.
Au chargement de la fentre et au dmarrage dune nouvelle partie, les objets txtJeu
et cmdArret doivent tre activs alors que cmdNouveau doit tre dsactiv. Tout au
contraire, sur le clic du bouton cmdArret ou lorsque le nombre a t trouv, il faut
inverser toutes les activations et dsactivations. Dans tous les cas, txtJeu doit tre vid.
Lidal est donc dcrire une procdure non vnementielle, paramtre pour englober
tous les cas:
Procedure debutJeu(etat: booleen)
debut
txtJeu.actif etat
txtJeu.texte "
cmdArret.actif etat
cmdNouveau.actif non etat
fin
Observez bien le principe: lorsque cette procdure sera appele, si le paramtre "etat"
reoit "vrai", alors txtJeu et cmdArret seront activs alors que cmdNouveau sera dsac-

8 2944 TG PA 00

tiv. Tout au contraire, si le paramtre reoit "faux", txtJeu et cmdArret seront dsactivs alors que cmdNouveau sera activ. Dans tous les cas, txtJeu est vid de son contenu.
Du coup il devient trs facile dcrire la procdure vnementielle derrire le clic du
bouton cmdArret:
Procedure cmdArret_Clic()
debut
debutJeu(Faux)
fin
La procdure debutJeu va bien sr tre appele plusieurs fois dans dautres procdures
vnementielles. Mais avant de voir cet aspect, il y a un autre problme rgler.
En effet, le jeu est bas sur la recherche dun nombre gnr alatoirement, sachant
quil faut aussi compter le nombre dessais de lutilisateur pour trouver ce nombre. Ces 2
valeurs (le nombre trouver et le nombre dessais) doivent tre accessibles dans toutes
les procdures de la page et ne pas perdre leur valeur en cours dexcution. Elles doivent
donc tre globales. Le sujet vous prcise dailleurs que vous pouvez avoir des variables
globales.
Variables globales:
nombre: entier
nbessai: entier

Corrigs des exercices

Page 190

partir de l, il est possible dcrire la procdure vnementielle qui doit sexcuter sur
le clic du bouton cmdNouveau pour lancer une nouvelle partie. Cette procdure doit
gnrer un nouveau nombre alatoire entre 1 et 100, en utilisant la fonction NvNbre. La
variable globale "nombre" est alors valorise avec le rsultat de lappel de cette fonction. Il reste initialiser le compteur dessais "nbessai" 0 et bien sr appeler la procdure prcdemment crite debutJeu en envoyant "vrai" en paramtre.
Procedure cmdNouveau_Clic()
debut
nombre NvNbre(1, 100)
debutJeu(Vrai)
nbessai 0
fin
On sait quil doit se passer exactement la mme chose sur le chargement de la fentre. Il
suffit donc dappeler la procdure prcdente, comme une procdure classique, derrire
lvnement chargement de frmJeu.
Procedure frmJeu_Chargement()
debut
cmdNouveau_Clic()
fin
Il ne reste plus qu grer le jeu lui-mme, ou plus exactement le test effectuer lorsque
lutilisateur saisit un nouvel essai.
Cest gnralement l que les rflexes de la programmation procdurale classique refont
surface. La plupart des tudiants font une boucle en se disant "il y a plusieurs essais donc
il faut boucler jusqu ce que lutilisateur ait trouv". Mais cest sans compter la logique
vnementielle. Le test doit tre ralis chaque fois que lutilisateur saisit une nouvelle
valeur : mais cette saisie nest pas "force" par le programme, comme cela aurait t
le cas dans une application procdurale pure. En fait, cest lutilisateur qui dcide lui-

8 2944 TG PA 00

mme quand saisir un nouvel essai. Du coup, la procdure vnementielle concerne se


dclenche sur lvnement Validation de la zone de texte et ne concerne quune seule
valeur tester, donc pas de boucle !
Que faut-il alors faire ? Il ne faut pas oublier dincrmenter le compteur dessai puis
il suffit de comparer la valeur saisie avec la valeur cherche. Suivant le rsultat de la
comparaison (galit, trop petit ou trop grand), il faut valoriser le label lblResultat qui
affiche le message. Au passage, jinsiste sur une autre erreur classique en vnementiel:
vous navez plus droit aux ordres algorithmiques "saisir" et "afficher". Les saisies se font
dans les objets graphiques appropris ainsi que les affichages.
Procedure txtJeu_Validation()
Debut
nbessai nbessai + 1
si Val(txtJeu.texte) = nombre alors
lblResultat.titre "Trouv en "+Str(nbessai)+"essais"
debutJeu(faux)
sinon
si Val(txtJeu.texte) > nombre alors
lblResultat.titre "Trop grand"
sinon
lblResultat.titre "Trop petit"
finsi
txtJeu.texte ""
finsi
fin

Exercice 6

Corrigs des exercices

Cette fois, linterface nest pas donne. Vous devez mme la dessiner. De plus, vous
dcouvrez une nouvelle notion : les tableaux de contrles (donc les tableaux dobjets
graphiques).

Page 191

Encore une fois, on vous demande dcrire tout le code ncessaire pour le fonctionnement de la fentre.
1. Le dessin de linterface
Voici un exemple dinterface correspondant aux attentes du sujet. Pour le plaisir, jai fait
le dessin du petit pendu, mais ce ntait pas demand. Il ntait pas non plus demand de
mettre un bouton Quitter (de toute faon la fentre peut aussi se fermer avec la croix).
txtMot
lblMot

cmdDebut

cmdLettre
(tableau de
contrles)

lblMessage

8 2944 TG PA 00

Les objets graphiques utiliss sont les suivants:


txtMot: va contenir le mot chercher (cette zone sera rendue ensuite invisible) ;
cmdDebut: pour dmarrer le jeu ;
lblMot: pour afficher les tirets et.ou les lettres trouves la bonne position ;
cmdLettre: tableau de Boutons (numrots de 1 26) ;
lblMessage: pour afficher les messages ("lettre non prsente).
Dans cet exercice, vous tiez libres pour la premire fois de donner les noms aux objets
graphiques. Malgr cette libert, il fallait essayer de respecter les rgles classiques de
nommage (3 premires lettres pour reprsenter le type dobjet, suivi dune majuscule et
dun nom parlant). Cest ce qui a t fait ici.
Une fois linterface dessine, il est plus facile de visualiser le jeu. Finalement, il ny a que
2 vnements grer: le dbut du jeu (donc en supposant que le premier joueur a saisi
un mot dans txtMot) et le clic sur une des lettres.
2. Le dmarrage du jeu
Il est prfrable de commencer par contrler quun mot a bien t saisi. Si cest le cas,
alors le mot doit tre rendu invisible.
Le label lblMot est alors rempli de tirets (autant quil y a de lettres dans le mot saisi) et
rendu visible.
Procedure cmdDebut_clic()
i: entier
debut
if txtMot.text <> "" alors
txtMot.visible faux
Corrigs des exercices

--- remplissage du label avec des tirets --lblMot.titre ""


pour i de 1 ln(txtMot.text)
lblMot.titre lblMot.titre + "_"
finpour
lblMot.visible vrai
--- les boutons des lettres sont rendus visibles --pour i de 1 26
cmdLettre[i].visible vrai
finpour
lblMessage.titre ""
lblMessage.visible vrai
finsi

Page 192

fin
3. Sur le clic dune des lettres
Sur le clic dun des boutons du tableau de boutons cmdLettre, la procdure vnementielle correspondante se dclenche. Remarquez bien, comme cela tait expliqu dans
le sujet, quun paramtre sest ajout dans len-tte de cette procdure, afin de savoir
lindice (index) du bouton slectionn. Par son index, il sera alors possible daccder au
bouton correspondant, et du coup son contenu (sa proprit titre) qui nous donnera
la lettre correspondante.
Dans un premier temps, il faut rechercher si la lettre du bouton slectionn (remarquez
bien lindex utilis pour accder au bon bouton) est prsente ou non dans le mot cher-

8 2944 TG PA 00

ch. Pour cela, on utilise plutt un "pour". Pourquoi ? Vous avez vu prcdemment
que les recherches se font gnralement avec des boucles "tantque". Ici, le "pour" est
obligatoire car la lettre peut trs bien se trouver plusieurs fois dans le mot. Il faut donc
parcourir toutes les lettres du mot. La fonction Ln permet de connatre le nombre de
lettres dun mot: cest parfait comme borne suprieure de la boucle. Une fois dans la
boucle, il faut comparer la lettre contenue dans le bouton avec la lettre qui se trouve
la position de lindice: la fonction Car permet de rcuprer une lettre prcise dun mot.
Si la lettre est effectivement trouve cette position, une variable locale boolenne va
permettre de sen rappeler (on a trouv la lettre au moins une fois) et il faut modifier le
tiret du label lblMot qui se trouve cet indice, par la lettre correspondante.
la sortie de la boucle, le test sur la variable boolenne va permettre de savoir si la lettre
a t trouve au moins une fois. Si cest le cas, le label lblMessage ne doit rien afficher,
sinon il doit afficher le message "lettre non prsente". Ce message restera affich tant
quune nouvelle lettre nest pas sollicite, ce qui est trs bien.
Pour finir, mme si ce ntait pas explicitement demand, il ma paru opportun de rendre
invisible le bouton de la lettre qui venait dtre utilis: cela ne sert pas grand-chose de
recliquer sur une lettre qui a dj t teste.
Procdure cmdLettre_clic(index: entier)
trouve: boolen
i: entier
debut
--- recherche de la lettre dans le mot dorigine --trouve faux
pour i de 1 Ln(txtMot.text)
si cmdLEttre[index].titre = Car(txtMot.text, i) alors
trouve vrai
Chg(lblMot.titre, i, cmdLettre[index].titre)
finsi
finpour
--- message correspondant la lettre trouve ou non --si non trouve alors
lblMessage.titre "Lettre non prsente"
sinon
lblMessage.titre ""
finsi
--- le bouton de la lettre est rendu invisible --cmdLettre[index].visible faux
fin

Corrigs des exercices

Page 193

8 2944 TG PA 00

Squence 3
Exercice 1
a) ajouter "Bernard" la liste des personnes
lstPersonne.ajouter("Bernard")
La liste concerne est lstPersonne. Il faut lui appliquer la mthode "ajouter" qui attend
en paramtre linformation ajouter.
b) ajouter "Nice" la liste des villes
lstVille.ajouter("Nice")
Mme principe mais cette fois sur la liste lstVille.
c) supprimer le premier lment (dindice 0) de la liste des pays
lstPays.supprimer(0)
Cest la mthode "supprimer" qui permet de supprimer un lment dune liste. Il suffit
dappliquer cette mthode la bonne liste, en lui envoyant le bon indice.

Exercice 2
pseudo: chane
proprit qui de toute vidence va mmoriser le pseudo du personnage
deplace (direction: entier)
mthode (on reconnait une mthode aux parenthses) qui a un rle de procdure et qui
de toute vidence va permettre de dplacer le personnage dans une direction reue en
paramtre
Corrigs des exercices

Page 194

estmort(): boolen
mthode qui a un rle de fonction boolenne et qui de toute vidence retournera vrai
si le personnage est mort
vie: entier
proprit qui de toute vidence va mmoriser la valeur de la vie du personnage (ce qui
lui reste)

Exercice 3
a) Voici la fonction demande:
fonction nouveauPerso (lepseudo: chaine): Personnage
debut
retourner (new Personnage(lepseudo, 10))
fin
On peut effectivement crer lobjet avec new et le retourner directement. Si vous avez
des difficults avec cette solution, voici une version plus longue en passant par un objet
intermdiaire:
fonction nouveauPerso (lepseudo: chaine): Personnage
unPerso: Personnage
debut
unPerso new Personnage(lepseudo, 10)
retourner unPerso
fin

8 2944 TG PA 00

Remarquez au passage, dans une solution comme dans lautre, que le type retourn par
la fonction est "Personnage". Effectivement, la fonction retourne bien un objet.
b) Voici la fonction demande:
fonction testVivant (unPerso: Personnage): chaine
debut
si unPerso.estmort() alors
retourner unPerso.pseudo + " est mort"
sinon
retourner unPerso.pseudo + ": " + unPerso.vie
finsi
fin
Cest avec le paramtre qui est un objet de type Personnage, quil est possible daccder
au pseudo et la vie, ainsi qu la mthode estmort().
c) Voici la procdure demande:
procedure deplacement(unPerso: Personnage, val: entier)
debut
unPerso.deplace(val)
fin
Rien de compliqu dans cette procdure qui exploite les 2 paramtres.
d) Voici la fonction demande:
fonction maxVie(tab[1..10]: Personnage, nb: entier): chaine
max, k: entier
debut
max 1
pour k de 2 nb
si tab[k].vie > tab[max].vie alors
max k
finsi
finpour
retourner tab[max].pseudo
fin

Corrigs des exercices

Page 195

Plusieurs notions sont abordes dans cet exercice. Avant tout, cest la premire fois que
vous manipulez un tableau dobjets... En ralit ce nest pas tout fait la premire fois
puisque vous lavez fait en vnementiel. Ensuite, la recherche du maximum a t faite
non pas en mmorisant la vie la plus grande mais lindice de la case qui contient la vie la
plus grande. Pourquoi avoir utilis ce systme? Parce que mmoriser la vie ne donne pas
le pseudo, alors que mmoriser lindice de la case permet ensuite daccder au pseudo.

Exercice 4
unPerso.attaque()
correct: cette mthode est publique
unPerso.vie unPerso.vie + 1
incorrect: vie est une proprit prive

8 2944 TG PA 00

unPerso.deplace()
incorrect: deplace est public mais cette mthode attend un paramtre
unPerso.getVie() 5
incorrect: il nest pas possible daffecter quelque chose une fonction comme si ctait
une variable
unPerso.estmort()
incorrect: estmort est bien public mais cest une fonction, donc il faut lutiliser comme
une valeur (par exemple laffecter une variable)
unPerso.estTouch()
incorrect: cette mthode est prive
unPerso.Personnage("Nicolas", 10)
incorrect: un constructeur ne sappelle pas comme une mthode (il est appel automatiquement lors de la cration de lobjet avec new)
afficher unPerso.getPseudo()
correct: cette mthode est publique et a rle de fonction, donc on peut lafficher

Exercice 5
b) Voici la fonction demande:

Corrigs des exercices

Page 196

fonction testVivant (unPerso: Personnage): chaine


debut
si unPerso.estmort() alors
retourner unPerso.getPseudo() + " est mort"
sinon
retourner unPerso.getPseudo() + ": " + unPerso.getVie()
finsi
fin
Cette fois il faut passer par les getters pour accder aux proprits.
d) Voici la fonction demande:
fonction maxVie(tab[1..10]: Personnage, nb: entier): chaine
max, k: entier
debut
max 1
pour k de 2 nb
si tab[k].getVie() > tab[max].getVie() alors
max k
finsi
finpour
retourner tab[max].getPseudo()
fin
Mme remarque.

8 2944 TG PA 00

Exercice 6
unMortel.deplace(2)
correct: la mthode est publique dans la classe mre, donc accessible
afficher unMortel.getVie()
correct: la mthode est publique dans la classe de lobjet
afficher unImmortel.getVie()
incorrect: la mthode nest pas dans cette classe ni dans la classe mre
afficher unImmortel.pouvoir
incorrect: la proprit est prive donc inaccessible
unMortel.estTouch()
incorrect : la mthode est protge mais on ne pourrait y accder qu partir dune
mthode de la classe fille, non partir dun objet extrieur
unPerso.estTouch()
incorrect: toujours pas accessible puisquon est lextrieur des classes
afficher unPerso.pseudo
incorrect: la proprit est prive
afficher unPerso.getVie()
incorrect: la mre ne peut pas accder aux membres de la fille
Corrigs des exercices

Exercice 7

Page 197

a) voici les surcharges proposes:


// dans la classe Mortel
Mortel(uneVie: entier)
// dans la classe Immortel
Immortel(unPouvoir: chaine)
Puisque dans la classe mre, le constructeur a t surcharg en enlevant le pseudo,
il parait logique de surcharger les constructeurs des classes filles en enlevant aussi le
pseudo.
b) Voici la fonction demande:
fonction creePerso
debut
si lepseudo = ""
retourner (new
sinon
retourner (new
finsi
fin

(lepseudo: chaine): Personnage


alors
Personnage())
Personnage(lepseudo))

L encore, il est possible de passer par un objet intermdiaire.

8 2944 TG PA 00

Exercice 8
a) Voici la procdure demande:
procedure affichePseudo (col: Collection <Personnage>)
k: entier
debut
pour k de 0 col.cardinal() - 1
afficher col.getElement(k).getPseudo()
finpour
fin
Cet exemple est exactement celui du cours mais juste mettre sous forme de procdure.
b) Voici la fonction demande:
fonction nbMorts (col: Collection <Mortel>): entier
nb, k: entier
debut
nb 0
pour k de 0 col.cardinal() - 1
si col.getElement(k).estmort() alors
nb nb + 1
finsi
finpour
retourner nb
fin
Il suffit de parcourir la collection et de tester chaque objet avec la mthode estmort().
c) Voici la fonction demande:
Corrigs des exercices

Page 198

fonction lesMorts (col: Collection<Mortel>): Collection<Mortel>


k: entier
colMorts: Collection<Mortel>
debut
colMorts new Collection <Mortel>
pour k de 0 col.cardinal() - 1
si col.getElement(k).estmort() alors
colMorts.ajouter(col.getElement(k))
finsi
finpour
retourner colMorts
fin
Cette fois la fonction doit retourner une collection dobjets. Voil pourquoi une nouvelle
collection est dclare et cre. Dans le test, on ajoute lobjet rcupr de col dans la
nouvelle collection. Cest lobjet entier qui est ajout.
d) Voici le code demand:
procedure cmdAjout_Clic()
debut
si txtPseudo.txt = " alors
colPerso.ajouter(new Personnage()
sinon
colPerso.ajouter(new Personnage(txtPseudo.txt)
finsi
fin
L vous retrouvez lenvironnement graphique et finalement les objets graphiques qui
fonctionnent avec la mme logique que les objets non graphiques.

8 2944 TG PA 00