CODINGCLASSEURS WEKA ★ Comment exploiter toutes les ressources et augmenter les performances de votre AMSTRAD CPC ★

4/1.2.04 - Manipulation de chaînes de caractèresCoding Classeurs Weka
4/0 - Langages du CPC

4/1 - Locomotive BASIC : Définitions et rappels de base

4/1.2 Version 1.0 sur CPC 464 : Mots clés et leur utilisation

IV. Manipulation de chaînes de caractères
ASC (< Chaîne Alphanumérique > )

Donne la valeur ASCII du premier caractère d'une chaîne alphanumérique.

UtilisationVous voulez mettre une majuscule sur la première lettre d'un mot. Soit un mot « MOT$ » qui représente un nom propre, et prend donc une majuscule. Si ce mot a été entré par l'opérateur, il peut automatiquement prendre une majuscule de la façon suivante :

1000 A = ASC(MOT$)
1010 IF A> 96 THEN MOT$ = CHR$(A-32) + RIGHT$(MOT$, LEN(MOT $) - 1 )
2000 PRINT MOT $

A>96 indique que la lettre est une minuscule,
CHR$(A-32) transforme une minuscule en majuscule,
RIGHT$(MOT$, LEN(M0T$)- 1 ) est égal à MOT$, la première lettre exclue.

De même, on peut imaginer dans un traitement de textes une telle option qui met automatiquement des majuscules après les points, les supprime après les points-virgules, les virgules, ou met un blanc après les virgules, points-virgules et points.

Analyse du problème :

Le fichier texte étant stocké en mémoire sous forme ASCII, il suffit de le décrire du début à la fin en recherchant les caractères point, virgule et point-virgule.

Ce qui se traduit par l'organigramme suivant :

/im3/weka4123a1.jpg

CHR$(< Nombre entier >)

Inverse de la fonction ASC.

Transforme un code ASCII en un caractère alphanumérique correspondant.

Utilisation CHR$ permet, par exemple, d'insérer des codes de contrôles dans la redéfinition d'une touche.

Par exemple, le « 0 » du pavé numérique peut être redéfini en « RUN + CR » de la façon suivante : KEY 138, "RUN" + CHR$(13), ce qui provoquera l'exécution de la commande RUN.

Autre utilisationPermet de définir des chaînes de caractères complexes (de longueur inférieure à 255 caractères) pour afficher avec un seul ordre tout un écran.

Soit l'écran suivant :

Appelons A$ la chaîne de caractères qui représentera l'écran.

Cette chaîne aura la structure suivante :

A$ = SPACE$(12) + "TITRE" + CHR$(13) + CHR$(13) + CHR$(13) + CHR$(13) + CHR$(13)
A$ = A$ + SPACE$(3) + "C01 " + etc.

L'ordre « PRINT A$ » affichera l'écran que l'on vient de définir.
INSTR([< Nombre entier n >, ]< Chaîne 1>, < Chaîne 2 >)

Cherche si une sous-chaîne (Chaîne 2) appartient à une chaîne (Chaîne 1) en commençant la scrutation à partir du caractère indiqué « n » ou du premier caractère si rien n'est indiqué.

Si « Chaîne 1 » contient « Chaîne 2 », INSTR donne la première occurrence de « Chaîne 2 » dans « Chaîne 1 » ; sinon INSTR donne 0.

UtilisationPar exemple, dans le jeu du pendu, l'instruction INSTR peut être utilisée

pour voir si la lettre proposée fait partie du mot à découvrir.

Soit M$ le mot à découvrir, et L$ la lettre proposée :

INSTR (M$, L$)= 0 si la lettre ne fait pas partie de M$,

INSTR (M$, L$) = Position de la première lettre L$ dans M$ sinon.

Autres utilisationsa) Dans un environnement industriel bruité¹, cette commande peut servir à la reconnaissance de données transitant sur une ligne de communications entre deux ordinateurs.
  • ¹) Un environnement industriel bruité est un local dans lequel des parasites électriques peuvent parvenir sur un ordinateur (parasites liés à des champs électrostatiques ou magnétiques, ou à des ruptures de courant de haute intensité).
Soit D$ l'ensemble des mots reconnus par l'ordinateur récepteur, appelé dictionnaire par la suite.

Soit M$ un message reçu par l'ordinateur récepteur, émis par l'émetteur, tel que M$ appartienne au dictionnaire.

Le vocabulaire émis étant limité, l'ordre INSTR peut servir à identifier un mot émis qui a été plus ou moins bien reçu, et dont une partie seulement est identique à un des mots du dictionnaire.

Supposons que le mot reçu soit composé de n caractères, nous allons comparer ce mot à tous les mots du dictionnaire, pour essayer de le reconnaître, puis une partie du mot, jusqu'à ce que INSTR (d$, M$) < >0 (où d$ est un mot de D$).

Nous aurons alors probablement identifié le mot émis.

b) Analyse syntaxique dans un jeu d'aventures :

Dans les jeux d'aventures, une grande partie du jeu est basée sur un analyseur syntaxique qui « comprend » les phrases que vous entrez au clavier. Comment fonctionne cet analyseur ? Prenons un cas très simple : il ne peut reconnaître que les phrases constituées d'un verbe et d'un sujet. (Par exemple : « PRENDRE HACHE »).

Les verbes sont définis dans un dictionnaire de verbes qui rassemble tous les verbes « compréhensibles » par la machine. Soit V$ ce dictionnaire. De même pour les sujets. Soit S$ le dictionnaire des sujets. Nous appellerons v$ un élément de V$, et s$ un élément de S$. Soit enfin une phrase P$ entrée par le joueur. L'extraction des verbe et sujet de P$ se fera de la manière suivante : (voir organigramme p. 33).

De même pour les sujets.

LEFT$(< Chaîne >, < Entier n >)

Extrait les n caractères les plus à gauche de la chaîne soumise.

UtilisationReprenons l'exemple précédent : l'analyseur syntaxique.

Il peut paraître lassant au joueur de taper les mots-clés verbes et sujets en entier à chaque commande, et une bonne amélioration du jeu pourra consister à taper les quatre premières lettres (par exemple) de chaque mot-clé pour aller plus vite.

RéalisationAu lieu d'analyser INSTR(P$, v$(I)), nous analyserons :

INSTR(P$, LEFT$(v$(I), 4)) donc les 4 premières lettres du mot-clé.

LEN(< Chaîne >)

Donne le nombre de caractères de la chaîne.

UtilisationUne chaîne de caractères doit être stockée dans un fichier et la place maximale prévue est de 30 caractères. Si la chaîne à stocker A$ fait plus de 30 caractères (LEN(A$)>30), on stockera par exemple les 30 premiers caractères (LEFT$(A$, 30)) dans le fichier.
Autre utilisationDe même, on peut utiliser LEN pour tester la limite supérieure d'une chaîne

alphanumérique entrée au clavier, et, par exemple, interdire de dépasser une certaine limite dans un masque de saisie. Soit N cette limite.

100 B$ = " " 'Chaine lue
110 A$ = INKEY$:IF A$ = " " THEN 110 'Attente d'un caractere
120 PRINT A$; 'Lettre lue
130 B$ = B$+A$
140 IF LEN(B$) = N THEN 160 'Fin de lecture
150 GOTO 110
160 'Passage a un autre champ

Ligne 110 : Acquisition au clavier
Ligne 140 : Test sur la longueur de la saisie.
LOWER$(< Chaîne alphanumérique > )

Change dans une chaîne alphanumérique tous les caractères majuscules en caractères minuscules.

UtilisationSoit un ensemble de mots M$, et un mot m$ entre au clavier. Nous voulons savoir si m$ appartient à M$ en considérant que seul compte l'ordre des lettres du mot, et pas le fait qu'il soit écrit en majuscules ou en minuscules.

Si les mots de M$ sont écrits en minuscules, nous pourrons tester l'appartenance de m$ à M$ de la façon suivante :

Ainsi, l'utilisateur pourra taper son texte en CAPS LOCK (Majuscules) ou en CAPS UNLOCK (Minuscules) ; la comparaison n'en sera pas affectée.

Autre utilisationL'ordre LOWER facilite les tests du genre :

100 INPUT "Voulez-vous continuer (O/N) ";R$
110 IF R$ = "O" OR R$ = "o" THEN SUITE
120 IF R$="N" OR R$ = "n" THEN FIN
130 PRINT "Je ne comprends pas":GOTO 100

Ligne 110 : Test de la touche "O" avec et sans SHIFT.
Ligne 120 : Test de la touche "N" avec et sans SHIFT.

qui sera remplacé par :

100 INPUT "Voulez-vous continuer (O/N) ";R$
110 IF LOWER$(R$) = "o" THEN SUITE
120 IF LOWER$(R$) = "n" THEN FIN
130 PRINT "Je ne comprends pas": GOTO 100

Ligne 110 : Test de la touche « O ».
Ligne 120 : Test de la touche « N ».
MID$(< Chaîne >, < Nombre entier n1 >[, < Nombre entier n2>]).

Extrait une portion de chaîne à partir du caractère n1 jusqu'au caractère n2.

Remarque :

Cette fonction englobe les fonctions LEFT$ et RIGHT$.

En effet : MID$ (A$, 1, N) = LEFT$ (A$, N),
et MID$ (A$, LEN (A$)-N,N) = RIGHT$ (A$, N).

UtilisationExtraction d'une sous-chaîne B$ d'une chaîne A$.

Supposons que B$ soit encadrée d'astérisques. Le programme suivant réalise l'extraction de B$:

100 P1 = INSTR(A$,"*") 'Limite inférieure de B$
110 P2 = INSTR(P1 + 1, A$, "*") 'Limite supérieure de B$
120 C$ = MID$(A$, P1 +1, P2-P1 -1) 'Chaîne extraite

Ligne 120 : C$ est la première chaîne entre trouvée dans A$.
Autre utilisationExtraction de données numériques d'une chaîne alphanumérique du type :

« La hausse du pouvoir d'achat aura été de 0,4 % en septembre ».

100 FOR I=1 TO LEN(A$)
110 B$ = MID$(A$, I, 1 )
120 IF B$ = OR (B$ < AND B$> "/") THEN PRINT B$;
130 NEXT I

Ligne 120 : les caractères « : » et « / » encadrent les chiffres 0 et 9 dans la table des caractères ASCII.
RIGHT$(< Chaîne alphanumérique >, < Nombre entier N >)

Extrait les N caractères les plus à droite d'une chaîne alphanumérique.

UtilisationExtraction du dernier mot d'une chaîne.

Par exemple dans la saisie d'un fichier du personnel travaillant dans une société, les articles « Nom » et « Prénom » ne sont pas forcément dissociés. Pour accéder au nom d'une personne, il faudra alors dissocier nom et prénom.

Par exemple, pour l'article A$ « Prénom Nom », il faudra faire :

100 N = INSTR(A$, " ")
110 N$ = RIGHT$(A$, N + 1, LEN(A$)-N-1) 'Extraction

SPACE$(< Nombre entier N)

Permet d'afficher N blancs dans une instruction PRINT ou d'affecter N blancs à une chaîne de caractères complexe (Voir l'exemple donné dans CHR$).

Remarque :

Utiliser « SPACE$ » au-delà de 6 caractères pour optimiser la mémoire occupée par cet ordre.

UtilisationVous désirez centrer un titre sur la largeur de l'écran :

100 MODE 2:L = 80 'en MODE 2, 40 en MODE 1 et 20 en MODE 0
110 A$= "Texte a centrer"
120 LE = LEN(A$) 'Longueur du texte a centrer
130 PRINT SPACE$ ((80-LE)/2);A$ 'Affichage centre

Ligne 130 : Calcul du nombre d'espaces à afficher pour centrer le texte et affichage.
STR$( < Expression numérique > )

Convertit une donnée hexadécimale ou binaire en la même donnée exprimée en décimal.

UtilisationDans un utilitaire de mise au point de programmes assembleur (DEBUGGER), il peut être intéressant d'avoir de telles fonctions. Par exemple, dans le menu général, il peut y avoir une option « Changement de base ». Cette option activera le programme suivant :

1000 PRINT "Entrez le nombre Hexa. ou Bin. a convertir en Décimal"
1010 PRINT "sous la forme &nnnn en Hexa. et & x nnnnnnnn en Bin."
1020 INPUT "Nombre a convertir";N 1030 PRINT STR$(N); "en décimal. "

Ligne 1020 : Lecture du nombre à convertir.
Ligne 1030 : Conversion et affichage.
STRING$(< Nombre entier >, < Caractère >)

Affiche N fois le même caractère. Cette fonction est une extension de « SPACE$ » qui se contente d'afficher N blancs.

Effectivement, on a : STRING$(N,32) = SPACE$(N).

UtilisationPar exemple pour tracer un tableau, les lignes de commentaires et de valeurs pourront être séparées par «_» en utilisant PRINT STR$(Longueur tableau, "_").
UPPER$(< Chaîne Alphanumérique >)

Transforme les caractères minuscules d'une chaîne alphanumérique en caractères majuscules.

Remarque :

Cette fonction est l'inverse de LOWER$.

UtilisationVoir LOWER$.
VAL(< Chaîne de caractères >)

Fournit la valeur numérique des premiers caractères de la chaîne indiquée. Si le premier caractère de la chaîne n'est pas un chiffre, cette fonction renvoie 0.

Remarque :

Si le signe « - » ou « . » suivi d'un caractère non numérique apparaît en début de chaîne, le message d'erreur « Type Mismach » sera affiché à l'écran.

Exemples :

VAL("12 fois 10=120") = 12
et VAL(".12") produit une erreur « Type Mismach ».

Page précédente : 4/1.2.03 - Gestion de l'unité de cassette
Je participe au site:

» Vous avez remarqué une erreur dans ce texte ?
» Aidez-nous à améliorer cette page : en nous contactant via le forum ou par email.

CPCrulez[Content Management System] v8.732-desktop/c
Page créée en 598 millisecondes et consultée 1239 fois

L'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent  du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko.