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 :

Comparer deux tableaux dans un argument de fonction


Sujet :

JavaScript

  1. #1
    Membre à l'essai
    Homme Profil pro
    A mon compte
    Inscrit en
    Avril 2023
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : A mon compte

    Informations forums :
    Inscription : Avril 2023
    Messages : 8
    Points : 14
    Points
    14
    Par défaut Comparer deux tableaux dans un argument de fonction
    Bonjour à tous!

    Me revoilà pour une autre question J'avoue que j'ai un peu honte de poser autant de questions car ça ma rappelle que je suis incapable (pour l'instant) de m'en sortir seul. Après cette digression inutile pourriez vous m'aider avec cet énoncé s'il vous plait ?



    1. Ecrire une fonction qui a pour argument deux tableaux de nombres à partir de la variable var = tableauxIdentiques([1, 2, 3], [1,2,3]);

    2. Utiliser une boucle for pour traverser une par une les valeurs du premier tableau et les comparer au fur et à mesure avec les valeurs du second tableau.

    Voici mes tentatives....

    Tentative 1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function tableauxIdentiques  ([1, 2, 3], [1, 2, 3])
     
    for (var i = 0; i < tableauxIdentiques[0].length; i++) {
        for (var j = 0; j < tableauxIdentiques[1].length; j++) {
     
     
    		if (tableauxIdentiques[i] == tableauxIdentiques[j]) {
              console.log("Les tableaux sont identiques");
            }
        }
    }

    Tentative 2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function tableauxIdentiques  ([1, 2, 3], [1, 2, 3])
     
    for (let i = 0; i < tableauxIdentiques.length; i++) {
    	if (tableauxIdentiques[0][i] == tableauxIdentiques[1][i])
    		console.log("True, la fonction for à tout scanné et les résultats sont identiques");
    };
    Je comprends que chaque tableau a un index ainsi que chaque valeurs dans ces tableaux. Je sais aussi que si la boucle trouve une valeur non identique elle s'arrêta (à moins de lui donner une instruction contraire).

    J'essaie d'apprendre avec un livre qui a eu la bonne idée de ne pas corriger les exercices. Bien que je comprenne les leçons quand vient le temps des exercices je les trouve souvent plus compliqués que les exemples. Et n'ayant pas la correction je ne peux pas faire le chemin inverse c'est à dire voir le code pour "remonter" la logique du langage.

    Pourriez vous m'aider s'il vous plait? Merci beaucoup !!

  2. #2
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 075
    Points : 44 679
    Points
    44 679
    Par défaut
    Bonjour,
    avant toute chose il faut bien que tu comprennes ce que tu écris.
    Lorsque l'on écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var = tableauxIdentiques([1, 2, 3], [1,2,3]);
    on affecte à la variable var le résultat de la fonction tableauxIdentiques à laquelle on a passé deux paramètres, [1, 2, 3] et [1,2,3] qui sont des array.
    Seulement voilà var est un mot clé et ne peut donc pas être utilisé comme nom de variable.

    ... il te faudrait écrire quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var resultat = tableauxIdentiques([1, 2, 3], [1,2,3]);

    Pour le reste il te faut approfondir tes connaissances de bases concernant la déclaration/utilisation des fonctions

    Il faut d'abord que tu assimiles ces notions, prendre le temps de « bien comprendre » les cours c'est gagner du temps par la suite

  3. #3
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 888
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 888
    Points : 6 632
    Points
    6 632
    Par défaut
    Je pense qu'avant de te lancer dans le code, tu devrais répondre à la question en bon français:
    Quelles sont les conditions nécessaires et suffisantes pour que deux tableaux soient égaux ou différents ?
    (C'est deux questions en une, une pour chaque scénario).

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

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

    NoSmoking et CosmoKnacki t'ont déjà donné matière à réfléchir...

    J'ajouterais quelques points :

    - N'hésite pas à faire exécuter ton code dans un navigateur ou dans un IDE : tu verras si il fonctionne ou pas, il t'indiquera les éventuelles erreurs de syntaxe...

    - N'hésite pas à mettre des console.log dans ton code pour savoir à chaque étape ce qu'il fait et vérifier que ce qu'il fait est bien conforme à ce que tu attends...

    - Découpe les problèmes en plusieurs morceaux et quand tu maitrises chaque morceau tu les testes ensemble... Ici par exemples, comme suggéré par NoSmoking, tu devrais revoir les variables et les fonctions...

    Par exemple tu pourrais te faire d'autres petits exercices plus simples :


    1- Déclarer un tableau (correctement) et afficher à la console chaque élément de ce tableau.

    2- Faire l'exercice 1 avec une fonction qui prend en paramètre un tableau dont elle affichera tous les éléments.

    3- Faire l'exercice 2 avec deux tableaux : la fonction prend donc deux tableaux en paramètres et doit afficher chaque élément de ces deux tableaux.


    - Ne te contente pas de faire les exercices de ton livre, retourne les exercices et les exemples dans tous les sens, modifie certains points, faits toi des variantes et regardes ce que cela donne...




    Citation Envoyé par L'élépaon Voir le message
    Je comprends que chaque tableau a un index ainsi que chaque valeurs dans ces tableaux. Je sais aussi que si la boucle trouve une valeur non identique elle s'arrêta (à moins de lui donner une instruction contraire).
    Quelques petits points pour te faire réfléchir :

    - Selon toi tableauxIdentiques est une fonction, un tableau ou aucun des deux ?

    - Si pour toi c'est une fonction alors quel sens ont ces expressions : tableauxIdentiques[i], tableauxIdentiques.length, tableauxIdentiques.length... ?

    - Si pour toi c'est un tableau alors où la fonction que l'exercice te demande d'écrire ?

    Et ce tableau a combien de dimensions ? Une ou deux ? (écrire (tableauxIdentiques[0][i] suggère qu'il en aurait au moins deux)

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

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 886
    Points : 3 725
    Points
    3 725
    Par défaut
    Ah oui j'oubliais, en attendant de pouvoir utiliser un vrai débogueur, tu peux utiliser cet outil en ligne https://pythontutor.com/javascript.html#mode=edit pour voir toutes les étapes d’exécution d'une manière visuelle...

  6. #6
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 681
    Points : 5 221
    Points
    5 221
    Par défaut
    Salut,

    Mis à part la syntaxe de ta boucle (à revoir), tu penses vraiment qu'une boucle sur tous les éléments est nécessaire?

  7. #7
    Membre à l'essai
    Homme Profil pro
    A mon compte
    Inscrit en
    Avril 2023
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : A mon compte

    Informations forums :
    Inscription : Avril 2023
    Messages : 8
    Points : 14
    Points
    14
    Par défaut
    Bonjour à tous!

    Merci pour vos réponses et pistes de réflexions!

    Merci NoSmoking

    var = tableauxIdentiques([1, 2, 3], [1,2,3]);
    Tu as raison et je le savais! C'est juste l'envie d'aller beaucoup trop vite (et la fatigue du moment) qui m'ont fait écrire cette erreur mais oui j'ai appris qu'une variable doit avoir un nom. Tu as raison, revoir mes cours ne me fera pas de mal.

    Merci CosmoKnacki

    D'après moi les conditions nécessaires ou suffisantes pour que les deux tableaux soient égaux sont:

    - Avoir la même longueur (la même "length")
    - Etre "rangés" dans le même ordre
    - Des qu'une valeur n'est pas la même la fonction devrait renvoyer false en mettant fin au code

    Merci Beginner

    Je viens d'apprend ce qu'est un IDE je pense que je vais utiliser cet outil (probablement Netbeans ou Visual Studio Code) à moins que tu ai un meilleur IDE à me conseiller?

    - Selon moi tableauxIdentiques est une fonction qui a deux tableaux pour arguments. Mais tableauxIdentiques elle même est bien une fonction

    - Pour moi tableauxIdentiques[i] signifie qu'on demande au code de "piocher" dans les arguments de la fonction, [i] étant le 1er ou le 2ème tableau qui de toute façon seront "scannés" à tour de rôle. Et de ce fait pour moi tableauxIdentiques[i][0] signifie qu'on pioche la valeur à la position zéro du tableau [i] qui peut être soit le 1er soit le 2ème tableau. Je ne sais pas si je suis clair car ce que je raconte est sûrement faux donc c'est difficile d'être clair ^^

    Et du coup tableauxIdentiques.length sert à parcourir l'intégralité des tableaux et aussi à permettre au code de juger si ils sont de "taille" égale et ainsi de renvoyer false si il ne le sont pas

    - Pour moi ce tableau ([1, 2, 3], [1, 2, 3]) a deux dimensions qui sont les deux tableaux séparés par une virgule

    - Pour moi l'exercice me demande juste de "scanner" les arguments de la fonction pour trouver des similitudes ou des différences qui dans le premier cas renverront true et dans le second false.

    Merci pour le lien vers Pythontutor


    Merci javatwister

    J'imagine qu'une boucle sur tous les éléments est nécessaire car il faut les "scanner" pour juger de leur égalité ou de leur inégalité et donc savoir si les deux tableaux sont égaux ou pas comme le demande l'exercice. Ai-je tors? Sûrement oui

    Encore tellement de questions qui se bousculent mais afin de rester dans le thème de la conversation je vais en rester la pour ce post

    Merci à tous d'avoir pris le temps de me répondre j'espère avoir également de vos nouvelles après ce post

  8. #8
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 888
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 888
    Points : 6 632
    Points
    6 632
    Par défaut
    Citation Envoyé par L'élépaon Voir le message
    D'après moi les conditions nécessaires ou suffisantes pour que les deux tableaux soient égaux sont:

    - Avoir la même longueur (la même "length")
    - Etre "rangés" dans le même ordre
    - Des qu'une valeur n'est pas la même la fonction devrait renvoyer false en mettant fin au code
    Je n'ai pas dit "nécessaires ou suffisantes" mais "nécessaires et suffisantes", mais c'est vrai que ma formulation était ambigüe. J'aurais dû te demander:
    Trouve une condition nécessaire et suffisante pour que deux tableaux soient différents?
    et
    Trouve une condition nécessaire et suffisante pour que deux tableaux soient égaux?
    Reprenons les idées de tes 3 propositions dans les deux cas de figure:
    • égalité
      1. avoir la même longueur est une condition nécessaire mais pas suffisante
      2. avoir le même ordre une condition nécessaire et suffisante mais uniquement pour des tableaux contenant les mêmes valeurs
      3. en supposant que les tableaux aient la même taille, pour chaque index les valeurs doivent être égales. C'est une condition nécessaire et suffisante
    • inégalité
      1. avoir des longueurs différentes est une condition suffisante mais pas nécessaire
      2. avoir des ordres différents est une condition nécessaire et suffisante pour des tableaux avec les mêmes valeurs
      3. en supposant que les tableaux aient la même taille, pour au moins un index les valeurs sont différentes: C'est une condition nécessaire et suffisante.


    Ça peut sembler être des évidences, mais faire ce genre de travail préalable, formulé de manière rigoureuse (façon fanatique de la logique venu tout droit de la planète Vulcain) et surtout quand on débute, permet de débroussailler le terrain et de faire émerger les solutions possibles.

    J'éliminerais d'emblée la proposition 2, car elle ne s'applique qu'à un cas particulier: les tableaux contenant les mêmes valeurs quelque soit l'ordre. (quid des tableaux avec des valeurs différentes?)

    Par contre les propositions 1 et 3 fonctionnent bien ensemble, puisque la proposition 1 est un préalable à la proposition 3. (Car dans le cas contraire, tu devras gérer des index qui n'existent pas (ce qui n'est pas infaisable cela dit).

    Donc une condition nécessaire et suffisante pour que deux tableaux soient égaux est: les tableaux ont la même taille et à chaque index ils ont la même valeur.
    Une condition nécessaire et suffisante pour que deux tableaux soient différents est: les tableaux ont des tailles différentes ou (non exclusif) il existe un index pour lequel les valeurs sont différentes.

    Là on y est, on peut commencer à penser implémentation.

  9. #9
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 681
    Points : 5 221
    Points
    5 221
    Par défaut
    Citation Envoyé par L'élépaon Voir le message
    Utiliser une boucle for pour traverser une par une les valeurs du premier tableau et les comparer au fur et à mesure avec les valeurs du second tableau.
    En option, pense que tester l'identité de 2 tableaux n'oblige pas à analyser chaque entrée (heureusement): il faut juste transformer les tableaux en chaînes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    const test=function(a,b){
    	return a.join() == b.join()
    }
     
    let res1=test([1,2,3],[1,2,3])
    let res2=test([1,4,3],[1,2,3])
    let res3=test([1,4,3],[1,4,3,2])
    let res4=test([],[])
     
    console.log(res1) // [1,2,3],[1,2,3] ==> true
    console.log(res2) // [1,4,3],[1,2,3] ==> false
    console.log(res3) // [1,4,3],[1,4,3,2] ==> false
    console.log(res4) // [],[] ==> true

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

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 886
    Points : 3 725
    Points
    3 725
    Par défaut
    Citation Envoyé par L'élépaon Voir le message
    Je viens d'apprend ce qu'est un IDE je pense que je vais utiliser cet outil (probablement Netbeans ou Visual Studio Code) à moins que tu ai un meilleur IDE à me conseiller?
    Personnellement j'utilise VS Code, je le trouve bien pour faire entre autres du JS/HTML/CSS... Il y a en plus des extensions utiles pour diverses fonctionnalités...

    Citation Envoyé par L'élépaon Voir le message
    Selon moi tableauxIdentiques est une fonction qui a deux tableaux pour arguments. Mais tableauxIdentiques elle même est bien une fonction
    Ben en fait, d'après le code que tu as posté, ce n'est ni une fonction ni un tableau, il y a des erreurs de syntaxe... Tu vois là l’intérêt de tester tes codes...

    Il faut donc que tu revois comment on déclare une fonction et n'hésite pas à faire des tests avec ton navigateur et/ou ton IDE... Pareil pour les tableaux...

    Tu pourrais faire les petits exercices que je t'avais donnés dans mon message précédent...


    Citation Envoyé par L'élépaon Voir le message
    Pour moi tableauxIdentiques[i] signifie qu'on demande au code de "piocher" dans les arguments de la fonction, [i] étant le 1er ou le 2ème tableau
    Ben non cela ne fonctionne pas comme cela, l'opérateur [] n'est pas utilisé avec les fonctions mais par contre il est utilisé avec les tableaux pour récupérer l'élément d'indice i ...

    Citation Envoyé par L'élépaon Voir le message
    Et du coup tableauxIdentiques.length sert à parcourir l'intégralité des tableaux
    Et ceci tableauxIdentiques.length serait la longueur de quel tableau ? Tu vois bien qu'il y a un soucis... La syntaxe avec le point est claire, ce que tu écris permet de récupérer la propriété length de tableauxIdentiques or les fonctions n'ont pas de propriété length contrairement aux tableaux par exemple...

    Citation Envoyé par L'élépaon Voir le message
    Pour moi ce tableau ([1, 2, 3], [1, 2, 3]) a deux dimensions qui sont les deux tableaux séparés par une virgule
    Pour les tableaux on n'utilise pas les parenthèses mais les crochets [], exemple : let tab_2D = [[1, 2, 3], [1, 2, 3]].

    Je te conseilles vraiment de faire les petits exercices que je t'avais donnés dans mon message précédent car en gros tu mélanges la syntaxe des fonctions avec celle des tableaux...

    Bon courage...

  11. #11
    Membre à l'essai
    Homme Profil pro
    A mon compte
    Inscrit en
    Avril 2023
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : A mon compte

    Informations forums :
    Inscription : Avril 2023
    Messages : 8
    Points : 14
    Points
    14
    Par défaut
    Re bonjour!

    Encore merci pour vos retours!

    CosmoKnacki


    Ça peut sembler être des évidences, mais faire ce genre de travail préalable, formulé de manière rigoureuse (façon fanatique de la logique venu tout droit de la planète Vulcain) et surtout quand on débute, permet de débroussailler le terrain et de faire émerger les solutions possibles.

    J'adore la référence c'est sûr que de formuler ce dont j'ai besoin en Français (puis semi-français semi-code) devrait m'aider à aller dans la bonne direction. C'est un premier pas que je n'ai pas fait
    Mais je sens que même si je prenais le temps de le faire il me manquerais encore les outils de Javascript pour le réaliser. Mais ça c'est un deuxième problème... Attaquons nous d'abord au premier.

    Merci pour ta réponse longue et détaillée.



    javatwister

    Merci pour cet exemple de code. Un Youtubeur du nom de Grafikart à dit qu'il est impossible de comparer deux tableaux entre eux en javascript et que par conséquent le retour serait toujours "false". Ce qui confirme ton code et tes propos disant qu'il faut transformer les valeurs des tableaux en chaînes de caractères pour pouvoir les comparer. J'y vois plus clair



    Beginner

    Avant toute chose j'ai vu sur les tutos Youtube que les développeurs qui utilisent Visual Studio Code ont leur console à coté. Je n'arrive justement pas à trouver cet espace de travail avec la console en parallèle. J'ai cru comprendre que pour ce faire il fallait installer une extension. Peux-tu m'en conseiller une s'il te plaît?

    Merci pour la réponse détaillée. Je ne manquerais pas de faire les exercices!

    Tant de choses à faire! Bonne journée à tous!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 8
    Dernier message: 24/09/2022, 00h16
  2. [XL-2013] comparer deux tableaux dans 2 fichiers differents
    Par hgmorse dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 03/01/2017, 15h32
  3. [Tableaux] Une fonction pour comparer deux tableaux ?
    Par renaud26 dans le forum Langage
    Réponses: 5
    Dernier message: 20/06/2009, 11h11
  4. Espace dans les arguments de fonction
    Par black is beautiful dans le forum Windows
    Réponses: 2
    Dernier message: 11/03/2006, 12h06
  5. comparer deux tableaux
    Par djibril dans le forum Langage
    Réponses: 4
    Dernier message: 15/11/2005, 15h26

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