Compare nombre

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
dayvid
Messages : 1242
Inscription : mer. 11/nov./2009 18:17
Localisation : Poitiers (Vienne)

Compare nombre

Message par dayvid »

Hello !

J'ai crée une procedure pour comparer les nombres
dite-moi ce que vous en penssez :)

Code : Tout sélectionner

; Programme réaliser par Monsieur Dieppedalle Davvid


; Explication du programme:

; Ce programme sert a comparer des nombres et ensuite de sortir
; une série de nombre voulue suivent la condition

; Les conditions (Sortie$) supportées sont: 

; "+" Les nombres seront trier du plus grand au plus petit
; "-" Les nombres seront trier du plus petit au plus grand
; "<X" Inférieur a X (X étans le nombre)
; ">X" Suppérieur a X (X étans le nombre)
; "<=X" ou "=<" (revient au même) Inférieur ou Egale a X (X étans le nombre)
; "=>X" ou ">=" (revient au même) Suppérieur ou Egale a X (X étans le nombre)
; "<>X" Différent de X (X étans le nombre)

; Possibilité de choisir le nombre de décimale (NombreDecimale) qu'auront les nombres a leur sortie
; Possibilité de choisir le nombre de nombre a sortir

Global NewList ListeNombreEntree.d()
Global NewList ListeNombreTemps.d()
Global NewList ListeNombreSortie.d()

Global NombreTemps.d

Procedure.l IsNumerique(Chaine$)
  
  ; En gros si la chaine extrait est bien un nombre, on renvoie true = 1, sinon on renvoie false = 0
  
  If Not Chaine$ Or Chaine$ = "."
    ProcedureReturn #False
  EndIf
  
  For Caractere = 0 To 255
    
    Select Caractere
        
      Case 0 To 45, 47, 58 To 255
        
        If FindString(Chaine$, Chr(Caractere), 1)
          ProcedureReturn #False
        EndIf

    EndSelect
    
  Next
  
  If CountString(Chaine$, ".") > 1 
    ProcedureReturn #False
  EndIf
  
  ProcedureReturn #True
EndProcedure

Procedure AjouterNombreListeNombre(Nombre$)
  
  ; En gros si la chaine extrait est bien un nombre, on l'ajoute a la liste de nombre, sinon on igniore cette chaine
  
  Nombre$ = RemoveString(Nombre$, Chr(32))
  
  For AjoutNombre = 1 To CountString(Nombre$, ",") + 1
    
    AddElement(ListeNombreEntree())
    
    NombreExtrait$ = StringField(Nombre$, AjoutNombre, ",")
    
    If NombreExtrait$ <> "" And IsNumerique(NombreExtrait$)
      ListeNombreEntree() = ValD(StringField(Nombre$, AjoutNombre, ","))
    EndIf
    
  Next
  
EndProcedure

Procedure.s CompareNombre(List, Sortie$ = "+", NombreDecimale = 3, NombreResultaSortie = 2)
  
  ; Création d'une deuxième liste
  ForEach ListeNombreEntree()
    AddElement(ListeNombreTemps())
    ListeNombreTemps() = ListeNombreEntree()
    AddElement(ListeNombreSortie())
    ListeNombreSortie() = ListeNombreEntree()
  Next
  
  ; Trie de la liste
  Sortie$ = ReplaceString(Sortie$, Chr(32), "")
  
  If Sortie$ = "+"
    
    SortList(ListeNombreSortie(), #PB_Sort_Descending)
    
  ElseIf Sortie$ = "-"
    
    SortList(ListeNombreSortie(), #PB_Sort_Ascending)
    
  ElseIf FindString(Sortie$, ">", 1) And Not FindString(Sortie$, "<", 1) And Not FindString(Sortie$, "=", 1)
    
    ExtractionNombre$ = Mid(Sortie$, 2)
    
    If IsNumerique(ExtractionNombre$)
      
      If FindString(Sortie$, ">" + ExtractionNombre$, 1)
        Supperioriter.d = ValD(ExtractionNombre$)
        
        ForEach ListeNombreSortie()
          
          If ListeNombreSortie() <= Supperioriter
            Debug "Supprimer: " + Str(ListeNombreSortie())
            ListeNombreSortie() = 0
          EndIf
          
        Next
        
        SortList(ListeNombreSortie(), #PB_Sort_Descending)
        
        ForEach ListeNombreSortie()
          If ListeNombreSortie() = 0
            DeleteElement(ListeNombreSortie(), 1)
          EndIf
        Next
        
      EndIf
      
    EndIf
    
  ElseIf FindString(Sortie$, "<", 1) And Not FindString(Sortie$, ">", 1) And Not FindString(Sortie$, "=", 1)
    ExtractionNombre$ = Mid(Sortie$, 2)
    
    If IsNumerique(ExtractionNombre$)
      
      If FindString(Sortie$, "<" + ExtractionNombre$, 1)
        Supperioriter.d = ValD(ExtractionNombre$)
        
        ForEach ListeNombreSortie()
          
          If ListeNombreSortie() => Supperioriter
            Debug "Supprimer: " + Str(ListeNombreSortie())
            ListeNombreSortie() = 0
          EndIf
          
        Next
        
        SortList(ListeNombreSortie(), #PB_Sort_Descending)
        
        ForEach ListeNombreSortie()
          If ListeNombreSortie() = 0
            DeleteElement(ListeNombreSortie(), 1)
          EndIf
        Next
        
      EndIf
      
    EndIf
    
  ElseIf (FindString(Sortie$, "<", 1) And FindString(Sortie$, ">", 1)) And Not FindString(Sortie$, "<>", 1) And Not FindString(Sortie$, "=", 1)
    
    ExtractionNombre1$ = Mid(Sortie$, 2, FindString(Sortie$, ">", 1) - 2)
    ExtractionNombre2$ = Mid(Sortie$, FindString(Sortie$, ">", 1) + 1)
    
    If IsNumerique(ExtractionNombre1$) And IsNumerique(ExtractionNombre2$)
      
      If FindString(Sortie$, "<" + ExtractionNombre1$ + ">" + ExtractionNombre2$, 1)
        Inferioriter.d = ValD(ExtractionNombre1$)
        Supperioriter.d = ValD(ExtractionNombre2$)
        
        ForEach ListeNombreSortie()
          
          If ListeNombreSortie() <= Supperioriter Or ListeNombreSortie() => Inferioriter
            Debug "Supprimer: " + Str(ListeNombreSortie())
            ListeNombreSortie() = 0
          EndIf
          
        Next
        
        SortList(ListeNombreSortie(), #PB_Sort_Descending)
        
        ForEach ListeNombreSortie()
          If ListeNombreSortie() = 0
            DeleteElement(ListeNombreSortie(), 1)
          EndIf
        Next
        
      EndIf
      
    EndIf
    
  ElseIf FindString(Sortie$, "<>", 1)
    
    ExtractionNombre$ = Mid(Sortie$, 3)
    
    If IsNumerique(ExtractionNombre$)
      
      If FindString(Sortie$, "<>" + ExtractionNombre$, 1)
        Differenciter.d = ValD(ExtractionNombre$)
        
        ForEach ListeNombreSortie()
          
          If ListeNombreSortie() = Differenciter
            Debug "Supprimer: " + Str(ListeNombreSortie())
            ListeNombreSortie() = 0
          EndIf
          
        Next
        
        SortList(ListeNombreSortie(), #PB_Sort_Descending)
        
        ForEach ListeNombreSortie()
          If ListeNombreSortie() = 0
            DeleteElement(ListeNombreSortie(), 1)
          EndIf
        Next
        
      EndIf
      
    EndIf
      
  ElseIf FindString(Sortie$, "<=", 1) Or FindString(Sortie$, "=<", 1)
    
    ExtractionNombre$ = Mid(Sortie$, 3)
    
    If IsNumerique(ExtractionNombre$)
      
      If FindString(Sortie$, "<=" + ExtractionNombre$, 1) Or FindString(Sortie$, "=<" + ExtractionNombre$, 1)
        InferioriterOuEgaliter.d = ValD(ExtractionNombre$)
        
        ForEach ListeNombreSortie()
          
          If ListeNombreSortie() > InferioriterOuEgaliter
            Debug "Supprimer: " + Str(ListeNombreSortie())
            ListeNombreSortie() = 0
          EndIf
          
        Next
        
        SortList(ListeNombreSortie(), #PB_Sort_Descending)
        
        ForEach ListeNombreSortie()
          If ListeNombreSortie() = 0
            DeleteElement(ListeNombreSortie(), 1)
          EndIf
        Next
        
      EndIf
      
    EndIf
    
  ElseIf FindString(Sortie$, "=>", 1) Or FindString(Sortie$, ">=", 1)
    
    ExtractionNombre$ = Mid(Sortie$, 3)
    
    If IsNumerique(ExtractionNombre$)
      
      If FindString(Sortie$, "=>" + ExtractionNombre$, 1) Or FindString(Sortie$, ">=" + ExtractionNombre$, 1)
        SupperioriterOuEgaliter.d = ValD(ExtractionNombre$)
        
        ForEach ListeNombreSortie()
          
          If ListeNombreSortie() < SupperioriterOuEgaliter
            Debug "Supprimer: " + Str(ListeNombreSortie())
            ListeNombreSortie() = 0
          EndIf
          
        Next
        
        SortList(ListeNombreSortie(), #PB_Sort_Descending)
        
        ForEach ListeNombreSortie()
          If ListeNombreSortie() = 0
            DeleteElement(ListeNombreSortie(), 1)
          EndIf
        Next
        
      EndIf
      
    EndIf
    
  EndIf
  
  
  ForEach ListeNombreSortie()
    Liste + 1
    If NombreResultaSortie <> -1 And Liste < NombreResultaSortie + 1
      ListeNombreSortie$ + StrD(ListeNombreSortie(), NombreDecimale) + ", "
    ElseIf NombreResultaSortie = -1
      ListeNombreSortie$ + StrD(ListeNombreSortie(), NombreDecimale) + ", "
    Else
      Break
    EndIf
  Next
  
  ProcedureReturn ListeNombreSortie$
EndProcedure

Nombre$ = "50, 150, 255"

AjouterNombreListeNombre(Nombre$)
Debug CompareNombre(ListeNombreEntree(), "+", 0, 3)
La vie, C'est comme, Une boitte, De startis, On en voie, De toutes, Les couleurs !

Mon forum http://purebasic.forumphp3.com/index.php
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Compare nombre

Message par falsam »

Si je résume ce que j'ai compris, la finalité de ton code est de trier une série de nombres dans l'ordre croissant ou décroissant et de les lister avec un masque de sortie représentant chaque nombre avec 0, 1, 2 ...... n décimales.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Compare nombre

Message par falsam »

En un peu plus court on obtient le même résultat que ton code.

Code : Tout sélectionner

Procedure IsNumeric(buffer.s)
  Protected Result=#True 
  Protected Decimal.i=0 ;Nombre de decimals trouvé
  
  ;Le nombre doit etre composé que de chiffres et d'un point decimal
  For i = 0 To Len(buffer)
    If FindString("0123456789.",Mid(buffer,i,1),1)=0
      Result=#False
      Break
      
    ElseIf Mid(buffer,i,1)="."
           
      Decimal+1
      If Decimal>1
        Result=#False
        Break
      EndIf
      
    EndIf
  Next
  
  ProcedureReturn(Result)
EndProcedure

Procedure.s CompareNombre(Nombres.s, SensTri = #PB_Sort_Ascending, NombreDecimale = 3, NombreResultaSortie = 2)
  Protected Dim TableauNombres.f(0), i.i ;Tableau des nombres à traité et indice de parcours
  Protected NombreCourrant.s ;Nombre en cours de traitetement
  Protected ListeNombreSortie.s; Ta liste retournée par la procédure
  
  ;Redimensionner le tableau en fonction du nombre de nombres
  ReDim TableauNombres(FindString(Nombres, ",",1)+1)
  
  ;Ajout des nombres dans le tableau
  For i=0 To CountString(Nombres, ",")
    If IsNumeric(Trim(StringField(Nombres, i+1, ",")))
      TableauNombres(i)=ValF(Trim(StringField(Nombres, i+1, ",")))
    Else
      NombreResultaSortie-1
    EndIf
  Next i
  
  ;Tri du tableau
  SortArray(TableauNombres(), SensTri)
  
  ;Resultat
  For i=0 To (NombreResultaSortie-1)
    ListeNombreSortie + StrF(TableauNombres(i), NombreDecimale) + " "
  Next
  
  ProcedureReturn ListeNombreSortie
EndProcedure

Nombre$ = "50,150,255,25.15,56"
Debug CompareNombre(Nombre$, #PB_Sort_Descending, 2, 5)
Je pense que le paramètre de sortie (ici 5) est le même que le nombre de nombres à traité.

Code : Tout sélectionner

Procedure IsNumeric(buffer.s)
  Protected Result=#True 
  Protected Decimal.i=0 ;Nombre de decimals trouvé
  
  ;Le nombre doit etre composé que de chiffres et d'un point decimal
  For i = 0 To Len(buffer)
    If FindString("0123456789.",Mid(buffer,i,1),1)=0
      Result=#False
      Break
      
    ElseIf Mid(buffer,i,1)="."
           
      Decimal+1
      If Decimal>1
        Result=#False
        Break
      EndIf
      
    EndIf
  Next
  
  ProcedureReturn(Result)
EndProcedure

Procedure.s CompareNombre(Nombres.s, SensTri = #PB_Sort_Ascending, NombreDecimale = 3)
  Protected Dim TableauNombres.f(0), i.i ;Tableau des nombres à traité et indice de parcours
  Protected NombreCourrant.s ;Nombre en cours de traitetement
  Protected ListeNombreSortie.s; Ta liste retournée par la procédure
  
  ;Redimensionner le tableau en fonction du nombre de nombres
  ReDim TableauNombres(FindString(Nombres, ",",1)+1)
  
  ;Ajout des nombres dans le tableau
  For i=0 To CountString(Nombres, ",")
    If IsNumeric(Trim(StringField(Nombres, i+1, ",")))
      TableauNombres(i)=ValF(Trim(StringField(Nombres, i+1, ",")))
    Else
      NombreResultaSortie-1
    EndIf
  Next i
  
  ;Tri du tableau
  SortArray(TableauNombres(), SensTri)
  
  ;Resultat
  For i=0 To ArraySize(TableauNombres())
    ListeNombreSortie + StrF(TableauNombres(i), NombreDecimale) + " "
  Next
  
  ProcedureReturn ListeNombreSortie
EndProcedure


Nombre$ = "50,150,255,25.15,56"
Debug CompareNombre(Nombre$, #PB_Sort_Descending, 2)
CompareNombre se limite à un tri de tes nombres après vérification que tes nombres sont bien numériques.
Donc si tu es certain de tes nombres au départ, on peut résumer ton code comme suit :

Code : Tout sélectionner

Procedure.s CompareNombre(Nombres.s, SensTri = #PB_Sort_Ascending, NombreDecimale = 3)
  Protected Dim TableauNombres.f(0), i.i ;Tableau des nombres à traité et indice de parcours
  Protected NombreCourrant.s ;Nombre en cours de traitetement
  Protected ListeNombreSortie.s; Ta liste retournée par la procédure
  
  ;Redimensionner le tableau en fonction du nombre de nombres
  ReDim TableauNombres(FindString(Nombres, ",",1)+1)
  
  ;Ajout des nombres dans le tableau
  For i=0 To CountString(Nombres, ",")
    TableauNombres(i)=ValF(Trim(StringField(Nombres, i+1, ",")))
  Next i
  
  ;Tri du tableau
  SortArray(TableauNombres(), SensTri)
  
  ;Resultat
  For i=0 To ArraySize(TableauNombres())
    ListeNombreSortie + StrF(TableauNombres(i), NombreDecimale) + " "
  Next
  
  ProcedureReturn ListeNombreSortie
EndProcedure

Nombre$ = "50,150,255,25.15,56"
Debug CompareNombre(Nombre$, #PB_Sort_Descending, 2)
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
dayvid
Messages : 1242
Inscription : mer. 11/nov./2009 18:17
Localisation : Poitiers (Vienne)

Re: Compare nombre

Message par dayvid »

Salut Falsam

Oui je me doute bien que mon code n'est pas grandiose :lol:
Mais c'est fou comme j'ai du mal a optimiser mes codes :(

Merci de ton aide, je vais feuilleté ce que tu ma fait :D
La vie, C'est comme, Une boitte, De startis, On en voie, De toutes, Les couleurs !

Mon forum http://purebasic.forumphp3.com/index.php
Répondre