Forums - La Blocothèque - Variables : contains

Mots-clés : 

  • This topic has 5 réponses, 2 participants, and was last updated il y a 1 year et 11 months by Anonyme. This post has been viewed 712 times
  • Anonyme  | Posté le 18 janvier 2022 à 17 h 38 min

    Bonjour, je fais face à un petit « défi » en matière de variables : je souhaiterais pouvoir identifier si le joueur inclut et le terme « prénom » et le terme « nom » dans sa réponse, ou l’un ou l’autre. J’utilise les fonctions contains(variable, »nom ») / contains(variable, »prénom »). Le problème, c’est que « nom » est contenu dans « nom » (évidemment) ET dans « prénom« . Ainsi, si le joueur répond uniquement « prénom », cela lui valide les 2 éléments de réponse « prénom » (ok) et « nom » (pourtant non présent dans la réponse).

    Réponse complète : nom et prénom
    Réponse incomplète a : nom
    Réponse incomplète b : prénom

    Y a-t-il un moyen de contourner ce problème ? J’ai tenté avec l’opérateur xor sans succès : le problème qui se pose alors, c’est que même si j’inclus « prénom » et « nom » dans la réponse, seul le premier des deux est « reconnu » et je suis obligé de retaper « nom » lors d’une seconde passe pour que le système considère que « nom » figure également dans la réponse, avec « prénom » (en gros, il faudrait un opérateur xand pour que ça puisse fonctionner !).

    En espérant être suffisamment clair, je vous remercie d’avance pour votre réponse !

    Bien cordialement,

    Yannick

    Yannick Audéoud  | Posté le 18 janvier 2022 à 19 h 53 min

    Bonjour,

    Il s’agit en effet d’une des limites de l’usage de la fonction contains pour vérifier ce qu’a répondu un apprenant.

    Un opérateur xand, xor ou autre ne pourrait pas résoudre le problème, car il sera impossible pour le système de savoir si « nom » a été détecté dans « nom » ou dans « prénom » dans tous les cas.

    Si d’autres mots que « prénom » contenant « nom » peuvent être inclus dans la réponse, ils vont poser le même problème.

    Si parmi les mots contenant « nom », seul « prénom » risque d’être écrit dans la réponse, je vois une solution :
    1. Tester d’abord la présence de « prénom » ;
    2. Modifier la réponse en remplaçant toutes les occurrences de « prénom » par un texte vide grâce à la fonction replace ;
    3. Tester la présence de « nom » dans le résultat, qui sera cette fois valide puisque tous les « prénom » auront disparu. « nom » ne risque donc pas d’être détecté dans un « prénom ».

    contains_replace

    En guise d’alternative, si c’est possible, la solution idéale selon moi serait de repenser la manière de demander sa réponse à l’apprenant. Cela pourrait se faire par exemple en demandant plusieurs fois d’affilé de rentrer des mots jusqu’à ce que l’apprenant dise qu’il n’a plus de mots à rentrer. Il serait alors possible de ne pas tester « nom » si le mot contient déjà « prénom », et de permettre à l’apprenant d’ajouter d’autres mots, pouvant donc ajouter « nom ».

    Bien cordialement,
    Yannick

    Anonyme  | Posté le 19 janvier 2022 à 9 h 04 min

    Bonjour Yannick, un grand merci pour votre réponse claire, rapide et précise, comme toujours ! Je vais opter pour la solution « replace », merci !

    Bonne journée,
    Bien cordialement,

    Yannick Vrolant

    Anonyme  | Posté le 29 avril 2022 à 10 h 35 min

    Bonjour (encore moi !),

    J’ai l’habitude d’utiliser la fonction contains() pour vérifier la présence de chaînes de caractères dans une variable (et cela fonctionne très bien).
    En revanche, je viens d’essayer le même système pour vérifier la présence de chaînes de caractères dans une liste et cela ne semble pas fonctionner. D’où cette question : est-il possible de vérifier la présence de chaînes de caractères dans une liste ?

    Voici comment j’ai procédé :

    Blocs utilisés

    Merci pour votre retour et bonne journée !
    Bien cordialement,

    Yannick Vrolant

    Yannick Audéoud  | Posté le 29 avril 2022 à 11 h 10 min

    Bonjour,

    Merci pour vos retours.

    En effet la fonction contains que vous utilisez dans la dernière ligne de votre colonne Détails n’est pas reconnue par VTS Editor.
    A l’heure actuelle, la seule version de la fonction contains qui peut recevoir 3 paramètres est la 4ème :
    contains(texte a, texte b, texte c) : flag

    Elle ne peut donc pas recevoir de liste en tant que premier paramètre.

    Vous pouvez donc retirer le 3ème paramètre (le 1) de manière à utiliser la 2ème version de la fonction contains :
    contains(liste a, texte b) : flag

    Par exemple, le graphe ci-dessous affiche bien True dans le bloc Message.

    list_contains

    La différence est que vous ne pourrez pas vérifier que le texte est contenu dans la liste « à X caractères près » (1 caractère d’écart par exemple). C’est une fonction qui n’existe pas encore dans VTS Editor, mais qui est bien notée pour une future amélioration !

    Bien cordialement,
    Yannick

    Anonyme  | Posté le 29 avril 2022 à 11 h 15 min

    Parfait, merci beaucoup pour ce retour rapide et précis, comme toujours !

    Bonne journée,
    Bien cordialement,

    Yannick