Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.
La shoutbox n'est pas chargée par défaut pour des raisons de performances. Cliquez pour charger.

Forum Casio - Actualités


Index du Forum » Actualités » TDM n°3 : Utiliser les chaînes de caractères !
Drak Hors ligne Rédacteur Points: 1925 Défis: 40 Message

TDM n°3 : Utiliser les chaînes de caractères !

Posté le 18/07/2018 18:00

Le Tuto Du Mercredi [TDM] est une idée qui fut proposée par Ne0tux. Voici le principe : un mercredi sur deux, nous postons un petit tutoriel sur l'Utilisation de la calculatrice, le Transfert, la Programmation, ou encore la Conception de jeu. Je vous en présente la troisième édition.

Apprendre à se servir des chaînes de caractères (Str) ! (Débutant)

Niveau : ★ ★ ☆ ☆ ☆


Une chaîne de caractère, c'est comme une phrase. Lorsque vous écrivez, vous assemblez des lettres et des signes de ponctuations, des chiffres parfois ou encore d'autres caractères spéciaux. Alors qu'une variable comme A ou θ contient une valeur numérique, les Str – chaînes de caractères, ou string en anglais – contiennent des suites de lettres et de chiffres, des mots, des phrases, etc. Elle sont bien trop peu utilisées dans la plupart des programmes du site, surtout chez les programmes débutants ou les programmes de cours, alors qu'elles peuvent se révéler extrêmement efficaces.

Partie I : Qu'est-ce qu'une Str ?

NB : Ce TDM se veut complémentaire à un cours déjà existant sur l'utilisation des Chaînes de caractères par Totoyo. N'hésitez pas à le consulter également si vous ignoriez jusqu'à présent l'existence des Str.

Comme indiqué dans l'introduction, une chaîne de caractères (Str) contient... des caractères. Des caractères peuvent être des lettres en bas de casse ou capitale, des chiffres, des signes de ponctuations, des espaces, des lettres grecques, des signes mathématiques, et tout autre caractère spécial. Tout ce que vous seriez susceptible d'écrire avec votre clavier, en somme.

Attention toutefois, une Str N'EST PAS une valeur numérique. Toute tentative de calcul entre une Str et une valeur numérique provoquerait une erreur. Il existe cependant des techniques qui permettent de passer d'une Str à une valeur numérique et vice-versa.

Les chaînes de caractère peuvent avoir de nombreuses utilités. Elles peuvent être utilisées pour les programmes de cours, pour les dialogues dans un jeu, pour contenir le nom du joueur ou d'autres informations, et peut avoir des utilisations qui vont même bien au-delà de ce que vous pourriez imaginer : hardcoder des maps pour un jeu, stocker des données sur des monstres ou des attaques dans le code, ou même contenir des caractères qui décrivent des valeurs numériques... Avec un peu d'imagination, tout est possible !

Retenez bien que le premier caractère d'une chaîne est indexé à 1, et non pas à 0. Retenez également qu'une Str ne peut pas contenir plus de 255 caractères. Sachez également qu'un caractère prend 1 voire 2 octets, alors qu'une variable dans une liste en prend 12, voire 24. Employer les Str peut s'avérer très utile à cet endroit-là aussi.


Partie II : Initialiser les Str

Sachez qu'il existe de nombreuses fonctions qui permettent de manipuler les Str. La première chose à savoir faire est d'initialiser une Str comme il se doit. Voici différentes méthodes :
"Bonjour Mister 2 !" → Str 1
Str 2 → Str 1
? → Str 1 //Ce que rentre l'utilisateur va dans Str 1. Utile pour demander le nom du joueur par exemple.

Il existe des cas plus particuliers :
List 1[0] → Str 1
Exp►Str(Y1,Str 1)
La première ligne fonctionne dans les deux sens. Référez-vous au TDM précédent. La deuxième ligne est assez particulière et fait appel à une technique expliquée dans ce tutoriel. Vous n'aurez probablement pas à vous en servir.

Attention toutefois. Les techniques suivantes ne fonctionnent pas :
A → Str 1 //A est une valeur numérique, pas une Str.
"Hello world!"
Str Ans → Str 1 // Str Ans n'existe pas.
BONJOUR → Str 1 //BONJOUR n'a pas de guillemets : il sera considéré comme le produit des variables B, O, N, J, O, U et R. Donc, une valeur numérique.
Hello world!" → Str 1 //Bien sûr, erreur syntaxe s'il manque un guillemet.
Str 2 + A + ", je te love !" → Str 1 //Même délire : A est une valeur numérique.
StrJoin( Str 2, A) → Str 1 //Même problème qu'au dessus.
//Etc.

"Je suis :" → Str 1 //Ne dysfonctionne pas forcément mais peut provoquer des erreurs inattendues : l'interpréteur basic peut considérer le double-point comme un saut de ligne. Soyez vigilants en débugant votre programme si vous faites cela.


Partie III : Manipuler les fonctions pour les Str

Comparer deux Str : StrCmp(
StrCmp( compare chaque caractères des deux chaînes à la suite en partant, bien sûr, du premier caractère à gauche, jusqu'à ce que les deux caractères comparés soient différents. Pour les chiffres et les lettres, voici un ordre croissant pour StrCmp :
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"

//Voici d'autres cas :
StrCmp("CAKE", "CAKEISALIE") //"CAKE" < "CAKEI". Renvoie -1
StrCmp("5", "5-") // "5" < "5-", donc renvoie -1.

Inverser une Str : StrInv(
Cette fonction inverse simplement l'ordre des caractères de la chaîne. Peut s'avérer amusant.
StrInv("Bonjour !") → Str 1
// Str 1 contient "! ruojnoB".

Concaténer (assembler) deux Str : StrJoin(
StrJoin( sert à fusionner deux chaînes de caractères. Toutefois, elle ne peut pas fusionner plus de deux Str en même temps : cette fonction ne prend que deux paramètres.
"BALDI" → Str 1
StrJoin("Bonjour, ", Str 1) → Str 1
//Str 1 contient "Bonjour, BALDI"
/!\ Cette technique n'est pas celle que je recommande pour concaténer deux chaînes. Voir la suite.

Concaténer plusieurs Str à la fois : +
Cette technique est vivement recommandée pour concaténer plusieurs Str. Par rapport à Strjoin(, elle est plus courte et permet d'assembler plus de deux chaînes d'une seule traite.
"Darks" → Str 2
"666" → Str 1
Str 1 + " est le code secret, " + Str 2 + " !" → Str 3
// Str 3 contient "666 est le code secret, Darks !"

Extraire une partie de la chaîne : StrMid( (ou StrLeft( et StrRight( )
La fonction StrMid( – et, dans une moindre mesure, StrLeft( et StrRight( – est extrêmement utile. Je ne cesse de m'en servir. Elle permet d'extraire une partie d'une chaîne à partir d'un indice. Elle peut aussi prendre un troisième paramètre : la longueur de la chaîne à prendre. Si ce paramètre n'est pas préciser, StrMid( extrait tout le reste de la Str à partir de l'indice indiqué.
StrMid( Str 1, 4, 8) //extrait les 8 caractères de la Str 1 à partir du 4ème caractère compris.


Obtenir la longueur précise d'une Str : StrLen(
StrLen( renvoie la longueur de la chaîne de caractère indiquée. Attention toutefois, une Str ne peut pas dépasser 255 caractères !
StrLen( "TROLOLOL") // Renvoie la valeur numérique 8.

Modifier la casse des lettres d'une Str : StrLwr( (Minuscules) et StrUpr( (Majuscules)
StrLwr( et StrUpr( mettent respectivement les lettres d'une Str en minuscule et en majuscule. Ils ne prennent comme paramètre que la Str que vous voulez modifier.
StrLwr("Drak A ECRIT CE TUTO !")
// Renvoie "drak a ecrit ce tuto !"
StrUpr("Je n'aime PAS le chiffre 7."
// Renvoie "JE N'AIME PAS LE CHIFFRE 7."

Rogner une Str par la droite ou la gauche : StrShift(
StrShift( prend deux paramètres : la Str à manipuler et le nombre de caractères à rogner. Ce nombre peut être positif ou négatif. Les caractères qui disparaissent sont remplacés par des espaces.

Rechercher un caractère ou une chaine de caractères dans une Str : StrSrc(
Extrêmement utile, à connaître. StrSrc( renvoie la position (valeur numérique) de la première occurrence indiquée trouvée. Pour faire une analogie, c'est comme si vous faisiez Ctrl + F sur votre navigateur internet. Bien sûr, StrSrc( respecte la casse. Peut prendre un troisième paramètre qui indique l'indice à partir duquel chercher. Attention : SrtSrc( s'arrête à la première occurrence trouvée. Quand rien n'est trouvé, renvoie 0.
"ATTENTION ! ZONE DANGEREUSE !" → Str 1
StrSrc(Str 1, "!") //Renvoie la valeur 11.
StrSrc(Str 1, "!", 12) //Commence la recherche à partir du 12ème caractère. Renvoie la valeur 29.
StrSrc(Str 1, "TENTION !") //Renvoie la position de "T" : 3.
StrSrc(Str 1, "x") //Renvoie 0 : Il n'y a pas de "x".
StrSrc(Str 1, "TENTION !", 9) //Renvoie aussi 0.
StrSrc(Str 1, "TABLE") //Renvoie également 0.
StrSrc(Str 1, "TANTION !") //Idem

Changer une Str en valeur numérique : Exp(
Exp( convertit la chaîne de caractère en une expression mathématique. Si la chaîne contient des lettres, elles sont considérées comme des variables alphanumériques. Si des lettres ne peuvent être converties en variables alphanumériques (minuscules, lettres spéciales, etc.), ou si des caractères ne peuvent être utilisés pour un calcul (espaces, etc.), provoque une erreur syntaxe.
Exp("32") //Renvoie la valeur numérique 32.
Exp("32A") //Renvoie le résultat de 32 * A.
Exp("32 * A") //Erreur syntaxe à cause des espaces.
Exp("BONJOUR") //Renvoie le produit des variables B, O, N, etc.
Exp("Bonjour !") //Erreur syntaxe.
Exp("5i+A*ln (12)-2") //Fonctionne, si "ln " a été entré avec la touche "ln" de la calculatrice.

Faire se déplacer du texte dans une Str : StrRotate(
StrRotate( décale de N les caractères d'une Str. N peut être positif ou négatif, et peut dépasser la longueur de la Str. Elle permet, entre autres, de simuler un défilement de texte.
StrRotate("Achetez les frites de FRITEMAX !  ", 3)
//Renvoie "etez les frites de FRITEMAX !  Ach"
StrRotate("Achetez les frites de FRITEMAX !  ", -5)
//Renvoie "X !  Achetez les frites de FRITEMA"


Partie IV : Application
Il y a de nombreuses manières d'exploiter les fonctions des Str ! En voici quelques unes, assez simples, qui pourront se révéler surement très utiles pour vos programmes, petits ou gros ! N'hésitez pas à poser des questions si besoin !

Enregistrer un nom de joueur.
Que ce soit pour nommer un personnage ou pour enregistrer un nom pour un score de jeu, il est souvent pratique d'être en mesure d'avoir le nom du joueur (ou un pseudonyme choisi par ce dernier). Nous pouvons très simplement récupérer son nom, et même faire en sorte qu'il commence par une majuscule et que le reste soit en minuscule !
"Votre nom"?→Str 1 //Str 1 contient donc le nom.
StrUpr(StrLeft(Str 1, 1)) + StrLwr(StrMid(Str 1, 2))→Str 1
//Dans cette deuxième ligne, on met la première lettre en majuscule et les suivantes en minuscule.

Faire une fonction qui affiche un message en combat.
Plutôt que de réécrire 100 fois un truc affreux comme "Text, 1,1,"Je suis..." : Text 9,1,"Très fort !", etc.", servez-vous des Str ! Dans un moteur de combat, par exemple, vous aurez surement besoin d'afficher des messages à chaque attaque. Mettons que j'enregistre le message à afficher dans Str 2 et que le nom du joueur soit dans Str 1. Cette fonction sera contenue dans un sous-programme.
PROG "COMBAT" :
//Début de tour :
Str 1 + " se prépare à agir !" → Str 2
Prog "TEXT"
[...]
//Au moment de l'attaque, dont le nom est dans Str 3 :
Str 1 + " lance " + Str 3 + " ! " → Str 2
Prog "TEXT"
[...]
//En fin de tour, par exemple :
Str 1 + " a terrassé l'ennemi ! Wheeee!" → Str 2
Prog "TEXT"
//Etc.

_________________________
PROG "TEXT" :
Cls
Text 1,1,Str 2
Do
GetKey
LpWhile Ans ≠ 77
//Affiche le texte et se met en "pause" tant que le joueur n'appuie pas sur [ALPHA]

Faire afficher sur une ligne un texte trop long.
En mode graphique, les lettres prennent, en moyenne, 4 px de large. L'écran de la calculatrice fait 128 px. 128 / 4 = 32. On peut donc considérer qu'à partir de 32 caractères, le texte à afficher dépassera vraisemblablement du cadre. On a le choix entre faire en sorte à ce que le texte ne dépasse jamais 32 caractères, l'afficher sur une deuxième ligne ou bien l'afficher sur une unique ligne en le faisant défiler. Voici comment faire pour cette dernière méthode :
"Je suis la phrase à afficher et j'ai beaucoup trop de lettres. Oh mon dieu ! Achetez les frites de chez FRITEMAX !" → Str 1
Text 1,1,Str 1
Do
If StrLen(Str 1) > 31 // Si la phrase est trop longue...
Then For 1 → A To StrLen(Str 1) Step 2
Text 1,1,StrRotate(Str 1, A) //On la fait défiler dans une boucle
GetKey⇒Break // On sort dès que le joueur presse une touche
Next
IfEnd
GetKey
LpWhile Not Ans //On arrête à l'appui d'une touche.

Hardcoder des données sur des personnages.
Mettons que vous ayez des données par défaut à attribuer à des personnages. Par exemple, une valeur qui correspond à sa force, une autre à sa sagesse et une autre à la robustesse de sa barbe (lol ?), et que vous voulez les attribuer à une liste lorsque le joueur choisit tel ou tel personnage. Si de telles données sont comprises entre 0 et 9, alors vous pouvez tout à fait avoir quelque chose de très propre comme ceci :
//J est l'ID du personnage.
J = 1 ⇒"645Jasper" →Str 4
J = 2 ⇒"428Pavel" →Str 4
J = 3 ⇒"908Brutus" →Str 4
J = 4 ⇒"373Gael" →Str 4
[...]
For 1→A To 3
Exp( StrMid( Str 4, A, 1)) → List 1[A] //On récupère les carac
Next
StrLeft( Str 4, 4)→Str 1//On récupère le nom.

Sélectionner un Sprite pour votre héros en Locate.
Lorsque vous faites un jeu en Locate avec un personnage qui s'y déplace, vous l'affichez surement en faisant :
Locate A, B, "θ"
Sachez que "θ" est aussi une chaîne de caractère. Alors pourquoi ne pas enregistrer ce caractère dans un Str, changeable à volonté ?
ClrText
"==================== Choisissez le heros"
0→D //Le compteur
"αβδσθ" → Str 1 //Les skins disponibles
While 1
StrLeft( StrRotate( Str 1, D), 1) → Str 2
Locate 10,4,Str 2
Do
GetKey
LpWhile Not Ans
Ans = 77 ⇒ Break //Le joueur valide
Ans = 27 ⇒ Isz D
'a //Ce commentaire évite le saut de ligne de Isz D si D = 0.
Ans = 38 ⇒ Dsz D
'a
WhileEnd
Str 2 → Str 1 //Str 1 contient le sprite choisi.


Et voila ! Maintenant, vous n'avez plus d'excuse. UTILISEZ LES STR ! Si ce tuto vous a plu et que vous souhaiteriez voir des techniques plus avancées sur l'utilisation des Str, alors manifestez-vous dans les commentaires !


Liens utiles :
Voir le TDM précédent : Manipulez les Listes !
Tuto pour avoir 40 Str supplémentaires
Cours officiel de Planète Casio sur les Str.
Var2Str, un utilitaire de Totoyo pour convertir une variable en Str.



Drak Hors ligne Rédacteur Points: 1925 Défis: 40 Message

Citer : Posté le 28/07/2018 13:53 | #


Bah, je sais pas, NineStars a déjà fait un tutoriel pour expliquer chacune de ces techniques. Est-ce que tu les as lu et que tu as du mal à comprendre ce qui y est expliqué ?
Eon the Dragon : version 1.2
Let's have a look!
Marre de ces RPGs qui t'imposent des classes, des compétences et des sorts ? Crée tes propres capacités sur Eon the Dragon ! Des monstres, des dragons et des combats aussi épiques que difficiles t'attendent !
Un RPG unique et immense t'attend ! Joue dès maintenant à Aventura, le Royaume Poudingue !
Vous aussi, soyez swag et rejoignez Planète Casio !


Vador Invité

Citer : Posté le 03/01/2019 12:07 | #


Bonjour je débute en programmation et j'aimerais savoir pourquoi mon programme m'affiche toujours "Je n'ai rien trouvé"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    char phrase[]="";
    char *suiteChaine=NULL;
    char lettre[]="";

    printf("Entrez une phrase : ");
    scanf("%s",&phrase);
    printf("Entrez une lettre : ");
    scanf("%s",&lettre);
    suiteChaine=strchr(phrase,lettre);

    if(suiteChaine!=NULL)
    {
        printf("Voici ce qu'on a trouve a partir de %s : %s",lettre,suiteChaine);
    }
    else
    {
        printf("Je n'ai rien trouve");
    }

    return 0;
}
Lephenixnoir Hors ligne Administrateur Points: 24234 Défis: 170 Message

Citer : Posté le 03/01/2019 12:15 | #


(Astuce : utilise la balise [code] ou le bouton pour insérer du code.)

Ton programme n'est pas vraiment valide (il plante carrément chez moi avec *** stack smashing detected ***), et la raison est assez simple : tu n'as pas alloué de mémoire pour tes chaînes de caractères. En C, une chaîne de caractères a une taille fixe, et tu dois toujours la (re)dimensionner à la main. Lorsque tu écris ceci :

char phrase[]="";

Tu crées une phrase de longueur 0, donc tu ne peux pas y mettre de texte. Tu dois allouer de la place, par exemple 100 caractères (en fait 99 à cause du NUL à la fin), de cette façon :

char phrase[100] = "";

Ensuite, tu as un problème de type sur ta lettre que tu alloues comme une chaîne de caractère au lieu d'un caractère seul. Tu es supposé crée un seul objet de type char et ensuite le remplir. La façon de faire est comme ceci :

char lettre;
...
scanf(" %1c", &lettre);

Ensuite, pour afficher la lettre, c'est %c et non %s dans printf(). Voici le programme complet, corrigé :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    char phrase[100];
    char *suiteChaine=NULL;
    char lettre;

    printf("Entrez une phrase : ");
    scanf("%s",&phrase);
    printf("Entrez une lettre : ");
    scanf(" %1c",&lettre);
    suiteChaine=strchr(phrase,lettre);

    if(suiteChaine!=NULL)
    {
        printf("Voici ce qu'on a trouve a partir de %c : %s\n",lettre,suiteChaine);
    }
    else
    {
        printf("Je n'ai rien trouve\n");
    }

    return 0;
}

Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Captainluigi Hors ligne Membre Points: 815 Défis: 1 Message

Citer : Posté le 03/01/2019 13:38 | #


Je voulais faire un programme avec ceci :
prog str 1  


Mais ça ne marche pas ( c'était pour faire une sorte de système d'exploitation windows like avec des liens vers les programmes que l'utilisateur voulait , et ça marchait comme ça
?→"str 1"
Prog str 1
)
Les bons artistes copient, les grands artistes volent. Picasso
Synthwave/Musique électro 80s sur ma chaine Youtube

Jouez à Mario sans arrêt sur votre Casio !
Cliquez pour découvrir
Cliquez pour recouvrir
Lephenixnoir Hors ligne Administrateur Points: 24234 Défis: 170 Message

Citer : Posté le 03/01/2019 13:40 | #


Non, malheureusement ce genre de techniques (remplacer une chaîne de caractères fixe par une variable) ne marche quasiment jamais, et ça vaut aussi pour les entiers (1→A:Str A). C'est juste que le Basic Casio est un langage très pauvre.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Captainluigi Hors ligne Membre Points: 815 Défis: 1 Message

Citer : Posté le 03/01/2019 13:43 | #


Lephenixnoir a écrit :
Non, malheureusement ce genre de techniques (remplacer une chaîne de caractères fixe par une variable) ne marche quasiment jamais, et ça vaut aussi pour les entiers (1→A:Str A). C'est juste que le Basic Casio est un langage très pauvre.



Dommage
Comment je peux faire pour que le programme saute vers un programme donné par l'utilisateur ?
Les bons artistes copient, les grands artistes volent. Picasso
Synthwave/Musique électro 80s sur ma chaine Youtube

Jouez à Mario sans arrêt sur votre Casio !
Cliquez pour découvrir
Cliquez pour recouvrir
Lephenixnoir Hors ligne Administrateur Points: 24234 Défis: 170 Message

Citer : Posté le 03/01/2019 13:43 | #


Tu ne peux pas à ma connaissance à moins d'énumérer un par un tous les noms de sous-programmes possibles.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Captainluigi Hors ligne Membre Points: 815 Défis: 1 Message

Citer : Posté le 03/01/2019 13:45 | #


Lephenixnoir a écrit :
Tu ne peux pas à ma connaissance à moins d'énumérer un par un tous les noms de sous-programmes possibles.



OK , merci
Les bons artistes copient, les grands artistes volent. Picasso
Synthwave/Musique électro 80s sur ma chaine Youtube

Jouez à Mario sans arrêt sur votre Casio !
Cliquez pour découvrir
Cliquez pour recouvrir

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 v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 94 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