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

JavaScript Discussion :

Je ne comprends pas pourquoi cela réagit comme ça.


Sujet :

JavaScript

  1. #1
    Futur Membre du Club
    Homme Profil pro
    .
    Inscrit en
    Décembre 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : .
    Secteur : Alimentation

    Informations forums :
    Inscription : Décembre 2014
    Messages : 20
    Points : 9
    Points
    9
    Par défaut Je ne comprends pas pourquoi cela réagit comme ça.
    Bonjour,
    J'apprends le langage JavaScript depuis voilà 5 jours , et j'essaie de manier les chaines de caractères. J'ai créer une fonction qui indique les infos sur un mot :
    Seulement il y a une entrée dans un else qui ne devrait pas se faire.
    Si vous pouviez m'expliquez de quoi il en ressort et pourquoi Merci d'avance.
    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
     
    function menu()
    {
        var mot = String(prompt("Mot : "));
        if (estPalindrome(mot)) 
        {
         console.log(mot + " est un palindrome !");
        } 
        else 
        {
         console.log(mot + " n'est pas palindrome !");
        }  
     
        console.log( mot + " à l'envers donne " + motRenverser(mot) +" !\n");
        console.log("Voici les infos sur les caractères du mot:\n\n");
        infoCaractere(mot);
     
    }
     
    function motRenverser(mot)
    {
        var longueurMot = mot.length - 1;
        var motRenverser = '';
        for( var i= 0; i <= longueurMot; i++)
        {
            motRenverser += mot[longueurMot-i];
        }
        return motRenverser;
    }
     
    function estPalindrome(mot)
    {
        if(motRenverser(mot) === mot)
        {
         return true;
        }
     
        return false;//sinon
    }
     
    function infoCaractere(mot)
    {
        var tabVoyelles= "aeiouy";
        console.log("\nDans le mot " + mot +" :\n");
     
        for(var iMot= 0; iMot < mot.length; iMot++) // DANS la variable Mot POUR chaque lettre FAIRE :
        {
            var estPotentielChiffre= true; // On considère que la lettre en cours est une chiffre
            var carEnCours= mot[iMot]; // pour plus de clarté
     
            for( var iVoyelle= 0; iVoyelle < tabVoyelles.length; iVoyelle++) // DANS tableauVoyelles POUR chaque voyelles FAIRE :
            {
                if( carEnCours.toLowerCase() === tabVoyelles[iVoyelle] ) // SI lettre du mot est une voyelles ( contenue dans tableauVoyelles) FAIRE :
                {
                    console.log("\nLa lettre " + carEnCours + " est une voyelle."); // AFFICHER VOYELLES
                    estPotentielChiffre = false; // Plus besoin de vérifier si c'est un chiffre.
                }
            }
            if(estPotentielChiffre && estUnChiffre(carEnCours) )//SI VAR estPotentielChiffre vaut true et que sa vérification conclu que c'est un chiffre 
            {  
              console.log("Le caractère " + carEnCours + " est un chiffre."); //AFFICHER CHIFFRE !  
            }
            else //sinon
            {
             console.log("\nLa lettre " + carEnCours + " est une consonne ou un signe de ponctuation."); 
            }
        }
    }
     
    function estUnChiffre( caractere )
    {
        for (var chiffre = 0; chiffre <= 9; chiffre++)
        {
            if (Number(caractere) === chiffre)
            {
                return true;
            }
        } 
        return false;
    }
     
     
    menu();
    Le problème rencontré :
    Nom : problemejsAsuppr.png
Affichages : 195
Taille : 13,2 Ko
    Fichiers attachés Fichiers attachés

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Merci de mettre directement le code dans le contenu du message.

  3. #3
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 873
    Points : 3 717
    Points
    3 717
    Par défaut
    Salut,

    Tu te débrouilles bien pour seulement 5 jours de formation, en si peu de temps je ne crois pas que j'en savais autant que toi...
    Citation Envoyé par inf.ormatique Voir le message
    Seulement il y a une entrée dans un else qui ne devrait pas se faire.
    Si c'est normale j’essaie d'expliquer pourquoi, voila la fonction :

    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
    function infoCaractere(mot)
    {
        var tabVoyelles= "aeiouy";
        console.log("\nDans le mot " + mot +" :\n");
     
        for(var iMot= 0; iMot < mot.length; iMot++) // DANS la variable Mot POUR chaque lettre FAIRE :
        {
            var estPotentielChiffre= true; // On considère que la lettre en cours est une chiffre
            var carEnCours= mot[iMot]; // pour plus de clarté
     
            for( var iVoyelle= 0; iVoyelle < tabVoyelles.length; iVoyelle++) // DANS tableauVoyelles POUR chaque voyelles FAIRE :
            {
                if( carEnCours.toLowerCase() === tabVoyelles[iVoyelle] ) // SI lettre du mot est une voyelles ( contenue dans tableauVoyelles) FAIRE :
                {
                    console.log("\nLa lettre " + carEnCours + " est une voyelle."); // AFFICHER VOYELLES
                    estPotentielChiffre = false; // Plus besoin de vérifier si c'est un chiffre.
                }
            }
            if(estPotentielChiffre && estUnChiffre(carEnCours) )//SI VAR estPotentielChiffre vaut true et que sa vérification conclu que c'est un chiffre 
            {  
              console.log("Le caractère " + carEnCours + " est un chiffre."); //AFFICHER CHIFFRE !  
            }
            else //sinon
            {
             console.log("\nLa lettre " + carEnCours + " est une consonne ou un signe de ponctuation."); 
            }
        }
    }
    Le if dans la deuxième boucle for n'a rien à voir avec le else, ce else est lié au if suivant : if(estPotentielChiffre && estUnChiffre(carEnCours) ) et par conséquent ce else est exécuté chaque fois que le caractère n'est pas un chiffre, donc quand le caractère est une voyelle il sera exécuté (chose que tu veux éviter justement)...

    Pour résoudre le problème d'une manière générale il faut passer au caractère suivant dés que le caractère courant est identifié et passer au caractère suivant cela signifie dans ton code passer à la boucle suivante du premier for. Tu peux faire cela en utilisant l'instruction continue, voici un exemple :

    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
    function infoCaractere(mot)
    {
      var tabVoyelles= "aeiouy";
      console.log("\nDans le mot " + mot +" :\n");
     
      for(var iMot= 0; iMot < mot.length; iMot++) // DANS la variable Mot POUR chaque lettre FAIRE :
      {
        var estPotentielChiffre= true; // On considère que la lettre en cours est une chiffre
        var estVoyelle = false ;
        var carEnCours= mot[iMot]; // pour plus de clarté
     
        for( var iVoyelle= 0; iVoyelle < tabVoyelles.length; iVoyelle++) // DANS tableauVoyelles POUR chaque voyelles FAIRE :
        {
          if( carEnCours.toLowerCase() === tabVoyelles[iVoyelle] ) // SI lettre du mot est une voyelles ( contenue dans tableauVoyelles) FAIRE :
          {
            console.log("\nLa lettre " + carEnCours + " est une voyelle."); // AFFICHER VOYELLES
            estPotentielChiffre = false; // Plus besoin de vérifier si c'est un chiffre.
            estVoyelle = true ;
            break ; // non obligatoire mais permet d'éviter des tests inutiles...
          }
        }
        if (estVoyelle) continue ;// Passe directement au caractère suivant, plus la peine de faire les autres tests
     
        if(estPotentielChiffre && estUnChiffre(carEnCours) )//SI VAR estPotentielChiffre vaut true et que sa vérification conclu que c'est un chiffre 
        {  
          console.log("Le caractère " + carEnCours + " est un chiffre."); //AFFICHER CHIFFRE !  
        }
        else //sinon
        {
          console.log("\nLa lettre " + carEnCours + " est une consonne ou un signe de ponctuation."); 
        }
      }
    }
    J'ai ajouté une variable estVoyelle je la met à false au début et à true si le caractère est une voyelle ensuite je teste : if (estVoyelle) continue ;. J'ai aussi ajouter un break (non obligatoire mais permet d'éviter des tests inutiles)Tu peux utiliser le même principe pour le test chiffre et ne pas d’embêter avec la variable estPotentielChiffre surtout que tu as écrit une fonction estUnChiffre.

    Tu peux simplement faire ça :
    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
    function infoCaractere(mot)
    {
      var tabVoyelles= "aeiouy";
      console.log("\nDans le mot " + mot +" :\n");
     
      for(var iMot= 0; iMot < mot.length; iMot++) // DANS la variable Mot POUR chaque lettre FAIRE :
      {
        var estVoyelle = false ;
        var carEnCours= mot[iMot]; // pour plus de clarté
     
        for( var iVoyelle= 0; iVoyelle < tabVoyelles.length; iVoyelle++) // DANS tableauVoyelles POUR chaque voyelles FAIRE :
        {
          if( carEnCours.toLowerCase() === tabVoyelles[iVoyelle] ) // SI lettre du mot est une voyelles ( contenue dans tableauVoyelles) FAIRE :
          {
            console.log("\nLa lettre " + carEnCours + " est une voyelle."); // AFFICHER VOYELLES        
            estVoyelle = true ;
            break ; // non obligatoire mais permet d'éviter des tests inutiles
          }
        }
        if (estVoyelle) continue ; // Passe directement au caractère suivant, plus la peine de faire les autres tests
     
        if(estUnChiffre(carEnCours))
        {  
          console.log("Le caractère " + carEnCours + " est un chiffre."); //AFFICHER CHIFFRE !  
          continue ; // Passe directement au caractère suivant, n’exécute pas la suite ci-dessous...
        }
     
        // tous les autres cas ici :
        console.log("\nLa lettre " + carEnCours + " est une consonne ou un signe de ponctuation."); 
     
      }
    }
    Tu peux tester ici : http://jsbin.com/zozilomivu/edit?js,console

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    quand tu commenceras à étudier les regex JavaScript, tu pourras simplifier ton code.

    ex. : http://codepen.io/jreaux62/pen/WGPNww
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <input id="txt" onChange="checkTxt(this.value);" />
    <div id="result"></div>
    Code JavaScript : 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
    function checkTxt(txt) {
      txtL = txt.length;
      var result = document.getElementById('result'); // pour affichage sur la page
          result.innerHTML = ''; // on vide
      if (txtL > 0) {
        for (var i = 0; i < txtL; i++) // pour chaque caractère du mot
        {
          var res;
          if (is_voyelle(txt[i])) {
            res = txt[i] + ' est une voyelle';
          } else if (is_consonne(txt[i])) {
            res = txt[i] + ' est une consonne';
          } else if (is_digit(txt[i])) {
            res = txt[i] + ' est un chiffre';
          } else if (is_ponctuation(txt[i])) {
            res = txt[i] + ' est un caractère de ponctuation';
          } else if (is_espace(txt[i])) {
            res = txt[i] + ' est un espace';
          } else {
            res = txt[i] + ' est un caractère autre';
          }
          // affichage
          console.log( res ); // pour affichage dans la console
          result.innerHTML += res + '<br/>'; // pour affichage sur la page
        }
      }
    }
    Code JavaScript : 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
    function is_voyelle(lettre) {
      return (/[aeiouyâäàéèêëîïôöùûü]/i.test(lettre));
    }
     
    function is_consonne(lettre) {
      return (/[a-z^aeiouyâäàéèêëîïôöùûü]/i.test(lettre));
    }
     
    function is_digit(lettre) {
      return (/[0-9]/.test(lettre));
    }
     
    function is_ponctuation(lettre) {
      return (/[!"#$%&'()*+,./:;<=>?@[\]^_`{|}~-]/.test(lettre));
    }
     
    function is_espace(lettre) {
      return (/\s/.test(lettre));
    }
    Dernière modification par Invité ; 22/10/2016 à 18h43.

  5. #5
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 873
    Points : 3 717
    Points
    3 717
    Par défaut
    Merci. Oui avec les regex et des if else if c'est plus lisible...

    PS : Je ne savais pas qu'on pouvait écrire : var carEnCours= mot[iMot];...

    J'aurais utilisé : str.charAt(index)

  6. #6
    Futur Membre du Club
    Homme Profil pro
    .
    Inscrit en
    Décembre 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : .
    Secteur : Alimentation

    Informations forums :
    Inscription : Décembre 2014
    Messages : 20
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par Beginner. Voir le message
    Merci. Oui avec les regex et des if else if c'est plus lisible...

    PS : Je ne savais pas qu'on pouvait écrire : var carEnCours= mot[iMot];...

    J'aurais utilisé : str.charAt(index)
    L'utilisation des crochets est souvent attribué au tableau, mais l'on dit que les chaine de caractère sont des tableau de caractères du moins en langage C ( dont j'ai des petites bases). Mais ta méthode est semble t'il plus conventionnelle.

    J'ai plein de question sur le JavaScript qui feront l'objet d'autre post. En attendant, j'ai compris pourquoi mon code affichait tout ça et je prend note de tes conseils.

    Pour le regex, je ne connaissais pas, je vais étudier ça. Je voulais savoir dans la correction proposé, le fait d'utiliser continue ou break n'était pas le produit d'un code mal construit, est-ce sale d'utiliser ses mots-clé à tout va ?

  7. #7
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 873
    Points : 3 717
    Points
    3 717
    Par défaut
    Citation Envoyé par inf.ormatique Voir le message
    L'utilisation des crochets est souvent attribué au tableau, mais l'on dit que les chaine de caractère sont des tableau de caractères du moins en langage C ( dont j'ai des petites bases). Mais ta méthode est semble t'il plus conventionnelle.
    Oui, si mes souvenirs sont bons, en langage C je crois qu'on a pas le choix car le type string n'existe pas, on passe alors par un tableau se terminant par le caractère "null" ...

    Citation Envoyé par inf.ormatique Voir le message
    Je voulais savoir dans la correction proposé, le fait d'utiliser continue ou break n'était pas le produit d'un code mal construit, est-ce sale d'utiliser ses mots-clé à tout va ?
    Pour moi non ce n'est pas sale, ils sont utiles....

    C'est vrai qu'on peut utiliser des if else if... même sans les regex mais je ne pense pas que continue soit moins rapide.

  8. #8
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 873
    Points : 3 717
    Points
    3 717
    Par défaut
    Citation Envoyé par inf.ormatique Voir le message
    Pour le regex, je ne connaissais pas, je vais étudier ça.
    Il y a ça qui pourrait t'intéresser : http://javascript.developpez.com/tut...-rationnelles/

    Et puisque tu débutes il y a ça aussi qui pourrait t'intéresser :
    Mise en place d'une série d'exercices pour apprendre le JavaScript et Node.js

Discussions similaires

  1. Réponses: 1
    Dernier message: 22/05/2007, 12h51
  2. [debutant] - Simple script qui plante IE.. comprend pas pourquoi..
    Par ShinJava dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 16/08/2006, 23h06
  3. Réponses: 2
    Dernier message: 14/01/2006, 20h29
  4. Comprends pas pourquoi ca marche pas
    Par cellimo dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 08/11/2005, 22h10
  5. error LNK 2019... comprends pas pourquoi ?
    Par MonsieurAk dans le forum MFC
    Réponses: 2
    Dernier message: 29/04/2005, 15h06

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