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 :

Rechercher un nombre


Sujet :

C#

  1. #1
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2014
    Messages : 21
    Par défaut Rechercher un nombre
    Bonjour tout le monde ,

    Je suis débutant et je développe un petit programme pour rechercher dans un texte ou dans une liste un mot ou un nombre.
    Voici une partie de ce programme qui demande à l'utilisateur d'entrer seulement, une chaine non vide et ne contenant que des caractères digitaux :

    Code C# : 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
    17
    18
    19
    20
    21
    22
    23
    24
                Console.WriteLine("Entrez un nombre à rechercher  : ");
                string Str = Console.ReadLine();
                try
                {
                    while (Str.Length == 0)
                    {
                        Console.WriteLine("Entrez, seulement,  une chaine non vide et ne contenant que des carateres digitaux :");
                        Str = Console.ReadLine();
                    }
                    for (int i = 0; i < Str.Length; i++)
                    {
                        while (Str.Length == 0 || char.IsDigit(Str, i) is false)
                        {
                            Console.WriteLine("Entrez, seulement,  une chaine non vide et ne contenant que des carateres digitaux :");                    
                            Str = Console.ReadLine();
                        }
                    }
                    Console.WriteLine("***************");
                    Console.WriteLine(Str);
                }
                catch(Exception Hyt)
                {
                    Console.WriteLine("Erreur " + "\n" + Hyt);
                }

    et je voudrais votre avis ,SVP, car il me parait un peu fragile
    Merci à vous tous

  2. #2
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 434
    Par défaut
    Bonjour,
    Tout d'abord, tu devrais mettre ton code entre les balises "code"(les # dans la barre d'icones), il serait bien plus lisible, surtout qu'il n'est pas indenté.
    Tel qu'il est écrit ton code ne peut pas fonctionner.
    Je ne vais pas te dire pourquoi, mais t'aider à trouver la raison :
    Pose un point d'arrêt sur le premier While, puis avance pas à pas en surveillant le contenu de tes variable (surtout le i de la boucle For, bien aml nommé soit dit en passant).
    Tu devrais rapidement voir ce qui ne va pas.

    Tatayo

  3. #3
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2014
    Messages : 21
    Par défaut
    Merci pour la réponse
    Ok je vais faire ce que vous avez demandé et je vous tiendrais au courant.
    Sincerement je ne sais pas comment utiliser ces balises on me l'a toujours conseillé mais j'ai pas pris le temps de savoir comment
    A+

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 545
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 545
    Par défaut
    Pour te mettre sur une piste un peu plus précise, il faut que tu revois tes boucles.
    tu as actuellement une boucle qui lit une ligne complète, puis une autre qui parcourt la chaine saisie (et tu redemandes une saisie de cette chaine en cas d'erreur tout en continuant ta 2nde boucle)
    Tu fais 2 choses qui s'entremêlent.

    Donc tu devrais soit lire ta donnée, l'analyser et si il y a une erreur, redemander la saisie et sortir si OK
    Soit lire les caractères l'un après l'autre et signaler l'erreur à l'acquisition (et à toi de voir pour construire la chaine finale soit avec tous les bons caractères même si il y eu des erreurs entre temps, soit la valeur saisie quand il n'y a pas eu d'erreur.

  5. #5
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 972
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 972
    Par défaut
    Je rajouterai que la ligne while (Str.Length == 0 || char.IsDigit(Str, i) is false) ligne 12 est incohérente avec le reste.
    En effet, la boucle for (ligne 10) possède la condition i < Str.Length, ce qui rend le test sur Str.Length == 0 (ligne 12) inutile.
    Et la formule char.IsDigit(Str, i) is false bien que syntaxiquement correcte est inutilement compliquée.

    Au final, tu as trois boucles, là où tu n'en n'a besoin que d'une seule.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int n = 0;
    string s = "";
     
    while (!int.TryParse(s, out n))
    {
        Console.Write("Entrez une chaine non vide ne contenant que des carateres digitaux : ");
        s = Console.ReadLine() ?? string.Empty;
    }

  6. #6
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 063
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 063
    Par défaut
    Hello,

    Je ne suis pas d'avis de proposer du code pour ce type de problématique très incomplet.
    Les cas d'utilisation sont beaucoup trop larges, et il faut les préciser (quel type de texte, quels sont cas particuliers, ...).

    Un "mot" peut être défini comme une séquence de caractères alphanumériques, potentiellement incluant des traits d'union (par exemple, "avant-garde") ou d'autres caractères spécifiques selon les besoins. Un "nombre" peut faire référence à une valeur entière (par exemple, 123), décimale (par exemple, 3.14159), ou même à des représentations textuelles de nombres qui pourraient inclure un formatage culturel (par exemple, "1,234.56" en format américain ou "1 234,56" en format français).
    La nature même de ces définitions introduit une ambiguïté qui nécessite une diversification des scénarios de test.

    Par exemple, la chaîne "C#" doit-elle être traitée comme un seul mot ou deux? La chaîne "item25" contient-elle le mot "item" et le nombre 25, ou est-ce un identifiant unique? Si l'on recherche le nombre 1000 dans un texte, la chaîne "1.000" (format français pour mille) doit-elle correspondre si le terme de recherche est l'entier 1000?

    Bref vous avez bien compris qu'ici la difficulté n'est pas le code à développer, mais bien la pose du problème, qui n'est absolument pas clair et surtout précis.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  7. #7
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 972
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 972
    Par défaut
    fred1599, je suis d'accord avec toi sur le principe.
    Mais là, l'auteur boucle et teste si chaque caractère est un digit avec char.IsDigit(Str, i).
    Cela suffit à déduire que la valeur est sensée être un entier sans formatage (au moins dans la partie qu'il a montré).

    Si cela ne cela ne convient pas, l'auteur pourra toujours apporter des précisions par la suite.
    En attendant, je fais avec ce qui a été fourni.

  8. #8
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 063
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 063
    Par défaut
    Hello @popo,

    Je suis d'accord avec toi, tu as cette vision et je l'ai aussi, le problème n'est pas "vraiment" là,

    Il est débutant en programmation, et ma vision était plutôt de lui apprendre à poser un problème précisément, car il se pourrait qu'après tests, il souhaite des particularités, où tu connais bien le métier, on va y ajouter des rustines à l'existant, alors qu'un problème posé précisément pourrait amener à des solutions bien plus adaptées.

    L'intérêt est la programmation, plus que le langage lui même, surtout qu'en C# je vous laisse gérer cela bien mieux que moi...

    Quand tu dis l'auteur boucle ... n'est pas un motif suffisamment valable (en terme de confiance sur ce que veut l'auteur) pour indiquer ce qu'il souhaite faire derrière ce code, car il est débutant aussi dans la programmation, pas qu'en C#, en tant que développeur, il nous arrive souvent de l'oublier.
    Je voulais l'amener à cette réflexion... Un problème bien posé est un résultat précis et sans bavure.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

Discussions similaires

  1. Recherche de nombres dans des listes
    Par jkofr dans le forum Statistiques, Data Mining et Data Science
    Réponses: 12
    Dernier message: 09/01/2008, 11h02
  2. [XSLT] recherche du nombre le plus petit
    Par ribrok dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 04/12/2006, 11h28
  3. Rechercher un nombre dans une EditBox
    Par The Lord of Nesquik dans le forum C++
    Réponses: 2
    Dernier message: 31/05/2006, 21h24
  4. Recherche le nombre de mots dans un fichier
    Par peppena dans le forum Linux
    Réponses: 2
    Dernier message: 19/04/2006, 10h46
  5. recherche du nombre d'occurences dans une table
    Par berry dans le forum Requêtes
    Réponses: 3
    Dernier message: 09/01/2004, 20h03

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