Probleme au niveau de la condition

Fermé
DebutantEnProgrammation - 11 janv. 2023 à 03:50
Whismeril Messages postés 19041 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 mai 2024 - 12 janv. 2023 à 08:25

Bonjour,

Je sèche sur un problème, c'est-à-dire que lorsque je saisis un chiffre entre 1 et 2 cela fonctionne, mais lorsque je mets un chiffre puis une lettre majuscule, je veux que le programme m'indique "erreur sexe" mais au lieu de ça m'indique :

Exception non gérée : System.FormatException: Le format de la chaîne d'entrée est incorrect.
   à System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
   à System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info)
   à System.Convert.ToInt32(String value)

Voila le programme : 
 

string sexe;
int sexe1, nb, nb2;

Console.WriteLine("fille(1), garçon (2)");
sexe = Console.ReadLine();
nb = nbLettresMajuscules(sexe);
sexe1 = Convert.ToInt32(sexe);


if (nb > 0 || sexe1 < 0 || sexe1 > 21)
{
    Console.WriteLine("erreur sexe !");
}
else
{
    Console.WriteLine("on va creer votre carte");
}

Merci beaucoup pour votre aide.
Windows / Chrome 108.0.0.0

2 réponses

barnabe0057 Messages postés 14440 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 19 avril 2024 4 909
Modifié le 11 janv. 2023 à 05:57

Bonjour,

Tu lèves une exception car tu n'as pas vérifié le contenu de la saisie de l'utilisateur.

Donc quand l'utilisateur saisit une chaîne de caractères qui est un chiffre tu arrives à le convertir mais s'il y a un caractère ton programme plante car tu n'as pas anticipé ce scénario.

Tu peux utiliser la méthode TryParse pour vérifier que la saisie est bien un entier :

Console.WriteLine("fille(1), garçon (2)");
string saisie = Console.ReadLine();

bool conversion = int.TryParse(saisie, out int sexe);

if (!conversion)
{
    Console.WriteLine("erreur sexe !");
    System.Environment.Exit(1);
}

if (sexe < 1 || sexe > 2)
{
    Console.WriteLine("erreur sexe !");
    System.Environment.Exit(1);
}

Console.WriteLine("on va creer votre carte");


1
Whismeril Messages postés 19041 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 mai 2024 912
11 janv. 2023 à 08:48

Bonjour 

pour être rigoureusement exact, int.TryParse essaye de convertir une string en nombre entier.

Cette fonction retourne vrai si elle y est arrivée et rempli la variable en paramètre "out".

Dans le cas contraire, elle retourne faux et le paramètre "out" vaut 0.

Ce qui est bien pratique car en une ligne on voit si la conversion est possible et on obtient son résultat.

Mais dans le cadre de cet exercice, on aurait pu faire autrement.

Option 1 vérifier les caractères, puisqu'on attends seulement "1" ou "2", on peut faire

sexe = Console.ReadLine();


if (sexe == "1" || sexe == "2")
{
    sexe1 = Convert.ToInt32(sexe);
    
    Console.WriteLine("on va creer votre carte");
 
}
else
{
    Console.WriteLine("erreur sexe !");
}

Option 1.1, on peut même se dire que Convert est une opération "lourde" (idem pour TryParse) et affecter directement la bonne valeur 

sexe = Console.ReadLine();


if (sexe == "1")
{
    sexe1 = 1;
    
    Console.WriteLine("on va creer votre carte");
 
}
else if(sexe == "2")
{
    sexe1 = 2;
    
    Console.WriteLine("on va creer votre carte");
 
}
else
{
    Console.WriteLine("erreur sexe !");
}

On peut faire la même chose avec un switch à la place de if, else if, else

Option 2, tu vérifies que chaque caractère de la chaîne représente un chiffre.

bool erreur = false;

foreach(char c in sexe)
        if(!char.IsNumeric(c))
        {
            erreur = true;
            break;
         }

if (erreur)
    Console.WriteLine("Erreur de sexe!");
else
{
    //etc...
}
1
DebutantEnProgrammation > Whismeril Messages postés 19041 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 mai 2024
Modifié le 12 janv. 2023 à 02:39

Bonjour

› Whismeril

Merci beaucoup pour toutes les solutions apportées à mon problème, je vais regarder avec attention les trois solutions apporter pour comprendre la logique que tu as utilisée pour écrire ce programme merci beaucoup. 

Par compte, je n'ai pas compris l'option 2 pouvez vous me le reexpliquer ?  

Merci infiniment , soyez béni !

1
DebutantEnProgrammation
12 janv. 2023 à 02:38

Bonjour, 

› barnabe0057

Merci beaucoup pour votre aide, je vous avoue ne pas avoir encore appris le foreach, car je débute en programmation. Cela m'évoque la boucle for. Il faut que prenne le temps de relire vos lignes de code pour que je puisse comprendre la logique derrière.

Merci infiniment , soyez béni !

1
Whismeril Messages postés 19041 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 mai 2024 912
12 janv. 2023 à 08:25

Bonjour 


Barnabé n'a pas utilisé foreach, c'est moi.

foreach, prend chaque élément d'une collection tour à tour. Une string, en français "chaine de caractères" est avant tout une collection de caractères.

Donc l'idée de l'option 2 est de regarder chaque caractère (à supposer que tu puisses avoir des nombres à plusieurs chiffres) et de vérifier individuellement que c'est un chiffre.


1