1
pour la concaténation de chiffres et de lettres, si le nombre à concaténer est dans A et la chaine de caractères dans Str1 :

prgmNBSTR
: "123456789"->Str0
: If A!=0:Then
: int(log(A))+1->L
: While A!=0
: int(A/10^(L-1))->B
: A-B*10^(L-1)->A
: Str1+sub(Str0,B,1)->Str1
: L-1->L
: End
: Else
: Str1+"0"->Str1
: End


Et voila le travail !
Bien sûr, que pour les nombres entiers ! Mais on doit pouvoir appliquer ce m^me programme pour un nombre à virgule C :

: iPart(C)->A
: prgmNBSTR
: iPart(100(fPart(C))->A       //donc bien sûr, si on veut prendre 3 chiffres après la virgule, on met 1000, etc
: Str1+"."->Str1
: prgmNBSTR




Il faut bien sûr une chaine Str1 définie (avec par exemple "le nombre est "->Str1) ; et on aura donc la concaténation sur la Str1.
avatarloclamor
Mondo Photo
Le voyage en photo et en 1 clic
2
Euh j'ai pas compris, il sert à quoi ton prog ? (déjà) ((hu hu hu ^^))

Bon enfait l'essentiel dans ton prog c'est la transformation d'un nombre en une chaîne de caractères. La concaténation, ça fait une ligne (néanmoins je comprends pourquoi tu dis ça, parce-que une chaîne vide c'est pas possible, et donc il faut initialiser la chaîne qui reçoit le nombre, donc autant l'initialiser avec un truc utile).

Pour ceux qui ne savent pas (je sais que tu sais), il y a un truc idiot pour transformer un nombre en une chaîne, aves les LinReg. Mais c'est pas hyper rapide. Donc ton travail est légitime. Bien sûr, il faudra comparer les 2 méthodes, en différenciant peut-être les cas.

En ce qui concerne le code, les calculs pour extraire les chiffres sont bien à mon avis, mais bon il y a quelques simplifications à faire (en particulier si on veut que ce soit rapide). Ici la méthode que tu utilises est itérative (on transforme à chaque fois le A puis on le réutilise). Est-ce plus rapide quand c'est pas itératif ? --> trouver la formule pour extraire le n-ième chiffre d'un nombre --> voir un de mes posts. Peut-être que ta méthode est mieux, je sais pas. Ah et puis While + décrément = For.

Ah je reviens sur l'alternative à l'itératif (qu'on appelle euh explicite ?). Ca serait cool (mais peut-être moins rapide, j'en sais rien) si on pouvait faire ce que j'appelle un Ans continu. Look :

Si on est en explicite, pas la peine de modifier A. L est modifié dans le For. On peut arriver à ça :

For(L,_,_
Str1+sub(Str0,B=___,1->Str1
End

Donc ce que j'appelle le Ans continu, ça veut dire que ce qu'on construit par itération (ici Str1) n'est jamais stocké, et reste toujours dans le Ans.

Donc on pourrait faire :

Str1
For(L,_,_
Ans+sub(Str0,B=___,1
End
Ans->Str1

Faudrait faire des tests, ça pourrait peut-être marcher mieux surtout pour un grand nombre de tours.

Quant à la virgule, je vois pas trop l'intérêt, enfin tout dépend ce qu'on fait.
Ah tiens au fait, on n'a même pas parlé de l'intérêt du (dé)stockage entre nombre et chaîne !

Quel est l'intérêt de transformer un nombre en une chaîne ? Si tu me dis : si on le transforme en chaîne, on peut le concaténer ac une autre chaîne par le prog au-dessus, et donc on peut afficher du texte et des nombres accolés ; et ben ça marche pas puisqu'on peut déjà faire Text(0,0,"ABC3,32
Bon ok c'était un piège. Oué ça peut servir pour les Input, les Menu, et puis j'en trouve pas d'autres.

Et dans l'autre sens ? Ben étant donné qu'on peut mettre plus d'infos dans un nombre que dans une chaîne, ça me paraît être le sens le plus important.

Yiha !
3
tout ce que tu dis n'est pas faut, je modifierais peut être le prog en concéquence ce soir.
En attendant, voici une modification pour enlever certain bug...

: "0123456789"->Str0
: 0->/theta/
: If N!=int(N):Then
: round(10fPartN),0)->/theta/
: iPart(N)->N
: End
: Goto 0
: Lbl 1
: /theta/->N
: 0->/theta/
: Str1+"."->Str1
: Lbl 0
: If N!=0:Then
: int(log(N))+1->L
: While L!=0
: int(N/10^(L-1))->M
: N-M*10^(L-1)->N
: Str1+sub(Str0,M+1,1)->Str1
: L-1->L
: End
: Else
: Str1+"0"->Str1
: End
: If /theta/!=0:Goto 1


Le nombre entré est N, la chaine tjs Str1. Ne prend pour le moment que 1 seul chiffre après la virgule. Mais j'arrangerais tout ça ce soir je pense.

Bonne journées chers gens !
avatarloclamor
Mondo Photo
Le voyage en photo et en 1 clic
4
Sinon, sur Ticalc, des progs utilisant exactement le même principe existent déjà...
5
Bon j'y ai repensé today, et voilà ce que mon idée (pour le calcul explicite) a donné :

"0123456789->Str0
int(log(A->L
" 
For(N,-L,0
Ans+sub(Str0,1+10fPart(.1int(A10^(N))),1
End

Encore un prog !

Ah oui tiens c'est bien tu as mis un 0 dans Str0, j'allais te le faire remarquer ^^.

Je trouve l'histoire de la virgule auxiliaire, occupe-toi déjà du plus simple. Bon j'édite dès que j'ai fait un bon prog avec ton algo. edit : Here it is !

"0123456789->Str0
" ->Str1
int(log(A->L
For(N,L,0,-1
int(A10^(-L->B
A-Ans10^(L->A
Str1+sub(Str0,B+1,1->Str1
End

I want it now.

Peut-être qu'on peut l'améliorer localement (enlever le -1 du For et faire les modifs en conséquence ?). Ce qui gène un peu, c'est qu'on a 2 variables qui indiquent la fin de la boucle, A qui tend vers 0 et L aussi. Donc peut-être vaudrait-il mieux se ramener à une seule variable qui aurait les 2 rôles (quite à remettre un While ?).

Edit : Oups, j'ai négligé le post de gon. Bien sûr tu as raison il faudrait que je passe mon temps sur ticalc pour voir comment les autres font, après tout c'est comme ça qu'on apprend.