IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

Perfectionnement d'un programme ?


Sujet :

avec Java

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2008
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 61
    Points : 40
    Points
    40
    Par défaut Perfectionnement d'un programme ?
    Bonjour,

    Dans le cadre de ma formation en autodidacte sur JAVA, j'aimerais vos conseils sur un programme que je viend de créer suite à un TP mais qui lui présente beaucoup de défaut a mon goût

    Donc je cherche des personnes motivées pour voir ce qui semble améliorable au sein de ma programmation voir même une éventuelle modification complète mais vraiment en dernier secours !

    Le but étant bien sûr de voir mes propres fautes commises ou amélioration que j'aurais pu apporter voir d' éventuels bugs / défauts que je n'avais pas remarquer à celui-ci et ainsi partir sur de bonne base !

    Remarque : Je n'ai vu actuellement que 6 chapitres qui se résume à les boucles, les conditions, les variables et opérateurs

    Voici donc le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    import java.util.Scanner;
     
    public class ConvertCelsiusEnFahrenheit {
    	public static void main(String[] args) {
     
    	//initialisation des variables
        char reponse = 'O';
     
    	// Affichage du Titre
     
    	System.out.println(" -------------------------------------------------------");
    	System.out.println("|     CONVERSION DEGRES CELSIUS ET DEGRES FAHRENHEIT     |");
    	System.out.println(" -------------------------------------------------------");
     
    	do{
     
    		Scanner sc1 = new Scanner(System.in);
    		System.out.println("Veuillez indiquer à partir de quelle température, on commence la conversion :");
    		// récupérer ce que vous avez saisi et ensuite de l'afficher
    		String Tdepart = sc1.nextLine();
     
    		Scanner sc2 = new Scanner(System.in);
    		System.out.println("Veuillez indiquer jusqu'à quelle température, on arrête la conversion :");
    		// récupérer ce que vous avez saisi et ensuite de l'afficher
    		String Tmax = sc2.nextLine();
     
    		Scanner sc3 = new Scanner(System.in);
    		System.out.println("Veuillez indiquer le pas de conversion :");
    		// récupérer ce que vous avez saisi et ensuite de l'afficher
    		String Pas = sc3.nextLine();
     
    		Scanner sc = new Scanner(System.in);
    		System.out.println("Si votre imprimante est prête, tapez O, sinon tapez N");
    		String Imprimante = sc.nextLine();
     
    		char ReponseImprimante = Imprimante.charAt(0);
     
    		while(ReponseImprimante != 'O' && ReponseImprimante !='o' && ReponseImprimante != 'N' && ReponseImprimante != 'n')
    		{
    			System.out.println("\nVeuillez suivre les instructions ci-dessous : ");
    			System.out.println("\nSi vous êtes prêt, tapez O, sinon tapez N");
     
    			new Scanner(System.in);
    			System.out.println("\nEst-elle prête ?");
    			String strx = sc.nextLine();
    			System.out.println("Vous avez saisi : " + Tmax.charAt(0));
    			ReponseImprimante = strx.charAt(0);
    		}
    		if (ReponseImprimante == 'O' || ReponseImprimante =='o')	
    			System.out.println("imprimante OK\n");
     
    		else if (ReponseImprimante =='n' || ReponseImprimante =='N' ) {
    			System.out.println("Veuillez préparer votre imprimante ! ");
     
    			while(ReponseImprimante != 'O' && ReponseImprimante !='o')	{
    				Scanner sc10 = new Scanner(System.in);
    				System.out.println("\nSi vous êtes prêt, tapez O");
    				String str10 = sc10.nextLine();
    				ReponseImprimante = str10.charAt(0);
     
    			}
    			System.out.println("imprimante OK\n");
    		}
     
    		System.out.println("  TABLE DE CONVERSION DE CELSIUS / FAHRENHEIT");
    		System.out.println(" -----------------------------------------------");
    		System.out.println("\tCELSIUS \t | \tFAHRENHEIT");
    		System.out.println(" -----------------------------------------------");
     
    		float Vmax = (Float.parseFloat(Tmax)-Float.parseFloat(Tdepart))/Float.parseFloat(Pas) ;
    		// Calcul Aide ---->  25--110/10 = 13.5 (Vmax)    
     
     
     
    		if (Vmax != 0 ) {
    		do{
    			double Fahrenheit = ( ( 9*  Float.parseFloat(Tdepart)) / 5 ) + 32;
    			Fahrenheit = arrondi(Fahrenheit, 2);// pour 2 chiffres après la virgule... etc.
    			System.out.println("\t "+Tdepart+" \t\t | \t   "+Fahrenheit);
    			float test = Float.parseFloat(Tdepart) + Float.parseFloat(Pas) ;
    			// Calcul Aide ----> (test)  15 = 25 - 10
    			Tdepart =  String.valueOf(test);
    		}while(--Vmax >= 0);
     
    		}
     
    		else	
    			System.out.println("Aucune conversion a effectuer");
     
    		System.out.println("\nSouhaitez-vous éditer une autre table ?(O/N)");
    	    reponse = sc.nextLine().charAt(0);
     
    	}while(reponse == 'O' || reponse =='o');
     
     
    	System.out.println("A bientôt");
    	}
     
    	public static double arrondi(double A, int B) {
    	     return (double) ( (int) (A * Math.pow(10, B) + .5)) / Math.pow(10, B);
    	}
     
     
    }

    En espérant avoir quelque candidat malgré je ne sais pas trop si se genre de manipulation / pratique ce fait sur le forum


    Merci d'avance en tout cas a ceux qui me fourniront une aide

  2. #2
    Membre expérimenté
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 050
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 050
    Points : 1 340
    Points
    1 340
    Par défaut
    Salut,

    Déjà ça ne semble pas fonctionner correctement,

    Voila la sortie que j'ai eu avec 50 à 100 par palier de 10 :

    -----------------------------------------------
    CELSIUS | FAHRENHEIT
    -----------------------------------------------
    50 | 212.0
    60.0 | 212.0
    70.0 | 212.0
    80.0 | 212.0
    90.0 | 212.0
    100.0 | 212.0

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2008
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 61
    Points : 40
    Points
    40
    Par défaut
    Désoler j'avais fait une petite mise a jour avant de me coucher mais visiblement je l'ai fait trop rapidement j'avais oublier de changer une variable

    Ressayez la ça fonctionne

  4. #4
    Membre expérimenté
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 050
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 050
    Points : 1 340
    Points
    1 340
    Par défaut
    Le voici un peu plus évolué. Plus de méthodes pour écrire moins de code et l'utilisateur est obligé de saisir un nombre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    import java.text.DecimalFormat;
    import java.util.Scanner;
     
    public class ConvertCelsiusEnFahrenheit {
     
    	public static void main(String[] args) {
     
    		boolean continueConversion = true;
     
    		do {
     
    			System.out.println("\n\n");
    			System.out.println(" -------------------------------------------------------");
    			System.out.println("     CONVERSION DEGRES CELSIUS ET DEGRES FAHRENHEIT");
    			System.out.println(" -------------------------------------------------------");
     
    			double depart = 0;
    			double fin = 0;
    			double step = 0;
     
    			String response = null;
     
    			do {
    				System.out.println("\nVeuillez indiquer la température de départ :");
    				response = getResponse();
    				if (!isDouble(response)) {
    					System.err.println("veuillez saisir un nombre");
    				}
    			} while (!isDouble(response));
     
    			depart = Double.parseDouble(response);
     
    			do {
    				System.out.println("\nVeuillez indiquer la température de fin :");
    				response = getResponse();
    				if (!isDouble(response)) {
    					System.err.println("veuillez saisir un nombre");
    				}
    				else if (Double.parseDouble(response) < depart) {
    					System.err.println("veuillez saisir un nombre plus grand ou égal à la température de départ");
    				}
    			} while (!isDouble(response) || Double.parseDouble(response) < depart);
     
    			fin = Double.parseDouble(response);
     
    			if (!(depart == fin)) { // si egal il n'y a pas d'utilité à demander le pas
    				do {
    					System.out.println("\nVeuillez indiquer le pas de conversion :");
    					response = getResponse();
    					if (!isDouble(response)) {
    						System.err.println("veuillez saisir un nombre");
    					}
    				} while (!isDouble(response));
    			}
    			step = Double.parseDouble(response);
     
    			System.out.println("\n TABLE DE CONVERSION");
    			System.out.println(" ---------------------");
    			System.out.println(" CELSIUS\tFAHRENHEIT");
    			System.out.println(" ---------------------");
     
    			for (double celcius = depart ; celcius <= fin ; celcius = celcius + step) {
    				double fahrenheit = celciusToFarhenheit(celcius);
    				System.out.println(" " + arrondi(celcius, 2) + " °C\t " + arrondi(fahrenheit, 2) + " °F");
    			}
     
     
    			System.out.println("\nAutre conversion (\"o/O/y/Y\" pour continuer) :");
    			response = getResponse().toLowerCase();
    			if (!response.equals("o") && !response.equals("y")) {
    				continueConversion = false;
    			}
     
    		} while (continueConversion);
     
    	}
     
    	private static double celciusToFarhenheit(double celcius) {
    		return celcius * 1.8 + 32;
    	}
     
    	private static boolean isDouble(String s) {
    		try {
    			Double.parseDouble(s);
    			return true;
    		} catch (NumberFormatException e) {
    			return false;
    		}
    	}
     
    	private static String getResponse() {
    		Scanner sc = new Scanner(System.in);
    		String response = sc.nextLine();
    		return response;
    	}
     
    	private static String arrondi(double d, int n) {
    		double p = Math.pow(10.0, n);
    		double r = Math.floor((d * p) + 0.5) / p;
    		DecimalFormat df = new DecimalFormat("0.00");
    		return df.format(r);
    	}
     
    }

    Si ça peut t'aider...

  5. #5
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2008
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 61
    Points : 40
    Points
    40
    Par défaut
    Effectivement ça a l'air pas mal mais un nombre incalculable de fonction ou je ne sais quoi que je n'ai encore jamais vu

    Ex :

    import java.text.DecimalFormat;

    try {

    } catch

    Et bien d'autre mais merci pour un autre exemple ça me permet de me rendre compte a quel point le nombre de solution peut varier en fonction des programmateurs j'imagine et c'est bien ce que je redouter

  6. #6
    Membre expérimenté
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 050
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 050
    Points : 1 340
    Points
    1 340
    Par défaut
    DecimalFormat permet d'afficher le nombre avec 2 chiffre après la virgule quoi qu'il arrive. C'est juste pour la présentation :
    2 -> 2.00
    2.151 -> 2.15
    45.1 -> 45.10

    Pour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    try {
    			Double.parseDouble(s);
    			return true;
    		} catch (NumberFormatException e) {
    			return false;
    		}
    Va voir du côté des Exceptions.

    Double.parseDouble(s); permet d'essayer de parser la String en double. Si il y arrive il passe à la ligne suivante et fait return true. La fonction indique donc que la chaine String s est bien un nombre. Si il n'a arrive pas, il passe directement dans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    catch (NumberFormatException e) {
    	return false;
    }
    Et là il renvoie false.

    @+

    PS : on dit programmeur, programmateur c'est dans les machines à laver

  7. #7
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2008
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 61
    Points : 40
    Points
    40
    Par défaut
    ah oui effectivement pas mal la faute de syntaxe de programmateur lol

  8. #8
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2008
    Messages
    328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Mexique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 328
    Points : 459
    Points
    459
    Par défaut
    Bonjour,

    Attention, si depart = 0 ET fin = 0, on boucle sans fin:

    il suffit de remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
                   System.out.println(" " + arrondi(celcius, 2) + " °C\t "  + arrondi(fahrenheit, 2) + " °F");
    par exemple par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
                   System.out.println(" " + arrondi(celcius, 2) + " °C\t "  + arrondi(fahrenheit, 2) + " °F");
                   if ((depart == 0) && (fin == 0))
                      break;
    cordialement.

    Dan

  9. #9
    Membre confirmé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Points : 631
    Points
    631
    Par défaut
    J'ai survolé un peu le truc.

    - En aucun cas, on n'alloue un scanner par ligne à lire, la fonction nextline pouvant être appellée plusieurs fois.

    - En double aucun cas (encore pire quoi), on laisse ouvert tous ces scanners !

    - On évite AU MAXIMUM de déclarer / allouer des variable DANS une boucle. On fait ça en dehors et on réutilise.

    Ensuite, je suis pas sur de ce que j'avance la, mais il me semble qu'il est plus malin de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    System.out.println(" -------------------------------------------------------\nCONVERSION DEGRES CELSIUS ET DEGRES FAHRENHEIT\n-------------------------------------------------------");
    que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    System.out.println(" -------------------------------------------------------");
    System.out.println("     CONVERSION DEGRES CELSIUS ET DEGRES FAHRENHEIT");
    System.out.println(" -------------------------------------------------------");
    ça évite de faire trois appels I/O pour rien. (à confirmer)


    C'est tout pour l'instant
    Venez partager vos expériences au sein d'un projet sur slicesofit, agile & amélioration continue

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 03/10/2013, 15h13
  2. Programme de boot qui passe la main à Windows
    Par Bob dans le forum Assembleur
    Réponses: 7
    Dernier message: 25/11/2002, 03h08
  3. [Kylix] Probleme d'execution de programmes...
    Par yopziggy dans le forum EDI
    Réponses: 19
    Dernier message: 03/05/2002, 14h50
  4. communication entre programmes
    Par jérôme dans le forum C
    Réponses: 12
    Dernier message: 16/04/2002, 08h05
  5. [Kylix] icone associée à un programme
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 22/03/2002, 09h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo