IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Optimisation de code: Retourner le nombre d'occurrence de lettres trouvées dans une phrase


Sujet :

C#

  1. #1
    Membre actif
    Avatar de Micmaya
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2010
    Messages : 131
    Points : 202
    Points
    202
    Billets dans le blog
    3
    Par défaut Optimisation de code: Retourner le nombre d'occurrence de lettres trouvées dans une phrase
    Bonjour à tous,
    Voilà je vous explique ma demande, je dois faire un algorithme qui me retourne le nombre d'occurrence de lettres trouvées dans une phrase, mais il faut que toutes les lettres de l'alphabet apparaissent, c-à-d:

    Dans la phrase: "Salut les amis!", l'algorithme devra me retourner ceci:

    A: 2
    B: 0
    C: 0
    D: 0
    E: 1
    ...
    Z: 0

    J'ai fait mon algorithme et il fonctionne parfaitement, j'aimerais juste savoir si c'est possible encore de l'améliorer/optimiser, je précise que je ne veux pas utiliser des fonctions supplémentaires qui nécessiterait des importations (using) en plus.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    static void NbreOccurence(string phrase)
    {
        phrase = phrase.ToUpper();
        int[] alpha = new int[26];
        for (int i = 65; i < 91; i++)                                     //La lettre "A" dans le code ASCII commence à la position 65 (+ 26 = 91)
        {
            for (int j = 0; j < phrase.Length; j++)
            {
                if (char.IsLetter(phrase[j]))
                {
                	if ((char)i == phrase[j]) alpha[i - 65]++;
                }
            }
            Console.WriteLine("La lettre '" + (char)i + "' apparaît: " + alpha[i - 65] + " fois");
        }
    }
    Dans mon code ou plutôt dans ma première boucle "for", je la paramètre à partir de 65 (position ASCII pour la lettre A), cela m'évite de déclarer un tableau de "char" avec la liste de l'alphabet, surtout que je ne veux pas stocker le résultat, juste l'afficher.
    Pourquoi réinventer la roue ???

    Merci d'avance pour vos réponses...
    Pensez à mettre comme si c'est le cas !

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Points : 1 745
    Points
    1 745
    Par défaut
    Bonjour,

    La double boucle imbriquée n'est pas optimum : On peut parcourir la chaîne est incrémenter directement le tableau via la valeur ascii - 65 du caractère de la chaîne.
    Ensuite il ne reste qu'à afficher le tableau. De ce fait au lieu d'avoir 26*Length on a 26+Lenght :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    phrase = phrase.ToUpper();
    int[] alpha = new int[26];
    
    for (int j = 0; j <= phrase.Length - 1; j++) {
        if (char.IsLetter(phrase(j))) {
            alpha[Strings.Asc(phrase(j)) - 65] += 1;
        }
    }
    for (i = 0; i <= 25; i++) {
        Console.WriteLine("La lettre '" + Strings.ChrW(i + 65) + "' apparaît: " + alpha[i] + " fois"); }
    (perso je fais du VB, j'ai converti le code en espérant qu'il n'y a pas d'erreur ...)

  3. #3
    Membre éprouvé
    Homme Profil pro
    Architecte technique
    Inscrit en
    Septembre 2005
    Messages
    462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 462
    Points : 1 056
    Points
    1 056
    Par défaut
    Pour l'optimisation je ne sais pas trop, par contre je serais passé par du linq :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
            private static void NbreOccurence(string phrase)
            {
                var dico = new Dictionary<char, int>();
                for (int i = 65; i < 91; i++)
                {
                    dico.Add((char)i, phrase.ToUpper().ToCharArray().Count(c => char.IsLetter(c) && c == (char)i));
                }
                dico.ToList().ForEach(d => Console.WriteLine("La lettre '{0}' apparaît {1} fois", d.Key, d.Value));
            }

  4. #4
    Membre actif
    Avatar de Micmaya
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2010
    Messages : 131
    Points : 202
    Points
    202
    Billets dans le blog
    3
    Par défaut
    Merci pour votre réponse
    Quelques erreurs de conversion vers le C# que j'ai remarqué mais que j'ai corrigé, voici le code final:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    phrase = phrase.ToUpper();
    int[] alpha = new int[26];
     
    for (int j = 0; j < phrase.Length; j++)
    {
        if (char.IsLetter(phrase[j])) alpha[(char)(phrase[j]) - 65] += 1;
    }
    for (int j = 0; j < 26; j++) Console.WriteLine("La lettre '" + (char)(j + 65) + "' apparaît: " + alpha[j] + " fois");
    Effectivement, je n'aimais pas beaucoup la boucle imbriqué, je cherchais un moyen de l'éviter, mais je n'avais pas "encore" trouvé.

    Merci, je vais attendre un peu pour les autres propositions, mais je crois que l'on ne pourrait pas l'améliorer d'avantage.

    "katkiller" comme tu es arrivé pendant que j'écrivais ma réponse, effectivement j'aurai plutôt utilisé une méthode avec du LINQ et je sais les avantages qu'elles procurent. Mais dans mon cas, je ne peux pas utiliser d'autres fonctions (que je dois importer avec les using), c'est un exercice que je dois faire et comme on n'a pas encore vu les fonctions de LINQ, je ne veux pas encore les utiliser. Merci sinon à toi pour ta proposition.
    Pensez à mettre comme si c'est le cas !

  5. #5
    Membre éprouvé
    Homme Profil pro
    Architecte technique
    Inscrit en
    Septembre 2005
    Messages
    462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 462
    Points : 1 056
    Points
    1 056
    Par défaut
    Citation Envoyé par Micmaya Voir le message
    "katkiller" comme tu es arrivé pendant que j'écrivais ma réponse, effectivement j'aurai plutôt utilisé une méthode avec du LINQ et je sais les avantages qu'elles procurent. Mais dans mon cas, je ne peux pas utiliser d'autres fonctions (que je dois importer avec les using), c'est un exercice que je dois faire et comme on n'a pas encore vu les fonctions de LINQ, je ne veux pas encore les utiliser. Merci sinon à toi pour ta proposition.
    Ah oui effectivement j'avais pas bien lu

    Vivement Linq...

  6. #6
    Membre actif
    Avatar de Micmaya
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2010
    Messages : 131
    Points : 202
    Points
    202
    Billets dans le blog
    3
    Par défaut
    Petites corrections d'optimisation:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (char.IsLetter(phrase[j])) alpha[(char)(phrase[j]) - 65] += 1;
    devient:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (char.IsLetter(phrase[j])) alpha[(char)phrase[j] - 65]++;
    J'ai enlevé les parenthèses de "(phrase[j])" et ai mis à la place de "+= 1" >> "++"
    Merci encore
    Pensez à mettre comme si c'est le cas !

  7. #7
    Membre actif
    Avatar de Micmaya
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2010
    Messages : 131
    Points : 202
    Points
    202
    Billets dans le blog
    3
    Par défaut
    Allez sur-ce, je mets cette discussion sur résolu.
    Merci à tous d'avoir pris le temps de la lire et d'y avoir répondu.... :-)
    Pensez à mettre comme si c'est le cas !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 23/09/2017, 22h15
  2. Réponses: 0
    Dernier message: 31/05/2011, 18h58
  3. comptage du nombre d'occurrence d'un caractère dans une chaîne
    Par laurentSc dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 15/03/2011, 13h38
  4. Réponses: 2
    Dernier message: 18/04/2008, 16h19
  5. Nombre d'occurences d'un mot dans une phrase
    Par cirtey dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 07/05/2007, 21h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo