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 - 23 août 2024 à 22:09
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

Bonjour,

J'ai codé un programme java avec eclipse en console il fonctionne sans problème.

Le but c'est d'entrer des chiffres lors d'une mesure de tension artérielle et d'effectuer le calcul de moyennes concernant la tension.

Bien que mon code fonctionne, je bute sur le problème suivant : je n'arrive pas à entrer ces chiffres avec la méthode Scanner.

La méthode Scanner ne me pose pas de difficultés pour entrer une seule données, c'est que je ne trouve pas de solution pour entrer une série de chiffres.

Voici la portion de code qui pose problème lorsque j'entre les données avec Scanner sous console.

public static void regroupelesObjets() {
		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();

Quelle solution ?

Est-ce vraiment possible pour une suite de chiffres ?

Merci de bien vouloir m'épauler si c'est possible.

Très cordialement à +++

rapidegoyes


Windows / Firefox 129.0

12 réponses

Utilisateur anonyme
24 août 2024 à 10:37
0
rapidegoyes Messages postés 92 Date d'inscription samedi 22 février 2020 Statut Membre Dernière intervention 16 octobre 2024 7
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

0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
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);
0
Utilisateur anonyme
25 août 2024 à 11:54

Bonjour

vu la question originale, son titre (hein par ce que bon lire le contenu d'un fichier ça ne change pas en console ou fenêtré) et le code présenté, je pensais qu'il était question de saisir les données à la main et pas de lire un fichier.

Du coup, je plussoie ton analyse.

0
rapidegoyes Messages postés 92 Date d'inscription samedi 22 février 2020 Statut Membre Dernière intervention 16 octobre 2024 7
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

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
rapidegoyes Messages postés 92 Date d'inscription samedi 22 février 2020 Statut Membre Dernière intervention 16 octobre 2024 7
25 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

0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
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);
}

0
Utilisateur anonyme
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.


0
rapidegoyes Messages postés 92 Date d'inscription samedi 22 février 2020 Statut Membre Dernière intervention 16 octobre 2024 7
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

0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
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());
    }
}

0
rapidegoyes Messages postés 92 Date d'inscription samedi 22 février 2020 Statut Membre Dernière intervention 16 octobre 2024 7
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

0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
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.

0
rapidegoyes Messages postés 92 Date d'inscription samedi 22 février 2020 Statut Membre Dernière intervention 16 octobre 2024 7
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

0
Utilisateur anonyme
30 août 2024 à 23:50

Bonsoir

Plusieurs exemples concrets :

  1. Exemple 1 
    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
    2. 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é
        1. micro-onde
        2. vapeur
    3. 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
          1. café moulu
          2. grain à moudre
          3. dosettes
  2. Jeu de carte
    1. 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)
        1. 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
        2. Cas du tarot
          • Classe dérivé Atout, qui est une couleur à part entière 
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019 > Utilisateur anonyme
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.

0
Utilisateur anonyme > KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024
31 août 2024 à 19:10

Effectivement 

0
rapidegoyes Messages postés 92 Date d'inscription samedi 22 février 2020 Statut Membre Dernière intervention 16 octobre 2024 7
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

0