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

Langage Java Discussion :

probleme de boucle dans un tp


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Octobre 2016
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2016
    Messages : 17
    Par défaut probleme de boucle dans un tp
    salut
    j'ai un tp a faire avec un parachutiste avec et sans ouverture du parachute et j'ai un souci...mais je vois pas ou

    le sujet est celui ci :

    2.2 Modélisation du parachutiste
    Le parachutiste sera représenté dans le programme par sa masse, sa vitesse de
    chute, son accélération, son altitude et la surface de son corps exposée aux frottements
    de l’air (celle-ci variera lorsque le parachute s’ouvrira).
    3
    Dans le programme téléchargé :
    1. commencez par déclarer dans la méthode main une constante g de valeur
    9.81, et deux variables de type double (qui seront modifiées lors de
    l’ouverture du parachute) : v0, initialisée à 0 et t0, initialisée à 0.
    2. définissez ensuite les variables nécessaires à la description du parachutiste
    telle que donnée ci-dessus, autre que sa masse que nous avons déjà définie
    (voir le début de la méthode main dans le fichier téléchargé) : vitesse
    pour sa vitesse, hauteur pour son altitude, accel pour son accélération
    et t pour le temps.
    On initialisera la surface du parachutiste à 2.0 m2
    , son altitude avec la
    valeur de h0, sa vitesse avec celle de v0 et son accélération avec celle de
    g.
    Définissez enfin une variable t initialisée à la valeur de t0.
    3. Affichez les valeurs initiales telles que définies ci-dessus en utilisant strictement
    la ligne suivante (également fournie dans le fichier à télécharger) :
    System.out.printf("%.0f, %.4f, %.4f, %.5f\n",
    t, hauteur, vitesse, accel);
    Avec les valeurs initiales données ci-dessus, une masse de 80 kg et une
    altitude de départ de 39’000 m, le programme affichera à ce stade :
    0, 39000.0000, 0.0000, 9.81000
    2.3 Chute libre
    Pour calculer l’évolution du sportif en chute libre nous aurons besoin des deux
    expressions suivantes :
    — s qui est la surface du sportif divisée par sa masse ;
    — un « terme » noté q et valant q = exp(−s × (t − t0)), où t représente
    le temps courant et t0 le temps initial de la chute, initialisé à 0 dans la
    question précédente.
    Note : la fonction exp s’écrit simplement Math.exp en Java, par exemple :
    Math.exp(x).
    L’évolution du sportif en chute libre s’exprime alors comme suit :
    v(t) = g
    s
    × (1 − q) + v0 × q
    h(t) = h0 −
    g
    s
    × (t − t0) −
    v0 − g/s
    s
    × (1 − q)
    a(t) = g − s × v(t)
    4
    où v est la vitesse du sportif, h son altitude, a son accélération, g = 9.81, et v0, h0
    et t0 correspondent aux trois variables définies à la question précédente 1
    .
    On vous demande de compléter votre programme précédent de sorte à calculer
    l’évolution de la chute du sportif tel qu’initialisé dans la question précédente :
    faites le calcul, de seconde en seconde (c’est-à-dire ajouter à chaque fois 1 au
    temps t), tant que le sportif n’atteint pas le sol, c’est-à-dire tant que son altitude
    h est positive.
    Affichez les caractéristiques du sportif à chaque seconde en respectant le format
    de la question précédente.
    Testez votre programme avec une masse de 80 kg et une altitude de départ de
    39’000 m; il devrait donner les résultats suivants :
    0, 39000.0000, 0.0000, 9.81000
    1, 38995.1356, 9.6884, 9.56779
    2, 38980.7030, 19.1376, 9.33156
    3, 38956.9382, 28.3535, 9.10116
    ...
    137, 426.3065, 379.6277, 0.31931
    138, 46.5205, 379.9430, 0.31142
    2.4 Vitesse du son et vitesse limite
    On vous demande maintenant d’étendre votre programme précédent de sorte que :
    5. dès que la vitesse du sportif dépasse la vitesse du son (343 m/s), le programme
    affiche (en plus, mais qu’une seule fois) le message suivant :
    ## Felix depasse la vitesse du son
    Ce message doit s’afficher AVANT les informations de temps, altitude, vitesse
    et accélération :
    ...
    82, 20498.5770, 341.8844, 1.26289
    ## Felix depasse la vitesse du son
    83, 20156.0663, 343.1317, 1.23171
    ...
    6. dès que son accélération est inférieure à 0.5 m/s2
    , le programme affiche
    (en plus, mais qu’une seule fois) le message suivant :
    ## Felix a atteint sa vitesse maximale
    1. Elles pourront changer par la suite, donc même si certaines sont pour le moment nulles, il
    est important de toutes les garder explicitement dans les formules calculées.
    5
    Ce message doit s’afficher AVANT les informations de temps, altitude, vitesse
    et accélération :
    ...
    119, 7199.1595, 372.3690, 0.50078
    ## Felix a atteint sa vitesse maximale
    120, 6826.5422, 372.8636, 0.48841
    ...
    Pour tester : avec les valeurs précédentes (80 kg et 39’000 m), la vitesse du son
    est atteinte au bout de 83 s et la vitesse maximale (' 372 m/s) au bout de 120 s
    comme montré dans les deux exemples ci-dessus.
    2.5 Ouverture du parachute
    On vous demande finalement d’étendre une dernière fois votre programme pré-
    cédent de sorte que dès que l’altitude du sportif est plus petite que 2500 m, le
    programme change la valeur de la surface du sportif de 2.0 m2
    (avant l’ouverture
    du parachute) à 25.0 m2
    (après l’ouverture du parachute). Il faut aussi changer les
    « conditions initiales » t0, v0 et h0 avec les valeurs actuelles du sportif (de sorte
    que les équations d’évolution soient correctes pour la suite de la chute).
    De plus, le programme doit afficher le message suivant :
    ## Felix ouvre son parachute
    Ce message doit s’afficher AVANT les informations de temps, altitude, vitesse et
    accélération :
    ...
    131, 2698.0264, 377.5607, 0.37098
    ## Felix ouvre son parachute
    132, 2320.2818, 377.9270, 0.36182
    133, 1991.2751, 284.9225, -79.22827
    ...
    Notez que donc l’accélération devient négative deux lignes après l’affichage de ce
    message.
    Pour tester : avec les valeurs précédentes (80 kg et 39’000 m), le parachute est
    ouvert au bout de 132 s et la simulation se termine au bout de 170 s :
    ...
    131, 2698.0264, 377.5607, 0.37098
    ## Felix ouvre son parachute
    132, 2320.2818, 377.9270, 0.36182
    6
    133, 1991.2751, 284.9225, -79.22827
    ...
    170, 18.4814, 31.3944, -0.00075
    Enfin, réfléchissez bien au moment où il faut signaler l’ouverture du parachute;
    par exemple, on ne saute pas avec un parachute déjà ouvert !..

    <---------------------------------------------------------------------------------------------------------------------------------------->
    MON 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
    import java.util.Scanner;
     
    class Parachutiste {
     
    	public static void main(String[] args) {
     
    		Scanner clavier = new Scanner(System.in);
     
    		double masse = 80.0;
    		/**do {
                            System.out.print("masse du parachutiste (>= 40) ? ");
                            masse = clavier.nextDouble();
                    } while (masse < 40.0);**/
     
    		double h0 = 39000.0;
    		/**do {
                            System.out.print("hauteur de depart du parachutiste (>= 250) ? ");
                            h0 = clavier.nextDouble();
                    } while (h0 < 250.0);**/
     
    		/*******************************************
                     * Completez le programme a partir d'ici.
                     *******************************************/
    		final double g=9.81;
    		double v0=0;
    		double t0=0;
    		double t=t0;
    		double hauteur=h0;
    		double vitesse=v0;
    		double accel=g;
    		double surface=2.0;
    		double s=surface/masse;
     
    		while(hauteur>0)
    		{
    			vitesse=g/s*(1-Math.exp(-s*(t-t0)))+v0*Math.exp(-s*(t-t0));
    			hauteur=h0-(g/s*(t-t0))-(v0-(g/s)/s)*(1-Math.exp(-s*(t-t0)));
    			accel=g-(s*vitesse);
    		    if(hauteur>0)
    			{
    				System.out.printf("%.0f, %.4f, %.4f, %.5f\n",
    						t, hauteur, vitesse, accel);  	
    				t++;
    			}     	
     
    			if(hauteur > 2500) 
    			{           		
    				if(vitesse>=341&&vitesse<343)
    				{
    					System.out.println("Felix depasse la vitese du son");
    				}
    				if (accel <0.50078 && accel >0.48842)
    				{
    					System.out.println("Felix a atteint sa vitesse maximale");
    				}
    				if(hauteur < 2700)
    				{ 
    					System.out.println("Felix ouvre son parachute");
    				}
    			}
    			else 
    			{
    				surface=25;
    				s=surface/masse;
    				t0=132;
    				h0=2320.2818;
    				v0=377.9270;
    			}
    		}
    		/*******************************************
                     * Ne rien modifier apres cette ligne.
                     *******************************************/
    		clavier.close();
    	}
    }

    jusqu'a la 132eme seconde tout se passe bien mais apres la hauteur ne correspond plus a ce qui est (demande /devrait etre)
    ca fait 3jours que je suis dessus et je bloque total si vous pouvez me donner une piste(sans code)...

    merci

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Ton problème provient d'une erreur dans ta formule de calcul de hauteur : (v0-(g/s)/s). C'est (v0-g/s) qu'il faut diviser par s, pas seulement g/s).

    La bonne formule est : hauteur=h0-(g/s*(t-t0))-((v0-g/s)/s)*(1-Math.exp(-s*(t-t0)));Par ailleurs, c'est un peu dommage de gérer en dur le changement des valeurs initiales : non seulement tu le fais à chaque tour de boucle inutilement (puisqu'on a à le faire que lorsque le parachute s'ouvre), mais en plus, surtout, dès que tu changes la masse, ton programme devient faux, sans parler du fait qu'il faille le faire tourner au moins une fois pour connaître ces valeurs en dur.
    Avec un boolean (qui signifie "parachute ouvert", donc false au départ, trus dès que le parachute s'ouvre) qui te permet de déterminer si le parachute est ouvert ou pas, tu peux initialiser tes variables avec les valeurs calculées (donc hauteur, vitesse et temps), si le boolean est faux et la hauteur passe en dessous de 2500 (à faire avant l'affichage des valeurs, pour que le message "d'ouverture" s'affiche justement avant) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if ( !parachuteouvert && hauteur<2500  ) {
    				parachuteouvert=true;
    				System.out.println("Felix ouvre son parachute");
    				surface=25;
    				s=surface/masse;
    				t0=t;
    				h0=hauteur;
    				v0=vitesse;
    			}
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre averti
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Octobre 2016
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2016
    Messages : 17
    Par défaut merci
    salut

    ok j'avais pas remis la formule en doute vu que les valeurs afficher etait correct jusque la....

    merci a toi

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Cela fonctionnait jusqu'à t=132 avec le formule fausse parce que v0 est initialisé à 0 :

    1. (v0-(g/s)/s) vaut 0 - (g/s)/s = - (g/s)/s
    2. (v0-g/s)/s vaut (0 -g/s)/s = (-g/s)/s = - (g/s)/s
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre averti
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Octobre 2016
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2016
    Messages : 17
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    Salut,

    Ton problème provient d'une erreur dans ta formule de calcul de hauteur : (v0-(g/s)/s). C'est (v0-g/s) qu'il faut diviser par s, pas seulement g/s).

    La bonne formule est : hauteur=h0-(g/s*(t-t0))-((v0-g/s)/s)*(1-Math.exp(-s*(t-t0)));Par ailleurs, c'est un peu dommage de gérer en dur le changement des valeurs initiales : non seulement tu le fais à chaque tour de boucle inutilement (puisqu'on a à le faire que lorsque le parachute s'ouvre), mais en plus, surtout, dès que tu changes la masse, ton programme devient faux, sans parler du fait qu'il faille le faire tourner au moins une fois pour connaître ces valeurs en dur.
    Avec un boolean (qui signifie "parachute ouvert", donc false au départ, trus dès que le parachute s'ouvre) qui te permet de déterminer si le parachute est ouvert ou pas, tu peux initialiser tes variables avec les valeurs calculées (donc hauteur, vitesse et temps), si le boolean est faux et la hauteur passe en dessous de 2500 (à faire avant l'affichage des valeurs, pour que le message "d'ouverture" s'affiche justement avant) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if ( !parachuteouvert && hauteur<2500  ) {
    				parachuteouvert=true;
    				System.out.println("Felix ouvre son parachute");
    				surface=25;
    				s=surface/masse;
    				t0=t;
    				h0=hauteur;
    				v0=vitesse;
    			}

    re,

    pourquoi alors que la condition (!parachuteouvert &&hauteur <2500) reste true il n'affiche qu'une fois : "System.out.println("Felix ouvre son parachute");"???
    merci

  6. #6
    Membre averti
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Octobre 2016
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2016
    Messages : 17
    Par défaut non, ok
    non, ok ca y'est j'ai compris merci ...

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

Discussions similaires

  1. [Débutant] probleme de boucle dans button_click
    Par nycoocoo dans le forum Windows Forms
    Réponses: 2
    Dernier message: 19/08/2012, 18h17
  2. Probleme de boucle dans VBA Excel
    Par Patrick717 dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 27/02/2012, 17h24
  3. Probleme de boucle dans servlet
    Par marouene_ dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 20/04/2011, 11h31
  4. probleme de recordset dans une boucle do while
    Par Shoryu dans le forum ASP
    Réponses: 18
    Dernier message: 05/07/2004, 15h30
  5. Probleme de test dans un boucle
    Par PrinceMaster77 dans le forum ASP
    Réponses: 14
    Dernier message: 15/06/2004, 12h32

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