PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

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)

Cdlt
Message 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 tourne
Message 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 tourne
Message 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 tourne
Message 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 tourne
Message 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édric
Message 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 //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
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 contiendra le rang des valeurs de tabMytab par ordre décroissant
tabOrdre est un tableau de 24 entiers

nrang est un entier = 1
lmax est un entier

//Le traitement sera destructeur, on utilise un tableau copie des données d'entrée
tabTravail=tabMytab

TANTQUE nrang<=tabMytab..Occurrence
//on cherchera toujours le MAX parmis les donnéée restant à ranger
lmax=Max(tabTravail)
//juste au cas où les données contiendraient des valeurs négatives
SI lmax>=0 ALORS
POUR nIndi=1 À tabMytab..Occurrence
SI tabMytab[nIndi]=lmax ALORS
tabOrdre[nrang] = nIndi
//cette données est désormais rangées, n'entrera plus dans la recherche du MAX
tabTravail[nIndi] = -1
nrang++
FIN
FIN
SINON
nrang++
FIN
FIN

//Affichage du résultat
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