Vous êtes sur la page 1sur 7

Cours 420-ZF5-MO: Programmation structurée

Travail pratique #2

Pondération 10%

Date de remise : Avant le Dimanche 19 Mars 2023, à 23h55

Votre code ainsi que vos tests unitaires doivent être téléchargés dans votre dépôt GitLab (Push)
avant la date limite. Toutefois, vous devez laisser des traces de la progression de votre travail
dans Git en faisant des sauvegardes régulières (Commit). Vous devez, de plus, déposer vos fichiers
dans Col.net dans la section TP#2.

Barème de correction

Maximum Note obtenue

Exercice 1 (Tableaux 1D)

• Code Java et exécution 30

• Tests unitaires 15

• Documentation 0

Exercice 2 (Tableaux 2D)

• Code Java et exécution 30

• Tests unitaires 15

• Documentation 0

Général

• Utilisation de Git 10

• Bonus 5

Total 100

p. 1 Farida Ait-Ammar et Nicolas Leduc


Cours 420-ZF5-MO: Programmation structurée

Exercice 1 (Tableaux 1D)


L’objectif de cet exercice est de démontrer votre capacité à manipuler les tableaux à une
dimension (vecteurs) en Java. Pour ce faire, nous allons d’abord créer un vecteur contenant des
nombres entiers aléatoires. La taille du vecteur et la valeur maximale sont fournies par l’usager.
Ensuite, le vecteur sera séparé en deux vecteurs, soit un qui contient uniquement les nombres
pairs et l’autre, les nombres impairs. Chacun des vecteurs sera alors trié. Enfin, nous ferons la
fusion des deux vecteurs afin de retrouver le vecteur initial, qui sera maintenant trié. Il sera
ainsi possible de faire la recherche d’une valeur en utilisant la recherche binaire. La figure
suivante illustre les traitements à réaliser et indique les fonctions qui seront appelées.

17 8 23 19 3 2 7 4
extraitValeurs()
8 2 4 17 23 19 3 7
triSel()
2 4 8 3 7 17 19 23
fusionVec()
2 3 4 7 8 17 19 23
rechercheBin()

Dans le cadre de cet exercice nous considérons qu’il n’y a pas de vecteur null. Vous n’avez
donc pas à faire de vérification dans vos fonctions ou dans vos tests unitaires. Par contre, les
vecteurs pourraient avoir une taille de 0. Par conséquent, vos algorithmes doivent être en
mesure de traiter cette éventualité sans planter. On considère aussi que tous les vecteurs sont
remplis à pleine capacité, c’est-à-dire que le nombre d’éléments contenus est égal à la taille du
vecteur. Il n’est ainsi pas nécessaire d’avoir des variables contenant le nombre d’éléments, ce
qui simplifie les traitements et les appels de fonctions.

Fonctions à implémenter :
• public static int[] extraitValeurs(int[] vecNb, boolean pair)
o Permet d’extraire les valeurs paires (pair = true) ou impaires (pair =
false) du vecteur vecNb. Le vecteur que vous allez créer doit avoir une taille
égale au nombre de valeurs paires (ou impaires) contenues dans vecNb. Vous
devrez donc parcourir le vecNb à deux reprises : une première fois pour
compter le nombre de valeurs et une seconde, afin de copier les valeurs dans le
nouveau vecteur. La fonction retourne le nouveau vecteur créé.
o Vous devez écrire des tests unitaires pour cette méthode.
• public static void triSel(int[] vec)
o Tri le vecteur reçu en paramètre à l’aide de la méthode du tri par sélection, tel
que vu en classe. Le tri est effectué directement sur vec.
o Vous devez écrire des tests unitaires pour cette méthode.

p. 2 Farida Ait-Ammar et Nicolas Leduc


Cours 420-ZF5-MO: Programmation structurée
• public static int[] fusionVec(int[] vecA, int[] vecB)
o Produit un vecteur trié qui est le résultat de la fusion de vecA et vecB. Les
deux vecteurs reçus en paramètre doivent évidemment être triés. Vous devez
déclarer et initialiser un nouveau vecteur dont la taille sera égale à la somme
des tailles de vecA et vecB. Ce nouveau vecteur recevra le résultat de la
fusion et sera retourné à la fin de la fonction.
• public static int rechercheBin(int[] vec, int valeur)
o Une valeur sera demandée à l’usager et cette fonction sera ensuite appelée afin
de vérifier si la valeur (valeur) est présente dans le vecteur (vec) et à quel
endroit. La méthode de recherche à implanter est la recherche binaire, telle
que vue en classe. Si la valeur est introuvable, la fonction retourne -1, sinon elle
retourne sa position dans le vecteur.

NOTE : Le reste du code ne doit pas être modifié.

Exemple de trace d’exécution :


Entrez la valeur maximale : 25
Inscrivez le nombre de valeurs: 8
Vecteur initial: [17 ,8 ,23 ,19 ,3 ,2 ,7 ,4]
Vecteur pairs: [8 ,2 ,4]
Vecteur impairs: [17 ,23 ,19 ,3 ,7]

Apres le tri de chaque vecteur:


Vecteur pairs: [2 ,4 ,8]
Vecteur impairs: [3 ,7 ,17 ,19 ,23]

Fusion des vecteurs:[2 ,3 ,4 ,7 ,8 ,17 ,19 ,23]

Statistique des vecteurs (Min - Med - Max):


Vecteur pairs: 2 - 4 - 8
Vecteur impairs: 3 - 17 - 23
Fusion des vecteurs: 2 - 7.5 - 23

Quelle est la valeur recherchee? 19


Ga: 0 - Mi: 3 - Dr:7
Ga: 4 - Mi: 5 - Dr:7
Ga: 6 - Mi: 6 - Dr:7
La valeur recherchee se trouve en position 6

p. 3 Farida Ait-Ammar et Nicolas Leduc


Cours 420-ZF5-MO: Programmation structurée

Exercice 2 (Tableaux 2D)


Pour cet exercice, vous aurez à manipuler des calendriers qui sont stockés dans des tableaux en
deux dimensions. Chaque tableau contient autant de lignes qu’il y a de semaines dans le mois et
sept colonnes, soit une par jour de la semaine. La figure suivante montre le tableau
correspondant au mois de juillet 2009, qui s’étale sur 5 semaines :
[][0] [][1] [][2] [][3] [][4] [][5] [][6]
[0][] 0 0 0 1 2 3 4
[1][] 5 6 7 8 9 10 11
[2][] 12 13 14 15 16 17 18
[3][] 19 20 21 22 23 24 25
[4][] 26 27 28 29 30 31 0

Dans ce tableau, la colonne 0 correspond à dimanche, 1 à lundi, … et 6 à samedi. Les dates du


mois courant sont inscrites en dessous des jours de la semaine correspondants. Les cases
associées au mois suivant ou précédent contiennent la valeur 0. Dans cet exemple, les cases à
gauche de 1 contiennent des 0, car elles font partie du mois précédent, soit juin. On considère
enfin que les tableaux ne sont jamais null ou vides lors de l’appel des fonctions.

Fonctions à implémenter :

• public static void afficheMois(int[][] calMois)


o Méthode appelée lorsque l’usager choisit l’option ‘M’ du menu. Elle affiche le
calendrier courant (calMois) qui a été généré à l’aide de l’option ‘G’. On doit
afficher d’abord les jours de la semaine en utilisant deux caractères. Ils seront
suivis par une ligne de séparation. On affiche enfin les différentes dates
contenues dans le tableau calMois vis-à-vis les jours de la semaine associés.
Les valeurs 0 doivent être remplacées par des espaces blancs et ne doivent donc
pas apparaître. Un exemple d’affichage est donné dans la trace d’exécution.
• public static int nbSemaines(int[][] calMois)
o Cette méthode correspond à l’option ‘S’ du menu. Elle calcule et retourne le
nombre de semaines complètes contenues dans le tableau reçu en paramètre
(calMois). Attention, il ne s’agit pas uniquement de retourner le nombre de
lignes contenues dans le tableau. En effet, la première et la dernière ligne
peuvent contenir des semaines incomplètes. Une semaine est dite complète
lorsque son lundi et son vendredi font partie du mois courant. Dans notre
exemple, la première semaine n’est pas complète, car son lundi est en juin alors
que son vendredi est en juillet.
• public static int nbFinSemaines(int[][] calMois)
o En choisissant ‘F’ dans le menu, on indique à l’usager le nombre de fin de
semaines complètes. Cette méthode calcule et retourne donc le nombre de fins
de semaine complètes contenues dans le tableau reçu en paramètre
(calMois). Attention, il ne s’agit pas uniquement de retourner le nombre de

p. 4 Farida Ait-Ammar et Nicolas Leduc


Cours 420-ZF5-MO: Programmation structurée

lignes contenues dans le tableau. En effet, la première et la dernière ligne


peuvent contenir des fins de semaines incomplètes. Une fin de semaine est dite
complète lorsque son samedi, à la fin d’une ligne, et son dimanche, au début de
la ligne suivante, font partie du mois courant. Dans notre exemple, il y a quatre
fins de semaine complètes.
o Vous devez écrire des tests unitaires pour cette méthode.
• public static int trouveJour(int[][] calMois, int jour, int pos)
o L’option ‘R’ du menu permet de trouver la date du jour respectant les
spécifications fournies. On sait, par exemple, que la fête du travail a lieu le
premier lundi de septembre, alors que le changement d’heure avait lieu le
dernier dimanche d’octobre avant 2007. Pour obtenir ces dates, on passe le
calendrier du mois courant à la fonction (calMois). On doit indiquer aussi le
jour de la semaine sachant que dimanche vaut 0, lundi, 1 … et samedi vaut 6.
Enfin, on doit fournir la position relative du jour, soit une valeur positive pour le
premier (pos = 1), second (pos = 2), etc ou une valeur négative pour le
dernier (pos = -1), l’avant-dernier (pos = -2), etc. Dans notre exemple de
la fête du travail, jour = 1 et pos = 1, alors que pour le changement
d’heure, jour = 0 et pos = -1. Pour l’année 2009, on trouve
respectivement le 7 septembre et le 25 octobre.
o Vous devez écrire des tests unitaires pour cette méthode.
• BONUS: public static void afficheAnnee(int annee)
o Affiche le calendrier complet de l’année choisie lorsque l’option ‘A’ du menu est
sélectionnée. L’affichage se fait sur 3 « lignes » sur lesquelles sont affichés les
calendriers de 4 mois consécutifs. L’affichage attendu est fourni dans la trace
d’exécution sous forme de capture d’écran. Cette fonction doit créer 4 tableaux
contenant les 4 mois à afficher sur la même ligne. Elle doit ensuite afficher le
nom et l’année pour chaque mois. Enfin, elle transmet les 4 calendriers créés à
la fonction affiche4Mois qui s’occupera de faire l’affichage de la « ligne » de
calendriers.
• BONUS: public static void affiche4Mois(int[][] cal1,
int[][] cal2, int[][] cal3, int[][] cal4)
o Fonction qui affiche les 4 calendriers reçus en paramètre côte à côte, sur une
même « ligne ». Elle doit s’assurer d’afficher toutes les semaines de tous les
calendriers. Il faudra penser à afficher des espaces blancs dans l’éventualité où
certains mois contiendrait moins de semaines que d’autres.

NOTE : Le reste du code ne doit pas être modifié.

p. 5 Farida Ait-Ammar et Nicolas Leduc


Cours 420-ZF5-MO: Programmation structurée

Exemple de trace d’exécution :


MENU PRINCIPAL
----------------------------
G - Genere un mois
A - Affiche le calendrier annuel (BONUS)
Q - Quitter
--> Votre choix : G
Indiquez le numero du mois suivi de l'annee: 7 2009
----------------------------
MENU PRINCIPAL (7-2009)
----------------------------
G - Genere un mois
M - Affiche le mois genere
F - Indique le nombre de fin de semaines completes
S - Indique le nombre de semaines completes
R - Trouve la date d'un jour relatif
A - Affiche le calendrier annuel (BONUS)
Q - Quitter
--> Votre choix : M
Di Lu Ma Me Je Ve Sa
--------------------------
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
----------------------------
MENU PRINCIPAL (7-2009)
----------------------------
G - Genere un mois
M - Affiche le mois genere
F - Indique le nombre de fin de semaines completes
S - Indique le nombre de semaines completes
R - Trouve la date d'un jour relatif
A - Affiche le calendrier annuel (BONUS)
Q - Quitter
--> Votre choix : F
Nombre de fin de semaines : 4
----------------------------
MENU PRINCIPAL (7-2009)
----------------------------
G - Genere un mois
M - Affiche le mois genere
F - Indique le nombre de fin de semaines completes
S - Indique le nombre de semaines completes
R - Trouve la date d'un jour relatif
A - Affiche le calendrier annuel (BONUS)
Q - Quitter
--> Votre choix : S
Nombre de semaines : 4
----------------------------
MENU PRINCIPAL (7-2009)
----------------------------
G - Genere un mois
M - Affiche le mois genere
F - Indique le nombre de fin de semaines completes

p. 6 Farida Ait-Ammar et Nicolas Leduc


Cours 420-ZF5-MO: Programmation structurée
S - Indique le nombre de semaines completes
R - Trouve la date d'un jour relatif
A - Affiche le calendrier annuel (BONUS)
Q - Quitter
--> Votre choix : R
Indiquez le jour de la semaine
(0:dimanche, 1:lundi, ... 6:samedi) : 6
Indiquez la position relative du jour
(1:premier, 2:deuxieme, -1:dernier, etc) : -2
Le jour recherche est le 18
----------------------------
MENU PRINCIPAL (7-2009)
----------------------------
G - Genere un mois
M - Affiche le mois genere
F - Indique le nombre de fin de semaines completes
S - Indique le nombre de semaines completes
R - Trouve la date d'un jour relatif
A - Affiche le calendrier annuel (BONUS)
Q - Quitter
--> Votre choix : A
Indiquez l'annee voulue : 2009

----------------------------
MENU PRINCIPAL (7-2009)
----------------------------
G - Genere un mois
M - Affiche le mois genere
F - Indique le nombre de fin de semaines completes
S - Indique le nombre de semaines completes
R - Trouve la date d'un jour relatif
A - Affiche le calendrier annuel (BONUS)
Q - Quitter
--> Votre choix : Q
----------------------------
Au revoir!

p. 7 Farida Ait-Ammar et Nicolas Leduc

Vous aimerez peut-être aussi