Problème && ||

Résolu/Fermé
iamtheone Messages postés 39 Date d'inscription lundi 10 avril 2017 Statut Membre Dernière intervention 8 mai 2017 - 26 avril 2017 à 00:03
iamtheone Messages postés 39 Date d'inscription lundi 10 avril 2017 Statut Membre Dernière intervention 8 mai 2017 - 26 avril 2017 à 21:59
Bonjour,
D'abord je tiens à préciser que je ne compte pas faire de typosquating, je fais ce code pour m'entraîner avec les string.
Voici mon conde Javascript :
result0 = [];
result1 = [];
ext = [".com", ".fr"]
qw = {
   a: "q",
   q: "a",
   z: "w"
}


function start() {
    dn = document.form.dn.value;
    dnl = dn.length;
    ta = document.getElementById("ta");
    if (dn=="") {
        alert("Please add a domain name.") 
    } else {
        result0 = [];
        result1 = [];
        ta.innerHTML = "";
        dble();
        if (dn.indexOf("m") == -1 && (dn.indexOf("a")>=0 || dn.indexOf("q")>=0 || dn.indexOf("z")>=0)) {
            qwerty();
        } 
        end();
        for (i=0; i<result0.length; i++) {
            ta.innerHTML += result0[i] + "<br />";
        }
    }
}

function dble() {
    for (i=0; i<dnl; i++) {
        result1[i] = dn.slice(0, i+1) + dn.charAt(i) + dn.slice(i+1);
    }
}

function end() {
    for (i=0, j=0, k=0; i<result1.length-0.001; i+=1/ext.length, j++, k++) {
        if (j==ext.length) {
            var j = 0;
        }
        result0[k] = result1[Math.floor(i)] + ext[j];
    }
}

function qwerty() {
    alert()
    var dnqw = dn;
    for (i=0; i<dnl; i++) {
        if (qw[dnqw[i]]) {
            var dnqw = dnqw.replace(dnqw[i], qw[dnqw[i]]);
        }
    }
    result1[dnl] = dnqw;
}

Et mon HTML :
<!DOCTYPE html>
<html>
    <head>
        <title>Page Title</title>
    </head>
    <body>
        
        <form name="form">
            <input type="text" name="dn" placeholder="google"></input>
            <input type="button" value="Start" onClick="start()"
        </form>
        
        <div id="ta"></div>
        
    </body>
</html>

Mon problème c'est que lorsque j'écris aq ou un mot avec ces deux lettres dans le input, il ressort (après click sur start) comme il a été entré. Par exemple aq donnera aq et non qa ou encore macaque donnera macaque et non mqcqaue... Je ne comprend pas :/. Sachant que avec az ou qz tout se passe bien.
Merci de votre aide.

2 réponses

jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
26 avril 2017 à 01:38
Bonjour,

J'ai un peu la flemme de décortiquer ton code ...;
par contre.. toi tu peux déjà ajouter un peu de débogage ( à l'aide de console.log .. ) dans ton code histoire d'essayer de comprendre ce qui ne "marche" pas.

Par exemple, avant ton if
 if (dn.indexOf("m") == -1 && (dn.indexOf("a")>=0 || dn.indexOf("q")>=0 || dn.indexOf("z")>=0))

tu pourrais faire des console.log de chaque bloc et voir ce que ça t'affiche :
 console.log('dn.indexOf(m) :' + dn.indexOf("m") );
 console.log('dn.indexOf(a) :' + dn.indexOf("a") );
 console.log('dn.indexOf(q) :' + dn.indexOf("q") );
 console.log('dn.indexOf(z) :' + dn.indexOf("z") );


au passage ... évites si possible les variables globales (sauf si vraiment nécessaire... ce qui n'est pas le cas ici ) et préfères utiliser le passage de paramètres et les return dans tes fonctions.

0
Bonjour

Le mot "macaque" ,n'est pas un bon exemple puisque tu n'appliques pas qwerty aux mots qui contiennent m.
Si on oublie ce détail, ton problème vient de l'accumulation de deux autres :
- La fonction String.replace que tu utilises dans qwerty ne modifie que la première occurence du caractère recherché.
- Tu fais tes substitutions les unes après les autres. Si on considère le mot acaque :
. il devient d'abord qcaque
. puis on trouve le deuxième a, il devient qcqque
. puis on trouve le q suivant et on remplace, mais c'est le premier q qui est remplacé : on obtient acqque

À ta place, dans qwerty, je recopierais la chaîne caractère par caractère en faisant la substitution quand je rencontre l'un des caractères à transformer.
0
iamtheone Messages postés 39 Date d'inscription lundi 10 avril 2017 Statut Membre Dernière intervention 8 mai 2017
26 avril 2017 à 14:48
Oui c'est pas un bon exemple :$. Sinon merci de ta réponse, mais je ne vois pas comment faire d'une autre manière... Help :'(
0
Utilisateur anonyme > iamtheone Messages postés 39 Date d'inscription lundi 10 avril 2017 Statut Membre Dernière intervention 8 mai 2017
26 avril 2017 à 18:48
Tu as lu mes deux dernières lignes ? Je ne peux pas croire qu'ayant écrit tout ça tu ne les comprends pas, C'est beaucoup plus simple que tout ce que tu as fait avant.
0
iamtheone Messages postés 39 Date d'inscription lundi 10 avril 2017 Statut Membre Dernière intervention 8 mai 2017
Modifié le 26 avril 2017 à 19:22
Je sais pas, ce matin je devais pas être bien réveillé... Bref, voilà le code fonctionnel :
function qwerty() {
    var dnqw = "";
    for (i=0; i<dnl; i++) {
        if (qw[dn.charAt(i)]) {
            dnqw += qw[dn.charAt(i)];
        } else {
            dnqw += dn.substring(i, i+1);
        }
    }
    result1.push(dnqw);
}

Merci de ton aide :))
0
Utilisateur anonyme > iamtheone Messages postés 39 Date d'inscription lundi 10 avril 2017 Statut Membre Dernière intervention 8 mai 2017
26 avril 2017 à 21:33
De rien :)
Pour le else, moi j'aurais simplement mis dnqw += dn.charAt(i);
J'aurais même sans doute utilisé l'opérateur ternaire :

var c= dn.charAt(i);
dnqw +=qw[c] ? qw[c] : c;
0
iamtheone Messages postés 39 Date d'inscription lundi 10 avril 2017 Statut Membre Dernière intervention 8 mai 2017 > Utilisateur anonyme
26 avril 2017 à 21:59
Ah oui c'est sûr que c'est hien plus compacte, merci. Mais pour le moment je vais en rester à l'écriture "détaillée" car je débute ;).
0