C# : affichage du nombre de caractères d'une matrice char ?
Répondre à la discussion
Affichage des résultats 1 à 23 sur 23

C# : affichage du nombre de caractères d'une matrice char ?



  1. #1
    chess_yuss

    C# : affichage du nombre de caractères d'une matrice char ?


    ------

    Bonjour,

    Je cherche un moyen d'afficher le nombre de fois qu'un caractère apparaît dans une matrice (et faire cela pour les autres caractères présents également). Je pense avoir besoin d'utiliser un foreach ( ou p-e un for), mais à part ça je n'ai pas vraiment d'idée :S
    Comment faites-vous cela ?
    Je vous poste mon code pour que vous ayez une idée de ce que j'essaie de faire:
    Code:
    using System;
    using System.Threading;
    
    namespace a {
    
        public class Program {
    
            public static Random alea = new Random();
    
            public static void Main() {
                Console.WriteLine("Rectangle de lettres prises au hasard dans un string de caractères:");
                int nbLignes;
                int nbColonnes;
                string caracteres;
                SaisieDonnees(out nbLignes, out nbColonnes, out caracteres);
                Console.WriteLine();
                char[,] matRectangle = new char[nbLignes, nbColonnes];
                FabriqueMatriceRectangle(caracteres, matRectangle);
                string message = ("Rectangle " + nbLignes + " x " + nbColonnes + " de lettres:");            
                AfficheMatriceRectangle(matRectangle, message);
                Console.WriteLine();
                Console.WriteLine("Statistiques" );
                Console.WriteLine("============");
    
                
            } // fin méthode Main()
    
            private static void SaisieDonnees(out int nbLignes, out int nbColonnes, out string caracteres) {
                Console.Write("Donnez le nombre de lignes   1..19 : ");
                nbLignes = int.Parse(Console.ReadLine());
                while (nbLignes < 1 || nbLignes > 19) {
                    Console.WriteLine("Erreur: int attendu entre 1 et 19, vous avez entré l'entier {0}", nbLignes);
                    Console.Write("Donnez le nombre de lignes   1..19 : ");
                    nbLignes = int.Parse(Console.ReadLine());
                }
                Console.Write("Donnez le nombre de colonnes 1..39 : ");
                nbColonnes = int.Parse(Console.ReadLine());
                while (nbColonnes < 1 || nbColonnes > 39) {
                    Console.WriteLine("Erreur: int attendu entre 1 et 39, vous avez entré l'entier {0}", nbColonnes);
                    Console.Write("Donnez le nombre de colonnes 1..39 : ");
                    nbColonnes = int.Parse(Console.ReadLine());
                }
                Console.Write("Donnez le string de caractères: ");
                caracteres = Console.ReadLine();
                while (caracteres.Length < 1 || caracteres.Length > 2147483647) {
                    Console.WriteLine("Erreur : quantité de caractères attendue de 1 à 2147483647, vous avez entré \"{0}\"", caracteres);
                    Console.Write("Donnez le string de caractères: ");
                    caracteres = Console.ReadLine();
                }
            }
    
            private static void AfficheMatriceRectangle(char[,] matRectangle, string message) {
                Console.WriteLine("{0}\n", message);
                for (int i = 0; i < matRectangle.GetLength(0); i++) {
                    for (int j = 0; j < matRectangle.GetLength(1); j++) {
                        Console.Write("{0,2}", matRectangle[i, j]);
                    }
                    Console.WriteLine();
                }
            }
    
            private static void FabriqueMatriceRectangle(string caracteres, char[,] matRectangle) {
                for (int i = 0; i < matRectangle.GetLength(0); i++) {
                    for (int j = 0; j < matRectangle.GetLength(1); j++) {
                        char lettre = caracteres[alea.Next(0, caracteres.Length - 1)];
                        matRectangle[i, j] = lettre;
                    }
                }
            }
    
        } // fin class Program
    
    } // fin namespace
    Merci d'avance pour vos réponses

    -----

  2. #2
    invite4492c379

    Re : C# : affichage du nombre de caractères d'une matrice char ?

    En lançant ton programme j'ai obtenu :

    Code:
    Rectangle de lettres prises au hasard dans un string de caractères:
    Donnez le nombre de lignes   1..19 : 4
    Donnez le nombre de colonnes 1..39 : 4
    Donnez le string de caractères: bonjour
    
    
    Rectangle 4 x 4 de lettres:
    
    
     j o b u
     n n j j
     o o b u
     b o j n
    
    
    Statistiques
    ============
    Explique moi comment tu ferais à la main ce que tu essayes de programmer, prends par exemple la sortie copiée au-dessus.

  3. #3
    chess_yuss

    Re : C# : affichage du nombre de caractères d'une matrice char ?

    Hmmm, si je cherchai le nombre de j, alors j'écrirais le chiffre 1 sur le premier j que je vois, 2 sur le 2eme etc... jusqu'à être rendu au dernier, et le nombre que j'écrirais au-dessus de celui-ci serait le nombre total de j. Je ferais de même pour chaque autre lettre.
    Dans ce cas ci j'écrirais :

    1
    j o b u
    . .. 2 3
    n n j j

    o o b u
    .... 4
    b o j n

    (je met des points parce que les espaces sont effacés par le forum apparemment)

    Puisque le dernier j est le 4ème, j'ai donc 4 j.
    Dernière modification par chess_yuss ; 29/10/2011 à 18h51.

  4. #4
    invite4492c379

    Re : C# : affichage du nombre de caractères d'une matrice char ?

    Et si une des lettres d'origine n'apparaît pas ?

    pour eviter les espaces effacées utilise la balise code ...

  5. A voir en vidéo sur Futura
  6. #5
    chess_yuss

    Re : C# : affichage du nombre de caractères d'une matrice char ?

    Pour cela je ne marque rien, seules les lettres qui apparaissent m’intéressent.
    Et désolé je savais pas qu'il fallait utiliser la balise code.

  7. #6
    invite4492c379

    Re : C# : affichage du nombre de caractères d'une matrice char ?

    si tu ne marques rien, comment sais-tu qu'elles ne sont pas utilisées ?

  8. #7
    chess_yuss

    Re : C# : affichage du nombre de caractères d'une matrice char ?

    Dans ce cas-là je ne le saurais pas, t'as raison. Alors à la place je pourrais prendre 1 par 1 les lettres de bonjour et effectuer la même démarche que la précédente, et une fois rendu au r je remarquerais qu'il n'y en a pas.
    Donc je commence par b, je ''scanne'' le tableau avec mes yeux et place un chiffre au-dessus de chaque b.
    Je fais de même pour o,n,j,u,r et dans le cas ou l'une des lettres n’apparaît pas je ne marque rien.
    Par contre le ''o'' se répète, donc moi évidemment je le sais mais le programme risquerait d'écrire 2 messages disant qu'il y a x nombres de o.

  9. #8
    invite4492c379

    Re : C# : affichage du nombre de caractères d'une matrice char ?

    Donc l'idéal serait de disposer d'une structure qui associe à une clé (dans ton cas une lettre) une valeur particulière (dans ton cas le nombre d'occurence de la clé dans la matrice). L'idéal serait même de pouvoir écrire, si une instance de cette structure s'appelle D, D["o"]=D["o"]+1 pour incrémenter le nombre de o.
    Ce genre de structure existe déjà dans .NET et il s'agit de la class Dictionary disponible dans System.Collections.Generic.

    L'utilisation est simple :

    déclaration
    Dictionary<char,int> D = new Dictionary<char,int>()

    Tu déclares une nouvelle variable D de type Dictionary<char,int>. C'est un type générique. Les clés auront pour type char et les valeurs associées le type int car tu veux comptabiliser pour des lettres leur nombre d'occurence.

    initialisation
    mise à part l'allocation de D, il va falloir initialiser le nombre d'occurence de chaque lettre à 0. C'est l'occasion d'utiliser un foreach. La technique est simple, on prend une lettre, on vérifie que l'on ne l'a pas déjà traitée (dans ce cas la clé est déjà présente) et si c'est le cas on crée la clé et on initialise la valeur associée à 0.

    Code:
    foreach(char c in ChaineDeCaractere) // pour chaque caractère dans une chaine
      if (! D.ContainsKey(c))            // si le caractère n'est pas déjà apparu
        D.Add(c,0);                      // on ajoute la tuple (c,0), c'est-à-dire on associe 0 à c
    utilisation
    Tu parcours ta matrice (comme pour l'affichage), et pour chaque caractère il te suffira de faire un D[mat[i,j]]=D[mat[i,j]]+1.

    Pour afficher le résultat tu peux essayer par exemple de faire :

    Code:
    foreach( KeyValuePair<char,int> Tuple in D)
      console.WritleLine("{0,2} : {1}", Tuple.Key, Tuple.Value);
    Parcourrir un Dictionary avec un foreach te donne un énumérateur sur un KeyValuePair qui est juste un objet qui contient la valeur de la clé dans Key (donc ton char) et la valeur associée à la clé dans Value (ton nombre d'occurence).



    Si tu arrives à comprendre et à faire qqch avec ça tu auras fait un grand pas

  10. #9
    invite4492c379

    Re : C# : affichage du nombre de caractères d'une matrice char ?

    un page d'exemples simples : http://www.dotnetperls.com/dictionary

  11. #10
    chess_yuss

    Re : C# : affichage du nombre de caractères d'une matrice char ?

    Ah non je ne peux pas faire ça car c'est un TP sur lequel je travaille et je suis obligé de n'utiliser que les notions prises de mon cours.
    Je pourrais peut être avoir une variable (d'abord déclarée dans une méthode puis utilisée dans un foreach dans la même méthode)qui est égale a 0, puis a chaque fois que le programme tombe sur une lettre voulu il ajoute +1 a la variable(avec un if), et à la fin il retournerait la valeur de la variable qui serait normalement l'équivalent du total. Qu'en penses-tu ? Je vais essayer ça en attendant ta réponse.

  12. #11
    invite4492c379

    Re : C# : affichage du nombre de caractères d'une matrice char ?

    Oh la ... essaye de réfléchir avec un tableau dans ce cas ... ou peut-être même deux ...
    un qui contient les lettres et l'autre les valeurs par exemple

  13. #12
    chess_yuss

    Re : C# : affichage du nombre de caractères d'une matrice char ?

    Bingo, ça a marché :
    Code:
                
    int quantite = 0;
                for (int i = 0; i < caracteres.Length-1; i++)
    			{   
    			    foreach (char x in matRectangle) {
                                   if (x == caracteres[i]) quantite += 1;              
                            }
                         Console.WriteLine("Le caractère \'{0}\' apparait {1} fois dans la matrice", caracteres[i], quantite);
    	    }
    Merci encore pour ton aide

  14. #13
    invite4492c379

    Re : C# : affichage du nombre de caractères d'une matrice char ?

    De rien, mais tu as à moitié fini seulement ...

  15. #14
    chess_yuss

    Re : C# : affichage du nombre de caractères d'une matrice char ?

    oups, ''int quantite = 0;'' devrait être à l’intérieur du for.
    J'ai également ajouté une ligne indiquant le total, qu'est-ce qu'il me manque ? je crois avoir tout.

    edit: Mince, il marque 0 si un char est affiché 0 fois
    Dernière modification par chess_yuss ; 29/10/2011 à 21h48.

  16. #15
    invite4492c379

    Re : C# : affichage du nombre de caractères d'une matrice char ?

    Je sais pas ... teste avec bonjour par exemple ...

  17. #16
    chess_yuss

    Re : C# : affichage du nombre de caractères d'une matrice char ?

    Ah ! je le savais qu'il répéterait le o une seconde fois :@, tu as une astuce pour moi ?

  18. #17
    invite4492c379

    Re : C# : affichage du nombre de caractères d'une matrice char ?

    il y en a plusieurs lol

    pour rester au niveau beginner tu peux imaginer par exemple :

    String lettres="abcdefghijklmnopqrstu vwxyz"; // en gros les caractères acceptés ... à compléter s'il le faut

    suivi d'un
    Code:
    foreach(char c in lettres)
      if (ChaineEntree.IndexOf(c)>=0)
      {
        // la lettre c est présente dans la chaine entrée par le user
        // IndexOf(char)  est une méthode de string qui renvoie la première position du caractère 
        //    passé en paramètre dans le String. S'il n'y est pas elle renvoie -1
    
        // il faut compter le nombre d'occurence de c dans la matrice
      }
    par exemple ...

  19. #18
    chess_yuss

    Re : C# : affichage du nombre de caractères d'une matrice char ?

    J'ai pas encore vu ça malheureusement donc je ne peux l'utiliser. Je voulais mettre un 2ème if qui vérifierait si les caractères se répètent et que dans le cas échéant faire un break pour ne pas commencer à compter le nombre du deuxième (ou troisième, quatrième etc...), enfin, un truc du genre.

    Alternativement, je pensais écrire un deuxième string basé sur le premier mais qui ne contiendrait que les lettres du string initial. Par exemple, au lieu de bonjour on aurait bonjur, et ensuite je pourrais baser ma boucle foreach sur ce string là au lieu du premier. Qu'en penses-tu ?

  20. #19
    invite4492c379

    Re : C# : affichage du nombre de caractères d'une matrice char ?

    pourquoi pas ... avec une boucle while ... tu connais les limites que l'on t'impose

  21. #20
    chess_yuss

    Re : C# : affichage du nombre de caractères d'une matrice char ?

    Je n'y arrive pas As-tu une astuce qui se limite à l'emploi de do,while, if, for, foreach, et Compareto ?

  22. #21
    invite4492c379

    Re : C# : affichage du nombre de caractères d'une matrice char ?

    alors arriverais-tu à faire qqch comme ça :

    si tu arrives à écrire une fonction ChaineContient(String chaine, char c) qui renvoie un booléen. Cette fonction renvoie true si c est dans chaine, false sinon.


    Code:
    chaine="bonjour"
    utilise = ""
    pour tout les caractères c dans chaine
      si (ChaineContient(utilise,c))
        // le caractère a déjà été traité
      sinon
        utilise=utilise+c
        // on fait ce qu'il faut avec c et matrice ...
      fin si
    fin pour
    juste entre toi et moi ... ton TP devient une usine à gaz ...

  23. #22
    chess_yuss

    Re : C# : affichage du nombre de caractères d'une matrice char ?

    Haha, j'ai encore 2 autres programmes à faire dans mon TP en plus de celui-ci :P Tu viens de me faire découvrir qu'on pouvait utiliser foreach sur un string, ça j'en avais aucune idée.
    Je vais bosser sur ce que tu viens de me donner.

  24. #23
    invite4492c379

    Re : C# : affichage du nombre de caractères d'une matrice char ?

    Citation Envoyé par chess_yuss Voir le message
    Haha, j'ai encore 2 autres programmes à faire dans mon TP en plus de celui-ci :P Tu viens de me faire découvrir qu'on pouvait utiliser foreach sur un string, ça j'en avais aucune idée.
    Je vais bosser sur ce que tu viens de me donner.
    Bon courage

    foreach est applicable à toute structure qui implémente l'interface IEnumerable (en gros).

Discussions similaires

  1. Rang d'une matrice=nombre de valeurs propres non nulles?
    Par invite648e0858 dans le forum Mathématiques du supérieur
    Réponses: 6
    Dernier message: 05/04/2017, 13h34
  2. Conception d’un circuit pour affichage de caractères sur un écran VGA
    Par invite3175c4e9 dans le forum Électronique
    Réponses: 12
    Dernier message: 20/12/2008, 18h43
  3. C : Pointeurs, chaines de caractères et affichage
    Par invitef1d0ad93 dans le forum Logiciel - Software - Open Source
    Réponses: 3
    Dernier message: 14/08/2008, 10h24
  4. affichage de caractères spéciaux
    Par invite97642ab3 dans le forum Logiciel - Software - Open Source
    Réponses: 2
    Dernier message: 27/05/2007, 17h41
  5. [Moniteur lcd]Probleme affichage caractéres en DVI...
    Par invite58238e9a dans le forum Matériel - Hardware
    Réponses: 0
    Dernier message: 03/07/2006, 15h54