Aide programme

Fermé
Utilisateur anonyme - Modifié le 15 juin 2017 à 19:07
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 - 15 juin 2017 à 22:30
Bonjour, je dois rendre un devoir pour demain et je suis completement bloque !
l'utilisateur entre 3 chaines de caractères s,w1,w2
Le programme doit à l'aide de la fonction prefix_word dire si le premier mot de s est identique a w2
Ensuite il doit a l'aide de la fonction findword trouver toutes les fois ou w1 se trouve dans s
et ensuite a la de la focntion replace il doit remplacer w1 par w2 dans s
et a la fin il doit afficher s avec w2 et non w1

voila ce qu'on a écrit jusqu'à present mais je suis coince....
#include <stdio.h>
#include <stdlib.h>
int prefix_word(char*s,char *w)

int prefix_word (char*s, char*w)
{
    int is=0, iw=0;
    if (w[iw]=='\0')
    {
        if (s[is]=='\0' || s[is]==' ')
            return 1;
        return 0;
    }
    else
    {
        if (s[is]!=w[iw]) return 0;

    }
    is++;iw++;
}

char *find_word (char*s,char*w)
{
    char *p=s;
    while (*p!='\0')
    {
        if ((p==s|| *(p-1)==' ')&&prefix_word(p,w)==1) return 1;
        p++;
    }
    return *p;
}



char *p=replace_word(s,w1,w2);
if (p!=NULL)
{
    printf("\n%s\n",p);
    free(p);
}
return 0;
char* replace_word(char *s, char *w1, char *w2)
{
    char *p1=NULL;
    p1=s;
    int count=0; //count dit combien w1 apparait dans s en tant que mot lieu meme
    (


        ICI code boucle qui utilise "find_word" et trouve à combien count est égal.


    )

    int len=len_s(s)+count*(len_s(w2)-len_s(w1)); // len_s fonction aide qui trouve combien de caracteres sans '\0' il y a dans la chaine
    char *s1=malloc((len+1)sizepf(char));
    if (s1==NULL)return NULL;
    p1=s;
    char *p2=s1;
    char *p3, *p4;
    for (int i=0; i<count; i++)
    {
        p3=find_word(p1,w1);
        while(p1<p3)
        {


*p2+1=*p1++        } //tant que je rencontre pas w1 je copie le caractere dans la nouvelle chaine        while (*p4!='\0')        {            *p2++=*p4++        }//copie w2 dans la nouvelle chaine        p1+=len_s(w1);        while (*p1) {*p2++=*p1++;}        *p2=*p1        return    }}

2 réponses

YCN- Messages postés 116 Date d'inscription mercredi 24 juin 2015 Statut Membre Dernière intervention 13 juillet 2017 12
15 juin 2017 à 14:04
C'est un peu catastrophique votre truc là. Tu obtiens quoi quand tu test?
0
YCN- Messages postés 116 Date d'inscription mercredi 24 juin 2015 Statut Membre Dernière intervention 13 juillet 2017 12
Modifié le 15 juin 2017 à 14:37
Voilà la fonction prefix :
int prefix ( char * string1 , char * string2){
 int size_string1 = strlen(string1);
 int size_string2 = strlen(string2);
 int i;
 int size_shorter;
 
 if ( size_string1 < size_string2){
  size_shorter = size_string1;
 }
 else{
  size_shorter = size_string2;
 }
 
 for ( i = 0 ; i < size_shorter-1 ; i++){   //size_string1-1 pour éviter le \0
   if (string1[i] != string2[i]){
    return -1;
   }
 }
 
 return 1;
}


Ma version n'est pas forcément parfaite mais elle me semble logique. Ensuite pour connaître le nombre de fois qu'une chaîne de caractère est présente dans une autre il faut parcourir la chaîne de caractère la plus longue et regarder à chaque itération la plus courte lui est prefix.
J'ai aussi fait la fonction find_word, quand vous l'aurais réessayer avec mes indications, je vous aiderais, ou je vous donnerais ma version :).
0
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
15 juin 2017 à 22:30
Je suis intrigué par l'écart entre le niveau de l'énoncé, qui pose des questions apparemment simples mais bourrées de pièges (je dirais niveau ingénieur non débutant), et le code proposé.
Ton code prefix_word() débute avec une bonne intention en s'intéressant au cas d'un mot vide qui sera inclus si la chaîne est vide ou commence par une espace. Bonne réflexion, puis tout devient plus flou. Il y a à la fois de problèmes de syntaxe et des problèmes de réflexion sur l'algorithmie.
Je peux essayer d'écrire prefix_word() mais la lecture de cette fonction ne t'aidera pas, il faut plus chercher à apprendre le langage.
bool prefix_word( const char *str , const char *word ) {
  size_t  size_wrd = strlen( word );
 
  if ( size_wrd > strlen( str ) )
    return false;     // mot est plus long, il ne peut pas être inclus
   
  size_t  i;
  for ( i = 0 ;  i < size_wrd ;  ++i ) {
    if ( word[i] != str[i] )
      return false;           // au moins un caractère diffère
  // ici word est entièrement égal au début de string
  if ( str[i] == '\0'  ||  str[i] == ' ' )   // str doit se terminer ici
    return true; // ou le prochain caractère de str doit être une espace

  return false;        // c'est un préfixe, mais pas un mot qui préfixe
}
Les autres fonctions sont un peu plus compliquées.
0