Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2651 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Comment reprogrammer la fonction strfry a partir dfe pointeur?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Comment reprogrammer la fonction strfry a partir dfe pointeur?

n°1038185
zaynyy
Posté le 06-04-2005 à 22:49:45  profilanswer
 

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?

mood
Publicité
Posté le 06-04-2005 à 22:49:45  profilanswer
 

n°1038195
chrisbk
-
Posté le 06-04-2005 à 22:58:33  profilanswer
 

en un mot : "char *"


---------------
NP: HTTP Error 764 Stupid coder found
n°1038206
zaynyy
Posté le 06-04-2005 à 23:05:21  profilanswer
 

Alors la, cela m'avance pas du tout

n°1038208
chrisbk
-
Posté le 06-04-2005 à 23:08:41  profilanswer
 

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
n°1038251
zaynyy
Posté le 06-04-2005 à 23:52:42  profilanswer
 

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?

n°1038255
Emmanuel D​elahaye
C is a sharp tool
Posté le 07-04-2005 à 00:03:35  profilanswer
 

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/
n°1038268
Emmanuel D​elahaye
C is a sharp tool
Posté le 07-04-2005 à 00:13:06  profilanswer
 

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/
n°1038290
Taz
bisounours-codeur
Posté le 07-04-2005 à 00:32:33  profilanswer
 


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

n°1038310
Chronoklaz​m
Posté le 07-04-2005 à 00:50:29  profilanswer
 

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 !
n°1038372
matafan
Posté le 07-04-2005 à 05:18:58  profilanswer
 

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. }

mood
Publicité
Posté le 07-04-2005 à 05:18:58  profilanswer
 

n°1038398
Lam's
Profil: bas.
Posté le 07-04-2005 à 08:14:12  profilanswer
 

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 ?

n°1038422
chrisbk
-
Posté le 07-04-2005 à 08:34:38  profilanswer
 

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
n°1038423
chrisbk
-
Posté le 07-04-2005 à 08:36:47  profilanswer
 

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
n°1038428
Lam's
Profil: bas.
Posté le 07-04-2005 à 08:41:57  profilanswer
 

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.

n°1038431
Emmanuel D​elahaye
C is a sharp tool
Posté le 07-04-2005 à 08:45:06  profilanswer
 

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/
n°1038447
Taz
bisounours-codeur
Posté le 07-04-2005 à 09:26:04  profilanswer
 

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.

n°1038455
Emmanuel D​elahaye
C is a sharp tool
Posté le 07-04-2005 à 09:32:32  profilanswer
 

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/
n°1038460
chrisbk
-
Posté le 07-04-2005 à 09:36:39  profilanswer
 

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
n°1038478
Taz
bisounours-codeur
Posté le 07-04-2005 à 09:56:24  profilanswer
 

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 ...

n°1038519
chrisbk
-
Posté le 07-04-2005 à 10:30:13  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Comment reprogrammer la fonction strfry a partir dfe pointeur?

 

Sujets relatifs
enregistrer un fichier temporaire à partir d'une servlet[HTML/CSS/JS] Ya un moyen d'ouvrir un lien dans FFox à partir de IE ?
Probleme creation de fichier excel a partir de php[MFC] recherche de nom de fonction pour éviter le clipping
chemin absolu d'un fichier a partir de son FileOutputStream ????Fonction avec Access
Pointeur vers une variable (record) de type : array of array of ...Probleme avec la fonction exif_read_data()
Comment saisir et controler des valeurs ds une fonction, et ...DAO et fonction VBA
Plus de sujets relatifs à : Comment reprogrammer la fonction strfry a partir dfe pointeur?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR