27 0 519KB
Programmation Java Enseignant : Mr Ziyati
Travaux Pratiques Exercice 1 Ecrivez un programme Java qui répond aux contraintes suivantes : •
Le programme doit demander à l'utilisateur de saisir un nombre
•
Tant que l'utilisateur ne saisi pas 'exit' : o Analyser la saisie et vérifier qu'elle correspond à un nombre entier ▪ Si c'est ok, afficher des informations sur le nombre saisi ▪ Afficher si le nombre est positif, négatif ou zéro ▪ ▪
•
Afficher si le nombre est pair ou impair (zéro est pair)
Si ce n'est pas le cas, afficher un message d'erreur
Si 'exit' a été saisi, quitter le programme
Exercice 2 Partie 1 Une petite entreprise de produits chimiques souhaite informatiser la gestion du calcul du salaires de ses employés. Cet exercice a pour but la réflexion et la pratique autour des problématiques de programmation orientées objets. En effet afin permettre à cette entreprise d'informatiser le calcul des salaires, il faut tout d'abord construire une hierarchie d'objets permettant de représenter ses salariés. Lors de votre entretien avec le directeur, vous notez les contraintes suivantes : •
Tout employé est caractérisé par son nom, son prénom, son âge, et sa date d'entrée en service
•
Tout employé a un salaire mensuel calculé selon le poste qu'il occupe dans l'entreprise
•
Les types d'employés o Vendeur : Son salaire est calculé avec 20% du chiffre d'affaire qu'il a effectué dans le mois, plus une prime fixe de 400€
•
o
Représentant : Son salaire est calculé avec 20% du chiffre d'affaire qu'il a effectué dans le mois, plus une prime fixe de 800€
o
Producteur : Son salaire est calculé avec le nombre d'unités produites dans le mois multiplié par un taux fixe de 5€
o
Manutentionnaire : Son salaire est calculé avec le nombre d'heures effectuées dans le mois multiplié par un taux fixe de 65€
Certains employés des secteurs production et manutention sont appelés à manipuler des produits dangereux o Une prime fixe de 200€ est ajoutée à leur salaire mensuel
Programmation Java Enseignant : Mr Ziyati
•
Le programme doit permettre de gérer une collection d'employés à partir de laquelle on peut afficher de détails des salaires de chaque employés, mais aussi le salaire moyen.
Le code suivant doit permettre de tester le programme :
Résultat attendu :
Partie 2 Lorsque vous montrez au directeur le résultat de votre programme permettant d'afficher les salaires, il est content mais il y a un problème... Il a oublié de vous parler du fait que la société travaille avec des indépendants, et leur factures doivent entrer en compte dans le calcul des salaires. Vous récupérez les informations suivantes sur les indépendants : •
Ils sont caractérisés par un nom et un numéro SIREN, ainsi qu'une liste de facture pour le mois courant
•
L'équivalent de leur salaire se calcul avec la somme des factures qui lui sont associées
•
Une facture est caractérisée par une date, une somme en euros, et un libellé représentant la nature de la prestation
Programmation Java Enseignant : Mr Ziyati
•
Les factures dont le libellé commence par "Frais de déplacement - " ne doivent pas être prises en compte dans le calcul du salaire d'un indépendant
A la fin de votre entretien, vous récupérez une information supplémentaire de dernière minute. Le directeur aimerait avoir l'affichage du nom complet de l'employé lors de l'affichage de son salaire, et si il est indépendant, cela doit être facilement reconnaissable. Exemple: •
Employé salarié -> getNom() -> "Employé Jean Rigol : xxxx €"
•
Employé indépendant -> getNom() -> "Indépendant Jean Peplu : xxxx €"
Exercice 3 Regardez les classes du package fr.formation.exo3 et essayez de prédire l'affichage que doit donner l'exécution de la méthode main() dans la classe Alphabet. Une attention particulière devra être portée sur le polymorphisme utilisé dans la hierarchie des classes A, B et C, qui démontre une situation de "shadowing" entre B.b et C.b.
Exercice 4 Dans la classe ErreurMethodes ci-dessous, les méthodes methode1 à methode8 comportent chacune une erreur de syntaxe. Trouvez ces erreurs en utilisant vos connaissances de la syntaxe du langage Java. Si vous sollicitez l'aide du compilateur pour trouver les erreurs, sachez qu'il aura de la peine avec ce type de programme où il y a beaucoup d'erreurs de structure. Il peut vous montrer la ligne approximative où se trouve une erreur, mais la solution proposée n'est pas toujours correcte, la liste des erreurs n'est pas toujours complète et les erreurs ne sont pas présentées dans le bon ordre. Dans ce genre de situation, utilisez surtout votre bon sens et vos propres connaissances de la syntaxe de Java. class ErreursMethodes { public static void main (String[] args) { int i1 = methode1(); int i2 = methode2(); int i3 = methode3(); int i4 = methode4(); methode5(); methode6(); methode7(); methode8(); } static int methode1 { int a = 0; System.out.println("Méthode 1"); return a; } static int methode2 () { int a = 0; i1 = 10; System.out.println("Méthode 2");
Programmation Java Enseignant : Mr Ziyati
return a; } static int methode3 () { int a = 0; System.out.println("Méthode 3"); } static int methode4 () { String a = "0"; System.out.println("Méthode 4"); return a; } static void methode5 () { double a = 0; System.out.println("Méthode 5"); return a; } static methode6 () { double a = 0; System.out.println("Méthode 6"); return a; } static void methode7 () { int a = 0; double b = 5.5; methodeSansErreur(a); System.out.println("Méthode 7"); } static void methode8 () { int a = 0; String b = "5.5"; methodeSansErreur(a, b); System.out.println("Méthode 8"); } static void methodeSansErreur (int a, double b) { // Cette méthode ne fait rien du tout } }
Exercice 5 Enoncé à venir...
Exercice 6 Ecrire un programme java capable de demander la saisie de la longueur et la largeur d'un rectangle, puis d'afficher les valeurs de périmètre et d'air de ce rectangle. Exemple du résultat de l'exécution : Entrez la largeur: ... Entrez la hauteur: ... Surface ('s/S') ou perimètre ('p/P') ?: ... La surface est ...
Programmation Java Enseignant : Mr Ziyati
Les méthodes du programme devront être bien séparées, de manière à respecter l'exemple suivant : public static void main(String args[]) { double width = readInput("Largeur ?"); double length = readInput("Hauteur ?"); boolean inputsOk = testInputs(width, length); if (inputsOk) { calculate(width, length); } else { displayError(); } }
Exercice 7 Implémentez un algorithme vous permettant de permuter les valeurs de deux variables. Exemple d'exécution: Entrez x: 1 Entrez y: 2 Avant permutation: x: 1 y: 2 Après permutation: x: 2 y: 1
Exercice 8 Expliquez pourquoi les résultats obtenus par les classes Moyenne1 et Moyenne2 sont différents. class Moyenne1 { public static void main(String[] args) { double noteProgrammation = 6.0; double noteAlgebre = 5.0; System.out.println("Ma moyenne est " + (noteProgrammation++ + noteAlgebre) / 2.0 ); } } class Moyenne2 { public static void main(String[] args) { double noteProgrammation = 6.0; double noteAlgebre = 5.0; System.out.println("Ma moyenne est " + (++noteProgrammation + noteAlgebre) / 2.0 ); } }
Exercice 9 Écrivez un petit programme Java, Degre3.java, vous permettant d'évaluer un polynôme du3ème degré de la forme: ((a+b)/2)x^3 + (a+b)^2 * x^2 + a + b + c Exemple d'exécution: Entrez a (int) : 1 Entrez b (int) : 2
Programmation Java Enseignant : Mr Ziyati
Entrez c (int) : 3 Entrez x (double) : 3.5 La valeur du polynôme est : 180.5625
Utilisez Math.pow(a, b) pour calculer des puissances.
Exercice 10 Expliquez pourquoi le résultat à l'affichage du programme ci-dessous est toujours "China blue" et non "China blue Express". class ConcatIncorrecte { public static void main(String[] args) { String s = "China Blue"; System.out.println(s); concat(s, " Express"); System.out.println(s); } public static void concat(String s, String s2) { s +=s2; } }
Exercice 11 Votre grand-mère possède une superbe collection d'ustensiles anciens ayant beaucoup de valeur, et elle aimerait pouvoir les référencer et connaître leurs valeurs. Pour ce faire, vous lui proposez d'écrire un programme Java. Comme votre grand-mère ne veut pas mettre les deux pieds dans le plat et écrire du code Java, vous lui demandez de lister ses ustensile dans le tableau suivant : Type
Année Cote
Assiette ronde
1926
8.4
cuillière
1881
7.3
Assiette carré
1935
5.6
cuillière
1917
8.8
Assiette ronde
1837
5.4
Bol
1799 "Happy, Not happy"
. Votre programme Java devra donc lire ce fichier pour acquérir les données nécessaire à l'exécution du programme.
Partie 1 : Définir les objets représentant les ustensiles
Programmation Java Enseignant : Mr Ziyati
Pour commencer, il faut réfléchir à la hierarchie d'objets permettant de représenter les différents ustensiles. Vous avez les informations suivantes sur ceux-ci : •
Tout ustensile possède une année de fabrication
•
La valeur de l'ustensile se calcul comme suit : o S'il a été fabriqué il y a moins de 50 ans, il ne vaut rien (0) o S'il a été fabriqué il y a plus de 50 ans, sa valeur est égale à anneeCourante anneeFabrication - 50
o •
Une assiette est un type d'ustensile et peut être de forme carré ou ronde o Une assiette ronde a un rayon qui permet de calculer sa surface o
•
Les assiettes carrés sont particulière car plus rare, leur valeur est de 5 fois sa valeur si elle était ronde
Une assiette carré a une cote qui permet de calculer sa surface
Une cuillère a une longueur
Partie 2 : Lire un fichier de type tableur Le document comportant les données est un "spreadsheet" en ligne qui est lisible par une API Java spéciale, mais nous allons préférer pratiquer la lecture d'un fichier CSV (Comma Separated Values) qui ne nécessite pas de librairie supplémentaire. Une fois sur le document google de la liste des ustensiles, vous pouvez faire un export CSV depuis le menu Fichier->Télécharger au format->Valeurs séparées par des virgules. Une fois le fichier CSV ajouté à votre projet, il faut maintenant écrire le code Java permettant de le lire et d'analyser ("parsing") les données. Aide : •
•
Pour lire un fichier, on a besoin d'un objet Java qui représente un flux d'entrée (java.io.InputStream) o On distingue deux moyens principaux : ▪ Par le système new java.io.File(path) puis new java.io.FileInputStream(path) ▪ Par le classpath java.lang.ClassLoader.getResourceAsStream(path). A vous de choisir la méthode la plus adaptée dans ce projet. N'oubliez pas que le fichier est sensé évoluer au fur et à mesure que votre grand-mère les référence. o Il faut ensuite utiliser un objet qui hérite de la classe abstraite java.io.Reader afin de lire dans le flux ▪ Selon le type de flux que vous avez récupéré, il faut utiliser l'objet reader adapté o On encapsule ensuite le reader dans une classe un peu plus avancée permettant de lire des lignes complètes dans le flux : java.io.BufferedReader Il faut ensuite transformer ces données récupérées pour chaque ligne sous forme de chaînes de caractères (java.util.List) o Chaque ligne récupérée dans le fichier correspond à un objet d'ustensile o Chaque colonne de la ligne est séparée par le caractère ','. Il faut donc utiliser la méthode java.lang.String.split()
Programmation Java Enseignant : Mr Ziyati
o
La colonne type permet de déterminer quelle classe utiliser
Partie 3 : Afficher les données demandées Votre grand-mère aimerait avoir les informations suivantes lorsqu'elle lance le programme : •
Le nombre total de cuillères
•
La surface totale de toutes les assiettes o Pour une assiette ronde : Math.PI * rayon * rayon o Pour une assiette carré : cote * cote
•
La valeur totale de tous les ustensiles
Exemple de résultat d'exécution : Il y a 2 cuillères. Surface totale des assiettes : 344.63961941597415 Valeur totale de la collection : 395.0