Selection de caracteres de facon aleatoire

Selection de caracteres de facon aleatoire - C - Programmation

Marsh Posté le 01-02-2005 à 01:02:10    

Bonjour,
 
 
je voudrais faire un petit prog qui melange les lettres d'un mot que je lui passe en argument ou bien que je definis dans le main.
 
int main()
{
 char *str = "essai";
 char *tmp;
 int i = 0;
 
 while (i != 5)
  {
    tmp[i] = str[i];
    putchar(tmp[i]);
    i++;
  }
 return (0);
}
 
 
Bon la je vous l'accorde il fait pas grand chose le prog, je voudrais juste qu'il me sorte le mot "essai" avec les lettres melangees, et qu'a chaque lancement du prog les lettres soient dans un ordre different. Vous voyez ? La je vois pas trop comment faire sinon un read sur un fichier et en utilisant random apres mais ca parait long pour pas grand chose!
 
Merci d'avance.


---------------
~ Msi z790 Gaming Plus Wifi | i9-12900K + Dark Rock Pro4 | 64Go G-Skill DDR4 4800 | RTX 3080 Ti
Reply

Marsh Posté le 01-02-2005 à 01:02:10   

Reply

Marsh Posté le 01-02-2005 à 02:43:02    

Tonio94 a écrit :

Bonjour,
 
 
je voudrais faire un petit prog qui melange les lettres d'un mot que je lui passe en argument ou bien que je definis dans le main.
 
int main()
{
 char *str = "essai";
 char *tmp;
 int i = 0;
 
 while (i != 5)
  {
    tmp[i] = str[i];
    putchar(tmp[i]);
    i++;
  }
 return (0);
}
 
 
Bon la je vous l'accorde il fait pas grand chose le prog, je voudrais juste qu'il me sorte le mot "essai" avec les lettres melangees, et qu'a chaque lancement du prog les lettres soient dans un ordre different. Vous voyez ? La je vois pas trop comment faire sinon un read sur un fichier et en utilisant random apres mais ca parait long pour pas grand chose!
 
Merci d'avance.


non seulement il ne fait pas grand chose mais en + il est susceptible de planter ton prog :D
Lorsque tu fais tmp[i] = str[i]; tu n'a alloué aucune mémoire derrière tmp, donc tu écris dans une zone mémoire où tu n'as pas lieu d'être :)
passe un coup de malloc.
 
Ceci dit je me trompe peut être, n'étant pas un pro moi même :p veuillez me corriger si tel est le cas.
 
 

Reply

Marsh Posté le 01-02-2005 à 02:51:22    

C'est peut etre pas tres propre mais ca fonctionne ;) Mais la n'est pas le pb, j'aurais pu me passer de mettre ce bout de code vu son utilite ^^


---------------
~ Msi z790 Gaming Plus Wifi | i9-12900K + Dark Rock Pro4 | 64Go G-Skill DDR4 4800 | RTX 3080 Ti
Reply

Marsh Posté le 01-02-2005 à 03:31:57    

Tonio94 a écrit :

C'est peut etre pas tres propre mais ca fonctionne 9 fois sur 10 car pas de réservation de mémoire ;) Mais la n'est pas le pb, j'aurais pu me passer de mettre ce bout de code vu son utilite ^^


Reply

Marsh Posté le 01-02-2005 à 05:04:36    

Ca revient à un tirage aléatoire sans remise entre 0 et strlen(str). Fait une recherche, c'est un des classiques du forum.

Reply

Marsh Posté le 01-02-2005 à 08:29:29    

Tonio94 a écrit :


je voudrais faire un petit prog qui melange les lettres d'un mot que je lui passe en argument ou bien que je definis dans le main.


- La chaine S doit être modifiable (tableau de char)
- Tirer un nombre A entre 0 et N-1 (N est la longueur de la chaine)
- Tirer un nombre B entre 0 et N-1 different de A
- Inverser les contenus de S[A] et S[B]
- Faire ça autant de fois que nécessaire (au minimum N/2 fois, je dirais...)
C'est une sorte de tri bulle, mais à l'envers...


Message édité par Emmanuel Delahaye le 01-02-2005 à 08:30:11

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 01-02-2005 à 09:01:31    

Emmanuel Delahaye a écrit :

- La chaine S doit être modifiable (tableau de char)
- Tirer un nombre A entre 0 et N-1 (N est la longueur de la chaine)
- Tirer un nombre B entre 0 et N-1 different de A
- Inverser les contenus de S[A] et S[B]
- Faire ça autant de fois que nécessaire (au minimum N/2 fois, je dirais...)
C'est une sorte de tri bulle, mais à l'envers...


Il est préférable de faire aller A de 0 à N-1, tout simplement. Cela garantit que chaque lettre sera "potentiellement" déplacée. Et cela permet d'être sûr de converger avec un nombre d'itération connu et fixe.
 

Reply

Marsh Posté le 01-02-2005 à 13:32:31    

intervertit ces deux lignes :  
 
 
char *str = "essai";
char *tmp;  
 
et affiche les valeurs. on verra si ça fonctionne toujours


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

Marsh Posté le 01-02-2005 à 23:10:15    

Merci pour vos reponses je vais essayer avec l'explication de Manu ^^


---------------
~ Msi z790 Gaming Plus Wifi | i9-12900K + Dark Rock Pro4 | 64Go G-Skill DDR4 4800 | RTX 3080 Ti
Reply

Marsh Posté le 02-02-2005 à 01:01:05    

Elle est bidon son explication, essaie plutôt celle de Lam's : tu prends i = strlen(str) - 1, tu tires un nombre j entre 0 et i, tu echanges str[i] et str[j], j-- et tu recommence.

Reply

Marsh Posté le 02-02-2005 à 01:01:05   

Reply

Marsh Posté le 02-02-2005 à 03:42:40    

ok je vais voir ca, j'ai pas encore eu le temps depuis. Merci.


---------------
~ Msi z790 Gaming Plus Wifi | i9-12900K + Dark Rock Pro4 | 64Go G-Skill DDR4 4800 | RTX 3080 Ti
Reply

Marsh Posté le 02-02-2005 à 08:28:02    

matafan a écrit :

Elle est bidon son explication<...>


Bidon, faudrait peut être pas exagérer... Améliorable, oui, et je ne l'ai pas contesté.


Message édité par Emmanuel Delahaye le 02-02-2005 à 08:28:28

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 02-02-2005 à 17:07:19    

Desole j'avais oublie le smiley :D

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed