GENISTA (1971) : TUTORIEL "BBC BASIC FOR WINDOWS" EN FRANÇAIS : CHAPITRE 15 : DONNÉES GROUPÉES EN STRUCTURES



Logo Genista, fondé en 1971

Guide Tutoriel de BBC BASIC for Windows, Ch. 15

BBC BASIC (BB4W) Tutorial: Grouping Data in Structures

Données groupées en structures (Tutoriel BBC BASIC, Ch. 15) [Genista]

Par Peter Nairn  •  Traduction : Guy Schaffner (Texte et images) (Genista)

informatique et programmation Vous connaissez maintenant les tableaux, qui permettent de regrouper en plusieurs dimensions des données correspondant à un groupe de sujets.
Dans ce Chapitre, vous allez voir comment ces données et ces tableaux peuvent être groupés en structures, celles-ci pouvant à leur tour être groupées en structures de structures. Les exemples fournis rendent cet aspect de la programmation très accessible et facile à comprendre.
Chapitre 14   •   Chapitre 15   •   Chapitre 16      

Chapitre 15 — Données groupées en structures



Les tableaux, ou matrices, sont une façon merveilleuse d'organiser les données. Dans vos programmes, vous en rencontrerez de nombreuses utilisations. Un jour, il se peut que vous tombiez sur une situation comme la suivante. Supposez que vous écrivez un jeu où vous devez détruire des cibles. Le joueur a plusieurs variables qui lui sont associées : la coordonnée x, la coordonnée y, le nombre de vies et son nom. Vous pourriez aisément définir plusieurs variables comme ceci :


      
      JoueurX%=5
      JoueurY%=12
      JoueurVies%=3
      JoueurNom$="GR8"
      
    

Ou bien, vous pourriez utiliser un tableau pour les trois premières variables et vous souvenir que l'indice 1 représente la position x , le 2 la position y et le 3 le nombre de vies. JoueurNom$ est un problème : il devrait rester une chaîne individuelle.

BBC BASIC offre la capacité de créer votre propre « super » variable qui va regrouper toutes ces variables individuelles ensemble dans un même endroit et par là même, les rendra plus faciles à retrouver. Ce procédé s'appelle une structure, comme vous l'avez probablement deviné à partir du titre de cette partie. Pour déclarer une structure, vous vous servez de DIM, comme pour un tableau, mais avec  l'Accolade ouvrante ( { )  et  l'Accolade fermante ( } )  au lieu de parenthèses ordinaires, de telle sorte que le BASIC sache que nous sommes en train de parler d'une structure. Dans les accolades, on met le nom des variables que nous voulons inclure dans ce groupe. Les règles de dénomination habituelles s'appliquent. Voyons un exemple :


      DIM Joueur{X%,Y%,Vies%,Nom$}
    

Nous pouvons accéder à chacune des variables et les utiliser pour faire tout ce qui est normalement possible avec. La structure ne se comporte que comme un mécanisme de regroupement. L'accès se fait par le nom de la structure (Joueur dans notre cas) suivi d'un point et du nom de la variable que nous désirons. Pour changer le nombre de vies lorsqu'un joueur est touché, nous ferions ceci :


      Joueur.Vies%=Joueur.Vies%-1
      IF Joueur.Vies%<=0 THEN PRINT "FIN DU JEU"
    

Le jargon officiel, ici, est :


      NomDeLaStructure.NomDuMembre
    

Ainsi, vous pouvez déclarer de jolies petites unités pour conserver toutes vos variables dans des groupes logiques. Mais il y a encore mieux. Vous saviez que j'allais dire ça, hein ? Les membres d'une structure ne sont pas limités à des variables uniques. Vous pouvez avoir un tableau comme membre d'une structure. Supposez que votre joueur puisse posséder jusqu'à 10 objets comme équipement : lance-flammes sous-marin, chaussures anti-gravité, etc. Il vous faut une façon de représenter le fait qu'il a ou non récupéré chacun de ces objets. Fabriquons un tableau nommé Objets%. Voici comment nous déclarerions maintenant la structure :


      DIM Joueur{X%,Y%,Vies%,Nom$, Objets%(10)}
    

L'accès se fait comme auparavant :


      IF Joueur.Objets%(5)=TRUE THEN
      PRINT "Vous avez les bottes de cent lieues"
      ENDIF
    

De la même façon, on peut avoir une autre structure comme membre de la structure. Par exemple, il est très courant (surtout dans les programmes Windows™) de faire une structure pour conserver les coordonnées X et Y. C'est ainsi que l'on fait :


      DIM Joueur{Posn{X%,Y%},Vies%, \ 
      \          Nom$, Objets%(10)}
    

Posn (mis pour « position ») est appelé « sous-structure » et on accède à ses composants ainsi :


      Joueur.Posn.X% = Joueur.Posn.X% + 5
    

Les sous-structures peuvent contenir d'autres sous-structures, des variables et des tableaux combinés de toutes les façons possibles. L'idée de base, dans ce cas, est bien sûr de répartir les données en groupes logiques faciles à manipuler, et non de montrer combien vous êtes malin en imbriquant 10 niveaux de données dans 10 niveaux de données.



Tableaux de structures


Quand notre joueur a atteint la fin du jeu, victorieux et sanguinolent, nous souhaiterions ajouter un affichage des meilleurs scores pour qu'il puisse se vanter auprès de ses amis. Le tableau contiendra les 10 meilleurs résultats. À présent, il devrait sembler évident de voir comment cela est fait :


      DIM TabloScore{Nom$,Score%}
    

Parfait, mais cela ne tient compte que de la première position ; nous voulons un tableau. Voici comment on déclare un tableau de structures :


      DIM TabloScore{(10) Nom$,Score%}
    

Le premier élément dans la liste de variables est le nombre d'éléments dans des parenthèses. Cela nous donne une matrice appelée TabloScore qui a 11 structures de 0 à 10. Pour afficher le contenu du tableau des meilleurs scores, nous accédons au tableau ainsi :


      FOR I% = 1 TO 10
        PRINT I%,TabloScore{(I%)}.Nom$;
        PRINT TabloScore{(I%)}.Score%
      NEXT I%
    

Il faut entourer l'indice du tableau avec des accolades pour dire au BASIC que vous travaillez avec une structure. Comme avec les tableaux normaux, les tableaux multidimensionnels sont permis et la même règle s'applique en matière de numérotation à partir de l'élément zéro.



Structures prototypes


En retournant à notre jeu hypothétique, nous avons une structure qui contient les extra-terrestres : leur position actuelle, leur état en matière de force, etc. À la fin du niveau arrive le « big-chef-super-coriace-de-fin-de-niveau » que vous devez abattre avant de pouvoir accéder au niveau supérieur. Ce personnage a les mêmes attributs qu'un extra-terrestre ordinaire, mais il n'apparaît pas très sensé de l'inclure avec les simples soldats. Il nous faut créer une autre structure pour lui, avec les mêmes attributs que ses subordonnés, mais qui soit distincte de telle sorte que nous puissions le traiter comme un cas unique. BBC BASIC nous permet d'utiliser une structure déjà définie comme gabarit ou prototype pour une autre structure.


      REM Structures prototypes
      DIM ExtraT{XPosn%, YPosn%, Force%}
 
      REM Définir notre extraterrestre
      ExtraT.XPosn%=50
      ExtraT.YPosn%=627
      ExtraT.Force%=100
 
      DIM SuperBigChef{}=ExtraT{}
      REM Jouons...
    

SuperBigChef aura donc les membres suivants :


      SuperBigChef.XPosn%
      SuperBigChef.YPosn%
      SuperBigChef.Force%
    

Attention à la confusion, ici : au moment où la structure est déclarée, tous les membres de SuperBigChef seront mis à zéro ; seuls les noms des membres de la structure seront copiés, et non leur valeur réelle.


Déclaration de structures

En nous servant de cette technique, il est également possible de déclarer un tableau de la structure spécifiée.


 
      REM Tableaux de structures prototypes
      DIM ExtraT{XPosn%, YPosn%, Force%}
 
      REM Déclarer tout un niveau d'extraterrestres
      DIM GroupeExtraT{(20)}=ExtraT{}
      GroupeExtraT{(0)}.XPosn%=50
      GroupeExtraT{(0)}.YPosn%=627
      GroupeExtraT{(0)}.Force%=100
 
      REM ...
    

La ligne 5 nous fournit 21 (de 0 à 20) petits bougres prêts à être détruits.




Dans une des parties précédentes, nous avions une structure de joueurs dans laquelle était imbriquée une structure de positions. Cette technique peut également être appliquée à des prototypes. Comme exemple, nous pouvons définir la position de notre extra-terrestre en utilisant XPosn% et YPosn%, mais nous pourrions également en faire une structure. De cette façon, chaque fois qu'un événement nous ferait avoir besoin de donner une position, le prototype nous la donnerait déjà toute prête. C'est utile, parce que cela signifie que nous pouvons à tout moment accéder à la position de la même façon, où qu'elle soit trouvée. Voici comment nous ferions :


      REM Structures prototypes imbriquées
      DIM Position{X%,Y%}
      DIM ExtraT{Posn{}=Position{}, Force%}
      DIM Joueur{Posn{}=Position{}, \
      \          Vies%, Nom$, Objet%(10)}
      
      REM Initialisation de notre ExtraT
      ExtraT.Posn.X%=50
      ExtraT.Posn.Y%=627
      ExtraT.Force%=100
      
      REM Initialiser notre joueur
      Joueur.Posn.X%=50
      Joueur.Posn.Y%=627
      Joueur.Vies%=100
      
      REM ...
    

Tout changement effectué dans la structure Position après le codage initial serait instantanément reflété dans les changements effectués dans les structures qui utilisent Position comme prototype. C'est bien, et c'est moins bien. Si le jeu devait être étendu à trois dimensions, nous le déclarerions à nouveau comme ceci :


      DIM Position{X%,Y%,Z%}
    

et aussitôt, à la fois ExtraT et Joueur ont maintenant une autre dimension dans laquelle ils peuvent jouer. (Il vous reste toujours à écrire vous-même le code qui prendra cela en charge. « BB4W » ne peut pas remplacer VOTRE intelligence.) Le point auquel il faut faire très attention, c'est si l'on va dans l'autre sens : si vous ôtez un élément, vous devez aussi ôter toute référence qui lui est faite dans chaque structure qui le contient. Pensez à la disposition de vos données avant de les mettre en place, et vous économiserez ainsi des heures de frustration et de recommencement de votre travail.

Bien évidemment, ces techniques s'appliquent à l'utilisation de structures plus grandes, mais ne perdez jamais de vue le fait que ce ne sont que des façons de rassembler des données similaires pour qu'elles soient toutes accessibles au même endroit. Dès que vous aurez pris le coup en matière de structures, vous vous demanderez comment vous avez jamais pu vous débrouiller sans elles.




Un truc : Noms de structures et abréviations au clavier
BBC BASIC permet l'utilisation d'abréviations pour la plupart des mots-clés et des commandes. On peut trouver celles-ci sous les entrées correspondant à chaque mot dans les fichiers d'aide. Comme exemple, PRINT peut être abrégé en « P. » – vous voyez le problème ? Si vous déclarez une structure portant le nom de P, lorsque vous tenterez d'accéder à ses membres, le BASIC développera une ligne du genre « P.Int1%=2 » pour en faire « PRINTInt1%=2 », et ce n'est pas du tout ce que vous vouliez. De toute façon, les noms d'une seule lettre n'entrent pas dans notre manuel des bonnes habitudes de programmation.

La façon la plus simple de contourner ce problème, c'est d'utiliser des noms qui ont un sens et contiennent des capitales et des minuscules. Il est possible d'afficher ou pas les noms abrégés : depuis le menu, choisissez « Options | Customize » et puis enlevez la coche dans la case du groupe « Program Editor » : « Accept keyword abbreviations » (Accepter les abréviations clavier). Le problème, c'est que cette option est cochée par défaut, aussi si vous donnez votre code à quelqu'un d'autre, il aura un problème et, parce qu'il n'est pas aussi malin que vous, il ne comprendra pas ce qui se passe.


Si vous lisez les fichiers d'aide, vous verrez qu'il est possible de faire des merveilles avec les structures, mais la présente introduction vous suffira pour un bon moment encore.




Exercices


15.1
Vous voulez enregistrer les niveaux d'un élève pour cinq matières, ainsi que son prénom et son nom. Pouvez-vous suggérer une structure qui ferait cela ?

15.2
Écrivez un programme qui déclare une telle structure et qui demande les informations. Calculez le niveau moyen et affichez les résultats.

15.3
Si vous aviez 20 élèves dans une classe, comment feriez-vous un tableau à partir de la structure ci-dessus ?



Fin du Chapitre 15





Haut de Page  •  [Top of Page]

Page suivante (Ch. 16)  •  [Next Page (Ch. 16)]

Page précédente (Ch. 14)  •  [Previous Page (Ch. 14)]

Page d'entrée : BASIC, BBC BASIC et BB4W  •  [BASIC, BBC BASIC and BB4W  Entry Page]

Début du Guide pratique du BBC BASIC  •  [The Beginning of the BBC BASIC Tutorial]

Autres sujets  •  [Other subjects]