public class Personne {

    protected String nom;
    protected int age;

    protected java.util.Scanner input = new java.util.Scanner(System.in);

    public Personne(){}

    public Personne(Personne p) {
        this.nom = p.nom;
        this.age = p.age;
    }   

    public Personne(String unNom, int unAge) {
        this.nom = new String(unNom);
        this.age = unAge;
    }

    public String getNom() {
        return nom;
    }

    public int getAge() {
        return age;
    }

    /*
     * initialise interactivement la Personne courante 
     */
    public void init(){

        System.out.println("Entrez le nom de la personne : ");
        nom = input.nextLine();
        System.out.println("Entrez l'age de la personne : ");
        age = input.nextInt();
    }

    public String toString() {
        return "Nom : " + nom + " Age : " + age;
    }

    public boolean equals(Object o) {
        if (o instanceof Personne) { // vérifie si la variable référence une instance de Personne
            Personne p = (Personne) o; // transtypage
            return this.nom.equals(p.nom) && this.age == p.age; // Vérifie l'égalité des attributs
        }
        return false;
    }

}
public class Etudiant extends Personne {

    String numeroEtudiant;
    String fac;

    public Etudiant(){}

    public Etudiant(Etudiant e) {
        this.nom = e.nom;
        this.age = e.age;
        this.numeroEtudiant = e.numeroEtudiant;
        this.fac = e.fac;
    }

    public Etudiant(String unNom, int unAge, String numeroEtudiant, String uneFac) {
        this.nom = new String(unNom);
        this.age = unAge;
        this.numeroEtudiant = new String(numeroEtudiant);
        this.fac = new String(uneFac);
    }    

    public void setNumeroEtudiant(String numeroEtudiant) {
        this.numeroEtudiant = numeroEtudiant;
    }

    public void setFac(String fac) {
        this.fac = fac;
    }

    public String getNumeroEtudiant() {
        return numeroEtudiant;
    }

    public String getFac() {
        return fac;
    }

    public void init(){
        super.init();
        System.out.println("Entrez le numero étudiant : ");
        numeroEtudiant = input.nextLine();
        System.out.println("Entrez la fac : ");
        fac = input.nextLine();
    }

    public String toString(){
        return super.toString() + " Numero étudiant : " + numeroEtudiant + " Fac : " + fac;
    }

    public boolean equals(Object o){
        if (o instanceof Etudiant){
            Etudiant e = (Etudiant) o;
            return super.equals(o) && e.numeroEtudiant.equals(numeroEtudiant) && e.fac.equals(fac);
        }
        return false;
    }

}
public class Salarie extends Personne{
    
    String numeroSecu;
    String employeur;

    public Salarie(){}

    public Salarie(Salarie s) {
        super(s);
        this.numeroSecu = s.numeroSecu;
        this.employeur = s.employeur;
    }

    public Salarie(String unNom, int unAge, String numeroSecu, String employeur) {
        super(unNom, unAge);
        this.numeroSecu = new String(numeroSecu);
        this.employeur = new String(employeur);
    }

    public String getNumeroSecu() {
        return numeroSecu;
    }

    public String getEmployeur() {
        return employeur;
    }

    public void init(){
        super.init();
        System.out.println("Entrez le numero de securite sociale : ");
        numeroSecu = input.nextLine();
        System.out.println("Entrez l'employeur : ");
        employeur = input.nextLine();
    }

    public String toString() {
        return super.toString() + " Numero de securite sociale : " + numeroSecu + " Employeur : " + employeur;
    }

    public boolean equals(Object o) {
        if (o instanceof Salarie) {
            Salarie s = (Salarie) o;
            return super.equals(o) && this.numeroSecu.equals(s.numeroSecu) && this.employeur.equals(employeur);
        }
        return false;
    }

}
public class Main {
    
    public static void main(String[] args){
        Personne p1 = new Personne("toto", 20);
        Personne p2 = new Personne("titi", 22);
        System.out.println(p1);
        System.out.println(p2);
        
        // Personne p3 = new Personne();
        // p3.init();
        // System.out.println(p3);

        Salarie s1 = new Salarie("tata", 25, "123456789", "IBM");
        Salarie s2 = new Salarie("tutu", 27, "987654321", "Microsoft");
        System.out.println(s1);
        System.out.println(s2);

        // Salarie s3 = new Salarie();
        // s3.init();
        // System.out.println(s3);

        Personne p1b = new Personne(p1);
        System.out.println(p1.equals(p1b));
        System.out.println(p1.equals(p2));

        Salarie s1b = new Salarie(s1);
        System.out.println(s1.equals(s1b));
        System.out.println(s1.equals(s2));

        Etudiant e1 = new Etudiant("tete", 27, "12345349", "bm");
        Etudiant e1b = new Etudiant(e1);
        Etudiant e2 = new Etudiant();
        System.out.println(e1.equals(e1b));
        System.out.println(e1.equals(e2));
    }

}

import java.util.Arrays;

public class Club {

    protected static java.util.Scanner input = new java.util.Scanner(System.in);

    String nom;
    Personne[] adherents;

    /* Constructeurs */

    public Club(){};

    public Club(Club c) {
        this.nom = c.nom;
        this.adherents = c.adherents;
    }

    public Club(String nom, Personne[] adherents) {
        this.nom = nom;
        this.adherents = adherents;
    }

    

    /* Getters */

    public Personne[] getAdherents() {
        return adherents;
    }

    public String getNomClub() {
        return nom;
    }

    /* Setters */

    public void setAdherents(Personne[] adherents) {
        this.adherents = adherents;
    }

    public void setNomClub(String nom) {
        this.nom = nom;
    }

    /* Méthodes */

    public void init() {
        System.out.println("Entrez le nom du club : ");
        nom = input.nextLine();
        System.out.println("Entrez le nombre d'adhérents : ");
        int nb = input.nextInt();
        Personne[] tab = new Personne[nb];
        
        for (int i = 0; i < nb; i++) {
            System.out.println("1=Salarié ; 2=Étudiant ; 3=None");
            int choice = input.nextInt();
            switch(choice){
                case 1:
                    Salarie s = new Salarie();
                    s.init();
                    tab[i] = s;
                    break;
                case 2:
                    Etudiant e = new Etudiant();
                    e.init();
                    tab[i] = e;
                    break;
                default: // = 3
                    Personne p = new Personne();
                    p.init();
                    tab[i] = p;
            }
        }

        adherents = tab;

    }

    @Override
    public boolean equals(Object o){
        if (o instanceof Club){
            Club c = (Club) o;
            return this.nom.equals(c.nom) && Arrays.equals(c.adherents,this.adherents);
        }
        return false;
    }

    public String toString() {
        return "Nom du club : " + nom + " Adherents : " + Arrays.toString(adherents);
    }
    
}