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

Ruby Discussion :

boucle if else qui ne rempli pas les conditions


Sujet :

Ruby

  1. #1
    Candidat au Club
    Homme Profil pro
    Ingénieur d'Etude Biologie
    Inscrit en
    Janvier 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suède

    Informations professionnelles :
    Activité : Ingénieur d'Etude Biologie

    Informations forums :
    Inscription : Janvier 2015
    Messages : 5
    Points : 3
    Points
    3
    Par défaut boucle if else qui ne rempli pas les conditions
    Bonjour,

    Je me suis relancé dans l'apprentissage du Ruby.
    J'ai voulu créer un petit code pour calculer une température de fusion pour les amorces en biologie. Les conditions sont si le nombre 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.

    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
     
    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 total_1
     
    if (total_1 <= 20)
        tm_1 = ((a+t)*2+(c+g)*4).to_i
        puts "Ta tm est de #{tm_1} °C."
    else 
        tm_1 = (((a+t)*2+(c+g)*4)*(1+((total_1-20)/20))).to_i
        puts "Ta tm est de #{tm_1} °C."
    end
    merci de votre aide.

  2. #2
    Membre extrêmement actif
    Avatar de Madmac
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2004
    Messages
    1 685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Alimentation

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 685
    Points : 1 376
    Points
    1 376
    Billets dans le blog
    7
    Par défaut
    Voici comment je m'y suis pris pour tester
    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
     
    $a =4
    $c = 6
    $g = 5
    $t = 3
     
    $total_1 = ($a+$c+$g+$t)
     
    if ($total_1 <= 20)
    	p 'moins que 19'
        $tm_1 = ((($a+$t)*2)+(($c+$g)*4))
        puts "Ta tm est de #{$tm_1} °$c."
    else 
    	p 'plus de 19'
        $tm_1 = ((($a+$t)*2+($c+$g)*4)*(1+(($total_1-20)/20))) 
        puts "Ta tm est de #{$tm_1} °$c."
    end
    À l'exception des $ qui manquaient, cela fonctionnait. Mais tu est trop généreux avec les conversions .to_i.

    Le truc à retenir est: Merde à l'entrée, merde à la sortie. La morale de ce dicton est: que tu t'assure de bien contrôler ce qui entre, tu n'as plus à te soucier du risque d'erreur par la suite. Si je m'assure que c'est des oranges qui vont à l'entrée de mon presse-jus, il est certain que j'aurais du jus d'orange à la sortie.

    Par contre, pour les formules, je garantie rien.

    Mais le branchement fonctionne.

  3. #3
    Candidat au Club
    Homme Profil pro
    Ingénieur d'Etude Biologie
    Inscrit en
    Janvier 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suède

    Informations professionnelles :
    Activité : Ingénieur d'Etude Biologie

    Informations forums :
    Inscription : Janvier 2015
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Je te remercie, j'ai obtenue une réponse plus rapide sur openclasseroom. J'ai ainsi pu adapter mon code sans utiliser de variable global comme tu me l'as écris dans ton code.
    Du coup le code fonctionnel en version non rubyish donne ceci

    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
     
    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."
    Après sur openclasseroom, on m'a donné un code qui fait plus rubyish et qui donne ceci

    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
     
    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."
    Merci quand même

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

Discussions similaires

  1. Supprimer les lignes qui ne répondent pas à les conditions
    Par tlhousni dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 10/04/2017, 12h16
  2. requete sql/php qui ne respecte pas les conditions
    Par bilcosby dans le forum Requêtes
    Réponses: 10
    Dernier message: 30/10/2015, 16h17
  3. [1.x] Formulaire mal rempli qui n'affiche pas les erreurs
    Par bahamut100 dans le forum Symfony
    Réponses: 5
    Dernier message: 03/06/2010, 00h21
  4. [Requete] qui n'affiche pas les doublons mais sur un seul champs
    Par joseph.breham dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 19/12/2006, 14h57

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