Opérations ensemblistes (1) [sr04] - Exercice

publicité
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
Téléchargement