Université des Sciences et Technologies de Lille
Licence Miage - Programmation 1 - TP
Compression d'image
Soit la suite d'entiers naturels
314 314 3 54 54 54 22.
Lisez-la : on peut aussi prononcer
2 fois 314, 1 fois 3, 3 fois 54, 1 fois 22.
La seconde phrase est une description compressée de la
première,
et c'est cette propriété qui est utilisée (de manière plus
sophistiquée ...) dans les algorithmes de compression d'image: on regroupe
les pixels voisins identiques.
Question 1
Écrire un programme compression qui permet
de transformer une suite d'entiers, lue au clavier, de la forme
314 314 3 54 54 54 22 en 2 fois 314, 1 fois 3, 3 fois 54, 1 fois 22.
Par convention, la fin de la suite d'entiers est signalée par un 0.
Pour tester votre programme, vous pouvez rediriger l'affichage vers un fichier
avec l'opérateur >. Par exemple
compression > test .
Le résultat de l'exécution, au lieu d'apparaitre à l'écran, se
trouve alors dans le fichier test, que vous n'avez plus qu'à
visualiser avec emacs. Attention, la redirection n'est possible
que si le fichier test n'existe pas, ce qui signifie qu'il faut
effacer celui-ci avant chaque nouveau test (commande Linux rm
test).
Question 2
Écrire un second programme decompression, qui opère la transformation
réciproque : à partir de la suite de caractères
2 * 314, 1 * 3, 3 * 54, 1 * 22.
,
le programme affiche la suite d'entiers 314 314 3 54 54 54 22.
Pour cela, nous vous conseillons de procéder de manière méthodique. Vous
pouvez notamment définir un ensemble d'états facteur, fois, valeur et
virgule, correspondant à différents moments de la suite :
|
2 |
état facteur |
|
* |
état fois |
|
3 |
état valeur |
|
1 |
état valeur |
|
4 |
état valeur |
|
, |
état virgule |
|
1 |
état facteur |
|
* |
état fois |
|
3 |
état valeur |
|
|
etc.
|
En ADA, l'ensemble d'états est décrit par le type énuméré
type etat is (facteur, valeur, fois, virgule);
L'algorithme ressemblera ensuite à ceci :
On est dans l'état facteur et
-
le caractère lu est un chiffre : on continue le calcul du facteur.
-
le caractère lu est '*' : le calcul du facteur est fini et on passe
dans l'état fois.
-
le caractère lu est autre : il y a une erreur dans la suite lue, et on arrête tout.
À vous de traiter les autres cas ! L'interruption du programme en cas d'erreur
de syntaxe se fait avec l'activation d'une exception, l'exception
prédéfinie constraint_error par exemple.
C'est l'instruction raise constraint_error;.
Hélène Touzet - octobre 2000
This document was translated from LATEX by
HEVEA.