GENISTA (1971) : TUTORIEL "BBC BASIC FOR WINDOWS" EN FRANÇAIS : CHAPITRE 20 : DÉVELOPPEMENT DE VÉRITABLES PROGRAMMES



Logo Genista, fondé en 1971

Guide Tutoriel de BBC BASIC for Windows, Ch. 20

BBC BASIC (BB4W) Tutorial: Developing Real Programs

Développer de véritables programmes (Tutoriel BBC BASIC, Ch. 02) [Genista]

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

informatique et programmation Vous avez suivi l'intégralité des Chapitres concernant l'apprentissage du langage de programmation « BBC BASIC for Windows », langage moderne qui fonctionne dans Windows™.
Dans ce Chapitre, vous allez mettre au point l'intégralité d'un programme de « Générateur de caractères » : ce sera un exemple excellent et utile pour votre usage dans l'avenir, et cela permettra de réviser l'ensemble des connaissances qui, chez vous, sont déjà étendues.
Chapitre 19   •   Chapitre 20   •   Chapitre 21      

Chapitre 20 — Développement de véritables programmes


Nous arrivons à la fin de notre Guide pratique de programmation. Ce chapitre explique comment écrire des programmes. Il n'introduit aucune commande BASIC nouvelle, mais il essaie de faire accepter l'une des méthodes les plus populaires d'écrire un programme. Jusqu'à présent, nos programmes ont été de petites merveilles de 10 lignes conçus pour démontrer les aspects individuels du langage. Chez les programmeurs, il y a une tendance à commencer petit, comme ceci, et à construire une chose à la fois : ajouter deux lignes ici, une sous-routine là... Et bientôt l'édifice tout entier devient une jungle enchevêtrée, difficile à parcourir et un terrain encore plus dur à remettre en état et à agrandir.

Traditionnellement, la programmation était enseignée par des enseignants pour répartir les choses en étapes logiques et progressives. C'est quelquefois si facile que vous ne le faites pas consciemment. Par exemple, dans le chapitre sur les caractères définis par l'utilisateur, nous devons d'abord définir le caractère représentant l'extraterrestre, avant de le faire marcher en travers de l'écran. Ça ne servirait à rien de le faire dans l'autre sens. La conception d'un programme « convenable » suit la même idée, mais à une échelle beaucoup plus grande. C'est tellement vrai qu'il peut se passer des journées entières avant que nous ne commencions véritablement à taper du code. L'avis général est qu'il faut vous concentrer d'abord sur les généralités, la vue d'ensemble, et puis fractionner ces tâches en tâches progressivement plus petites jusqu'à ce qu'elles soient si petites que le code en découle de lui-même.

C'est très facile de gesticuler en essayant, par des gestes généraux, de faire comprendre ce que vous voulez dire, comme dans un mime. Pour éviter cela, je tiens à parcourir la conception d'un véritable programme, en expliquant chacun des pas à mesure que nous avançons, de telle sorte que vous puissiez appliquer cette démarche à vos propres créations. On appelle souvent ce procédé le développement « de haut en bas ». C'est une technique courante utilisée par de nombreux programmeurs, et pas quelque chose que j'ai imaginé après trois nuits de lecture des romans du cyberpunk cybernétique William Gibson. Si les programmeurs utilisent cette méthode, c'est qu'elle s'adapte facilement à différents langages et qu'elle donne de bons résultats – c'est-à-dire qu'elle marche.

Si nous prenons les caractères définis par l'utilisateur, nous voyons qu'ils sont très utiles. Ce qui peut être ingrat, c'est de tracer la grille et faire le calcul mental pour en tirer les totaux nécessaires sur les diverses lignes. Un Générateur de caractères me semble être un bon candidat pour l'écriture d'un programme.



1.– Commencer en « pseudo-code »



Comment commencer ?
  Il existe un langage très relâché, le pseudo-code, dont la définition exacte est quelque peu vague, parce que chacun a tendance à développer le sien propre. Cela ressemble généralement à un mélange de langue standard avec quelques mots de BASIC jetés au milieu. Ce qu'il représente, c'est la suite logique des événements nécessaires pour exécuter la tâche à accomplir.

Nous commençons avec la vue d'ensemble. Par là, je suggère que nous divisions les tâches que notre programme doit prendre en charge en grands morceaux, chacun pouvant être résumé en une ligne de quelques mots.


Division de la tâche principale en tâches et sous-tâches plus petites

Voici de quoi cela a l'air :


    
      Déclarer tableaux globaux et les structures
      Initialisation
      Dessiner l'écran principal
      Dessiner le caractère
      Dessiner le curseur
      REPEAT
        Intercepter l'action de l'utilisateur
        Traiter l'action de l'utilisateur
      UNTIL L'utilisateur choisit de sortir
      Fermeture
      END
    
    

C'est l'organisation de base de notre programme. Comme vous le voyez, rien n'est spécifié : tout est attribué à des sous-tâches.



2.– Affiner les sous-tâches


L'étape suivante consiste à prendre chacune de ces sous-tâches et à les affiner de façon similaire. Laissons pour l'instant de côté les deux premières lignes, parce que nous n'avons dans ces prémices aucune idée des variables dont nous aurons besoin ni de la façon de les initialiser.



a.– Dessiner l'écran principal


Commençons avec la partie Dessiner l'écran principal.
  Pour ce faire, il nous faut une grossière idée de ce qu'il faudra présenter à l'utilisateur lorsque le programme tournera. Faisons d'abord un schéma sur le papier, en utilisant éventuellement du papier quadrillé si l'on veut avoir une meilleure idée des dimensions.
  Voici ce à quoi nous voulons aboutir :


    
      +--------------------------------------------------+
      |            Générateur de Caractères              |
      |            ************************              |
      |                                                  |
      | Instructions                                     |
      | Utiliser flèches pour déplacer le curseur        |
      | Espace pour alterner la cellule choisie          |
      | Appuyer sur X ou ESC pour finir                  |
      |                                                  |
      |                                                  |
      |               [][][][][][][][] 000               |
      |               [][][][][][][][] 000               |
      |               [][][][][][][][] 000               |
      |               [][][][][][][][] 000               |
      |               [][][][][][][][] 000               |
      |               [][][][][][][][] 000               |
      |               [][][][][][][][] 000               |
      |               [][][][][][][][] 000               |
      |                                                  |
      |               * * * * * * * *                    |
      |                                                  |
      |   Code BASIC pour produire ce caractère :        |
      |                                                  |
      |  VDU 23,240,000,000,000,000,000,000,000,000      |
      |                                                  |
      |                                                  |
      +--------------------------------------------------+
    
    

La moitié supérieure de l'écran est ce que j'appellerai l'écran principal : elle ne changera pas beaucoup au cours du programme. La partie inférieure contient la grille, les codes VDU et les caractères grandeur nature. Cette partie changera beaucoup, aussi la conception doit traiter cela séparément. La rangée d'astérisques sous la grille représente une rangée de caractères véritables. Il nous apparaît immédiatement que la ligne VDU est plus longue que les 40 caractères que nous donne le MODE 6, aussi devrons-nous choisir un autre mode pour pouvoir la contenir. Le MODE 21 nous donne 50 colonnes, ce qui devrait suffire. Nous en savons maintenant assez pour pouvoir établir ce à quoi doit ressembler Dessiner l'écran principal.


    
      Dessiner l'écran principal 
 
      Fixer la couleur de fond
      CLS
      PRINT Titre
      PRINT aide instructions 
 
      END
    
    

C'est CLS qui est utilisé en lieu et place de « Vider l'écran » parce qu'il est évident que c'est la commande qu'il faut.



b.– Dessiner le caractère


Il n'y a ici pas grand chose à faire ; ce qui suit promet d'être un défi un peu plus grand : Dessiner le caractère. On peut envisager de considérer qu'il y a trois parties distinctes : la grille, le caractère lui-même et les codes VDU. En restant dans le général, voici ce que nous obtenons.


    
      Dessiner le caractère 
 
      Tracer la grille
      Dessiner le caractère réel
      Afficher les codes VDU 
 
      END
    
    

Il est parfaitement évident qu'il y a ici davantage de travail à faire, mais c'est notre première mouture, aussi laisserons-nous les détails pour plus tard. Au cours de la conception, les choses changent souvent, aussi cela ne sert à rien de trop s'impliquer à ce niveau.



c.– Dessiner le curseur


Vient ensuite : Dessiner le curseur. On s'en servira pour déplacer le curseur dans la grille. Pour qu'on ait l'impression que le curseur se déplace, nous devons d'abord l'effacer de son ancienne position puis le redessiner à la nouvelle. Nous pouvons utiliser une couleur différente pour mettre le curseur en relief quand il se déplace sur la grille, et pour ce, nous devons savoir si la cellule sur laquelle il se trouve est à 1 ou à 0.


    
      Dessiner le curseur 
 
      Mettre à la couleur normale
      Effacer le curseur à l'ancienne position
      Mettre la couleur curseur en relief
      Colorer la cellule à la position actuelle 
 
      END
    
    


d.– Intercepter l'action de l'utilisateur


Maintenant, nous plongeons dans la boucle REPEAT et nous y trouvons Intercepter l'action de l'utilisateur. Cette partie aura pour charge d'intercepter les touches tapées au clavier, en filtrant celles que nous ne voulons pas et en traduisant les autres en code pour que le reste du programme s'en serve. D'après notre schéma d'écran, nous déduisons que les touches qui nous intéressent sont les touches fléchées, la barre d'espacement et le « X » ou le « x ». L'utilisation de  Esc  pour sortir est une caractéristique intrinsèque, aussi n'avons-nous pas besoin de nous en occuper en tant que telle. Le programme peut rester à attendre qu'une touche soit pressée puisque toutes les autres actions dépendent de cela. Quand une touche est pressée, nous pouvons décider si elle est utile ou non et si elle l'est, la traduire en un code.


    
      Intercepter l'action de l'utilisateur 
 
      REPEAT
        Attendre qu'une touche soit pressée
        Traduire en code si la touche est valide
      UNTIL interception de touche valide 
 
       END
    
    


e.– Traiter l'action de l'utilisateur


En dernier lieu pour le moment, nous avons Traiter l'action de l'utilisateur.
Ici, on prendra l'action de la routine précédente et on en fera quelque chose. Les options sont très évidentes, aussi pouvons-nous sans plus tarder écrire ce qui suit.


    
      Traiter l'action de l'utilisateur 
 
      CASE Code OF
      WHEN Haut :   Déplacer curseur vers le haut
              Dessiner le curseur
      WHEN Droite : Déplacer curseur à droite
              Dessiner le curseur
      WHEN Bas :    Déplacer curseur vers le bas
              Dessiner le curseur
      WHEN Gauche : Déplacer curseur à gauche
              Dessiner le curseur
      WHEN Sortie : Mettre drapeau de Sortie à 1
      ENDCASE 
 
      END
    
    


f.– L'ensemble du premier passage


Voilà : c'était notre premier passage. Mettons tous les morceaux ensemble pour le voir en un seul endroit.


    
      Programme principal 
 
      Déclarer tableaux globaux et les structures
      Initialisation
      Dessiner l'écran principal
      Dessiner le caractère
      Dessiner le curseur
      REPEAT
        Intercepter l'action de l'utilisateur
        Traiter l'action de l'utilisateur
      UNTIL L'utilisateur choisit de sortir
      Fermeture
      END 
 
      Dessiner l'écran principal 
 
      Fixer la couleur de fond
      CLS
      PRINT Titre
      PRINT aide instructions 
 
      END 
 
      Dessiner le caractère 
 
      Tracer la grille
      Dessiner le caractère réel
      Afficher les codes VDU 
 
      END 
 
      Dessiner le curseur 
 
      Mettre à la couleur normale
      Effacer le curseur à l'ancienne position
      Mettre la couleur curseur en relief
      Colorer la cellule à la position actuelle 
 
      END 
 
      Intercepter l'action de l'utilisateur 
 
      REPEAT
        Attendre qu'une touche soit pressée
        Traduire en code si la touche est valide
      UNTIL interception de touche valide 
 
      END 
 
      Traiter l'action de l'utilisateur 
 
      CASE Code OF
        WHEN Haut :   Déplacer curseur vers le haut
                      Dessiner le curseur
        WHEN Droite : Déplacer curseur à droite
                      Dessiner le curseur
        WHEN Bas :    Déplacer curseur vers le bas
                      Dessiner le curseur
        WHEN Gauche : Déplacer curseur à gauche
                      Dessiner le curseur
        WHEN Bascule :Intervertir position grille
        WHEN Sortie : Mettre drapeau de Sortie à 1
      ENDCASE 
 
      END
    
    

Si vous vous êtes jamais senti intimidé à la pensée d'écrire un programme de taille raisonnable comme celui-ci, j'espère que vous voyez maintenant comment nous commençons à le débiter en morceaux de toute petite taille comme ceux sur lesquels vous vous êtes habitué à travailler jusqu'ici.



3.– Deuxième passage (2e affinage)



Plusieurs des routines semblent pouvoir être encore affinées. Ce sont Dessiner le caractère et Traiter l'action de l'utilisateur.



a.– Tracer la grille


Dessiner le caractère a trois lignes qui doivent faire réfléchir. La première dit Tracer la grille. Le tracé de la grille comprend aussi les totaux de lignes au bout de chacune d'elles. Nous avons là besoin de décider si le tracé de la grille et le calcul des sommes de lignes auront besoin de suffisamment de code pour mériter leur propre routine, ou bien les mettrons-nous dans la routine actuelle sans la surcharger ? Il est à présent devenu évident qu'il nous faudra un tableau pour contenir la grille. Pour tracer la grille, nous utiliserons une position d'écran pour chaque cellule, pour n'avoir ensuite rien d'autre à faire que suivre chaque ligne et chaque colonne pour afficher tour à tour le caractère correct. Comme nous sommes déjà bien impliqués dans la grille, il semble raisonnable de prévoir également ici les totaux de lignes. Pour chaque rangée, ou ligne, nous devons mettre le total à zéro, et ensuite, lorsque nous trouvons une position de grille qui est à 1, ajouter au total la valeur de cette colonne. Si nous fixons une valeur à 128 et que nous la divisions par deux à chaque colonne, nous pouvons en déduire la valeur pour cette colonne.


    
      Tracer grille & calculer chaque total ligne
      FOR chaque ligne
        Mettre la valeur de colonne à 128
        FOR chaque colonne
          Mettre le total de ligne à 0
          IF Grille à posit.ligne col. = 0 THEN
            PRINT à posit. caract. cellule vide
          ELSE
            PRINT à posit. caract. cellule pleine
            Mettre tot.ligne à tot.ligne+val.col.
          ENDIF
          Mettre valeur colonne à val. colonne / 2
      NEXT colonne
      PRINT au bout de la ligne le total de ligne
      NEXT ligne
    
    


b.– Dessiner le caractère réel


Personnellement, je pense que cela ira très bien dans la routine existante, aussi n'est-il pas besoin d'en faire une nouvelle. Disséquons la ligne suivante : Dessiner le caractère réel. Nous avons déjà trouvé les valeurs pour chaque ligne dans le bloc de code précédent, aussi est-ce maintenant très facile.


    
      Appeler VDU 23 avec car. 240 & totaux lignes
      PRINT à sa position huit fois le car. 240
    
    

Il nous faut enfin afficher les totaux sur une ligne bien faite pour que les utilisateurs puissent les recopier dans leurs programmes.


    
      PRINT à posit. "Code BASIC pour ce carac. :"
      PRINT à sa position "VDU 23, 240";
      FOR chaque ligne
        PRINT ",";total de la ligne;
      NEXT ligne
    
    

L'intégralité de notre routine ressemble ainsi à ceci :


    
      Dessiner le caractère 
 
      Tracer grille & calculer chaque total ligne
      FOR chaque ligne
        Mettre la valeur de colonne à 128
        FOR chaque colonne
          Mettre le total de ligne à 0
          IF Grille à posit.ligne col. = 0 THEN
            PRINT à posit. caract. cellule vide
          ELSE
            PRINT à posit. caract. cellule pleine
            Mettre tot.ligne à tot.ligne+val.col.
          ENDIF
          Mettre valeur colonne à val. colonne / 2
        NEXT colonne
      PRINT au bout de la ligne le total de ligne
      NEXT ligne
      Appeler VDU 23 avec car.240 & totaux lignes
      PRINT à sa position huit fois le car. 240
      PRINT à posit. "Code BASIC pour ce carac. :"
      PRINT à sa position "VDU 23, 240";
      FOR chaque ligne
        PRINT ",";total de la ligne;
      NEXT ligne
 
      END
    
    

Vous voyez comment nous avons fait pour conserver les descriptions originales des tâches ? Celles-ci deviennent habituellement des REM dans le programme terminé, parce qu'elles indiquent au lecteur le but que chacune des sections essaie d'atteindre.



c.– Traiter l'action


Passons à Traiter l'action.
  Ici, il y a deux choses à voir.
  • La première, c'est une petite restructuration. Chaque action implique de redessiner le curseur, aussi sans doute devrions-nous sortir cette action de chaque instruction et la déplacer à la fin, pour économiser la place et le temps de frappe. C'est assez facile, parce que nous n'avons pas encore écrit de code.
  • La seconde, c'est l'utilisation du déplacement du curseur. Nous nous trouvons à nouveau devant un choix : faire une routine séparée ou bien écrire le code à chaque endroit. J'ai choisi la première option parce que nous pouvons alors écrire une routine générique pour manipuler tout mouvement du curseur. Nous pouvons noter cela, et nous définirons la routine dans un instant. Entre temps, y a-t-il autre chose ? Nous ne nous sommes pas occupés de ce qui se passe dans le cas où l'on tape sur la barre d'espacement. En réalité, ce n'est pas trop une grosse difficulté :


    
      WHEN Bascule : Intervertir position grille
                     IF Grille à curseur = 0 THEN
                       Mets Grille posn.curseur à 1
                     ELSE
                       Mets Grille posn.curseur à 0
                     ENDIF
    
    

Tout ce qu'il nous faut faire, c'est de mettre la grille à jour. Dessiner le caractère dans le programme principal se débrouillera pour faire le reste. Voici notre routine Traiter l'action révisée :


    
      Traiter l'action de l'utilisateur 
 
      CASE Code OF
        WHEN Haut :   Déplacer curseur vers le haut
        WHEN Droite : Déplacer curseur à droite
        WHEN Bas :    Déplacer curseur vers le bas
        WHEN Gauche : Déplacer curseur à gauche
        WHEN Bascule :Intervertir position grille
          IF Grille position ligne colonne = 0 THEN
            Mets Grille posit. du curseur à 1
          ELSE
            Mets Grille posit. du curseur à 0
          ENDIF
        WHEN Sortie : Mettre drapeau de Sortie à 1
      ENDCASE
      Dessiner le curseur 
 
      END
    
    


d.– Déplacer le curseur


Après tout cela, nous pouvons retourner à notre routine de déplacement du curseur. Tout ce qu'il faut ici, c'est prendre la direction dans laquelle le curseur veut se déplacer et vérifier que c'est une position valide, c'est-à-dire qu'elle ne se situe pas en dehors de la grille. Si la position est dûment vérifiée, déplacez-y le curseur. Avant de le déplacer, nous devons nous souvenir de la position antérieure pour que Dessiner le curseur puisse l'effacer avant de mettre la nouvelle position à la couleur de curseur en relief.


    
      Déplacer le curseur 
 
      Enregistrer posit.actuelle ds ancienne posit.
      CASE Direction OF
        WHEN Haut :   IF ligne Curseur > 1 THEN 
                        Diminuer ligne Curseur de 1
        WHEN Droite : IF colonne Curseur < 8 THEN
                        Augm. colonne Curseur de 1
        WHEN Bas :    IF ligne Curseur < 8 THEN 
                        Augm. ligne Curseur de 1
        WHEN Gauche : IF colonne Curseur > 1 THEN 
                        Diminuer col. Curseur de 1
      ENDCASE 
 
      END
    
    


e.– La Version 2 du « pseudo-programme »


La Version 2 de notre conception de programme est maintenant comme ceci :


    
      Programme principal 
 
      Déclarer tableaux globaux et les structures
      Initialisation
      Dessiner l'écran principal
      Dessiner le caractère
      Dessiner le curseur
      REPEAT
        Intercepter l'action de l'utilisateur
        Traiter l'action de l'utilisateur
      UNTIL L'utilisateur choisit de sortir
      Fermeture
      END 
 
      Dessiner l'écran principal
 
      Fixer la couleur de fond
      CLS
      PRINT Titre
      PRINT aide instructions 
 
      END 
 
      Dessiner le caractère 
 
      Tracer grille & calculer chaque total ligne
      FOR chaque ligne
        Mettre la valeur de colonne à 128
        FOR chaque colonne
          Mettre le total de ligne à 0
          IF Grille à posit.ligne col. = 0 THEN
            PRINT à posit. caract. cellule vide
          ELSE
            PRINT à posit. caract. cellule pleine
           Mettre tot.ligne à tot.ligne+val.col.
          ENDIF
          Mettre valeur colonne à val. colonne / 2
      NEXT colonne
      PRINT au bout de la ligne le total de ligne
      NEXT ligne 
 
      Appeler VDU 23 avec car. 240 & totaux lignes
      PRINT à sa position huit fois le car. 240
      PRINT à posit. "Code BASIC pour ce carac. :"
      PRINT à sa position "VDU 23, 240";
      FOR chaque ligne
        PRINT ",";total de la ligne;
      NEXT ligne
      END 
 
      Dessiner le curseur 
 
      Mettre à la couleur normale
      Effacer le curseur à l'ancienne position
      Mettre la couleur curseur en relief
      Colorer la cellule à la position actuelle 
 
      END 
 
      Intercepter l'action de l'utilisateur 
 
      REPEAT
        Attendre qu'une touche soit pressée
        Traduire en code si la touche est valide
      UNTIL interception de touche valide 
 
      END 
 
      Traiter l'action de l'utilisateur 
 
      CASE Code OF
        WHEN Haut :   Déplacer curseur vers le haut
        WHEN Droite : Déplacer curseur à droite
        WHEN Bas :    Déplacer curseur vers le bas
        WHEN Gauche : Déplacer curseur à gauche
        WHEN Bascule :Intervertir position grille
                      IF Grille à curseur = 0 THEN
                        Mets Grille posn.curseur à 1
                      ELSE
                        Mets Grille posn.curseur à 0
                      ENDIF
        WHEN Sortie : Mettre drapeau de Sortie à 1
      ENDCASE
      Dessiner le curseur
      END 
 
      Déplacer le curseur 
 
      Enregistrer posit.actuelle ds ancienne posit.
      CASE Direction OF
        WHEN Haut :   IF ligne Curseur > 1 THEN 
                        Diminuer ligne Curseur de 1
        WHEN Droite : IF colonne Curseur < 8 THEN
                        Augm. colonne Curseur de 1
        WHEN Bas :    IF ligne Curseur < 8 THEN 
                        Augm. ligne Curseur de 1
        WHEN Gauche : IF colonne Curseur > 1 THEN 
                        Diminuer col. Curseur de 1
      ENDCASE 
 
      END
    
    

Est-ce que ça n'est pas merveilleux d'utiliser copier-coller ?



Pour trouver les variables


La conception du projet a atteint un point à partir duquel vous pouvez commencer à « voir » le code sous-jacent, c'est-à-dire que nous l'avons assez affiné. C'est maintenant le moment d'inviter les amis et la famille autour de la table pour jouer à « chassez la variable ». À ce point, je prends normalement un stylo rouge et je gribouille le pseudo-code. C'est un peu difficile à faire dans le Bloc-notes ou dans Internet Explorer, aussi nous allons faire une analyse détaillée de chaque routine. Heureusement, cela ne prendra pas autant de temps que la partie précédente. Pour chaque routine, nous devons connaître le nom, le type et le scope de chaque variable à trouver.

En parcourant le programme principal, nous voyons deux variables qui surgissent. L'une est le drapeau (flag) utilisé pour Sortir (Exit), l'autre le choix de l'action dans la routine Intercepter l'action de l'utilisateur. Toutes deux sont des entiers et par le fait même qu'elles se situent dans le programme principal, elles sont globales. La variable de Sortie devra être mise à « faux » quand le programme est lancé, aussi cela concerne-t-il la routine d'initialisation.

Dessiner l'écran principal n'a aucune variable, puisque ce n'est que de l'affichage. Facile !

Dessiner le caractère est un peu plus complexe. Nous aurons besoin de deux variables locales entières pour les boucles FOR, et nous les appellerons Ligne% et Col%. Un autre entier est nécessaire pour la valeur de chaque bit ; appelons-le ValeurCol% : là aussi, rien d'autre n'a besoin de s'en servir, aussi est-il local. Les données du caractère principal lui-même, à l'évidence, sont conservées dans un tableau à deux dimensions. Nous l'appellerons Grille% et il est global parce que les autres routines ont besoin d'y accéder. Un autre tableau est nécessaire pour contenir les totaux de lignes : TtalLigne%. Ce sera un tableau à une seule dimension pour des entiers. Là encore, nous le ferons global.

Dessiner le curseur semble avoir quatre entiers associés aux positions actuelle et précédente du curseur. Ce serait bien de les stocker ensemble, aussi mettons-les dans une structure. La structure doit être globale puisque nous savons que la routine Déplacer le curseur l'utilise également. Tous sont des entiers et la position initiale sera définie dans la routine d'initialisation.

Intercepter l'action de l'utilisateur a une variable entière pour contenir la touche pressée, Touche%, et une variable entière pour contenir le code renvoyé, Code%. Les deux sont locales.

Traiter l'action de l'utilisateur peut avoir la valeur du code de l'action qui lui est passé. Le drapeau Sortie est global comme cela a déjà été décrit.

Déplacer le curseur manipule la structure du curseur comme décrit dans Dessiner le curseur.

Il faut considérer quelques autres détails. Par exemple, la position de chaque instruction PRINT doit être décidée. On peut deviner cela grossièrement en considérant la disposition de l'écran, mais sachez-le : vous n'y arriverez jamais exactement du premier coup !



La grille de 8 × 8


Nous n'avons pas encore considéré la façon dont nous allons représenter la grille. Chaque position peut être décrite comme la position d'un caractère. Si elle est occupée, nous pouvons utiliser un bloc intégral. Si elle est vide, c'est l'espace qui semblerait le caractère le plus évident. Pourtant, si nous utilisons l'espace, comment savoir où se trouve le curseur ? Il nous faut également un caractère pour une cellule vide. Un caractère ayant un contour d'un seul bit suffira. Donc, il nous faut deux caractères définis par l'utilisateur :


     
      XXXXXXXX  255           XXXXXXXX  255
      XXXXXXXX  255           X......X  129
      XXXXXXXX  255           X......X  129
      XXXXXXXX  255           X......X  129
      XXXXXXXX  255           X......X  129
      XXXXXXXX  255           X......X  129
      XXXXXXXX  255           X......X  129
      XXXXXXXX  255           XXXXXXXX  255
    
    

où « X » = rempli et « . » = vide. Les caractères 241 et 242 iront très bien pour cela. C'est à la routine d'initialisation qu'il appartient de les mettre en place.



L'initialisation et la fermeture


À l'aide de tous ces renseignements, nous pouvons dès lors écrire la routine d'initialisation...


    
      Initialisation 
 
      Définir le mode graphique
      Définir caract. utilisateur 240, 241 et 242
      Définir l'emplacement du curseur
      Éteindre le curseur de texte 
 
      END
    
    

...et en dernier lieu, son complément, Fermeture, dont le travail sera de faire le nettoyage avant l'arrêt du programme. Nous ne voulons pas vider l'écran ici, parce qu'il se pourrait que l'utilisateur veuille prendre note de sa nouvelle création après la fin du programme. Nous nous contenterons de rallumer le curseur de texte et de le placer en bas de l'écran pour qu'il ne soit pas une gêne.


    
      Fermeture 

      Rallumer le curseur de texte
      Placer le curseur au bas de l'écran 

      END
    
    


Le Programme


Enfin, nous voici dans la situation où nous pouvons écrire le code. Comme vous l'avez sans doute maintenant deviné, chaque tâche comme Dessiner le curseur doit être maintenue séparée du corps de code principal. Pour y parvenir, nous utilisons des PROC et des FN. Je ne vais pas vous en faire un compte-rendu ligne par ligne parce que, si vous avez suivi tout ce qui précède, il n'existe rien qui puisse vous choquer ni vous étonner. Cliquez sur le lien vers le programme complet. J'aime laisser des lignes en blanc pour rendre les choses plus faciles à lire. Également, chaque tâche est séparée d'une autre par une ligne d'astérisques et une petite description, pour la rendre plus facile à retrouver lorsque vous parcourez l'ensemble du code. Je sais que j'ai dit au tout début que vous devriez taper vous-même tout le code à la main, aussi veuillez vous sentir libre de le faire, mais simplement au cas où ça vous démange de voir à quoi ressemble votre création achevée, vous avez là une gentille version à copier et coller. Cliquez sur le lien ci-dessous et puis, si vous êtes dans Internet Explorer™, cliquez sur le menu Edition, puis Sélectionner tout, puis de nouveau Edition et enfin Copier. Vous pouvez alors coller l'ensemble dans l'éditeur. Si vous utilisez un autre navigateur, il y a sans doute une méthode similaire qui s'y cache quelque part. Utilisez la flèche de retour arrière dans votre navigateur pour revenir ici quand vous aurez vu le programme.

Listing du programme principal



Conclusion


Et voilà notre programme. Pas trop mal, n'est-ce pas ? Le problème, en l'ayant écrit comme ceci, c'est qu'il apparaît comme un processus entièrement linéaire. Ce n'est pas le cas. Souvent, le pseudo-code subira un certain nombre de révisions avant de s'établir comme version finale. Et même alors, en affectant des variables ou en écrivant du code, vous rencontrerez des situations qui exigent de revenir en arrière et de remanier quelque chose. Loin d'être une perte de temps, c'est le meilleur moyen de développer un programme. Pourquoi ? Simplement parce que plus vous prenez le temps de vous asseoir et de réfléchir à quelque chose, en ruminant les différentes façons de le faire, plus vous aurez de chances de le faire correctement. Si vous aviez une entrevue ou un rendez-vous important, vous ne laisseriez pas au hasard le soin de trouver votre chemin vers votre destination, sans planifier l'itinéraire. Alors, comment pourriez-vous espérer écrire un programme décent si vous ne faites que retrousser vos manches pour commencer à taper ? Si vous faisiez cela, après avoir tapé votre programme il vous semblera plus facile d'essayer de tripoter les morceaux qui ne se comportent pas correctement plutôt que de revenir sur vos pas et d'admettre que vous aviez un peu plus tôt pris la mauvaise décision. Si vous n'aviez pas planifié le programme, vous n'avez pas à revenir sur vos pas et où que vous vous tourniez, vous êtes dans les sables mouvants. Si vous aviez bel et bien fait une planification, il y a tout à croire qu'avec un peu d'expérience vous auriez reconnu les problèmes au cours de votre approche et que vous les auriez éliminés avant même d'en arriver à l'étape du codage. Comme je l'ai dit plus haut, aucune des idées exprimées ici n'est nouvelle ni ne m'appartient. Je n'ai aucun intérêt financier à vous pousser vers cette méthode ; simplement, on me l'a enseignée au début de ma carrière et je l'ai utilisée en Pascal, en  C  ou  C++  et en  VB  ou  VBA . Oh ! et en BBC BASIC, aussi. Et des centaines d'autres programmeurs l'ont fait aussi. Utilisez-la. Elle marche. (Fin de déclamation.)




Exercices


20.1
Je suis certain que vous verrez ici un grand nombre d'améliorations ; essayez d'ajouter deux autres commandes, l'une pour vider complètement la grille et l'autre pour la remplir. Vous pourriez utiliser V et R pour faire cela. Remarquez combien il est facile d'écrire le code pour des modifications comme celles-ci, parce que la structure rend tout facile à trouver.

20.2
Il est également agréable de pouvoir travailler dans l'autre sens, en établissant les caractères à partir des totaux de lignes. Modifiez le projet pour permettre à l'utilisateur d'entrer un total pour la ligne sur laquelle il se trouve. Ensuite, réaffichez le caractère.



Fin du Chapitre 20





Haut de Page  •  [Top of Page]

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

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

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]