1

Salut à tous !!

Je viens poster car j'ai un petit soucis dans mon programme en Basic.

Alors voilà, par exemple j'ai cette string : "235y56" et j'aimerais connaître la position du "y" dans la string (qui est donc 4). Je n'ai pas trouvé de technique simple si ce n'ai de mettre chacun des caractères dans une liste (par ex : {"2","3","5","y","5","6"}) et là c'est beaucoup plus lourd à gérer.

Merci d'avance pour vos lumières wink

@++ Ip2x
IP2X

2

j'ai la flemme de cherche mais il doit y avoir une fonction instr(botteDeFoin,aiguille,numCaractereDepart) ou un truc comme ça

3

Ah oui en effet c'est la fonction qu'il me faut, mais mon 2eme soucis est que j'aimerais sortir 2 string : l'une avec "235" et l'autre avec "56", enfin une fonction qui me permet de récupérer n'importe quelle partie de la string avec un début et une fin que je choisi.

J'espère ne pas être trop confus^^

Merci encore
IP2X

4

substr?
avatar
la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.

5

Il existe SubMat pour les matrices, mais je ne trouve pas subStr !
IP2X

6

regarde plutot les fonctions Mid, Left et Right
avatar

7

pour trouver le rang c'est instring(chaine,chaine_a_trouver)
mais ça s'arrête à la 1ère occurence de chaine_a_trouver

mid(chaine,debut,nbre) pour extraire nbre caractères de chaine à partir de debut

Sinon tu peux faire une fonction :
search(str,substr)
Func
//str = chaine
//substr = chaine à trouver

Local len,temp,pos  //len = taille de substr, la chaine à trouver, temp = variable temporaire
{}->pos                  //pos = liste de sortie qui contient toutes les positions où substr apparait

dim(substr)->len
For temp,1,dim(str)-len
    If mid(str,temp,len)=substr
        augment(pos,{temp})->pos      
EndFor
pos
EndFunc


Voilà, sûrement moyen de l'optimiser, c'est en tout cas une façon de faire (enfin, en principe ça devrait marcher, j'ai pas testé ^^)
programmeur sur TI ^^

mon blog sur les TI => clic

mon (p'tit) fofo sur les TI => clic

8

En règle générale il faut éviter de mettre une expression complexe dans l'une des bornes d'un "for" : ici, ton "dim(str)-len" est recalculé à chaque tour de boucle. Aussi, une petite particularité du Ti-Basic, de mémoire "temp->pos[dim(pos)+1]" est plus rapide que ton appel à augment.
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

9


Aussi, une petite particularité du Ti-Basic, de mémoire "temp->pos[dim(pos)+1]" est plus rapide que ton appel à augment.


mais ça fait une erreur de dimension non ?

En règle générale il faut éviter de mettre une expression complexe dans l'une des bornes d'un "for" : ici, ton "dim(str)-len" est recalculé à chaque tour de boucle.


Exact. Donc :
search(str,substr) 
Func 
//str = chaine 
//substr = chaine à trouver 
 
Local len,temp,pos,len2  //len = taille de substr, la chaine à trouver, temp = variable temporaire 
{}->pos                         //pos = liste de sortie qui contient toutes les positions où substr apparait 
 
dim(substr)->len 
dim(str)-len->len2
For temp,1,len2
    If mid(str,temp,len)=substr 
        augment(pos,{temp})->pos       
EndFor 
pos 
EndFunc


programmeur sur TI ^^

mon blog sur les TI => clic

mon (p'tit) fofo sur les TI => clic

10

Un truc du genre serait mieux je pense :
search(str,substr)
Func
  Local n,list
  1->n
  {}->list
  Loop
    inString(str,substr,n)->n
    If n=0
      Return list
    n->list[dim(list)+1]
    n+1->n
  EndLoop
EndFunc

En plus mieux bien ca donne :
search(str,substr)
Func
  Local n,list
  {}->list
  inString(str,substr)->n
  While n!=0
    n->list[dim(list)+1]
    inString(str,substr,n+1)->n
  EndWhile
  list
EndFunc

Avec != pour différent de

Après faut voir avec ce qu'il veut exactement !

edit : renommé l en list pour la lisibilité
Visitez mon site : http://www.bobti89.fr.st
Testez mon forum ici

11

tama (./9) :
mais ça fait une erreur de dimension non ?

non
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

12

bobti89 (./10) :
Un truc du genre serait mieux je pense :
search(str,substr)
Func
  Local n,list
  1->n
  {}->list
  Loop
    inString(str,substr,n)->n
    If n=0
      Return list
    n->list[dim(list)+1]
    n+1->n
  EndLoop
EndFunc

En plus mieux bien ca donne :
search(str,substr)
Func
  Local n,list
  {}->list
  inString(str,substr)->n
  While n!=0
    n->list[dim(list)+1]
    inString(str,substr,n+1)->n
  EndWhile
  list
EndFunc

Avec != pour différent de

Après faut voir avec ce qu'il veut exactement !

edit : renommé l en list pour la lisibilité


on peut faire mieux encore :

search(str,substr)
Func
  Local n,list,i
  {}->list
  0->i
  1->n
  While n!=0
    inString(str,substr,n)->n
    if n != 0 then
      i+1->i
      n->list[i]
      n+1->n
   endif
  EndWhile
  return list
EndFunc

13

14

Tiens ça me fait penser à une question qui diverge un peu du sujet mais qui ne mérite pas son propre topic : est-ce qu'il existe une solution élégante et générique (pas limitée au Ti-Basic) pour le genre de problème qu'on voit dans le post ./12, à savoir :

test = true

while (test)
{
    test = expression

    if (test)
    {
        ...
    }
}

On peut dans certains cas et pour certains langages (C par exemple) déplacer l'affectation dans le while, mais pour peu qu'elle soit un peu longue c'est assez laid, et dans d'autres langages ça n'est pas toujours possible. Du coup, comment réécrire ce bout de code pour éviter deux tests consécutifs sur la même variable (vu que durant l'exécution, ces deux tests seront toujours égaux sauf au dernier tour de boucle, donc ça bouffe pas mal de temps pour pas grand chose).

On peut parfois remplacer "test = true" par "test = expression", et déplacer la deuxième affectation tout en bas de la boucle ce qui permet d'éliminer le "if", mais ça n'est intéressant que si "expression" est courte sinon ça duplique un gros paquet de code.
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

15

Peut-etre comme ca:
test = expression

while (test)
{

    {
        ...
    }

    test = expression;
}


Non?
N/A

16

cf dernière phrase de mon post ^^
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

17

ok, j'ai pas fais attention ^^
N/A

18

C'est pour ça que do { ... } while (toto); existe en C.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

19

Ça n'est pas équivalent, avec un do/while le 1er tour de boucle sera toujours effectué avant même d'avoir testé la condition. Et ajouter un "if" devant revient à écrire deux fois la condition, donc on retombe sur le même problème.
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

20

test = true;
 
while (test) 
{ 
    test = expression;
 
    if (test) 
    { 
        ... 
    } 
}

est strictement équivalent à
do
{ 
    test = expression;
 
    if (test) 
    { 
        ... 
    } 
}
while (test);

!
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

21

c'est une boucle 'exit when' qui existe en ada mais pas dans les autres langages:

loop
  machin
  exit when condition;
  chose
end loop


en C je pense qu'on doit faire comme ./14

22

./20 : ah oui, sauf que là tu ne changes rien au problème, "test" est toujours testé deux fois par tour de boucle, comme dans le post ./14

en copiant le système d'Ada du post ./21 (je ne connais pas), on peut faire ça :

while (1)
{ 
    test = expression 
 
    if (!test)
        break;

    ... 
}

mais c'est pas super élégant je trouve (même si ça reste la moins pire des solutions pour l'instant)
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

23

24

Moui enfin c'est pas franchement générique comme solution, un truc qui ne fonctionne qu'en assembleur (ou pire, que dans un seul assembleur), ça ne m'intéresse pas du tout ^^
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

25

26

ben si, mais le compilo va s'en servir pour générer des valeurs ==0 ou pas dans des registres.

27

Normalement, GCC est suffisamment malin pour éviter de faire le test 2 fois (et aussi pour reconnaître que le test à la première itération est redondant dans la première variante). Là où ce genre de trucs peuvent devenir lourds, c'est en un langage interprété comme le TI-BASIC.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

28

Zephyr (./22) :
./20 : ah oui, sauf que là tu ne changes rien au problème, "test" est toujours testé deux fois par tour de boucle, comme dans le post ./14

en copiant le système d'Ada du post ./21 (je ne connais pas), on peut faire ça :

while (1)
{ 
    test = expression 
 
    if (!test)
        break;

    ... 
}

mais c'est pas super élégant je trouve (même si ça reste la moins pire des solutions pour l'instant)

Je vois pas très bien ce que tu voudrais, si j'ai bien compris ton problème "expression" peut contenir des instructions séparées, donc tu es obligé de le mettre dans un bloc. Mais évidemment ce bloc ne peut pas être le même que celui où tu as les "...", donc il faut deux blocs différents. Donc on peut soit les juxtaposer (ce que tu fais dans le post que je cite), soit mettre le 2è bloc à un niveau inférieur (dans un if), mais on ne peut pas éliminer cette distinction.

A part le if une structure de contrôle ne relie jamais deux blocs différents, donc je vois même pas comment tu pourrais faire un langage qui gère ça plus élégamment que ./22 ^^ A part rajouter une commande spéciale pour l'idiome "if (cond) break;", genre
while {
    test = expression
} andwhile (test) {
    ...
}

mais c'est vraiment super moche grin

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

29

pas faux (mais le andwhile serait super classe quand même grin)
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)