of 7

Module POA 2nde partie : Exercices

0 views
All materials on our website are shared by users. If you have any questions about copyright issues, please report us to resolve them. We are always happy to assist you.
Share
Description
Module POA 2nde partie : Exercices Exercices sur les exceptions, la généricité, le clonage et la sérialisation. Exo A : Méthodes génériques Écrire une méthode générique qui additionne les nombres d'une
Transcript
Module POA 2nde partie : Exercices Exercices sur les exceptions, la généricité, le clonage et la sérialisation. Exo A : Méthodes génériques Écrire une méthode générique qui additionne les nombres d'une liste et retourne la somme en format double. Écrire un programme de test : $ java SommeListeNombre somme = Écrire une méthode générique qui trie un tableau d'éléments quelconques (mais comparable). Écrire un programme de test sur un tableau de mots : $ java Tri voici est un test arguments tries : est test un voici L'algoritme de tri bulle est : pour i de tab.length- 1 à 0 pas - 1 faire pour j de 0 à i- 1 pas +1 faire si tab[j+1] tab[j]) alors temp = tab[j]; tab[j] = tab[j+1]; tab[j+1] = temp; finsi fait fait Exo B : Une classe Pile Fichier Pile1.java 2 public class Pile1 { 3 private ArrayList liste; 4 public Pile1() { 5 liste = new ArrayList(); 6 } 7 public Pile1(Collection collection) { 8 // suppose que collection!= null) 9 int taille = collection.size(); 10 liste = new ArrayList(taille); 11 int i=0; 12 for (Object element : collection) 13 liste.add(i++, element); 14 } 15 public void empiler(object element) { 16 liste.add(element); 17 } 18 public Object sommet() { 19 int taille = liste.size(); 20 if (taille == 0) 21 return null; 22 else 23 return liste.get(taille - 1); 24 } 25 public Object dépiler() { 26 int taille = liste.size(); 27 if (taille == 0) 28 return null; 29 else { 30 Object element = liste.get(taille - 1); 31 liste.remove(taille - 1); 32 return element; 33 } 34 } 35 public boolean estvide(){ 36 return (liste.size() == 0); 37 } 38 public String tostring() { 39 StringBuffer result = new StringBuffer( [[ ); 40 int max = liste.size() - 1; 41 for ( int i=0; i max; i++) 42 result.append(liste.get(i).tostring()+ , ); 43 if (max = 0) 44 result.append(liste.get(max).tostring()); 45 return result.tostring() + - ; 46 } 47 } Ce programme est assez mauvais et incomplet. 1. Proposer une meilleure solution Pile2.java qui prenne en compte les exceptions, en particulier lève des EmptyStackException, et qui soit générique pour avoir une pile de même type d'objet. 2. Modifier le programme UsePile1.java pour l'adapter à la meilleure solution Pile2.java $ java UsePile1 q(uitter), a(fficher), s(ommet), e(mpiler) mot, d(epiler), v(ide) a [[ ceci,est,une,pile,de,mots - s mots d a [[ ceci,est,une,pile,de - e string a [[ ceci,est,une,pile,de,string - q 2 public class UsePile1 { 3 public static void main(string args[]) { 4 Collection collection = Arrays.asList( ceci , est , une , pile , de , mots ); 5 Pile1 pile = new Pile1(collection); 6 System.out.println( q(uitter), a(fficher), s(ommet), e(mpiler) mot, d(epiler), v(ide) ); 7 Scanner sc = new Scanner(System.in); 8 String rep; 9 do { 10 rep = sc.next().trim(); 11 if (rep.equals( a )) 12 System.out.println(pile.toString()); 13 else if (rep.equals( s ) &&!estvide(pile)) { 14 String mot = (String) pile.sommet(); 15 System.out.println(mot); 16 } else if (rep.equals( v )) 17 System.out.println(pile.estVide()? vide : non vide ); 18 else if (rep.equals( d ) &&!estvide(pile)) 19 pile.depiler(); 20 else if (rep.equals( e )) { 21 rep = sc.next().trim(); 22 pile.empiler(rep); 23 rep = ; 24 } 25 } while (! rep.equals( q )) ; 26 } 27 } 3. Comment rendre Pile1 clonable en profondeur ? La solution se nommera Pile3.java 4. Comment rendre Pile2 T sérialisable? La solution se nommera Pile4.java 5. Rendre Pile4 T clonable en profondeur en utilisant la sérialisation dans une zone mémoire tampon utilisé comme un flot outputstream puis InputStream : ByteArrayOutputStream bout = new ByteArrayOutputStream();. ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray()); Exo C : Election : Piège à programmeur Fichier Vote1.java Exercices sur les threads 2 3 public class Vote1 { 4 public int scorenationalfraisedb = 0, scorenationalnabo = 0; 5 public static void main(string args[]) { 6 new Vote1(); 7 } 8 public Vote1() { 9 Thread commelec = new Thread(new CommissionElectorale()); 10 commelec.start(); 11 Thread bureau; 12 for (int i=0; i 5 ; i++) { 13 bureau = new Thread(new BureauDeVote()); 14 bureau.start(); 15 } 16 } 17 class BureauDeVote implements Runnable { 18 public void run() { 19 System.out.println( BureauDeVote thread = + Thread.currentThread().getName()); 20 // votation 21 try { 22 int scorefraisedb = 0, scorenabo = 0; 23 Thread.sleep((int)(Math.random()*5000)); 24 scorefraisedb = (int)(math.random()*1000); 25 scorenabo = (int)(math.random()*1000); 26 // transmettre à la commision électorale 27 scorenationalfraisedb += scorefraisedb ; 28 scorenationalnabo += scorenabo ; 29 /* System.out.println( BureauDeVote thread = + Thread.currentThread().getName() 30 + - résultats : scorefraisedb = + scorefraisedb + scorenabo = + scorenabo); */ 31 } catch (InterruptedException ie) { 32 System.out.println( interruption... thread = + Thread.currentThread().getName()); 33 } 34 } 35 } 36 class CommissionElectorale implements Runnable { 37 public void run() { 38 System.out.println( CommissionElectorale : attente des résultats ); 39 // attente 40 Scanner sc = new Scanner(System.in); 41 String rep; 42 do { 43 System.out.println( CommissionElectorale : résultats partiels 44 + - résultats : scorenationalfraisedb = + scorenationalfraisedb 45 + scorenationalnabo = + scorenationalnabo + /n continuer (o/n)? ) ; 46 rep = sc.nextline().trim(); 47 } while (rep.equals( o )) ; 48 // publication 49 System.out.println( CommissionElectorale : résultats finaux 50 + - résultats : scorenationalfraisedb = + scorenationalfraisedb 51 + scorenationalnabo = + scorenationalnabo); 52 } 53 } 54 } Le fichier permet à la commission électorale de rassembler les résultats des différents bureaux de vote et de publier les résultats définitifs. La solution programmée est une catastrophe : les variables partagées peuvent être manipulées conjointement par les différents threads, la commission électorale a une boucle d'attente active pour attendre les résultats et n'est même pas sure si c'est réellement fini. 1. Proposer une meilleure solution avec synchronized. 2. Proposer une meilleure solution avec AtomicNumber. 3. Proposer une solution sans attente active avec AtomicNumber et un synchonisateur barrière 4. Proposer une solution selon le pattern producteur-consommateur 5. Proposer une solution avec Future, Callable, Executor Exo D : un widget compte à rebours Dans l'exemple ci-dessous, on voudrait un décompte de 5 secondes après enfoncement du bouton ARMEMENT. Le décompte des secondes doit s'afficher. Au bout du décompte, l'action à faire est déclenchée : ici le message Mise à feu! Est affichée en console. Avant le décompte total, il doit être possible d'annuler. Malheureusement la solution programmée dans le fichier CompteARebours1.java ciaprès ne fonctionne pas. Le thread Event Dispatcheur de traitement graphique est monopolisé pendant les 5 secondes par le décompte!! Proposer une solution correcte. 1 import javax.swing.*; 2 import java.awt.event.*; 3 import java.awt.*; 4 5 public class CompteARebours1 extends JPanel implements ActionListener 6 { 7 private int secondes; 8 private Runnable afaire; 9 private boolean rebours; 10 private JButton boutonarmer; 11 private JLabel decompte; 12 private JButton boutonarret; public CompteARebours1(int secondes, Runnable afaire) { 15 super(new GridLayout(3,1)); 16 this.secondes = secondes; 17 this.afaire = afaire; 18 this.rebours = false; 19 boutonarmer = new JButton( ARMEMENT ); 20 boutonarmer.addactionlistener(this); 21 this.add(boutonarmer); 22 decompte = new JLabel( +secondes); 23 decompte.sethorizontaltextposition(swingconstants.center); 24 this.add(decompte); 25 boutonarret = new JButton( ANNULATION ); 26 boutonarret.addactionlistener(this); 27 boutonarret.setenabled(false); 28 this.add(boutonarret); 29 } public void actionperformed(actionevent ae) { 32 if (ae.getactioncommand().equals( armement )) { 33 this.rebours = true; 34 boutonarret.setenabled(true); 35 boutonarmer.setenabled(false); 36 decompte.setforeground(color.red); 37 try { 38 for (int i=this.secondes; rebours && (i 0) ; i- - ) { 39 Thread.sleep(1000); 40 decompte.settext( +i); 41 } 42 } catch (InterruptedException ie) { 43 } 44 if (rebours) { 45 decompte.settext( 0 ); 46 boutonarret.setenabled(false); 47 Thread tacheafaire = new Thread(aFaire); 48 tacheafaire.start(); 49 } 50 } else if (ae.getactioncommand().equals( annulation )) { 51 boutonarret.setenabled(false); 52 decompte.settext( annule ); 53 rebours = false; 54 } 55 } private static void createandshowgui() { 58 JFrame frame = new JFrame( Compte à Rebours ); 59 frame.setdefaultcloseoperation(jframe.exit_on_close); 60 Runnable affichemessage = new Runnable() { 61 public void run() { 62 System.out.println( mise a feu! ); 63 } 64 }; 65 CompteARebours1 newcontentpane = new CompteARebours1(5, affichemessage); 66 newcontentpane.setopaque(true); 67 frame.setcontentpane(newcontentpane); 68 frame.pack(); 69 frame.setvisible(true); 70 } public static void main(string[] args) { 73 javax.swing.swingutilities.invokelater(new Runnable() { 74 public void run() { 75 createandshowgui(); 76 } 77 }); 78 } 79 } Exo E : Mise en Cache La mise en cache permet d'optimiser les temps d'exécution. Par exemple : l'accès à des fichiers, la génération de fichier HTML via PHP, le calcul de fonctions Voici un fichier d'interface modélisant les taches à résultat réutilisable : 1 public interface TacheAResultatReutilisable T,R { 2 /* la tache à résultat réutilisable possède 3 une méthode calculer, coûteuse en temps d'exécution, 4 qui travaille sur des données de type T, 5 fournit des résultats de type R, et est interruptible. 6 */ 7 R calculer(t arguments) throws InterruptedException; 8 } Voici une classe implémentant l'interface : 1 public class CalculComplique implements TacheAResultatReutilisable Integer, Integer { 2 public Integer calculer(integer x) { 3 int y = x; 4 for (int i=0; i ; i++) 5 for (int j=0; j ; j++) 6 y += 5; 7 return y; 8 } 9 } Quand le calcul a été fait pour la valeur 1515, il suffit de mémoriser le résultat calculé pour le ressortir s'il est demandé une nouvelle fois. Voici une première implémentation CalculerEtCacher1.java : 2 public class CalculerEtCacher1 T,R implements TacheAResultatReutilisable T,R { 3 4 private final Map T,R cache = new HashMap T,R (); 5 private TacheAResultatReutilisable T,R matache = null; 6 public CalculerEtCacher1(TacheAResultatReutilisable T,R tache) { 7 this.matache = tache; 8 } 9 public synchronized R calculer(t arguments) throws InterruptedException { 10 R resultatprecedent = cache.get(arguments); 11 if (resultatprecedent!= null) 12 return resultatprecedent; 13 R resultat = matache.calculer(arguments); 14 cache.put(arguments, resultat); 15 return resultat; 16 } 17 } La solution programmée est une catastrophe : 1. pourquoi? 2. Proposer une meilleure solution en changeant un peu son code 3. Écrire un programme qui teste la solution sur CalculCompliqué. Le programme lira les nombres entiers produit au clavier par l'utilisateur tandis que 2 threads consommeront ces arguments en calculant selon CalculCompliqué ou en utilisant le cache. $ java TestTachesEtCache calcul(4) = calcul(3) = calcul(6) = calcul(7) = calcul(8) = calcul(3) = calcul(5) = calcul(9) = calcul(1) = calcul(5) = Critiquer la meilleure solution ci-dessus au point 2 et donnez les pistes de la solution définitive .
Related Search
We Need Your Support
Thank you for visiting our website and your interest in our free products and services. We are nonprofit website to share and download documents. To the running of this website, we need your help to support us.

Thanks to everyone for your continued support.

No, Thanks