De Scratch Wiki en Français

AFinir.svg

Cette page n'est pas finie !
Les infos qui s'y trouvent sont sûrement incomplètes.
Pour les auteurs : merci de bien vouloir travailler sur cette page.
Autres pages ayant besoin d'attention : Catégorie:AFinir


Différencier les mots d'une suite de caractères

Hey !

Vous avez compris le titre ? Non ? Ah.

Disons que dans ce tuto, nous allons prendre une suite de caractères (par exemple, "ceci est une suite de caractères", bref, un texte), et nous allons mettre chaque mot de cette suite dans une variable. Ca peut sembler inutile, mais je vous assure qu'on peut en avoir besoin, alors autant savoir le faire !

Exemple

Vous avez créé un projet permettant d'exécuter une commande entrée par l'utilisateur. C'est-à-dire que si vous écrivez "dire Bonjour" dans une entrée, le sprite va dire "Bonjour" (oui, vu comme ça, ça sert à rien, je sais, mais c'est pratique pour créer un langage de programmation dans Scratch).

Voilà les commandes que vous avez faites :

demander [Entrer une commande] et attendre
si <(réponse) = [dire Bonjour]> alors
dire [Bonjour]
end
si <(réponse) = [dire Ca va]> alors
dire [Ca va]
end
si <(réponse) = [dire Bonjour, ça va ?]> alors
dire [Bonjour, ça va ?]
end

Bref, vous avez compris. Il va falloir faire un script par réponse, et autant dire qu'il existe des millions de millions de réponses possibles (je ne connais pas la longueur maximale d'une entrée, mais c'est pas mal, croyez-moi).

On ne va pas s'ennuyer à faire des millions de conditions, et de toute façon, Scratch ne supporterais pas et crasherais.

Donc il vous faut un script pour savoir que le premier mot est "dire". Déjà, ça permet de savoir l'action que vous voulez que votre sprite exécute. Car vous pouvez parfaitement avoir créé plus d'actions, comme "avancer", "sauter", "penser"...

On va voir ça tout de suite !

Stockage du premier mot

Normalement, votre variable contient plusieurs mots.

Si ces derniers sont séparés par un espace (ce qui est assez courant, non ?) il va falloir que Scratch stocke tous les caractères présents avant cet espace.

Les variables

C'était prévisible, il faut des variables. Voilà celles que vous devrez créer :

(x) // parce que j'ai pas d'idée de nom
(résultat)
(mots :: list) // la liste dans laquelle seront tous les mots obtenus

Donc vous avez deux variables et une liste. Jusque là, tout ça bien.

x va servir à passer d'une lettre à l'autre dans la variable.

résultat va stocker le mot obtenu à chaque fois.

mots va contenir tous les mots de la variable, dans l'ordre.

Lettre par lettre

Vous devez créer un script permettant d'attribuer à x une lettre. Vous allez comprendre.

Donc déjà, on s'occupe de résultat.

mettre [résultat v] à (regroupe (résultat)(lettre (x) de (réponse)))

Donc résultat va regrouper sa valeur de base ainsi qu'une lettre en plus.

Voilà un petit tableau pour comprendre l'utilité de x, avec réponse = "Bonjour Scratch".

x lettre x résultat
1 B B
2 o B + o = Bo
3 n Bo + n = Bon
4 j Bon + j = Bonj
5 o Bonj + o = Bonjo
6 u Bonjo + u = Bonjou
7 r Bonjou + r = Bonjour

Ah, avec x = 8, vous tombez sur un espace. C'est donc la fin du mot.

Pour le moment, c'est un peu dans le désordre. Pas grave. Vous avez donc ce script :

mettre [résultat v] à (regroupe (résultat)(lettre (x) de (réponse)))

Il faut désormais faire une boucle. Si vous avez tout compris (ce dont je doute un peu...) vous devriez savoir pourquoi cette boucle :

répéter jusqu’à <(lettre (x) de (réponse)) = [ ]> :: control
end

Donc, si on regarde le tableau, la deuxième colonne correspond à :

(lettre (x) de (réponse))

Ce qui veut dire que le script s'arrête quand cette colonne contient " " (espace), et que résultat cesse de se remplir.

Donc, avec cette phrase exemple, résultat doit valoir "Bonjour" à la fin du script. Voyons le script.

répéter jusqu’à <(lettre (x) de (réponse)) = [ ]> :: control
mettre [résultat v] à (regroupe (résultat)(lettre (x) de (réponse)))
end

Si on regarde la première colonne, x augmente tout le temps d'1. Donc :

répéter jusqu’à <(lettre (x) de (réponse)) = [ ]> :: control
mettre [résultat v] à (regroupe (résultat)(lettre (x) de (réponse)))
ajouter à [x v] (1)
end

Il ne reste qu'à ajouter les scripts d'initialisation des variables :

mettre [x v] à [1]
mettre [résultat v] à []
répéter jusqu’à <(lettre (x) de (réponse)) = [ ]> :: control
mettre [résultat v] à (regroupe (résultat)(lettre (x) de (réponse)))
ajouter à [x v] (1)
end

Ca marche ! Vous n'avez qu'à tester ;)

Bon, le problème, c'est que ça ne stocke que le premier mot. On va corriger ça.

Autres mots

Une autre boucle va être nécessaire ici. Elle va permettre de répéter l'action x + 1 autant de fois qu'il y a de lettres.

En cours d'écriture

Cet article fait partie de la catégorie des tutos
Tous les articles de cette catégorie:
Enquête.png
Enquête de Satisfaction

Nous effectuons pour le moment des enquêtes de satisfaction. Nous aimerions entendre ce que vous pensez à propos du Wiki.

Pour répondre à l'enquête, cliquez ici.