IFT1015, Hiver 2007
Examen Pratique
Lundi 2 avril 2007
Durée: 1h45
Professeur: Pascal Vincent
Prénom:
Nom:
Code permanent:
Premier exercice: code secret par permutation de lettres
Contraintes et indications
Contrainte: pour cet exercice, les seules méthodes de
manipulaiton de chaînes de caractère (String) que vous
êtes autorisés à utiliser sont:
- la méthode length qui retourne la taille d'une chaîne de caractère.
- la méthode charAt qui retourne le caractère qui se trouve à une position donnéee dans la chaîne.
- l'opérateur + pour concaténer des chaînes de
caractère ou ajouter un caractère à une
chaîne.
- la méthode substring(debut,fin) qui retourne la sous-chaîe commençant à l'index debut jusqu'à l'index fin exclus (ou si vous préférez fin-1 inclus).
Ex: "ABCD".substring(1,3) retourne "BC".
Vous ne devrez utiliser aucune autre méthode de String ou
StringUtil.
Attention, à bien des égards, une chaîne de caractère (String) est un peu comme un tableau de carctères (char []).
Mais ils diffèrent par leur utilisation, voici un rappel de
quelques différences importantes entre chaîne et tableau:
- pour obtenir la taille d'une chaîne de caractère s on fait s.length(), mais pour la taille d'un tableat t, on fait t.length (sans parenthèses!).
- l'accès aux éléments d'un tableau se fait
avec [] alors que l'accès aux caractères d'une
chaîne se fait avec la méthode charAt.
- alors qu'on peut changer la valeur des éléments d'un tableau, on ne peut pas changer les caractères d'une chaîne existante en Java (on dit que les chaînes sont "immutable") .
But de l'exercice et explication du code par permutation
Le but de cet exercice est d'écrire un programme CodeSecret.java qui va vous permettre d'encoder et de décoder un texte avec un code de permutation de lettres.
Le programme prend en argument sur la ligne de commande une clé
secrète formée d'une série d'entiers.
Puis il lit une à une des lignes entrées au clavier,
permute les caractères selon les entiers de la clé, et
affiche affiche la ligne ainsi codée.
Je vais commencer par expliquer l'utilisation du programme, puis le
principe de fonctionnement du code et enfin préciser comment on
vous demande d'écrire le programme.
Exemple d'utilisation du programme avec la clé de quatre
chiffres 2 5 3 7: (les parties entrées par l'utilisateur sont
en caractères de taille fixe, les parties affichées par le programme sont en taille fixe gras)
java CodeSecret 2 5 3 7
LE PETIT CHAPERON ROUGE
TLE T PHAEOPCI RERONEUG
Il etait une fois une petite fille de village, la plus jolie qu'on eut su voir;
tIl a eneti ui oiunsft fpeelvdlete ,aie ija gllieusplenu'ol lut e quir soov;
Le même programme pourra être utiliser pour décoder un message ainsi
codé. Il suffit de l'appeler avec les entiers de la clé dans le sens
inverse.
java CodeSecret 7 3 5 2
TLE T PHAEOPCI RERONEUG
LE PETIT CHAPERON ROUGE
tIl a eneti ui oiunsft fpeelvdlete ,aie ija gllieusplenu'ol lut e quir soov;
Il etait une fois une petite fille de village, la plus jolie qu'on eut su voir;
Le principe du codage est que chaque entier de la clé indique la
taille (en nombre de caractères) d'un bloc de permutation des
caractères.
Pour chacune de ces tailles n, on va transformer la ligne lue, en découpant la ligne en blocs de n caractères, et en inversant l'ordre des caractères dans chaque bloc.
Par exemple si on a lu la chaîne ABCDEF, une taille de bloc
de 3 nous donnera deux blocs (ABC et DEF) qu'on va inverser (CBA et FED)
pour donner la chaîne transformée CBAFED.
Pour une taille de bloc de 2 on aurait 3 blocs (AB, CD, EF) qu'on
inverserait (BA, DC, FE) pour obtenir la chaîne
transformée BADCFE
Pour une taille de bloc de 4 on aurait 2 blocs mais avec un
deuxième bloc incomplet contenant seulement 2 caractères
(bloc ABCD et bloc EF) qu'on inverse (DCBA, FE) et on obtient la
chaîne transformée DCBAFE
On enchaîne plusieurs de ces transformations correspondant aux entiers de la clé. Ainsi pour la clé 2 5 3 7
par ex. on va transformer chaque ligne lue, d'abord avec une taille de
bloc de 2, puis on retransforme le résultat avec une taille de
bloc de 5, puis avec une taille de bloc de 3 puis de 7. On
enchaîne donc quatre transformations correspondant aux quatres
entiers de la clé.
Ce que vous devez faire
On vous demande d'écrire la classe CodeSecret.java avec les fonctions (méthodes statiques)
suivantes qu'il vous est recommandé de tester au fur et
à mesure que vous les écrivez!
- Une fonction inverser qui prend en paramètre une chaîne de caractère (String) s et retourne une chaîne avec les caractères de s en sens inverse. (ex: "ABCD" -> "DCBA")
- Une fonction inverserBlocs qui prend 2 paramètres: une chaîne s à transformer, et une taille de bloc n et qui retourne un version transformée de s où on a inversé tous ses blocs de taille n. Indication: utilisez la méthode substring! Attention à gérer correctement le dernier bloc qui peut avoir une taille inférieure à n (voir exemple ci-dessus pour une taille de bloc 4).
- Une fonction coder qui prend 2 paramètres: la chaîne s à coder, et la cle
sous forme d'un tableau d'entiers. La fonction doit enchaîner les
transformations d'inversion de bloc pour les tailles indiquées
dans la clé, et retourner la chaîne ainsi
codée.
- Une fonction tableauEntiers qui prend en paramètre un tableau de chaînes de caractères t (chaque élément de t
étant la représenation sous forme de chaîne d'un
nombre entier) et qui retourne un tableau d'entier correspondant. La
fonction a la signature suivante:
int[] tableauEntiers(String[] t)
Cette fonction sera utile pour transformer le tableau reçu comme paramètre par la fonction main. En
effet, quand on appelle le programme avec des arguments sur la ligne de
commande (ici, les entiers de la clé), ceux-ci sont transmis
à la finction main sous forme d'un tableau de chaînes de caractères: String[] args Il contiendra donc les
tailles de bloc de la clé
sous forme de chaînes de caractère (une par nombre). Or
nos autres fonctions se servent d'une clé sous forme d'un tableau d'entiers. D'où l'utilité de cette fonction.
Indication: regardez comment on faisait pour obtenir des entiers à partir des arguments de la ligne de commande.
- Une fonction main
qui complète le fonctionnement du programme. Elle devra
notamment utiliser la classe Keyboard (ses méthodes readString et
isEOF) pour lire une à une des lignes entrées par
l'utilisateur (ou redirigée depuis un fichier, voir ci-dessous)
tant qu'on n'a pas atteint la fin du fichier (ou que l'utilisateur
appuie sur Control D, ce qui envoie le signal EOF End Of File
find-de-fichier). Après chaque lecture de ligne, le programme
code la ligne entrée selon la clé passée sur de la
ligne de commande, et affiche la ligne ainsi codée.
Vous pouvez dans un permier temps tester votre code en entrant des
lignes à la main (comme dans l'exemple d'utilisation ci-dessus).
Puis on vous demande d'utiliser les facilité de redirection
d'entrée-sortie des shell unix pour coder et décoder un
fichier complet:
- Copiez le fichier chaperon_rouge.txt depuis le compte démo vers votre répertoire de travail:
cp /u/dift1015/RessourcesJava/chaperon_rouge.txt .
- Vous pouvez visionner ce fichier en l'ouvrant par exemple avec emacs
- Vous pourriez coder ce fichier en appelant votre programme et en
retapant chaque ligne, mais il est bien plus pratique d'utiliser les
facilités de redirection: Pour voir afficher dans votre shell
une version codée du fichier vous pouvez faire:
java CodeSecret 2 5 3 7 < chaperon_rouge.txt
- Pour envoyer cette version codée dans un nouveau fichier, faites:
java CodeSecret 2 5 3 7 < chaperon_rouge.txt > chaperon_rouge_code.txt
Vous pouvez ouvrir ce nouveau fichier chaperon_rouge_code.txt avec emacs pour voir une version codée.
- Pour vérifier si votre programme est capable de
décoder ce fichier en utilisant la clé inverse,
faites:
java CodeSecret 7 3 5 2 < chaperon_rouge_code.txt > chaperon_rouge_decode.txt
Vous pouvez ouvrir avec emacs le fichier chaperon_rouge_decode.txt qui devrait être identique au fichier original.
On demande de faire la remise des fichiers CodeSecret.java chaperon_rouge_code.txt chaperon_rouge_decode.txt
Deuxième exercice: classes et animaux
Ecrire un fichier Animal.java dans lequel vous allez définir une classe Animal, avec les propriétés private suivantes:
- une chaîne de caractère indiquant l'espece d'animal (ex: chat, souris, serpent, ...)
- une chaîne de caractère indiquant la famille d'animal (mammifère, reptile, oiseau, poisson)
(remarque: on utilise ici le terme famille
de manière abusive et incorrecte, car dans la classification des
animaux, mammifère ou reptile correspondent à ce qu'on
appelle des "classes" d'animaux. Mais on a choisi ici le terme famille, pour ne pas créer de confusion avec la notion de classe des langages de programmation.)
- un entier npattes indiquant le nombre de pattes
Ecrivez pour cette classe les méthodes public suivantes:
- Un constructeur prenant en argument les propriétés de l'animal.
- Une méthode affiche qui affiche à l'écran les propriétés de l'animal sur une seule ligne sous la forme suivante: (ex.)
Espèce: chat, Famille: mammifère, Nombre de pattes: 4.
- Une méthode mammifere qui retourne un boolean valant true lorsque l'animal appartient à la famille des mammifères.
- Une méthode allaite qui retourne un boolean valant true si cet animal allaite ses petits (seuls les mammifères allaitent leurs petits).
Ecrivez un fichier ClasserAnimaux.java qui va contenir les méthodes suivantes:
- Une méthode statique qui va saisir les
propriétés d'un animal au clavier, et créer une
instance d'animal avec ces propriétés et la retourner.
Cette méthode aura la signature suivante:
Animal saisieAnimal()
- Une méthode statique afficheMammiferes
qui prend en argument un tableau de type Animal et qui affiche
seulement les animaux de la famille des mammifères. Cette
méthode aura la signature suivante:
void afficheMammifere(Animal[] animaux)
- Une méthode main qui
va demander à l'utilisateur combien d'animaux il veut entrer,
puis créer et remplir un tableau d'animaux de la taille
indiquée, en faisant appel à la méthode saisieAnimal(). Pour finir le programme affiche les mammiferes parmi les animaux saisis.
Exemple d'exécution du programme (les parties affihées par l'ordinateur sont en caractères de taille fixe, les parties entrées par l'utilisateur sont en italique):
java ClasserAnimaux
Combien d'animaux voulez-vous saisir?
4
Entrez l'animal 1:
Espèce?
chat
Famille?
mammifère
Nombre de pattes?
4
Entrez l'animal 2:
Espèce?
aigle
Famille?
oiseau
Nombre de pattes?
2
Entrez l'animal 3:
Espèce?
requin
Famille?
poisson
Nombre de pattes?
0
Entrez l'animal 4:
Espèce?
dauphin
Famille?
mammifère
Nombre de pattes?
0
Voici la liste des mammifères:
Espèce: chat, Famille: mammifère, Nombre de pattes: 4.
Espèce: dauphin, Famille: mammifère, Nombre de pattes: 0.