Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.

Forum Casio - Vos tutoriels et astuces


Index du Forum » Vos tutoriels et astuces » Créer une liste de chaînes de caractères.
Programateur Hors ligne Membre Points: 222 Défis: 10 Message

Créer une liste de chaînes de caractères.

Posté le 15/05/2016 10:52

Je vais dans ce topic parler de 3 méthodes différentes pour créer l'équivalent d'une liste de chaînes de caractères.



I) Utilisation d'une liste classique

L'idée ? Stocker les chaînes les unes après les autres dans une autre chaîne, puis rentrer la longueur de chaque chaîne dans chaque case d'une liste.

Par exemple, on a :

"BATEAU"→Str 1
"CISEAUX"→Str 2
"SEAU"→Str 3


On ajoute chaque chaîne dans une autre, par exemple Str 4:

"BATEAUCISEAUXSEAU"→Str 4.


Ensuite, on met dans chaque case de la liste (par exemple la liste 1) le numéro de positionnement dans la chaîne principale. Arrivé à la fin, on rentre le numéro de positionnement théorique d'un nouveau mot ajouté dans la chaîne.

{1,7,14,18}→List 1


Et voilà ! Pour lire ce qui est l'équivalent de Str 4[A], on fait :

StrMid(Str 4,List 1[A],List 1[A+1]-List 1[A])




II) Utilisation d'un même caractère pour démarquer chaque chaîne

Je tiens à remercier Dark storm pour cette technique.
Le principe est assez simple : en interposant un caractère (par exemple "") entre chaque chaîne, on réussit à l'aide d'une boucle à déterminer une chaîne particulière.

Le code :

"Pierre|Feuille|Ciseaux"→Str 1
2→A // on veut le mot n°2
0→B
Str 1→Str 2 // on sauvegarde parce que la chaine 2 va être modifiée
While B < A
StrSrc(Str 1, "|") → P // on cherche le prochain séparateur
If P > 0 // on fait gaffe à ne pas aller trop loin sinon ça plante
Then StrLeft(Str 2, P-1) → Str 3 // ça c'est le mot extrait
StrRight(Str 2, StrLen(Str 2) - (P+1)) → Str 2 // ça c'est le reste de la chaine
IfEnd
B+1→B
WhileEnd

Str 3 // contient le mot extrait




III) Utilisation de caractères différents pour démarquer chaque chaîne

Cette fois ci, c'est Lephenixnoir qui nous offre cette astuce. Le principe ressemble au précédent, à une différence près : on utilise des caractères différents entre chaque chaînes afin d'éviter l'utilisation d'une boucle.

Le code :

"&Pierre@Feuille|Ciseaux#Lézard%Spock$"→Str 1
"&@|#%$"→Str 2
3→A // On veut "Ciseaux".
StrSrc(Str1,StrMid(Str 2,A,1))→L
StrSrc(Str1,StrMid(Str 2,A+1,1))→R
StrMid(Str 1,L,R-L) // "Ciseaux"




Conclusion : que choisir ?
Chaque méthode à ses avantages et ses inconvénients.

Méthode 1 :
+ : code pour sélectionner la chaîne simple et court.
- : utilisation d'une liste, peu intuitive à remplir .

Méthode 2 :

+ : Pas de liste utilisée, séparation intuitive.
- : Un caractère devient inutilisable, boucle et code compliqué. Utilisation de plusieurs str.

Méthode 3 :
+ : Pas de liste utilisée, séparation intuitive, pas de boucle.
- : Un nombre important de caractères deviennent inutilisables.


Cependant il est à noter qu'une chaîne à une capacité limitée : Au bout d'un total de 256 caractères, voir même 128 pour des caractères spéciaux, cette astuce ne marche pas !


Programateur Hors ligne Membre Points: 222 Défis: 10 Message

Citer : Posté le 15/05/2016 15:43 | #


Kirafi tu as supprimé ton message ?
J'ai besoin de votre participation ici :
94%
Cliquer pour enrouler
Lephenixnoir Hors ligne Administrateur Points: 19624 Défis: 142 Message

Citer : Posté le 15/05/2016 17:41 | #


Il utilisait un séparateur et du StrSrc. Mais du coup faut un séparateur différent à chaque fois... non ? Donc une Str avec les séparateurs.
Programateur Hors ligne Membre Points: 222 Défis: 10 Message

Citer : Posté le 15/05/2016 18:30 | #


Est-ce vraiment plus simple ?
J'ai besoin de votre participation ici :
94%
Cliquer pour enrouler
Kirafi Hors ligne Membre Points: 2172 Défis: 10 Message

Citer : Posté le 15/05/2016 19:38 | #


Bah c'est pas forcément plus optimisé, mais juste plus automatisé ...
iPod
Pour des parties rapides
Jusqu'où pourras-tu aller dans ce jeu "partie rapide" qu'est Dextris (élu Jeu Du Mois)
Pourras-tu survivre plus de 20 secondes dans ce fameux tunnel appelé Graviton
Rebondis entre les murs en évitant les piques dans SpikeBird
Pourras-tu éviter de te faire écraser dans FallBlocs (élu Jeu Du Mois)
Autres
Franchement ils valent le coups
Deviens l'amiral de la marine dans SeaRush (jeu concours) (élu Jeu Du Mois)
La version 2048 tactile amélioré au plus haut point : 2048 Delux !
Pars à la recherche des morceaux d'étoile dans Lumyce (élu Jeu Du Mois)
Dark storm Hors ligne Membre d'honneur Points: 11373 Défis: 176 Message

Citer : Posté le 15/05/2016 20:10 | #


C'est plus long, mais ça évite d'avoir une liste à coté.
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Programateur Hors ligne Membre Points: 222 Défis: 10 Message

Citer : Posté le 15/05/2016 20:38 | #


Mais du coup ça ressemblerait à quoi ? Excusez moi mais j'ai du mal à visualiser le code que ça entraînerait...
J'ai besoin de votre participation ici :
94%
Cliquer pour enrouler
Dark storm Hors ligne Membre d'honneur Points: 11373 Défis: 176 Message

Citer : Posté le 15/05/2016 20:44 | #


"Pierre|Feuille|Ciseaux"->Str 1
2->A // on veut le mot n°2
0->B
Str 1→Str 2 // on sauvegarde parce que la chaine 2 va être modifiée
While B < A
StrSrc(Str 1, "|") → P // on cherche le prochain séparateur
If P > 0 // on fait gaffe à ne pas aller trop loin sinon ça plante
Then StrLeft(Str 2, P-1) → Str 3 // ça c'est le mot extrait
StrRight(Str 2, StrLen(Str 2) - (P+1)) → Str 2 // ça c'est le reste de la chaine
IfEnd
B+1→B
WhileEnd

Str 3 // contient le mot extrait


À quelques indices près sur l'extraction des mots (j'ai pas testé), c'est ça.
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Lephenixnoir Hors ligne Administrateur Points: 19624 Défis: 142 Message

Citer : Posté le 15/05/2016 20:55 | #


Ah ben non, ça va pas ça c'est en accès linéaire. Il faut changer de séparateur à chaque fois et rechercher le séparateur adéquat.
Programateur Hors ligne Membre Points: 222 Défis: 10 Message

Citer : Posté le 15/05/2016 20:56 | #


OK, merci !
Peut être serait-il intéressant de parler des deux astuces dans le topic ?
J'ai besoin de votre participation ici :
94%
Cliquer pour enrouler
Dark storm Hors ligne Membre d'honneur Points: 11373 Défis: 176 Message

Citer : Posté le 15/05/2016 20:57 | #


Ben si tu change de séparateur, ça devient le bordel si tu veux ajouter des mots. Mais tu gagne en rapidité. Après, faut voir si la rapidité est strictement nécessaire (si c'est un mot de temps en temps, ce code reste assez rapide).
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Programateur Hors ligne Membre Points: 222 Défis: 10 Message

Citer : Posté le 15/05/2016 21:08 | #


Et du coup toi Lephenixnoir tu ferais comment ?
J'ai besoin de votre participation ici :
94%
Cliquer pour enrouler
Lephenixnoir Hors ligne Administrateur Points: 19624 Défis: 142 Message

Citer : Posté le 15/05/2016 21:48 | #


Comme on est limités en taille (256 octets), on aura peu de mots. On peut donc lister des séparateurs en utilisant des caractères "exotiques" :
"&Pierre@Feuille|Ciseaux#Lézard%Spock$"→Str 1
"&@|#%$"→Str 2
3→A // On veut "Ciseaux".
StrSrc(Str1,StrMid(Str 2,A,1))→L
StrSrc(Str1,StrMid(Str 2,A+1,1))→R
StrMid(Str 1,L,R-L) // "Ciseaux"

Ça doit être quelque chose comme ça.
Programateur Hors ligne Membre Points: 222 Défis: 10 Message

Citer : Posté le 15/05/2016 22:15 | #


Cool !
Est-ce que vous accepteriez que je rajoute ces deux astuces dans le topic ?
J'ai besoin de votre participation ici :
94%
Cliquer pour enrouler
Lephenixnoir Hors ligne Administrateur Points: 19624 Défis: 142 Message

Citer : Posté le 15/05/2016 22:16 | #


La mienne ne vaut pas grand-chose à mon avis, mais je t'en prie...
Dark storm Hors ligne Membre d'honneur Points: 11373 Défis: 176 Message

Citer : Posté le 15/05/2016 22:22 | #


Vas-y, la connaissance ça se partage
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Programateur Hors ligne Membre Points: 222 Défis: 10 Message

Citer : Posté le 15/05/2016 22:55 | #


Et voilà !
J'ai besoin de votre participation ici :
94%
Cliquer pour enrouler
Lephenixnoir Hors ligne Administrateur Points: 19624 Défis: 142 Message

Citer : Posté le 15/05/2016 22:58 | #


Pourquoi mettre des spoilers ? Mets plutôt des titres de parties en combinant big, b et brown
Programateur Hors ligne Membre Points: 222 Défis: 10 Message

Citer : Posté le 16/05/2016 09:34 | #


@Lephenixnoir : c'est fait !
J'ai besoin de votre participation ici :
94%
Cliquer pour enrouler

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v42 © créé par Neuronix et Muelsaco 2004 - 2021 | Il y a 49 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd