IFIPS 3 ième année – Informatique Industrielle 2004-2005 – Solutions
Université de Paris Sud
Seule les solutions pour les deux permiers exercices sont données.
Solution de l’ex. 1 Opérations sur des Ensembles d’entiers naturels en local
Voici une solution possible :
class EnsNaturels {public static final int N_MAX = 100; // capacite de l’ensemble
public static final int CASE_LIBRE = -1; // constante marqueur d’une case libre private int donnees[]; // donnees de l’ensemble
private int nbElts; // nombre reel d’elts de l’ensemble public EnsNaturels() {
donnees = new int[N_MAX];
for(int i = 0; i < N_MAX; i++) donnees[i] = CASE_LIBRE;
nbElts = 0;
}
public boolean ajouter(int e) { int i = 0;
for(i = 0; i < N_MAX; i++)
if(donnees[i] == CASE_LIBRE) { donnees[i] = e;
nbElts++;
break;
}
if (i == N_MAX - 1) return false;
else
return true;
}
public boolean supprimer(int e) { int i = 0;
for(i = 0; i < N_MAX; i++) if(donnees[i] == e) {
donnees[i] = CASE_LIBRE;
nbElts--;
1
break;
}
if (i == N_MAX - 1) return false;
else
return true;
}
public int cardinal() { return nbElts;
}
public String toString() { String res = "{";
for(int i = 0; i < N_MAX; i++) if(donnees[i] != CASE_LIBRE)
res += donnees[i] + ", ";
res = res.substring(0, res.length()-2);
res += "}";
return res;
}
public boolean contient(int e) { for(int i = 0; i < N_MAX; i++)
if(donnees[i] == e) return true;
return false;
} }
public class EnsNaturelsMain {
public static void main(String args[]) { EnsNaturels ens = new EnsNaturels();
ens.ajouter(1);
ens.ajouter(45);
ens.ajouter(2);
ens.ajouter(20);
ens.ajouter(3);
ens.ajouter(10);
System.out.println(ens);
ens.supprimer(20);
ens.supprimer(10);
ens.supprimer(45);
System.out.println(ens);
} }
Solution de l’ex. 2 Variations sur des Ensembles d’entiers naturels en local
Voici une solution possible :
// Exceptionclass OperationImpossible extends Exception {
public OperationImpossible (String e) {
super("Operation impossible: "+e);
} }
// Classe avec tri et variante de gestion des ajouts et suppression class EnsNaturelsTri
{
public static final int N_MAX = 100;
public static final int CASE_LIBRE = -1;
private int donnees[];
private int nbElts;
// cree un ensemble vide de capacite N_MAX elts et l’initialis // (affecte chaque case de donnees a CASE_VIDE
public EnsNaturelsTri() {
donnees=new int[N_MAX];
nbElts=0;
}
// ajoute l’element e a l’ensemble
public void ajouter(int e) throws OperationImpossible {
if(nbElts>N_MAX-1)
throw new OperationImpossible("ajout dans un ensemble plein");
donnees[nbElts++]=e;
}
// supprime la 1ere occurence de l’element e de l’ensemble.
public void supprimer(int e) throws OperationImpossible {
boolean trouve = false;
for(int i=0; i<nbElts && !trouve; i++) if(donnees[i]==e) {
trouve = true;
for(int j=i; j<nbElts; j++) donnees[j]=donnees[j+1];
nbElts--;
}
if(nbElts==0)
throw new OperationImpossible("suppression dans un ensemble vide");
if(!trouve)
throw new OperationImpossible("suppression d’un élément non trouvé: "+e);
}
// renvoie le nombre d’elements dans l’ensemble public int cardinal()
{
return nbElts;
}
// renvoie une vue en String de l’ensemble au format // {e1, e2, eN}
public String toString() {
String out = new String("{");
for(int i=0; i<nbElts; i++) { out+=donnees[i];
if(i!=nbElts-1) out+=", ";
}
out+="}";
return out;
}
// renvoie true si l’ensemble contient l’element e public boolean contient(int e)
{
for(int i=0; i<nbElts; i++) if(donnees[i]==e)
return true;
return false;
}
// tri les éléments à l’aide de l’algorithme de tri par insertion public void trier()
{
int cle, i;
for(int j=2; j<nbElts; j++) { cle=donnees[j];
i=j-1;
while(i>0 && donnees[i]>cle) { donnees[i+1]=donnees[i];
i=i-1;
}
donnees[i+1]=cle;
} }
// renvoie l’intersection de this et de ens
public EnsNaturelsTri intersection(EnsNaturelsTri ens) {
EnsNaturelsTri res = new EnsNaturelsTri();
for(int i=0; i<nbElts; i++) for(int j=0; j<ens.nbElts; j++)
if(donnees[i]==ens.donnees[j]) try {
res.ajouter(donnees[i]);
} catch(OperationImpossible e) { }
return res;
}
// renvoie l’union de ens et de this
public EnsNaturelsTri union(EnsNaturelsTri ens) throws OperationImpossible {
EnsNaturelsTri res = new EnsNaturelsTri();
for(int i=0; i<nbElts; i++) res.ajouter(donnees[i]);
for(int j=0; j<ens.nbElts; j++) res.ajouter(ens.donnees[j]);
return res;
} }
// classe de test
public class EnsNaturelsTriMain {
public static void main(String[] args) { EnsNaturelsTri ens = new EnsNaturelsTri();
try {
ens.ajouter(1);
ens.ajouter(45);
ens.ajouter(2);
ens.ajouter(21);
ens.ajouter(3);
ens.ajouter(61);
} catch(OperationImpossible e) {}
System.out.println("Ensemble1 de départ: "+ens);
EnsNaturelsTri ens2 = new EnsNaturelsTri();
try {
ens2.ajouter(1);
ens2.ajouter(54);
ens2.ajouter(2);
ens2.ajouter(12);
ens2.ajouter(3);
ens2.ajouter(16);
} catch(OperationImpossible e) {}
System.out.println("Ensemble2 de départ: "+ens2);
System.out.println("Intersection des 2: "+ens.intersection(ens2));
try {
EnsNaturelsTri r = ens.union(ens2);
System.out.println("Union des 2: "+r);
r.trier();
System.out.println("Union des 2 triee: "+r);
} catch(OperationImpossible e) {
System.err.println("Union des 2 impossible: "+e);
} try {
ens.supprimer(21);
ens.supprimer(61);
ens.supprimer(45);
} catch(OperationImpossible e) {}
System.out.println("Ensemble1 avec éléments supprimés: "+ens);
} }