diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..8a9c163 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "Espace Formateur"] + path = Espace Formateur + url = git@github.com:Alex-Octocorn/Java-POO_Formateur.git diff --git a/Espace Formateur b/Espace Formateur new file mode 160000 index 0000000..fbe7787 --- /dev/null +++ b/Espace Formateur @@ -0,0 +1 @@ +Subproject commit fbe7787172081838cd98582b131ae5815a3d6b7d diff --git a/README.md b/README.md index 6af847b..67a2c0f 100644 --- a/README.md +++ b/README.md @@ -10,20 +10,25 @@ Nous aborderons les différents concepts, les bonnes pratiques de développement ## Plan de cours 🗺️ - - [x] [Introduction](./cours/00_introduction.slides.md) - Qu'est-ce que la programmation orientée objet ? - Pourquoi utiliser la POO ? - Introduction aux piliers de la POO - Présentation générale de Java - Installation de l'environnement de développement -- [ ] [Les bases](./cours/01_bases.slides.md) +- [x] [Les bases](./cours/01_bases.slides.md) - Les variables - Les opérateurs - Les conditions - Les boucles - Les tableaux - Les fonctions + - Classes et objets +- [ ] [Aller plus loin](./cours/02_avance.slides.md) + - Exceptions + - Lambda + - Threads + - Généricité - [ ] [Encapsulation](./cours/02_encapsulation.slides.md) - Définition - Les accesseurs @@ -44,19 +49,6 @@ Nous aborderons les différents concepts, les bonnes pratiques de développement - Utilisation - Override - Overload -- [ ] [Exceptions](./cours/06_exceptions.slides.md) - - Définition - - Arborescence - - Utilisation -- [ ] [Lambda](./cours/07_lambda.slides.md) - - Définition - - Utilisation -- [ ] [Threads](./cours/08_threads.slides.md) - - Définition - - Utilisation -- [ ] [Généricité](./cours/10_genericite.slides.md) - - Définition - - Utilisation ## Suivre ce cours 📚 @@ -74,7 +66,8 @@ Vous aurez alors accès à une animation du cours, de démonstrations et de la c Vous retrouverez les exercices dans le dossier `./exercices`. -Pour chaque exercice, vous retrouverez trois niveaux de difficulté : +Pour chaque exercice, vous retrouverez trois niveaux de difficulté : + - Coq : Version avancée de l'exercice, avec très peu d'indications - Poulet : Version "classique", avec quelques indices - Poussin : Version "guidée", avec rappels des notions importantes et indices supplémentaires @@ -83,7 +76,8 @@ Pour chaque exercice, vous retrouverez trois niveaux de difficulté : ## Contribuer 🤝 -Vous pouvez contribuer à l'amélioration de ce cours en créant une *pull request* ou en remontant un problème dans la section "Issues" du dépôt. +Vous pouvez contribuer à l'amélioration de ce cours en créant une *pull request* ou en remontant un problème dans la +section "Issues" du dépôt. Rendez-vous sur le [guide de contribution](./CONTRIBUTING.md) pour plus d'informations ! ## Soutenir 🫶 diff --git a/cours/01_introduction.slides.md b/cours/01_introduction.slides.md index fb9fa77..6a84c60 100644 --- a/cours/01_introduction.slides.md +++ b/cours/01_introduction.slides.md @@ -11,7 +11,9 @@ sources: # POO -![Logo Java](./assets/java.png) +![Logo Java](./assets/java.png) + +![IntelliJ](assets/intellij.png) ---- @@ -160,7 +162,9 @@ Nous aborderons ces concepts en détail dans les prochains chapitres ! # Java POO - Introduction -![Logo Java](./assets/java.png) +![Logo Java](./assets/java.png) + +![IntelliJ](assets/intellij.png) ---- diff --git a/cours/02_bases.slides.md b/cours/02_bases.slides.md index 65433ba..7eead37 100644 --- a/cours/02_bases.slides.md +++ b/cours/02_bases.slides.md @@ -17,3 +17,1242 @@ sources: ---- +## Java +### Hello World + +Créez un nouveau projet Java **IntelliJ** : +- File > New > Project > New Project +- Sélectionnez l'archétype **Maven** +- Dans les options avancées, ajoutez votre nom de domaine inversé (ex: `fr.octocorn`) +- Laissez coché "Generate Sample Code" + +---- + +## Java +### Hello World + +Le projet a automatiquement été créé avec la structure suivante : + +``` +└───src # Racine du code source + ├───main # Code source principal + │ ├───java # Code source Java + │ │ └───fr # Dossier contenant le nom de domaine inversé + │ │ └───octocorn # On parle de package + │ │ Main.java # Fichier contenant la classe Main + │ │ + │ └───resources # Code source non Java + └───test # Code source de tests +``` + +---- + +## Java +### Hello World + +La classe `Main` est la classe principale du programme. +Elle contient la méthode `main` qui est la méthode principale du programme. + +```java +public class Main { + public static void main(String[] args) { + System.out.println("Hello World!"); + } +} +``` + +> `System.out.println` permet d'afficher du texte dans la console + +---- + +## Java +### Hello World + +Pour exécuter le programme en ligne de commande : + +```shell +java src/main/java/fr/octocorn/Main.java +``` + +> Vous pouvez aussi utiliser le bouton "Run" dans IntelliJ ! + +---- + +## Java +### JavaDoc + +> Quelle est la différence entre un commentaire et une documentation ? + +---- + +## Java +### JavaDoc + +La documentation est un commentaire **structuré** et **formaté**. + +```java +/** + * Cette classe représente une personne + */ +public class Personne { + // Code ... +} +``` + +> Elle peut être lue depuis n'importe où en passant la souris sur le code ! + +---- + +## Java +### JavaDoc + +La documentation peut être **formatée** avec des balises HTML. + +```java +/** + * Cette classe représente une personne + *

+ * Une personne est caractérisée par son nom et son prénom + *

+ */ +public class Personne { + // Code ... +} +``` + +---- + +## Java +### Commentaire + +Le commentaire est un texte **libre**. + +```java +// Cette classe représente une personne +public class Personne { + // Code ... +} +``` + +- Elle ne peut pas être formatée +- Elle ne peut pas être lue depuis n'importe où + +---- + +## Java +### Commentaire + +Le commentaire peut être **multi-lignes**. + +```java +/* + * Cette classe représente une personne + */ +public class Personne { + // Code ... +} +``` + +---- + +## Java +### Commentaire ou doc ? + +- **Commentaire** : Pour expliquer le code +- **Documentation** : Pour décrire le code + +> En théorie, il ne devrait pas y avoir de commentaire dans le code si le code est bien écrit ! + +---- + +## Java +### DOCUMENTEZ ! + +Si en théorie, un code bien écrit n'a pas besoin de documentation : +- La documentation est **obligatoire** pour les classes et les méthodes publiques +- La documentation est **fortement recommandée** pour les classes et les méthodes privées + +> Bonne pratique ! 🤓 + +--- + +## Variables + +![Logo Java](./assets/java.png) + +![IntelliJ](assets/intellij.png) + +---- + +## Variables +### Définition + +Une variable est une **zone mémoire** dans laquelle on peut stocker une **valeur**. + +```java +int age = 18; +``` + +- `int` est le **type** de la variable +- `age` est le **nom** de la variable +- `18` est la **valeur** de la variable + +> Une variable est une **référence** vers une valeur + +---- + +## Variables +### Définition + +- Elle est stockée dans la **mémoire vive** de l'ordinateur +- Sa taille est allouée dynamiquement en fonction de son type +- Elle peut être modifiée à tout moment +- Elle peut être **référencée** par son nom + +---- + +## Variables +### Nommage + +- Bien nommer ses variables est **très important** +- Utilisez des noms **significatifs** et **compréhensibles** +- Pas d'**acrônyme** ou d'**abréviation** (sauf si connu de tous) +- Ils sont déclarés en **camelCase** + +> Vous ne codez pas pour vous, mais pour les autres ! + +---- + +## Constantes +### Définition + +- Une constante est une variable dont la valeur ne peut pas être modifiée +- Elle est déclarée avec le mot clé `final` + +```java +final int AGE_LIMITE = 18; +``` + +> Les constantes sont déclarées en **majuscules** + +---- + +## Variables +### Types numériques + +- En java, les types sont précisés **avant** le nom de la variable +- Il existe plusieurs types numériques : + - `byte` : 8 bits + - `short` : 16 bits + - `int` : 32 bits + - `long` : 64 bits + - `float` : 32 bits (virgule flottante) + - `double` : 64 bits (virgule flottante) + +---- + +## Variables +### Types booléens + +- `boolean` : Vrai ou faux (1 bit) + +```java +boolean estVrai = true; +boolean estFaux = false; +``` + +---- + +## Variables +### Types caractères + +- `char` : Caractère unique (16 bits) +- `String` : Chaine de caractères (tableau de `char`) + +```java +char lettre = 'a'; +String mot = "Bonjour"; +``` + +> Les `String` se déclarent avec `""` ! + +---- + +## Variables +### String + +> Pourquoi `String` et pas `string` ? + +---- + +## Variables +### String + +- `String` est une **classe** et non un **type primitif** +- Les classes commencent par une **majuscule** +- Il s'agit d'un tableau de `char`, livré avec des méthodes + +---- + +## Types +### Types primitifs VS Classes + +- Les types primitifs sont **plus rapides** à manipuler +- Les classes sont **plus pratiques** à manipuler +- Elles ajoutent des **méthodes** et des **fonctionnalités** + +> Les classes sont des **wrappers** des types primitifs + +--- + +## Opérateurs + +![Logo Java](./assets/java.png) + +![IntelliJ](assets/intellij.png) + +---- + +## Opérateurs +### Définition + +Un opérateur est un **symbole** qui permet d'effectuer une **opération** sur des variables. + +```java +int a = 1; +int b = 2; +int c = a + b; +``` + +- `+` est l'**opérateur d'addition** +- `a` et `b` sont les **opérandes** +- `c` est le **résultat** de l'opération + +---- + +## Opérateurs +### Opérateurs arithmétiques + +- `+` : Addition +- `-` : Soustraction +- `*` : Multiplication +- `/` : Division +- `%` : Modulo (reste de la division) + +> Les opérateurs arithmétiques ne fonctionnent qu'avec des nombres ! + +---- + +## Opérateurs +### Opérateurs de comparaison + +- `==` : Egalité +- `!=` : Différence +- `>` : Supérieur +- `<` : Inférieur +- `>=` : Supérieur ou égal +- `<=` : Inférieur ou égal + +> Les opérateurs de comparaison renvoient un booléen ! + +---- + +## Opérateurs +### Opérateurs logiques + +- `&&` : ET (Conjonction) +- `||` : OU (Disjonction) +- `!` : NON (Négation) + +---- + +## Opérateurs +### Opérateurs d'incrémentation + +- `++` : Incrémentation +- `--` : Décrémentation + +```java +int a = 1; +a++; // a = a + 1 +a--; // a = a - 1 +``` + +> Peut être placé avant ou après la variable + +---- + +## Opérateurs +### Concaténation + +- `+` : Concaténation +- Equivalent : Méthode `concat` de la classe `String + +```java +String a = "Hello"; +String b = "World"; +String c = a + " " + b; // "Hello World" +``` + +> La concaténation ne fonctionne qu'avec des `String` ! + +---- + +## Opérateurs +### Opérateurs d'affectation + +- `=` : Affectation +- `+=` : Affectation avec addition +- `-=` : Affectation avec soustraction +- `*=` : Affectation avec multiplication + +---- + +## Opérateurs +### Opérateurs ternaires + +- `? :` : Opérateur ternaire +- Comparable à un `if` / `else` + +```java +int a = 1; +int b = 2; +int c = a > b ? a : b; // c = b +``` + +> Eviter de l'utiliser, préférer un `if` / `else` ! + +--- + +## Conditions et boucles + +![Logo Java](./assets/java.png) + +![IntelliJ](assets/intellij.png) + +---- + +## Conditions +### Définition + +Une condition est une **instruction** qui permet d'effectuer une **action** en fonction d'une **condition**. + +```java +int a = 1; +int b = 2; +if (a > b) { + System.out.println("a est supérieur à b"); +} else { + System.out.println("a est inférieur ou égal à b"); +} +``` + +> `if` signifie "si" en anglais + +---- + +## Boucles +### for + +Une boucle est une **instruction** qui permet d'effectuer une **action** plusieurs fois. + +```java +for (int i = 0; i < 10; i++) { + System.out.println(i); +} +``` + +> Variable `i` : bien ou pas bien ? + +Note: Pas bien ! 😱 + +---- + +## Boucles +### for + +- Bien que très utilisé, la variable `i` n'est pas très parlante +- Il est préférable d'utiliser une variable plus parlante + +```java +for (int index = 0; index < 10; index++) { + System.out.println(index); +} +``` + +> Ca coute rien et c'est plus clair ! + +---- + +## Boucles +### for : les dérives + +- Il est possible de stocker des boucles dans des boucles +- Les dérives connues consistent à nommer les index `i`, `j`, `k`, `l`, ... + +```java +for (int i = 0; i < 10; i++) { + for (int j = 0; j < 10; j++) { + for (int k = 0; k < 10; k++) { + for (int l = 0; l < 10; l++) { + // ... + } + } + } +} +``` + +> Résultat : un code illisible ! 😱 + +---- + +## Boucles +### while + +- La boucle `while` permet de répéter une action **tant qu'une condition est vraie** +- La condition est vérifiée **avant** l'exécution de la boucle + +```java +int i = 0; +while (i < 10) { + System.out.println(i); + i++; +} +``` + +> `while` signifie "tant que" en anglais + +---- + +## Boucles +### do while + +- La boucle `do while` permet de répéter une action **tant qu'une condition est vraie** +- La condition est vérifiée **après** l'exécution de la boucle + +```java +int i = 0; +do { + System.out.println(i); + i++; +} while (i < 10); +``` + +--- + +## Tableaux + +![Logo Java](./assets/java.png) + +![IntelliJ](assets/intellij.png) + +---- + +## Tableaux +### Définition + +- Un tableau est une **structure de données** qui permet de stocker plusieurs valeurs. +- Il a une taille **fixe** et **définie** à l'avance +- Il est **indexé** à partir de 0 + +```java +int[] tableau = new int[10]; +``` + +> `int[]` est le type du tableau : tableau d'entiers + +---- + +## Tableaux +### Ajouter des éléments + +- Il est possible d'ajouter des éléments dans un tableau +- Il faut pour cela utiliser l'**index** du tableau + +```java +int[] tableau = new int[10]; +tableau[0] = 1; +tableau[1] = 2; +tableau[2] = 3; +``` + +> Attention à ne pas dépasser la taille du tableau ! + +---- + +## Tableaux +### Ajouter lors de la création + +- Il est possible d'ajouter des éléments lors de la création du tableau +- Il faut pour cela utiliser des **accolades** et séparer les éléments par des **virgules** + +```java +int[] tableau = new int[] {1, 2, 3}; +``` + +> Sa taille sera fixée automatiquement ! + +---- + +## Tableaux +### Parcourir un tableau + +- Il est possible de parcourir un tableau avec une boucle +- Il faut pour cela utiliser la **taille** du tableau + +```java +int[] tableau = new int[10]; +for (int index = 0; index < tableau.length; index++) { + System.out.println(tableau[index]); +} +``` + +> `tableau.length` permet de récupérer la taille du tableau + +---- + +## Tableaux +### for-each + +- Il est possible de parcourir un tableau avec une boucle `for-each` +- Il faut pour cela utiliser le mot clé `for` suivi du type de la variable, puis du nom de la variable, puis du tableau + +```java +int[] tableau = new int[10]; +for (int element : tableau) { + System.out.println(element); +} +``` + +> Pas de valeur = valeur par défaut du type + +---- + +## Tableaux +### Agrandir un tableau + +- Il est possible d'agrandir un tableau +- Il faut pour cela créer un nouveau tableau avec la nouvelle taille +- Il faut ensuite copier les éléments du tableau dans le nouveau tableau + +```java +int[] tableau = {1, 2, 3}; +int[] nouveauTableau = new int[20]; +for (int index = 0; index < tableau.length; index++) { + nouveauTableau[index] = tableau[index]; +} +tableau = nouveauTableau; +``` + +---- + +## Tableaux +### Tableaux multidimensionnels + +- Un tableau peut contenir d'autres tableaux +- Il s'agit d'un tableau de tableaux + +```java +int[][] tableau = new int[10][10]; +``` + +> `int[][]` est le type du tableau : tableau de tableaux d'entiers + +---- + +## Tableaux +### Tableaux multidimensionnels + +- On utilisera l'index pour accéder aux éléments +- Il faut pour cela utiliser l'index du tableau, puis l'index de l'élément + +```java +int[][] tableau = new int[10][10]; +tableau[0][0] = 1; +tableau[0][1] = 2; +tableau[0][2] = 3; +``` + +> Attention à ne pas dépasser la taille du tableau ! + +---- + +## Tableaux +### ArrayList + +- `ArrayList` est une classe qui permet de créer des tableaux dynamiques +- Il est possible d'ajouter des éléments sans se soucier de la taille + +```java +ArrayList tableau = new ArrayList<>(); +tableau.add(1); +``` + +> `ArrayList` est une classe générique, il faut donc préciser le type + +---- + +## Tableaux +### ArrayList + +- `ArrayList` est une implémentation de l'interface `List` +- Il est possible de récupérer un tableau à partir d'une `List` + +```java +List liste = new ArrayList<>(); +liste.add(1); +``` + +```java +Integer[] tableau = liste.toArray(new Integer[0]); +``` + +---- + +## Integer ?! + +- `int` est un type primitif, `Integer` est une classe +- Comme pour `String`, `Integer` est une classe qui permet de manipuler des `int` + +```java +int a = 1; +Integer b = 2; +``` + +> `Integer` est un **wrapper** de `int` + +---- + +## Tableaux +### ArrayList + +- `List` sert aussi d'interface pour le type `LinkedList` +- `LinkedList` est une implémentation de `List` qui permet d'ajouter des éléments plus rapidement + +```java +List liste = new LinkedList<>(); +liste.add(1); +``` + +> `LinkedList` est une liste chaînée, elle est plus lente à parcourir + +--- + +## Fonctions + +![Logo Java](./assets/java.png) + +![IntelliJ](assets/intellij.png) + +---- + +## Fonctions +### Définition + +Une fonction est une **sous-routine** qui permet d'effectuer une **action**. + +```java +public void afficherBonjour() { + System.out.println("Bonjour"); +} +``` + +> `void` signifie "vide" en anglais + +---- + +## Fonctions +### Syntaxe + +```java +public () { + // Code +} +``` + +- `public` : Visibilité de la fonction +- `` : Type de retour de la fonction +- `` : Nom de la fonction +- `` : Paramètres de la fonction +- `{}` : Corps de la fonction + +---- + +## Fonctions +### Visibilité + +Il existe plusieurs visibilités pour les fonctions : +- `public` : Fonction accessible depuis n'importe où +- `private` : Fonction accessible uniquement depuis la classe +- `protected` : Fonction accessible depuis la classe et les classes filles +- `package` : Fonction accessible uniquement depuis le package + +> Par défaut, la visibilité est `package` + +---- + +## Fonctions +### Type de retour + +- Dans tous les autres cas, la fonction retourne un type ou `void` +- `void` : Fonction qui ne retourne rien + +```java +public int addition(int a, int b) { + return a + b; +} +``` + +> `return` permet de retourner une valeur + +---- + +## Fonctions +### Paramètres + +Les paramètres sont des variables qui permettent de passer des valeurs à la fonction. + +```java +public void afficherBonjour(String nom) { + System.out.println("Bonjour " + nom); +} +``` + +> Les paramètres sont séparés par des virgules + +---- + +## Fonction +### Appel + +Pour appeler une fonction, il faut utiliser son nom suivi des paramètres entre parenthèses. + +```java +afficherBonjour("Alexandre"); +``` + +> Les paramètres doivent correspondre aux types attendus par la fonction + +---- + +## Fonction +### Nomenclaure + +- Les fonctions doivent être nommées de manière **significative** +- Elles doivent commencer par un **verbe** à l'infinitif +- Elles doivent être **courtes** et **concises** +- On utilisera le **camelCase** pour les nommer + +---- + +## Fonction +### Bonnes pratiques + +- Une fonction doit faire **une seule chose** +- Une fonction doit faire moins de **20 lignes** +- Idéalement, une fonction est **documentée** avec de la **JavaDoc** + +> Le nom de la fonction est souvent inversement proportionnel à sa taille/complexité + +---- + +## Fonction +### Exemple + +```java +/** + * Affiche un message de bienvenue personnalisé + * @param nom Le nom de la personne + */ +public void afficherBonjour(String nom) { + System.out.println("Bonjour " + nom); +} +``` + +---- + +## Fonction +### Découpage + +- Une fonction doit faire **une seule chose** +- Si elle fait plus de 20 lignes, il faut la découper en plusieurs fonctions + +```java +public void afficherBonjour(String nom) { + System.out.println("Bonjour " + nom); +} +``` + +> Ici, la fonction ne fait qu'une seule chose, elle est donc bonne ! + +---- + +## Fonction +### Découpage + +```java +/** + * Affiche le message de bienvenue et vérifie si la personne est majeure + */ +public void afficherBonjourEtVerifierAge(String nom, int age) { + System.out.println("Bonjour " + nom); + if (age >= 18) { + System.out.println("Vous êtes majeur !"); + } else { + System.out.println("Vous êtes mineur !"); + } +} +``` + +> Ici, la fonction fait deux choses, il faut la découper ! + +---- + +## Fonction +### Découpage + +```java +/** + * Affiche le message de bienvenue + */ +private void afficherBonjour(String nom) { + System.out.println("Bonjour " + nom); +} + +/** + * Vérifie si la personne est majeure + */ +private void verifierAge(int age) { + if (age >= 18) { + System.out.println("Vous êtes majeur !"); + } else { + System.out.println("Vous êtes mineur !"); + } +} + +/** + * Affiche le message de bienvenue et vérifie si la personne est majeure + */ +public void afficherBonjourEtVerifierAge(String nom, int age) { + afficherBonjour(nom); + verifierAge(age); +} +``` + +--- + +## Classes et objets + +![Logo Java](./assets/java.png) + +![IntelliJ](assets/intellij.png) + +---- + +## Objets +### Définition + +Un objet est une **instance** d'une **classe**. + +```java +Personne Alex = new Personne(); +``` + +- `Personne` est le **type** de l'objet +- `Alex` est le **nom** de l'objet + +> `new` permet d'instancier un objet + +---- + +## Classes +### Définition + +Une classe est un **modèle** qui permet de créer des objets. + +```java +public class Personne { + // Code +} +``` + +- `public` : Visibilité de la classe +- `class` : Mot clé pour définir une classe +- `Personne` : Nom de la classe +- `{}` : Corps de la classe + +---- + +## Classes +### Attributs + +Les attributs sont des variables qui permettent de stocker des valeurs dans un objet. + +```java +public class Personne { + public String nom; + public int age; +} +``` + +> Les attributs sont déclarés dans la classe + +---- + +## Classes +### Méthodes + +Les méthodes sont des fonctions qui permettent d'effectuer des actions sur un objet. + +```java +public class Personne { + public String nom; + public int age; + + public void etudier(String matiere) { + System.out.println(nom + " étudie " + matiere); + } +} +``` + +---- + +## Classes +### Constructeur + +Le constructeur est une méthode qui permet d'initialiser un objet. + +```java +public class Personne { + public String nom; + public int age; + + public Personne(String nom, int age) { + this.nom = nom; + this.age = age; + } +} +``` + +- Il porte le même nom que la classe +- Appelé lors de l'instanciation +- Permet d'initialiser les attributs + +---- + +## Classes +### Précisions + +```java +public class Personne { + public String nom; + public int age; + + public Personne(String nom, int age) { + this.nom = nom; + this.age = age; + } +} +``` + +- `this` permet de faire référence à l'objet courant +- `this.nom` fait référence à l'attribut `nom` de l'objet courant +- `nom` fait référence au paramètre `nom` de la méthode + +---- + +## Classes +### Statique + +- Une classe peut être **statique** +- Une classe statique ne peut pas être instanciée +- Elle ne peut contenir que des méthodes statiques + +```java +public static class Personne { + // Code +} +``` + +> `static` permet de définir une classe statique + +---- + +## Classes +### Statique + +- L'objectif des classes statique est souvent de regrouper des méthodes +- Elles sont souvent utilisées pour créer des **utilitaires** + +```java +public static class Mathematiques { + public static int addition(int a, int b) { + return a + b; + } +} +``` + +---- + +## Classes +### Attributs statiques + +- Attributs qui appartiennent à la classe et non à l'objet +- Partagés par tous les objets de la classe + +```java +public class Personne { + public static int nombreDePersonnes = 0; + + public Personne() { + nombreDePersonnes++; + } +} +``` +Ici, on incrémente le nombre de personnes à chaque fois qu'on instancie un objet + +---- + +## Classes +### Attributs `final` + +- `final` devant un attribut signifie qu'il est **constant** +- Il ne peut pas être modifié après son initialisation +- Comme une constante, qui serait initialisée dans le constructeur + +```java +public class Personne { + public final String nom; + + public Personne(String nom) { + this.nom = nom; + } +} +``` + +---- + +## Classes +### Classes par défaut + +- Il existe de nombreuses classes existantes en Java +- Elles sont disponibles par défaut dans le langage mais doivent être importées +- Elles sont regroupées dans des **packages** + +```java +import java.util.ArrayList; +``` + +> `import` permet d'importer une classe + +---- + +## Classes +### Bonnes pratiques + +- Une classe doit être **documentée** avec de la **JavaDoc** +- Elle est **publique** si elle est utilisée par d'autres classes +- Une classe = un fichier ! +- Elle est nommée en **PascalCase** +- Elle n'a qu'une seule **responsabilité** + +> Nous aborderons ça plus en détail dans les prochains cours ! + +--- + +## Packages + +![Logo Java](./assets/java.png) + +![IntelliJ](assets/intellij.png) + +---- + +## Packages +### Définition + +- Un package est un **dossier** qui contient des classes +- Il permet de **regrouper** les classes par **thème** +- Il permet de **structurer** le code + +```java +package fr.octocorn; + +public class Personne { + // Code +} +``` + +> `package` permet de définir le package de la classe + +---- + +## Packages +### Structure + +- Les packages sont définis par un **nom de domaine inversé** +- Il convient d'organiser ses packages en début de projet +- Il est possible de créer des sous-packages + +---- + +## Packages +### Structure + +```shell +└───src + ├───main + │ ├───java + │ │ └───fr + │ │ └───octocorn + │ │ └───cours + │ │ └───java + │ │ └───Personne.java + │ │ + │ └───resources + └───test +``` + +> `fr.octocorn.cours.java` est le package de la classe `Personne` + +---- + +## Packages +### Bonnes pratiques + +- Un package par **thème** ou par **fonctionnalité** +- Un package = un dossier ! +- Il est nommé en **minuscules** +- Il est nommé en **singulier** + +> Il n'y a pas de règles strictes, mais il faut rester cohérent ! + +---- + +## Packages +### Importer + +- Il est possible d'importer un package +- Il faut pour cela utiliser le mot clé `import` suivi du nom du package + +```java +import fr.octocorn.cours.java.Personne; + +public class AnimalDeCompagnie { + public Personne maitre; +} +``` + +> `import` permet d'importer un package + +---- + +# Demonstration + +--- + +# A vous de jouer ! + +Réalisez le TP 1 ! + +Note: `exercices/tp1/tp1.coq.md` \ No newline at end of file diff --git a/exercices/TP 1/tp1.coq.md b/exercices/TP 1/tp1.coq.md new file mode 100644 index 0000000..eb6faca --- /dev/null +++ b/exercices/TP 1/tp1.coq.md @@ -0,0 +1,253 @@ +# TP 1 + +Vous trouverez ci-dessous différents exercices purement algorithmiques. + +Ils ont pour objectif de vous familiariser avec la syntaxe Java, et les bases de la programmation. + +Vous créerez un dépot github pour ce TP, et vous y ajouterez vos différents exercices. +Vous utiliserez la classe `Main` pour tester vos différents exercices et réaliserez une classe par exercice, +dans un package `tp1.exerciceX` (où X est le numéro de l'exercice). + +- Pour tous les exercices, vous gérerez également les exceptions. +- Par souci de facilité d'utilisation, préférez les méthodes statiques. + +> Vous réaliserez un commit par exercice ! +> Si l'exercice peut être réalisé de plusieurs manières, vous réaliserez un commit par version. + +--- + +## Exercice 1 : Calculer la moyenne 📖 + +Écrivez un programme qui demande à l'utilisateur de saisir 3 notes, puis qui affiche la moyenne de ces notes. + +### Contraintes 🚨 + +- Les notes saisies doivent être des nombres entiers. +- Les notes saisies doivent être comprises entre 0 et 20. +- La moyenne doit être un nombre entier. +- La fonction doit prendre en paramètre un tableau de notes. + +### Exemples 🔦 + +#### Exemple 1 + +- Note 1 saisie : `10` +- Note 2 saisie : `10` +- Note 3 saisie : `10` +- Moyenne : `10` + +#### Exemple 2 + +- Note 1 saisie : `15` +- Note 2 saisie : `10` +- Note 3 saisie : `5` +- Moyenne : `10` + +--- + +## Exercice 2 : Calculer le prix TTC 📖 + +Écrivez un programme qui demande à l'utilisateur de saisir un prix HT, puis qui affiche le prix TTC correspondant. +Le prix TTC est calculé en ajoutant la TVA au prix HT. La TVA est de 20%. + +### Contraintes 🚨 + +- Votre fonction prendra en paramètre un nombre float. +- Le prix HT saisi doit être un nombre positif. +- Le prx TTC est un nombre positif float. + +### Exemples 🔦 + +#### Exemple 1 + +- Prix HT saisi : `100` +- Prix TTC : `120` +- Explication : `100 * 1.2 = 120` + +#### Exemple 2 + +- Prix HT saisi : `50` +- Prix TTC : `60` +- Explication : `50 * 1.2 = 60` + +--- + +## Exercice 3 : Nombre Palindrome 📖 + +Un palindrome est un nombre qui peut se lire de la même manière de gauche à droite et de droite à gauche. + +> 121 est un palindrome + +Écrivez un programme qui permet de déterminer si un nombre saisi par l'utilisateur est un palindrome. + +### Contraintes 🚨 + +- Votre programme retournera `true` si le nombre est un palindrome, `false` sinon. +- Vous n'avez pas le droit de convertir le nombre en `String`. +- Le nombre doit être supérieur à 0. +- Le nombre doit contenir au moins 2 chiffres + +### Exemples de résultats attendus 🔦 + +#### Exemple 1 + +- Nombre saisi : `121` +- Résultat : `true` +- Explication : `121` est un palindrome + +#### Exemple 2 + +- Nombre saisi : `123` +- Résultat : `false` +- Explication : `123` n'est pas un palindrome + +--- + +## Exercice 4 : Contient un doublon ? 📖 + +Écrivez un programme qui permet de déterminer si un tableau d'entiers contient un doublon. + +### Contraintes 🚨 + +- Votre programme retournera `true` si le tableau contient un doublon, `false` sinon. + +### Exemples de résultats attendus 🔦 + +#### Exemple 1 + +- Tableau saisi : `[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]` +- Résultat : `false` +- Explication : Le tableau ne contient pas de doublon + +#### Exemple 2 + +- Tableau saisi : `[1, 2, 3, 4, 5, 6, 7, 8, 9, 1]` +- Résultat : `true` +- Explication : Le tableau contient un doublon avec `1` + +### Indices 💡 + +- Il y a au moins 3 approches possibles : + - Utiliser une boucle dans une boucle + - Trier le tableau + - Utiliser un HashMap + +### Aller plus loin 💪 + +Si vous le souhaitez, vous pouvez essayer de mettre en place les 3 solutions ! + +--- + +## Exercice 5 : Nombre romain vers nombre arabe 📖 + +Écrivez un programme qui permet de calculer la valeur d'un nombre romain saisi par l'utilisateur. + +Les valeurs des chiffres romains sont les suivantes : + +| Chiffre romain | Valeur | +|----------------|--------| +| I | 1 | +| V | 5 | +| X | 10 | +| L | 50 | +| C | 100 | +| D | 500 | +| M | 1000 | + +- `I` peut être placé avant `V` et `X` pour faire 4 ou 9. +- `X` peut être placé avant `L` et `C` pour faire 40 ou 90. +- `C` peut être placé avant `D` et `M` pour faire 400 ou 900. + +### Contraintes 🚨 + +- L'input ne peut contenir que des chiffres romains. +- Les chiffres romains ne peuvent aller que de 1 à 3999. +- La longueur de l'input ne peut excéder 15 caractères. +- L'input doit contenir au moins un chiffre romain. + +### Exemples de résultats attendus 🔦 + +#### Exemple 1 + +- Nombre saisi : `X` +- Résultat : `10` +- Explication : `X` vaut `10` + +#### Exemple 2 + +- Nombre saisi : `LVIII` +- Résultat : `58` +- Explication : `L` = `50`, `V` = `5`, `III` = `3` + +#### Exemple 3 + +- Nombre saisi : `MCMXCII` +- Résultat : `1992` +- Explication : `M` = `1000`, `CM` = `900`, `XC` = `90`, `II` = `2` + +### Indices 💡 + +2 méthodes : +- Imbriquer des `if` et des `else if` pour chaque cas particulier. +- Utiliser un `HashMap` + +### Aller plus loin 💪 + +- Essayez de réaliser les deux méthodes ! + +--- + +## Exercice 6 : Element majorité 📖 + +Écrivez un programme qui permet d'indiquer le nombre majoritaire dans un tableau d'entiers. +Partez du principe qu'il y a forcément au moins un élément majoritaire. + +> ❗Comme pour élire un président de la république, il faut avoir plus de 50% des voix pour être élu ! + + +### Contraintes 🚨 + +- Votre programme retournera l'élément le plus présent dans le tableau. +- La fonction prendra en paramètre un tableau d'entiers. +- Le tableau peut comprendre des nombres entre -10^9 et 5 * 10^4. +- La longueur du tableau peut aller de 1 à 50000. + +### Exemples de résultats attendus 🔦 + +#### Exemple 1 + +- Tableau saisi : `[3, 2, 3]` +- Résultat : `3` +- Explication : Chaque élément n'est présent qu'une seule fois. 1 est le premier élément trouvé. + +#### Exemple 2 + +- Tableau saisi : `[2, 2, 1, 1, 1, 2, 2]` +- Résultat : `1` +- Explication : 1 est le seul à être présent deux fois. + +#### Exemple 3 + +- Tableau saisi : `[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]` +- Résultat : `5` +- Explication : Il n'y a pas d'élément majoritaire, mais 5 est l'élément du milieu + +#### Exemple 4 + +- Tableau saisi : `[1, 1, 1, 2, 2, 3, 4, 5, 5]` +- Résultat : `2` +- Explication : Il n'y a pas d'élément majoritaire ici, l'input est donc mauvais ! + +### Indices 💡 + +Il y a au moins 2 manières de résoudre cet exercice : +- Trier le tableau +- Utiliser un HashMap + +### Aller plus loin 💪 + +- Essayez d'utiliser les 2 méthodes ! + +#### BONUS : Méthode Boyer-Moore + +Essayez de résoudre ce problème avec l'algorithme de [Boyer-Moore](https://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_majority_vote_algorithm) diff --git a/exercices/TP 1/tp1.poulet.md b/exercices/TP 1/tp1.poulet.md new file mode 100644 index 0000000..e340594 --- /dev/null +++ b/exercices/TP 1/tp1.poulet.md @@ -0,0 +1,276 @@ +# TP 1 + +Vous trouverez ci-dessous différents exercices purement algorithmiques. + +Ils ont pour objectif de vous familiariser avec la syntaxe Java, et les bases de la programmation. + +Vous créerez un dépot github pour ce TP, et vous y ajouterez vos différents exercices. +Vous utiliserez la classe `Main` pour tester vos différents exercices et réaliserez une classe par exercice, +dans un package `tp1.exerciceX` (où X est le numéro de l'exercice). + +- Pour tous les exercices, vous gérerez également les exceptions. +- Par souci de facilité d'utilisation, préférez les méthodes statiques. + +> Vous réaliserez un commit par exercice ! +> Si l'exercice peut être réalisé de plusieurs manières, vous réaliserez un commit par version. + +--- + +## Exercice 1 : Calculer la moyenne 📖 + +Écrivez un programme qui demande à l'utilisateur de saisir 3 notes, puis qui affiche la moyenne de ces notes. + +### Contraintes 🚨 + +- Les notes saisies doivent être des nombres entiers. +- Les notes saisies doivent être comprises entre 0 et 20. +- La moyenne doit être un nombre entier. +- La fonction doit prendre en paramètre un tableau de notes. + +### Exemples 🔦 + +#### Exemple 1 + +- Note 1 saisie : `10` +- Note 2 saisie : `10` +- Note 3 saisie : `10` +- Moyenne : `10` + +#### Exemple 2 + +- Note 1 saisie : `15` +- Note 2 saisie : `10` +- Note 3 saisie : `5` +- Moyenne : `10` + +### Indices 💡 + +- Vous pouvez lever une exception avec `throw new IllegalArgumentException("Message d'erreur");` +- Vous devrez vérifier que la note est bien comprise entre 0 et 20. + +--- + +## Exercice 2 : Calculer le prix TTC 📖 + +Écrivez un programme qui demande à l'utilisateur de saisir un prix HT, puis qui affiche le prix TTC correspondant. +Le prix TTC est calculé en ajoutant la TVA au prix HT. La TVA est de 20%. + +### Contraintes 🚨 + +- Votre fonction prendra en paramètre un nombre float. +- Le prix HT saisi doit être un nombre positif. +- Le prx TTC est un nombre positif float. + +### Exemples 🔦 + +#### Exemple 1 + +- Prix HT saisi : `100` +- Prix TTC : `120` +- Explication : `100 * 1.2 = 120` + +#### Exemple 2 + +- Prix HT saisi : `50` +- Prix TTC : `60` +- Explication : `50 * 1.2 = 60` + +### Indices 💡 + +- Il suffit de multiplier le prix HT par 1.2 pour obtenir le prix TTC + +--- + +## Exercice 3 : Nombre Palindrome 📖 + +Un palindrome est un nombre qui peut se lire de la même manière de gauche à droite et de droite à gauche. + +> 121 est un palindrome + +Écrivez un programme qui permet de déterminer si un nombre saisi par l'utilisateur est un palindrome. + +### Contraintes 🚨 + +- Votre programme retournera `true` si le nombre est un palindrome, `false` sinon. +- Vous n'avez pas le droit de convertir le nombre en `String`. +- Le nombre doit être supérieur à 0. +- Le nombre doit contenir au moins 2 chiffres + +### Exemples de résultats attendus 🔦 + +#### Exemple 1 + +- Nombre saisi : `121` +- Résultat : `true` +- Explication : `121` est un palindrome + +#### Exemple 2 + +- Nombre saisi : `123` +- Résultat : `false` +- Explication : `123` n'est pas un palindrome + +### Indices 💡 + +- Vous devrez trouver le moyen de renverser le nombre saisi par l'utilisateur. +- Il vous suffira ensuite de comparer les deux nombres + +> 💡 L'opérateur `%` permet de récupérer le reste d'une division euclidienne (modulo) + +--- + +## Exercice 4 : Contient un doublon ? 📖 + +Écrivez un programme qui permet de déterminer si un tableau d'entiers contient un doublon. + +### Contraintes 🚨 + +- Votre programme retournera `true` si le tableau contient un doublon, `false` sinon. + +### Exemples de résultats attendus 🔦 + +#### Exemple 1 + +- Tableau saisi : `[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]` +- Résultat : `false` +- Explication : Le tableau ne contient pas de doublon + +#### Exemple 2 + +- Tableau saisi : `[1, 2, 3, 4, 5, 6, 7, 8, 9, 1]` +- Résultat : `true` +- Explication : Le tableau contient un doublon avec `1` + +### Indices 💡 + +Il y a au moins 3 approches possibles : +- Utiliser une boucle dans une boucle +- Trier le tableau et comparer chaque élément avec le suivant +- Utiliser un HashMap et compter les occurrences + + +### Aller plus loin 💪 + +Si vous le souhaitez, vous pouvez essayer de mettre en place les 3 solutions ! + +--- + +## Exercice 5 : Nombre romain vers nombre arabe 📖 + +Écrivez un programme qui permet de calculer la valeur d'un nombre romain saisi par l'utilisateur. + +Les valeurs des chiffres romains sont les suivantes : + +| Chiffre romain | Valeur | +|----------------|--------| +| I | 1 | +| V | 5 | +| X | 10 | +| L | 50 | +| C | 100 | +| D | 500 | +| M | 1000 | + +- `I` peut être placé avant `V` et `X` pour faire 4 ou 9. +- `X` peut être placé avant `L` et `C` pour faire 40 ou 90. +- `C` peut être placé avant `D` et `M` pour faire 400 ou 900. + +### Contraintes 🚨 + +- L'input ne peut contenir que des chiffres romains. +- Les chiffres romains ne peuvent aller que de 1 à 3999. +- La longueur de l'input ne peut excéder 15 caractères. +- L'input doit contenir au moins un chiffre romain. + +### Exemples de résultats attendus 🔦 + +#### Exemple 1 + +- Nombre saisi : `X` +- Résultat : `10` +- Explication : `X` vaut `10` + +#### Exemple 2 + +- Nombre saisi : `LVIII` +- Résultat : `58` +- Explication : `L` = `50`, `V` = `5`, `III` = `3` + +#### Exemple 3 + +- Nombre saisi : `MCMXCII` +- Résultat : `1992` +- Explication : `M` = `1000`, `CM` = `900`, `XC` = `90`, `II` = `2` + +### Indices 💡 + +2 méthodes +- La manière la plus simple serait d'imbriquer des `if` et des `else if` pour chaque cas particulier. +- L'autre méthode consiste à utiliser un `HashMap` + +> 💡 Pensez à vérifier si le nombre n'est pas comptabilisé deux fois ! (par exemple, `IV` est comptabilisé comme `1` et `5`) + +### Aller plus loin 💪 + +- Essayez de réaliser les deux méthodes `HashMap` ! + +--- + +## Exercice 6 : Element majorité 📖 + +Écrivez un programme qui permet d'indiquer le nombre majoritaire dans un tableau d'entiers. +Partez du principe qu'il y a forcément au moins un élément majoritaire. + +> ❗Comme pour élire un président de la république, il faut avoir plus de 50% des voix pour être élu ! + + +### Contraintes 🚨 + +- Votre programme retournera l'élément le plus présent dans le tableau. +- La fonction prendra en paramètre un tableau d'entiers. +- Le tableau peut comprendre des nombres entre -10^9 et 5 * 10^4. +- La longueur du tableau peut aller de 1 à 50000. + +### Exemples de résultats attendus 🔦 + +#### Exemple 1 + +- Tableau saisi : `[3, 2, 3]` +- Résultat : `3` +- Explication : Chaque élément n'est présent qu'une seule fois. 1 est le premier élément trouvé. + +#### Exemple 2 + +- Tableau saisi : `[2, 2, 1, 1, 1, 2, 2]` +- Résultat : `1` +- Explication : 1 est le seul à être présent deux fois. + +#### Exemple 3 + +- Tableau saisi : `[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]` +- Résultat : `5` +- Explication : Il n'y a pas d'élément majoritaire, mais 5 est l'élément du milieu + +#### Exemple 4 + +- Tableau saisi : `[1, 1, 1, 2, 2, 3, 4, 5, 5]` +- Résultat : `2` +- Explication : Il n'y a pas d'élément majoritaire ici, l'input est donc mauvais ! + +### Indices 💡 + +Il y a au moins 2 manières de résoudre cet exercice : +- Trier le tableau + - Un élément majoritaire est sera forcément présent plus de `n/2` fois, où `n` est la longueur du tableau. + - Problème : si aucun élément n'est majoritaire, on retourne l'élément du milieu, qui n'est pas forcément majoritaire ! +- Utiliser un HashMap + - `getOrDefault` de la classe `HashMap` permet de récupérer une valeur, ou une valeur par défaut si la clé n'existe pas + - `entrySet` de la classe `HashMap` permet de parcourir un `HashMap` avec une boucle `for` + +### Aller plus loin 💪 + +- Essayez d'utiliser les 2 méthodes ! + +#### BONUS + +Essayez de résoudre ce problème avec l'algorithme de [Boyer-Moore](https://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_majority_vote_algorithm) diff --git a/exercices/TP 1/tp1.poussin.md b/exercices/TP 1/tp1.poussin.md new file mode 100644 index 0000000..473eabd --- /dev/null +++ b/exercices/TP 1/tp1.poussin.md @@ -0,0 +1,301 @@ +# TP 1 + +Vous trouverez ci-dessous différents exercices purement algorithmiques. + +Ils ont pour objectif de vous familiariser avec la syntaxe Java, et les bases de la programmation. + +Vous créerez un dépot github pour ce TP, et vous y ajouterez vos différents exercices. +Vous utiliserez la classe `Main` pour tester vos différents exercices et réaliserez une classe par exercice, +dans un package `tp1.exerciceX` (où X est le numéro de l'exercice). + +- Pour tous les exercices, vous gérerez également les exceptions. +- Par souci de facilité d'utilisation, préférez les méthodes statiques. + +> Vous réaliserez un commit par exercice ! +> Si l'exercice peut être réalisé de plusieurs manières, vous réaliserez un commit par version. + +--- + +## Exercice 1 : Calculer la moyenne 📖 + +Écrivez un programme qui demande à l'utilisateur de saisir 3 notes, puis qui affiche la moyenne de ces notes. + +### Contraintes 🚨 + +- Les notes saisies doivent être des nombres entiers. +- Les notes saisies doivent être comprises entre 0 et 20. +- La moyenne doit être un nombre entier. +- La fonction doit prendre en paramètre un tableau de notes. + +### Exemples 🔦 + +#### Exemple 1 + +- Note 1 saisie : `10` +- Note 2 saisie : `10` +- Note 3 saisie : `10` +- Moyenne : `10` + +#### Exemple 2 + +- Note 1 saisie : `15` +- Note 2 saisie : `10` +- Note 3 saisie : `5` +- Moyenne : `10` + +### Indices 💡 + +- Vous pouvez lever une exception avec `throw new IllegalArgumentException("Message d'erreur");` +- Vous devrez vérifier la longueur du tableau de notes avec `notes.length` +- Vous devrez vérifier que la note est bien comprise entre 0 et 20 avec `note >= 0 && note <= 20` +- Vous devrez additionner tous les éléments du tableau avec une boucle `for` et une variable `somme` et les diviser par la longueur du tableau avec `somme / notes.length` + +--- + +## Exercice 2 : Calculer le prix TTC 📖 + +Écrivez un programme qui demande à l'utilisateur de saisir un prix HT, puis qui affiche le prix TTC correspondant. +Le prix TTC est calculé en ajoutant la TVA au prix HT. La TVA est de 20%. + +### Contraintes 🚨 + +- Votre fonction prendra en paramètre un nombre float. +- Le prix HT saisi doit être un nombre positif. +- Le prx TTC est un nombre positif float. + +### Exemples 🔦 + +#### Exemple 1 + +- Prix HT saisi : `100` +- Prix TTC : `120` +- Explication : `100 * 1.2 = 120` + +#### Exemple 2 + +- Prix HT saisi : `50` +- Prix TTC : `60` +- Explication : `50 * 1.2 = 60` + +### Indices 💡 + +- Vous pouvez lever une exception avec `throw new IllegalArgumentException("Message d'erreur");` +- Il suffit de multiplier le prix HT par 1.2 pour obtenir le prix TTC + +--- + +## Exercice 3 : Nombre Palindrome 📖 + +Un palindrome est un nombre qui peut se lire de la même manière de gauche à droite et de droite à gauche. + +> 121 est un palindrome + +Écrivez un programme qui permet de déterminer si un nombre saisi par l'utilisateur est un palindrome. + +### Contraintes 🚨 + +- Votre programme retournera `true` si le nombre est un palindrome, `false` sinon. +- Vous n'avez pas le droit de convertir le nombre en `String`. +- Le nombre doit être supérieur à 0. +- Le nombre doit contenir au moins 2 chiffres + +### Exemples de résultats attendus 🔦 + +#### Exemple 1 + +- Nombre saisi : `121` +- Résultat : `true` +- Explication : `121` est un palindrome + +#### Exemple 2 + +- Nombre saisi : `123` +- Résultat : `false` +- Explication : `123` n'est pas un palindrome + +### Indices 💡 + +- Vous devrez trouver le moyen de renverser le nombre saisi par l'utilisateur. +- Il suffira ensuite de comparer les deux nombres +- Vous aurez besoin d'une boule pour parcourir le nombre et le renverser +- Vous pouvez utiliser l'opérateur `% 10` pour récupérer le dernier chiffre d'un nombre + +> 💡 L'opérateur `%` permet de récupérer le reste d'une division euclidienne (modulo) + +--- + +## Exercice 4 : Contient un doublon ? 📖 + +Écrivez un programme qui permet de déterminer si un tableau d'entiers contient un doublon. + +### Contraintes 🚨 + +- Votre programme retournera `true` si le tableau contient un doublon, `false` sinon. + +### Exemples de résultats attendus 🔦 + +#### Exemple 1 + +- Tableau saisi : `[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]` +- Résultat : `false` +- Explication : Le tableau ne contient pas de doublon + +#### Exemple 2 + +- Tableau saisi : `[1, 2, 3, 4, 5, 6, 7, 8, 9, 1]` +- Résultat : `true` +- Explication : Le tableau contient un doublon avec `1` + +### Indices 💡 + +- Il y a au moins 3 approches possibles : + - Utiliser une boucle dans une boucle pour comparer chaque élément avec tous les autres + - Option plus simple à mettre en place, mais très lourde en terme de performance + - Trier le tableau et comparer chaque élément avec le suivant + - En utilisant la méthode `Arrays.sort(tableau)` de la classe `Arrays` + - Relativement simple et assez efficace + - Utiliser un HashMap pour compter le nombre d'occurrences de chaque élément + - En utilisant la classe `HashMap` de Java + - Plus complexe à mettre en place, mais très efficace + +> 💡 Vous pouvez `return` dès que vous trouvez un doublon ! + + +### Aller plus loin 💪 + +Si vous le souhaitez, vous pouvez essayer de mettre en place les 3 solutions ! + +--- + +## Exercice 5 : Nombre romain vers nombre arabe 📖 + +Écrivez un programme qui permet de calculer la valeur d'un nombre romain saisi par l'utilisateur. + +Les valeurs des chiffres romains sont les suivantes : + +| Chiffre romain | Valeur | +|----------------|--------| +| I | 1 | +| V | 5 | +| X | 10 | +| L | 50 | +| C | 100 | +| D | 500 | +| M | 1000 | + +- `I` peut être placé avant `V` et `X` pour faire 4 ou 9. +- `X` peut être placé avant `L` et `C` pour faire 40 ou 90. +- `C` peut être placé avant `D` et `M` pour faire 400 ou 900. + +### Contraintes 🚨 + +- L'input ne peut contenir que des chiffres romains. +- Les chiffres romains ne peuvent aller que de 1 à 3999. +- La longueur de l'input ne peut excéder 15 caractères. +- L'input doit contenir au moins un chiffre romain. + +### Exemples de résultats attendus 🔦 + +#### Exemple 1 + +- Nombre saisi : `X` +- Résultat : `10` +- Explication : `X` vaut `10` + +#### Exemple 2 + +- Nombre saisi : `LVIII` +- Résultat : `58` +- Explication : `L` = `50`, `V` = `5`, `III` = `3` + +#### Exemple 3 + +- Nombre saisi : `MCMXCII` +- Résultat : `1992` +- Explication : `M` = `1000`, `CM` = `900`, `XC` = `90`, `II` = `2` + +### Indices 💡 + +2 méthodes +- La manière la plus simple serait d'imbriquer des `if` et des `else if` pour chaque cas particulier. + - On peut s'abord vérifier le caractère en question, et si le caractère précédent est un `I`, `X` ou `C` et le soustraire au nombre arabe. + - Vous pouvez obtenir le caractère à un index donné avec la méthode `charAt(index)` de la classe `String`. +- L'autre méthode consiste à utiliser un `HashMap` + - Vous pouvez créer un `HashMap` avec `Map nombresRomains = new HashMap<>();` + - Vous pouvez ajouter des valeurs avec `nombresRomains.put('I', 1);` + - Vous pouvez récupérer une valeur avec `nombresRomains.get('I');`, ce qui vous renverra `1` + +> 💡Attention à bien vérifier que le caractère précédent existe bien avant de le comparer ! + +> 💡 Pensez à vérifier si le nombre n'est pas comptabilisé deux fois ! (par exemple, `IV` est comptabilisé comme `1` et `5`) + +### Aller plus loin 💪 + +- Essayez de réaliser les deux méthodes `HashMap` ! + +--- + +## Exercice 6 : Element majorité 📖 + +Écrivez un programme qui permet d'indiquer le nombre majoritaire dans un tableau d'entiers. +Partez du principe qu'il y a forcément au moins un élément majoritaire. + +> ❗Comme pour élire un président de la république, il faut avoir plus de 50% des voix pour être élu ! + + +### Contraintes 🚨 + +- Votre programme retournera l'élément le plus présent dans le tableau. +- La fonction prendra en paramètre un tableau d'entiers. +- Le tableau peut comprendre des nombres entre -10^9 et 5 * 10^4. +- La longueur du tableau peut aller de 1 à 50000. + +### Exemples de résultats attendus 🔦 + +#### Exemple 1 + +- Tableau saisi : `[3, 2, 3]` +- Résultat : `3` +- Explication : Chaque élément n'est présent qu'une seule fois. 1 est le premier élément trouvé. + +#### Exemple 2 + +- Tableau saisi : `[2, 2, 1, 1, 1, 2, 2]` +- Résultat : `1` +- Explication : 1 est le seul à être présent deux fois. + +#### Exemple 3 + +- Tableau saisi : `[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]` +- Résultat : `5` +- Explication : Il n'y a pas d'élément majoritaire, mais 5 est l'élément du milieu + +#### Exemple 4 + +- Tableau saisi : `[1, 1, 1, 2, 2, 3, 4, 5, 5]` +- Résultat : `2` +- Explication : Il n'y a pas d'élément majoritaire ici, l'input est donc mauvais ! + +### Indices 💡 + +Il y a au moins 2 manières de résoudre cet exercice : +- Trier le tableau + - Un élément majoritaire est sera forcément présent plus de `n/2` fois, où `n` est la longueur du tableau. + - Sur un tableau de 10 éléments, l'élément majoritaire sera présent au moins 6 fois. + - Si le tableau est trié, il sera forcément au milieu ! + - Problème : si aucun élément n'est majoritaire, on retourne l'élément du milieu, qui n'est pas forcément majoritaire ! +- Utiliser un HashMap + - On peut compter le nombre d'occurrences de chaque élément dans le tableau + - On peut ensuite récupérer l'élément avec le plus d'occurrences + - Et extraire celui qui sera présent plus de `n/2` fois + - Retourner cet élément, ou 0 si aucun élément n'est majoritaire + - La méthode `getOrDefault` de la classe `HashMap` permet de récupérer une valeur, ou une valeur par défaut si la clé n'existe pas + - La méthode `entrySet` de la classe `HashMap` permet de récupérer un `Set` de `Map.Entry`, ce qui permet de parcourir un `HashMap` avec une boucle `for` + +### Aller plus loin 💪 + +- Essayez d'utiliser les 2 méthodes ! + +#### BONUS + +Essayez de résoudre ce problème avec l'algorithme de [Boyer-Moore](https://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_majority_vote_algorithm)