Travaux pratiques
147
Éléments traditionnels de Java
Énoncé
1) Éditer, compiler et exécuter tous les programmes du TD n°1 avec l'environnement de développement de Java dont vous disposez
2) Visualiser la documentation de Java
a) Visualiser l’ensemble des packages (ensembles de classes de bases organisées en fonction
de leur domaine d’application)
b) Visualiser le package « java.lang »
Remarque générale pour tous les TP:
Pour pouvoir visualiser le résultat dans Microsoft J++, il faut ajouter une saisie clavier. Pour cela :
1) ajouter après la déclaration de main : throws java.io.IOException 2) ajouter à la dernière ligne de main l'instruction : System.in.read( );
public static void main (String [] args ) throws java.io.IOException { ... System.in.read( ); }
Vous comprendrez la signification plus tard dans le cours!
148
Énoncé
Objets, Classes
1- Définir la classe Date qui permet de représenter le format de date suivant: 16/03/1998. Cette classe doit contenir les méthodes suivantes : nombreJours : Donne le nombre de jours pour le mois d'une Date dateValide : Permet de vérifier si une Date est valide. lendemain : Donne la Date de demain
2- Écrire la méthode main dans une classe TesterDate qui : a) crée une date à partir des valeurs jour, mois et année introduits à partir de la ligne de commande b) affiche cette date sous le format précisé en haut c) si la date est valide
- affiche le nombre de jours du mois de cette date - affiche la date de demain
sinon
Remarques :
- affiche un message d'erreur
1- Respecter le principe de l'encapsulation en déclarant les attributs et les méthodes. 2- Compléter la classe Date par d'autres méthodes si c'est nécessaire
Indication :
Pour transformer une chaîne de caractères s en un int que l'on affecte à une variable entière n on peut écrire :
n = Integer.parseInt(s);
parseInt est une méthode de la classe Integer (classe prédéfinie dans l'API de Java)
149
Compléments sur les objets et les classes
Énoncé
Fournissez la classe Point conçue de manière à ce que le programme suivant fonctionne correctement: class TestPoint {
public static void main (String[ ] args) {
Point p1 = new Point(1.0, 3.0); // Création du point de coordonnées x=1 et y=3 Point p2 = new Point(5.0, 6.0); // Création du point de coordonnées x=5 et y=6
double d = Point.distance(p1,p2);
p1.affiche (1); // affiche : p1 = (1.0 , 3.0) p2.affiche (2); // affiche : p2 = (5.0 , 6.0)
// affiche: Distance entre p1 et p2 System.out.println( "\nDistance entre p1 et p2 = " + d);
}
} Indications : La distance entre deux points (x1,y1) et (x2,y2) est égale à :
La classe prédéfinie Math contient des méthodes static permettant de calculer la racine carré et la
puissance d'un certain nombre, voici la déclaration de ces méthodes :
Class Math {
public static double sqrt(double nb) {…} // retourne la racine carré de nb public static double pow(double nb, double puissance) {…}// retourne nbpuissance //…
}
150
121222yyxxd
Les tableaux
Enoncé
Il s'agit de définir une classe représentant un tableau trié (ordre croissant) d'entiers. La classe appelée TableauTrie aura un attribut privé qui sera un tableau d'entiers.
1) Prévoir deux constructeurs :
Le premier permet d'allouer un tableau dont la capacité est précisée par le programmeur
Le second admet comme paramètre la dimension du tableau à allouer
2) Les méthodes suivantes seront également prévues :
void inserer (int entier) : insère un entier dans le tableau en respectant un ordre croissant sur les entiers.
void retirer (int entier) : retire un entier donnée, si un tel entier est dans le tableau. Si l'entier figure plusieurs fois, une seule occurrence est retirée.
void afficher ( ) : affiche le contenu du tableau avec le message suivant au départ "Ceci est un nouveau affichage".
3) Écrire la classe EssaiTableauTrie qui contient la méthode main permettant de tester la classe TableauTrie contenant les instructions suivantes :
Création d'un tableau de taille 10 Insertion des valeurs 1 3 4 dans le tableau Affichage du tableau Insertion de la valeur 2 dans le tableau Affichage du tableau Insertion de la valeur 0 dans le tableau Affichage du tableau Insertion de la valeur 1 dans le tableau Affichage du tableau Retirer la valeur 1 du tableau Affichage du tableau Retirer la valeur 0 du tableau Affichage du tableau Retirer la valeur 4 du tableau Affichage du tableau
151
Les chaînes de caractères
Enoncé
1) Compléter la classe "Coordonnees" représentant les coordonnées d’une personne avec les champs: nom, prénom, téléphone, adresse. Munissez-la d'un constructeur. class Coordonnees {
private String nom; private String prenom; private String telephone; private String adresse; //…. à compléter
}
2) Compléter la classe "CarnetCoordonnees" représentant un carnet de coordonnées. Elle contiendra: Les attributs privés suivants : - un tableau de coordonnées nommé "carnet" - un entier nommé "nbCoordonnees" représentant le nombre d'éléments de "carnet"
Les méthodes suivantes : - un constructeur pour définir un carnet vide pouvant contenir 100 coordonnées au maximum - void ajouterCoordonnees (Coordonnees c ) : pour ajouter les coordonnées d'une personne dans "carnet" - void chercherCoordonnees (String nom, String prenom) : pour retrouver et afficher les coordonnées d'une personne (téléphone et adresse) à partir de son nom et de son prénom. Si cette méthode ne trouve pas les coordonnées de la personne dans carnet, elle affichera un message d'erreur. - void affiche ( ) : pour afficher toutes les coordonnées se trouvant dans carnet.
Voici la classe qui teste la classe Coordonnees : class Test {
public static void main (String [ ] args) {
CarnetCoordonnees c = new CarnetCoordonnees ( ); c.ajouterCoordonnees(new Coordonnees("Ben Ali", "Mohamed", "233152", "Tunis")); c.ajouterCoordonnees (new Coordonnees("Ben Amor", "Seif", "453689", "Sousse")); c.ajouterCoordonnees (new Coordonnees("Selmani", "Akram", "289563", "Sfax")); c.affiche ( ); c.chercherCoordonnees("Ben Ali", "Mohamed");
}
} // … à compléter
152
Héritage, polymorphisme
Enoncé
Application 1:
a) Etape 1 Créer une classe "Document" comportant les attributs suivant :
String titre, int numId, int nbPages
Créez un constructeur par défaut (ie sans argument) qui initialise le titre à "X", le numéro à –1, le nombre de pages à 0 Créez une méthode edition( ) qui affiche les attributs du Document. Testez votre classe en créant un objet dans la méthode principale et en appelant la méthode edition( ).
b) Etape 2
On veut pouvoir saisir sur la ligne de commande le titre, le numéro d’identification ainsi que le nombre de page pour construire un objet du type document : écrire un deuxième constructeur prenant trois paramètres pour tenir compte de ce besoin.
Dans la méthode principale, en fonction du nombre d’arguments sur la ligne de commande, appelez l’un ou l’autre des constructeurs.
Application 2:
On souhaite gérer une bibliothèque pouvant contenir différents types de documents :
1.
2.
3.
4.
Des documents simples : Ils sont caractérisés par un titre, un numéro
d’identification, le nombre de pages => Réutilisez la classe Document de l'exercice 1 Des articles : Ce sont des documents simples possédant une caractéristique complémentaire, le nom de leur auteur (représentable par un objet de la classe String). Des livres : Ce sont des articles possédant une caractéristique complémentaire, le
nom de leur éditeur (représentable par un objet de la classe String).
Des périodiques : Ce sont des documents simples possédant une caractéristique
complémentaire, leur fréquence de parution ("Mensuel", "Hebdo" ou "Quotidien").
Chaque document possède une méthode edition() qui permet d’afficher à l’écran son type (Livre, Article, ….) et ses caractéristiques.
Chaque document est ajouté lors de sa création dans une bibliothèque (un objet de la classe Biblio). Une classe de test spécifique vous est fournie :
public class Tp2_2 {
public static void main(String args[]) {
Biblio B = new Biblio (); B.ajoute(new Livre("Bilbo le Hobbit", 1, 1368, "Tolkien", "j'ai lu")); B.ajoute(new Periodique("L'Evenement", 2, 70, "Hebdo")); B.ajoute(new Livre("Java par la pratique", 3, 540, "Josh Peck", "O'Reilly")); B.ajoute(new Article("Java est cool", 4, 5, "Toto"));
System.out.println ("La bibliothèque contient "+B.taille()+" documents"); B.afficheContenu (); }
}
153
Voici le squelette de la classe Biblio :
public class Biblio {
private Document[] tabDoc ; private int nbDoc = 0 ; private final int MAXDOC = 50 ;
public Biblio() {
tabDoc = new Document[MAXDOC];
} public void ajoute(Document d) {
… // Ajoute d à la bibliothèque
} public void afficheContenu(){
… // Affiche le contenu de la bibliothèque
} public int taille() { return nbDoc ; }
}
Question : Ecrire les classes Document, Article, Livre, Periodique et Biblio, de manière à ce que la méthode Main de la classe Tp2_2 fonctionne correctement. Utiliser chaque fois que vous le pouvez la référence super.
154
Classes abstraites, Interfaces
Enoncé
Il s'agit de compléter le programme suivant : class Test {
public static void main (String [ ] args) {
Son [ ]listeSons = new Son [2]; Mammifere [ ]listeMammiferes = new Mammifere [2];
Homme h = new Homme("Ali", "Bonjour", 20, false); Chien ch = new Chien("Snoopy", "Wouah!", 2, "caniches");
listeSons [0] = h; listeSons [1] = ch;
listeMammiferes [0] = h; listeMammiferes [1] = ch;
for (int i=0; i<listeSons.length; i++) {
Publicité
listeSons [i].parle ( ); // parle ( ) est polymorphe listeMammiferes [i].vitesse ( ); // vitesse ( ) est polymorphe
}
}
} interface Son {
void parle ( );
}
absract class Mammifere implements Son {
// Attributs String nom, son; int âge;
// Constructeur Mammifere (String nom, String son, int age) {
this.nom = nom; this.son = son; this.age = age;
}
// Méthode parle affiche le son d'un mammifère public void parle ( ) {
System.out.println (son+this);
}
// Méthode abstraite vitesse abstract void vitesse();
//... à compléter
}
155
class Homme extends Mammifere {
boolean marié;
// ... à compléter
}
class Chien extends Mammifere {
String race;
// .... à compléter
}
A l'exécution de Test on obtient à l'écran : Bonjour mon nom est Ali j'ai 20 ans je suis marié Je cours à une vitesse de 20 km/h Wouah! mon nom est Snoopy j'ai 2 ans j'appartient à la race des caniches Je cours à une vitesse de 30 km/h
156
Les exceptions
Enoncé
Soit le programme suivant qui calcule la factorielle d'un entier passé comme paramètre à travers la ligne de commande :
public class TestFact {
public static void main (String [ ] args) {
int n = Integer.parseInt(args[0]); if (n == 0) System.out.println ("La factorielle de "+n+" est: 1"); else {
int f = 1; for (int i=2; i <= n; i++) f = f*i; System.out.println ("La factorielle de "+n+" est: "+f);
}
}
}
Il s'agit de reprendre ce programme pour l'améliorer en attrapant différentes exceptions de façon à préciser la difficulté à l'utilisateur, lorsque le calcul de la factorielle est impossible.
Les exceptions à prévoir sont :
Il n'y a pas de paramètre sur la ligne de commande Le paramètre n'est pas entier Le paramètre est négatif
Pour chacun de ces cas l'erreur doit être signalée de façon précise à l'utilisateur.
Indications :
Si args[0] n'est pas un entier la méthode parseInt lance une exception instance de
NumberFormatException (du package java.lang)
Si l'accès à un tableau se fait avec un indice erroné (indice négatif ou supérieur à la taille du
tableau) une exception instance de ArrayIndexOutOfBoundsException (du package java.lang) est lancée
157
Corrections des travaux pratiques
158
Éléments traditionnels de Java
Remarque: Il n' y a pas de correction pour ce chapitre, il s'agit seulement de se familiariser avec l'environnement de développement Microsoft J++
159
Objets, Classes
Solution
class Date {
// Déclaration des attributs private int jour, mois, annee;
// Constructeur Date (int j, int m, int a) {
jour = j; mois = m; annee = a;
}
// Méthode bissextile : privée car destinée a être utilisée à l'intérieur de cette classe private boolean bissextile ( ) {
if (annee % 4 == 0) return (true); else return (false);
}
// Méthode nombreJours int nombreJours ( ) {
int n; switch (mois) {
case 1 : case 3 : case 5 : case 7 : case 8 : case 10: case 12:
case 2 :
case 4 : case 6 : case 9 : case 11:
default :
n = 31; break; if (bissextile( )) n = 29; else n = 28; break;
n = 30; break; n = 0; break;
} return (n);
}
// Méthode dateValide boolean dateValide ( ) {
if ((jour > 0) && (jour <= nombreJours ( )) && (mois > 0) && (mois <= 12) && (annee > 0))
else
return (true);
return (false);
160
}
// Méthode lendemain Date lendemain ( ) {
Date d = new Date (jour, mois, annee); if (d.jour < nombreJours ( ))
d.jour++;
else {
d.jour = 1; if (d.mois < 12)
d.mois ++;
else {
d.mois = 1; d.annee ++;
}
} return (d);
}
// Méthode accesseur getJour int getJour ( ) {
return (jour);
}
// Méthode accesseur getMois int getMois ( ) {
return (mois);
}
// Méthode accesseur getAnnee int getAnnee ( ) {
return (annee);
}
}
class TesterDate {
public static void main (String [ ] args)
{
// Création d'un objet Date à partir des valeurs jour, mois et annee introduites à // partir de la ligne de commande Date d = new Date (Integer.parseInt(args[0]), Integer.parseInt(args[1]),
Integer.parseInt(args[2]));
// Affichage de la date System.out.println ("Date courante:"+d.getJour( ) + "/" + d.getMois( ) + "/" + d.getAnnee( ));
if (d.dateValide ( )) {
// Affichage du nombre de jours System.out.println ("Nombre de jours de ce mois :"+d.nombreJours( ));
// Affichage de la date de demain
161
System.out.println ("Demain sera: "+d.lendemain( ).getJour( ) + "/" + d.lendemain( ).getMois( ) + "/" + d.lendemain( ).getAnnee( )); // ou encore // Date demain = d.lendemain ( ) ; // System.out.println ("Demain sera: " + demain.getJour( ) + "/" +
demain.getMois( ) + "/" +d.lendemain( ).getAnnee( ));
} else
}
}
System.out.println ("Cette date n'est pas valide");
162
Compléments sur les objets et les classes
Solution
class Point {
// Les attributs private double x, y;
Publicité
// Constructeur Point (double x, double y) {
this.x = x; this.y = y;
} // Méthode distance calcule la distance entre deux points static double distance (Point p1, Point p2) {
double d; d = Math.sqrt(Math.pow((p1.x-p2.x),2.0)+ Math.pow((p1.y-p2.y),2.0)); return (d);
} // Méthode affiche : affiche les coordonnés d'un point void affiche (int n) {
System.out.println ("p"+n+" = "+ "( "+x+" , "+y+" )");
}
}
163
Les tableaux
Solution
class TableauTrie {
// Déclaration des attributs private int [ ] tab ; // Déclaration du tableau private int nbElem ; // Nombre d'éléments du tableau
// Constructeurs TableauTrie (int n) // Dimension indiquée par le constructeur {
tab = new int [n];
}
TableauTrie ( ) {
tab = new int [100]; // Dimension indiquée par le programmeur
}
// Méthode inserer : ajoute un élément au tableau (au bon endroit) void inserer (int entier) {
int i=0, j; if (nbElem < tab.length) {
// Avancer dans le tableau pour chercher la position d'insertion while ((tab[i]<entier) && (i < nbElem)) i++; // Décaler à droite tous les éléments qui vont se trouver après l'élément // à insérer for (j = nbElem; j > i; j--) {
tab[j]= tab[j-1];
} // Insérer l'élément dans le tableau tab [i] = entier;
// Incrémenter le nombre d'éléments du tableau nbElem ++;
}
}
// Méthode retirer : enlève un élément du tableau void retirer (int entier) {
int i; boolean trouve;
// Rechercher l'élément à retirer for (i = 0, trouve = false; ((i < nbElem)&&(trouve == false)); i++) {
if (tab[i] == entier) trouve = true;
}
if (trouve) {
// Écraser l'élément à retirer en effectuant un décalage à gauche de tous
164
// les éléments qui se trouvent à droite de l'élément à retirer while (i < nbElem) {
tab[i-1] = tab[i]; i++;
}
// Décrémenter le nombre d'éléments du tableau nbElem --;
}
}
// Méthode affiche : affiche le contenu du tableau void affiche ( ) {
System.out.println ("Nouveau affichage :"); for (int i=0; i<nbElem; i++)
System.out.println (tab[i]);
}
}
class EssaiTableauTrie {
public static void main (String [ ] args) {
TableauTrie t1 = new TableauTrie (10);
t1.inserer (1); t1.inserer (3); t1.inserer (4); t1.affiche ( ) ;
t1.inserer (2); t1.affiche ( );
t1.inserer (0); t1.affiche ( ) ;
t1.inserer (1); t1.affiche ( ) ;
t1.retirer(1); t1.affiche ( );
t1.retirer(0); t1.affiche ( );
t1.retirer(4); t1.affiche ( ); // on obtient sur écran à la fin : 1 2 3
}
}
165
Les chaînes de caractères
Solution
class Coordonnees {
// Attributs private String nom; private String prenom; private String telephone; private String adresse;
// Constructeur Coordonnees (String nom, String prenom, String telephone, String adresse) {
this.nom = nom; this.prenom = prenom; this.telephone = telephone; this.adresse = adresse;
}
// Accesseur nom String getNom ( ) {
return (nom);
} // Accesseur prenom String getPrenom ( ) {
return (prenom);
}
// Accesseur telephone String getTelephone ( ) {
return (telephone);
}
// Accesseur adresse String getAdresse ( ) {
return (adresse);
}
}
class CarnetCoordonnees {
// Attributs private Coordonnees [ ] carnet ; private int nbCoordonnees ;
// Constructeur CarnetCoordonnees ( ) {
carnet = new Coordonnees [100];
}
// Méthode ajouterCoordonnees : ajoute une coordonnée d'une personne dans carnet void ajouterCoordonnees (Coordonnees c ) {
166
carnet [nbCoordonnees] = c; nbCoordonnees++;
}
// Méthode chercherCoordonnees : affiche l'adresse et le téléphone d'une personne void chercherCoordonnees (String nom, String prenom) {
boolean trouve = false;
for (int i=0; i<nbCoordonnees && !trouve; i++) {
if (nom.equals(carnet[i].getNom( ))&&
prenom.equals(carnet[i].getPrenom( ) ))
{
}
trouve = true; System.out.println ("Nom : "+nom+", Prénom : "+prenom+", Téléphone : "+carnet[i].getTelephone( )+", Adresse : " + carnet[i].getAdresse ( ));
} if (!trouve) System.out.println (nom+" "+prenom+" ne se trouve pas dans le carnet d'adresses");
}
// Méthode affiche : affiche toutes les coordonnées de carnet void affiche ( ) {
for (int i=0; i<nbCoordonnees; i++) {
System.out.println ("Nom :"+carnet[i].getNom( )+", Prénom : " + carnet[i].getPrenom( ) +", Téléphone: "+carnet[i].getTelephone( )+", Adresse : " + carnet[i].getAdresse( ));
}
}
}
167
Héritage, polymorphisme
Solution
Application 1: a) class Document {
String titre; int numId; int nbPages; Document () {
titre = "X"; numId = -1; nbPages = 0;
} Document (String t, int num, int nb) {
titre = t; numId = num; nbPages = nb;
} void edition ( ) {
System.out.println ("Titre = "+ titre); System.out.println ("numId = "+ numId); System.out.println ("nbPages = "+ nbPages);
}
} public class Test {
public static void main (String[] args) {
Document d = new Document( ); d.edition( );
}
}
b) public class Test {
public static void main (String[] args) {
Document d; if (args.length == 0)
Publicité
d = new Document( );
else d = new Document(args[0],Integer.parseInt(args[1]), Integer.parseInt(args[2])); d.edition( );
}
}
Application 2: class Document {
String titre; int numId;
168
int nbPages; Document () {
titre = "X"; numId = -1; nbPages = 0;
} Document (String t, int num, int nb) {
titre = t; numId = num; nbPages = nb;
} void edition () {
System.out.println ("Titre = "+ titre); System.out.println ("numId = "+ numId); System.out.println ("nbPages = "+ nbPages);
}
} class Article extends Document {
String Auteur; String Type = "Article"; Article (String t, int num, int nb, String aut) {
super (t, num, nb); Auteur = aut;
} void edition () {
System.out.println ("Type = "+ Type); super.edition(); System.out.println ("Auteur = "+ Auteur);
}
} class Livre extends Article {
String Editeur; String Type = "Livre";
Livre (String t, int num, int nb, String aut, String edit) {
super (t, num, nb, aut); Editeur = edit;
} void edition ( ) {
System.out.println ("Type = "+ Type); System.out.println ("Titre = "+ titre); System.out.println ("numId = "+ numId); System.out.println ("nbPages = "+ nbPages); System.out.println ("Auteur = "+ Auteur); System.out.println ("Editeur = "+ Editeur);
}
} class Periodique extends Document {
String Frequence; String Type = "Periodique";
169
Periodique (String t, int num, int nb, String freq) {
super (t, num, nb); Frequence = freq;
} void edition ( ) {
System.out.println ("Type = "+ Type); super.edition(); System.out.println ("Fréquence = "+ Frequence);
}
} class Biblio {
private Document [] tabDoc; private int nbDoc = 0; private final int MaxDoc = 50; Biblio() { } void ajoute (Document d) {
tabDoc = new Document[MaxDoc];
tabDoc[nbDoc++] = d;
} void afficheContenu () {
for (int i =0; i<nbDoc; i++) {
System.out.println (); tabDoc[i].edition();
}
} int taille () { return nbDoc;}
} public class Biblio {
public static void main (String[] args) {
Biblio B = new Biblio (); B.ajoute(new Livre("Bilbo le Hobbit", 1, 1368, "Tolkien", "j'ai lu")); B.ajoute(new Periodique("L'Evenement", 2, 70, "Hebdo")); B.ajoute(new Livre("Java par la pratique", 3, 540, "Josh Peck", "O'Reilly")); B.ajoute(new Article("Java est cool", 4, 5, "Toto")); System.out.println ("La bibliothèque contient "+B.taille()+" documents"); B.afficheContenu (); toto t = new toto () { void affiche2 ( ){System.out.println ("titi"); }}; t.affiche ();
}
}
170
Classes abstraites, Interfaces
Solution
interface Son {
void parle ();
}
abstract class Mammifere implements Son {
// Attributs String nom, son; int age;
// Constructeur Mammifere (String nom, String son, int age) {
this.nom = nom; this.son = son; this.age = age;
}
// Méthode parle affiche le son d'un mammifère public void parle ( ) {
System.out.println (son+this);
}
// Méthode abstraite vitesse abstract void vitesse();
// Méthode toString redéfinie public String toString ( ) {
return (" mon nom est "+nom +" j'ai "+age+" ans");
}
}
class Homme extends Mammifere {
boolean marie;
// Constructeur Homme (String nom, String son, int age, boolean marie) {
super (nom, son, age); this.marie = marie;
}
// Implémentation de la méthode vitesse void vitesse ( ) {
System.out.println ("Je cours à une vitesse de 20km/h");
}
// Méthode toString redéfinie public String toString ( ) {
171
if (marie) return (super.toString() +" je suis marie"); else
return (super.toString() +" je suis célibataire");
}
}
class Chien extends Mammifere {
String race;
// Constructeur Chien (String nom, String son, int age, String race) {
super (nom, son, age); this.race = race;
}
// Implémentation de la méthode vitesse void vitesse ( ) {
System.out.println ("Je cours à une vitesse de 30km/h");
}
// Méthode toString redéfinie public String toString ( ) {
return (super.toString ( ) +" j'appartient à la race des "+race) ;
}
}
172
exceptions
Solution
class TestFact {
public static void main(String [ ] args) {
try {
int n = Integer.parseInt(args[0]);
if (n < 0) throw new NombreNegatifException ( );
if (n == 0)
System.out.println ("La factorielle de "+n+" est: 1");
else {
}
int f = 1; for (int i=2; i <= n; i++) f = f*i; System.out.println ("La factorielle de "+n+" est: "+f);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println ("Erreur, il n'y a pas de paramètre sur la ligne de commande!");
} catch (NumberFormatException e) {
System.out.println ("Erreur, le paramètre n'est pas entier!");
} catch (NombreNegatifException e) {
System.out.println ("Erreur, le paramètre est négatif!");
}
}
}
class NombreNegatifException extends Exception { }
173