Partage
  • Partager sur Facebook
  • Partager sur Twitter

La barrière de 1km pour l'âne

Optimiser l'espâce maximum en tenant compte de la rivière

    3 mai 2011 à 16:00:08

    Bonjour,
    Depuis cet après-midi, mon professeur de programmation me demande de ne plus m'occuper de coder mon programme à partir d'un structogramme ou un organigramme. Il veut que je conçoive le structogramme et que je trouve l'algorithme pour ensuite coder le programme.

    Image utilisateur

    Dans l'algorithme, il doit y avoir une boucle for qui me dira les deux valeurs montrant l'espace maximal réalisable. C'est donc une équation du 2° degré et les valeurs sont 500 et 250 qui nous donneront l'espace maximum avec 1km de clôture. Nous n'avons besoin que de trois côtés étant donné que la rivière représente le 4° côté.

    Je suis largué, je n'arrive pas à finir ces devoirs-là. J'accepterai avec plaisir votre aide.
    • Partager sur Facebook
    • Partager sur Twitter
      3 mai 2011 à 16:19:08

      Tu peux y aller comme un bourrin: fais une boucle for qui parcourt toutes les valeurs possible pour A (et donc pour B) et qui calcule chaque fois l'aire correspondante, en la comparant avec la valeur maximum que tu auras trouvée précédemment. Il y a des tonnes de méthodes savantes pour faire ce genre de calcul d'optimisation, mais ne va surtout pas chercher trop loin :lol:
      • Partager sur Facebook
      • Partager sur Twitter
        3 mai 2011 à 16:23:18

        xD Je cherche depuis ce matin 10h, je dois vraiment pas être doué si tu as trouvé.
        Je vois pas comment faire la boucle et que l'algorithme trouve lui-même les deux valeurs adéquate. Personnellement, je sais que c'est 250 et 500 mais je l'ai trouvé moi-même...
        • Partager sur Facebook
        • Partager sur Twitter
          3 mai 2011 à 16:30:34

          Tu devrais trouver la réponse toi-même, mais bon voilà:

          Utilise des variables pour mémoriser l'aire maximum (Aire_max) que tu trouves et le A correspondant (A_max). Ces variables sont initialisées à zéro. A chaque tour de boucle qui fait varier A, compare la nouvelle aire obtenue (A*B) avec l'aire maximum (Aire_max) et si l'aire est plus grande que Aire_max, change les valeurs de Aire_max et A_max en conséquence. A la fin de la boucle, A_max contiendra la meilleure valeur pour A. :magicien:
          • Partager sur Facebook
          • Partager sur Twitter
            3 mai 2011 à 16:49:36

            Merci beaucoup mais comment dois-je faire pour commencer le programme ? Dois-j faire une textbox où l'on entre un nombre et ce nombre sera A ?
            • Partager sur Facebook
            • Partager sur Twitter
              3 mai 2011 à 17:15:30

              Non, puisque c'est ta boucle for qui fait évoluer A.

              Si tu devais résoudre le problème à la main, tu n'envisagerais pas d'essayer toutes les combinaisons possibles pour A et B en calculant chaque fois l'aire correspondante pour trouver la meilleure : ça te prendrait un temps dingue. Mais l'ordinateur n'a pas ce problème, car il calcule beaucoup plus vite que toi ! Donc hop, écris un programme qui fait ça et on n'en parle plus :p
              • Partager sur Facebook
              • Partager sur Twitter
                3 mai 2011 à 17:30:53

                int Aire_max = 0;
                            int A_max = 0;
                            int A = 1;
                            int B = 1;
                            int iRes = A*B;
                
                            for(iRes > Aire_max;Aire_max = iRes;)
                


                Je m'embrouille... Je dois faire comment pour incrémenter A et B individuellement (je veux dire qu'il ne s'incrémente pas simultanément sinon ils se testeraient pas)
                • Partager sur Facebook
                • Partager sur Twitter
                  3 mai 2011 à 17:39:45

                  Pas besoin de les incrémenter individuellement, tu fais un simple <math>\(B = 1000 - 2* A\)</math> comme ça une simple boucle sur A allant de 1 à 499 et tu couvre toutes tes possibilités (sans parler après d'éventuelles optimisations, comme l'a dit Orwell c'est pas important dans un premier temps) ;)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    3 mai 2011 à 17:47:54

                    try
                                {
                                int Aire_max = 0;
                                int A_max = 0;
                                int A = 1;
                                int iLongueur = Convert.ToInt32(tbxLongueur.Text);
                    
                                int B = iLongueur - 2 * A;
                                for (A = 1; A <= 500; A++) ;
                    
                                Aire_max = A * B;
                    
                    
                                    MessageBox.Show("L'aire maximale est " + Aire_max, "Résultat", MessageBoxButtons.OK, MessageBoxIcon.Information);
                                }
                                catch
                                {
                                    MessageBox.Show("Veuillez saisir un nombre","Résultat", MessageBoxButtons.OK, MessageBoxIcon.Information);
                                }
                    
                                tbxLongueur.Focus();
                                tbxLongueur.SelectAll();
                    


                    Ca c'est mieux ?
                    Après ça, est-ce finit ou dois-je encore faire quelque chose ?
                    • Partager sur Facebook
                    • Partager sur Twitter
                      3 mai 2011 à 18:19:39

                      >_< Soyons compréhensif...

                      Récapitulons:
                      Tu dois trouver la paire de valeurs A et B qui maximise A*B, sachant que 2*A+B = 1000 et que A et B sont des entiers positifs.
                      La manière la plus simple de faire ça est d'essayer toutes les combinaisons possibles pour A et B, et de voir quelle est la meilleure.
                      Pour trouver toutes les paires (A,B) possibles il te suffit de faire varier A, car la valeur de B pourra être recalculée chaque fois à partir de A (B = 1000-2*A). Et pour savoir quelle est la meilleure paire (A,B), il te suffit de garder sous la main le meilleur résultat obtenu au cours des itérations précédentes et de comparer.

                      Comme l'a dit ton prof, commence par faire ton structogramme parce que visiblement tu n'arriveras pas à écrire le code directement. En tout cas n'essaie surtout pas de te lancer dans une application Windows pour ça, tu as encore beaucoup à apprendre avant d'en arriver là...
                      • Partager sur Facebook
                      • Partager sur Twitter
                        3 mai 2011 à 18:31:56

                        Ben enfaite, je crois que j'ai une erreur dans mon code car je n'obtient pas 250*500 qui est égal à 125000 si je me souviens bien...
                        • Partager sur Facebook
                        • Partager sur Twitter
                          3 mai 2011 à 18:42:29

                          On voit bien qu'il y a des erreurs dans ton code, mais on ne va pas te donner le code correct pour autant. ;)

                          Relis les explications qu'on t'as données et réfléchis aux modifications que tu dois apporter à ton code pour appliquer tout ça. Tu auras peut-être besoin de revoir la théorie sur la boucle for.
                          • Partager sur Facebook
                          • Partager sur Twitter

                          La barrière de 1km pour l'âne

                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                          • Editeur
                          • Markdown