Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème boucle if else avec Ruby

    2 juillet 2019 à 9:15:33

    Bonjour,

    Je me suis relancé dans l'apprentissage du Ruby.
    J'ai voulu créer un petit code pour calculer une température d'hybridation pour les amorces en biologie. Les conditions sont si le nombre de paire de base est <=20, il y a un calcul à faire, si >=20 on utilise un autre calcul.
    Je ne comprends pas pourquoi, le programme ne me regarde qu'une condition dans la boucle.
    J'ai mis un code qui donne le chiffre obtenu afin d'être certain que le 1er calcul se passe bien avant que le programme rentre dans la boucle.

    Normalement si on met 6 à chaque lettre, la Tm finale doit être de 86,4°C car il y a 24 paire de base. Mais le programme me sort 72°C (il prend en compte la condition nombre de base <=20 et non >=20).

    puts "Quel est le nombre de a ?"
    a = gets.to_i
    puts "Quel est le nombre de t ?"
    t = gets.to_i
    puts "Quel est le nombre de g ?"
    g = gets.to_i
    puts "quel est le nombre de c ?"
    c = gets.to_i
    
    total_1 = (a+c+g+t).to_i
    
    puts "Ton primer mesure #{total_1} pb."
    
    if  total_1 <= 20
    	tm_1 = ((a+t)*2+(c+g)*4).to_i
    	puts "Sa tm est de #{tm_1} °C."
    else 
    	tm_1 = (((a+t)*2+(c+g)*4)*(1+((total_1-20)/20))).to_i
    	puts "Sa tm est de #{tm_1} °C."
    end


    Merci de votre aide.

    • Partager sur Facebook
    • Partager sur Twitter
      2 juillet 2019 à 9:57:39

      Salut,

      Pour commencer if et else ne sont pas des boucles. Ils permettent de faire des conditions. De plus, note qu'en Ruby, on indente de deux caractères et pas de quatre.

      Quant à ton problème, tu rentres bien dans ton else (il te suffit de modifier le message affiché pour le voir), c'est donc ton calcul qui pose problème. Et c'est normal ; puisque tu travailles avec des entiers, si total_1 vaut 24, (total_1 - 20)/20 vaut 0. Je remplace donc toute ta condition par le code suivant.

      tm_1 = ((a+t)*2+(c+g)*4)
      tm_1 *= 1 + (total_1 - 20)/20.0 if total_1 &gt; 20
      puts "Sa tm est de #{tm_1.round(2)} °C."
      

      Je multiplie par le facteur si besoin est en divisant par 20.0 pour avoir un flottant.

      EDIT : j'oublie que l'éditeur du forum est totalement bugué, remplace &gt; par >.

      -
      Edité par yo@n97one 2 juillet 2019 à 9:58:22

      • Partager sur Facebook
      • Partager sur Twitter
      Tutoriel Ruby - Bon tutoriel C - Tutoriel SDL 2 - Python avancé - Faîtes un zeste, devenez des zesteurs
        2 juillet 2019 à 21:39:12

        Oui effectivement je suis parti trop vite en écrivant boucle au lieu de conditions.

        J'essaie ta proposition demain, c'est gentil pour ta réponse très rapide ;)

        Je te tiens au jus.

        Encore Merci

        • Partager sur Facebook
        • Partager sur Twitter
          4 juillet 2019 à 14:59:36

          Salut Yo@n97one,

          J'ai modifié le code comme tu me l'as conseillé et tout marche à merveille ;)

          Par contre aurais-tu des tutos ou autres afin de savoir comment effectuer des calculs avec tableau en ruby ? J'ai réussi à stocker mes données dans un tableau, et je voudrai réaliser le calcul de la moyenne des température collectées.

          Je ne trouve rien dans tous les tutos sur comment traités les données stockées dans un tableau hors mis comment lire ou faire apparaitre des trucs banales.

          Merci

          • Partager sur Facebook
          • Partager sur Twitter
            4 juillet 2019 à 15:41:25

            Hello,

            Des petits exemples :

            [1] pry(main)> product = [5, 7, 9, 1, 3, 1, 5].inject(1, :*)
            => 4725
            [2] pry(main)> sum = [5, 7, 9, 1, 3, 1, 5].inject(1, :+)
            => 32
            [3] pry(main)> average = sum / 7.0
            => 4.571428571428571
            

            Plus d'info ici :

            https://ruby-doc.org/core-2.6.3/Enumerable.html

            https://mixandgo.com/learn/what-is-a-ruby-enumerable-and-why-would-you-use-it

            • Partager sur Facebook
            • Partager sur Twitter

            Architecte logiciel - Software craftsmanship convaincu.

              4 juillet 2019 à 16:31:46

              Hello necros211,

              Je vais regarder ça à tête reposée. Mon code devra être composé de parcourir le tableau dont la taille peut varier (dépendant  de la question première du programme_nombre de primer à rentrer).

              Le code devra ainsi parcourir le tableau en fonction du nombre écrit, puis ensuite faire la somme des températures calculées qui sera divisée par le nombre  de primers (chiffre donné au début du programme).

              Je ne le cache pas, le programme est basique, d'aucunes utilités pour mon labo. Mais j'utilise ces calculs basiques pour apprendre à programmer  en ruby ^^.

              Up ----

              J'ai réussi à finir mon programme sans gros intérêt mais juste assez pour l'apprentissage du ruby ;)

              Je vous met mon code, je me doute bien qu'il peut être remanier et écrit différemment surtout à la vue des programmeurs. Mais bon faut bien démarrer :)

              puts "Combien de primers as-tu ?"
              nb_primers = gets.to_i
              temperature = []
              
              #initialisation de la boucle
              i = 0 
              while ( i != nb_primers)
              	i += 1
              	
              	#collecte des informations sur les primers
              	puts "Quel est le nombre de a ?"
              	a = gets.to_f
              	puts "Quel est le nombre de t ?"
              	t = gets.to_f
              	puts "Quel est le nombre de g ?"
              	g = gets.to_f
              	puts "quel est le nombre de c ?"
              	c = gets.to_f
              
              	#calcul total du nb de paire de base
              	total = (a+c+g+t).to_f
              	
                  #formule pour un primer <=20 pb
                  calcul= ((a+t)*2+(c+g)*4).to_f
              
              	if  total<= 20
              		tm = calcul
              	else 
              		tm = calcul*=(1+(total-20)/20).to_f
              	end
              	
              	#stockage tm dans un tableau
              	temperature << tm
              end
              
              # calcul de la température moyenne
              somme = temperature.inject { |sum, n| sum +n }
              moyenne = somme / nb_primers
              puts "La somme des température est de #{somme} °C."
              puts "La température moyenne des primers est de #{moyenne} °C."


              Encore merci Yo@n97one, et necros211 pour votre aide.

              -
              Edité par tigroudu13 4 juillet 2019 à 16:53:20

              • Partager sur Facebook
              • Partager sur Twitter
                4 juillet 2019 à 18:18:35

                Notes que tu peux faire la somme des éléments de tab avec tab.sum depuis la version 2.4 de Ruby je crois (en plus des ressources données plus haut par necros211, tu peux regarder ce chapitre du tutoriel de ZdS pour Enumerable), et bien sûr la doc est ta meilleure amie).

                Sinon, indentation de deux caractères, et plutôt que faire une boucle while utilise times.

                n.times do
                  # Ce que tu dois faire n fois
                end 
                

                En fait, en faisant une fonction où tu demandes tes trucs et qui renvoie tm, tu pourrais même faire par exemple Array.new(nb_primers) {get_tm()}.

                • Partager sur Facebook
                • Partager sur Twitter
                Tutoriel Ruby - Bon tutoriel C - Tutoriel SDL 2 - Python avancé - Faîtes un zeste, devenez des zesteurs
                  4 juillet 2019 à 19:16:16

                  Je te propose un petit corriger un peu plus rubyish :)

                  puts 'Combien de primers ?'
                  primer_count = gets.to_i
                  
                  temperatures = primer_count.times.map do
                    bases = %w[a t g c].map do |base_name|
                      puts "Quel est le nombre de #{base_name}"
                      gets.to_f
                    end
                  
                    total = bases.inject(0, :+)
                    a, t, g, c = *bases
                    calculus= (a+t)*2+(c+g)*4
                  
                    if total <= 20
                      calculus
                    else
                      calculus * (1+(total-20)/20)
                    end
                  end
                  
                  sum = temperatures.inject(0, :+)
                  average = sum / temperatures.count
                  
                  puts "La somme des température est de #{sum} °C."
                  puts "La température moyenne des primers est de #{average} °C."
                  

                  Je n'ai pas vérifier les calculs, mais normalement ce sont les memes.

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Architecte logiciel - Software craftsmanship convaincu.

                    4 juillet 2019 à 22:19:31

                    Encore merci à tous les 2.

                    Et necros211, je me doutais bien que l'on pouvait faire plus cours que mon code. Mais j'en suis encore loin de ton niveau :lol: mais faut bien démarrer avec quelque chose :p. Quoiqu'il en soit je vais y jeter un coup d'oeil sur ton code, cela me permettra de peaufiner pour plus tard ;)

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Problème boucle if else avec Ruby

                    × 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