VIII - Manipulation avancée des chaines de caractères
Les fonctions vues précédemment ne montrent ne montrent pas toutes les possibilités avec les chaines de caractères. En effet, leurs actions sont assez limitées car on compare, on modifie la casse, on concatène etc... , mais cela reste des chaines. Maintenant que vous commencez à saisir les contours des chaines de caractères, on va monter d'un cran la difficulté, et vous comprendrez mieux leur puissance une fois bien maitrisées ;-)
Extraire des caractères
Il existe trois fonctions pour extraire des caractères d'une chaine :
StrMid() : la généraliste
StrLeft() : en partant de la gauche (en début de chaine)
StrRight() : en partant de la droite (en fin de chaine)
StrMid() permet de récupérer un certain nombre de caractères à partir d'une position donnée. Elle s’utilise de cette façon : StrMid(< "chaine" >,< position du premier caractères à extraire >,< nombre de caractères à extraire >), en sachant que le premier caractère a la position 1.
"Salut jeune programmeur !"→ Str 5
StrMid(Str 5,1,5 //StrMid() renvoie "Salut"
StrMid(Str 5,7,19 //StrMid() renvoie "jeune programmeur" (sans le point d’exclamation)
Si vous ne précisez pas le dernier paramètre (), StrMid() extrait tous les caractères jusqu’à la fin de la chaine.
Dans certaines situations, vous avez besoin de récupérer les n premiers caractères ou les n derniers de la chaine.
StrLeft(Str 5,5 //StrLeft() renvoie "Salut"
StrRight(Str 5,21 //StrRight renvoie "jeune programmeur !" (avec le point d’exclamation)
Si vous avez un doute sur leur utilité, reproduisez ces fonctions avec StrMid(). Pour StrLeft()), c'est facile, mais cela l'est un peu moins avec StrRight().
Cliquez pour découvrir
Cliquez pour recouvrir
//N = nombre de caractères à extraire
//Equivalent de StrLeft()
StrMid(Str 5,1,N
//Equivalent de StrRight()
StrMid(Str 5,StrLen(Str 5)-N,N
Déplacer des caractères
Quelques fonctions prédéfinies permettent de déplacer les caractères au sein d’une chaine.
Déplacement linéaire : StrShift()
StrShift() déplace vers la gauche ou vers la droite de n caractères. Si n est positif, alors le déplacement se fait vers la gauche ; s'il est négatif, il se fait vers la droite.
StrShift("ABCDE",2) // Renvoie "CDE (2 espaces) "
StrShift("ABCDE",-2) //Renvoie " (2 espaces) ABC"
La longueur de la chaine reste identique avant et après StrShift(). les caractères manquants sont alors remplacés par des espaces.
Déplacement circulaire : StrRotate()
Qu'appelle-t-on par déplacement circulaire ? Contrairement à StrShift() où les caractères sont supprimés, avec StrRotate(), les caractères sont placés de l'autre côté de la chaine. Je vous montrerai quelques exemples pour illustrer cette fonction.
StrRotate() déplace circulairement les caractères de la gauche vers la droite (si le paramètre n est positif) ou de la droite vers la gauche (si le paramètre n est négatif).
//Voici un petit code amusant. Tapez-le dans votre calculatrice (le texte doit défiler à l’écran) :
"PLANETE CASIO (avec 7 espaces à la fin)"→Str 1
Do
Locate 2,4,Str 1
StrRotate(Str 1,1)→Str 1
For 1→B To 250
Next
LpWhile Getkey≠47
Rechercher des caractères
La fonction StrSrc() recherche la première occurence ( = correspondance ) dans une chaine. StrSrc(<"votre_chaine">, <"caractère/chaine_à_trouver">).
StrSrc("SALUT","A") //renvoie 2
StrSrc("PROGRAMMATION","A") //renvoie 6
StrSrc("PROGRAMMATION","S") //renvoie 0 car "PROGRAMMATION" ne contient aucun "S" //On peut aussi rechercher une chaine de caractères :
StrSrc("PROGRAMMATION","ION") //renvoie 11
Notez que StrSrc() accepte une 3e paramètre facultatif. Celui-ci indique à partir de quelle caractère la fonction StrSrc() doit commencer la recherche. S'il n'est pas spécifié, la recherche commence depuis le début de la chaine.
Cependant, StrSrc() a un défaut majeur : elle ne renvoie la position que de la première occurrence. Si vous voulez toutes les occurrences, par exemple, de "TOTO" et "O", il faudra programmer vous-même la fonction de recherche. D'ailleurs, en guise d'exercice, je vous invite à réaliser un petit programme qui comble cette lacune de StrSrc().
Convertir une chaine de caractères
De la chaine vers une variable
Pour exploiter le contenu d'une chaine caractère au sein d'un calcul mathématique, rien de plus simple, on utilise la fonction Exp(<"votre_chaine">).
Admettons que votre chaine Str 1 contient "256897". Dans ce cas, Exp(Str 1) renvoie 256897 en tant que valeur (tout simplement !). Si votre chaine contient des lettres ou des symboles, Exp() les convertir en valeur mathématique et exécute le calcul.
Dans l'autre sens maintenant. Cette fois-ci, on utilise la fonction... En fait, elle n'existe pas. Pas de panique, je vous en ai bricolé une ! Le programme se nomme Var2Str et fait très bien le job. Vous trouverez ce précieux sésame sur cette page avec toutes les instructions nécessaires. N'ayez crainte, j'ai conçu cet outil le plus intuitivement possible.
La partie sur les conversions étant finies, attaquons un aspect intéressant et indirect des chaines de caractères : tester l'existence d'une liste.
Tester l'existence d'une liste
Principes de base
Avec les chaines de caractères, on peut savoir si une liste existe. Revenez dans le menu principal et lancez l'application LIST. Devant vos yeux, vous avez les listes. La première ligne, intitulée « Sub » et ayant pour coordonnée 0, permet de nommer la liste de cette façon :
"CASIO"->List 1[0 //La List 1 aura pour nom "CASIO"
Str 1->List 1[0
Notez que le fait de (re)nommer une liste existante ne modifie pas ses valeurs.
Vous vous dites que cette astuce est bien sympathique, mais vous vous demandez son intérêt dans un tutoriel de programmation. Si vous nommez une liste vide, la première case a automatique pour valeur 0. Essayez donc comme dans l'exemple ci-dessous :
ClrList 26 //On s'assure que la List 26 soit bien vide
"CASIO"->List 26[0 //On nomme la List 26
List 26[1 //renvoie 0
Exemple d'application
Si dans un jeu, on utilise la List, disons 1, et que la première case fasse 0, il y a des chances qu'un autre programme et que l'utilisateur l'ai modifiée ou supprimée. Pour réduire les risques, on peut aussi vérifier si la taille (dimension) de la liste est bien celle attendue. Enfin, certains programmeurs stockent une valeur précise dans une variable peu utilisée « c2» (pour les récurrences). Ainsi, si ces trois paramètres ne sont pas correctes, la probabilité que les données aient été modifiées est forte. L'exemple de code ci-dessous reprend les idées énumérées :
"MON JEU"->List 6[0 //On nomme la List 6
If Not List 6[1 Or Dim List!=3 Or c2!=2√2 //Si l'un des trois paramètres est faux, on affiche le message d'avertissement
Then "Les données semblent corrompues ou inexistantes. Voulez-vous initialiser le programme ?"
" 1. Oui"
" 2. Non"
Do
Getkey
LpWhile Ans!=71 And Ans!=62
2√2->c2 //Quoiqu'il arrive, c2 vaut 2√2
Ans=71=>{1,1,1->List 1 //Si la personne est d'accord, on (re)crée la liste avec les bonnes valeurs
IfEnd
IfEnd
Bien sûr, on peut affiner le message d'erreur. Dans certains cas, on pourra en déduire qu'il s'agit plutôt d'une première utilisation du programme (par exemple, si c2 est différent de 2√2), ou bien d'une corruption des données (si la taille de la liste a changé, mais que c2 est égal à 2√2).
Conclusion
Bien utilisées, les chaines de caractères sont de sérieux atouts pour rendre votre programme plus fonctionnel ! Elles sont assez rapides et leurs applications dans les jeux sont sans limite. Par exemple, au lieu de stocker les données (une carte) dans une matrice, certains programmeurs les stockent dans une chaine de caractères. Dans de nombreuses situations, cette technique améliore considérablement les performances des programmes.
Avant d'attaquer notre troisième jeu, voici un récapitulatif des fonctions vues dans ce cours :
Str : la "variable" des chaines de caractères,
StrLen : renvoie la longueur (en nombre de caractères) d'une chaine,
StrUp et StrLwr : modifie la casse,
StrCmp : compare deux chaines,
StrJoin ou + : concatènent deux chaines, ou plusieurs avec +,
StrMid, StrLeft et StrRight : extraient des caractères,
StrShift et StrRotate : déplace des caractères au sein d'une chaine,
StrSrc : recherche un caractère ou chaine de caractères au sein d'une chaine.
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