Travail pratique #2--Énoncé (partie écran)

Ce qui suit constitue l'énoncé du travail pratique #2 concernant la portion traitant de l'écran.

Contraintes générales à respecter

Étant donné le programme principal suivant (disponible sur le site du cours, sous le nom de "tp2ecran.cpp" dans l'archive "tp2ecran.zip"):


#include <iostream.h>
#include "Ecran.h"
#include "Clavier.h"

int main ()
{
   bool Termine;
   char c;
   int RangeeHautEcran;
   // Garder la valeur de la rangee courante
   // a l'ecran.
   int ColonneHautEcran; // Garder la valeur de la colonne courante
                         // a l'ecran.
   DivisionEcran Portion_Ecran; // Variable de type DivisionEcran
                         // qui specifie le haut ou le bas de
                         // l'ecran.
   Termine = false;
   RangeeHautEcran = 0;
   ColonneHautEcran = 0;

   Ecran_Initialise();
   Message();

   while (!Termine)
   {
      if (Clavier_Tester_Statut ()) // un caractere a lire
      {
         c = Clavier_Lire_Sans_Echo ();
         if (c == CHAR_ECHAP)
         {
            Termine = true;
         }
         else
         {
            if (RangeeHautEcran >= MAX_RANGEE_HAUT
             && ColonneHautEcran > MAX_COLONNE_HAUT)
            {
               Portion_Ecran = PARTIE_HAUTE_ECRAN;
               Ecran_Deroule(Portion_Ecran); //On deroule au complet
                           // la partie haute de l'ecran
               // On revient en haut et a gauche de l'ecran du haut
               RangeeHautEcran = 0;
               ColonneHautEcran = 0;
               Ecran_Ecrire_XY(c, RangeeHautEcran, ColonneHautEcran);
               ColonneHautEcran++;
            }
            else if (ColonneHautEcran > MAX_COLONNE_HAUT)
            {
               ColonneHautEcran = 0;
               RangeeHautEcran++;
               Ecran_Ecrire_XY(c, RangeeHautEcran, ColonneHautEcran);
               ColonneHautEcran++;
            }
            else if (RangeeHautEcran > MAX_RANGEE_HAUT)
            {
               Portion_Ecran = PARTIE_HAUTE_ECRAN;
               Ecran_Deroule(Portion_Ecran);
               RangeeHautEcran = 0;
               ColonneHautEcran = 0;
               Ecran_Ecrire_XY(c,RangeeHautEcran,ColonneHautEcran);
            }
            else
            {
               Ecran_Ecrire_XY(c,RangeeHautEcran,ColonneHautEcran);
               ColonneHautEcran++;
             }
         }
      }
   }

   cout << endl << "Au revoir!" << endl;
} // main ()

ainsi que le fichier d'en-tête suivant (aussi disponible sur le site du cours, sous le nom de "Ecran.h" dans l'archive "tp2ecran.zip"):


#ifndef ECRAN_H
#define ECRAN_H
// Le nombre de rangees maximale et de colonne maximale
const int MAX_RANGEE_BAS = 24;
const int MAX_COLONNE_BAS = 79;
const int MAX_COLONNE_HAUT = 79;
const int MAX_RANGEE_HAUT = 11; // Celle qui separe les 2 portions d'ecran

// Les attributs des caracteres
typedef enum
{
   AUCUN,HI,LOW,ITALIQUE,SOULIGNE,BLINK,RAPBLINK,REVVIDEO,INVISIBLE
}
attr;

// La partie haute ou basse de l'ecran
typedef enum
{
   PARTIE_HAUTE_ECRAN, PARTIE_BASSE_ECRAN
}
DivisionEcran;

// Les fonctions ecrites en assembleur
extern "C"
{
   void Ecrire_Ecran (char c, int pos);
   void Ecran_Ecrire_XYattr (char c, attr attribut, int r, int col);
   void Ecran_Ecrire_XY (char c, int rang, int col);
   void Ecran_Efface();
   char Ecran_Lire_Caractere_XY(int rang, int col);
}

// Les fonctions a ecrire par l'eleve
void Ecran_Ecrire(char c, int Rangee, int Colonne);
// Cette fonction permet d'ecrire un caractere a la rangee et a
// la colonne specifiee.

void Ecran_Deroule(DivisionEcran);
// Cette fonction deroule "scroll" l'ecran du haut d'une ligne vers
// le haut lorsque la rangee est 11 et la colonne est a 79.
// Cette fonction deroule l'ecran du bas lorsque la rangee est 24 et
// la colonne vaut 79.
// Le deroulement dans l'ecran du haut ou du bas est specifie par la
// variable de type DivisionEcran

void Ecran_Initialise();
// Cette fonction initialise l'ecran.  On vide l'ecran et on y affiche
// une ligne separatrice au millieu de ce dernier.

void Message();
// Fonction sert tout simplement a faire afficher le message
// "Esc pour terminer. Je n'ecris rien ici..." dans l'ecran du bas.

Vous devrez, à l'aide de Borland C 3.1 (BC3.1):

  • Ajouter dans votre projet actuel, le fichier "Ecran.h" qui devra être inclus dans votre fichier "Ecran.cpp". Ce fichier ne pourra en aucun temps être modifié;
  • créer le fichier source "Ecran.cpp" qui implantera au minimum les sous-programmes "Ecran_Ecrire_XY()", "Ecran_Lire_Caractere_XY()" et "Ecran_Deroule()";
  • intégrer le fichier source "Ecran.cpp" à votre projet;
  • intégrer le fichier objet "Ecranasm.obj"--disponible dans l'archive "tp2ecran.zip"--à votre projet;
  • vous assurer que le tout compile bien et s'exécute correctement.
  • Vous trouverez aussi dans l'archive "tp2ecran.zip" un exécutable, soit "TP2ECRAN.EXE". Le programme "TP2ECRAN.exe" est le résultat minimum attendu de la 2ième partie de ce travail.

    Détail de l'énoncé

    Le travail consiste à implanter trois (3) sous-programmes permettant de faire la gestion de la sortie à l'écran. Contrairement aux autres parties du travail, celle-ci réalise la gestion de l'écran par le biais de l'écriture et la lecture de caractère directement dans la mémoire vidéo (voir annexe pour plus d'explication).

    Ces sous-programmes respecteront les prototypes donnés par "Ecran.h".

    Sous-programmes à utiliser

    Ce qui suit détaille les sous-programmes existants dont vous devrez faire usage pour votre travail.

    Ecran_Ecrire_XY()

    Après l'appel de la procédure Ecran_Ecrire_XY(), le caractère c est affiché à l'écran à la position ( Rangee, Colonne ).

    
    void Ecran_Ecrire_XY(char c, int Rangee, int Colonne);
    Intrants

    c

    Caractère à faire afficher à la rangée Rangee et à la colonne Colonne.

    Rangee

    La rangée où faire afficher le caractère à l'écran, dans l'intervalle de 1 à 25 inclusivement.

    Colonne

    La colonne où faire afficher le caractère à l'écran, dans l'intervalle de 1 à 80 inclusivement.

    Exemple:

    
    Ecran_Ecrire_XY('a',10,70); // 'a' s'affiche à la rangée 10,
                                // colonne 70

    Ecran_Ecrire_XYattr()

    Après l'appel de la procédure Ecran_Ecrire_XYattr(), le caractère c est affiché à l'écran à la position ( Rangee, Colonne ) avec l'attribut attr.

    
    void Ecran_Ecrire_XYattr (char c, attr Attribut_Caractere,
                              int Rangee, int Colonne);
    Intrants

    c

    Caractère à faire afficher à la rangée Rangee et à la colonne Colonne.

    Rangee

    La rangée où faire afficher le caractère à l'écran, dans l'intervalle de 1 à 25 inclusivement.

    Colonne

    La colonne où faire afficher le caractère à l'écran, dans l'intervalle de 1 à 80 inclusivement.

    Attribut_Caractere

    L'attribut à donner au caractère parmi les choix suivants:

    
    AUCUN,
    HI,
    LOW,
    ITALIQUE,
    SOULIGNE,
    BLINK,
    RAPBLINK,
    REVVIDEO,
    INVISIBLE

    Ces attributs sont définis par l'intermédiaire du type attr qui est un type énuméré défini dans le fichier "Ecran.h".

    Exemple:

    
    Ecran_Ecrire_XYattr('a',10,70,REVVIDEO); // 'a' s'affiche à la
                                      // rangée 10, colonne 70
                                      // en reverse vidéo

    Ecran_Lire_Caractere_XY()

    Après l'appel de la fonction Ecran_Lire_Caractere_XY(), le caractère présent à la position ( Rangee, Colonne ) est retourné.

    
    char Ecran_Lire_Caractere_XY (int rangee, int colonne);
    Intrants

    Rangee

    La rangée où lire un caractère à l'écran, dans l'intervalle de 1 à 25 inclusivement.

    Colonne

    La colonne où lire un caractère à l'écran, dans l'intervalle de 1 à 80 inclusivement.

    Retourne...

    Cette fonction retourne le caractère présent à la rangée Rangee et la colonne Colonne dans la mémoire vidéo.

    Exemple:

    
    c = Ecran_Lire_Caractere_XY(10,70); // c reçoit le caractère se
                                     // trouvant à la rangée 10,
                                     // colonne 70 de l'écran

    Ecran_Efface()

    Après l'appel de la procédure Ecran_Efface(), l'écran est effacé entièrement.

    
    void Ecran_Efface();
    Intrants

    Aucun.

    Exemple:

    
    Ecran_Efface(); // l'écran est effacé

    Sous-programmes à écrire

    Ce qui suit détaille les sous-programmes que vous devrez écrire dans le cadre de votre travail.

    Ecran_Initialise()

    Cette procédure initialise l'écran. Elle vide l'écran et le divise en deux avec un caractère de votre choix. Le caractère '-' pourrait être intéressant pour diviser l'écran.

    
    void Ecran_Initialise ();

    Ecran_Ecrire_XY()

    Cette fonction reçoit deux paramètres. Le premier, une variable de type énuméré (DivisionEcran, voir le fichier Ecran.h) qui représente la partie haute ou basse de l'écran. La frontière entre la partie haute et la partie basse de l'écran est représentée par la ligne qui divise l'écran. Le deuxième paramètre est un type char qui représente le caractère à afficher à l'écran.

    Exemple d'appel:

    
    DivisionEcran PortionEcran;
    char c;
    PortionEcran = PARTIE_HAUTE_ECRAN;
    c = 'd';
    Ecran_Ecrire_XY(DivisionEcran, c);

    L'appel de Ecran_Ecrire_XY() ci-dessus fera en sorte de faire afficher la lettre 'd' dans la partie haute de l'écran à la rangée et la colonne courante.

    Ceci vous demande donc de garder, par l'intermédiaire de deux variables (une pour la rangée et une pour la colonne), la valeur de la rangée courante et de la colonne courante.

    Ecran_Deroule()

    Cette procédure doit faire dérouler vers le haut les lignes de textes précédemment entrées. Vous devez donc, par une combinaison des sous-programmes Ecran_Lire_Caractere_XY() et Ecran_Ecrire_XY(), faire monter les lignes de la portion haute ou basse de l'écran (tel que spécifié par le paramètre reçu de type DivisionEcran--voir le fichier Ecran.h) d'une rangée vers le haut.

    Ainsi, l'appel suivant:

    
    Ecran_Deroule(PARTIE_BASSE_ECRAN);

    aura cet effet:

    Dans le programme de démonstration, cette procédure vide en entier la portion de l'écran considerée.

    Vérification: laboratoire de la semaine du 17 avril 2000.