Opérations ensemblistes (1) [sr04] - Exercice Karine Zampieri, Stéphane Rivière Unisciel algoprog Version 18 janvier 2017 Table des matières 1 Opérations ensemblistes (1) / pgltens1 1.1 Opérations de base . . . . . . . . . . . 1.2 Affichage et saisie d’une liste . . . . . . 1.3 Recherche dans une liste non triée . . . 1.4 Intersection de deux listes non triées . 1.5 Fusion de deux listes . . . . . . . . . . 1.6 Union de deux listes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 Références générales . . . . . . . . . . . . . . . . . . . . . . . . 2 2 2 3 3 4 5 6 Java - Opérations ensemblistes (1) (Solution) Mots-Clés Structuration de l’information Requis Axiomatique impérative (sauf Fichiers) Difficulté • • ◦ (1 h 30) Objectif Cet exercice réalise les opérations ensemblistes (intersection, fusion, union), les ensembles étant représentés par des listes non triées d’entiers. 1 Unisciel algoprog – Opérations ensemblistes (1) [sr04], January 18, 2017 1 1.1 2 Opérations ensemblistes (1) / pgltens1 Opérations de base La liste sera représentée par une structure contenant un tableau mémorisant les valeurs de la liste et un entier mémorisant la taille effective de la liste. Dans tout l’exercice, on supposera que la taille du tableau est suffisamment grande pour les manipulations. Téléchargez le fichier suivant et mettez-le dans votre dossier. Java @[Liste.java] Soient la définition et les opérations de base d’une Liste : 1.2 Affichage et saisie d’une liste Écrivez une procédure afficherListe(lt) qui effectue l’affichage d’une Liste lt. Écrivez une procédure saisirListe(lt) qui effectue la saisie de valeurs dans une Liste lt terminée par une sentinelle. Validez vos procédures avec la solution. Solution Java @[UtilsLTOpers.java] static void afficherListe(Liste lt){ System.out.print("{"); if (!lt.listeVide()){ System.out.print(lt.evalElement(0)); for (int j = 1; j < lt.taille; ++j){ System.out.print(","+lt.evalElement(j)); } } System.out.println("}"); } static void saisirListe(Liste lt){ Scanner cin = new Scanner(System.in); System.out.print("Valeur de la sentinelle? "); int sentinelle = cin.nextInt(); lt.initialiserListe(); System.out.print("Valeur de l’element? "); int valeur = cin.nextInt(); while (valeur != sentinelle && lt.taille<Liste.MAXLIST-1){ lt.ajouterElement(valeur); System.out.print("Valeur de l’element? "); Unisciel algoprog – Opérations ensemblistes (1) [sr04], January 18, 2017 3 valeur = cin.nextInt(); } } 1.3 Recherche dans une liste non triée Écrivez une fonction positionElement(lt,valeur) qui recherche et renvoie la position la plus à gauche d’un élément valeur (entier) parmi les éléments d’une Liste lt, -1 sinon (cas où valeur n’est pas dans lt). Déduisez une fonction dansListe(lt,val) qui teste et renvoie Vrai si un élément de valeur val (entier) est dans une Liste lt, Faux sinon. Validez vos fonctions avec la solution. Solution Java @[UtilsLTOpers.java] static int positionElement(/*const*/ Liste lt, int val){ int nelems = lt.taille; int j = 0; while (j < nelems && lt.evalElement(j) != val){ j += 1; } return (j < nelems ? j : -1); } static boolean dansListe(/*const*/ Liste lt, int val){ return (positionElement(lt, val) != -1); } 1.4 Intersection de deux listes non triées Écrivez une procédure copierListe(a,b) qui recopie, élément par élément, une Liste a dans une Liste b. Aide simple Initialisez la Liste b puis traversez la Liste a et ajoutez l’élément courant de la Liste a dans la Liste b en appelant la procédure ajouterElement. Écrivez une procédure intersection(a,b,c) qui réalise l’intersection de deux Liste a et Liste b dans une Liste c. Unisciel algoprog – Opérations ensemblistes (1) [sr04], January 18, 2017 4 Aide méthodologique Initialisez la Liste c. Puis pour chacun des éléments de la Liste a, regardez s’il se trouve dans la Liste b. Dans l’affirmative, ajoutez cet élément dans la Liste c et supprimez cet élément de la Liste b. Au préalable, copiez la Liste b dans une Liste b0 afin de pouvoir supprimer les éléments. Validez vos fonctions et procédures avec la solution. Solution Java @[UtilsLTOpers.java] static void copierListe(/*const*/ Liste a, Liste b){ b.initialiserListe(); int nelems = a.taille; for (int j = 0; j < nelems; ++j){ b.ajouterElement(a.evalElement(j)); } } static void intersection(/*const*/ Liste a, /*const*/ Liste b, Liste c){ Liste b0 = new Liste(); b0.initialiserListe(); copierListe(b, b0); c.initialiserListe(); int nelems = a.taille; for (int j = 0; j < nelems; ++j){ int val = a.evalElement(j); int pos = positionElement(b0, val); if (pos != -1){ c.ajouterElement(val); val = b0.retirerKieme(pos); } } } Écrivez une procédure test_opers qui saisit deux Liste puis en réalise l’intersection et l’affiche. Testez. 1.5 Fusion de deux listes Écrivez une procédure fusionner(a,b) qui fusionne les éléments d’une Liste b dans une Liste a. A l’issue de la procédure, a contiendra tous les éléments de b et b sera vide. Dans le cas où tous les éléments n’auront pas pu être transférés (faute de place), les éléments resteront dans b (et b ne sera pas vide). Validez votre procédure avec la solution. Unisciel algoprog – Opérations ensemblistes (1) [sr04], January 18, 2017 Solution Java 5 @[UtilsLTOpers.java] static void fusionner(Liste a, Liste b){ while (!(a.listePleine() || b.listeVide())){ int valeur = b.retirerElement(); a.ajouterElement(valeur); } } 1.6 Union de deux listes Dans ce problème, on suppose qu’un élément n’apparait qu’une seule fois dans une liste. Écrivez une procédure unionListe(a,b,c) qui réalise l’union des Liste a et Liste b dans une Liste c. Orientation Utilisez la fonction dansListe du problème [Recherche et intersection]. Validez votre procédure avec la solution. Solution Java @[UtilsLTOpers.java] static void unionListe(/*const*/ Liste a,/*const*/ Liste b, Liste c){ copierListe(a, c); int nelems = b.taille; for (int j = 0; j < nelems; ++j){ int valeur = b.evalElement(j); if (!dansListe(a, valeur)){ c.ajouterElement(valeur); } } } Complétez votre procédure de test. Testez. Validez votre procédure avec la solution. Solution Java @[pgltens1.java] public static void main(String[] args) { Liste lt1 = new Liste(); Liste lt2 = new Liste(); UtilsLTOpers.saisirListe(lt1); UtilsLTOpers.afficherListe(lt1); Unisciel algoprog – Opérations ensemblistes (1) [sr04], January 18, 2017 UtilsLTOpers.saisirListe(lt2); UtilsLTOpers.afficherListe(lt2); Liste lt = new Liste(); UtilsLTOpers.intersection(lt1, lt2, lt); UtilsLTOpers.afficherListe(lt); } 2 Références générales Comprend [Chappelier-CPP1 :c7 :et2] 6