/* Manipulations sur un ensemble               */
/* de chaines de caracteres                    */

public class EnsembleDeChainesDeCaracteresEnConsole {

/////////////////////////////////////////////////

/* Type agrege de stockage d'un ensemble       */
/* d'au maximum 20 chaines de caracteres       */

  static class EnsembleDeChaines {
    final int MAX = 20;
    int n = 0;
    String [] s = new String[MAX]; };

/* Fonction d'affichage des chaines            */
/* de caracteres contenues dans un ensemble    */
/* de chaines de caracteres                    */
/* edc : L'EnsembleDeChaines à afficher        */

  static void affichage(EnsembleDeChaines edc) {
    int i;
    for ( i = 0 ; i < edc.n ; i = i+1 ) {
      Console.afficherln(edc.s[i]); }
  }

/* Fonction d'ajout d'une chaine de caracteres */
/* a un ensemble de chaines de caracteres      */
/* Retour de true si l'ajout a abouti          */
/* Retour de false si plus de place            */
/* edc : L'EnsembleDeChaines où l'ajout        */
/*     est effectué                            */
/* s : La chaine ajoutée                       */

  static boolean ajout(EnsembleDeChaines edc,String s) {
    boolean res;
    if ( edc.n < edc.MAX ) {
      edc.s[edc.n] = s;
      edc.n = edc.n+1;
      res = true; }
      else {
      res = false; }
    return res;
  }

/* Fonction de test de l'appartenance          */
/* d'une chaine de caracteres a un ensemble    */
/* de chaines de caracteres                    */
/* Retour de true si présent, false sinon      */
/* edc : L'EnsembleDeChaines où la recherche   */
/*       est effectuée                         */
/* s : La chaine recherchée                    */

  static boolean appartient(EnsembleDeChaines edc,String s) {
    boolean res = false;
    int i = 0;
    while ( ( res == false ) && ( i < edc.n ) ) {
      res = (edc.s[i] == s);
      i = i+1; }
    return res;
  }

/* Fonction de fusion de deux ensembles        */
/* de chaines de caracteres en un nouvel       */
/* ensemble de chaines de caracteres           */
/* Retour de true si la fusion est possible    */
/* Retour de false si la fusion est impossible */
/* car pas assez de place                      */
/* edc1 : Le premier EnsembleDeChaines         */
/* edc2 : Le second EnsembleDeChaines          */
/* edc : L'EnsembleDeChaines à remplir         */

  static boolean fusion(EnsembleDeChaines edc1,
                        EnsembleDeChaines edc2,
                        EnsembleDeChaines edc) {
    int i;
    boolean res;
    if ( edc1.n+edc2.n <= edc.MAX ) {
      edc.n = 0;
      for ( i = 0 ; i < edc1.n ; i = i+1 ) {
        ajout(edc,edc1.s[i]); }
      for ( i = 0 ; i < edc2.n ; i = i+1 ) {
        ajout(edc,edc2.s[i]); }
      res = true; }
      else {
      res = false; }
    return res;
  }

/* Fonction de retrait d'une chaine            */
/* de caracteres à un ensemble de chaines      */
/* de caracteres                               */
/* Retour de true si le retrait a abouti       */
/* Retour de false sinon                       */
/* edc : L'EnsembleDeChaines où le retrait     */
/*       est réalisé                           */
/* s : La chaine retirée                       */

  static boolean retrait(EnsembleDeChaines edc,String s) {
    boolean res = false;
    int i = 0;
    while ( ( res == false ) && ( i < edc.n ) ) {
      res = (edc.s[i] == s);
      i = i+1; }
    if ( res ) {
      for ( ; i < edc.n ; i = i+1 ) {
        edc.s[i-1] = edc.s[i]; }
      edc.n = edc.n-1; }
    return res;
  }

/* Fonction de test si un ensemble de chaines  */
/* de caracteres est vide                      */
/* Retour de true si c'est le cas, false sinon */
/* edc : L'EnsembleDeChaines testé             */

  static boolean estVide(EnsembleDeChaines edc) {
    return (edc.n == 0);
  }

/////////////////////////////////////////////////

/* Programme principal                         */

  public static void main(String [] args) {
    Console.setTitle("EnsembleDeChainesDeCaracteres");
    EnsembleDeChaines ec1 = new EnsembleDeChaines();
    EnsembleDeChaines ec2 = new EnsembleDeChaines();
    EnsembleDeChaines ec = new EnsembleDeChaines();
    Console.afficherln(appartient(ec1,"abc"));
    ajout(ec1,"abc");
    Console.afficherln(appartient(ec1,"abc"));
    Console.afficherln(appartient(ec1,"xyz"));
    Console.sautDeLigne();
    ajout(ec1,"123 456 789");
    affichage(ec1);
    Console.sautDeLigne();
    ajout(ec2,"azerty");
    affichage(ec1);
    Console.sautDeLigne();
    fusion(ec1,ec2,ec);
    affichage(ec);
    Console.sautDeLigne();
    Console.afficherln(retrait(ec,"123"));
    Console.afficherln(retrait(ec,"abc"));
    affichage(ec);
    Console.sautDeLigne();
    Console.afficherln(estVide(ec));
    retrait(ec,"123 456 789");
    retrait(ec,"azerty");
    Console.afficherln(estVide(ec));
  }
}