Probléme aidez moi svp

cs_maya77 Messages postés 36 Date d'inscription vendredi 13 novembre 2009 Statut Membre Dernière intervention 18 juin 2011 - 19 mai 2011 à 13:03
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 - 22 mai 2011 à 04:14
bonjour tous le monde

voici mon problème, j'ai un vecteur qui contient une chaîne de caractères (un mot par case) que j'appel tablo, et un autre tableau qui contient plusieurs lignes (enfaîte ces une règles de grammaire par ligne) que j'appel tab2.
Je voudrai pouvoir comparer chaque case du vecteur avec chaque première case de chaque ligne de mon tableau de règles si cela correspond continuer le comparaison avec le reste de la règles jusqu’à la fin de la ligne puis afficher la chaîne de caractères qui correspond a la règle de grammaires dans un autre tableau que j'appel tabli.

je sais pas si c'est clair mais voici le code que j'ai fais mais il ne marche pas.
aider moi a trouver le soucis

merci d'avance

Private Sub Form7_Load(byVal sender As System.Object, byVal e As System.EventArgs) Handles MyBase.Load
        i = 0
    End Sub
Private Sub Button5_Click(byVal sender As System.Object, byVal e As System.EventArgs) Handles Button5.Click
        'RichTextBox3.AppendText("hello")

        Dim fichier As StreamReader = New StreamReader("C:\Users\samia\Desktop\Regles.txt", Encoding.UTF8)
Dim cont1 As String = fichier.ReadLine
        Dim j As Integer = 0
        Dim tabli() As String
        Dim m As Integer = 0
While Not (cont1 Is Nothing)
            Dim tab2() As String = cont1.Split(" ")
            If (compare(tablo(i ), tab2(j)) = True) Then
                Dim k As Integer = i
                Dim l As Integer = j
     tabli(m ) = tablo(i )
                While Not (UBound(tab2)) AndAlso (compare(tablo(k), tab2(l) ) = True)
                    k = k + 1
                    l = l + 1
                    compare(tablo(k ), tab2(j))
                    m = m + 1
                    tabli(m ) = tablo(k)
End While
                If UBound(tab2) Then
                    For n = 0 To UBound(tabli)
                        RichTextBox3.AppendText(tabli(n))

                    Next
End If
            End If
            cont1 = fichier.ReadLine
        End While
        i = i + 1
        fichier.Close()
    End Sub

19 réponses

Utilisateur anonyme
19 mai 2011 à 14:08
Salut,

Tu devrais plutôt utiliser des listes fortement typées à la place de tes tableaux.
Dans ton cas : List (Of String)
Ensuite, tu remarquera que ces listes possèdent différentes méthodes très efficaces (comme Add Remove Contains Find FindAll ForEach etc...) pour trouver facilement un mot par exemple ou un groupe de mots ou une partie de mot.
De plus ceci t'évitera ces casse-têtes de boucles imbriquées.

Bonne soirée.
0
cs_maya77 Messages postés 36 Date d'inscription vendredi 13 novembre 2009 Statut Membre Dernière intervention 18 juin 2011
19 mai 2011 à 18:09
voila j'ai essayé de modifier mais ça ne marche toujours pas
Private Sub Form7_Load(byVal sender As System.Object, byVal e As System.EventArgs) Handles MyBase.Load
        i = 0
    End Sub

Dim tablo As New List(Of String)
    Dim tabli As New List(Of String)
    Dim tab2 As New List(Of String)


Private Sub Button5_Click(byVal sender As System.Object, byVal e As System.EventArgs) Handles Button5.Click
 
        Dim fichier As StreamReader = New StreamReader("C:\Users\samia\Desktop\Regles.txt", Encoding.UTF8)
        Dim cont1 As String = fichier.ReadLine
Dim j As Integer = 0
        Dim x As Integer
While Not (cont1 Is Nothing)
            Dim tab() As String = cont1.Split(" ")
 
            For v = 0 To UBound(tab)
                tab2.Add(tab(v))
            Next
 
            Dim k As Integer = i
            Dim l As Integer = j
            Dim bool As Boolean = compare(tablo(k), tab2(l))
 
For x 1 To tab2.Count AndAlso bool True
                tabli.AdD(tablo(k ))
                k = k + 1
                l = l + 1
                bool = compare(tablo(k ), tab2(l))
            Next
 
Dim tb() As String = tabli.ToArray
            For g = 0 To UBound(tb)
                RichTextBox3.AppendText(tb(g))
            Next
            cont1 = fichier.ReadLine
        End While
 
        i = i + 1
 
        fichier.Close()
 
    End Sub


je n'arrive vraiment pas a voir ou est le soucis

merci de votre aide
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
19 mai 2011 à 23:13
Salut

Ce n'est pas clair

une chaine de caractères n'est pas une list de
string
donc tablo est une list de string
table2 est un tableau de string chaque entrée
contient un string definit une règle de grammaire
le reste pas trop compris
si tu donnais un exemple
0
cs_maya77 Messages postés 36 Date d'inscription vendredi 13 novembre 2009 Statut Membre Dernière intervention 18 juin 2011
20 mai 2011 à 00:08
merci pour vos réponses.

pour être plus claire voici un exemple.
disons que j'ai un fichier avec un texte (mot/étiquette):
le/PREP ciel/NOUN est/VERB bleu/ADJ ,/PUNC il/PREP fait/VERB beau/ADJ 


Et un autre fichier de régle de grammaire, une suite d'étiquettes

PUNC ABBREV ABBREV PUNC
PUNC ABBREV PUNC
PUNC ABBREV ABBREV ABBREV PUNC
PUNC NUM PUNC
PUNC DET+NOUN_PROP PUNC
NOUN_PROP ADJ


je voudrai pour chaque mot dans le premier fichier comparer sont étiquettes ( ce qu'il y a après le /) avec le première étiquette de chaque règle si cela correspond continuer le comparaison avec le reste des mots de la règles jusquà la fin de la ligne puis afficher la chaîne de caractères qui correspond a la règle de grammaires dans un tableau.

voila j’espère que c'est plus clair ainsi

ShayW j’espère que vous pourrai m'aider car la je galère vraiment
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
20 mai 2011 à 00:44
Non pas encore
j'essaye d'appliquer
le/prep
je compare /prep avec PUNC et après
c'est quoi les règles de grammaire ?
explique selon ton exemple comment tu procèdes
et quel résultat tu obtient
0
cs_maya77 Messages postés 36 Date d'inscription vendredi 13 novembre 2009 Statut Membre Dernière intervention 18 juin 2011
20 mai 2011 à 12:18
bonjour

disons que j'ai mon exemple:

le/PREP ciel/NOUN est/VERB bleu/ADJ ,/PUNC il/PREP fait/VERB beau/ADJ

et mes règles

PUNC ABBREV ABBREV PUNC
PUNC ABBREV PUNC
PUNC ABBREV ABBREV ABBREV PUNC
PUNC NUM PUNC
PUNC DET+NOUN_PROP PUNC
NOUN_PROP ADJ
PREP NOUN VERB ADJ PUNC PREP VERB ADJ

je prend le/PREP je compare PREP (donc ce qu'il y a après le /) avec la première règle (je commence avec le premier élément c-à-d PUNC) si ça concorde je continue à comparer élément par élément sinon je saute a la règle suivante, dans mon cas la dernière règle est bonne, donc j'arrive a comparer jusqu'à la fin de la règle, puis j'enregistre ma chaîne dans un tableau.
0
cs_maya77 Messages postés 36 Date d'inscription vendredi 13 novembre 2009 Statut Membre Dernière intervention 18 juin 2011
20 mai 2011 à 12:46
voila cela marche mais j'ai un problème au niveau des indexes de mes listes
Private Sub Button5_Click(byVal sender As System.Object, byVal e As System.EventArgs) Handles Button5.Click

 If i <= tablo.Count Then
            i = i + 1
        End If
 Dim fichier As StreamReader = New StreamReader("C:\Users\samia\Desktop\Regles.txt", Encoding.UTF8)
        Dim cont1 As String = fichier.ReadLine
Dim j As Integer = 0
        Dim x As Integer
        RichTextBox3.Clear()
While Not (cont1 Is Nothing)

            Dim tab() As String = cont1.Split(" ")

            For v = 0 To UBound(tab)
                tab2.Add(tab(v))
            Next

            Dim k As Integer = i
            Dim l As Integer = j
            x = 0
            Dim bool As Boolean = compare(tablo(k ), tab2(l ))
            
While (x <> tab2.Count - 1) And (bool = True)
                tabli.Add(tablo(k))
                k = k + 1
            
l = l + 1
                bool = compare(tablo(k ), tab2( l))
                x = x + 1
            End While
Dim tb() As String = tabli.ToArray

            For g = 0 To UBound(tb) - 1
                RichTextBox3.AppendText(tb(g ))
            Next
 tabli.Clear()



            Erase tb
            Erase tab
            tab2.Clear()
            cont1 = fichier.ReadLine
End While
                fichier.Close()
End Sub



merci de votre aide
0
Utilisateur anonyme
20 mai 2011 à 14:40
Salut,
D'après ce que tu dis ici :
je prend le/PREP je compare PREP (donc ce qu'il y a après le /) avec la première règle (je commence avec le premier élément c-à-d PUNC) si ça concorde je continue à comparer élément par élément sinon je saute a la règle suivante, dans mon cas la dernière règle est bonne, donc j'arrive a comparer jusqu'à la fin de la règle, puis j'enregistre ma chaîne dans un tableau.


Dans ta ligne de texte :
le/PREP ciel/NOUN est/VERB bleu/ADJ ,/PUNC il/PREP fait/VERB beau/ADJ


Si je supprime tout ce qui est a gauche des slash, j'obtiens :

PREP NOUN VERB ADJ PUNC PREP VERB ADJ


Et curieusement ceci correspond justement à ta dernière règle.

Pourquoi tu ne compares pas directement chaque règle avec la ligne de ton fichier sans ce qui est a gauche des slashs ?
0
cs_maya77 Messages postés 36 Date d'inscription vendredi 13 novembre 2009 Statut Membre Dernière intervention 18 juin 2011
20 mai 2011 à 15:09
c'est exactement ce que je fais dans ma fonction compare que voici:

Function compare(byVal val As String, byVal val1 As String) As Boolean

        Dim var As String = val
        Dim pos As Long = InStr(var, "/")
        Dim var1 As String = Mid(var, pos + 1)
Dim bool As Boolean
        If var1 = val1 Then
            bool = True
        Else
            bool = False
 End If

        Return (bool)

    End Function


Ce n'ai pas à ce niveau la que ça pose problème mais plutôt au niveau de mes listes et des index de liste
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
20 mai 2011 à 15:55
Salut

et si dans ma phrase j'utilise le slash/
comme caractère ?
0
cs_maya77 Messages postés 36 Date d'inscription vendredi 13 novembre 2009 Statut Membre Dernière intervention 18 juin 2011
20 mai 2011 à 16:04
dans ce cas la j'aurai //PUNC comme entrée;
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
20 mai 2011 à 16:40
dans ce cas la j'aurai //PUNC comme entrée


Le tableau de règles c'est toi qui écrit
donc il y a beaucoup de possibilitées
tu va avoir
//PUNC
/PUNC
et peut aussi
///PUNC etc

tu ne pourras pas avoir un tableau de règles
complets
0
cs_maya77 Messages postés 36 Date d'inscription vendredi 13 novembre 2009 Statut Membre Dernière intervention 18 juin 2011
20 mai 2011 à 16:45
mais mon but n'est pas de vérifier tout mon texte mais de seulement trouver les suites de mots qui corresponde à une certaine règle.
0
cs_maya77 Messages postés 36 Date d'inscription vendredi 13 novembre 2009 Statut Membre Dernière intervention 18 juin 2011
20 mai 2011 à 18:08
enfaîte j'arrive à faire fonctionner cela mais des que je veux faire un clear sur le fichier qui contient ma première règle( pour passer à la seconde) j'ai une exception:
L'index était hors limites. Il ne doit pas être négatif et doit être inférieur à la taille de la collection.
Nom du paramètre : index


voici mon code:
Private Sub Button5_Click(byVal sender As System.Object, byVal e As System.EventArgs) Handles Button5.Click

        If i <= tablo.Count - 1 Then
            i = i + 1
        End If
Dim fichier As StreamReader = New StreamReader("C:\Users\samia\Desktop\Regles.txt", Encoding.UTF8)
        Dim cont1 As String = fichier.ReadLine
        Dim j As Integer = 0
        Dim x As Integer = 0
 While Not (cont1 Is Nothing)
            RichTextBox3.Clear()

Dim tab() As String = cont1.Split(" ")

            For v = 0 To UBound(tab)
                tab2.Add(tab(v))
            Next

Dim k As Integer = i
            Dim l As Integer = j
            x = 0
Dim bool As Boolean = compare(tablo(k), tab2(l))

            While (x <tab2.Count - 1) And bool True                tabli.Add(tablo(k)) 
                k = k + 1
 l = l + 1
'cest ici que lexception se produit
                bool = compare(tablo(k ), tab2(l ))
                x = x + 1
            End While
Dim tb() As String = tabli.ToArray

            For g = 0 To UBound(tb)
                RichTextBox3.AppendText(tb(g ) & vbLf)
            Next

            tabli.Clear()
            Erase tb
            Erase tab
            cont1 = fichier.ReadLine
'cest ici que ça pose probleme
            tab2.Clear()
        End While

fichier.Close()

    End Sub



si on pouvais juste m'orienté sur la façon de vider tab2, merciii
0
Utilisateur anonyme
20 mai 2011 à 18:34
                k = k + 1
 l = l + 1
'cest ici que lexception se produit
                bool = compare(tablo(k ), tab2(l ))

Il me semble que c'est ici que ça coince puisque tu incrémente l et k avant ta comparaison.
Tu commences donc aux 2emes éléments de tes tableaux au lieu des premiers.
x dépasse donc tab2.Count - 1

Essaye de faire tes incrémentations après la comparaison pour tester.

Penses à mettre des points d'arrêts (F9) pour vérifier tes tableaux en pas à pas (F8)
A bientôt.
0
Utilisateur anonyme
20 mai 2011 à 18:41
Non j'ai dit une bêtise j'avais pas remarqué que tu fais déjà une comparaison juste au dessus. Autant pour moi
0
Utilisateur anonyme
20 mai 2011 à 18:45
Tu fais une comparaison juste avant ta boucle en lisant le premier élément du tableau ca c'est bon. Mais si ton tableau ne comporte qu'un élément ta boucle suivante qui demande à tester un second élément va forcément planter.
0
cs_maya77 Messages postés 36 Date d'inscription vendredi 13 novembre 2009 Statut Membre Dernière intervention 18 juin 2011
21 mai 2011 à 19:18
je n'ai pas de règle qui contienne q'un seule élément, problème viens de tab2.Clear(); quand je veux vidé ma liste contenant la première règle pour y insérer la deuxième c'est la que cela cloche!!!

merci pour vos réponse
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
22 mai 2011 à 04:14
Salut
j'ai mis les règles et les phrases dans deux
fichiers différents

Private Reglesgrammaire As New List(Of String)
Private listanalyser As New List(Of String)
Private listresult As New List(Of String)
Private Sub ReadFile()

        Dim pathreglegrammaire As String = "E:\test.txt" ' à modifier selon le fichier
        Dim pathlistanalyser As String = "E:\test1.txt" ' à modifier selon le fichier
        Try
            Reglesgrammaire = System.IO.File.ReadAllLines(pathreglegrammaire).ToList
            listanalyser = System.IO.File.ReadAllLines(pathlistanalyser).ToList
        Catch ex As Exception
            MessageBox.Show(ex.Message)
            End
        End Try

    End Sub

Private Function Getcomposant(ByVal phrase As String) As String
        Dim str() As String
        Dim composant As String = String.Empty
        str = phrase.Split(" ")
        For Each element As String In str
            composant &= element.Substring(element.IndexOf("/") + 1) + " "
        Next
        composant = composant.Substring(0, composant.Length - 1)
        Return composant
    End Function
    Private Sub Analyse()
        Dim str As String
        listresult.Clear()
        For Each element As String In listanalyser
            str = Getcomposant(element)
            For Each regle As String In Reglesgrammaire
                If str = regle Then
                    listresult.Add(element)
                    listresult.Add(regle)
                End If
            Next
        Next
    End Sub
0
Rejoignez-nous