NFA035 Devoir 1

Ce premier devoir est surtout l'occasion de prendre en main le système de rendu des devoirs.

Rendez le devoir bien avant la date limite, pour anticiper les éventuels problèmes techniques que vous pourriez avoir. Souvenez-vous de ce que vous pouvez effectuer plusieurs rendus. Vous pouvez même faire un premier rendu avec simplement le sujet !

Le devoir ne pourra pas être rendu par mail : passez impérativement par le logiciel de rendu. Si vous avez des problèmes ou des questions sur le rendu des devoirs, n'hésitez pas à nous contacter (par le forum privé).

Connexion

Commencez par vous connecter sur le site de gestion des devoirs. Un compte vous y a été créé. Votre identifiant est l'adresse mail que vous avez sur lecnam.net. Par exemple ada.lovelace.auditeur@lecnam.net.

Pour recevoir un mot de passe, tapez votre identifiant
dans login, et cliquez sur le bouton mot de passe oublié. Un mot de passe temporaire vous sera expédié sur votre mail lecnam.net.
Changez immédiatement de mot de passe (ce mot de passe temporaire n'est
valable qu'une fois). Pour cela connectez-vous, et cliquez le bouton

).

En cas de problème, contactez l'un des enseignants - par le forum privé - il pourra vérifier quel est votre login

Le logiciel de rendu permet de tester votre devoir, et vous donne le nombre de bonnes réponses, avec quelques informations sur vos erreurs. Vous pouvez rendre votre devoir plusieurs fois, seule la dernière tentative sera prise en compte. En revanche, vous êtes limités à trois remises de devoir par jour. Donc n'attendez pas le dernier moment !!!!!!!!!!!!

Il est impératif de respecter la disposition des classes, des packages et leur nom dans le projet, sinon, la vérification échouera (et votre réponse sera considérée comme fausse).

Ne changez jamais l'interface des méthodes que nous vous demandons d'écrire : ne modifiez pas leurs arguments, et n'ajoutez pas de nouvelles exceptions à celles qui sont déclarées. Sinon, les tests ne tourneront pas correctement.

Le logiciel de rendu nous expédie aussi le contenu de votre devoir (les classes java). Nous pourrons le regarder (pour les cas où un test automatique n'est pas adapté, ou pour détecter des plagiats).

Devoir

Téléchargez le sujet du devoir.

On vous demande une méthode capable d'extraire un sous tableau depuis un tableau.

Par exemple, si on a :

char t[] = {'a', 'b', 'c', 'd','e', 'f'};

et qu'on appelle :

char calcule[] = TableauxUtils.sousTableau(t, 1, 3)

On devrait obtenir le tableau {'b', 'c'}.

Si les bornes données « sortent » du tableau d'origine, on renverra la zone de celui-ci qui est entre les indices qui sont passés.

Par exemple, pour

char t[] = {'a', 'b', 'c'};
char calcule[] = TableauxUtils.sousTableau(t, 1, 100)

On obtiendra {'b', 'c'};, ce qui correspond aux cases de t dont l'indice est compris entre 1 et 100.

Cette contrainte est valable, même quand elle conduit à un tableau vide :

char t[] = {'a', 'b', 'c'};
char calcule[] = TableauxUtils.sousTableau(t, 30, 100)

donnera {} (un tableau de taille 0).

La spécification de la méthode est précisée par sa javadoc ; les tests répondront aussi à pas mal de vos questions.

/**
 * Retourne un sous-tableau avec les éléments compris entre deux indices.
 * 
 * <p> pré-requis :
 * <ul>
 * <li> original n'est pas nul ;
 * <li> debut est inférieur ou égal à fin
 * <li> debut est supérieur ou égal à zéro.
 * </ul>
 * 
 * <p> post-condition :
 * <ul>
 * <li> retourne un tableau contenant tous les éléments de original dont les indices sont compris entre début (inclus) et fin (exclu).
 * <li> si les indices <code>debut</code> et <code>fin</code> "sortent" des bornes du tableau <code>original</code>, ça n'est pas une erreur.
 * <li> original n'est pas modifié (c'est souvent une condition implicite des méthodes)
 * </ul>
 * 
 * <p> traitements d'erreur :
 * <ul>
 * <li> lève NullPointerException si <code>original</code> est nul ;
 * <li> lève IllegalArgumentException si <code>debut</code> est inférieur strict à 0 ou est supérieur strict à <code>fin</code>
 * @param original
 * @param debut
 * @param fin
 * @return
 */
public static char [] sousTableau(char [] original, int debut, int fin)

Pour vous aider, on vous fourni les tests qui seront lancés (dans la classe TestPourVousGuider).

Important : vous n'avez pas le droit d'utiliser des méthodes de ArrayList ni de String ni de Arrays ni System.ArrayCopy pour ce devoir. Bref, il faut écrire l'algorithme à la main.

Dans les tests, pour gagner du temps, j'ai défini une fonction verifierCalcul qui appellera votre méthode en lui passant des tableaux de char. Mais comme il est plus rapide et agréable d'écrire String s = "abc" que char t[] = {'a', 'b', 'c'}, cette fonction prend comme argument des Strings qu'elle transforme en tableaux.

Voici un exemple de test simple : pour le tableau {'a', 'b', 'c', 'd', 'e', 'f', 'g'}, un appel de la méthode avec comme paramètres 2 et 5 doit renvoyer le tableau {'c', 'd', 'e'}.

@Test
public void testCasStandard() {
	verifierCalcul("cas standard",
			"cde",
			"abcdefg",
			2, 5);
}

et voici la fonction verifierCalcul (pour information) :

private void verifierCalcul(
		String message,
		String expected, String original, int debut, int fin) {
	char expectedTab[] = expected.toCharArray();
	char originalTab[] = original.toCharArray();
	char originalCopyTab[] = original.toCharArray();
	char[] computedTab = TableauxUtils.sousTableau(originalTab, debut, fin);
	assertArrayEquals(message, expectedTab, computedTab);
}

Je m'aperçois en passant que j'ai oublié de vérifier

assertArrayEquals(message, originalCopyTab, originalTab);

mais d'un autre côté, sur cet exercice, il est très peu probable que vous touchiez au contenu du tableau d'origine.

Utilisation du logiciel de rendu (depuis eclipse)

Commencez par faire le devoir. Utilisez les tests inclus pour vous aider (et pour lever certaines ambiguïtés).

S'il vous affiche que vous avez N tests et 0 erreurs, tout est bon. Si votre projet contient des erreurs, vous aurez le nombre d'erreurs et quelques indications sur les erreurs.