Programmation avec Java : programmation

Transcription

Programmation avec Java : programmation
Programmation avec Java : programmation
objet (NFA032)
Samedi 2 février 2013
Aucun document n’est autorisé. Le barème est donné à titre indicatif.
Exercice 1 : exceptions
p u b l i c c l a s s Excep {
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) throws E1 , E2 , E3{
int x = 2 , y = 0;
try {
x = meth1 ( x ) ;
y = meth2 ( x ) ;
x = meth3 ( x ) ;
} c a t c h ( E1 e ) {
Terminal . e c r i r e S t r i n g l n ( ” catch 1” ) ;
x = meth2 ( 1 0 ) ;
}
}
p u b l i c s t a t i c i n t meth1 ( i n t a ) throws E1 , E2 , E3{
T e r m i n a l . e c r i r e S t r i n g l n ( ”M1 ” + a ) ;
i f ( a == 3 ) {
Terminal . e c r i r e S t r i n g l n ( ” throw 2” ) ;
throw new E2 ( ) ;
}
return a +1;
}
p u b l i c s t a t i c i n t meth2 ( i n t a ) throws E1 , E2 , E3{
T e r m i n a l . e c r i r e S t r i n g l n ( ”M2 ” + a ) ;
try {
i f ( a <= 3 ) {
Terminal . e c r i r e S t r i n g l n ( ” throw 1” ) ;
throw new E1 ( ) ;
}
a= meth3 ( a ) ;
return a ;
} c a t c h ( E2 e ) {
Terminal . e c r i r e S t r i n g l n ( ” catch 2” ) ;
return 0;
}
}
p u b l i c s t a t i c i n t meth3 ( i n t a ) throws E1 , E2 , E3{
T e r m i n a l . e c r i r e S t r i n g l n ( ”M3 ” + a ) ;
i f ( a >5){
Terminal . e c r i r e S t r i n g l n ( ” throw 3” ) ;
throw new E3 ( ) ;
1
}
r e t u r n meth1 ( a ) ;
}
}
c l a s s E1 e x t e n d s E x c e p t i o n {}
c l a s s E2 e x t e n d s E x c e p t i o n {}
c l a s s E3 e x t e n d s E x c e p t i o n {}
1. Qu’affiche l’exécution de ce programme ?
2. Les quatre méthodes déclarent toutes throws E1, E2, E3 alors que certaines d’entre elles ne
peuvent ni lever ni relayer certaines exceptions. Pour chacune des quatre méthodes, donnez la meilleure
déclaration d’exceptions possible.
Exerice 2 : matchs de foot
c l a s s Club {
S t r i n g nom ;
String ville ;
String sigle ;
Club ( S t r i n g n , S t r i n g v , S t r i n g s ) {
nom=n ; v i l l e =v ; s i g l e = s ;
}
}
p u b l i c c l a s s Match {
String score ;
Club eq1 , eq2 ;
Match ( Club e1 , Club e2 ) {
eq1 = e1 ; eq2 = e2 ;
}
void s e t S c o r e ( S t r i n g s ){
score =s ;
}
Club v a i n q u e u r ( ) {
throw new E r r o r ( ) ;
}
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {
Club c1 , c2 ;
Match m;
c1 = new Club ( ” P a r i s −S a i n t −Germain ” , ” P a r i s ” , ”PSG” ) ;
c2 = new Club ( ” Olympique L y o n n a i s ” , ” Lyon ” , ”OL” ) ;
m = new Match ( c1 , c2 ) ;
m. s e t S c o r e ( ”1−0” ) ;
}
}
Question 1
Représentez au moyen d’un petit dessin les objets du programme donné ci-dessus. Chaque objet sera
représenté par un rectangle et chaque référence par une flèche.
2
Question 2
Ecrivez la méthode vainqueur pour qu’elle renvoie le club vainqueur du match en analysant le score.
Le score doit être spécifié sous forme d’une chaı̂ne de caractère comprenant le nombre de but marqué par
chaque équipe séparé par un signe - (par exemple "1-0"). Une exception doit être levée si le score n’est
pas encore disponible.
Pour transformer une chaı̂ne en un nombre entier, on peut utiliser la méthode Integer.parseInt
qui prend en paramètre la chaı̂ne à convertir.
Question 3
Représenter le score par une chaı̂ne de caractère n’est pas pratique car certaines opérations (comme par
exemple déterminer le vainqueur) oblige à analyser le contenu de la chaı̂ne pour en extraire le nombre de
buts marqués par chaque buts.
Ecrivez une classe pour représenter les scores avec un constructeur, une méthode d’affichage du score,
une méthode qui renvoie l’information sur le vainqueur du match sous la forme d’un code entier, avec le
code suivant : 0 pour un match nul, 1 si la première équipe, celle qui joue à domicile, a gagné et 2 si ce sont
les visiteurs qui ont gagné.
Réécrire la classe Match pour utiliser la classe des scores pour représenter le score du match.
Question 4
On veut représenter des matchs de coupe où les matchs nuls ne sont pas possibles. Les scores peuvent
contenir la mention après prolongation et le nombre de tirs aux buts ayant départagé des équipes à égalité.
Par exemple, des scores peuvent être 3-2 après prolongation ou 1-1, 5 tirs au but à 4. Ecrivez une sousclasse de la classe des scores écrite à la question précédente pour représenter les scores des matchs de coupe.
Il faudra notamment réécrire la méthode qui détermine le vainqueur pour éventuellement tenir compte des
tirs au buts.
Exercice 3 : listes
En utilisant les classes de listes chaı̂nées vues en cours, répondez aux questions suivantes.
– donnez les déclarations de variables et les instructions nécessaires pour construire une liste contenant
dans cet ordre les nombres 17, 28, 5 et 1.
– écrivez une méthode qui remplace chaque nombre d’une liste par le double de ce nombre. Par exemple,
si la liste contient 2, 7, 3, 5, après application de la méthode, elle contiendra 4, 14, 6, 10. La liste doit
être passée en paramètre à la méthode.
– pour cette méthode, est-il possible de renvoyer la nouvelle valeur de la liste comme résultat de la
méthode ? Est-il possible que la méthode ne renvoie aucun résultat (déclarée avec le mot-clé void) ?
– écrivez une méthode qui prend en paramètre deux listes et en rend une troisième qui contient les
valeurs des deux listes avec alternativement une valeur de la première liste et une valeur de la seconde
liste. Si les listes sont de longueur différentes, l’alternance entre valeurs des deux listes est au début
de la nouvelle liste.
Par exemple, si les deux listes sont 2, 4, 6, 8, 10, 12 et 1, 3, 5 le résultat doit être 2, 1, 4, 3, 6, 5, 8, 10,
12.
3
Exercice 4 : fonction récursive
Un mot palindrome est un mot qui se lit de la même façon de droite à gauche et de gauche à droite. Par
exemple, été, radar ou ressasser sont des mots palindromes.
On vous demande de tester si une chaı̂ne de caractère contient un mot palindrome au moyen d’une
méthode récursive. Pour ce faire, on écrira deux méthodes, la première non récursive prend en paramètre la
chaı̂ne à tester et appelle la seconde méthode, récursive, qui a un paramètre de plus : l’indice du caractère
suivant à tester. Cette seconde méthode doit être récursive, c’est-à-dire contenir un appel à elle-même dans
son code.
Il faut tester que le premier caractère est égal au dernier, puis le second à l’avant-dernier, etc. On rappelle
que pour extraire le caractère numéro i d’une chaı̂ne s, on utilise la méthode charAt. L’appel s’écrit
s.charAt(i).
public s t a t i c boolean e s t P a l i n d r o m e ( S t r i n g s ){
return estPalindrome ( s , 0 ) ;
}
public s t a t i c boolean e s t P a l i n d r o m e ( S t r i n g s , i n t i ){
/ / a completer
}
Annexe : classes ListeIter et ElementListe
public class ElementListe {
private int valeur ;
private ElementListe suivant ;
public ElementListe ( int valeur , ElementListe suivant ) {
this . valeur = valeur ;
this . suivant = suivant ;
}
public ElementListe ( int v ) {
this . valeur = v ;
this . suivant = null ;
}
public int getValeur ( ) {
return v a l e u r ;
}
public void s e t V a l e u r ( i n t v a l e u r ) {
this . valeur = valeur ;
}
public ElementListe getSuivant ( ) {
return s u i v a n t ;
}
public void s e t S u i v a n t ( ElementListe s u i v a n t ) {
this . suivant = suivant ;
}
}
public class L i s t e I t e r {
ElementListe premier ;
4
public ElementListe getPremier ( ) {
return premier ;
}
public void ajouterAuDebut ( i n t v ) {
ElementListe ancienPremier= premier ;
p r e m i e r = new E l e m e n t L i s t e ( v , a n c i e n P r e m i e r ) ;
}
...
}
5