• Aucun résultat trouvé

À remettre, au plus tard, dimanche le 13 février 2005, avant la fermeture des laboratoires.

N/A
N/A
Protected

Academic year: 2022

Partager "À remettre, au plus tard, dimanche le 13 février 2005, avant la fermeture des laboratoires."

Copied!
1
0
0

Texte intégral

(1)

IFT1170 A-B-C-D-L-M

Java et ses applications Énoncé du TP #1

25 points Session d'automne 2004

Chargés de cours : L.V. Nguyen, Y. Kadri et M. Reid

Do you have advice for beginning computer science student?

- Keep things simple. Find real problems and solve them in the simplest possible way.

Most of all, have fun with everything you do and make sure everyone around you is having fun!

Radia Perlman ( Sun Microsystem)

Modalités :

À remettre, au plus tard, dimanche le 13 février 2005, avant la fermeture des laboratoires.

(Chaque jour de retard entraîne une pénalité de 5 points.) Le travail est corrigé sur

25 points

(25 % des travaux pratiques).

Les travaux se font seul ou en équipe de deux, au maximum.

(Vous ne remettez alors qu'un seul travail.) Remise des travaux :

Vous devez remettre vos travaux sur papier, ainsi que de façon électronique.

(Cette procédure vous sera expliquée par vos démonstrateurs.)

Pour la remise papier, imprimez vos codes sources, ainsi que les résultats de l'exécution de vos programmes (placés en commentaire à la suite de vos programmes), et attachez-les à une page de remise de travaux (disponible sur le site du cours).

Remettez ensuite vos travaux à vos démonstrateurs, à la réceptionniste du campus Longueuil, ou dans une des boîtes de remise à l'Université de Montréal (au S-118, sur le mur entre X-115 et X-117, près de la porte 2196 du pavillon André-Aisenstadt).

N'oubliez pas de bien identifier vos travaux, tant sur papier que dans votre programme.

Indiquez votre nom et nom d'usager dans l'entête dans chacun de vos programmes.

Si vous travaillez en équipe, pensez à indiquer les coordonnées des deux coéquipiers ! Dépannage :

 Consultez le site du cours régulièrement, il contient de nombreuses informations, mises à jour régulièrement, concernant les travaux et la matière du cours :

http://www.iro.umontreal.ca/~dift1170

 Profitez des périodes de travaux pratiques (démonstration), des périodes de pratique libre (P. L.) et des séances de révision (solution des devoirs, solution de quelques anciennes questions d’examens). Des auxiliaires pourront vous venir en aide dans la réalisation de vos travaux. Pour l’horaire, veuillez consulter le site Web de la DESI :

http://www.desi.umontreal.ca/cours/horaire/documents/labos_cour.pdf

 Faites appel à vos démonstrateurs, en écrivant à leur adresse de courriel :

dift1170@iro.umontreal.ca

(Indiquez le sigle et la section cours, ainsi que le numéro du travail dans le sujet de votre message.)

(2)

Consultez la FAQ (questions fréquemment posées) sur le site du cours.

Consultez la référence du langage Java offerte par Sun:

http://java.sun.com/j2se/1.4.2/docs/api/index.html

(3)

Numéro 1 (9 points)

Utilisation des fonctionnalités des classes String et Integer

Les informations stockées numériquement sont composées de bit (des 0 et des 1), mais ne sont pas traitées de la même façon d'un système à l'autre. Ainsi, lorsqu'on transmet du texte ou d'autres données d'un système à un autre (par courriel par exemple), on ne peut pas être certain que l'information pourra être traitée comme il faut si on n'utilise pas un encodage que tous les systèmes comprennent.

Dans la langue anglaise, 7 bits par caractère est généralement suffisant pour n'importe quel texte:

c'est la table des caractères ASCII. En français, on a des caractères accentués, donc on utilise la table ASCII étendue à 8 bits par caractère. En japonais ou chinois, par exemple, il y a des milliers de caractères (kanji), donc on a besoin d'encore plus de bits pour stocker les caractères (Unicode, 16 bits par caractère).

De plus, certains "caractères" ne sont pas imprimables. Par exemple, le caractère "retour à la ligne" ne s'imprime pas comme une lettre, et en plus, tous les systèmes ne traitent pas de la même manière le changement de ligne ('\n' sur UNIX vs '\r' sur Mac vs '\r'+'\n' sur DOS, etc.) Bref: on a besoin d'un encodage qui va nous assurer que les données seront transmissibles. De là est né l'encodage Base64. Vous allez réalisez un décodeur pour un encodage similaire au Base64.

Le concept de l'encodage est qu'on convertit les données stockées sur 8 bits en caractères imprimables stockés sur 6 bits (26 = 64, d'où le Base64).

Prenons un exemple très simple avec chaîne de caractères "Allo", dont la conversion se résume par le schéma suivant:

1. Chaque caractère étant exprimé sur 8 bits (en fait, en Java, les caractères sont Unicode, 16 bits, mais ceux que nous utiliserons, de la langue française, ne dépasseront pas 8 bits), la chaîne est d'abord convertie en binaire, sous la forme d'une chaîne de caractères composée de 0 et de 1. Pour se faire, on convertit chaque caractère (qui est en fait un entier) en binaire. (Voir String.charAt(int), Integer.toBinaryString(int).) Attention: si la valeur de l'entier à convertir est 3, par exemple, la chaîne résultante sera

"11", et non pas "00000011", on doit donc ajouter des zéros au début des chaînes, au besoin (en rouge sur la ligne du haut du schéma dans Word). (Voir String.length().)

2. Ensuite, on ajoute des zéros à la fin de la chaîne résultante, de telle sorte que le nombre de bit soit un multiple de 6 (en rouge sur la ligne du bas du schéma dans Word). (Voir

(4)

String.length().)

3. Ensuite, pour chaque sous chaîne de 6 caractères, on reconvertit en valeur numérique (Voir String.substring(int, int), Integer.parseInt(String, 2), le deuxième paramètre (2) spécifiant qu'on interprète une valeur numérique exprimée en base binaire.)

4. On ajoute 64 à cette valeur numérique, pour exclure les caractères spéciaux (0-31) (donc chaque caractère sera forcément entre 64 et 127).

5. Enfin, chacune des valeurs numériques, lorsque converties en caractères, pourront être imprimées correctement. (Dans le cas de la chaîne "Allo", on obtient la chaîne encodée

"PVql[p".) Notez que:

uneString += 'A'; équivaut à uneString += (char) 65;

Consignes

 Réalisez un programme en Java capable de décoder les chaînes suivantes et d'afficher le résultat à l'écran, en utilisant notamment les méthodes des classes String et Integer:

1. Pfee[gYe[gUeHFEuHFMo]WIsHDeFUCDqMs@`HP 2. RfEvXRAe]BAsYWL`XWAp[FecXWQi[vysK`

3. ZGQt\ChoKw]w]ryi\f|n]Vuo[gQrYVElKfMaKwydZVYtLSDwL@

(Faites attention lorsque vous copierez les chaînes dans votre code Java: il n'y a pas d'espaces, tous les caractères sont imprimables. De plus, vous devrez ajouter un '\' devant chaque '\', sans quoi Java va les interpréter comme des "escape characters" !) Exemple

Chaîne d'origine:

Pf}nZf}u\`

Chaque caractère en entier:

80 102 125 110 90 102 125 117 92 96

Chaque entier -64:

16 38 61 46 26 38 61 53 28 32

Chaque entier en binaire:

010000 100110 111101 101110 011010 100110 111101 110101 011100 100000

Regrouper en blocs de 8 bits (les zéros additionnels sont inutiles):

01000010 01101111 01101110 01101010 01101111 01110101 01110010 0000

Chaque bloc en entier:

66 111 110 106 111 117 114

Chaque entier en caractère (chaîne finale):

Bonjour

(5)

Critères de correction

Utilisation des classes prédéfinies String/Integer 3 points

Fonctionnement 4 points

Qualité, présentation, etc. 2 points

Numéro 2 (16 points)

Manipulation de tableaux d'objets (jeu simplifié de Poker)

Dans un jeu de cartes (en excluant des Jokers), il y a 52 cartes. Il s'agit en fait de quatre séries de 13 cartes. Les 13 cartes sont numérotées de 2 à 10, puis viennent ensuite le valet (Jack), la dame (Queen), le roi (King) et l'as (Ace). Les quatre séries de cartes sont le coeur ♥, le pique ♠, le trèfle ♣ et le carreau ♦.

Au poker, les différentes cartes du jeu ont une valeur propre. Dans l'ordre croissant, les forces des 13 cartes sont les suivantes: 2-3-4-5-6-7-8-9-10-J-Q-K-A. De plus, différentes combinaisons de ces cartes ont plus de valeur que d'autres. Dans l'ordre croissant, voici les forces des mains:

0. Aucune combinaison (high card): dans ce cas, la carte la plus forte de la main détermine la force de la main.

1. Paire: deux cartes de la même valeur (+ trois cartes quelconques).

Par exemple, A♥-A♠-??-??-?? est la plus forte paire.

2. Double paire: deux paires (+ une carte quelconque).

Par exemple, A♥-A♠-K♥-K♠-??

3. Brelan (three of a kind): trois cartes de la même valeur (+ deux cartes quelconques).

Par exemple, A♥-A♣-A♠-??-?? est le plus fort brelan.

4. Quinte (straight): cinq cartes de valeur consécutive, mais pas de la même série.

Par exemple, A♠-K♦-Q♥-J♣-10♠ est la plus forte straight.

5. Couleur (flush): cinq cartes de la même série.

Par exemple, A♥-K♥-Q♥-J♥-9♥ est la plus forte flush.

(c’est bien le 9 : si 10 c’est le cas de Quinte royale décrite en bas) 6. Main pleine (full house): une paire et un brelan.

Par exemple, A♥-A♠-A♣-K♥-K♠ est la plus forte main pleine.

7. Carré (four of a kind): quatre cartes de la même valeur (+ une carte quelconque).

Par exemple, A♥-A♠-A♣-A♦-?? est le plus fort carré.

8. Quinte flush (straight flush): quinte dont toutes les cartes sont de la même série, mais dont la carte la plus forte est inférieure à l'as.

Par exemple: K♥-Q♥-J♥-10♥-9♥ est la plus forte quinte flush

9. Quinte royale (royal flush): quinte dont toutes les cartes sont de la même série et dont la carte la plus forte est l'as.

Par exemple: A♥-K♥-Q♥-J♥-10♥.

Consignes

 Réalisez la classe Carte, qui possède les membres suivants:

 Un entier pour la valeur de la carte (2 à 14).

(6)

 Un entier pour la série de la carte (1 à 4).

 Un constructeur qui reçoit la valeur et la série de la carte à construire.

 Des méthodes d'accès (get) pour obtenir la valeur et série de la carte.

 Une méthode pour afficher les informations de la carte. Assurez-vous que As de coeur correspond à new Carte(14, 1), deux de pique correspond à new Carte(2, 2), valet de carreau correspond à new Carte(11, 4), ...

 Réalisez la classe Jeu, pour une main de poker, qui possède les membres suivants:

 Un tableau pouvant contenir cinq Cartes.

 Un constructeur Jeu(Carte, Carte, Carte, Carte, Carte) qui reçoit les cinq cartes du jeu.

 Une méthode int force() qui détermine et retourne la force du jeu, un entier entre 0 et 9.

Pour simplifier (grandement) le programme, la force du jeu ne va être qu'une valeur entre 0 (aucune combinaison) et 9 (quinte royale), donnée par la liste ci haut, sans tenir compte de la force des cartes qui forment le jeu. Par exemple, un brelan de 2 aura la même force qu'un brelan de 10, c'est à dire 3.

 Une méthode pour afficher les informations sur le Jeu. La méthode va afficher les cartes qui composent le jeu, puis donner sa force. Par exemple:

"2S, 4H, 5C, 3D, 6H - Quinte"

 Autant de méthodes privées (private) que vous voulez pour effectuer le calcul nécessaire. (Par exemple, des méthodes boolean paire(), boolean brelan(), etc., qui retourne si cette combinaison est présente dans le jeu.)

1. Dans une autre classe ayant la méthode main (par exemple, une classe Poker), construisez deux Jeux avec 10 cartes différentes tirées au hasard. (Voir Math.random().) Pour se faire, une bonne façon de faire est de construire un paquet de 52 cartes (un tableau de Cartes), de mélanger les cartes, puis de prendre les 10 premières cartes du paquet pour construire les deux jeux.

2. Affichez les deux jeux et affichez lequel est le plus fort, ou s'ils sont égaux.

3. Répétez cette opération dans une boucle quelques fois, pour permettre d'observer plusieurs jeux différents.

Un petit coup de pouce...

La partie la plus complexe du travail et de déterminer la force d'un jeu. Pourtant, si vous décomposez cette tâche, le travail sera grandement simplifié. Une bonne méthode est de

premièrement construire un tableau des occurrences de chaque valeur. Le tableau obtenu pour un jeu ayant une main pleine ressemblerait donc à ceci:

[ 0, 0, 0, 0, 0, 3, 0, 0, 0, 2, 0, 0, 0 ]

( pas de 2, pas de 3, …, pas de 6, 3 fois 7, pas de 8, …, 2 fois J, etc….).

Il est simple, en parcourant ce tableau, d'identifier le brelan de 7 et la paire de valets.

(7)

Notez: une autre classe avec méthode main sera utilisée par les correcteurs pour tester

explicitement les différentes combinaisons possibles. Assurez-vous donc que le constructeur et la méthode void force() de la classe Jeu ont la bonne syntaxe !

Critères de correction

Encapsulation (champs, constructeurs, méthodes) 5 points Fonctionnement (affichages et résultats exacts) 9 points

Qualité, présentation, etc. 2 points

Remise électronique du TP1:

 Allez dans votre dossier Documents personnels (disque réseau R) situé sur le bureau et créer le dossier remise-tp1 (faites bien attention de ne pas mettre de majuscules ou d’espaces blancs dans le nom du dossier).

 Déposez vos programmes dans ce nouveau dossier. Vérifiez que les noms de vos fichiers ne contiennent ni accents, ni espaces blancs, ni caractères spéciaux (autrement dit, les noms ne contiennent que des lettres et/ou des chiffres).

 Double-cliquez sur l’icône Branchement sur UNIX situé dans le dossier

« Raccoursis DESI »sur le bureau. Branchez-vous sur Unix; c’est-à-dire entrez votre nom d’usager et votre mot de passe Unix. À l’incitation, tapez la commande:

remise ift1170 tp1 remise-tp1/*

Faites bien attention de respecter les majuscules et les minuscules !

À tout moment, vous pouvez vérifier quels fichiers vous avez remis en tapant la commande:

remise -v ift1170 tp1

La liste des fichiers remis sera alors affichée. Si tout c’est bien passé, tapez

"exit", puis fermez la fenêtre de Telnet.

La remise électronique prend note du jour de la remise; les T.P. peuvent donc être remis en retard (avec pénalité).

Vous pouvez faire une remise électronique autant de fois que vous le voulez, mais respectez la règle suivante: remettez toujours votre T.P. du même compte.

Chaque nouveau fichier remis écrase le fichier du même nom remis auparavant;

seule la dernière version sera alors conservée et corrigée.

La correction des travaux :

(8)

Suite à une recommandation de la direction de la DESI et du DIRO, la qualité de l'algorithme et de la programmation occupent une place importante dans

l'évaluation d'un travail. Un programme qui fonctionne est bien mais insuffisant pour mériter une meilleure note!

Veuillez consulter les critères de correction de chacun des numéros d'un travail.

Bon travail ! -- L'équipe du IFT1170

Références

Documents relatifs

1) La formation que l’étudiant souhaite suivre dans le cadre de sa 5ème année ne doit pas être proposée dans son IEP d’origine. 2) L’étudiant doit obtenir au

En vous souhaitant une bonne réception de ce document important pour la poursuite des études de votre enfant et en vous demandant de nous faire parvenir avant le 21 avril le talon

Vous disposez du fichier pays.cpp , contenant entre autres l'ébauche d'une classe contenant les informations d'un pays et une fonction pour lire et remplir un tableau d'objets

Vous disposez du fichier pays.cpp , contenant entre autres l'ébauche d'une classe contenant les informations d'un pays et une fonction pour lire et remplir un tableau d'objets

Numéro 1 (20 points) Tableaux d'objets, StringTokenizer, tri par sélection, toString() Vous disposez de deux fichiers de données en format texte ( .txt ) contenant les informations

Notez: vous utilisez la classe que vous avez réalisé au travail pratique no.2 comme classe de base, mais un fichier Dictionnaire.java contenant une version parfaitement

Ce premier numéro vous donne l'occasion de vous familiariser avec le C#, un langage de programmation orientée (tout) objet. Réalisez un programme en C# permettant de :.. 1) saisir

3. de compter, de transmettre des résultats via pointeurs puis les afficher : a) le nombre d’étudiants de la section ‘A‘ dont le final dépasse 80.0 le nombre d’étudiants