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