Comment reprogrammer la fonction strfry a partir dfe pointeur?

Comment reprogrammer la fonction strfry a partir dfe pointeur? - C - Programmation

Marsh Posté le 06-04-2005 à 22:49:45    

Bonsoir,
je bloque sur un exercice que je ne connais pas la solution :  
 
Ecrivez la fonction strfry qui crée un anagramme du contenu d'une chaine en utilisant la fonction rand pour échanger aléatoirement des caractères. La fonction renvoie un pointeur sur la chaine modifiée.
 
 
Je voulais ecrire une fontion qui renvoie une chaine de caracteres directement (l'anagramme), mais cela n'est pas possible. Je ne peux en effet, que renvoyer un caractere avec la fonction.
 
J'ai des petites idées mais je n'arrive pas a aller jusqu'au bout.
Ceci devrait être un jeu d'enfant pour vous?

Reply

Marsh Posté le 06-04-2005 à 22:49:45   

Reply

Marsh Posté le 06-04-2005 à 22:58:33    

en un mot : "char *"


---------------
NP: HTTP Error 764 Stupid coder found
Reply

Marsh Posté le 06-04-2005 à 23:05:21    

Alors la, cela m'avance pas du tout

Reply

Marsh Posté le 06-04-2005 à 23:08:41    

Code :
  1. char *anagrammeadeuxfrancs(const char *src) {
  2.   char *res = strdup(src);
  3.   int i;
  4.   int max =strlen(res);
  5.   for (i=0;i<10000;i++) {
  6.     int a = rand()%max;
  7.     int b = rand()%max;
  8.     char tmp = res[a];
  9.     res[a] = res[b];
  10.     res[b] = tmp;
  11.   }
  12.   return res;
  13. }


 
 
note aux chieurs de progra : oui mon rand est pourri paske bits de poids faible toussa, et oui je m'en fous


---------------
NP: HTTP Error 764 Stupid coder found
Reply

Marsh Posté le 06-04-2005 à 23:52:42    

chrisbk a écrit :

Code :
  1. char *anagrammeadeuxfrancs(const char *src) {
  2.   char *res = strdup(src);
  3.   int i;
  4.   int max =strlen(res);
  5.   for (i=0;i<10000;i++) {
  6.     int a = rand()%max;
  7.     int b = rand()%max;
  8.     char tmp = res[a];
  9.     res[a] = res[b];
  10.     res[b] = tmp;
  11.   }
  12.   return res;
  13. }


]


 
je n'arrive pas trop a comprendre la premiere ligne :  

Code :
  1. char *anag(const char *src)


 
 
anag contient donc un caractere?

Reply

Marsh Posté le 07-04-2005 à 00:03:35    

chrisbk a écrit :

Code :
  1. char *anagrammeadeuxfrancs(const char *src) {
  2.   char *res = strdup(src);
  3.   int i;
  4.   int max =strlen(res);
  5.   for (i=0;i<10000;i++) {
  6.     int a = rand()%max;
  7.     int b = rand()%max;
  8.     char tmp = res[a];
  9.     res[a] = res[b];
  10.     res[b] = tmp;
  11.   }
  12.   return res;
  13. }


 
 
note aux chieurs de progra : oui mon rand est pourri paske bits de poids faible toussa, et oui je m'en fous



#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <stdio.h>
 
char *str_dup (char const *const s)
{
   char *s_dup = NULL;
 
   if (s != NULL)
   {
      size_t const size = strlen (s) + 1;
 
      s_dup = malloc (size);
 
      if (s_dup != NULL)
      {
         memcpy (s_dup, s, size);
      }
   }
   return s_dup;
}
 
char *anagrammeadeuxfrancs (const char *const src)
{
   char *const res = str_dup (src);
   
   if (res != NULL)
   {
      int i;
      int const max = strlen (res);
 
      for (i = 0; i < 10000; i++)
      {
         int a = rand () % max;
         int b = rand () % max;
         int tmp = res[a];
 
         res[a] = res[b];
         res[b] = tmp;
      }
   }
   return res;
}
 
int main (void)
{
   srand ((unsigned) time (NULL));
   {
      char *s = anagrammeadeuxfrancs ("Hello world" );
 
      if (s != NULL)
      {
         printf ("'%s'\n", s);
         free (s), s = NULL;
      }
   }
   return 0;
}


---------------
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 07-04-2005 à 00:13:06    

zaynyy a écrit :

je n'arrive pas trop a comprendre la premiere ligne :  

Code :
  1. char *anag(const char *src)


 
anag contient donc un caractere?


anag() est une fonction. Comme tu as dû l'apprendre dans tes cours de C, une fonction peut  

  • ne rien renvoyer (void)
  • renvoyer une valeur.  

Dans ce cas, on précise le type de la valeur retournée. Comme ici, on veut retourner une chaine de caractères (qui, rappelons le est un tableau de char terminé par un 0) et qu'on ne sait pas retourner un tableau mais seulement l'adresse de son premier élément, on utilise un type 'oiinteur sur char' (char*).

  • 'pointeur', parce que c'est le type qui est fait pour contenir une valeur représentant une adresse.
  • 'sur char', car le type des éléments du tableau est char, puis que c'est une chaine de caractères.


continue à poser des questions... mais n'oublie pas de relire tes cours et d'ouvrir ton livre de C...
 
Quelques révisions :
 
http://mapage.noos.fr/emdel/init_c.htm


Message édité par Emmanuel Delahaye le 07-04-2005 à 00:13:57

---------------
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 07-04-2005 à 00:32:33    


tu vois ! c'est exactement ça ! le concours de l'indentation la plus profonde !
 
:P

Reply

Marsh Posté le 07-04-2005 à 00:50:29    

N'empeche que c'est propre et ca sent pas le truc fait à l'arrache à la chrisbéka :)


---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 07-04-2005 à 05:18:58    

Niveau algo je ferais plutôt ça :

Code :
  1. char *
  2. strfry(const char *in)
  3. {
  4.         char *out;
  5.         int i;
  6.         i = strlen(in) + 1;
  7.         out = malloc(i);
  8.         if (out == NULL) {
  9.                 perror("malloc" );
  10.                 return NULL;
  11.         }
  12.         memcpy(out, in, i);
  13.         i--;
  14.         while (i != 0) {
  15.                 int j;
  16.                 char c;
  17.                 j = rand() % i;
  18.                 i--;
  19.                 c = out[i];
  20.                 out[i] = out[j];
  21.                 out[j] = c;
  22.         }
  23.         return out;
  24. }

Reply

Marsh Posté le 07-04-2005 à 05:18:58   

Reply

Marsh Posté le 07-04-2005 à 08:14:12    

matafan a écrit :

Niveau algo je ferais plutôt ça :

Code :
  1. char *
  2. strfry(const char *in)
  3. {
  4.         char *out;
  5.         int i;
  6.         i = strlen(in) + 1;
  7.         out = malloc(i);
  8.         if (out == NULL) {
  9.                 perror("malloc" );
  10.                 return NULL;
  11.         }
  12.         memcpy(out, in, i);
  13.         i--;
  14.         while (i != 0) {
  15.                 int j;
  16.                 char c;
  17.                 j = rand() % i;
  18.                 i--;
  19.                 c = out[i];
  20.                 out[i] = out[j];
  21.                 out[j] = c;
  22.         }
  23.         return out;
  24. }



 
 
C'est clair. A croire qu'en Charentes on leur apprend ni le C, ni l'algo, ni les systèmes UNIX, ni à utiliser proprement les générateurs pseudo-aléatoires congruentiels linéaires. Mais qu'apprennent-ils donc ?

Reply

Marsh Posté le 07-04-2005 à 08:34:38    

Chronoklazm a écrit :

N'empeche que c'est propre et ca sent pas le truc fait à l'arrache à la chrisbéka :)


 
 
j'expliquais un concept, hein, jfaisais pas un tp qu'on pouvait directement mailer au prof [:moule_bite]


---------------
NP: HTTP Error 764 Stupid coder found
Reply

Marsh Posté le 07-04-2005 à 08:36:47    

Lam's a écrit :

C'est clair. A croire qu'en Charentes on leur apprend ni le C, ni l'algo, ni les systèmes UNIX, ni à utiliser proprement les générateurs pseudo-aléatoires congruentiels linéaires. Mais qu'apprennent-ils donc ?


 
hé ho hein  ? [:mlc]
 
j'ai pas fait mes etuds en charentes [:thalis]
 
(et je rapelle que sous mon code il y avait une petite note, vous avez du tous oublier de la lire :o)


---------------
NP: HTTP Error 764 Stupid coder found
Reply

Marsh Posté le 07-04-2005 à 08:41:57    

chrisbk a écrit :

hé ho hein  ? [:mlc]
 
j'ai pas fait mes etuds en charentes [:thalis]
 
(et je rapelle que sous mon code il y avait une petite note, vous avez du tous oublier de la lire :o)


En vrai, je pense que tout le monde s'attendait à ce que tu nous fasse un jeu de mots pourri sur les stir-fries.
http://www.kwrestaurants.com/menu/countryboy/images/stirfry.jpg
On est un peu déçus quoi.

Reply

Marsh Posté le 07-04-2005 à 08:45:06    

Taz a écrit :

tu vois ! c'est exactement ça ! le concours de l'indentation la plus profonde !
 
:P


Bah, mon indenteur est reglé à trois. Tu peux regler le tien à 2 ou 1 si tu veux...  
 


---------------
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 07-04-2005 à 09:26:04    

Emmanuel Delahaye a écrit :

Bah, mon indenteur est reglé à trois. Tu peux regler le tien à 2 ou 1 si tu veux...


non, en fait je parle de ton style qui consiste à n'utiliser ni return, ni continue et à vouloir scoper tes variables le plus finement possible. Pour les variables je comprends, mais en C89, ça fait drôlement ****** quand même.

Reply

Marsh Posté le 07-04-2005 à 09:32:32    

Taz a écrit :

non, en fait je parle de ton style qui consiste à n'utiliser ni return, ni continue et à vouloir scoper tes variables le plus finement possible. Pour les variables je comprends, mais en C89, ça fait drôlement ****** quand même.


Ah, la réduction de la portée... C'est une façon de préparer le code à la modularisation. Ca permet de visualiser les entités fonctionnelles. Ca aide aussi à la compréhension du code. C'est vrai que ça ajoute quelques niveaux de {}, mais est-ce vraiment gènant ?
 
Quand au return unique, c'est plus clair et ça évite les sorties sauvages avec oubli de libération de ressource (allocation, fichier ...), ou valeur de retour non initialisée... Ca simplifie aussi la mise au point sous émulateur...


Message édité par Emmanuel Delahaye le 07-04-2005 à 09:35:04

---------------
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 07-04-2005 à 09:36:39    

Emmanuel Delahaye a écrit :

Ah, la réduction de la portée... C'est une façon de préparer le code à la modularisation. Ca permet de visualser les entités fonctionelles. Ca aide aussi à la compréhension du code. C'est vrai que ça ajoute quelques nievaux de {}, mais est-ce vraiment gènant ?


 
la dessus je suis d'accord. De plus, les fonctions avec de gros paté de variable au début, je trouve ca particulierement laid et freine la comprehension du code
 

Emmanuel Delahaye a écrit :


Quand au return unique, c'est plus clair et ça évite les sorties sauvages avec oubli de libération de ressource (allocation, fichier ...), ou valeur de retour non initialisée... Ca simplifie aussi la mise au point sous émulateur...


 
la dessus je suis moins d'accord, le return unique oblige a rajouter du if/else un peu partout, rendant le code plus touffu. Pour la libération de ressources, j'avoue sans honte que pour ca je place de tps en tps un fin goto des familles
 

Code :
  1. if (machin == PASBON)
  2.    goto fin;
  3. ...
  4. fin:
  5.   free(bidule);
  6.   free(roger);


 
 
 
 


---------------
NP: HTTP Error 764 Stupid coder found
Reply

Marsh Posté le 07-04-2005 à 09:56:24    

le gros paté non, mais quand même, soit tu te trouves un compilo C99, soit tu fais un compromis ... parce que sinon, on peut la faire comme en scheme avec un let, et ouvrir un contexte par variable ...

Reply

Marsh Posté le 07-04-2005 à 10:30:13    

Taz a écrit :

le gros paté non, mais quand même, soit tu te trouves un compilo C99, soit tu fais un compromis ... parce que sinon, on peut la faire comme en scheme avec un let, et ouvrir un contexte par variable ...


 
bin pour le coup on est pas en C99 donc ca regle le pb [:petrus75] et bon, sur l'appli on a du vieux code qui traine, et parfois, heuh, on a des, disons, surprises [:petrus75]


---------------
NP: HTTP Error 764 Stupid coder found
Reply

Sujets relatifs:

Leave a Replay

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