Page 1 sur 3

Trouver lettre dans chaine

Message non luPosté: 25 Fév 2015, 18:35
de PiR
Bonjour,
Voici mon problème, j'ai un programme convertisseur de base et j'aimerais que quand je tapes un mot comme BONJOUR le prgm me dise qu'il est en base 29.
En gros qu'il cherche la lettre dans le mot qui est la plus loin dans l'alphabet (ici le u).
Comment faire ça ?
Merci d'avance

PS: le prgm de base est celui d'Openclassrooms (http://openclassrooms.com/courses/appre ... r-de-bases)

Re: Trouver lettre dans chaine

Message non luPosté: 25 Fév 2015, 18:42
de Adriweb
Un algorithme naïf :
  • Tu crées une chaine contenant tout l'alphabet.
  • Pour chaque lettre de l'alphabet, tu regardes ce que donne la commande inString sur ta chaîne originale (elle donne la position d'une sous-chaîne)
  • Tu arrête ta boucle quand la commande retournera 0 (sous-chaîne non trouvée), donc la lettre la plus loin dans l'alphabet sera celle juste avant.

Re: Trouver lettre dans chaine

Message non luPosté: 25 Fév 2015, 18:43
de PiR
Ah oui, je n'y avais pas pensé merci :)

Re: Trouver lettre dans chaine

Message non luPosté: 25 Fév 2015, 18:44
de Adriweb
Tu peux même commencer la recherche à l'envers, d'ailleurs, ça ira plus vite :)

Re: Trouver lettre dans chaine

Message non luPosté: 25 Fév 2015, 18:49
de critor
Un peu meilleur en complexité:
Parcours ta chaîne à l'aide d'une boucle 'pour' ('for' sur la calculatrice), teste chaque caractère et garde la valeur la plus élevée.

Pour connaître la longueur de la chaîne, tu utilises l'instruction 'longueur('.
Pour récupérer un caractère de la chaîne, tu utilises l'instruction 'sous-Chaîne('.

Re: Trouver lettre dans chaine

Message non luPosté: 25 Fév 2015, 18:56
de PiR
Super merci

Re: Trouver lettre dans chaine

Message non luPosté: 25 Fév 2015, 18:57
de Adriweb
La sous-chaine est lettre par lettre ce que tu veux regarder, donc avec la commande sub : http://tibasicdev.wikidot.com/sub

@Critor :
Ca aurait été ma proposition, mais il n'y a apparemment pas de ord() ou chr() sur z80 :(
(cf http://tibasicdev.wikidot.com/strings)

Re: Trouver lettre dans chaine

Message non luPosté: 25 Fév 2015, 22:21
de grosged
Autre façon de faire, ...plus "tordue" héhé ! :
On n'utilise plus de chaîne mais uniquement des variables, en l'occurence les 26 lettres de l'alphabet (rien que ça!)
avec A=10, B=11 ....jusqu'à Z=35
(je me base sur le fait que A en hexadécimal vaut 10 dans notre base ordinaire)
Code: Tout sélectionner
11→B
19→J
23→N
24→O
27→R
30→U
"BONJOUR→Str1
0
For(θ,1,length(Str1
max(Ans,expr(sub(Str1,θ,1
End
Ans+1→θ                  ;  BASE

Re: Trouver lettre dans chaine

Message non luPosté: 25 Fév 2015, 22:58
de PiR
Merci, je vais quand même garder la méthode avec les chaines par contre je ne sais pas comment dire que le C est après le B dans l'alphabet

Re: Trouver lettre dans chaine

Message non luPosté: 26 Fév 2015, 08:30
de grosged
Comme l'ont mentionné Adriweb & Critor,

on le saura grâce à sa position dans cette chaîne:
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"

Et c'est l'instruction inString(chaîne,sous-chaîne,position d'où démarrera la recherche )
qui va faire le boulot (à noter qu'on peut se passer du dernier paramètre si l'on veut scruter depuis le début de la chaîne)

Ex:
Code: Tout sélectionner
inString("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ","C"

nous donnera la valeur 13


Et l'on aura recours à l'instruction sub(chaîne,position,longueur ) pour extirper un caractère (ou plus) d'une chaîne

Ex:
Code: Tout sélectionner
sub("SAPERLIPOPETTE",6,1

nous donnera le caractère L