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 :

[Débutant] Histoires de Char


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    192
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 192
    Par défaut [Débutant] Histoires de Char
    Re-Salut. Vous croyiez que je vous avez déjà assez emmerder pour la semaine ? ben non. désolé

    Entre moi et les Char, sa passe pas. mais cette fois ci, le probleme est bizarre.

    Le but de l'exo est de faire un convertisseur de chiffres Romains.
    Pas de proposition, donc je me lance avec mon approche simpliste que j'ai nommé approche humaine .


    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    using System;
    namespace exos
    {
        class exo2
        {
            public static void Main(string[] args)
            {
                string input = Console.ReadLine();
                char[] tabNonC = input.ToCharArray();
               // Pour Tester ! foreach (int z in tabNonC) Console.WriteLine(z);
                int[] tabConv = new int[tabNonC.Length];
     
                //Conversion :
                foreach (int l in tabNonC)
                {
                    int i = 0;
                    switch (l)
                    {
                        case 'm': tabConv[l] = 1000;
                            break;
                        case 'd': tabConv[l] = 500;
                            break;
                        case 'c': tabConv[i] = 100;
                            break;
                        case 'l': tabConv[l] = 50;
                            break;
                        case 'x': tabConv[l] = 10;
                            break;
                        case 'v': tabConv[l] = 5;
                            break;
                        case 'i': tabConv[l] = 1;
                            break;
                        default: Console.WriteLine("La " + (l + 1) + " Lettre saisie n'est pas un chiffre romain");
                            break;
                    }
                    i++;
                }
                int sum = 0,n;
                for (n = 0; n < tabConv.Length; n++)
                {
                    if ((tabConv[n] < tabConv[n + 1]) & (n + 1 < tabConv.Length) | (n + 1 == tabConv.Length))
                        sum += tabConv[n];
                    else sum -= tabConv[n];
                }
     
                Console.WriteLine(input + "=" + sum);
                Console.ReadLine();
     
            }
        }
    }
    Seulement voila, lors du Deboumgage j'ai eu droit a un gros exception non handled en bleu qui a fait ramait mon PC un bon bout de temps.
    en cherchant dans les valeurs, j'ai remarqué que la valeur de la variable l au début était 120 lorsque input = "X" par exemple.
    je ne sais pas d'où viens ce nombre, même si je pense que c'est un num ASCII ou quelque chose qui a un rapport avec le clavier.
    Pourtant,mon tableau TabNonC(onverted) est bel et bien un tableau de char
    alors pourquoi y'a t'il des numéros dedans?

  2. #2
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Déjà dans ton code tu fais un foreach sur un tableau de caractères en indiquant que chaque élément est un entier. La conversion char vers int (ainsi que long, double, ...) étant implicite le compilateur ne dit rien.

    Ce n'est pas l'origine du problème mais néanmoins, modifie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    foreach (int l in tabNonC)
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    foreach (char l in tabNonC)
    pour plus de logique.

    Tu devrais aussi tenir compte de la casse si possible. 'X' et 'x' sont 2 caractères différents, mais la signification reste la même pour des chiffres romains.

    Sinon le problème vient de chaque case. Par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    case 'm': tabConv[l] = 1000;
    tu utilises l comme index alors que c'est i que tu dois utiliser. Résultat tu as une exception car l'index n'est pas valide.

  3. #3
    Membre éclairé Avatar de Monstros Velu
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 619
    Par défaut
    Vu que tu as besoin d'incrémenter ton indexeur, tu devrais même utiliser une boucle "for" qui fera l'incrémentation. De 0 à lenght-1...

    Et tu peux même faire la somme au fur et à mesure, dans la même boucle que la transformation.

  4. #4
    Membre émérite Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Par défaut
    J'ajouterai que les opérateur de comparaison ne sont pas les bon. Tu fait des & et | binaires et non des logiques (&&, ||).
    De plus, tu test (n + 1 < tabConv.Length) après avoir testé (tabConv[n] < tabConv[n + 1]), ce devrait être l'inverse car tabConv[n+1] peut être non valide et donc plantage sur la première condition que tu utilises.
    Enfin, l'initialisation de i est très mal placé, à chaque itération tu fait "i = 0", tu convertie une lettre en nombre, puis tu fait "i++", sauf qu'au tour d'après tu remet i à 0. Donc seul la première case de ton tabConv est initialisée et elle contiendra la valeur de la dernière conversion faire.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    192
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 192
    Par défaut
    j'ai tout réparer, même si c'a m'a pris beaucoup de temps.
    j'ai fais le diviser pour régner. J'ai séparer les conditions en niveau.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (condition1) //Niveau 1
    if (condition2 && condition3) //Niveau 2
    faut avouer que le debug de VS est très noob proof ! ça nous aide.
    Sinon pourriez vous me liez a d'autres exo en C#?
    ou peut - être devrais je passez a la POO?

Discussions similaires

  1. Réponses: 11
    Dernier message: 31/12/2013, 19h23
  2. [Débutant] Ajouter un char* à un char[][]
    Par bumbolol dans le forum D
    Réponses: 1
    Dernier message: 06/06/2010, 18h42
  3. histoire de char
    Par untipy dans le forum C
    Réponses: 3
    Dernier message: 03/08/2007, 14h47
  4. Réponses: 6
    Dernier message: 06/12/2005, 09h41
  5. Réponses: 3
    Dernier message: 26/05/2004, 23h03

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