Entrer des données lors de l'exécution en console
rapidegoyes Messages postés 92 Date d'inscription samedi 22 février 2020 Statut Membre Dernière intervention 16 octobre 2024 - 26 sept. 2024 à 22:26
- Entrer des données lors de l'exécution en console
- Rechercher ou entrer l'adresse - Guide
- Entrer les informations d'identification reseau - Guide
- Adresse IP locale : comment la trouver facilement - Guide
- Entrer des coordonnées gps - Guide
- Reinstaller windows sans perte de données - Guide
12 réponses
24 août 2024 à 10:37
Bonjour
as tu lu la doc ?
https://docs.oracle.com/javase/8/docs/api/java/util/Scanner.html
Modifié le 24 août 2024 à 23:20
Bonsoir,
J'ai consulté la doc merci pour le lien.
j'en suis venu à l'essai suivant, je lis un fichier avec une ligne comprenant les chiffres que je devrais entrer comme paramètres à mon objet.
Ma variable ligne est insoluble?
Comme j'ai tout déclaré au niveau des variables et constructeur en int , lors d'un autre essai j'avais appliqué la méthode parseInt(), ma variable ligne reste toujours insoluble!
Pourtant le fichier est lu
voici mon essai
public static void main(String[] args) throws FileNotFoundException { // TODO Auto-generated method stub String nom_fichier = "data.txt"; try (Scanner scanner = new Scanner(new File(nom_fichier))) { while (scanner.hasNext()) { String ligne = scanner.nextLine(); System.out.println(ligne); } } Jour1Mesure1 Jour1 = new Jour1Mesure1(ligne);//(matin et soir ) //Jour1Mesure1 Jour1 = new Jour1Mesure1(144, 140, 135, 155, 141, 146, 85, 77, 74, 97, 97, 92, 0, 0, 0, 0, 0, 0);//(matin et soir ) Jour1.calculMoyenneJour1(); Jour1.calculmoyenneDiasJour1(); // regroupelesObjets(); }//fin de la méthode main
mon message d'erreur ci dessous:
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
ligne cannot be resolved to a variable
at autoMesureTension/autoMesureTension.ReleveTension.main(ReleveTension.java:72)
Y aurait-il une autre façon de procéder.
Je ne suis pas un étudiant mais un retraité qui se passionne pour java !
Merci de bien vouloir m'épauler
cordialement à +++
rapidegoyes
25 août 2024 à 08:37
Bonjour,
La seule erreur que je vois dans ton code (incomplet) c'est celle-ci :
Jour1Mesure1 Jour1 = new Jour1Mesure1(ligne);//(matin et soir )
J'imagine que cela correspond à la ligne 72 indiquée en erreur par le compilateur.
Le problème c'est la portée de ta variable "ligne" qui est déclarée à l'intérieur de ta boucle while et que tu essayes d'utiliser après.
C'est une règle générale de Java (et de la plupart des langages de programmation), ce qui est créé à l'intérieur d'un bloc { } ne peut être utilisé qu'à l'intérieur de celui-ci et est détruit (libération de mémoire etc.) une fois le bloc fermé.
Pour t'aider sur la lecture de ton fichier data.txt il faudrait voir comment il est construit : Est-ce qu'il contient uniquement les chiffres que tu veux utiliser ou est-ce qu'il y a d'autres données à exclure ? Est-ce que les chiffres sont tous sur la même ligne (séparés par des espaces par exemple) ou chacun sur une ligne différente ? Peut-être un mélange des deux avec plusieurs lignes de plusieurs de chiffres, chacun représentant des données différentes comme un tableau ?
Je n'ai pas la visibilité non plus sur la structure de ta classe Jour1Mesure1, mais pour moi soit tu créés ton objet avec aucune donnée et ton fichier vient l'enrichir via une méthode "ajouterLigneDonnee" soit ton fichier vient enrichir une liste que tu passes en paramètre d'un nouveau constructeur.
Exemples :
Jour1Mesure1 jour1 = new Jour1Mesure1(); try (Scanner scanner = new Scanner(new File("data.txt"))) { while (scanner.hasNextLine()) { jour1.ajouterDonnee(scanner.nextLine()); } }
List<String> lignes = new ArrayList<>(); try (Scanner scanner = new Scanner(new File("data.txt"))) { while (scanner.hasNextLine()) { lignes.add(scanner.nextLine()); } } Jour1Mesure1 jour1 = new Jour1Mesure1(lignes);
Remarque : ce dernier code peut se simplifier sans utiliser Scanner
List<String> lignes = Files.readAllLines(new File("data.txt").toPath()); Jour1Mesure1 jour1 = new Jour1Mesure1(lignes);
Modifié le 25 août 2024 à 16:08
Bonjour,
Je m'excuse pour le malentendu que j'ai causé, à l'origine je pensais entrer les chiffres à la main pendant l'exécution du code.
A force de chercher et consulter la doc l'idée m'était venu de rentrer les données à l'aide d'un fichier.
Je n'abandonne pas cette première tentative, et vais essayer de suivre l'aide fournie par KX que je remercie pour son soutient. L'un n'empêche pas l'autre!!!
voici tout mon code que j'ai bricolé:
package autoMesureTension; import java.util.Scanner; //class mére public class ReleveTension { //les champs ou variables initialisées int systoliqueMatin1= 0; int systoliqueMatin2 = 0; int systoliqueMatin3 = 0; int diastoliqueMatin1 = 0; int diastoliqueMatin2 = 0; int diastoliqueMatin3 = 0; int systoliqueSoir1 = 0; int systoliqueSoir2 = 0; int systoliqueSoir3 = 0; int diastoliqueSoir1 = 0; int diastoliqueSoir2 = 0; int diastoliqueSoir3 = 0; static int moyenneSysJour = 0; static int moyenneSysJour2 = 0; static int moyenneSysJour3 = 0; static int moyenneDiasJour = 0; static int moyenneDiasJour2= 0; static int moyenneDiasJour3 = 0; //constructeur public ReleveTension(int systoliqueMatin1, int systoliqueMatin2, int systoliqueMatin3, int systoliqueSoir1, int systoliqueSoir2, int systoliqueSoir3, int diastoliqueMatin1, int diastoliqueMatin2, int diastoliqueMatin3, int diastoliqueSoir1, int diastoliqueSoir2,int diastoliqueSoir3, int moyenneSysJour, int moyenneSysJour2, int moyenneSysJour3, int moyenneDiasJour, int moyenneDiasJour2, int moyenneDiasJour3) { this.systoliqueMatin1 = systoliqueMatin1; this.systoliqueMatin2 = systoliqueMatin2; this.systoliqueMatin3 = systoliqueMatin3; this.diastoliqueMatin1 = diastoliqueMatin1; this.diastoliqueMatin2 = diastoliqueMatin2; this.diastoliqueMatin3 = diastoliqueMatin3; this.systoliqueSoir1 = systoliqueSoir1; this.systoliqueSoir2 = systoliqueSoir2; this.systoliqueSoir3 = systoliqueSoir3; this.diastoliqueSoir1 = diastoliqueSoir1; this.diastoliqueSoir2 = diastoliqueSoir2; this.diastoliqueSoir3 = diastoliqueSoir3; }// fin du constructeur public static void main(String[] args) { // TODO Auto-generated method stub regroupelesObjets(); }//fin de la méthode main public static void regroupelesObjets() { //essai non concluant /*Scanner sc = new Scanner(System.in); System.out.println("Veuillez saisir un mot :"); int tensions = sc.nextInt(); System.out.println("Vous avez saisi : " + tensions); Jour1Mesure1 Jour1 = new Jour1Mesure1(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);*/ Jour1Mesure1 Jour1 = new Jour1Mesure1(144, 140, 135, 155, 141, 146, 85, 77, 74, 97, 97, 92, 0, 0, 0, 0, 0, 0);//(matin et soir ) Jour1.calculMoyenneJour1(); Jour1.calculmoyenneDiasJour1(); Jour2Mesure2 Jour2 = new Jour2Mesure2(147, 155, 141, 150, 143, 129, 94, 97, 90, 90, 83, 85, 0, 0, 0, 0, 0, 0);//(matin et soir ) Jour2.calculMoyenneJour2(); Jour2.calculmoyenneDiasJour2(); Jour3Mesure3 Jour3 = new Jour3Mesure3(137, 137, 132, 142, 136, 138, 90, 87, 88, 90, 83, 83, 0, 0, 0, 0, 0, 0);//(matin et soir ) Jour3.calculMoyenneJour3(); CalculMoyenneGenerale MoyenneTension = new CalculMoyenneGenerale(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); MoyenneTension.formuleMoyenneGenerale(moyenneSysJour, moyenneSysJour2, moyenneSysJour3); MoyenneTension.formuleMoyenneGénéDias(moyenneDiasJour, moyenneDiasJour2, moyenneDiasJour3); }//fin de la methode regroupeLesObjets //mesures du jour1 public int moyennesSystoluiqueJour(int systoliqueMatin1, int systoliqueMatin2,int systoliqueMatin3, int systoliqueSoir1, int systoliqueSoir2, int systoliqueSoir3) { moyenneSysJour = (systoliqueMatin1 + systoliqueMatin2 + systoliqueMatin3 + systoliqueSoir1 + systoliqueSoir2 + systoliqueSoir3) /6; System.out.println("Mesures jour1"); System.out.println("salut la moyenne systolique du jour 1 = " + moyenneSysJour); return moyenneSysJour; } public int moyenneDiastoliqueJour1(int diastoliqueMatin1, int diastoliqueMatin2, int diastoliqueMatin3, int diastoliqueSoir1, int diastoliqueSoir2, int diastoliqueSoir3) { moyenneDiasJour = ( diastoliqueMatin1 + diastoliqueMatin2 + diastoliqueMatin3 + diastoliqueSoir1 + diastoliqueSoir2 + diastoliqueSoir3) /6; System.out.println("salut la moyenne diastolique du jour 1 = " + moyenneDiasJour); System.out.println(); System.out.println("Mesures jour2"); return moyenneDiasJour; }//fin mesures du jour1 //mesures du jour 2 public int moyennesSystoluiqueJour2(int systoliqueMatin1, int systoliqueMatin2,int systoliqueMatin3, int systoliqueSoir1, int systoliqueSoir2, int systoliqueSoir3) { moyenneSysJour2 = (systoliqueMatin1 + systoliqueMatin2 + systoliqueMatin3 + systoliqueSoir1 + systoliqueSoir2 + systoliqueSoir3) /6; System.out.println("salut la moyenne systolique du jour 2 = " + moyenneSysJour2); return moyenneSysJour2; } public int moyenneDiastoliqueJour2(int diastoliqueMatin1, int diastoliqueMatin2, int diastoliqueMatin3, int diastoliqueSoir1, int diastoliqueSoir2, int diastoliqueSoir3) { moyenneDiasJour2 = ( diastoliqueMatin1 + diastoliqueMatin2 + diastoliqueMatin3 + diastoliqueSoir1 + diastoliqueSoir2 + diastoliqueSoir3) /6; System.out.println("salut la moyenne diastolique du jour 2 = " + moyenneDiasJour2); System.out.println(); System.out.println("Mesures jour3"); return moyenneDiasJour2; }//fin mesures du jour2 //mesures du jour 3 public int moyennesSystoluiqueJour3(int systoliqueMatin1, int systoliqueMatin2,int systoliqueMatin3, int systoliqueSoir1, int systoliqueSoir2, int systoliqueSoir3) { moyenneSysJour3 = (systoliqueMatin1 + systoliqueMatin2 + systoliqueMatin3 + systoliqueSoir1 + systoliqueSoir2 + systoliqueSoir3) /6; System.out.println("salut la moyenne systolique du jour 3 = " + moyenneSysJour3); return moyenneSysJour3; } }//fin de la class Mére ReleveTension
suite
package autoMesureTension; public class Jour1Mesure1 extends ReleveTension{ public Jour1Mesure1(int systoliqueMatin1, int systoliqueMatin2, int systoliqueMatin3, int systoliqueSoir1, int systoliqueSoir2, int systoliqueSoir3, int diastoliqueMatin1, int diastoliqueMatin2, int diastoliqueMatin3, int diastoliqueSoir1, int diastoliqueSoir2, int diastoliqueSoir3, int moyenneSysJour, int moyenneSysJour2, int moyenneSysJour3, int moyenneDiasJour, int moyenneDiasJour2, int moyenneDiasJour3) { super(systoliqueMatin1, systoliqueMatin2, systoliqueMatin3, systoliqueSoir1, systoliqueSoir2, systoliqueSoir3, diastoliqueMatin1, diastoliqueMatin2, diastoliqueMatin3, diastoliqueSoir1, diastoliqueSoir2, diastoliqueSoir3, moyenneSysJour, moyenneSysJour2, moyenneSysJour3, moyenneDiasJour, moyenneDiasJour2, moyenneDiasJour3); // TODO Auto-generated constructor stub } void calculMoyenneJour1() { super.moyennesSystoluiqueJour(systoliqueMatin1, systoliqueMatin2, systoliqueMatin3, systoliqueSoir1, systoliqueSoir2, systoliqueSoir3); } void calculmoyenneDiasJour1(){ super.moyenneDiastoliqueJour1(diastoliqueMatin1, diastoliqueMatin2, diastoliqueMatin3, diastoliqueSoir1, diastoliqueSoir2, diastoliqueSoir3); } }
suite
package autoMesureTension; public class Jour2Mesure2 extends ReleveTension{ public Jour2Mesure2(int systoliqueMatin1, int systoliqueMatin2, int systoliqueMatin3, int systoliqueSoir1, int systoliqueSoir2, int systoliqueSoir3, int diastoliqueMatin1, int diastoliqueMatin2, int diastoliqueMatin3, int diastoliqueSoir1, int diastoliqueSoir2, int diastoliqueSoir3, int moyenneSysJour, int moyenneSysJour2, int moyenneSysJour3, int moyenneDiasJour, int moyenneDiasJour2, int moyenneDiasJour3) { super(systoliqueMatin1, systoliqueMatin2, systoliqueMatin3, systoliqueSoir1, systoliqueSoir2, systoliqueSoir3, diastoliqueMatin1, diastoliqueMatin2, diastoliqueMatin3, diastoliqueSoir1, diastoliqueSoir2, diastoliqueSoir3, moyenneSysJour, moyenneSysJour2, moyenneSysJour3, moyenneDiasJour, moyenneDiasJour2, moyenneDiasJour3); // TODO Auto-generated constructor stub } void calculMoyenneJour2() { super.moyennesSystoluiqueJour2(systoliqueMatin1, systoliqueMatin2, systoliqueMatin3, systoliqueSoir1, systoliqueSoir2, systoliqueSoir3); } void calculmoyenneDiasJour2(){ super.moyenneDiastoliqueJour2(diastoliqueMatin1, diastoliqueMatin2, diastoliqueMatin3, diastoliqueSoir1, diastoliqueSoir2, diastoliqueSoir3); } }
suite
package autoMesureTension; public class Jour3Mesure3 extends ReleveTension{ public Jour3Mesure3(int systoliqueMatin1, int systoliqueMatin2, int systoliqueMatin3, int systoliqueSoir1, int systoliqueSoir2, int systoliqueSoir3, int diastoliqueMatin1, int diastoliqueMatin2, int diastoliqueMatin3, int diastoliqueSoir1, int diastoliqueSoir2, int diastoliqueSoir3, int moyenneSysJour, int moyenneSysJour2, int moyenneSysJour3, int moyenneDiasJour, int moyenneDiasJour2, int moyenneDiasJour3) { super(systoliqueMatin1, systoliqueMatin2, systoliqueMatin3, systoliqueSoir1, systoliqueSoir2, systoliqueSoir3, diastoliqueMatin1, diastoliqueMatin2, diastoliqueMatin3, diastoliqueSoir1, diastoliqueSoir2, diastoliqueSoir3, moyenneSysJour, moyenneSysJour2, moyenneSysJour3, moyenneDiasJour, moyenneDiasJour2, moyenneDiasJour3); // TODO Auto-generated constructor stub } void calculMoyenneJour3() { //avec super appel de cette méthode moyennesSystoluiqueJour3 depuis la classe mère super.moyennesSystoluiqueJour3(systoliqueMatin1, systoliqueMatin2, systoliqueMatin3, systoliqueSoir1, systoliqueSoir2, systoliqueSoir3); //appel de la méthode moyenneDiastoliqueJour3 ci-dessous spécialisation de la classe Jour3Mesure3 autre façon //de coder au lieu de marquer cette méthode dans la classe mère ReleveTension moyenneDiastoliqueJour3(diastoliqueMatin1, diastoliqueMatin2, diastoliqueMatin3, diastoliqueSoir1, diastoliqueSoir2, diastoliqueSoir3); } public int moyenneDiastoliqueJour3(int diastoliqueMatin1, int diastoliqueMatin2, int diastoliqueMatin3, int diastoliqueSoir1, int diastoliqueSoir2, int diastoliqueSoir3) { moyenneDiasJour3 = ( diastoliqueMatin1 + diastoliqueMatin2 + diastoliqueMatin3 + diastoliqueSoir1 + diastoliqueSoir2 + diastoliqueSoir3) /6; System.out.println("salut la moyenne diastolique du jour 3 = " + moyenneDiasJour3); System.out.println(); return moyenneDiasJour3; }//fin mesures du jour 3 }
suite
package autoMesureTension; public class CalculMoyenneGenerale extends ReleveTension{ public CalculMoyenneGenerale(int systoliqueMatin1, int systoliqueMatin2, int systoliqueMatin3, int systoliqueSoir1, int systoliqueSoir2, int systoliqueSoir3, int diastoliqueMatin1, int diastoliqueMatin2, int diastoliqueMatin3, int diastoliqueSoir1, int diastoliqueSoir2, int diastoliqueSoir3, int moyenneSysJour, int moyenneSysJour2, int moyenneSysJour3, int moyenneDiasJour, int moyenneDiasJour2, int moyenneDiasJour3) { super(systoliqueMatin1, systoliqueMatin2, systoliqueMatin3, systoliqueSoir1, systoliqueSoir2, systoliqueSoir3, diastoliqueMatin1, diastoliqueMatin2, diastoliqueMatin3, diastoliqueSoir1, diastoliqueSoir2, diastoliqueSoir3, moyenneSysJour, moyenneSysJour2, moyenneSysJour3, moyenneDiasJour, moyenneDiasJour2, moyenneDiasJour3); // TODO Auto-generated constructor stub } public int formuleMoyenneGenerale(int moyenneSysJour, int moyenneSysJour2, int moyenneSysJour3 ) { int moyenneGeneraleTension = (moyenneSysJour + moyenneSysJour2 + moyenneSysJour3) /3; System.out.println("Moyenne générale Systolique: " + moyenneGeneraleTension ); System.out.println(); return moyenneGeneraleTension; } public int formuleMoyenneGénéDias(int moyenneDiasJour, int moyenneDiasJour2, int moyenneDiasJour3) { int moyenneGeneraleDiastolique = (moyenneDiasJour + moyenneDiasJour2 + moyenneDiasJour3) /3; System.out.println("Moyenne générale Diastolique: " + moyenneGeneraleDiastolique ); return moyenneGeneraleDiastolique; } }
je suis toujours à la recherche d'une solution pour entrer les données à la main en exécution du code en console
Ce code fonctionne sans problème sauf que les chiffres sont déjà présent dans le code, et que j'aimerai entrer à l'exécution de l'appli, ce qui me pose un problème vu mon niveau de connaissance en java ou autre langage!
merci à tous pour votre soutient
a+++ cordialement
rapidegoyes
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question25 août 2024 à 16:18
Bonjour ,
Pour répondre à KX, mes chiffres sont tous sur une même ligne séparés par une virgule et un espace.
Voir dans mon code ci-dessus exemple extrait ci-dessous
Jour1Mesure1 Jour1 = new Jour1Mesure1(144, 140, 135, 155, 141, 146, 85, 77, 74, 97, 97, 92, 0, 0, 0, 0, 0, 0);//(matin et soir ) Jour1.calculMoyenneJour1(); Jour1.calculmoyenneDiasJour1();
Ce sont des relevés fournis par un appareil de mesure de tension.
Mon code calcule la moyenne journalière et complète sur 3 jours consécutifs de relevés de tensions.
Merci pour votre aide
cordialement à +++
repidegoyes
25 août 2024 à 17:47
Il y aurait beaucoup de choses à redire sur tes classes (déjà le fait qu'il y en ait 5 qui sont des copier-coller les unes des autres) et en particulier sur les champs de ReleveTension où il y a beaucoup de copier-coller aussi (jour1, jour2, jour3...), tu imagines bien que si tu devais faire une semaine ou un mois entier, ce ne serait juste pas possible de démultiplier le code pour chaque jour à traiter.
Pour répondre à la question initiale en laissant le code tel qu'il est, tu peux faire quelque chose comme ça (pas le plus joli, mais sûrement le plus simple à comprendre)
public static ReleveTension saisirReleveTension() { Scanner clavier = new Scanner(System.in); System.out.println("Saisie des relevés du matin 1"); System.out.print("Systolique : "); int systoliqueMatin1 = Integer.parseInt(clavier.nextLine()); System.out.print("Diastolique : "); int diastoliqueMatin1 = Integer.parseInt(clavier.nextLine()); System.out.println("Saisie des relevés du soir 1"); System.out.print("Systolique : "); int systoliqueSoir1 = Integer.parseInt(clavier.nextLine()); System.out.print("Diastolique : "); int diastoliqueSoir1 = Integer.parseInt(clavier.nextLine()); System.out.println("Saisie des relevés du matin 2"); System.out.print("Systolique : "); int systoliqueMatin2 = Integer.parseInt(clavier.nextLine()); System.out.print("Diastolique : "); int diastoliqueMatin2 = Integer.parseInt(clavier.nextLine()); System.out.println("Saisie des relevés du soir 2"); System.out.print("Systolique : "); int systoliqueSoir2 = Integer.parseInt(clavier.nextLine()); System.out.print("Diastolique : "); int diastoliqueSoir2 = Integer.parseInt(clavier.nextLine()); System.out.println("Saisie des relevés du matin 3"); System.out.print("Systolique : "); int systoliqueMatin3 = Integer.parseInt(clavier.nextLine()); System.out.print("Diastolique : "); int diastoliqueMatin3 = Integer.parseInt(clavier.nextLine()); System.out.println("Saisie des relevés du soir 3"); System.out.print("Systolique : "); int systoliqueSoir3 = Integer.parseInt(clavier.nextLine()); System.out.print("Diastolique : "); int diastoliqueSoir3 = Integer.parseInt(clavier.nextLine()); return new ReleveTension( systoliqueMatin1, systoliqueMatin2, systoliqueMatin3, systoliqueSoir1, systoliqueSoir2, systoliqueSoir3, diastoliqueMatin1, diastoliqueMatin2, diastoliqueMatin3, diastoliqueSoir1, diastoliqueSoir2, diastoliqueSoir3, 0, 0, 0, 0, 0, 0); }
25 août 2024 à 17:49
Un problème à la fois, mais on reviendra sur le fait que tu as dérivé 3 fois ta classe alors que les classes filles ne font rien de nouveau, et que 3 variables de la classe mère auraient suffi.
La signature de ton constructeur attend des nombres entiers. Or le contenu d'un fichier, tout comme ce qui est saisi dans la console.
Il faut donc décomposer le texte en plusieurs morceaux qui représentent des nombres et les convertir en int. C'est ce que fait la méthode nextint de Scanner à condition de paramétrer le séparateur.
Ce que je ferais donc à ta place, de lire ton fichier ligne par ligne, comme te l'as proposé KX.
Puis dans le constructeur de ta classe, avec Scanner, décomposer la ligne avec nextint.
Modifié le 25 août 2024 à 22:40
Bonsoir,
Tout d'abord un grand merci pour le temps que vous me donner !
Pour la complexité de mon code je peux vous rassurer chaque relevé se fait sur seulement 3 jours consécutifs enregistrés sur formulaire papier.
Les variables je les ai mises en enfilade sur une seule ligne pour alléger.
En ce qui concerne les classes filles j'ai étudié l'héritage et je veux simplement tester si j'y arrive à travers mon code.
Néanmoins je compte par la suite spécialiser ces dernières par des méthodes qui me produisent par exemple: la tension la plus élevée, la plus basse.
Pour l'instant je vais suivre vos conseils
Merci très cordialement et à +++
rapidegoyes
26 août 2024 à 21:38
Bonjour,
À titre d'exemple, j'ai réécrit tout ton code, tel que je l'aurais écrit s'il avait fallu que je le fasse (en me basant sur ce que j'ai compris de ton propre code)
D'abord avec la structure des données :
public record PressionArterielle(int pressionSystolique, int pressionDiastolique) { @Override public String toString() { return pressionSystolique + "/" + pressionDiastolique; } }
import java.util.Arrays; public record MesureTension(PressionArterielle... pressions) { public PressionArterielle moyenne() { float systoliques = 0, diastoliques = 0; for (PressionArterielle p : pressions) { systoliques += p.pressionSystolique(); diastoliques += p.pressionDiastolique(); } return new PressionArterielle( Math.round(systoliques / pressions.length), Math.round(diastoliques / pressions.length) ); } @Override public String toString() { return Arrays.toString(pressions); } }
Ensuite j'ai fait deux versions du programme de calcul de moyenne :
- avec la saisie au clavier
import java.util.Scanner; public class MainClavier { private static final Scanner clavier = new Scanner(System.in); public static int saisieEntier(String label) { System.out.print(label); try { return Integer.parseInt(clavier.nextLine()); } catch (Exception e) { System.err.println("Erreur ! " + e); return saisieEntier(label); } } public static PressionArterielle saisiePressionArterielle() { return new PressionArterielle( saisieEntier("Systolique : "), saisieEntier("Diastolique : ") ); } public static PressionArterielle saisieJournee() { System.out.println("Tension du matin :"); PressionArterielle matin = saisiePressionArterielle(); System.out.println("Tension du soir :"); PressionArterielle soir = saisiePressionArterielle(); return new MesureTension(matin, soir).moyenne(); } public static MesureTension saisiePlusieursJournees(int nbJours) { PressionArterielle[] pressions = new PressionArterielle[nbJours]; for (int i = 0; i < nbJours; i++) { System.out.println("# Jour " + (i + 1)); pressions[i] = saisieJournee(); System.out.println("Moyenne jour " + (i + 1) + " : " + pressions[i]); } return new MesureTension(pressions); } public static void main(String[] args) { MesureTension mesureTension = saisiePlusieursJournees(3); System.out.println("# Moyenne des 3 jours : " + mesureTension.moyenne()); } }
- avec l'extraction des données depuis un fichier (ou un String multilignes)
import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; public class MainFichier { public static PressionArterielle extrairePressionArterielle(String pression) { String[] groups = pression.split("/"); int systolique = Integer.parseInt(groups[0]); System.out.println("Systolique : " + systolique); int diastolique = Integer.parseInt(groups[1]); System.out.println("Diastolique : " + diastolique); return new PressionArterielle(systolique, diastolique); } public static PressionArterielle extraireJournee(String ligne) { String[] groups = ligne.split("\\s+"); System.out.println("Tension du matin :"); PressionArterielle matin = extrairePressionArterielle(groups[0]); System.out.println("Tension du soir :"); PressionArterielle soir = extrairePressionArterielle(groups[1]); return new MesureTension(matin, soir).moyenne(); } public static MesureTension extrairePlusieursJournees(String fichier) { String[] lines = fichier.split("\\v+"); PressionArterielle[] pressions = new PressionArterielle[lines.length]; for (int i = 0; i < lines.length; i++) { System.out.println("# Jour " + (i + 1)); pressions[i] = extraireJournee(lines[i]); System.out.println("Moyenne jour " + (i + 1) + " : " + pressions[i]); } return new MesureTension(pressions); } public static void main(String[] args) throws IOException { // String fichier = Files.readString(Paths.get("C:/mesuresTension.txt")); String fichier = """ 101/111 121/131 102/112 122/132 103/113 123/133 """; MesureTension mesureTension = extrairePlusieursJournees(fichier); System.out.println("# Moyenne des 3 jours : " + mesureTension.moyenne()); } }
Modifié le 26 août 2024 à 23:37
Bonsoir KX
Un grand merci pour ton aide à travers cet exemple.
je me retrouve comme un nain, je sèche!!!
Que de chemin il me reste à parcourir...
" je patauge dans la choucroute !!!" comme on dit chez nous la choucroute une spécialité de la région
Il faut que j’essaye de comprendre ton code, il y a des parties de ton code qui me sont inconnues.
En tout cas cela n'a rien à voir avec l'héritage que je me force de développer.
Je vais étudier cela
a +++ plus tard
très cordialement
rapidegoyes
27 août 2024 à 08:20
En tout cas cela n'a rien à voir avec l'héritage que je me force de développer.
Le risque, c'est de développer de l'héritage là où il n'y en a pas besoin et du coup ne pas comprendre l'intérêt de l'héritage.
Modifié le 27 août 2024 à 22:26
Bonsoir KX,
Tout à fait d'accord avec cette remarque, pour l'instant j'essaye de comprendre.
J'arrive à appliquer le mécanisme de l'héritage mais mon support et mal choisi.
L'intérêt de l'héritage reste encore flou pour moi.
Plus concret comme exemple serait plutôt ceci:
Classe mère Menuiserie et classes filles Portes, Fenêtres, Placards.
Je me suis un peu dispersé j'ai dévié de mon objectif premier en voulant entrer les données par clavier ou fichier qui n'était pas nécessaire pour comprendre l'héritage.
je persévère à +++ très cordialement
rapidegoyes
Bonsoir
Plusieurs exemples concrets :
- Exemple 1
- Les appareils électroménagers
- classe mère,
- abstraite, un appareil électroménager ne peut pas être juste un appareil électroménager
- doit être branché sur le secteur
- cesse de fonctionner quand il y a une coupure de courant
- le four, dérive d'appareil électroménagé
- dispose d'une porte
- dispose d'une horloge
- a une taille d'accueil
- peut être dérivé
- micro-onde
- vapeur
- la cafetiere
- dispose d'une réserve d'eau
- "doit" être dérivé (je mets des guillemets car on pourrait coder les différents comportements dans la classe cafetières, mais on perdrait en clarté, mais de mon point de vue ça devrait être une classe abstraite
- café moulu
- grain à moudre
- dosettes
- "doit" être dérivé (je mets des guillemets car on pourrait coder les différents comportements dans la classe cafetières, mais on perdrait en clarté, mais de mon point de vue ça devrait être une classe abstraite
- dispose d'une réserve d'eau
- Les appareils électroménagers
- Jeu de carte
- Carte
- Dispose d'une "numéro"
- Dispose d'une valeur (ça dépend des jeux)
- Dispose d'une couleur (on ne va pas dériver, pique, cœur et carreau, c'est juste l'icone qui change)
- Cas de la belote
- Classe dérivée : Atout qui remplace une couleur
- modification des valeurs du valet et du 14
- les carte de 2 à 8 n'existent pas
- Cas du tarot
- Classe dérivé Atout, qui est une couleur à part entière
- Cas de la belote
- Carte
31 août 2024 à 08:39
Bonjour
Tous ces exemples sont de l'héritage de données.
On pourrait également avoir de l'héritage de traitement, c'est à dire que pour une même structure de données on peut lui appliquer plusieurs traitements similaires qui hériteraient d'une structure commune.
Dans la conversation ci-dessus, le choix de saisir la donnée au clavier ou de charger un fichier, doit conduire au même traitement de la donnée. On pourrait donc faire un code commun (classe mère) dont les spécificités (classes filles) ne concernent que la différence clavier vs. fichier.
Une manière de faire : le traitement du clavier est une classe fille du traitement de fichier, dont on surcharge le chargement du fichier par une saisie au clavier qui constitue un fichier que le reste du traitement sait gérer.
31 août 2024 à 19:10
Effectivement
26 sept. 2024 à 22:26
Bonsoir à tous,
Merci pour votre aide.
J'ai recommencé et modifié mon code, ce n'est qu'un essai pour l'instant.
J'ai abandonné la méthode de l'héritage.
Voici ci-dessous mon nouveau code, il y en a sûrement à redire, tan-pis ça fait travailler les méninges d'un retraité .
package tensionessai1; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.util.List; import java.util.stream.IntStream; import java.util.Arrays; import java.util.Collections; public class RelevéSystjour1 { static int total = 0; //Structure du tableau pour sélectionner une tranche ou plage. public static int[] tableauDecoup(int[] array, int startIndex, int endIndex) { int[] sortieTranche = IntStream.range(startIndex, endIndex).map(i -> array[i]).toArray(); return sortieTranche; } public static void main(String[] args) throws IOException { CalculTotaletMoyenne(); //appel de méthode }//fin de la fonction Main public static int CalculTotaletMoyenne() { // lecture du fichier texte try { FileInputStream chiffres = new FileInputStream("C:/Users/willy/Documents/dataSystjour1.txt"); InputStreamReader inputStr = new InputStreamReader(chiffres); BufferedReader bufredR = new BufferedReader(inputStr); String ligne; // découpe la liste du ficher txt avec virgule et espace avec split while ((ligne = bufredR.readLine()) != null) { String tableauDecoup[]=ligne.split(","); System.out.println("Affiche la ligne issue du fichier txt + action split: " + ligne); List<String> liste = Arrays.asList(tableauDecoup); int[] intArray = new int[tableauDecoup.length];//lit tous les chiffres for(int i=0; i<intArray.length; i++) { intArray[i]=Integer.parseInt(tableauDecoup[i]);//transforme les chiffres en int System.out.println("Transforme les String en int: " + intArray[i]); }//fin de ce qu'il y a dans la boucle //*********************afficher une tranche ou plage******************************* int startIndex = 0, endIndex = 5; int[] sortieTranche = tableauDecoup(intArray, startIndex, endIndex + 1); System.out.println("Tranche délimitée jour 1 : " + Arrays.toString(sortieTranche));//jour 1 //**************************** moyenne systolique du jour 1*********************** int total1 = 0; for(int i = 0; i < sortieTranche.length; i++) { total1 = total1 + sortieTranche[i]; } int moyenne = total1 / sortieTranche.length; System.out.println("Moyenne systolique jour1: " + moyenne); //*************************** moyenne systolique du jour 1************************** int startIndex1 = 6, endIndex1 = 11; int[] sortieTranche1 = tableauDecoup(intArray, startIndex1, endIndex1 + 1); System.out.println("Tranche délimitée jour 2: " + Arrays.toString(sortieTranche1));//jour 2 //*************************** moyenne systolique du jour 2***************************** int total2 = 0; for(int i = 0; i < sortieTranche.length; i++) { total2 = total2 + sortieTranche1[i]; } int moyenne2 = total2 / sortieTranche1.length; System.out.println("Moyenne systolique jour2: " + moyenne2); //**************************** moyenne systolique du jour 2************************** int startIndex2 = 12, endIndex2 = 17; int[] sortieTranche2 = tableauDecoup(intArray, startIndex2, endIndex2 + 1); System.out.println("Tranche délimitée jour 3: " + Arrays.toString(sortieTranche2));//jour 3 //********************************* moyenne systolique du jour 3**************************** int total3 = 0; for(int i = 0; i < sortieTranche2.length; i++) { total3 = total3 + sortieTranche2[i]; } int moyenne3 = total3 / sortieTranche2.length; System.out.println("Moyenne systolique jour3: " + moyenne3); //********************************** moyenne systolique du jour 3**************************** //************** afficher tranche ou plage avec moyenne de chaque tranche ou plage************* //calcul du total concernant la liste int total = liste.stream().mapToInt(Integer::valueOf).sum();//calcul le total System.out.println("Calcule le total des 3 jours de relevés: " + total); System.out.println("Calcule la moyenne des 18 relevés Systolique: " + total/18); //fin de calculer le total de la liste // affichage de la tension la lus élevée et la plus basse System.out.println("La tension systolique la plus basse: " + Collections.min(liste)); System.out.println("La tension systolique la plus élevée: " + Collections.max(liste)); }//fin while bufredR.close();//ferme le fichier }// fin de try catch (Exception e) { System.out.println(e.toString()); }//fin de catch return total/18; }// fin de la méthode CalculTotaletMoyenne }//fin classe Relevé
voici ce que cela donne à la sortie sur console.
Affiche la ligne issue du fichier txt + action split: 144,140,135,155,141,146,147,155,141,150,143,129,149,137,137,149,142,136
Transforme les String en int: 144
Transforme les String en int: 140
Transforme les String en int: 135
Transforme les String en int: 155
Transforme les String en int: 141
Transforme les String en int: 146
Transforme les String en int: 147
Transforme les String en int: 155
Transforme les String en int: 141
Transforme les String en int: 150
Transforme les String en int: 143
Transforme les String en int: 129
Transforme les String en int: 149
Transforme les String en int: 137
Transforme les String en int: 137
Transforme les String en int: 149
Transforme les String en int: 142
Transforme les String en int: 136
Tranche délimitée jour 1 : [144, 140, 135, 155, 141, 146]
Moyenne systolique jour1: 143
Tranche délimitée jour 2: [147, 155, 141, 150, 143, 129]
Moyenne systolique jour2: 144
Tranche délimitée jour 3: [149, 137, 137, 149, 142, 136]
Moyenne systolique jour3: 141
Calcule le total des 3 jours de relevés: 2576
Calcule la moyenne des 18 relevés Systolique: 143
La tension systolique la plus basse: 129
La tension systolique la plus élevée: 155
Je suis un peu satisfait du résultat ce n'est pas terminé il faut que j'y greffe encore la même chose concernant le diastolique.
tout ce que j'avais envie de calculer est sorti !!!
A +++ cordialement
rapidegoyes