Partage
  • Partager sur Facebook
  • Partager sur Twitter

Début en js, rien qui se lance

Sujet résolu
    15 octobre 2021 à 16:30:28

    Bonjour, je viens de faire mes débuts en js, et pour ce faire j'ai voulu lancer un petit algo qui place un numéro sur une ligne et colonne et il ne faut pas de doublon sur la ligne ou la colonne, problème rien ne se lance. pouvez vous svp m'expliquez pourquoi? Merci
    (j'me suis beaucoup inspiré du C)
    let tab = [4][4];
    
    function put_zero()
    {
    	for (var i = 0; i < 16; i++)
        {
        	tab[i / 4][i % 4] = 0;
        }
    }
    
    function is_here(x, y, value)
    {
        for (var i = 0; i < 4; i++)
        {
            if ((tab[x][i] == value && i != y) ||
                    ((tab[i][y] == value) && i != x))
                return (1);
        }
        return (0);
    }
    
    function is_complete()
    {
        for (var i = 0; i < 16; i++)
        {
            a = i / 4;
            b = i % 4;
            if (tab[a][b] == 0)
                return (0);
            if (is_here(a, b, tab[a][b]))
                return (0);
        }
        return (1);
    }
    
    function solve(index)
    {
        var a = index / 4, b = index % 4;
    
        for (var i = 4; i >= 1; i--)
        {
            if (is_complete() == 1)
                return (1);
            if (tab[a][b] == 0)
                tab[a][b] = i;
            if (is_here(a, b, i) == 1)
                tab[a][b] = 0;
            else
                solve(tab, index + 1);
        }
        return (0);
    }
    
    function print_tab()
    {
        document.write(tab);
    }
    
    function begin(){
    	solve(0);
        print_tab();
    }
    
    function tst(){
    	put_zero();
    	document.write("sd");
    }
    
    function myFunction() {
      var btn = document.createElement("BUTTON");
      btn.innerHTML = "CLICK ME";
      btn.onclick = begin();
      document.body.appendChild(btn);
    }
    • Partager sur Facebook
    • Partager sur Twitter
      15 octobre 2021 à 17:23:09

      Première chose que tu peux essayer, c'est commencer ton script par :

      console.log('script chargé');

      et vérifier dans la console des outils de développement que le message apparaît bien. Si il n'apparaît pas, c'est que ton fichier de script n'est pas lié à ta page HTML, souvent une erreur d'adresse du script.

      Deuxième chose, let tab = [4][4], ça ne me parle pas du tout.
      let tab = [4] créerait un array ne contenant qu'un seul élément ayant pour valeur 4.
      [4][4] chercherait dans l'index 4 d'un array ne contenant qu'un seul élément.
      Bref, si tu veux un tableau de 4 lignes contenant 4 cases chacune, ça va être un poil plus compliqué. Après avoir fait joujou avec la console de développement, je ne suis pas arrivé à faire un array contenant plusieurs éléments indéfinis. Alors disons que tu veux mettre des zéros partout ( mais tu peux aussi mettre false, ou null ).

      Voilà comment je procéderais :

      let tab = [[null, null, null, null], [null, null, null, null], [null, null, null, null], [null, null, null, null]];

      nous avons bien un array composé de 4 éléments, chacun de ces éléments étant lui-même un array composé de 4 éléments.
      De là, tu peux appeler une "case" de ton tableau en enchaînant les index, par exemple pour avoir la troisième case de la deuxième ligne :

      console.log(tab[2][3]);

      Et enfin troisième chose, dans ton script je vois une initialisation de variable ( bien que celle-ci ne soit pas correcte ) et des fonctions.

      Mais aucune instruction ? o_O
      Dans ce cas il est normal que rien ne se passe ;)
      A mon humble avis, tout ce qui se situe dans le corps de myFunction() ne devrait justement pas être dans une fonction. ou à la limite, tu dois finir ton script par l'appel à cette fonction :

      myFunction();

      Et là tu devrait au moins voir ton bouton apparaître sur la page, et quand tu cliques dessus ça devrait lancer la fonction begin().



      • Partager sur Facebook
      • Partager sur Twitter
        15 octobre 2021 à 18:00:28

        Merci pour ton message @LucasWerquin

        Alors, j'ai bien compris ce que tu m'as dit et je te remercie, je comprend maintenant que c'est totalement différent du C les tableaux mais là de cette façon comment cela ne peut ne pas fonctionner ?

        voici comment je fais du côté HTML:

        <!DOCTYPE html>
        <html>
        <body>
        
        <p>Click the button to make a BUTTON element with text.</p>
        
        <button onclick="myFunction()">Try it</button>
        
        
        </body>
        </html>
        
        <script>

        Mais j'ai remarqué que dans la fonction put_zero, si je remplace les indices dynamique par 0, cela fonctionne, mais pourquoi ?? i / 4 et i % 4 posent problème ?? Ok mais pourquoi (ici j'essaie avec tst())

        EDIT: Il y a un problème je ne peux pas héberger le code sans me prendre un "tentative du site bloqué(sql blabla)"

        let tab = [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
        
        function put_zero()
        {
        	for (var i = 0; i < 16; i++)
            {
            	tab[i / 4][i % 4] = 0;
            }
        }
        function is_here(x, y, value)
        {
            for (var i = 0; i < 4; i++)
            {
                if ((tab[x][i] == value && i != y) ||
                        ((tab[i][y] == value) && i != x))
                    return (1);
            }
            return (0);
        }
        function is_complete()
        {
            for (var i = 0; i < 16; i++)
            {
                a = i / 4;
                b = i % 4;
                if (tab[a][b] == 0)
                    return (0);
                if (is_here(a, b, tab[a][b]))
                    return (0);
            }
            return (1);
        }
        function solve(index)
        {
            var a = index / 4, b = index % 4;
        
            for (var i = 4; i >= 1; i--)
            {
                if (is_complete() == 1)
                    return (1);
                if (tab[a][b] == 0)
                    tab[a][b] = i;
                if (is_here(a, b, i) == 1)
                    tab[a][b] = 0;
                else
                    solve(tab, index + 1);
            }
            return (0);
        }
        function tst(){
        	put_zero();
        	document.write("function tst<br>");
        }

         et la fonction myFunction(), je m'excuse d'avance pour la séparation du code, mais sans ça il m'est impossible de valider mon message ... d'ailleurs il m'est impossible de ré écrire la fonction myFunction(), le site l'accepte pas..

        Sachez aussi, que tout le code est réuni sur une même page et le js est inséré avec la balise script

        Merci

        -
        Edité par AlexisW09 15 octobre 2021 à 18:10:04

        • Partager sur Facebook
        • Partager sur Twitter
          15 octobre 2021 à 19:07:19

          Alors, le forum openclassrooms tolère mal les attributs correspondant à des eventListeners ( onclick, onscroll, etc. ). Tu peux contourner cette sécurité en faisant une erreur volontaire ( ex : remplacer onclick par on-click ).

          Bon, je vois que l'appel à myFunction était bien réalisé, en fin de compte. Donc ton script doit bien démarrer.

          En ce qui concerne les index dynamiques, essaye de mettre i/4 et i%4 entre parenthèses :

          tab[(i/4)][i%4)] = 0;



          • Partager sur Facebook
          • Partager sur Twitter
            15 octobre 2021 à 21:51:30

            LucasWerquin a écrit:

            Alors, le forum openclassrooms tolère mal les attributs correspondant à des eventListeners ( onclick, onscroll, etc. ). Tu peux contourner cette sécurité en faisant une erreur volontaire ( ex : remplacer onclick par on-click ).

            Bon, je vois que l'appel à myFunction était bien réalisé, en fin de compte. Donc ton script doit bien démarrer.

            En ce qui concerne les index dynamiques, essaye de mettre i/4 et i%4 entre parenthèses :

            tab[(i/4)][i%4)] = 0;



            Merci pour l'astuce forum ;)

            Et non toujours pas : (

            • Partager sur Facebook
            • Partager sur Twitter
              17 octobre 2021 à 0:28:51

              Bonsoir, dans ta fonction solve les if successif sont des else if j'imagine non?

              ensuite ligne 14 de ta fonction solve tu fais un appel en lui envoyant tab et l'index hors qu'q la definition de ta fonction tu n'as qu'un parametre habitude du c j'imagine 

              Je n'ai pas reelement cherche a comprendre ce que devais faire les fonctions vous pouvez l'ecrire ? Sinon j'ai essayer de reecrire les fonctions que vous aviez affiche dans le precedent message au click du button on lance la fonction TsT. par contre je ne vois pas la fonction MyFunction dont vous parliez 

              <button id="BtnTest">Lance test</button>
              	<script>
              
              		var tab = [
              					[],[],[],[]
              				  ];
              		function PutZero()
              		{
              			for(let i = 0; i < 4; i++)
              				for(let i2 = 0; i2 < 4; i2++)
              					tab[i][i2] = 0;
              		}
              
              		function IsHere(x,y,value)
              		{
              			for (var i = 0; i < 4; i++)
              				if ( (tab[x][i] == value && i != y) || ((tab[i][y] == value) && i != x))
              					return 1;
              			return 0;
              		}
              
              		function IsComplete()
              		{
              			for(let i = 0; i < 4; i++)
              			{
              
              				for(let i2 = 0; i2 < 4; i2++)
              					if( (tab[i][i2] == 0) || IsHere(i,i2,tab[i][i2] ) )
              						return 0;
              
              				return 1;
              			}  
              		}
              
              		function solve(index)
              		{
              			let a = index / 4; //sachant que cette division peut donner des reels on est en js
              			let b = index % 4;
              
              			for(let i = 4; i > 0; i--)
              			{
              				if(IsComplete() == 1)
              					return 1;
              
              				if(tab[a][b] == 0 )
              					tab[a][b] = i;
              				
              				if(IsHere(a,b,i) == 1 )
              					tab[a][b] = 0;
              				else
              					solve(index + 1);
              			}
              		}
              
              		function Tst()
              		{
              			PutZero();
              			document.write(tab);
              		}
              
              		var BtnLanceTest = document.getElementById("BtnTest");
              
              		BtnLanceTest.onclick = function()
              		{
              			Tst();
              		};
              
              	</script>



              -
              Edité par zvheer 17 octobre 2021 à 6:35:29

              • Partager sur Facebook
              • Partager sur Twitter

              yasakani no magatama

                17 octobre 2021 à 2:44:27

                Merci votre aide m'a été précieuse ! J'ai compris pourquoi i / 4 ne fonctionnait pas c'est parce-que js n'a pas de type int du coup, obliger d'utiliser Math.floor pour avoir l'entier le plus proche.

                Maintenant ça fonctionne c'est nickel ;)

                <!DOCTYPE html>
                <html>
                    <body>
                        <p>Click the button to make a BUTTON element with text.</p>
                        <button id="BtnTest">Lance test</button>
                        <script>
                            function    put_zero(tab)
                            {
                                for (var x = 0; x < 4; x++)
                                    for (var y = 0; y < 4; y++)
                                        tab[x][y] = 0;
                            }
                
                            function    is_here(x, y, value, tab)
                            {
                                for (var i = 0; i < 4; i++)
                                    if ((tab[x][i] == value && i != y) || 
                                        ((tab[i][y] == value) && i != x))
                                        return 1;
                                return 0;
                            }
                
                            function    is_complete(tab)
                            {
                                for (var i = 0; i < 4; i++)
                                {
                                    for (var j = 0; j < 4; j++)
                                        if ((tab[i][j] == 0) || is_here(i, j, tab[i][j], tab))
                                            return 0;
                                } 
                                return 1;
                            }
                
                            function    solve(index, tab)
                            {
                                var a = Math.floor(index / 4);
                                var b = Math.floor(index % 4);
                
                                for (var i = 4; i >= 1; i--)
                                {
                                    if (is_complete(tab) == 1)
                                        return 1;
                
                                    if (tab[a][b] == 0 )
                                        tab[a][b] = i;
                                    if (is_here(a, b, i, tab) == 1)
                                        tab[a][b] = 0;
                                    else
                                        solve(index + 1, tab);
                                }
                                return 0;
                            }
                
                
                            function    print_tab(tab)
                            {
                                for (var i = 0; i < 4; i++)
                                    if (tab[i].length <= 0)
                                        return;
                
                                for (var i = 0; i < 4; i++)
                                    for (var j = 0; j < 4; j++)
                                    {
                                        if (i != 0 && j % 4 == 0)
                                            document.write("<br>");
                                        document.write(tab[i][j]);
                                    }
                                document.write("<br>");
                            }
                
                            function    begin()
                            {
                                var tab = [
                                    [],[],[],[]
                                ];
                
                                put_zero(tab);
                                solve(0, tab);
                                print_tab(tab);
                            }
                
                            var BtnLanceTest = document.getElementById("BtnTest");
                
                            BtnLanceTest.onclick = function()
                            {
                                begin();
                            };
                        </script>
                    </body>
                </html>

                -
                Edité par AlexisW09 17 octobre 2021 à 2:50:15

                • Partager sur Facebook
                • Partager sur Twitter

                Début en js, rien qui se lance

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown