Travaux Dirigé numéro
4 L&P
DESS CCI 1999-2000
Buts de la séance
-
Manipuler les fonctions C
On veut écrire un programme qui permet d'effectuer
des affichages simples sur un écran. Les exercices proposés
sont tirés du travail dirigé " Affichage sur un écran
" du cours d'algorithmique.
La machine d'affichage que l'on souhaite réaliser
a un état qui se caractérise par deux composants : l'écran
et le curseur.
-
L'écran est organisé sous la forme d'une suite
de lignes. Chaque ligne est une suite de positions d'affichage dans
chacune desquelles on peut placer un caractère. Un état de
l'écran est caractérisé par l'ensemble des caractéres
qu'il comporte. L'écran est vide lorsque toutes ses positions
d'affichage comportent un espace. La dimension de l'écran est définie
par sa hauteur et sa largeur (nombre de lignes et de colonnes).
-
Le curseur désigne la position de l'écran dans
laquelle on est suceptible de placer le prochain caractère. L'état
du curseur est caractérisé par sa position dans l'écran
(numéro de ligne et de colonne).
On appelle PremPos la première position de
la première ligne, et DerPos la dernière position
de la dernière ligne. Toute position p de l'écran a un successeur,
que l'on appelle succ(p). On convient en outre que succ(DerPos)
= PremPos. Avec ces éléments, nous utilisons le lexique
suivant.
Données :
-
Hauteur, Largeur : des entiers constants respectivement égaux
a 20 et 10.
-
Position : le type <nl : un entier sur [1..Hauteur], nc
: un entier sur [1..Largeur]>
Fonctions :
-
carPosCour : -> un caractère {caractère affiché
à la position courante}
-
estAuDebut : -> un booléen {vrai <=> le curseur
est en début de ligne}
Actions :
{ei: indifférent, ef: écran vide et posCour=PremPos}
{ei: indifférent, ef: égal a ei, l'écran
virtuel a été affiché sur l'écran de l'ordinateur}
-
affichCar : une action (la donnée : un caractère)
{ei: posCour=p0, ef: posCour=succ(po) et ecran contient
le caractère en p0}
-
placerCurs : une action (la donnée : une Position)
{ei : indifférent, ef: posCour = position donnée}
-
avancerCurs : une action (la donnée : une Position)
{ei : posCour = p0, ef: posCour = succ(p0)}
{ei : posCour = p0, ef: posCour = 1ere position de la
ligne suivant celle de p0}
Exercice 1 :
Traduire le lexique précédemment donné
dans le langage C.
Exercice 2 :
Réaliser les actions suivantes en langage C, en
termes des actions plus élémentaires définies dans
le lexique :
-
affichDes : une action (les données : un caractère,
un entier >= 0)
{affichDes(c,n) affiche n occurrences du caractère
c à partir de la position courante. A la fin, le curseur se trouve
après le dernier caractère affiché}.
-
affichRect : une action (les données : un entier
> 0, un entier sur [1..Largeur], un caractère)
{affichRect(n,m,c) affiche n lignes comportant m occurrences
de C par ligne. ei : curseur en début de la première ligne
du rectangle à tracer, ef : le rectangle est tracé, le curseur
est au début de la ligne suivant le dernier caractère affiché}.
Exercice 3 :
Réaliser (dans le langage C) les fonctions et actions
: estAuDébut, viderEcran, placerCurs et aLaLigne en
termes de primitives plus élémentaires. Réaliser ensuite
les primitives élémentaires.
Exercice 4 :
Réaliser l'action affTriangle, définie
comme suit, dans le langage C.
affTriangle : une action (les données : un entier
sur [1..Largeur], un caractère)
{affTriangle(n,c) affiche un triangle fait à l'aide
du caractère c et composé de 2n-1 lignes. La ligne centrale
comporte n caractères. La ième et la 2n-ième lignes
comportent i caractères. ei : curseur en début de la première
ligne du triangle à tracer, ef : le triangle est tracé, le
curseur est au début de la ligne qui suit celle du dernier caractère
affiché}
Par exemple, affTriangle('*', 3) a l'effet suivant :
*
**
***
**
*