Les chaines !
Leçon du jour : les chaines donc, pas celles avec un boulet au bout, mais les chaines de caractères qu'on trouve dans nos chères TI (ou "string" en anglais, j'vois déjà Xywez arriver d'ici )
Alors, j'vais parler de beaucoup de choses sur les chaines, mais en vrac, parce qu'on me l'a demandé et j'improvise , il n'y aura pas vraiment d'organisation, enfin je dis ça, je dis rien, j'ai même pas encore commencé ^^
...
Allez hop, début du tuto :)
Il est rare d'avoir vu un programme qui se passe de chaines, pour afficher du texte, ou encore pour d'autres usages...les chaines sont un magnifique outil de travail une fois qu'on les a maitrisé, elles enrichissent vraiment le programme, et certaines manipulations permettent de tirer le maximum de ces chaines...Quelles manipulations ? C'est ce qu'on va voir maintenant :)
Pas de rédaction complète, j'balance les instructions/programmes un peu comme ça, j'avais prévenu ^^
Exemple :
Les chaines de caractères se trouvent dans le menu [Vars] puis en tapant [7]
Il s'agit simplement de mettre 2 chaines à la suite. Pour cela on utilise l'opérateur +
Code: |
"Bonjour->Str1 " tout le monde->Str2 Str1+Str2->Str1 //Str1 = "Bonjour tout le monde" |
/!\ Attention /!\
début et nombre doivent être des nombres entiers !
début+nombre-1 doit être inférieur ou égal à la taille de Str1 (voir comment déterminer la taille d'une chaine)
Exemple :
Code: |
"Bonjour"->Str1 For N,1,7 sub(Str1,N,1->Str0 Disp Str0 End |
Ce code retournera
Code: |
B o n j o u r |
Cette fonction prend 1 argument : la chaine
Exemple :
Code: |
"Bonjour"->Str1 length(Str1)->A //A vaut 7 |
Cette fonction prend 2 arguments :
Exemple : recherche de "jour" dans "bonjour"
Code: |
"Bonjour"->Str1 instring(Str1,"jour")->A //A vaut 4 |
Remarque :
Ainsi, si on avait voulu trouver "o" dans Bonjour, la fonction aurait retourné 2
Le programme suivant permet de "compléter" la fonction instring(), il est facile à comprendre avec ce qui a été dit précedemment
Code: |
//Entrée : Str1 = chaine, Str2 = sous-chaine //Sortie : L1 = liste de toutes les occurences de Str2 dans Str1 //Utilise : Z,theta length(Str2->Z //récupère la taille de Str2 0->N //nombre d'occurences trouvées For theta,1,length(Str2)-Z If sub(Str1,theta,Z)=Str2 //ça correspond Then If N=0 //1ère occurence Then {theta->L1 Else //ce n'est pas la 1ère occurence augment(L1,theta->L1 //rajoute un élément theta à la liste L1 End //fin de la condition N=0 End //fin de la condition sub(Str1,theta,Z)=Str2 End //fin de la boucle |
Cette fonction prend 1 argument, la chaine
Exemple :
Code: |
"12*12"->Str1 expr(Str1)->A //A vaut 12*12=144 |
Code: |
//Entrée : A = nombre à convertir //Sortie : Str1 = A en chaine de caractères //Utilise : L1, L2, Y1, B {A,A->L1 {1,2->L2 LinReg(ax b) L2,L1,Y1 Equ>String(Y1,Str1 length(Str1->B sub(Str1,4,B-3->Str1 |
Explications
Code: |
{A,A->L1 {1,2->L2 |
Rien de compliqué ici...
Code: |
LinReg(ax+b) L2,L1,Y1 |
LA ligne qui pose problème ^^
Pour expliquer la fonction LinReg(ax+b) je prends l'exemple d'une expérience : pour ceux qui ont déjà fait des expériences et ont eu à tracer un graphe, souvent on obtient des valeurs expérimentales qui peuvent s'apparenter à une droite mais ce n'est pas tout à fait une droite, alors on trace une droite qui passe le plus près possible des points obtenus, et bien la régression linéaire permet de trouver l'équation de cette droite
Cette fonction prend 2 arguments et 1 facultatif :
On obtient alors dans Y1 une équation de la forme Y1=0X+A
Code: |
Equ>String(Y1,Str1 |
Copie le contenu de Y1 dans Str1. On a donc Str1 = Y1=0X(plus)A
Code: |
length(Str1->B sub(Str1,4,B-3->Str1 |
Code pour extraire le nombre A de la chaine Str1 obtenue. Un p'tit tableau pour mieux comprendre
Supposons que A = 1337 (au hasard ^^)
Après les étapes précédentes, on a Str1 = 0X+1337
Str1 peut donc être représenté ainsi : (en gras, ce qu'on veut, en normal, ce qu'il faut éliminer)
Str1
1 | 2 | 3 | 4 | 5 | 6 | 7 |
0 | X | + | 1 |
3 |
3 |
7 |
1.On obtient la taille de Str1 à l'aide de l'instruction length. On le stocke dans la variable B
Str1
1 | 2 | 3 | 4 | 5 | 6 | 7 |
0 | X | + | 1 |
3 |
3 |
7 |
2.On veut les 4 derniers caractères de la chaine. Cela revient à éliminer les 3 premiers caractères de la chaine
Quoiqu'il arrive, la position du 1er caractère de la chaine sera toujours 4
Si on soustrait la taille de la chaine à 3, qui correspond à la taille de "0X+" on obtiendra toujours le nombre de caractères du nombre converti...
Il ne reste plus qu'à finir le travail avec sub()
Dans ce cas, on extraira 4 caractères à partir du 4ème, on obtient donc bien 1337
Remarque :
On aurait pu utiliser log() pour cela, mais les nombres négatifs ne passeraient pas...
(rappel : int(log(n)) retourne le nombre de chiffres de n, mais ne marche que pour n>0 (term ^^))
Voilà, j'ai à peu près fait le tour des chaines de caractères...si quelque chose manque ou que j'ai mal expliqué quelque chose, bah dites-le, je compléterai/corrigerai