Copier et Coller le premier, ou second chiffre d'un résultat

Signaler
Messages postés
8
Date d'inscription
vendredi 28 août 2020
Statut
Membre
Dernière intervention
30 août 2020
-
Messages postés
8
Date d'inscription
vendredi 28 août 2020
Statut
Membre
Dernière intervention
30 août 2020
-
Bonjour,

Bonjour,
Je travail sous Visual Basic Express 2010. Dans un Label j'obtiens un résultat (somme de différents TexteBox. Comment dois-je écrire mon code pour copie une partie de ce résultat. Exemple : Si mon résultat est égal à 46 comment sélectionner le 4 et le copier dans un autre label, ensuite sélectionner le 6 et le copier dans un autre label. Idem pour un résultat >= 100, sélectionner le premier chiffre puis le coller dans un label, puis le 2ème chiffre et le coller dans un autre Label et idem pour le 3ème, le copier et le coller dans un autre Label. Evidement en utilisant du code, pas le bouton droit de la souris. Merci à tous et bonne soirée.
Jean-Luc


Configuration: Windows / Edge 85.0.564.41

8 réponses

Messages postés
11957
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
31 août 2020
678
bonjour,
moi je calculerais chacun des chiffres:
- le chiffre des unités, c'est le nombre modulo 10
- ensuite je soustraie le chiffre des unités du nombre, je le divise par 10, et je continue

tu pourrais aussi utiliser la fonction mid pour récupérer chaque caractère.
Messages postés
8
Date d'inscription
vendredi 28 août 2020
Statut
Membre
Dernière intervention
30 août 2020

Bonjour
Je ne comprend pas bien votre réponse, cela ne convient pas aux résultats dont j'ai besoin. Exemple, si dans mon Label j'obtiens un résultat de 45, je dois additionné ses deux chiffres. En gros je copie le 4 et je le colle dans un Label "'X", puis je copie le 5 et je le colle dans un autre Label "Y". Ensuite dans un 3ème Label "Z" j'additionne 4 + 5 = 9. (Si ce résultat est supérieur > 9, je dois recommencer ) mais bon ce sera facile avec le premier résultat ou résolution de mon problème. Je dois utilisé Left - Right - Mid comme vous me dites mais écrire le code m'est difficile. Merci de votre réponse.
Messages postés
11957
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
31 août 2020
678
souhaites-tu uniquement obtenir un nombre entre 1 et 9, suivant la somme des chiffres d'un nombre?
pourquoi travailler avec des labels intermédiaires?
dans quel contexte fais-tu cela?
Messages postés
8
Date d'inscription
vendredi 28 août 2020
Statut
Membre
Dernière intervention
30 août 2020
>
Messages postés
11957
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
31 août 2020

Bonjour yg_be,
Pour répondre à ta question, oui je suis obligé de simplifier mes résultats jusqu'à l'obtention d'un nombre entre 1 et 9. Pourquoi : La numérologie est comme ça. Chaque lettre de l'alphabet correspond à un nombre entre 1 et 9. A=1, B=2, C=3, D=4 ==>I=9, et J=1, K=2, L=3. ainsi de suite. Maintenant pour répondre à ta 2éme question si tu as un code pour éviter les Labels intermédiaires je suis preneur. J'ai écrit prés de 6000 lignes de code et ça tourne bien niveau calcul. Il ne me reste plus que cette partie qui est très importante car selon les résultats on obtient différents thèmes. Merci
>
Messages postés
8
Date d'inscription
vendredi 28 août 2020
Statut
Membre
Dernière intervention
30 août 2020

Coucou comment allez vous
Messages postés
8
Date d'inscription
vendredi 28 août 2020
Statut
Membre
Dernière intervention
30 août 2020
> catalina
Bonjour, Je vais bien merci
Messages postés
14706
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
1 septembre 2020
571
Bonjour

J'ai écrit prés de 6000 lignes de code et ça tourne bien niveau calcul

Dans l'absolue ça n'a de sens que pour toi.
Je suis capable d'obtenir le même résultat en 1 ligne ou 10 000.

Revenons à ta question.
Comme la majorité des autodidacte (moi en tête à mes débuts), tu raisonnes à l'envers.
  • Un textbox et un label contiennent du texte.
  • On fait des calculs, avec des nombres.
  • Pour tes calculs, il est nécessaire de saisir du texte qui représente des nombres dans des textbox
  • Une fois ces textes convertis en nombre, on n'utilise plus de controles (quel qu'il soit) comme point de départ d'un calcul.
  • Que tu veuilles ou non afficher des résultats intermédiaires est complètement décoléré des calculs.



On va écrire une méthode à qui on donne un entier supérieur à 9 et qui établit une collection contenant les chiffres qui le composent.
Si cette collection contient plus d'un chiffre, elle s'appelle elle même pour recommencer.
C'est ce qu'on appelle une méthode récursive, ça fait une sorte de boucle.

On va alimenter cette méthode avec la somme des nombres saisis dans les textbox après conversion

A chaque boucle si tu le veux, on peut afficher un résultat intermédiaire, note qu'avec des labels c'est un peu chiant, il faut soit en prévoir d'avance (qui serviront ou pas), soit les instancier au fur et à mesure.
Dans mon exemple, je vais me servir d'une listbox.

Je pars du principe que tu codes en Winform, si en fait tu fais du WPF ou autre type d'interface graphique, on adaptera.

J'ai 3 textbox, txtN1, txtN2, txtN3 et la ListBox lstResultat
J'ai une classe
Public Class CalculKoriru

    Public Sub New(ParamArray Entiers() As Integer) 'entiers est passé avec le modifier ParamArray, on peut y mettre autant de nombre qu'on veut
        Dim somme As Integer = Entiers.Sum()
        Resultats = New List(Of String)
        Calcul(somme)
    End Sub

    Public Property Resultats As List(Of String)

    Public Property Resultat As Integer

    ''' <summary>
    ''' Function qui retourne de façon récursive la somme des chiffres d'un nombre et ainsi de suite tant que la somme dépasse 9
    ''' </summary>
    ''' <param name="Entier"></param>
    Private Sub Calcul(Entier As Integer)
        Dim res As List(Of Integer) = New List(Of Integer)()

        While Entier > 0
            res.Add(Entier Mod 10) 'le modulo est le chiffre le plus bas => 123 mod 10 = 3
            Entier = Entier \ 10 'la division euclidienne permet de décaller d'une décimale "vers la droite" => 123 devient 12
        End While
        res.Reverse() 'pour les avoirs dans le bon ordre

        If res.Count > 1 Then
            Dim somme As Integer = res.Sum()

            Resultats.Add(String.Format("{0} = {1}", String.Join(" + ", res), somme))

            Calcul(somme) 'on rend la function récursive
        Else
            Resultats.Add(String.Format("Résultat final: {0}", res.First()))
            Resultat = res.First()
        End If
    End Sub

End Class


Et dans un bouton, je lance le calcul et en affiche les résultats
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim c As CalculKoriru
        c = New CalculKoriru(Convert.ToInt32(txtN1.Text), Convert.ToInt32(txtN2.Text), Convert.ToInt32(txtN3.Text)) 'on initie notre calcul

        lstResultat.DataSource = Nothing 'on reset au cas où il y aurait déjà eu un calcul
        lstResultat.DataSource = c.Resultats 'on affiche les calculs intermédiaires dans la listbox

        MessageBox.Show(String.Format("Le résultat est {0}", c.Resultat)) 'et on assène le coup ;)

    End Sub


Et ça donne
Messages postés
14706
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
1 septembre 2020
571
D'ailleurs, c'est mieux si on modifie le constructeur de la classe comme ça
    Public Sub New(ParamArray Entiers() As Integer) 'entiers est passé avec le modifier ParamArray, on peut y mettre autant de nombre qu'on veut
        Dim somme As Integer = Entiers.Sum()
        Resultats = New List(Of String)
        Resultats.Add(String.Format("{0} = {1}", String.Join(" + ", Entiers), somme))
        Calcul(somme)
    End Sub

Messages postés
8
Date d'inscription
vendredi 28 août 2020
Statut
Membre
Dernière intervention
30 août 2020

Merci Whismeril,
je "programme" sous Visual Basic Express 2010. Certes je ne suis pas expert et me débrouille comme je peux. Voici juste un petit morceau du programme concernant le nombre incroyable de lignes écrites.

Private Sub Tbnom1_TextChanged(sender As System.Object, e As System.EventArgs) Handles Tbnom1.TextChanged
'Traitements et résultats des infos dans les TbNom.
If Tbnom1.Text <> "" Then
Tbnom1.Enabled = False
If Tbnom1.Text = "A" Or Tbnom1.Text = "J" Or Tbnom1.Text = "S" Then
TbResultNom1.Text = 1
Else
If Tbnom1.Text = "B" Or Tbnom1.Text = "K" Or Tbnom1.Text = "T" Then
TbResultNom1.Text = 2
Else
If Tbnom1.Text = "C" Or Tbnom1.Text = "L" Or Tbnom1.Text = "U" Then
TbResultNom1.Text = 3
Else
If Tbnom1.Text = "D" Or Tbnom1.Text = "M" Or Tbnom1.Text = "V" Then
TbResultNom1.Text = 4
Else
If Tbnom1.Text = "E" Or Tbnom1.Text = "N" Or Tbnom1.Text = "W" Then
TbResultNom1.Text = 5
Else
If Tbnom1.Text = "F" Or Tbnom1.Text = "O" Or Tbnom1.Text = "X" Then
TbResultNom1.Text = 6
Else
If Tbnom1.Text = "G" Or Tbnom1.Text = "P" Or Tbnom1.Text = "Y" Then
TbResultNom1.Text = 7
Else
If Tbnom1.Text = "H" Or Tbnom1.Text = "Q" Or Tbnom1.Text = "Z" Then
TbResultNom1.Text = 8
Else
If Tbnom1.Text = "I" Or Tbnom1.Text = "R" Then
TbResultNom1.Text = 9
End If
Il va de soi que j'ai du créer 26 "Tbnom" concernant le nom des personnes, puis pour les 3 Prénoms de 15 labels chacun. Et évidement pour le jour de naissance, le mois et l'année. De tout cela j'obtiens un résultat global soit <=99 ou >100 dans ce cas j'écris que si mon résultat est <=99 faire tel calcul et si >=100 faire tel calcul. Existe t'il plus court, merci
Messages postés
14706
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
1 septembre 2020
571
Merci d'utiliser les balises de code pour poster ton code, voir ici
https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

Il va de soi que j'ai du créer 26 "Tbnom" concernant le nom des personnes, puis pour les 3 Prénoms de 15 labels chacun


Ben non ça va pas de soit, parce que je ne fais pas de numérologie (et c'est pour cela que le code que je t'ai montré est ouvert, pas de limite sur le nombres de nombres d'entrée ni du nombres de calculs à faire).
Mais surtout d'un point de vue algorithme c'est ça me paraît aberrant.

En l'état je ne comprends pas à quoi ça peut servir, et je ne peux pas le déduire de ton code qui est illisible (pas de balises)

Je te propose, d'expliquer dans un premier temps le but de tout ça
Messages postés
8
Date d'inscription
vendredi 28 août 2020
Statut
Membre
Dernière intervention
30 août 2020

Voilà je m'explique : En numérologie nous utilisons le nom d'une personne, ses prénoms et sa date de naissance pour établir différents thèmes. Chaque lettre de son nom, prénom correspond à un chiffre allant de 1 à 9. Dans le cas d'une recherche sur son chemin de vie, je vais utiliser uniquement sa date de naissance. Pour son nombre héréditaire je vais utiliser son nom de famille "traduit" en chiffre". Pour son nombre actif ses prénoms " en chiffre". Pour son nombre d’expression je devrais utiliser son nombre héréditaire et son nombre actif. Il y a moult possibilité avec les chiffres. D'ou l'écriture (ou pas selon toi) du code suivant. Dans Visual Basic Express 2010, nous utilisons pas de balise...

If Tbnom1.Text = "A" Or Tbnom1.Text = "J" Or Tbnom1.Text = "S" Then

TbResultNom1.Text = 1


Dans un TexBox (nommé Tbnom) je documente la première lettre de son nom (donc autant de "textbox" que de lettre à son nom de famille (j'en ai écris 26) donc autant de TextBox (TbResultat) qui transforme la lettre Tbnom en chiffre

J'utilise la numérologie depuis des années, mais sur format papier, je ne connais pas d'autres langage et j'ai essayé avec le Csharp. Je n'ai pas trouvé de doc en magasin pour écrire en Csharp, par contre de la doc sur Visual Basic Express je suis peinard.

Donc voici pourquoi je recherche ce type de calcul, extraire d'un Label un chiffre d'un résultat. Si mon résultat obtenu ne donne 123, je dois extraire le 1, puis le coller dans un Label, ensuite le 2, coller dans un autre Label et le 3. J'ai d'installé sur mon poste Visual Studio 2015 avec le Csharp

Merci
Messages postés
11957
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
31 août 2020
678
je pense que ta démarche est logique, dans le contexte de la numérologie. il est nécessaire, pour donner du sens à la numérologie, de faire des calculs inutiles et embrouillés. les 6000 lignes de code contribuent à justifier la valeur de la numérologie.
notre démarche, dans les sciences de l'information, est de chercher l'algorithme le plus efficace pour obtenir un résultat.
je pense que ces deux approches sont inconciliables.
Messages postés
8
Date d'inscription
vendredi 28 août 2020
Statut
Membre
Dernière intervention
30 août 2020
>
Messages postés
11957
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
31 août 2020

Bonjour yg_be,
Je comprend ta réponse, mais je n'ai pas tes connaissances ni ta logique. Chercher un algorithme comme tu dis et pour moi trop complexe. Je me défend avec mes petits programmes et mes petites applications. Si je trouve un livre en français et pour débutant sur le Csharp je suis preneur.

Merci de ton aide, a+
Messages postés
14706
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
1 septembre 2020
571
Alors les balises c'est pour le site (enfin tous les sites de code en proposent)
Je t'ai mis un lien plus haut pour t'en servir.

Dans le code que je t'ai montré, il y a de la couleur, des numéros de ligne, des ascenseurs verticaux et horizontaux et surtout le code est indenté.


Revenons à ton problème.
Tu n'as besoin que d'un textbox pour le nom, un pour les prénoms et un pour la date de naissance.

Partons du principe que maintenant, mes 3 textbox sont txtNom, txtPrenom et txtNaissance

Je te donne un premier exemple avec le nom, attention, je n'ai pas traité tout l'alphabet (à toi de compléter). Attention, je n'ai pas traité la différenciation majuscule/minuscule, ni les diacritiques.

Maintenant la classe est
Public Class CalculKoriru

    Public Sub New(Nom As String, Prenom As String, Naissance As DateTime)
        Resultats = New List(Of String)

        Dim entiers As List(Of Integer) = ConvertirTexte(Nom)
        Dim somme As Integer = entiers.Sum()
        Resultats.Add(String.Format("{0} = {1}", String.Join(" + ", entiers), somme))
        Calcul(somme)
    End Sub

    Public Property Resultats As List(Of String)

    Public Property Resultat As Integer

    ''' <summary>
    ''' Méthode qui calcule de façon récursive la somme des chiffres d'un nombre et ainsi de suite tant que la somme dépasse 9
    ''' </summary>
    ''' <param name="Entier"></param>
    Private Sub Calcul(Entier As Integer)
        Dim res As List(Of Integer) = New List(Of Integer)()

        While Entier > 0
            res.Add(Entier Mod 10) 'le modulo est le chiffre le plus bas => 123 mod 10 = 3
            Entier = Entier \ 10 'la division euclidienne permet de décaller d'une décimale "vers la droite" => 123 devient 12
        End While
        res.Reverse() 'pour les avoirs dans le bon ordre

        If res.Count > 1 Then
            Dim somme As Integer = res.Sum()

            Resultats.Add(String.Format("{0} = {1}", String.Join(" + ", res), somme))

            Calcul(somme) 'on rend la function récursive
        Else
            Resultats.Add(String.Format("Résultat final: {0}", res.First()))
            Resultat = res.First()
        End If
    End Sub

    ''' <summary>
    ''' Convertit le nom ou le prénom passé en paramètre en liste de nombre correspondant à chaque lettre
    ''' </summary>
    ''' <param name="Nom"></param>
    ''' <returns></returns>
    Private Function ConvertirTexte(Nom As String) As List(Of Integer)
        Dim res = New List(Of Integer)

        For Each c As Char In Nom

            Select Case c
                Case "A"c, "J"c, "S"c
                    res.Add(1)
                Case "B"c, "K"c, "T"c
                    res.Add(2)

                    'etc, je te laisse compléter
            End Select

            Resultats.Add(String.Format("La lettre {0} donne {1}", c, res.Last()))
        Next

        Return res
    End Function


End Class


et le bouton qui lance le calcul est
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim c As CalculKoriru
        c = New CalculKoriru(txtNom.Text, txtPrenom.Text, Convert.ToDateTime(txtNaissance.Text)) 'on initie notre calcul

        lstResultat.DataSource = Nothing 'on reset au cas où il y aurait déjà eu un calcul
        lstResultat.DataSource = c.Resultats 'on affiche les calculs intermédiaires dans la listbox

        MessageBox.Show(String.Format("Le résultat est {0}", c.Resultat)) 'et on assène le coup ;)

    End Sub


et ça donne

Quand j'étais petit, la mer Morte n'était que malade.
George Burns
Messages postés
14706
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
1 septembre 2020
571
Ça peut même être un peu optimisé, tout en restant accessible à un débutant.

Par 2 fois, je faisais la somme de chiffres et ajoutais une ligne de texte qui représentait cette somme => x fois le même code = perte de temps et risque d'oublier de corriger un exemplaire en cas de modification (correction ou évolution)

Maintenant une fonction calcule la somme et ajoute la ligne.
Elle est appelée par 2 fois dans le code.
C'est ce qu'on appelle factoriser le code, c'est essentiel pour gagner en temps de développement et surtout de maintenance.

Public Class CalculKoriru

    Public Sub New(Nom As String, Prenom As String, Naissance As DateTime)
        Resultats = New List(Of String)

        Dim sum As Integer = Somme(ConvertirTexte(Nom))

        Calcul(sum)
    End Sub

    Public Property Resultats As List(Of String)

    Public Property Resultat As Integer

    ''' <summary>
    ''' Méthode qui calcule de façon récursive la somme des chiffres d'un nombre et ainsi de suite tant que la somme dépasse 9
    ''' </summary>
    ''' <param name="Entier"></param>
    Private Sub Calcul(Entier As Integer)
        Dim res As List(Of Integer) = New List(Of Integer)()

        While Entier > 0
            res.Add(Entier Mod 10) 'le modulo est le chiffre le plus bas => 123 mod 10 = 3
            Entier = Entier \ 10 'la division euclidienne permet de décaller d'une décimale "vers la droite" => 123 devient 12
        End While
        res.Reverse() 'pour les avoir dans le bon ordre

        If res.Count > 1 Then
            Dim sum As Integer = Somme(res)
            Calcul(sum) 'on rend la function récursive
        Else
            Resultats.Add(String.Format("Résultat final: {0}", res.First()))
            Resultat = res.First()
        End If
    End Sub

    ''' <summary>
    ''' Convertit le nom ou le prénom passé en paramètre en liste de nombre correspondant à chaque lettre
    ''' </summary>
    ''' <param name="Nom"></param>
    ''' <returns></returns>
    Private Function ConvertirTexte(Nom As String) As List(Of Integer)
        Dim res = New List(Of Integer)

        For Each c As Char In Nom

            Select Case c
                Case "A"c, "J"c, "S"c
                    res.Add(1)
                Case "B"c, "K"c, "T"c
                    res.Add(2)

                    'etc, je te laisse compléter
            End Select

            Resultats.Add(String.Format("La lettre {0} donne {1}", c, res.Last()))
        Next

        Return res
    End Function

    ''' <summary>
    ''' Calcule la somme d'une liste d'entier et ajoute l'étape à la liste des résultats sous forme de texte
    ''' </summary>
    ''' <param name="Entiers"></param>
    ''' <returns></returns>
    Private Function Somme(Entiers As List(Of Integer)) As Integer
        Dim sum As Integer = Entiers.Sum()

        Resultats.Add(String.Format("{0} = {1}", String.Join(" + ", Entiers), sum))

        Return sum
    End Function

End Class
Messages postés
8
Date d'inscription
vendredi 28 août 2020
Statut
Membre
Dernière intervention
30 août 2020

Merci beaucoup.
Si tu connais un livre sur le Csharp et en français surtout, merci.

Bon week-end et peut être à plus.
Un retraité
Koriru85
Messages postés
14706
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
1 septembre 2020
571