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

Delphi Discussion :

tri de tableau array


Sujet :

Delphi

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    417
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 417
    Par défaut tri de tableau array
    bonjour
    j'ai défini mon tableau comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    var
    nbr_numero: array[1..50] of integer
    donc exemple
    nbr_numero[1]:=78;
    nbr_numero[2]:=28;
    nbr_numero[3]:=46;
    nbr_numero[4]:=23;
    ect..

    comment faire pour trier ce tableau pour que sa commence
    par le plus petit ou plus gros
    exemple
    nbr_numero[4]:=23;
    nbr_numero[2]:=28;
    nbr_numero[3]:=46;
    nbr_numero[1]:=78;
    merci de votre aide

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 931
    Billets dans le blog
    66
    Par défaut
    Bonjour,

    si tu n'es pas contre de l'innovation utilise l'unité System.Generics.Collection et à la place d'un Tarray[1.50] un TList<Integer>
    du coup, en mde flemmard, tu n'auras plus qu'à utiliser Sort.

    exemple rapide
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var a : TList<Integer>;
    begin
    a:=Tlist<Integer>.Create;
    for var i := 1 to 50 do
      a.Add(random(50));
    a.sort;
    avantage c'est que ce TList permet pas mal de chose déjà tu peux mettre les valeurs directement lors du Create

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    a:=Tlist<Integer>.Create([78,28,46,23]); // ordre ascendant
    pour peu d'utiliser un comparateur tu pourras avoir ton propre tri
    ici, à "l'arrache" le tri en ordre inverse
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    // note pour le comparateur il faut rajouter dans les clauses uses System.Generics.Defaults
    a.Sort(
        TComparer<Integer>.Construct(
        function(const Left, Right: Integer) : Integer
        begin
          if Left>Right then result:=-1
                        else result:=1;
        end)
        ) ;
    et comme un TList<> est énumérable tu peux faire ceci pour lister les éléments de la liste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for var n in a do
      memo1.lines.add(n.ToString);

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    417
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 417
    Par défaut
    bonsoir
    merci pour votre aide
    je suis encore sur mon jeu loto

    je compte dans la base le nombre de fois que les chiffres sont sorties

    exemple
    numéro 1 sortie 54 fois
    numéro 2 sortie 70 fois
    numéro 3 sortie 28 fois
    ect ..
    comment alors affiche ces nombres du plus gros au plus petit
    pour trier une tlist simple je me sert du tri a bulle
    mais la c'est différent car je veux garder indice du numéro

    tri a bulle ci dessous pour une liste de chiffres
    mais comment savoir le plus gros chiffre mis en haut concerne quelle numéro tiré
    car je voudrais que le tri garde son numéro de tirage
    merci


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Procedure Tform1.TriABulles(Var Tab:Array Of Integer);
    Var i,j,t:Integer;
    Begin
      For i:=Low(Tab) To High(Tab)-2 Do For j:=i+1 To High(Tab)-1 Do If Tab[i]>Tab[j] Then
      Begin
        t:=Tab[i];
        Tab[i]:=Tab[j];
        Tab[j]:=t;
      End;
    End;

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    417
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 417
    Par défaut
    bonsoir
    voici ma sortie non triée
    Nom : sortienum.png
Affichages : 234
Taille : 5,6 Ko

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    417
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 417
    Par défaut
    bonsoir
    j'ai fait sa
    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
    42
    43
     
    TMonType = record
      Id : Integer;
      Chaine : integer;
      end;
    var
    numtirage: array[1..50] of TMonType;
     
    for f:= 1 to 50 do begin
     numtirage[f].Id:=0;
     numtirage[f].Chaine:=0;
     
     end;
     
    Procedure Tform1.Tritableau(Var Tab:array of TMonType);
    var
      MonTypeTmp : TMonType;
      bSwap : Boolean;
      i:integer;
    begin
      // tri du tableau
      bSwap := True;
      While bSwap do
      begin
        bSwap := False;
        for i := low(tab) to high(tab) - 1 do
        begin
          if (tab[i].chaine > tab[i + 1].chaine) then
          begin
            MonTypeTmp := tab[i];
            tab[i] := tab[i+1];
            tab[i+1] := MonTypeTmp ;
            bSwap := true;
          end;
        end; // for
      end; // while
     
     
    end;
     
     
    //et pour appelle
    Tritableau(numtirage);

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 931
    Billets dans le blog
    66
    Par défaut
    Citation Envoyé par tintin62 Voir le message
    comment alors affiche ces nombres du plus gros au plus petit
    pour trier une tlist simple je me sert du tri a bulle
    mais la c'est différent car je veux garder indice du numéro
    Bon, tu vas peut-être écrire que j'exagère, mais rien ne t'empêche d'utiliser un TDictionnary<integer,integer> à la place d'un TList. Le premier integer c'est le numéro de boules, le second le nombre de fois.
    Reste à remplir ce dictionnaire qui pourra ensuite être trié, au choix, par le premier (par défaut) ou le second entier (par comparateur).

    je suis encore sur mon jeu loto
    donc avec une base de données SQLite ? Dans ce cas il faudrait peut-être envisager des requetes SQL à la place.
    Désolé on est Lundi (jour Kiné) donc je n'ai pas l'énergie de dévellopper la proposition.

    voilà la requête en utilisant les possibilités des SGBD à savoir les Common Table Expression et les requêtes Recursives
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    WITH N AS (
    WITH RECURSIVE
      Boules(numero) AS (VALUES(1) UNION ALL SELECT numero+1 FROM boules WHERE numero<50)
    SELECT b.numero,t.ID FROM boules b Join Tirage t ON 1=1 where b.numero in (t.boule1,t.boule2,t.boule3,t.boule4,t.boule5)
    )
    SELECT Numero,Count(1) Fois FROM N GROUP BY NUMERO;
    Petite mais efficace
    Nom : Capture.png
Affichages : 225
Taille : 128,7 Ko
    pour le tri par nombre de fois il suffit de rajouter une clause d'ordre ORDER BY Fois DESC;Donc en utilisant Firedac et ses spécificités je transformerai la requête en

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    WITH N AS (
    WITH RECURSIVE
      Boules(numero) AS (VALUES(1) UNION ALL SELECT numero+1 FROM boules WHERE numero<50)
    SELECT b.numero,t.ID FROM boules b Join Tirage t ON 1=1 where b.numero in (t.boule1,t.boule2,t.boule3,t.boule4,t.boule5)
    )
    SELECT ?Champs FROM N GROUP BY NUMERO  ?Ordre;
    j'ai utilisé ?Champs comme macro car ainsi tu pourras changer facilement les champs pour avoir soit 'Numero,Count(1) Fois' soit 'Count(1) Fois,Numero' te permettant d'afficher directement le resultat dans une grille.

    Sur ce, je vais me diriger vers ma table de douleur

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    417
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 417
    Par défaut
    bonjour
    je compatis pas agréable le kiné
    je vois que tu génère sa avec SQLite studio
    mais avec Delphi comment afficher sa dans un Tlistbox ou autre
    merci

  8. #8
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 931
    Billets dans le blog
    66
    Par défaut
    mais avec Delphi comment afficher ça dans un Tlistbox ou autre
    Puisqu'il s'agit d'un FDquery, en VCL, tu utiliseras un TDBGrid associé au un TDataset, le TDataset pointant sur le FDQuery.
    Nom : Capture.png
Affichages : 214
Taille : 10,2 Ko

    Quand à ma requête, à la fin de ma séance de "tortriturages", en revenant à la maison j'ai pensé que celle-ci n'était pas optimum.
    La raison : à chaque JOIN ON 1=1 je récupére l'ensemble de la table, la clause WHERE étant traitée par la suite.
    Ma faute : je trouve sacrilège d'utiliser un SELECT dans ma liste de colonnes.

    donc, je pense que optimisé, voilà ce que ça donne
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    WITH N AS (
    WITH RECURSIVE
      Boules(numero) AS (VALUES(1) UNION ALL SELECT numero+1 FROM boules WHERE numero<50)
    SELECT b.numero, (SELECT COUNT(1) FROM TIRAGE WHERE B.NUMERO IN (BOULE1,BOULE2,BOULE3,BOULE4,BOULE5))  Fois FROM boules b
    )
    SELECT Numero,Fois FROM N;

  9. #9
    Invité de passage
    Homme Profil pro
         ​​​  
    Inscrit en
    Décembre 2025
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité :      ​​​  

    Informations forums :
    Inscription : Décembre 2025
    Messages : 93
    Par défaut
    Utiliser le counting sort c'est le plus adapté pour les tirages aléatoires en entier et une plage limitée.

    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
    arr  :=[23,23,55]
    out : array of interger
    for c in arr do
    begin
      if c >= length(out) then
    Setlength(out,c+1) ; 
    inc(out[c]) ; 
     
    end ; 
    // print
    s : string ; 
    for i  : = 0 to  length(out)-1do 
    if out[i] > 0 then
     s  : = s + i.ToString + ' : '+out[i].ToString ; 
    Swmesssage(s) ;
    pas testé

  10. #10
    Membre expérimenté
    Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    743
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2017
    Messages : 743
    Billets dans le blog
    1
    Par défaut
    Pas de .sort(). Pas de bibliothèque. Pas de magie cachée, Juste la logique pure.

    Pour trier ton tableau, le principe est algorithmique, indépendant du langage : on compare les valeurs deux à deux et on les échange si elles ne sont pas dans le bon ordre.

    Voici un exemple simple, en utilisant un tri par sélection (idéal pour comprendre).

    Tri par sélection, l'un des algorithmes fondamentaux de l'informatique.
    1. On parcourt le tableau avec deux boucles imbriquées
    2. On compare chaque paire de valeurs
    3. Si une valeur est plus petite, on échange les deux positions
    4. À chaque passage, le plus petit élément restant remonte à sa place


    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
    // TRI D'UN TABLEAU - ORDRE CROISSANT
    // --- VARIABLES ---
    nbr_numero est un tableau
    i est un nombre
    j est un nombre
    temp est un nombre
    n est un nombre
     
    // --- TAILLE DU TABLEAU ---
    n vaut 4
    taille(nbr_numero, n)
     
    // --- INITIALISATION ---
    nbr_numero[0] vaut 78
    nbr_numero[1] vaut 28
    nbr_numero[2] vaut 46
    nbr_numero[3] vaut 23
     
    // --- TRI PAR SELECTION (croissant) ---
    pour i de 0 a n - 2
      pour j de i + 1 a n - 1
        si nbr_numero[j] < nbr_numero[i] alors
          temp vaut nbr_numero[i]
          nbr_numero[i] vaut nbr_numero[j]
          nbr_numero[j] vaut temp
        fin si
      fin pour
    fin pour
     
    // --- AFFICHAGE ---
    affiche 'Tableau trie (ordre croissant) :'
    pour i de 0 a n - 1
      affiche nbr_numero[i]
    fin pour
    Nom : resultat-educode (1).png
Affichages : 180
Taille : 25,1 Ko

  11. #11
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 931
    Billets dans le blog
    66
    Par défaut Memento
    Je me souviens que lorsque tu as lancé le sujet, il y avait eu débat sur la structure de ta base de données.
    Nous avons fait avec ton idée : une seule table tout en en recommandant a minima 2 , la table des tirages et une table des boulesdutirage quelque chose comme BOULESTIRAGES(idUnique,IdTirage,Boule)
    Cette dernière stucture aurait plus que largement simplifié tout les problèmes que tu as pu rencontrer par la suite dont ce sujet !

  12. #12
    Membre Expert

    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2007
    Messages
    3 591
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 591

  13. #13
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    712
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 712
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    En passant rapidement, j'avais fait un petit record TGBEArray qui permet tout un tas de manipulations sur les TArray (map, reduce, filter, unique, sort...).
    C'est disponible sur GitHub gratuitement avec un exemple d'utilisation : https://github.com/gbegreg/MapReduce
    Mon site - Mes tutoriels - GitHub - Youtube - N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

Discussions similaires

  1. [JavaScript] [FAQ] Tri alphanumérique d'un tableau (array)
    Par danielhagnoul dans le forum Contribuez
    Réponses: 1
    Dernier message: 16/12/2014, 23h52
  2. tableau array
    Par laclac dans le forum Langage
    Réponses: 8
    Dernier message: 01/09/2005, 11h04
  3. [PERL] problème tri de tableau
    Par LE NEINDRE dans le forum Langage
    Réponses: 2
    Dernier message: 31/08/2005, 15h42
  4. Comment faire le tri d'un array of array ?
    Par Tchouffy dans le forum Langage
    Réponses: 1
    Dernier message: 16/06/2005, 20h55
  5. [langage] tri dans tableau de hachage
    Par mimilou dans le forum Langage
    Réponses: 2
    Dernier message: 10/03/2004, 16h10

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