Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
  • master
1 result

Target

Select target project
  • z22024794/prog-av-exercices-fadl-zemzem
  • n23017542/progavexercices
  • l23024794/saratp-1
  • d24029849/progavexercices
  • gnaves/progavexercices
5 results
Select Git revision
  • master
1 result
Show changes
Commits on Source (10)
Showing
with 696 additions and 1 deletion
......@@ -28,6 +28,7 @@ public class BackPackSolver {
}
currentBackpack.add(allItems.get(nextItemIndex));
List<Item> backpack2 = findBestValueBackpack(nextItemIndex+1);
currentBackpack.removeLast();
return selectBestBackpack(backpack1, backpack2);
}
......
......@@ -79,7 +79,8 @@ In method g.
The end.
```
- Placer un *breakpoint* sur la première
ligne de la méthode 'main' (comment ? lire ci-dessus). Relancer le programme
ligne de la méthode `exoDebug` (comment ? lire ci-dessus). Relancer le
programme
en mode debug (bouton ![debug](../../../../../resources/debug.png) en haut
à droite). À l'issue de la compilation, vous obtiendrez l'ouverture de la
vue du debugger.
......
package fr.univamu.progav.td3;
public class ExoArray {
/** Initialise un tableau d'entiers, la cellule d'indice \(i\) contient l'entier \(i\), sauf une
* cellule sur trois depuis l'indice 1, qui contiennent \(-i\). Ainsi le tableau commence par
* <code>{0,-1,2,3,-4,5,6,-7,...}</code>.
* @param size la longueur souhaitée du tableau
* @return le tableau d'entiers
*/
public static int[] initArray(int size) {
// TODO
return null;
}
/** Calcule la somme des entiers en position paire dans un tableau.
* Par exemple pour <code>{1,3,2,4}</code> le résultat est \(3 = 1 + 2\).
* @param array le tableau dont on somme les entiers en position paire.
* @return la somme des entiers en position paire.
*/
public static int sumEvenPositions(int[] array) {
// TODO
return 0;
}
/** Décale tous les éléments du tableau "vers la gauche", sauf l'élément d'indice 0 qui est
* replacé en fin de tableau. Par exemple pour <code>{1,4,2,3}</code>, le tableau devient
* <code>{4,2,3,1}</code>.
* @param array le tableau à modifier.
*/
public static void shiftToLeft(int[] array) {
// TODO
}
}
package fr.univamu.progav.td3;
import java.util.ArrayList;
import java.util.List;
public class ExoList {
/** Initialise une liste d'entiers consécutifs depuis 0, par exemple <code>0,1,2,3,4</code>.
* @param size la longueur souhaitée de la liste.
* @return la liste ainsi initialisée.
*/
public static List<Integer> initList(int size) {
// TODO
return null;
}
/** Ajoute 1 à chaque entier d'une liste.
* @param values la liste des entiers à incrémenter.
*/
public static void addOneEverywhere(List<Integer> values) {
// TODO
}
/** Duplique chaque élément de la liste, en fin de liste, par exemple la liste <code>1,2,
* 3</code> devient <code>1,2,3,1,2,3</code>.
* @param values la liste à dupliquer.
*/
public static void duplicate(List<Integer> values) {
// TODO
}
}
package fr.univamu.progav.td3;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Une classe permettant de compter dans un texte, pour chaque mot, combien de fois il apparait.
*/
public class ExoMap {
// TODO initialisation à une table d'association vide
private final Map<String,Integer> counters = null;
/** Augmente le compte d'un mot.
* @param word le mot à compter.
*/
public void count(String word) {
// TODO
}
/** Compte tous les mots d'une liste.
* @param words une liste de mots à compter.
*/
public void count(List<String> words) {
// TODO
}
/** Retourne le nombre d'occurences comptées d'un mot.
* @param word un mot.
* @return le nombre d'occurences de ce mot.
*/
public int countOf(String word) {
// TODO
return 0;
}
}
package fr.univamu.progav.td3;
import java.util.ArrayDeque;
import java.util.Deque;
/**
* Une classe permettant d'évaluer des expressions arithmétiques entières en notation polonaise
* inverse, comme <em>3 5 2 * 1 + -4 7 + + *</em>. L'évaluation d'une telle expression se fait à
* l'aide d'une pile, et en lisant l'expression de gauche à droite :
* <ul>
* <li>3 : on empile 3, la pile est \([3]\)</li>
* <li>5 : on empile 5, la pile est \([3,5]\)</li>
* <li>2 : on empile 2, la pile est \([3,5,2]\)</li>
* <li>* : on remplace les deux éléments supérieurs par leur produit, la pile est \([3,10]\) </li>
* <li>1 : on empile 1, la pile est \([3,10,1]\)</li>
* <li>+ : on remplace les deux éléments supérieurs par leur somme, la pile est \([3,11]\)</li>
* <li>-4 : on empile -4, la pile est \([3,11,-4]\)</li>
* <li>7 : on empile 7, la pile est \([3,11,-4,7]\)</li>
* <li>+ : on remplace les deux éléments supérieurs par leur somme, la pile est \([3,11,3]\) </li>
* <li>+ : on remplace les deux éléments supérieurs par leur somme, la pile est \([3,14]\)</li>
* <li>* : on remplace les deux éléments supérieurs par leur produit, la pile est \([42]\)
* </li>
* </ul>
* Un des avantages de cette notation est l'absence de parenthèses, qui sont inutiles.
*/
public class ExoQueue {
// TODO initialisée avec une pile vide
private final Deque<Integer> intStack =null;
/** Insère une valeur en haut de la pile.
* @param value la valeur à insérer.
*/
public void addValue(int value) {
// TODO
intStack.offerLast(value);
}
/**
* Réalise l'addition des deux premiers éléments de la pile.
*/
public void performAddition() {
//TODO
}
/**
* Réalise la multiplication des deux premiers éléments de la pile.
*/
public void performMultiplication() {
// TODO
}
/**
* @return le nombre de valeurs dans la pile
*/
public int nbRemainingValues() {
// TODO
return 0;
}
/**
* @return la valeur en haut de la pile (<code>null</code> si la pile est vide)
*/
public int topValue() {
// TODO
return 0;
}
}
package fr.univamu.progav.td3;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class ExoSet {
/** Construit l'ensemble des éléments d'une liste (les éléments redondants disparaissent).
* @param list la liste des éléments qui seront dans l'ensemble.
* @return l'ensemble ainsi construit.
*/
public static Set<Integer> fromList(List<Integer> list) {
// TODO
return null;
}
/** Construit la liste des éléments de l'union de deux ensembles. Chaque élément doit
* apparaître au plus une fois.
* @param set1 le premier ensemble.
* @param set2 le deuxième ensemble.
* @return une liste union des deux ensembles.
*/
public static List<Integer> unionToList(Set<Integer> set1, Set<Integer> set2) {
// TODO
return null;
}
}
Exercice 1
==========
Un tableau est une structure indicée de taille fixe, contenant des valeurs
d'un même type.
Compléter les méthodes de la classe `ExoArray`, jusqu'à validation des tests.
Exercice 2
==========
Une liste est une collection indicée de taille variable, contenant des
valeurs d'un même type.
Compléter les méthodes de la classe `ExoList`, jusqu'à validation des tests.
Exercice 3
==========
Une file est une collection de valeurs de même type, organisées en séquences,
avec des opérations d'insertion et de suppression à ses extrémités.
Compléter les méthodes de la classe `ExoQueue`, jusqu'à validation des tests.
Cette classe permet l'évaluation d'expressions arithmétiques en notation
polonaise inversée.
Exercice 4
==========
Un ensemble est une collection de valeur d'un même type, chaque valeur y est
unique, et optimisée pour réaliser les opération d'insertion, suppression et
test d'appartenance.
Compléter les méthodes de la classe `ExoSet`, jusqu'à validation des tests.
Exercice 5
==========
Une table d'association est une collection de clés d'un même type, chaque
clé étant unique, et associant à chaque clé une valeur. Toutes les valeurs
sont du même type. Une table d'association est optimisée pour
insérer ou supprimer efficacement les clés, et récupérer ou modifier la
valeur associée d'une clé.
Compléter les méthodes de la classe `ExoMap`, jusqu'à validation des tests.
Cette classe permet de compter le nombre d'occurrences de chaque mot dans une
liste de mots.
Cette semaine, les exercices consistent en créer des énumérations,
enregistrements et interfaces scellés. Nous n'écrirons pas de méthode, donc
il n'y a pas de test associé, ni de classes fournies. Un fois l'exercice
fini, demandez à votre enseignant d'évaluer votre solution.
Introduction
============
Un atelier de céramistes d'Aubagne produit différents objets en terre cuite, et
nous demande de réaliser une application pour gérer ses commandes. Pour cela nous
devons représenter chaque objet pouvant être fabriqué. Il s'agit
1. d'escudelles, caractérisées par un diamètre (en centimètres);
2. de mazettes, existants en trois tailles (taille café, taille thé ou
taille chocolat);
3. de toupins, définis par une contenance en litres;
4. de poumié, avec un nombre arbitraire de pommes (généralement 3 ou 6).
De plus, chaque objet peut être fabriqué avec une couleur au choix, parmi :
1. Corail
2. Olive
3. Jaune de cobalt
4. Indigo
5. Chartreuse
6. Blanc lunaire
7. Céruléen
Exercice 1
==========
Créer un fichier `Color.java` et y définir une énumération pour représenter
toutes les couleurs disponibles.
Exercice 2
==========
Définir une énumération pour les tailles des mazettes, dans un fichier
`Mazette.java`.
Exercice 3
==========
Définir dans un fichier `Mazette.java`, un enregistrement pour représenter
les mazettes.
Exercice 4
==========
Procéder de même pour définir des enregistrements pour représenter les
escudelles, les toupins et les poumiés.
Exercice 5
==========
Créer une interface scellée `Product`, dans un fichier du même nom. Un
produit peut-être l'un des quatre proposés. Assurez-vous que chaque produit
possède bien une couleur.
package fr.univamu.progav.td5;
public record Blow(int physicalDamage, int magicalDamage) {
}
package fr.univamu.progav.td5;
public abstract class Character {
// TODO add health points
public boolean isAlive() {
// TODO
return false;
}
protected int getHealth() {
// TODO
return 0;
}
protected void reduceHealth(int amount) {
// TODO
}
protected void setHealth(int health) {
// TODO
}
public abstract Blow attack();
public abstract void defend(Blow blow);
public abstract void specialAction();
}
Dans cet exercice, nous implémentons le comportement de trois personnages, le
guerrier, le mage et le prêtre, dans un jeu de rôle. Chacun peut donner et
recevoir des coups, a des points de vie et meurt lorsque ses points de vie
deviennent négatifs. Par contre, ils réagissent différemment aux coups, ont des
attaques différentes et ont chacun une action spéciale spécifique.
Les coups sont décrits par la classe `Blow`, chaque coup ayant une
composante *dommage physique* et une composante *dommage magique*.
Chaque point de dommage, physique ou magique, fait baisser d'un point la vie
du personnage recevant le coup.
Le guerrier
-----------
- Ses attaques sont physiques : 3 dommages physiques et 0 dommage magique.
- Il est costaud : il ne subit que la moitié des dommages physiques des
coups qu'il reçoit.
- Il peut entrer en rage avec son action spéciale. Sa rage lui permet de
frapper deux fois plus fort pendant 3 attaques (6 dommages physiques).
- Après 3 attaques, il perd sa rage.
- S'il reçoit un coup provoquant une perte d'au moins 5 points de vie
pendant sa rage, sa rage dure une attaque supplémentaire.
Le mage
-------
- Ses attaques sont magiques : 4 dommages magiques et 0 dommage physique.
- Il absorbe la magie : s'il reçoit un coup, il ne perd pas de vie à cause
des dommages magiques, au contraire, la moitié des dommages magiques du
coup s'annule avec les dommages physiques (par exemple, pour 5 dommages
physiques et 3 magiques, il ne perd que 5 - (3/2) = 4 points de vie).
- L'absorption de magie ne lui permet pas de gagner des points de vie
(seulement de réduire les dommages physiques).
- Son action spéciale consiste à invoquer un bouclier magique, qui absorbe
les dommages physiques, jusqu'à 8 points. Le bouclier disparait une fois
qu'il a absorbé 8 points au total (par exemple après deux attaques faisant
5 dommages physiques chacune, il laissera passer 2 dommages physiques lors
de la deuxième attaque).
- Le bouclier est appliqué avant la règle de l'absorption des dommages magiques.
Le prêtre
---------
- Ses attaques combinent force (2 dommages physiques) et esprit (1 dommage
magique).
- Son action spéciale est de prier.
- Toutes les 3 prières, il est exaucé : il récupère 10 points de vie, et sa
prochaine attaque provoque 5 dommages magiques supplémentaires.
Travail à faire
---------------
1. Compléter l'implémentation du guerrier et de la classe abstraite `Character`.
2. Vérifier votre travail avec les tests du guerrier.
3. Compléter l'implémentation du mage, jusqu'à passage réussi des tests.
4. Créer la classe du prêtre tel que décrit.
\ No newline at end of file
package fr.univamu.progav.td5;
public class Warrior extends Character {
private static final int BASE_DAMAGE = 3;
private static final int BASE_HEALTH = 30;
public static final int RAGE_DAMAGE_THRESHOLD = 5;
// TODO add rage
public Warrior() {
// TODO
}
@Override
public Blow attack() {
// TODO
return null;
}
@Override
public void defend(Blow blow) {
// TODO
}
@Override
public void specialAction() {
// TODO
}
public int getRage() {
// TODO
return 0;
}
}
package fr.univamu.progav.td5;
public class Wizard extends Character {
private static final int BASE_HEALTH = 20;
private static final int BASE_DAMAGE = 4;
private static final int BASE_SHIELD_VALUE = 8;
// TODO add shield
public Wizard() {
// TODO
}
@Override
public Blow attack() {
//TODO
return null;
}
@Override
public void defend(Blow blow) {
// TODO
}
@Override
public void specialAction() {
// TODO
}
public int getShield() {
// TODO
return 0;
}
}
package fr.univamu.progav.td6;
public class ArrayCellLens<T> implements Lens<T> {
// TODO ajouter les propriétés
public ArrayCellLens(T[] array, int index) {
// TODO
}
@Override
public T get() {
// TODO
return null;
}
@Override
public void set(T t) {
// TODO
}
}
package fr.univamu.progav.td6;
public class Box implements Lens<Integer> {
private int content;
public Box(int content) {
this.content = content;
}
@Override
public void set(Integer newContent) {
this.content = newContent;
}
@Override
public Integer get() {
return this.content;
}
}
package fr.univamu.progav.td6;
public interface Lens<T> {
void set(T t);
T get();
}
package fr.univamu.progav.td6;
import java.util.List;
public class ListCellLens<T> implements Lens<T> {
// TODO ajouter les propriétés
public ListCellLens(List<T> list, int index) {
// TODO
}
@Override
public void set(T t) {
// TODO
}
@Override
public T get() {
// TODO
return null;
}
}
Ces exercices ont pour sujet une interface `Lens` générique, permettant
de représenter un emplacement mémoire autorisant la lecture et l'écriture.
Prendre connaissance de cette interface, qui propose deux méthodes `set`
et `get`.
Exercice 1
==========
Rendre la classe `Box` générique. Pour l'instant elle implémente un
`Lens<Integer>`, mais nous voulons l'utiliser avec d'autres types.
Modifier la méthode de test `genericTest` de la classe `BoxTest` pour qu'elle
fonctionne.
Exercice 2
==========
Étant donné une liste, chaque case de la liste est accessible en lecture et
en écriture. Il est donc possible de décrire chaque case avec l'interface
`Lens`. Compléter la classe générique `ListCellLens`, prenant une liste et
l'indice d'une case en paramètre du constructeur, et représentant la case ainsi
désignée.
Vérifiez votre travail à l'aide des tests `ListCellLensTest` associés à la
classe.
Exercice 3
==========
Nous pouvons faire la même chose avec les tableaux. Compléter la classe
générique `ArrayCellLens`, prenant un tableau et
l'indice d'une case en paramètre du constructeur, et représentant la case ainsi
désignée.
Vérifiez votre travail à l'aide des tests `ArrayCellLensTest` associés à la
classe.
Exercice 4
==========
Si vous essayez d'utiliser `ArrayCellLens` avec un tableau de type `int[]`,
cela produit une erreur à la compilation. Pourquoi ?
Ajouter une classe `IntArrayCellLens` pour pouvoir faire un `Lens` sur une
case d'un tableau de type `int[]`.
Ajouter un test dans la classe `ArrayCellLensTest`, s'assurant du bon
fonctionnement des méthodes `set` et `get` pour une case d'un tableau de
type `int[]`
Exercice 5 (Optionnel)
======================
Nous pouvons utiliser un objet de type `Lens` pour stocker une valeur sous
un format compressé. Pour un type `S` (dont les valeurs prennent beaucoup de
place), si nous disposons d'une fonction de compression `f` vers un type `T`
(nécessitant moins de place), et de son inverse `g`, nous pouvons
représenter une valeur `s` de type `S` en stockant uniquement `f(s)`. La
méthode `get` applique automatiquement `g` pour retrouver la valeur initiale
(de type `S`). La méthode `set` applique automatiquement `f` pour ne stocker
qu'une image (de type `T`). Ainsi, nous réduisons l'espace utilisé, en
échange d'un coût de calcul des fonctions `f` et `g` `chaque opération.
Ajouter une interface `Bijection` permettant de représenter par deux
méthodes les fonctions `f` et `g`.
Ensuite créer une classe `ConvertingLens`, de type `Lens<S>`, et ayant une
propriété de type `T`. Le constructeur sera paramétré par la bijection à
utiliser.
Tester avec `S = String`, `T = Integer`, en se restreignant aux chaînes de
caractères correspondant à des nombres décimaux (comme `"129873"`)
package fr.univamu.progav.td7;
import java.util.Iterator;
import java.util.NoSuchElementException;
/** A class to represent sets of consecutive integers.
* @param mini the smallest integer in the set.
* @param maxi the largest integer in the set. If maxi < mini, the set is empty.
*/
public record Interval(int mini, int maxi) implements Iterable<Integer> {
/**
* @param i an arbitrary integer
* @return true if i is in the set
*/
public boolean contains(int i) {
// TODO
return false;
}
/**
* @return the number of integers in the set.
*/
public int size() {
// TODO
return -1;
}
/**
* @return true if this is empty.
*/
public boolean isEmpty() {
// TODO
return false;
}
/** Decide whether two intervals intersect each other.
* @param range the second interval
* @return true if this and range intersect
*/
public boolean intersects(Interval range) {
// TODO
return false;
}
/**
* @return an iterator over the integers in the set
*/
@Override
public Iterator<Integer> iterator() {
return new Iterator<Integer>() {
// TODO ajouter une propriété pour le prochain élément
@Override
public boolean hasNext() {
// TODO
return false;
}
@Override
public Integer next() {
if (!hasNext()) {
throw new NoSuchElementException();
}
// TODO
return null;
}
} ;
}
}