begin process at 2010 02 10 17:37:59
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Texte

 > COMPACTAGE D'UNE SÉRIE NUMÉRIQUE

COMPACTAGE D'UNE SÉRIE NUMÉRIQUE


 Information sur la source

Note :
8 / 10 - par 1 personne
8,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Texte Classé sous :compactage, texte, dense, réduction, décompactage Niveau :Débutant Date de création :26/07/2006 Date de mise à jour :26/07/2006 21:00:12 Vu :2 609

Auteur : jean_marc_n2

Ecrire un message privé
Site perso
Commentaire sur cette source (6)
Ajouter un commentaire et/ou une note

 Description

Il s'agit de 2 petites fonctions très simples, permettant de "compacter" une suite d'entiers, ou plus exactement de l'écrire sous une forme plus dense. Exemple:
1,2,3,4,6,9,10,11 ==> 1:4,6,9:11
La fonction décompacte fait le travail inverse (1:3,5 -> 1,2,3,5)

Rien de bien extraordinaire, mais à ajouter pourquoi pas à une librairie de fonctions de manipulation de texte.

Source

  • Option Explicit
  • '---------------------------------------------------------------------------------------
  • ' Procedure : Compacte
  • ' DateTime : 24/07/2006 20:29
  • ' Author : Jean-Marc
  • ' Purpose : Compacte une "collection" de valeurs déja triées en
  • ' ordre croissant.
  • ' Exemple : 1,2,3,4,6,9,10,11 ==> 1:4,6,9:11
  • '
  • '---------------------------------------------------------------------------------------
  • '
  • Public Function Compacte(ByVal cdata As Collection) As String
  • Dim idx As Long ' parcours de la collection
  • Dim vidx As Long ' valeur (possible) du premier element d'une suite
  • Dim vc As Long ' valeur courante
  • Dim vp As Long ' valeur precedente
  • Dim suite As Boolean ' flag indiquant si l'état courant est dans une suite ou non
  • Dim tmpResult As String ' construction du résultat final par concaténations successives
  • If cdata.Count = 0 Then ' si il n'y a pas d'éléments, quitte et retourne une chaine vide
  • Exit Function
  • End If
  • vidx = cdata.Item(1) ' initialisations, avec le premier élément
  • vp = vidx
  • For idx = 2 To cdata.Count ' parcours à partir du second
  • vc = cdata.Item(idx) ' récupération de la valeur courante
  • If (vp + 1) = vc Then ' si elle suit immédiatement la valeur précédente
  • suite = True ' on est dans une suite
  • Else
  • If suite Then ' sinon, on regarde si on était dans une suite
  • ' si oui, on concatene la suite, qui part de vidx jusqu'à vp
  • tmpResult = tmpResult & "," & CStr(vidx) & ":" & CStr(vp)
  • Else ' si non, on concatene la valeur précédente
  • tmpResult = tmpResult & "," & CStr(vp)
  • End If
  • vidx = vc ' on réinitialise le premier élément d'une suite potentielle
  • suite = False ' et on reset le flag de suite
  • End If
  • vp = vc ' stockage de la valeur courante dans vp
  • Next idx
  • If suite Then ' traitement final, identique à celui qui est dans la boucle
  • tmpResult = tmpResult & "," & CStr(vidx) & ":" & CStr(vp)
  • Else
  • tmpResult = tmpResult & "," & CStr(vp)
  • End If
  • Compacte = Mid$(tmpResult, 2) ' élimination de la première virgule
  • End Function
  • '---------------------------------------------------------------------------------------
  • ' Procedure : Decompacte
  • ' DateTime : 25/07/2006 20:15
  • ' Author : Jean-Marc
  • ' Purpose : Decompacte une chaine produite par compacte
  • ' Exemple : 1:4,6,9:11 ==> 1,2,3,4,6,9,10,11
  • '
  • '---------------------------------------------------------------------------------------
  • '
  • Public Function Decompacte(ByVal data As String) As String
  • Dim t() As String ' split la chaine
  • Dim i As Long ' parcours des éléments de la chaine
  • Dim j As Long ' génération des suites
  • Dim p As Long ' cherche les suites grace au signe :
  • Dim tmpResult As String ' résultat intermédiaire, construite par concatenation
  • If data = vbNullString Then ' si chaine vide, retourne vide
  • Exit Function
  • End If
  • t = Split(data, ",") ' split avec les virgules
  • For i = LBound(t()) To UBound(t()) ' parcours
  • p = InStr(t(i), ":")
  • If p <> 0 Then ' est ce une suite (a:b)
  • ' si oui, parcours de 'a' à 'b'
  • For j = Val(Mid$(t(i), 1, p - 1)) To Val(Mid$(t(i), p + 1))
  • tmpResult = tmpResult & "," & CStr(j)
  • Next j
  • Else
  • tmpResult = tmpResult & "," & CStr(t(i)) ' sinon ajoute juste l'élément
  • End If
  • Next i
  • Decompacte = Mid$(tmpResult, 2) ' retourne le resultat, en éliminant la première virgule
  • End Function
  • '
  • ' exemple de compactage
  • '
  • Private Sub Command1_Click()
  • Dim cc As Collection
  • Dim result As String
  • Set cc = New Collection
  • cc.Add (1): cc.Add (2): cc.Add (3): cc.Add (4): cc.Add (6): cc.Add (9): cc.Add (10): cc.Add (11)
  • result = Compacte(cc)
  • Debug.Print result;: If result = "1:4,6,9:11" Then Debug.Print " ==> OK" Else Debug.Print " ==> KO"
  • End Sub
  • '
  • ' exemple décompactage
  • '
  • Private Sub Command2_Click()
  • Dim s As String
  • Dim r As String
  • s = "2:5,6,7,9:13,15:17,19,20"
  • r = Decompacte(s)
  • Debug.Print s & " => " & r
  • End Sub
Option Explicit

'---------------------------------------------------------------------------------------
' Procedure : Compacte
' DateTime  : 24/07/2006 20:29
' Author    : Jean-Marc
' Purpose   : Compacte une "collection" de valeurs déja triées en
'             ordre croissant.
' Exemple   : 1,2,3,4,6,9,10,11 ==> 1:4,6,9:11
'
'---------------------------------------------------------------------------------------
'
Public Function Compacte(ByVal cdata As Collection) As String
Dim idx As Long             ' parcours de la collection
Dim vidx As Long            ' valeur (possible) du premier element d'une suite
Dim vc As Long              ' valeur courante
Dim vp As Long              ' valeur precedente
Dim suite As Boolean        ' flag indiquant si l'état courant est dans une suite ou non
Dim tmpResult As String     ' construction du résultat final par concaténations successives

    If cdata.Count = 0 Then     ' si il n'y a pas d'éléments, quitte et retourne une chaine vide
        Exit Function
    End If
    vidx = cdata.Item(1)        ' initialisations, avec le premier élément
    vp = vidx
    For idx = 2 To cdata.Count  ' parcours à partir du second
        vc = cdata.Item(idx)    ' récupération de la valeur courante
        If (vp + 1) = vc Then   ' si elle suit immédiatement la valeur précédente
            suite = True        ' on est dans une suite
        Else
            If suite Then       ' sinon, on regarde si on était dans une suite
                                ' si oui, on concatene la suite, qui part de vidx jusqu'à vp
                tmpResult = tmpResult & "," & CStr(vidx) & ":" & CStr(vp)
            Else                ' si non, on concatene la valeur précédente
                tmpResult = tmpResult & "," & CStr(vp)
            End If
            vidx = vc           ' on réinitialise le premier élément d'une suite potentielle
            suite = False       ' et on reset le flag de suite
        End If
        vp = vc                 ' stockage de la valeur courante dans vp
    Next idx
    If suite Then               ' traitement final, identique à celui qui est dans la boucle
        tmpResult = tmpResult & "," & CStr(vidx) & ":" & CStr(vp)
    Else
        tmpResult = tmpResult & "," & CStr(vp)
    End If
    Compacte = Mid$(tmpResult, 2)   ' élimination de la première virgule
End Function

'---------------------------------------------------------------------------------------
' Procedure : Decompacte
' DateTime  : 25/07/2006 20:15
' Author    : Jean-Marc
' Purpose   : Decompacte une chaine produite par compacte
' Exemple   : 1:4,6,9:11 ==> 1,2,3,4,6,9,10,11
'
'---------------------------------------------------------------------------------------
'
Public Function Decompacte(ByVal data As String) As String
Dim t() As String       ' split la chaine
Dim i As Long           ' parcours des éléments de la chaine
Dim j As Long           ' génération des suites
Dim p As Long           ' cherche les suites grace au signe :
Dim tmpResult As String ' résultat intermédiaire, construite par concatenation

    If data = vbNullString Then ' si chaine vide, retourne vide
        Exit Function
    End If

    t = Split(data, ",")                ' split avec les virgules
    For i = LBound(t()) To UBound(t())  ' parcours
        p = InStr(t(i), ":")
        If p <> 0 Then                  ' est ce une suite (a:b)
            ' si oui, parcours de 'a' à 'b'
            For j = Val(Mid$(t(i), 1, p - 1)) To Val(Mid$(t(i), p + 1))
                tmpResult = tmpResult & "," & CStr(j)
            Next j
        Else
            tmpResult = tmpResult & "," & CStr(t(i))    ' sinon ajoute juste l'élément
        End If
    Next i
    Decompacte = Mid$(tmpResult, 2) ' retourne le resultat, en éliminant la première virgule

End Function

'
' exemple de compactage
'
Private Sub Command1_Click()
Dim cc As Collection
Dim result As String
    
    Set cc = New Collection
    cc.Add (1): cc.Add (2): cc.Add (3): cc.Add (4): cc.Add (6): cc.Add (9): cc.Add (10): cc.Add (11)
    result = Compacte(cc)
    Debug.Print result;: If result = "1:4,6,9:11" Then Debug.Print "   ==> OK" Else Debug.Print "   ==> KO"
End Sub

'
' exemple décompactage
'
Private Sub Command2_Click()
Dim s As String
Dim r As String

    s = "2:5,6,7,9:13,15:17,19,20"
    r = Decompacte(s)
    Debug.Print s & " => " & r
End Sub

 Conclusion

Note: la fonction compactage prend une collection en argument d'entrée, on peut très simplement la modifier ou la décliner en différentes versions: avec un tableau, une chaine de caractère, etc.


 Historique

26 juillet 2006 21:00:12 :
Précision sur la fonction Compacte

 Sources du même auteur

Source avec Zip Source avec une capture ACTUALITÉS EN TEMPS RÉEL GRÂCE AUX FLUX RSS
Source avec Zip DIFFÉRENCE ENTRE + (ARITHMÉTIQUE) ET OR (BITWISE)
Source avec Zip Source avec une capture GÉNÉRATION EN HTML DE SOURCES VB, AVEC COLORATION SYNTAXIQUE...
Source avec Zip Source avec une capture ESPIONNER / SURVEILLER L'ACTIVITÉ RÉSEAU SUR VOTRE MACHINE O...
Source avec Zip Source avec une capture JOUER AU LITERATI, TEXTEXPRESS, LE MOT LE PLUS LONG, ETC!

 Sources de la même categorie

Source avec Zip Source avec une capture AYOUBPAD2009 par ayoube2009
Source avec Zip Source avec une capture PILOTAGE D'AFFICHEURS LCD SUR PORT SÉRIE OU USB par mays
Source avec Zip Source avec une capture TRAITEMENT DE TEXTE RTF par zozo14
FORMATAGE D'UNE CELLULE EXCEL VIA UNE SYNTAXE HTML par 8Tnerolf8
Source avec Zip DÉFILEMENT TEXTE par mimiZanzan

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture Source .NET (Dotnet) JEU DE PENDU (COUIC 1 DE +) par tresorsdevie
Source avec Zip Source avec une capture MESSAGE DE COMPACTAGE D'OUTLOOK SOUS XP par Sechaud
Source avec Zip Source avec une capture Source .NET (Dotnet) OCR (UTILISATION DE TESSNET2.DLL) par bouv
Source avec Zip Source avec une capture LIVE (( TRAITEMENT DE TEXTE )) par crossblade
Source avec Zip Source avec une capture AH VALA UN BON EDITEUR DE TEXTE : NODE EDITOR (PETITE MISE A... par Zeratul456

Commentaires et avis

Commentaire de Renfield le 27/07/2006 08:39:28 administrateur CS

plutot qu'une collection, tu aurait pu utiliser, par exemple, un paramarray, et faire :

a = Compacte (1,2,3,4,5,6)

sympatique, sinon

Commentaire de jean_marc_n2 le 27/07/2006 08:55:26

Hello Renfield,
Oui tu as raison. C'est ce que je notais dans explicatin finale: on peut décliner la fonction en différentes versions, utilisant différentes entrées:
- tableau
- chaine de cracatères
- paramarray
- autres?

Merci du commentaire :-)

Commentaire de jean_marc_n2 le 27/07/2006 11:01:45

Re,
on peut aussi par exemple ecrire des wrapper (un peu moins efficace, mais très sympa à maintenir). Par exemple avec le ParamArray:

Private Function CompacteParamArray(ParamArray t() As Variant) As String
Dim cdata As Collection
Dim i As Long

    Set cdata = New Collection
    For i = LBound(t()) To UBound(t())
        cdata.Add t(i)
    Next i
    CompacteParamArray = Compacte(cdata)
    Set cdata = Nothing
End Function

Commentaire de Renfield le 27/07/2006 15:34:12 administrateur CS

un Wrapper, oui, sympatique...

tu peux aussi tester le type de parametre en entrée...

tableau, collection, etc

et peut etre même voir à trier les chiffres, en première étape du processus, afin de compacter au maxiumum (traitement optionnel)

Commentaire de jean_marc_n2 le 27/07/2006 16:49:54

Oui, tester le type est une bonne alternative à un wrapper (pas ma solution préférée, mais une bonne idée, c'est sur).

Concernant le tri, c'est certes une bonne idée mais ma rêgle en matière de design applicatif est "A chacun son métier, et les vaches seront bien gardées", i.e une fonction pour chaque chose. C'est pourquoi dans la description de Compacte, il est bien indiqué qu'elle attend les données déjà triées.

Cependant, je suis d'accord avec toi que c'est une bonne idée de proposer un tri. Auquel cas, une bonne façon de faire serait à mon avis de créer une fonction de plus haut niveau (publique) qui appelerait (optionellement) une fonction de tri avant d'appeler Compacte (qu'on rendrait private).

En pseudo code, ca donnerait à peu près:

Public Function SuperCompacte(data, optional must_sort As Boolean) as string
if must_sort
Call my_sort( data ) ' call sort routine
endif
SuperCompacte = Compacte( data )
End Function

Private Function Compacte ( byval data) as string

Private Sub My_sort ( byref data)

Commentaire de Renfield le 28/07/2006 08:12:55 administrateur CS

on est d'accord ^^

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Drag d'un fichier depuis l'explorer vers une zone Texte d'une feuille : help ! [ par GEDDi ] Question bete mais je ne sais pas comment faire :J'ai une feuille(Form1) avec une zone de Texte (Text1) et je veux 'Draguer'un fichier venant de l"exp ecrire dand un txt [ par Nic ] comment ecrire un texte dans un fichiers txt car je voudrais faire entrer un texte dans un textbox et en cliquant sur un bouton le faire inscrire dans Texte & Images [ par MEYS David ] Comment réaliser une page qui comprent du texte et des images similaire a worddans une feuille en vb6Comment convertir une image BMP en JPGComment enr Texte & Images [ par MEYS David ] Comment réaliser une page qui comprent du texte et des images similaire a worddans une feuille en vb6Comment convertir une image BMP en JPGComment enr Insérer du texte dans un textbox [ par phil ] Salut !J'ai un textbox,je suis a un endroit donne dans le contenu du textbox (exemple : en plein milieu).Je clique sur un bouton et je veux qu'a l'end Enregistrement d'un fichier texte [ par JCLK ] J'utilise cette commande pour enregistrer un fichier texte, mais il y a un problème : des guillemets s'affichent au début et à la fin du texte. Commen Manipulation des données dans un texte !! [ par beber ] debutant 100% voir plus !Recherche comment ouvrir un fichier contenant des variables X et Y d'une fonction. Puis d'arriver sous VB à les recuperer pou Gestion de caractères d'un fichier texte avec VB [ par pedro ] Hello tout le monde .Je recherche les sources d'un programme qui permet de lire un fichier texte .Les données lu dans ce fichier doivent pouvoir etre Datagrid [ par Christophe ] Lorsque je saisie un texte dans un TextBox avec un retour chariot (touche ENTREE), et qu'ensuite je le copie dans un datagrid.A la place du retour cha


Nos sponsors


Sondage...

Comparez les prix


HTC Magic

Entre 429€ et 429€

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,764 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales