Besoin d'aide sur un petit programme java

Résolu/Fermé
Usul42 Messages postés 4 Date d'inscription mardi 19 avril 2016 Statut Membre Dernière intervention 12 mai 2016 - Modifié par NHenry le 19/04/2016 à 22:20
Usul42 Messages postés 4 Date d'inscription mardi 19 avril 2016 Statut Membre Dernière intervention 12 mai 2016 - 20 avril 2016 à 09:43
Bonjour,

Je suis débutant et j’apprends actuellement le java sur coursera. J'ai un léger soucis sur l'exécution d'un code. Celui-ci me retourne de très près au résultat présenté sur l'exemple, mais pas tout à fait, et je n'arrive pas à trouver pourquoi.
Je ne peux de plus demander de l'aide sur le site car je suis le cours en dehors des dates de suivi/rendu.

Si quelqu'un s'y connaissant mieux en programmation et en java pouvait me donner quelques indications ce serait super !

L'exercice est "Exercice 2 — Tour en vélo "

Lien coursera : https://class.coursera.org/initprogjava-002/assignment/view?assignment_id=7

import java.util.Scanner;

class Cycliste {
    private static Scanner clavier = new Scanner(System.in);
    public static void main(String[] args) {

        double t = 0.0;    // temps, en min.
        double d = 0.0;    // distance, en km
        double v = 30.0;   // vitesse, en km/h
        double acc = 0.0;  // accélération, en km/h/min
        double p = 175.0;  // puissance, en W

        /******************************************
         * Completez le programme a partir d'ici.
         *******************************************/
        
        double m = 0.0;         // masse, en Kg
        double vWind = 0.0;     // vitesse du vent, en km/h
        double dp = 0.0;        // distance du parcours
        double d1 = 0.0;        // distance du col, en km
        double p1 = 0;        // pente de la montée en %
        double p2 = 0;        // pente de la descente en %
        double DV = v - vWind;  // différence de vitesse entre le cycliste et le vent
        double DT = 1.0/60;     // definition de temps de la simulation
        double P_MIN = 10.0;    // puissance minimale du cycliste
        boolean crete = false;  // marqueur de crète
        
        // Définition des variables par l'interface opérateur.
        do {
         System.out.print("masse du cycliste (entre 40 et 180 ) ? ");
         m = clavier.nextDouble();
  } while ((m < 40) || (m > 180));
        
        do {
         System.out.print("vent (entre -20 et +20 km/h) ? ");
         vWind = clavier.nextDouble();
  } while ((vWind < -20) || (vWind > 20));
        
        do {
         System.out.print("distance du parcours (<= 200 km) ? ");
         dp = clavier.nextDouble();
  } while ((dp < 11) || (dp > 200));
        
        do {
         System.out.print("distance au sommet du col (<= "+(dp - 10)+" km) ? ");
         d1 = clavier.nextDouble();
  } while (d1 > (dp - 10) || (d1 <= 0));
        
        do {
         System.out.print("pente moyenne jusqu'au sommet (<= 20 %) ? ");
         p1 = clavier.nextDouble();
  } while ((p1 <= 0) || (p1 > 20));
        
        do {
         System.out.print("pente moyenne après le sommet (<= 20 %) ? ");
         p2 = clavier.nextDouble();
  } while ((p2 <= 0) || (p2 > 20));
        
        // Simulation du mouvement
        while (d < dp) 
        {
         // Affichage des informations courantes
         double roundedTime = Math.round(t);
            if (Math.abs(roundedTime - t) < 1e-5 && (int)roundedTime % 5 == 0) 
            {
                System.out.format("%.0f, %.2f, %.2f, %.4f,  %.2f\n",
                                  t, d, v, acc, p);
            }
            
            // Mise a jour du temps, du vent relatif et de la fatigue
            t += DT;                                             // mise a jour du temps
            DV = v - vWind;                               // détermination du vent relatif
            
            if ((d < d1)&&(p > P_MIN))                           // détermination de la fatigue si montée ou descente
            {
             p -= (DT / 2);                                   // en Montée
            }
            else
            {
             p = P_MIN;                                       // en descente
            }
            
            // Calcul de l'accélération
            if (d < d1)                                          // détermination si montée ou descente
            {
             acc = -2118.96 * Math.sin(Math.atan(p1/100.0));    // accélération en montée
   }
            else
            {
             acc = -2118.96 * Math.sin(Math.atan(-p2/100.0));   // accélération en descente
            }
            
            acc -= (5.0 * DV * Math.abs(DV) / m);                  // on applique le ralentissement du vent
            
            if ((v > 0) && (p > 0)) 
            {
    acc += 776.6 * (p / (v * m));
   }
            
            if (Math.abs(acc) < 1e-5)                            // nullifier la valeur de l'accélération si elle est très faible
            {
             acc = 0.0;
   }
            
            v += (acc * DT);                                     // appliquer l'accélération à la vitesse
            
            if (v < 3)                                           // on définit l'abbandon
            {
             System.out.println("## Bernard abandonne, il n'en peut plus");
             System.out.format("%.0f, %.2f, %.2f, %.4f,  %.2f\n",
                        t, d, v, acc, p);
             return;
   }
            
            d += (v * (DT / 60.0));                                // mise a jour de la distance
            
            if ((crete == false) && (d >= d1)) 
            {
    crete = true;
    System.out.format("## Bernard a atteint le sommet en %.0f min.\n", t);
   }
  }

        /*******************************************
         * Ne rien modifier apres cette ligne.
         *******************************************/

        System.out.println("## Bernard est arrivé");
        System.out.format("%.0f, %.2f, %.2f, %.4f, %.2f\n",
                          t, d, v, acc, p);
    }
}


EDIT : Ajout du LANGAGE dans les balises de code (la coloration syntaxique).
Explications disponibles ici : ICI

Merci d'y penser dans tes prochains messages.


A voir également:

1 réponse

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
19 avril 2016 à 22:14
Bonjour,

Le lien vers Coursera nécessite de s'inscrire, merci de nous expliquer ce qui ne va pas avec ton code et ce que tu souhaites modifier.
0
Usul42 Messages postés 4 Date d'inscription mardi 19 avril 2016 Statut Membre Dernière intervention 12 mai 2016
19 avril 2016 à 22:28
Oups j'avais oublié ce détail.

L'exemple de coursera présente la sortie suivante:
-----------------------------------------------------------------------
masse du cycliste (entre 40 et 180 ) ? 80
vent (entre -20 et +20 km/h) ? 40
vent (entre -20 et +20 km/h) ? -10
distance du parcours (<= 200 km) ? 50
distance au sommet du col (<= 40.0 km) ? 45
distance au sommet du col (<= 40.0 km) ? 30
pente moyenne jusqu'au sommet (<= 20 %) ? 5
pente moyenne après le sommet (<= 20 %) ? 10
0, 0.00, 30.00, 0.0000, 175.00
5, 1.05, 12.26, -0.0284, 172.50
10, 2.07, 12.12, -0.0286, 170.00
15, 3.07, 11.97, -0.0288, 167.50
20, 4.06, 11.83, -0.0290, 165.00
25, 5.04, 11.68, -0.0291, 162.50
30, 6.01, 11.54, -0.0293, 160.00
35, 6.97, 11.39, -0.0295, 157.50
40, 7.91, 11.24, -0.0297, 155.00
45, 8.84, 11.09, -0.0298, 152.50
50, 9.76, 10.95, -0.0300, 150.00
55, 10.66, 10.79, -0.0302, 147.50
60, 11.56, 10.64, -0.0304, 145.00
65, 12.44, 10.49, -0.0306, 142.50
70, 13.31, 10.34, -0.0308, 140.00
75, 14.16, 10.18, -0.0310, 137.50
80, 15.00, 10.03, -0.0312, 135.00
85, 15.83, 9.87, -0.0314, 132.50
90, 16.65, 9.71, -0.0316, 130.00
95, 17.45, 9.56, -0.0318, 127.50
100, 18.24, 9.40, -0.0320, 125.00
105, 19.02, 9.24, -0.0322, 122.50
110, 19.78, 9.07, -0.0324, 120.00
115, 20.53, 8.91, -0.0326, 117.50
120, 21.27, 8.75, -0.0328, 115.00
125, 21.99, 8.58, -0.0330, 112.50
130, 22.70, 8.42, -0.0332, 110.00
135, 23.39, 8.25, -0.0334, 107.50
140, 24.07, 8.08, -0.0336, 105.00
145, 24.74, 7.92, -0.0338, 102.50
150, 25.39, 7.75, -0.0341, 100.00
155, 26.03, 7.58, -0.0343, 97.50
160, 26.65, 7.40, -0.0345, 95.00
165, 27.26, 7.23, -0.0347, 92.50
170, 27.86, 7.06, -0.0350, 90.00
175, 28.44, 6.88, -0.0352, 87.50
180, 29.00, 6.70, -0.0354, 85.00
185, 29.56, 6.53, -0.0356, 82.50
## Bernard a atteint le sommet en 189 min.
190, 30.59, 48.28, 0.6407, 10.00
195, 34.62, 48.36, 0.0000, 10.00
200, 38.65, 48.36, 0.0000, 10.00
205, 42.68, 48.36, 0.0000, 10.00
210, 46.71, 48.36, 0.0000, 10.00
## Bernard est arrivé
214, 50.00, 48.36, 0.0000, 10.00
-----------------------------------------------------------------------

Avec mon code, en utilisant les mêmes entrées, les valeurs de l'accélération en 4ème colonne sont légèrement différentes. De plus lors de la transition du sommet, dans mon code l'accélération fait un bond plus de 10 fois supérieurs à celui présent dans l'exemple.

Merci de t’intéresser à mon problème ! ;)
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
20 avril 2016 à 00:28
Tu as écrit :
acc += 776.6 * (p / (v * m));

Mais il fallait mettre :
acc += 777.6 * (p / (v * m));

Une bonne pratique de programmation est de mettre les nombres magiques en constante pour éviter qu'ils ne se promènent dans le code.
À défaut d'éviter les étourderies cela permet de les centraliser à un seul endroit et de les vérifier et corriger plus facilement. De plus leur donner un nom permet de mieux comprendre à quoi ils servent dans le calcul.

/**
 * Multiplicateur pour la conversion de s³ en h.min²
 * 60 * (3600/1000) * (3600/1000) = 777.6
 */
private static final double UNIT_CONVERTER_S3 = 777.6; 
0
Usul42 Messages postés 4 Date d'inscription mardi 19 avril 2016 Statut Membre Dernière intervention 12 mai 2016
20 avril 2016 à 09:43
Merci, cela corrige parfaitement mon problème !

J'espère que tu n'as pas passé trop de temps sur mon code pour trouver cette erreur assez stupide. J'éviterais les nombres magiques à l'avenir...

Je marque comme résolu.
0