Tutoriel 12
Travailler avec des mots
Nouvelles commandes :
> "+" =
Concaténation de chaine de caractères [+]
> length(Str = Donne la
longueur d'une chaine de caractères [2nd]
[CATALOG] "lenght("
> expr(Str = Donne
le résultat numérique d'une chaine de caractères [2nd] [CATALOG] "expr("
> inString(Str,Str2[,debut]
= Recherche dans une chaine [2nd] [CATALOG]
"inString("
> sub(Str,debut,longueur
= Renvoie un sous-ensemble d'une chaine [2nd]
[CATALOG] "sub("
> Str1 à Str0 = variables
alphanumériques [VARS] [7] [1 à 0]
Introduction :
Jusque là, nous avons travaillé avec des variables
numériques (A à Z + theta + listes/matrices). Mais qu'en est-il
si vous souhaitez faire un pendu?
Dans ce cas, il faudra utiliser des chaines de caractères. À
l'instar des variables numériques qui sont stoquées dans des
lettres, les chaines de caractères sont stoquées dans des
variables alphanumérique de Str1 à Str0 que vous trouverez dans [VARS] [7] [1
à 0]. Elles s'utilisent comme les variables classiques mais on y
stoque bien sur des chaines de caractères qui, elles, sont
introduites par des guillemets.
Stoquer et recaller :
Ceci va très vite à assimiler. Suposons que vous souhaitiez
afficher trois fois un même texte sans faire appel à des
boucles (c'est juste pour vous montrer le fonctionnement des
chaines). Le code serait celui-ci :
Exemple :
:"MON TEXTE"->Str1 On
stoque MON TEXTE dans la variable chaine1
:Disp Str1 On affiche une première
fois ce que contient Str1
:Output(5,5,Str1 On affiche le texte
une seconde fois
:Output(8,1,Str1 On affiche le texte
une troisième fois
> Je pense que c'est explicite. Notez l'absance de
guillemets lors de l'affichage puisque c'est le contenu d'une
variable et non un texte qui doit être affiché.
Concaténation et expressions :
Comme les variables numériques, les chaines peuvent subir des
opération. La plus simple de toutes est la concaténation :
mettre côte à côte deux chaines pour n'en former plus qu'une.
Exemple :
:"ABC"->Str1 Stoquage
classique...
:Disp Str1+"DEF" L'affichage
de ces deux chaines concaténées donne "ABCDEF"
:Str1+"DEF"->Str1 Ceci
est la même chose mais le résultat est stoqué dans Str1
Ensuite, vous pouvez obtenir le résultat d'une ou des
opérations stoquées dans cette chaine avec expr(
lui aussi contenu dans le catalogue.
Attention, pour ne pas générer d'erreur, le résultat doit
donner un nombre.
Exemple :
:Input Str1 Demande à l'utilisateur
d'entrer une chaine de caractères
:Disp expr("3+9-"+Str1) Affiche
le résultat
Ici, l'utilisateur DOIT donner un nombre (ou une expression en
tenant compte qu'elle sera stoquée "telle qu'elle" et,
s'il n'y a pas de parenthèses lors de l'utilisation, la
calculatrice pourra renvoyer soit une erreur soit un nombre
erroné).
Exemples :
- Entrez MON NOM : ici, aucun
résultat possible de 3+9-MON NOM :
la calculatrice générera une erreur et le programme
s'arrêtera!
- Entrez SEB : ici, 3+9-SEB est possible car la calculatrice
interpretera SEB comme une
multiplication implicite des variables S, E et B ; ce qui donnera
toujours un résultat inatendu.
- Entrez 8 : pas de doutes ici, c'est
un nombre qu'il fallait entrer et c'est un nombre qui a été
entré : 3+9-8 donnera 4.
- Entrez 35+12 : ici, l'utilisateur
aura surement cru que la calculatrice ferait l'addition AVANT le
calcul souhaité. Il s'attendait donc à ce qu'il ait entré 35+12=47 ; 3+9-47=-35.
Hors, lors de la concaténation, le calcul finale est celui-ci : 3+9-35+12=-11! Il faut donc mettre des
parenthèses et, au lieu de demander ceci à l'utilisateur, il
est préférable de modifier le programme comme suit :
Exemple modifié :
:Input Str1 Demande à l'utilisateur
d'entrer une chaine de caractères
:Disp expr("3+9-("+Str1+")") Affiche le résultat
Ainsi, 3+9-(35+12) donne bien -35.
Mais malheureusement, il est impossible de faire le travail
inverse (impossible de demander un chiffre et de le transformer
en chaine de caractères pour une utilisation futur).
Recherche dans une chaine :
Mais on peut travailler aussi directement sur les chaines
avant de les afficher. Outre la concaténation, vous pouvez aussi
connaître la longueur d'une chaine.
Pour ceci, il faut utiliser la commande lengh(
qui se trouve dans le catalogue.
Vous donnerez comme paramètre une chaine de caractère ou une
variable StrX.
Exemple :
:Disp length("ABC") Ici,
il y a trois caractères : le résultat est 3 (une valeur
numérique) ; attention : "sin(X)" donnera
3 (en effet, "sin(" compte comme 1 caractère)
Mais ce n'est pas la seule commande. Vous pouvez y faire
des recherches via la commande inString(.
La syntaxe est celle ci : inString("CHAINE
OU IL FAUT CHERCHER","CE QU'IL FAUT
CHERCHER",position de départ de la recherche). Le
dernier paramètre est facultatif.
Au lieu de parler indéfiniment sur cette instruction, autant
voir tout de suite un exemple :
Exemple :
:Input "TEXTE : ",Str1 Demande
le texte dans lequel il faudra chercher
:Input "A CHERCHER : ",Str2 Demande le texte qu'il faut rechercher
:1->X Initialise la variable :
nous en aurons besoins plus tard
:Repeat X=0 Boucle donnant les
posistions de toutes les occurences de Str2
et s'arrêtant lorsqu'il n'y en aura plus
:inString(Str1,Str2,X)->X Donne
la position de l'occurence suivante de la chaine recherchée
:If X:Then Si X est différent de
zéro (si une occurence a été trouvée par inString( ) ...
:Disp X Affiche la position de cette
occurence
:X+1->X Incrémente X de
façon à ce que la prochaine fois que inString( sera exécutée elle ne renvoit pas le même
nombre
:End Termine la boucle
Grace a cet exemple, je suppose que vous avez compris
l'utilisation de inString( et, si
elle ne trouve rien, 0 est renvoyé.
Obtenir un sous-ensemble d'une chaine :
sub( est une commande tout aussi
pratique que inString( et sont
souvent utilisées ensemble (ainsi qu'avec length(
).
Cette instruction renvoi une chaine qui est comprise dans la
chaine existante.
Son utilisation : sub("CHAINE",debut,longueur).
Avec cet exemple, vous allez tout de suite comprendre :
Exemple :
:"VOICI UN TEXTE : ABCDEFGHIJ"->Str1 Voici le texte de référence
:ClrHome:Disp Str1,"" Affiche
ce texte et laisse une ligne vide
:Input "DEBUT:",D Demande
le début
:Input "LONGUEUR:",L Demande
la... longueur
:Disp sub(Str1,D,L) Affiche la
sous-chaine demandée
Si vous entrez par exemple : D=7
; L=8 vous obtiendrez "UN TEXTE".
Vous comprendrez aisément l'importance de cette fonction si vous
utilisez les chaines.
Mais attention : si la longueur de la sous-chaine que vous
souhaitez obtenir est plus grande que la longueur totale de la
chaine de départ, la calculatrice générera une erreur! C'est
donc là qu'intervient length( qui,
avec d'astucieuses soustractions et autres opérations, vous
permetrons de ne pas dépasser cette limite.
Conclusion :
Cette leçon parait simple mais son application dans des programmes concrets (tel le pendu cité plus haut) est la chose la plus difficile à mon avis sur la TI. Vous vous en êtes surement rendu compte en évoquant la limitation de sub(. En tout cas, pour faire des programmes avec ce genre de variables, il vous faudra ruser, tester et corriger baucoup de fois pour arriver à un résultat satisfessant. Mais, rassurez-vous, vous n'aurez que rarement l'occasion d'utiliser ces variables (ou alors vous n'aurez pas besoin des fonctions qui posent problème).
Conclusion finale :
Ceci clos notre apprentissage du BASIC : vous pouvez
maintenant programmer seul !
Le TI-BASIC est un bon langage pour commencer à programmer bien
qu'il ai ses limitations (notemment la vitesse).
Faites-nous de bons jeux et programmes utiles et n'hésitez
surtout pas à me les
envoyer en remerciement de votre apprentissage pour que je
puisse les exposer sur mon site ! J'espère vous avoir beaucoup
aidé.
Pour vous exercer, je vous conseil de faire des adaptations des
jeux celebres car, entre autre, il en existe beaucoup et vous
pourrez ainsi regarder comment ont fait d'autres programmeurs si
vous séchez...
Et puis il vous faudra également gérer les erreur mais je vous
laisse regarder dans le menuel de votre calculatice : c'est
explicite et complet.
Retour : Sommaire
Aide : Liste
des commandes
Précédent : Tutoriel
11 : Les matrices