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
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 > 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 > par >.
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.
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.
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()}.
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.
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 mais faut bien démarrer avec quelque chose . Quoiqu'il en soit je vais y jeter un coup d'oeil sur ton code, cela me permettra de peaufiner pour plus tard
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.
Architecte logiciel - Software craftsmanship convaincu.
Architecte logiciel - Software craftsmanship convaincu.