Beruflich Dokumente
Kultur Dokumente
5.1 Introduction
Les types de donnes que nous avons rencontrs jusqu'ici taient des types scalaires (ou non
structurs), c'est--dire lmentaires. Parmi ces types nous avons distingu les types prdfinis
de ceux que l'utilisateur peut lui-mme dfinir. Dans ce chapitre, nous allons tudier les types
structurs qui constituent une des richesses de la reprsentation des donnes en Pascal. Un type
est structur s'il est compos de plus d'un lment. C'est le cas des types suivants:
ensembles
tableaux
enregistrements
fichiers
Les fichiers font l'objet d'une tude spare dans la suite de ce cours, tant donn leur importance
et les notions qui leur sont attaches. Nous avons rserv une place en fin de chapitre aux
constantes dclares avec type et aux variables absolues.
En Pascal, les ensembles sont mis en oeuvre avec la mme signification qu'ils possdent en
mathmatique. On y retrouve d'ailleurs les mmes oprations. Pour mieux comprendre l'utilit du
type ensemble, considrons le problme suivant. Comment savoir si un caractre tap dans un
Edit par l'utilisateur est une voyelle majuscule ? Une structure slective permet de rsoudre
facilement ce problme. Elle doit tre place dans l'vnement OnKeyPress de l'Edit.:
SYNTAXE
Une variable de type type_ensemble peut contenir des lments de type type_de_base,
qui doit tre un type scalaire ou intervalle, l'exception du type rel.
Le nombre maximum d'lments d'un ensemble est limit 256. De plus, deux ensembles sont
gaux s'ils contiennent les mmes lments, indpendamment de leur l'ordre.
La dfinition d'une variable de type ensemble comporte la spcification du type de base des
lments de cet ensemble. Seule une affectation permet de placer des valeurs dans une variable
de ce type. L'erreur consistant croire que la dclaration d'une telle variable suffit lui attribuer
des lments se rencontre frquemment.
L'affectation d'lments un ensemble s'effectue l'aide d'un constructeur d'ensemble qui n'est
autre qu'une liste d'lments du type de base, dlimite par des crochets. La notation d'intervalle
est possible lorsque plusieurs lments sont conscutifs. Le fragment de programme qui suit
montre quelques exemples de dclaration et d'utilisation de variables de type ensemble:
...
begin
lettre := ['A'..'Z'];
voyelle := ['A','E','I','O','U','Y'];
lumiere := [blanc];
clair := [jaune, blanc];
magique := [0..8,12,19,22..38,99];
...
if c in voyelle then Edit1.Text := 'Voyelle';
end;
...
Le langage Pascal dispose d'oprateurs agissant sur les ensembles, de manire analogue aux
oprateurs de la thorie des ensembles en mathmatique. On trouve, d'un ct, les oprateurs
ensemblistes proprement dits (union, intersection et diffrence) et, de l'autre, des oprateurs
relationnels (appartenance, galit, altrit, inclusion). Comme pour les nombres, ces oprateurs
ont un degr de priorit et, en cas de mme degr de priorit, l'valuation des expressions se fait
de gauche droite. Mais voyons comment s'expriment ces oprateurs en Pascal. Les variables
utilises sont dclares comme suit:
intersection *
nombres := [1..10];
resultat := nombres * [2,4..6]; // resultat aura la valeur [2,4,5,6]
a := [1,2,4];
b := [3,5];
if a * b = [] then // [ ] reprsente l'ensemble vide.
Label1.Caption := 'a et b sont disjoints';
union +
diffrence -
galit =
if (nombres = [1..10]) then
resultat := nombres - [5..10];
altrit <>
if (nombres - [5..10]) <> [] then
Label1.Caption := 'Correct';
inclusion <=
if nombres <= [0,2,4,6,8] then
Label1.Caption := 'pair';
if (a <= b) and (a <> b) then
Label1.Caption := 'a inclus mais non gal b';
appartenance in
daccord := reponse in ['o','O'];
Il est important de ne pas confondre la notion d'ensemble avec la notion d'intervalle ou de type
numr. Si, par exemple, on dsire crire:
caractere := ['A'..'L'];
caractere peut, par exemple, tre dclar comme:
Les tableaux, ou variables indices, sont ns du besoin de pouvoir traiter plusieurs variables du
mme type, groupes sous le mme identificateur et diffrentiables par la valeur d'un indice. Pour
mieux saisir la ncessit de disposer de tableaux, essayons de rsoudre le problme qui consiste
calculer la moyenne de dix nombres. Une solution serait d'crire le programme suivant:
var a1, a2, a3, a4, a5, a6, a7, a8, a9, a10 : real;
a_moyen : real;
...
procedure TForm1.Button1Click(Sender: TObject);
{on suppose que l'on a affect un contenu aux variables a1 a10}
begin
a_moyen := (a1+a2+a3+a4+a5+a6+a7+a8+a9+a10) / 10;
Label1.Caption := FloatToStr (a_moyen);
end;
Il serait videmment aberrant de calculer la moyenne de 10'000 nombres avec une telle mthode.
Les variables a1 a10 contiennent des donnes de mme nature, il serait donc plus judicieux de
disposer d'une variable unique, mais structure en plusieurs composantes pouvant recevoir
chacune une donne de mme type. Cette ide est prcisment reprise dans la plupart des
langages de programmation qui disposent du type tableau. Voici ce que devient le programme de
calcul de moyenne avec l'utilisation d'une variable de type tableau:
begin
somme := 0;
for i := 1 to MAX do
somme := somme + a[i];
Label1.Caption := FloatToStr (somme / MAX);
end.
La distinction des valeurs contenues dans le tableau a se fait par la valeur de l'indice i, indiquant
le numro de l'lment considr. En effet, pour rfrencer un lment d'un tableau, il faut
spcifier l'identificateur de la variable suivi, entre crochets, de l'indice. De plus, notre programme
est devenu beaucoup plus gnral, puisqu'il suffit de changer la valeur de la constante MAX pour
qu'il calcule la moyenne de 100, 1000 ou 10'000 nombres. Cette forme de programme permet
notamment l'utilisation aise des structures itratives.
SYNTAXE
La taille d'une variable de type tableau est dtermine par la taille de ses lments et par leur
nombre.
On peut remarquer dans ces dclarations l'interdpendance des diffrents objets. La constante
largeur figure dans la dclaration de horizontal, le type horizontal dans celle de ligne, le type
ligne dans celle de tableau, enfin le type tableau dans celle de la variable grille. Les justifications
de cette faon de procder sont nombreuses et, parmi elles, celle de donner un nom chaque
objet. Cela permet de multiples rfrences, comme par exemple, dclarer plusieurs variables de
mme type. Une autre justification est illustre par la facilit d'adaptation du programme qui en
dcoule. Supposons que l'on veuille satisfaire une nouvelle requte ou situation, par exemple
adapter ce programme pour une nouvelle grille comportant 20 lignes et 35 colonnes. Il suffit alors
de modifier les constantes largeur et hauteur, puis de recompiler le programme. Les programmes
ainsi paramtrs sont plus gnraux.
Mais revenons aux dclarations, et en particulier aux deux suivantes:
ligne = array [horizontal] of char;
tableau = array [vertical] of ligne;
nous aurions pu les contracter de cette manire:
for i := 1 to largeur do
grille [1, i] := '*';
Pour ne pas compliquer l'exemple nous avons utilis l'vnement OnKeyPress du Memo dans
lequel l'utilisateur tape le texte. A chaque frappe, s'il s'agit d'une lettre minuscule, le tableau
contenant le nombre d'apparitions est mis jour et son contenu est affich dans le Listbox de
droite. Voici le code complet de ce programme:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
ListBox1: TListBox;
Memo1: TMemo;
Label1: TLabel;
procedure FormActivate(Sender: TObject);
procedure Memo1KeyPress(Sender: TObject; var Key: Char);
private
{ Dclarations prives }
public
{ Dclarations publiques }
table : array ['a'..'z'] of integer;
end;
implementation
{$R *.DFM}
end.
L'intrt de ce programme est que chaque lment du tableau n'est pas repr par un nombre,
mais par un caractre. Le contenu d'un lment est un nombre entier correspondant la
frquence d'apparition du caractre dsignant ce mme lment. La variable table possde donc
26 lments, et il convient d'initialiser zro chacun des 26 lments au dbut du programme. La
condition if lettre in ['a'..'z'] ... permet de s'assurer que le caractre lu (indice du tableau) est bien
dans l'intervalle 'a'..'z'.
Dans le prochain exemple, l'indice du tableau est de type numr. Seules les dclarations et une
portion du programme sont prsentes. Un indice de type numr peut contribuer rendre les
programmes plus lisibles:
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
implementation
{$R *.DFM}
end.
fig. 5.1
5.4.1 Introduction
Les tableaux apparaissent, implicitement ou explicitement, trs frquemment dans Delphi. Que ce
soit en tant que proprits de certains types de donnes, ou bien lorsque l'on utilise certains
composants de la VCL (Visual Component Library). Dans cette section nous allons nous attarder
essentiellement sur trois composants: les Listbox, les Memo et les StringGrid..
5.4.2 Listbox
Un Listbox, appel zone de liste en franais, est un ensemble ordonn de chanes de caractres
reprsent sous la forme suivante:
En fonction du nombre d'lments, un Listbox peut disposer d'une barre de dfilement. Chaque
lment d'un Listbox se trouve sur une et une seule ligne. De plus, il n'est pas possible d'crire
directement dans un Listbox. L'utilisateur peut ajouter, supprimer ou slectionner un ou plusieurs
lments de la liste. Une zone de liste dispose de plusieurs proprits et mthodes dont nous
allons dcrire ci-dessous les plus importantes:
Items possde lui-mme des proprits et des mthodes (voir plus loin).
Dans l'exemple ci-dessus, Add est une mthode de Items permettant
d'ajouter une chane de caractres dans la liste existante Items. Dans la
liste ci-contre, 'Vache', 'Cheval', sont les chanes de caractres
contenues dans Items:
Lorsque la proprit MultiSelect (voir ci-dessous) est vraie, la valeur ItemIndex reprsente le
numro de l'lment qui a le "focus" parmi les lments slectionns. Si la proprit MultiSelect
est vraie la valeur par dfaut de ItemIndex est 0.
Voici le rsultat:
Voici le rsultat
Voici le rsultat:
5.4.3 Memo
Un Memo est un composant permettant la saisie de texte multiligne. Il possde des similitudes
avec le Listbox:
La proprit Lines du Memo est quivalente et du mme type que la proprit Items du
Listbox. Les deux sont du type Tstrings; donc, toutes les proprits et mthodes dcrites
ci-dessus pour les Listbox sont galement valables pour les Memo
L'aspect est le mme que celui d'un Listbox.
fig. 5.2
Afin d'illustrer ce qui prcde, nous allons examiner un exemple d'application faisant intervenir un
StringGrid.
Pour afficher les coordonnes de chaque cellule dans la grille nous avons utilis les instructions
suivantes, dclenches par l'vnement OnActivate de la fiche:
listbox1.items := SG.Cols[1];
Il est important de comprendre que SG.Cols[1] ne reprsente pas une chane de caractres, mais
la liste des chanes de caractres de la colonne 1. Cette liste est de type Tstrings, tout comme
d'ailleurs la proprit Items d'un Listbox, d'o la possibilit d'affectation de l'un l'autre. Voici ce
qui apparat lorsque l'on clique sur ce bouton:
Le bouton "Rows[1]" effectue une opration quivalente, mais concerne la ligne 1. Voici le rsultat:
Puisque Cols[1] reprsente la liste des chanes de caractres de la colonne 1, comment obtenir le
contenu d'une cellule particulire de la colonne 1? Simplement en indiquant le numro de la ligne
dsire sous forme d'un indice de tableau:
Edit1.Text := SG.Cols[1][3];
Voici le rsultat de l'excution de cette instruction:
SG.Rows[2] := SG.Rows[3];
Enfin, pour illustrer l'utilisation de la procdure MouseToCell nous avons fait appel l'vnement
OnMouseMove de la grille:
Une des plus grandes limitations de ce composant est que ses diverses proprits concernent
toutes les cellules. Il n'existe pas de proprit permettant de changer la police de caractres ou la
couleur de fond d'une cellule particulire.
Toutefois ce composant peut tre gr avec plus de souplesse en faisant appel l'vnement
OnDrawCell. Cet vnement est gnr autant de fois qu'il y a de cellules dans la grille. Pour
chaque cellule, chaque fois que la grille doit tre rafrachie ou redessine, Delphi nous fournit,
entre autres, les paramtres ACol et ARow contenant le numro de la colonne et de la ligne de la
cellule concerne, ainsi que le paramtre Rect reprsentant le rectangle sous-jacent la cellule:
Le programme complet est tonnamment compact: il est constitu d'une trentaine de lignes de
code crites par le programmeur. Le voici au complet:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, Grids, StdCtrls;
type
TForm1 = class(TForm)
SG: TStringGrid;
IM: TImage;
Recharger: TButton;
implementation
{$R *.DFM}
end.
Le principe de fonctionnement est assez simple pour tre expliqu en dtail. Voici tout d'abord les
noms des divers composants et leur signification:
Rouge, vert et bleu les trois barres de dfilement du choix de couleur
SG le StringGrid
im l'image
charger bouton pour le chargement de l'image
recharger bouton pour le rechargement de l'image
ex surface rectangulaire montrant la couleur actuelle
OD dialogue d'ouverture de fichier
La variable dessin indique si l'utilisateur est en train de dessiner. La variable nom contient le nom
du fichier image; le bouton recharger utilise ce nom pour recharger l'image.
L'vnement OnDrawCell est utilis pour remplir la cellule courante avec la couleur du pixel
correspondant sur l'image en taille relle:
La plupart des langages de programmation de haut niveau incluent les tableaux. En revanche, les
enregistrements (record) sont une structure que l'on rencontre plus rarement. Ils permettent une
meilleure organisation et une gestion plus rationnelle des informations, et sont troitement lis
une autre structure fondamentale que sont les fichiers (voir plus loin).
Un enregistrement, comme un tableau, regroupe plusieurs informations. Alors que dans un
tableau tous les lments doivent tre du mme type, dans un enregistrement les diffrentes
composantes (ou champs) peuvent tre de nature ou de type diffrents. Enfin, on repre une
composante d'un enregistrement par le nom de la variable de type enregistrement et le nom du
champ auquel on veut accder.
SYNTAXE
La dclaration d'un enregistrement comprend le nom (enreg_type), puis entre les mots
rservs record et end, une liste d'identificateurs (les diffrents champs) suivis du type
correspondant; type1 ... typen peuvent tre des types quelconques.
nom
prnom
sexe
loyer
charges
numro d'appartement
La structure d'enregistrement se prte particulirement bien la reprsentation de ces
informations:
personne.nom := Edit1.Text;
De mme, le loyer total se calcule l'aide de l'instruction:
personne.nom := Edit1.Text;
loyer_total := personne.loyer + personne.charges;
peuvent tre transformes en:
personne := gens;
Les deux variables doivent bien entendu possder exactement la mme structure, c'est--dire tre
de mme type.
Il est assez frquent, en programmation, de faire appel des paramtres de type enregistrement,
car un enregistrement constitue un groupe logique d'informations.
Aprs avoir tudi les tableaux et les enregistrements, il semble tout naturel de combiner ces deux
types de donnes. Une forme qui se rencontre souvent est le tableau d'enregistrements. Dans
beaucoup de cas, les objets traits par un programme ont une structure d'enregistrement, et ces
objets eux-mmes sont en grand nombre. Pour que l'exemple de la figure 5.3 soit un peu plus
raliste, il convient de transformer notre locataire unique en un ensemble de locataires:
Dans le cadre de cette structure, le nom de l'employ reprsent par la variable travailleur est
donn par:
travailleur.nom
Le salaire du deuxime employ de la section s'exprime par:
section[2].salaire
Le jour d'entre dans l'entreprise du troisime employ de la division du personnel est repr par:
entreprise[personnel][3].date_entree.jour
Ces formes d'criture, bien que claires, peuvent devenir lourdes. En ralit, les informations sont
le plus souvent destines tre conserves dans un fichier qui n'est rien d'autre qu'une suite
d'enregistrements. Nous verrons plus loin que pour utiliser un fichier de manire optimale il vaut
mieux viter une structure d'enregistrement trop complexe. On prfre souvent utiliser deux ou
trois fichiers de structure simple plutt qu'un seul fichier trop dense et enchevtr.
Dans la plupart des implmentations de Pascal, une souplesse supplmentaire a t introduite au
niveau des enregistrements: les variantes. Les enregistrements avec variantes possdent un ou
plusieurs champs variables en contenu et en structure. L'exemple qui suit en prsente une
utilisation:
dessin1.couleur := bleu;
dessin1.aspect := triangle;
dessin1.base := 10;
dessin1.hauteur := 5;
dessin2.couleur := rouge;
dessin2.aspect := cercle;
dessin2.rayon := 4;
Il revient au programmeur d'viter d'crire, par exemple:
dessin2.base
sans avoir test la valeur de la variable aspect.
En Pascal, deux types peuvent tre identiques ou seulement compatibles. Certaines situations
exigent la premire proprit, alors que d'autres se satisfont de la seconde. De plus, la
compatibilit peut tre considre au niveau d'une affectation, d'un passage de paramtres ou
d'une expression. Le non-respect de certaines rgles de compatibilit peut conduire des erreurs
lors de l'excution d'un programme. C'est la raison pour laquelle il est bon d'avoir cette notion de
compatibilit l'esprit. En cas de doute il est conseill de se reporter l'aide de Delphi.
Nous avons vu, dans le chapitre 2, la diffrence existant entre une variable et une constante. En
Pascal standard, les constantes peuvent tre de type entier, rel, caractre, boolen ou chane de
caractres. Delphi permet, en plus, d'utiliser des constantes avec type, qu'il faut envisager plutt
comme des variables initialises. Ces constantes peuvent tre de type scalaire ou structur.
SYNTAXE
Pour les constantes avec type non structur, chane de caractres ou ensemble.
Pour les constantes avec type structur (tableau, enregistrement ou composite), sauf
ensemble.
Les exemples qui suivent constituent des dclarations de constantes types non structures:
Gnralement, l'adresse mmoire laquelle le compilateur place les variables d'un programme ne
peut pas tre choisie ou contrle par le programmeur. Toutefois, Delphi permet d'indiquer
explicitement dans la dclaration l'adresse mmoire o doit tre place une variable. L'adresse est
indique sous forme d'une adresse absolue ou sous forme de rfrence un autre objet du
programme. Ainsi la dclaration suivante permet de connatre le numro du mode vido en cours,
celui-ci tant stock l'adresse mmoire $0040.
Exercice 5.1:
Ecrire un programme qui comporte un Edit et un ListBox. L'utilisateur tape un texte dans l'Edit.
Lorsqu'il tape <Return>, le texte est ajout dans le ListBox et l'Edit est vid.
Exercice 5.2:
Reprendre l'exercice 1 et ajouter un bouton qui vide compltement le ListBox, ainsi qu'un bouton
qui supprime du ListBox la ligne slectionne (en surbrillance).
Partir de l'exercice prcdent et ajouter une case cocher indiquant si le contenu du ListBox doit
tre tri ou non. De plus, trouver un moyen pour qu'aprs avoir cliqu sur un des deux boutons ou
sur la case cocher le "focus" (ici le curseur) se trouve sur l'Edit.
Exercice 5.4:
Ecrire un programme effectuant des tris selon 3 mthodes: tri par bulle, tri par comptage, tri par
change. Afin de visualiser les 250 nombres (compris entre 0 et 999) tirs au hasard en cliquant
sur le bouton "Remplir", ainsi que les rsultats obtenus avec les trois mthodes nous utilisons des
ListBox.
On compare deux deux les lments adjacents en remontant la liste (le tableau); si
l'ordre n'est pas le bon, les deux lments compars sont permuts
On redescend dans la liste si le plus petit des lments permuts dans la phase
prcdente a encore des lments plus grands que lui. La descente s'arrte ds qu'il a
trouv sa place ou si l'on se trouve au dbut de la liste
On reprend la monte de la liste l o on l'avait laisse
Exemple: 6 7 3 8 5 1 monte
3 7 permutation
3 6 7 descente
7 8 5 1 monte
5 8 permutation
5 7 8 descente
3 5 6 7 8 1 descente, monte
1 8 permutation
1 7 8 descente
1 6 7 8 descente
1 5 6 7 8 descente
1 3 5 6 7 8 descente
Pour trier un tableau A[1..n] on dtermine le rang de chaque lment en comptant le nombre des
lments qui lui sont infrieurs.
Dans ce but, on associe chaque A[i] un compteur. On compare successivement un lment du
tableau tous ses prdcesseurs; on rpte l'opration pour tous les lments et on obtient l'tat
du tableau en analysant le contenu des compteurs. Si le compteur C[i] indique la valeur k, la place
de l'lment A[i] est la k-ime position du tableau tri. Voici la suite des oprations effectuer:
Cette mthode consiste comparer chaque lment du tableau (en partant de l'indice le plus bas)
avec les lments suivants. Chaque fois que l'ordre n'est pas le bon, les deux lments sont
permuts. Il s'agit de l'une des mthodes de tri les moins efficaces.
Exercice 5.5:
Ecrire un programme comportant deux ListBox. Celui de droite est vide au dpart, alors que celui
de gauche doit contenir les nombres de 1 8 en toutes lettres (trouver comment faire cela). Deux
boutons permettent de copier l'lment slectionn dans le ListBox de gauche ou de droite. Les
boutons sont activs uniquement si la copie est possible.
Exercice 5.6:
Modifier le programme pour que les boutons dplacent et non plus copient les lments de
gauche droite et vice versa. De plus, ajouter l'indication du nombre d'lments sous chaque
ListBox (indication visible ds le lancement du programme).
De plus, aprs avoir cliqu sur un des quatre boutons, le programme doit (s'il reste des lments
dans la liste) forcer la slection tre sur la 1re ligne de la liste.
Exercice 5.8:
Reprendre l'exercice prcdent et ajouter la possibilit de faire une multi-slection des lignes des
deux ListBox (slection de plusieurs lignes). Le programme doit effectuer toutes les oprations
comme prcdemment, mais sur toutes les lignes slectionnes.
Exercice 5.9:
Ecrire un programme qui comporte un StringGrid. Le StringGrid doit avoir une dimension de 8 x 8
et aucune colonne grise. En cliquant sur un bouton, le programme doit remplir la premire et la
dernire colonne avec la lettre 'X'.
Exercice 5.10:
Modifier le programme de l'exercice prcdent pour qu'il remplisse aussi la premire et la dernire
ligne avec la lettre 'X', ainsi que l'intrieur du carr dlimit par les 'X' avec la lettre 'O'.
Exercice 5.11:
Modifier le programme de l'exercice prcdent pour qu'il place des '1' dans les cases des deux
diagonales.
Modifier le programme de l'exercice prcdent pour qu'il place des '8' dans les cases restes
vides, c'est--dire celles qui se trouvent entre les cts et les diagonales (quatre zones
triangulaires).
Exercice 5.13:
Reprendre la base de l'exercice 9 et faire en sorte qu'en cliquant sur le bouton le programme
inscrive, dans chaque case, la somme de son numro de ligne et de colonne. Par exemple, la
case (2,3) contiendra 5.
Exercice 5.14:
Reprendre l'exercice prcdent. Le programme doit laisser choisir la taille de la grille par
l'utilisateur (entre 2 x 2 et 8 x 8) l'aide d'un "TrackBar". A n'importe quelle position du TrackBar
l'utilisateur peut cliquer sur le bouton.
Exercice 5.16:
Modifier l'exercice prcdent pour qu'une case sur deux soit rouge.
Exercice 5.18:
Ecrire un programme utilisant un StringGrid de 10 x 10. La couleur des lignes alterne entre jaune
et "acqua". Les cases slectionnes doivent apparatre avec un trait rouge sur leur diagonale:
Ensuite le programme place le mot, partir de la case choisie, de manire que le mot entre dans
la grille. Si la case choisie est en bas droite, le mot partira probablement vers le haut ou vers la
gauche. Indication: ne pas tenir compte des directions en diagonale.
Exercice 5.20:
Ecrire un programme utilisant un StringGrid et simulant le dplacement d'une tour ou d'un fou sur
un chiquier. L'utilisateur choisit la pice (tour ou fou), puis choisit une case. Le programme met
des 'X' ou des 'O' dans toutes les cases qui peuvent tre atteintes par cette pice.
Ecrire un programme qui transforme les nombres arabes en nombres romains. Le nombre arabe
doit tre limit 4 chiffres. Pour mmoire voici les correspondances entre nombres romains et
arabes: I (1), V (5), X (10), L (50), C (100), D (500) et M (1000).
Exercice 5.22:
Ecrire un programme qui transforme les nombres romains en nombres arabes. Le programme
n'effectue aucun contrle de validit du nombre romain spcifi par l'utilisateur. Celui-ci ne doit
pas pouvoir entrer d'autres caractres que ceux correspondant aux nombres romains. De plus, au
fur et mesure que les caractres sont taps, le nombre romain est affich dans sa forme arabe.
Exercice 5.23:
Les squences suivantes ne doivent pas tre admises dans un nombre romain: DD,
CCCC, LL, XXXX, VV, IIII
Dans un nombre romain il peut y avoir deux lettres qui sont dans l'ordre croissant (par
exemple XC dans MXCI), mais pas trois (par exemple IXC dans MIXC). Il ne peut pas y
avoir non plus plus de deux lettres numriquement infrieures la lettre suivante (par
exemple 1109 s'crit MCIX et non MIXC)
Comme la vrification de "syntaxe" ne peut se faire en cours de frappe, prvoir un bouton pour la
transformation
Ecrire un programme qui, partant d'un chiffre de dpart donn (ci-dessous le chiffre 1), calcule et
affiche la suite que l'on peut voir dans l'exemple. Pour obtenir une nouvelle ligne, on se base sur
la ligne prcdente numrant son contenu:
Comme vous pouvez le constater aucun chiffre plus grand que 3 n'apparat. Essayez de
comprendre pourquoi et de l'expliquer. Cette proprit est-elle valable en partant d'un autre chiffre
que 1 ?
Exercice 5.25:
Ecrire un programme de codage rudimentaire bas sur le principe du XOR. Une cl, choisie par
l'utilisateur, permet de coder et de dcoder un texte. Pour cela il faut appliquer l'oprateur xor
entre le premier caractre du texte coder et le premier caractre de la cl et ainsi de suite pour
les autres caractres. Lorsque l'on a puis les caractres de la cl, on se repositionne sur son
premier caractre. Le mme principe, appliqu au texte cod, permet de retrouver le texte en clair
(d'origine).
Comme on peut le voir chaque nombre (sauf les 1 des bords) est la somme des deux nombres qui
se situent au-dessus de lui.
Exercice 5.27:
Ecrire un programme de simulation de traverse d'une route plusieurs voies. L'utilisateur peut
choisir:
le nombre de voies de la route traverser: entre 1 et 6
la frquence d'apparition d'une voiture, c'est--dire la probabilit qu'il y ait une voiture au
moment de traverser
le nombre de traverses simuler
En mmorisant, dans un tableau, le temps ncessaire chaque traverse, on peut savoir combien
il y a eu de traverses qui ont dur n secondes. Le programme doit ensuite reprsenter
Exercice 5.29:
Ecrire un programme permettant de gnrer des phrases alatoires, formant un discours. Chaque
phrase est construite partir de quatre fragments, pris dans quatre Listbox correspondants. Le
premier contient des dbuts de phrases, le dernier des fins de phrases et les deux autres des
parties intermdiaires. Chaque Listbox charge son contenu d'un fichier (LISTE1.TXT, LISTE2.TXT,
LISTE3.TXT, ou LISTE4.TXT) au moment du dmarrage du programme. Sous chaque Listbox
figure un Edit dans lequel l'utilisateur peut taper des fragments de phrases qui vont s'ajouter au
Listbox correspondant quand il tape sur <Return>. Pour supprimer un fragment de phrase d'un
Listbox il suffit de faire un double-clic sur la ligne dsire. Il est possible tout moment de
sauvegarder le contenu des quatre Listbox l'aide d'une option du menu Fichier. Enfin, l'utilisateur
peut choisir le nombre de phrases gnrer (le programme insre alatoirement des sauts de
ligne pour constituer des paragraphes) et peut imprimer le discours l'aide du bouton "Imprimer".
Exercice 5.30:
Ecrire un programme permettant de rsoudre les jeux du type mot secret ou mot cach. Une grille
(dans notre cas de 15 x 15) contient des lettres. On dispose galement d'une liste de mots.
Chacun des mots apparat dans la grille et peut tre crit dans les quatre directions
(horizontalement, verticalement et selon les deux diagonales) et dans les deux sens (par exemple
Vous disposez de deux fichiers de type texte (GR1.GR2 et GR1.MO2), le premier contient les
lettres de la grille, le second la liste de mots.
Dans l'exemple prsent ci-dessous, chaque mot trouv est mis en minuscules et sur fond clair
dans la grille.
Diverses stratgies sont possibles, mais il est conseill de partir des mots de la liste et de les
trouver l'un aprs l'autre.
Exercice 5.31
Cet exercice consiste simuler des mesures de tension lectrique. Il comporte trois tapes
effectuer dans l'ordre.
1re tape:
Gnrer un fichier (MESURES.TXT) de 150 nombres rels compris entre 215 et 225; ces nombres
sont alatoirement distribus entre ces deux limites.
3me tape:
Le bouton Graphique permet de reprsenter sommairement de manire graphique les rsultats
calculs l'tape prcdente
Vous pouvez amliorer ce programme en indiquant des valeurs et des units sur les axes du
graphique.
Exercice 5.32
Cet exercice consiste simuler une course en ligne droite et en couloir entre 8 concurrents. Les
coureurs sont symboliss par 8 figures rondes (composants de type Tshape). En cliquant sur le
bouton "Dpart" on lance la course. L'avancement des coureurs est contrl par le tirage de
nombres alatoires entre 1 et 8. Le nombre tir permet de faire avancer le coureur du couloir
correspondant.
Lorsqu'un coureur touche la ligne d'arrive, le jeu s'arrte. Le bouton "Nouv. Course" replace les
coureurs leur point de dpart, prts pour une nouvelle course.
Voici comment se prsente ce programme:
l'utilisateur peut parier sur un coureur en choisissant un no. de couloir. Le coureur choisi
prend la couleur bleu turquoise
lorsque le premier coureur arrive un message indique si l'utilisateur a gagn ou perdu.
Le coureur qui gagne se met clignoter un fois la ligne d'arrive atteinte.
L'utilisateur peut rgler la vitesse des coureurs
Modifiez le programme prcdent en remplaant l'utilisation d'un Timer par une boucle dont
l'excution est dclenche par le bouton "Dpart"
Exercice 5.35
Le jeu de la vie, invent par J. Conway en 1970, consiste simuler une population de bactries.
Sur un quadrillage (considr comme tant torodal) chaque case est soit vivante soit morte. L'tat
initial est choisi par l'utilisateur. On considre que chaque cellule a 8 voisins. Pour dterminer
l'tape (ou gnration) suivante on doit satisfaire certaines rgles:
Le programme utilise un StringGrid sur lequel l'utilisateur peut cliquer avec le bouton gauche (pour
noircir) ou droit (pour blanchir) une case. Les boutons "Dpart" et "Arrt" lancent et arrtent le jeu.