|
Accueil → WINDEV 28 → Trier une liste de 24 entiers en identifiant les 5 entiers les plus grand et les 5 entier les plus petits |
Trier une liste de 24 entiers en identifiant les 5 entiers les plus grand et les 5 entier les plus petits |
Débuté par Ludovic BLANC, 20 sep. 2023 09:34 - 18 réponses |
| |
| | | |
|
| |
Membre enregistré 14 messages |
|
Posté le 20 septembre 2023 - 09:34 |
Bonjour tout est dans le titre, j'ai 24 entier a trier comme par exemple :
5,6,2,2,4,5,6,7,9,8,5,12,1,3,5,6,1,17,24,20,56,45,7,10
j'aimerais recuperer le rang des 5 plus grand entier : 18,19,20,21,22 (dans cet exemple) et le rang des 5 plus petit entier : 3,4,13,14,17
Comment faire svp.... j'ai meme pas un tout petit debut de bout de code a proposer.... je suis completement perdu...
sachant que je ne connais pas a l'avance les entier qui constitue ma liste, pour concretiser un peu plus tout cela, chaque entier correspond a un nombre de sms/heure sur 1 journée.... il peut y avoir des doublons.
Voila j'espere vous avoir donné assez d'elements pour pouvoir m'aider. Merci a ceux qui on prit du temps pour moi. |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 312 messages |
|
Posté le 20 septembre 2023 - 10:15 |
Bonjour, vous pouvez insérez les valeurs dans un tableau, puis TableauTrie et enfin vous récupérez les 5 premiers éléments du tableau et les 5 derniers. https://doc.pcsoft.fr/?3075007
tabListe est un tableau d'entiers sListe est une chaîne = "5,6,2,2,4,5,6,7,9,8,5,12,1,3,5,6,1,17,24,20,56,45,7,10" ChaîneVersTableau(sListe, tabListe, ",") TableauTrie(tabListe)
CdltMessage modifié, 20 septembre 2023 - 10:34 |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 3 701 messages Popularité : +227 (347 votes) |
|
Posté le 20 septembre 2023 - 10:16 |
Bonjour, Il suffit d'utiliser un tableau trié et de prendre les 5 premiers et les 5 derniers éléments. ça fait partie des premiers exos de programmation générale, juste après le tri à bulle.
-- Il y a peut être plus simple, mais, ça tourneMessage modifié, 20 septembre 2023 - 10:18 |
| |
| |
| | | |
|
| | |
| |
Posté le 20 septembre 2023 - 10:32 |
Ludovic BLANC a pensé très fort :
Bonjour tout est dans le titre, j'ai 24 entier a trier comme par exemple :
5,6,2,2,4,5,6,7,9,8,5,12,1,3,5,6,1,17,24,20,56,45,7,10
j'aimerais recuperer le rang des 5 plus grand entier : 18,19,20,21,22 (dans cet exemple) et le rang des 5 plus petit entier : 3,4,13,14,17
Comment faire svp.... j'ai meme pas un tout petit debut de bout de code a proposer.... je suis completement perdu...
sachant que je ne connais pas a l'avance les entier qui constitue ma liste, pour concretiser un peu plus tout cela, chaque entier correspond a un nombre de sms/heure sur 1 journée.... il peut y avoir des doublons.
Voila j'espere vous avoir donné assez d'elements pour pouvoir m'aider. Merci a ceux qui on prit du temps pour moi.
bonjour,
en utilisant un tableau de structure et en faisaint un tri croissant pour récup les 5 rangs les plus petits et décroissant pour les plus grands (code ci-dessous à vérifier et à améliorer directement saisie dans le message)
stResultat est STRUCTURE lVal est entier lRang est entier FIN
tabRes est un tableau de 0 stResultat stRes est un stResultat i est entier
i = 1 boucle de parcours des entiers stRes:lVal = valencours stRes:lRang = i tableauajoute(tabRes,stRes) i++ fin
// tri du tableau Tableautri(tabRes,tccRespecteNumérique,"+lRang") // croissant Tableautri(tabRes,tccRespecteNumérique,"-lRang") // décroissant
-- Cordialement JeAn-PhI |
| |
| |
| | | |
|
| | |
| |
Posté le 21 septembre 2023 - 10:30 |
Bonjour,
Pour avoir les rangs :
T est un tableau de * par 2 entiers
liste est chaîne="5,6,2,2,4,5,6,7,9,8,5,12,1,3,5,6,1,17,24,20,56,45,7,10" POUR c=1 À ChaîneOccurrence(liste,",")+1 TableauAjouteLigne(T,ExtraitChaîne(liste,c,","),c) FIN
TableauTrie(T,ttCroissant,1) POUR c=1 À TableauOccurrence(T) SI c<=5 ALORS Trace(T[c,1],T[c,2]) SI c=6 ALORS WL.Trace("******") SI c>(TableauOccurrence(T)-5) ALORS Trace(T[c,1],T[c,2]) FIN Salut ! |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 299 messages Popularité : +31 (37 votes) |
|
Posté le 22 septembre 2023 - 10:11 |
Bonjour,
Pour s'amuser (oui) , on peut le faire à l'ancienne :
- construire un tableau de reels contenant les mêmes valeur + le rang en partie décimale [5.01,6.02,2.03,2.04........10.24] - Faire le tri du tableau TableauTri() et relire les parties décimales des valeurs triées pour obtenir le rang...
Bon dev |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 14 messages |
|
Posté le 22 septembre 2023 - 10:42 |
Merci beaucoup pour toutes ses réponses qui vont globalement dans le même sens, je teste donc et je vous tiens au jus, mais il me semble avoir testé une fonction trie() ou tableautri() je ne sais plus, mais la fonction que j'ai testé ne renvoyais pas de résultat du coup je ne savais pas comment récupérer mes 5 valeurs+ et 5 valeurs- ... bref, merci beaucoup je test et je vous tiens au jus. |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 3 701 messages Popularité : +227 (347 votes) |
|
Posté le 22 septembre 2023 - 10:56 |
Samir BOUCHETIBAT a écrit :
Bonjour,
Pour s'amuser (oui) , on peut le faire à l'ancienne :
- construire un tableau de reels contenant les mêmes valeur + le rang en partie décimale [5.01,6.02,2.03,2.04........10.24] - Faire le tri du tableau TableauTri() et relire les parties décimales des valeurs triées pour obtenir le rang...
Bon dev C'est nettement plus marrant avec un tableau associatif avec des clés de 0 à 23, 0 correspondant au nombre d'appels entre 0000 et 0100 etc...
-- Il y a peut être plus simple, mais, ça tourneMessage modifié, 22 septembre 2023 - 10:56 |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 14 messages |
|
Posté le 04 octobre 2023 - 18:33 |
je pense avoir trouver une piste. La fonction Max() permet de faire apparemment ce que je veux visiblement... Pareil avec la fonction Min() ....Message modifié, 04 octobre 2023 - 18:35 |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 3 701 messages Popularité : +227 (347 votes) |
|
Posté le 04 octobre 2023 - 19:57 |
Apparemment est le mot juste. Je cite
Renvoie la plus grande des valeurs.
Il en reste 4
-- Il y a peut être plus simple, mais, ça tourne |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 312 messages |
|
Posté le 04 octobre 2023 - 23:52 |
Elpato n'était pas loin du résultat. Sur la base de son code :
TabValeurs est un tableau de * par 2 entiers TabPetitsEntiers est un tableau d'entiers TabGrandsEntiers est un tableau d'entiers i est un entier
sliste est chaîne= "5,6,2,2,4,5,6,7,9,8,5,12,1,3,5,6,1,17,24,20,56,45,7,10"
POUR i = 1 _À_ ChaîneOccurrence(sliste,",") + 1 TableauAjouteLigne(TabValeurs, ExtraitChaîne(sliste, i, ","), i) FIN TableauTrie(TabValeurs, ttColonne, "1;2")
POUR i = 1 _À_ 5 TableauAjouteLigne(TabPetitsEntiers, TabValeurs[i,2]) FIN TableauTrie(TabPetitsEntiers) Trace("Petits Entiers : " +TabPetitsEntiers[1] + "," + TabPetitsEntiers[2] + "," + TabPetitsEntiers[3] + "," + TabPetitsEntiers[4] + "," + TabPetitsEntiers[5])
POUR i = TableauOccurrence(TabValeurs)-4 _À_ TableauOccurrence(TabValeurs) TableauAjouteLigne(TabGrandsEntiers, TabValeurs[i,2]) FIN TableauTrie(TabGrandsEntiers) Trace("Grands Entiers : " +TabGrandsEntiers[1] + "," + TabGrandsEntiers[2] + "," + TabGrandsEntiers[3] + "," + TabGrandsEntiers[4] + "," + TabGrandsEntiers[5])
résultat de la trace : Petits Entiers : 3,4,13,14,17 Grands Entiers : 18,19,20,21,22 |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 3 701 messages Popularité : +227 (347 votes) |
|
Posté le 05 octobre 2023 - 00:40 |
Pourquoi diable passer par une chaîne "en dur" qui va servir à initialiser un tableau via une boucle, alors qu'il est plus simple d'initialiser le tableau "en dur".
tabValeurs est tableau d'entiers tabRes est tableau d'entiers
tabValeurs=[5,6,2,2,4,5,6,7,9,8,5,12,1,3,5,6,1,17,24,20,56,45,7,10]
TableauTrie(tabValeurs,ttDécroissant) tabRes=RécupérerValeurs(tabValeurs) TraceConstruit("5 valeurs max : %1",TableauVersChaîne(tabRes,",")) TableauTrie(tabValeurs,ttCroissant) tabRes=RécupérerValeurs(tabValeurs) TraceConstruit("5 valeurs min : %1",TableauVersChaîne(tabRes,","))
FONCTION RécupérerValeurs(tabValeurs est tableau d'entiers) : tableau d'entier tabRes est tableau [5] entier nInd est un entier
POUR nInd=1 À 5 tabRes[nInd]=tabValeurs[nInd] FIN
RENVOYER tabRes
-- Il y a peut être plus simple, mais, ça tourneMessage modifié, 05 octobre 2023 - 01:21 |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 3 701 messages Popularité : +227 (347 votes) |
|
Posté le 05 octobre 2023 - 07:20 |
@Cedric Attention 1-TabValeurs[i,2] Référence la 2° colonne, i.e. la colonne de numérotation, pour référencer la colonne de valeurs, il faut écrire
TabValeurs[i,1] Cela évite d'avoir des résultats avec des valeurs inexistantes : 13,14 et 18,19,21,22 2-Les TableauTrie sur les extraits min et max sont inutiles dans la mesure où ils sont remplis avec des valeurs triées
-- Il y a peut être plus simple, mais, ça tourneMessage modifié, 05 octobre 2023 - 07:22 |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 312 messages |
|
Posté le 05 octobre 2023 - 10:12 |
Bonjour Voroltinquo, En fait non, il ne s'agit pas de valeurs inexistantes mais du rang des valeurs (comme le demande Ludovic BLANC dans son message #1). Le tri de ces extraits est nécessaire car, même si ça parait étonnant, il souhaite obtenir les rangs dans l'ordre croissant, et non dans l'ordre des valeurs. Ensuite, je suis tout à fait d'accord avec toi sur le fait que le tableau "en dur" est plus simple, mais nous ne savons pas d'où proviennent les valeurs, je suis donc resté sur le remplissage par boucle car il est probable que ce tableau soit rempli ainsi.
Cordialement CédricMessage modifié, 05 octobre 2023 - 10:14 |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 3 701 messages Popularité : +227 (347 votes) |
|
Posté le 05 octobre 2023 - 10:49 |
Ooops en effet, je suis resté focalisé sur le Min() (post #9) On peut implémenter la fonction comme ceci. cf mon post #8 En reprenant la règle du post #1 : Ludovic BLANC a écrit : > chaque entier correspond a un nombre de sms/heure sur 1 journée Il m'a semblé plus logique de travailler avec des DateHeure
taValeurs est un tableau associatif (SansDoublon, *, wlDateHeure, 24) d'entiers dhGDH est une DateHeure tabValeursInitiales est tableau d'entier nInd est un entier saClés est chaîne hFinIntervalle est Heure duPas est Durée
tabValeursInitiales=[5,6,2,2,4,5,6,7,9,8,5,12,1,3,5,6,1,17,24,20,56,45,7,10] dhGDH="" hFinIntervalle="" duPas..EnHeures=1 dhGDH..PartieDate=DateDuJour()
POUR nInd=0 À 23 dhGDH..PartieHeure..Heure=nInd taValeurs[dhGDH]=tabValeursInitiales[nInd+1] FIN TableauTrie(taValeurs,ttCroissant)
TraceConstruit("Creux d'utilisation : %1",FormaterSortie(taValeurs,"Min"))
TraceConstruit("Pics d'utilisation : %1",FormaterSortie(taValeurs,"Max"))
Procedure FormaterSortie(taValeurs ,saTypeSortie est chaîne) :chaîne
nNbAppel est entier dhGDH est DateHeure nInd est entier
hFinIntervalle est Heure saIntervalle est chaîne saClés est chaîne
hFinIntervalle=""
POUR TOUT nNbAppel,dhGDH,nInd de taValeurs SELON Majuscule(saTypeSortie) CAS "MIN" SI nInd<=5 ALORS hFinIntervalle..Heure = dhGDH..PartieHeure..Heure+1 saIntervalle = ChaîneConstruit("%1 à %2, %3 appels",HeureVersChaîne(dhGDH..PartieHeure,"HH:MM"),... HeureVersChaîne(hFinIntervalle,"HH:MM"),nNbAppel) saClés=ChaîneConstruit("%1%2%3",saClés,CRLF,saIntervalle) FIN CAS "MAX" SI nInd>=20 ALORS hFinIntervalle..Heure = dhGDH..PartieHeure..Heure+1 saIntervalle = ChaîneConstruit("%1 à %2, %3 appels",HeureVersChaîne(dhGDH..PartieHeure,"HH:MM"),... HeureVersChaîne(hFinIntervalle,"HH:MM"),nNbAppel) saClés=ChaîneConstruit("%1%2%3",saClés,CRLF,saIntervalle) FIN FIN FIN
RENVOYER saClés
Résultat : Creux d'utilisation : 12:00 à 13:00, 1 appels 16:00 à 17:00, 1 appels 02:00 à 03:00, 2 appels 03:00 à 04:00, 2 appels 13:00 à 14:00, 3 appels Pics d'utilisation : 17:00 à 18:00, 17 appels 19:00 à 20:00, 20 appels 18:00 à 19:00, 24 appels 21:00 à 22:00, 45 appels 20:00 à 21:00, 56 appels
Par contre il faut connaître la règle de gestion en cas de nombres d'appels égaux pour le 5° et le 6° résultats e.g. pourquoi privilégier un intervalle plutôt qu'un autre.
-- Il y a peut être plus simple, mais, ça tourneMessage modifié, 05 octobre 2023 - 10:50 |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 299 messages Popularité : +31 (37 votes) |
|
Posté le 05 octobre 2023 - 15:10 |
Hello, Allez, j'ajoute mon grain de sel (toujours à l'ancienne).
On obtient un tableau des rangs en utilisant uniquement des tableaux à 1 dimension On fait 24 itérations en recherchant le MAX du tableau d'entrée tout en excluant les valeurs déjà rangées :
tabMytab est un tableau de 24 entiers = [5,6,2,2,4,5,6,7,9,8,5,12,1,3,5,6,1,17,24,20,56,45,7,10] tabTravail est un tableau de 24 entiers
tabOrdre est un tableau de 24 entiers
nrang est un entier = 1 lmax est un entier
tabTravail=tabMytab
TANTQUE nrang<=tabMytab..Occurrence lmax=Max(tabTravail) SI lmax>=0 ALORS POUR nIndi=1 À tabMytab..Occurrence SI tabMytab[nIndi]=lmax ALORS tabOrdre[nrang] = nIndi tabTravail[nIndi] = -1 nrang++ FIN FIN SINON nrang++ FIN FIN
strEntree est une chaîne sTrsortieRang est une chaîne POUR nBr=1 À tabMytab..Occurrence strEntree+=tabMytab[nBr]+"("+nBr+") - " sTrsortieRang+=tabOrdre[nBr]+"("+tabMytab[tabOrdre[nBr]]+") - " FIN Trace(strEntree) Trace(sTrsortieRang)
Info("Fin de traitement")
bon dev |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 14 messages |
|
Posté le 20 novembre 2023 - 23:56 |
Merci beaucoup a vous trois, je vais pensé a faire une petite mise a jour de mon appli...
je boss sur plusieurs projet en meme temps, et je suis bloqué sur l'un de mes autres projet, ducoup je m'en suis tenu a Min(), Max() pour l'instant... Mais vos exemple de code sont excellent... je dois reconnaitre que je ne suis pas habitué a manipuler des tableau par programmation... je vais sans doute adapté, mais vous m'avez carrément soufflé la solution !!! Merci beaucoup  |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 14 messages |
|
Posté le 21 novembre 2023 - 01:36 |
N'ayant pas reussi à faire fonctionner le code de Cedric qui ne me donne pas le resultat attendu, je penche vers celui de Voroltinquo, mais voila je n'ai jamais creer de fonction et je ne sais pas comment faire la fonction RecupererValeurs() ducoup jai creer une procedure globale avec le meme code... mais ce dernier me recupère les entiers, et non leurs rang...Message modifié, 21 novembre 2023 - 01:45 |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 14 messages |
|
Posté le 21 novembre 2023 - 01:49 |
Voroltinquo a écrit :
Ooops en effet, je suis resté focalisé sur le Min() (post #9) On peut implémenter la fonction comme ceci. cf mon post #8 En reprenant la règle du post #1 : Ludovic BLANC a écrit : chaque entier correspond a un nombre de sms/heure sur 1 journée Il m'a semblé plus logique de travailler avec des DateHeure taValeurs est un tableau associatif (SansDoublon, *, wlDateHeure, 24) d'entiers dhGDH est une DateHeure //GDH de la stat tabValeursInitiales est tableau d'entier nInd est un entier saClés est chaîne hFinIntervalle est Heure duPas est Durée tabValeursInitiales=[5,6,2,2,4,5,6,7,9,8,5,12,1,3,5,6,1,17,24,20,56,45,7,10] dhGDH="" hFinIntervalle="" duPas..EnHeures=1 dhGDH..PartieDate=DateDuJour() //Dans les faits, date correspondant au jour de la stat POUR nInd=0 À 23 dhGDH..PartieHeure..Heure=nInd taValeurs[dhGDH]=tabValeursInitiales[nInd+1] FIN TableauTrie(taValeurs,ttCroissant) TraceConstruit("Creux d'utilisation : %1",FormaterSortie(taValeurs,"Min")) TraceConstruit("Pics d'utilisation : %1",FormaterSortie(taValeurs,"Max")) Procedure FormaterSortie(taValeurs ,saTypeSortie est chaîne) :chaîne //Parcours du tableau associatif nNbAppel est entier dhGDH est DateHeure nInd est entier //Variables de formatage hFinIntervalle est Heure saIntervalle est chaîne saClés est chaîne hFinIntervalle="" POUR TOUT nNbAppel,dhGDH,nInd de taValeurs SELON Majuscule(saTypeSortie) CAS "MIN" SI nInd<=5 ALORS hFinIntervalle..Heure = dhGDH..PartieHeure..Heure+1 saIntervalle = ChaîneConstruit("%1 à %2, %3 appels",HeureVersChaîne(dhGDH..PartieHeure,"HH:MM"),... HeureVersChaîne(hFinIntervalle,"HH:MM"),nNbAppel) saClés=ChaîneConstruit("%1%2%3",saClés,CRLF,saIntervalle) FIN CAS "MAX" SI nInd>=20 ALORS hFinIntervalle..Heure = dhGDH..PartieHeure..Heure+1 saIntervalle = ChaîneConstruit("%1 à %2, %3 appels",HeureVersChaîne(dhGDH..PartieHeure,"HH:MM"),... HeureVersChaîne(hFinIntervalle,"HH:MM"),nNbAppel) saClés=ChaîneConstruit("%1%2%3",saClés,CRLF,saIntervalle) FIN FIN FIN RENVOYER saClés Résultat : Creux d'utilisation : 12:00 à 13:00, 1 appels 16:00 à 17:00, 1 appels 02:00 à 03:00, 2 appels 03:00 à 04:00, 2 appels 13:00 à 14:00, 3 appels Pics d'utilisation : 17:00 à 18:00, 17 appels 19:00 à 20:00, 20 appels 18:00 à 19:00, 24 appels 21:00 à 22:00, 45 appels 20:00 à 21:00, 56 appels Par contre il faut connaître la règle de gestion en cas de nombres d'appels égaux pour le 5° et le 6° résultats e.g. pourquoi privilégier un intervalle plutôt qu'un autre. -- Il y a peut être plus simple, mais, ça tourne Message modifié, 05 octobre 2023 - 10:50
Ce code m'a l'air très interressant et fait exactement ce que je veux, cependant il est très compliqué pour mon niveau, serait il possible d'avoir quelques explication ? merci d'avance....
je pense avoir compris en partie le code, mais je ne trouve pas a quoi correspond la variable saTypeSortie ????
ok, merci chatGPT c'est une chaine...
malgré tout j'obtiens l'erreur : "les dimensions des valeurs à affecter au tableau ne sont pas cohérentes." n'etant pas habitué à manipuler des tableau je ne sais pas comment remedier a ce probleme !Message modifié, 21 novembre 2023 - 02:10 |
| |
| |
| | | |
|
| | | | |
| | |
|