Aide codage: le tri croissant de valeurs contenus dans des variables

Viewing 7 posts - 1 through 7 (of 7 total)
  • Author
    Posts
  • #104283 quote
    RicLg
    Participant
    Senior

    Bonjour,
    Je souhaiterai une aide sur le codage d’un algorithme de tri, UNIQUEMENT avec des IF
    J’ai 4 variables Tata, Tete,Titi, Toto. Chacune ayant une valeur positive.
    L’algorithme devra classer les positions des variables par ordre croissant.
    Avec Max() et Min() , j’obtiens les positions extrêmes. Je bute sur l’identification des 2 variables intermédiaires pour pouvoir leur affecter leur positionnement.
    Merci.

    #105195 quote
    Nicolas
    Keymaster
    Master

    En effet sans un tableau c’est compliqué de trier des valeurs contenus dans des variables.

    Tu as de la chance si tu en as que 4 à trier cependant 😉

    Puisque tu connais déjà le premier et le dernier grâce à MIN et MAX, tu peux facilement trier ceux intermédiaire en testant si leurs valeurs est différentes des premiers et derniers.

    Admettons que tata et toto soient les premiers et derniers, alors tu testes simplement si tete > titi et tete <> tata et tete <> toto. Si la réponse est vrai, alors tete est la deuxième valeur du tri.

    #105406 quote
    RicLg
    Participant
    Senior

    Merci Nicolas pour la solution pour 4 variables.
    La “chance n’est plus de mon coté, je pense que je vais avoir besoin de  6 variables à trier.
    Sans tableaux et sans boucle c’est “un poil compliqué” 🙂

    #105410 quote
    Nicolas
    Keymaster
    Master

    Je dirai mission impossible, à moins de tester un ensemble de boucles imbriquées, mais ça ne me dit rien qui vaille …

    #105722 quote
    JC_Bywan
    Moderator
    Master

    Pour le fun, j’ai tenté l’exercice avec 6 variables, avec comme contrainte dans l’esprit de la requête: que des if, pas de boucle for ni de boucle while

    Si on comparait tout à la fois à coups de if imbriqués ça donnerait une usine à gaz, mais si on fait un peu de tri dans des variables intermédiaires, si je me suis pas trompé, c’est pas aussi long qu’on pourrait le craindre:

    // 
    // Trier 6 variables avec uniquement des if, pas de boucle for to, ni de while do
    // Noobywan 2019.08.28 pour ProRealCode
    //
    
    // Les 6 variables désordonnées de départ sont a1 à a6
    a1=3
    a2=2.35
    a3=4.5
    a4=7
    a5=-1
    a6=0
    
    b1=min(a1,min(a2,min(a3,min(a4,min(a5,a6)))))
    b2=a2
    b3=a3
    b4=a4
    b5=a5
    b6=a6
    
    if a2=b1 then
      b2=a1
    elsif a3=b1 then
      b3=a1
    elsif a4=b1 then
      b4=a1
    elsif a5=b1 then
      b5=a1
    elsif a6=b1 then
      b6=a1
    endif
    
    c2=min(b2,min(b3,min(b4,min(b5,b6))))
    c3=b3
    c4=b4
    c5=b5
    c6=b6
    
    if b3=c2 then
      c3=b2
    elsif b4=c2 then
      c4=b2
    elsif b5=c2 then
      c5=b2
    elsif b6=c2 then
      c6=b2
    endif
    
    d3=min(c3,min(c4,min(c5,c6)))
    d4=c4
    d5=c5
    d6=c6
    
    if c4=d3 then
      d4=c3
    elsif c5=d3 then
      d5=c3
    elsif c6=d3 then
      d6=c3
    endif
    
    e4=min(d4,min(d5,d6))
    e5=d5
    e6=d6
    
    if d5=e4 then
      e5=d4
    elsif d6=e4 then
      e6=d4
    endif
    
    f5=min(e5,e6)
    f6=e6
    
    if e6=f5 then
      f6=e5
    endif
    
    // Les  6 variables d'arrivée dans l'ordre croissant sont b1, c2, d3, e4, f5, f6
    
    return b1 as "1er", c2 as "2e", d3 as "3e", e4 as "4e", f5 as "5e", f6 as "6e"
    rwanderer thanked this post
    #105812 quote
    RicLg
    Participant
    Senior

    Merci Noobywan , j’aurai pu trouver la solution, mais il m’aurait fallu 3 ans de réflexions  ^^

    #105833 quote
    RicLg
    Participant
    Senior
    En m'inspirant de l'approche de Noobywan.
    Rem Trier 6 variables avec uniquement des if, pas de boucle for to, ni de while do
    Rem Les 6 variables désordonnées de départ sont a1 à a6
    a1=3
    a2=2.35
    a3=4.5
    a4=7
    a5=-1
    a6=0
    
    Rem 1° position
    Rem ¯¯¯¯¯¯¯¯¯¯¯
    b1=min(a1,min(a2,min(a3,min(a4,min(a5,a6)))))
    
    Rem 6° position
    Rem ¯¯¯¯¯¯¯¯¯¯¯
    c1=max(a1,max(a2,max(a3,max(a4,max(a5,a6)))))
    Rem Swap
    if c1=a1 then
    a1=b1
    elsif c1=a2 then
    a2=b1
    elsif c1=a3 then
    a3=b1
    elsif c1=a4 then
    a4=b1
    elsif c1=a5 then
    a5=b1
    elsif c1=a6 then
    a6=b1
    endif
    
    Rem 5° position
    Rem ¯¯¯¯¯¯¯¯¯¯¯
    d1=max(a1,max(a2,max(a3,max(a4,max(a5,a6)))))
    Rem Swap
    if d1=a1 then
    a1=b1
    elsif d1=a2 then
    a2=b1
    elsif d1=a3 then
    a3=b1
    elsif d1=a4 then
    a4=b1
    elsif d1=a5 then
    a5=b1
    elsif d1=a6 then
    a6=b1
    endif
    
    Rem 4° position
    Rem ¯¯¯¯¯¯¯¯¯¯¯
    e1=max(a1,max(a2,max(a3,max(a4,max(a5,a6)))))
    Rem Swap
    if e1=a1 then
    a1=b1
    elsif e1=a2 then
    a2=b1
    elsif e1=a3 then
    a3=b1
    elsif e1=a4 then
    a4=b1
    elsif e1=a5 then
    a5=b1
    elsif e1=a6 then
    a6=b1
    endif
    
    Rem 3° position
    Rem ¯¯¯¯¯¯¯¯¯¯¯
    f1=max(a1,max(a2,max(a3,max(a4,max(a5,a6)))))
    Rem Swap
    if f1=a1 then
    a1=b1
    elsif f1=a2 then
    a2=b1
    elsif f1=a3 then
    a3=b1
    elsif f1=a4 then
    a4=b1
    elsif f1=a5 then
    a5=b1
    elsif f1=a6 then
    a6=b1
    endif
    
    Rem 2° position
    Rem ¯¯¯¯¯¯¯¯¯¯¯
    g1=max(a1,max(a2,max(a3,max(a4,max(a5,a6)))))
    
    Rem Les  6 variables d'arrivée dans l'ordre croissant
    return b1 as "1°position", g1 as "2°position", f1 as "3°position", e1 as "4°position ", d1 as "5°position", c1 as "6°position"

    En remerciant Noobywan pour son approche, j’ai pondu une une variante pour le fun aussi 🙂

    rwanderer thanked this post
Viewing 7 posts - 1 through 7 (of 7 total)
  • You must be logged in to reply to this topic.

Aide codage: le tri croissant de valeurs contenus dans des variables


ProBuilder : Indicateurs & Outils Personnalisés

New Reply
Author
author-avatar
RicLg @riclg Participant
Summary

This topic contains 6 replies,
has 3 voices, and was last updated by RicLg
6 years, 6 months ago.

Topic Details
Forum: ProBuilder : Indicateurs & Outils Personnalisés
Language: French
Started: 08/06/2019
Status: Active
Attachments: No files
Logo Logo
Loading...