imeys
Messages postés15Date d'inscriptionlundi 28 mars 2005StatutMembreDernière intervention11 mai 2006
-
27 avril 2006 à 17:38
florenth
Messages postés1023Date d'inscriptiondimanche 1 août 2004StatutMembreDernière intervention17 août 2008
-
8 mai 2006 à 20:48
bonjour, pouvez vous me dire comment je peux mélanger les lettre dd'un mot svp?
merci
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202234 28 avril 2006 à 22:09
alors
@Florenth : AAAH NON! deja que t'es pas souvent la, internet en moins c'est pas marrant!!!!
ben a dans une semaine alors.
sinon oui on peu se refaire le concours des perf! ça m'a toujours eclater ... surtout que j'ai bien progresser depuis RomanUtils.
@imeys :
alors ma fonction, comme celle de florenth s'utilise de cette façon :
label1.caption := RandomizeString('Bonjour');
ce qui afficheras dans Label1 le mots "Bonjour" tout melanger.
function RandomizeString(const S : String) : string;
var X, { X sert a la boucle FOR pour effectuer un certain nombre de passage }
L, { L sert a stocker la longeur de la chaine, en nombre de caracteres }
I1, I2 : integer; { I1 et I2 servent a stocker l'index des caracteres, ils sont definit
avec la fonction Random(L)+1 }
C : Char; { C sert a sauvegarder le caractere a l'index I1 pour eviter de le perdre
quand on swap les caracteres de position I1 et I2 }
begin
{ on place la chaine S dans le resultat de la fonction, toutes les fonctions
ont un retour qui est representé par la variable RESULT }
Result := S;
{ on sauvegarde la taille de la chaine dans L, la fonction Length permet de recuperer
la longeur de beaucoup d'elements }
L := Length(S);
{ on init I2 aleatoirement, random genere un nombre aleatoire entre 0 et (L-1)
tu peu t'interresser a la sources Bug Random de delphifr qui demontre un
bug de cette fonction (L-1) }
I2 := Random(L)+1;
{ on fait quelque passages, for est une boucle qui se traduit par :
pour X de 1 a L faire ...
La boucle for incremente (TO) ou decremente (DOWNTO) automatiquement la variable X }
for X := 1 to L do begin
{ on genere une position aleatoire dans la chaine pour I1 }
I1 := Random(L)+1;
{ pour eviter d'echanger la meme lettre, on control que les indexs I1 et I2
soient differents. Avec une boucle conditionnelle WHILE DO qui peut se traduire par :
Tant que (Condition) est vraie faire ... }
while I2 = I1 do
I2 := Random(L)+1;
{ ici on vas echanger la position de deux caracteres dans le mots. les deux caracteres
seront choisis de maniere aleatoire grace aux valeur I1 et I2 }
{ on sauvegarde le caractere de position I1 dans C }
C := Result[I1];
{ on place le caractere de position I2 a la position I1 }
Result[I1] := Result[I2];
{ enfin on place le caractere de position I1 (sauvegardé dans C) a la position I2 }
Result[I2] := C;
end; { fin de la boucle FOR }
end;
japee
Messages postés1727Date d'inscriptionvendredi 27 décembre 2002StatutModérateurDernière intervention 6 novembre 20218 6 mai 2006 à 17:32
Y'a pas sans doute pas grand chose qui change au niveau de l'utilisation que tu en fais, imeys.
Mais puisque nous avons une fonction (donc réutilisable dans d'autres applications), il s'agit avant tout d'en optimiser le code (surtout au niveau de la rapidité).
Il reste que le code de florenth, si tu fais bien attention, ne touche jamais au dernier caractère de ta chaîne, non ?
florenth
Messages postés1023Date d'inscriptiondimanche 1 août 2004StatutMembreDernière intervention17 août 20083 27 avril 2006 à 18:02
Tu écris simplement une fonction qui inverse aléatoirement deux lettres.
Per exemple
<hr size= "2" width="100%"> function MelangeMot(const M: string): string;
var I, Idx1, Idx2: Integer;
Temp: Char;
begin Randomize;
Result : = M;
for I := 1 to Length(M) do begin Idx1 : = RandomRange(1, Length(M));
Idx2 := RandomRange(1, Length(M));
Temp := Result[Idx1];
Result[Idx1] := Result[Idx2];
Result[Idx2] := Temp;
end;
end;
<hr size="2" width="100%">++
Si tu ne te plantes pas ......
tu ne pousseras jamais
florenth
Messages postés1023Date d'inscriptiondimanche 1 août 2004StatutMembreDernière intervention17 août 20083 27 avril 2006 à 18:13
Normalement cette fonction est directement utilisable.
Tu n'as qu'a faire un copier-coller jusqu'a ton unité (au tout début de la partie 'implementation') et tu peux t'en servir partout dans ton unité.
Je pense que tu le savias déjà mais je le reprécise au cas où car ta réponse me semble obscure.
Si tu ne te plantes pas ......
tu ne pousseras jamais
imeys
Messages postés15Date d'inscriptionlundi 28 mars 2005StatutMembreDernière intervention11 mai 2006 27 avril 2006 à 18:21
non je ne le savai pas, je pensais que je devais modifier les variable etant donnée que j'ai deja commencer mon code avec 5 mots différents.
Donc je pensais qu'il fallait l'ajuster par rapport au nom.
florenth
Messages postés1023Date d'inscriptiondimanche 1 août 2004StatutMembreDernière intervention17 août 20083 27 avril 2006 à 18:55
Dans ce cas, imeys, une petite révision s'impose :
Le guide Delphi
N'oublie pas d'ajouter "Math" dans la clause "uses". C'est une erreur fréquente.
Et n'oublie pas de cliquer sur "réponse acceptée" quand tu auras trouvé la réponse à ton problème.
++
Si tu ne te plantes pas ......
tu ne pousseras jamais
florenth
Messages postés1023Date d'inscriptiondimanche 1 août 2004StatutMembreDernière intervention17 août 20083 28 avril 2006 à 11:17
Pardon f0xi mais quelle est la différence entre a méthode et la mienne, à part que l'on ne peut pas échanger deux foisle même caractère ??
En même temps, je pense qu'il faut admettre pouvoir inverser la même lettre, sinon les mots seraient tout le temps trop mélangés. Bon j'arrive pas trop à m'exprimer sur ce coup-ci mais j'espère que tu auras compris.
Eh, dis, si on faisait un concours de la fonction la plus performante ? ça fait un moment qu'on en a pas fait.
(par contre, dès ce soir, j'ai plus Internet pour une bonne semaine au mons - va falloir se dépécher)
++
Si tu ne te plantes pas ......
tu ne pousseras jamais
imeys
Messages postés15Date d'inscriptionlundi 28 mars 2005StatutMembreDernière intervention11 mai 2006 28 avril 2006 à 20:40
FOXI peut tu m'expliquer tes variable stp?
Pour voir qu'elle variable est le mot.
Parce que aucun des deux ne fonctionne et jaimerai les modifier avec mes données en espérant qu'il tournera mais je ne comprend pas tes variable
imeys
Messages postés15Date d'inscriptionlundi 28 mars 2005StatutMembreDernière intervention11 mai 2006 28 avril 2006 à 22:12
ah impec je m'excuse de t'avoir fait faire tout cela mais faut bien débuter un jour et au moins je peux le modifier par rapport a celui que j'ai déjà commencé.
Je te remercie et donc je cloture cette discussion vu qu'elle me convient amplement.
japee
Messages postés1727Date d'inscriptionvendredi 27 décembre 2002StatutModérateurDernière intervention 6 novembre 20218 6 mai 2006 à 14:52
Les 2 méthodes sont effectivement très semblables.
Ce que je préfère dans l'approche à florenth :
- ben il a posté le premier, lol,
- la possibilité laissée qu'un char et lui même soient inversés, donc le string n'est pas mélangé cette fois là, après tout c'est le hasard...
- il n'a pas oublié d'initialiser avec Randomize, lui...
Ce que je préfère dans l'approche à fOxi :
- il ne recalcule pas à chaque fois la longueur du string,
- il utilise Random plutôt que RandomRange, non disponible sous D4, mais dont l'usage me paraît de toute manière superflu dans le contexte,
- il n'oublie pas d'ajouter +1 à Random(), comme il aurait fallu le faire avec RandomRange(), afin de ne pas oublier le dernier char, n'est-ce pas, florenth ?
Voilà, pour tout dire, ça m'avait inspiré ceci, qui est la synthèse de ce que je viens d'exprimer :
function RandomStr(const S: string): string;
var i,
Pos1, Pos2,
L: Integer;
Tmp: Char;
begin Randomize;
Result := S;
L := Length(S);
for i : = 1 to L do begin Pos1 := Random(L) + 1;
Pos2 := Random(L) + 1;
Tmp := Result[Pos1];
Result[Pos1] := Result[Pos2];
Result[Pos2] := Tmp;
end; end;
En attendant que la connexion de florenth soit rétablie...
florenth
Messages postés1023Date d'inscriptiondimanche 1 août 2004StatutMembreDernière intervention17 août 20083 8 mai 2006 à 20:48
He he, j'y pensais carrément plus au "bug" de RandomRange.
Mais, par contre, je ne recalcule pas à chaque fois la longueur de la chaine car Delphi, par son type 'string' réserve huit octets de mémoire supplémentaire par chaine pour stocker le nombre de caractères et le nombre d'occurences. Donc Length(S) n'est qu'un appel à une partie de la mémoire. C'est donc pas plus lent. Après, il y a peut être une différence (et il y en une) entre le temps d'acces à un registre et celui pour une partie de la mémoire ...
++
Si tu ne te plantes pas ......
tu ne pousseras jamais