Suppression d’élément dans un tableau, langage C.
Répondre à la discussion
Affichage des résultats 1 à 25 sur 25

Suppression d’élément dans un tableau, langage C.



  1. #1
    deyni

    Suppression d’élément dans un tableau, langage C.


    ------

    Bonjour,

    j'ai un tableau contenant des chaines de caractère, et je dois supprimer les occurence multiples dans le tableau. Je ne sais pas trop comment faire. Mes seules tentatives se résument à ce que j'ai trouvé sur google pour la suppresion des occurences des caractère.

    Puis, je ne comprends pas, il faut "mettre à jour les cases du tableau et retourner un pointeur".
    Là, je n'ai rien compris à cette phrase.

    On me donne la signature:
    char **spr_occ(char ** ptableau_mots)

    Je vous remercie bien.

    -----
    Deynid'oiseaux partout !! :rire:

  2. #2
    Jack
    Modérateur

    Re : Suppression d’élément dans un tableau, langage C.

    En l'absence d'un vrai énoncé, je ne vois pas comment on pourrait t'aider. Par exemple, que doit pointer la valeur de retour? Comment la fonction sait-elle quel caractère doit être supprimé, vu que ce caractère n'est pas passé en paramètre.

    A+

  3. #3
    deyni

    Re : Suppression d’élément dans un tableau, langage C.

    Bonjour, excusez-moi de mon imprecision.
    L'énoncé dit:

    Ecrivez la fonction char **spr_occ(char **ptableau_mots), supprime les occurences multiples d'un mot, met à jour les cases du tableau correspondantes et retourne un pointeur sur tableau.

    Voilà, je bloque toujours.
    Deynid'oiseaux partout !! :rire:

  4. #4
    Zartan

    Re : Suppression d’élément dans un tableau, langage C.

    Bonjour, vous devez dans un premier temps écrire une fonction qui retourne une copie du tableau, et ensuite filtrer les éléments pendant la copie.

  5. A voir en vidéo sur Futura
  6. #5
    Jack
    Modérateur

    Re : Suppression d’élément dans un tableau, langage C.

    Et moi je me demande toujours où se cache le mot à supprimer dans le prototype de cette fonction.
    On notera également en passant que la taille du tableau est inconnue, ce qui risque de poser quelques problèmes dans la recherche du mot.

    A+
    Dernière modification par Jack ; 09/10/2012 à 21h27.

  7. #6
    kwariz

    Re : Suppression d’élément dans un tableau, langage C.

    Bonjour,

    je pense qu'il s'agit d'un problème de suppression de doublons ... on donne un tableau de string (a priori se terminant par NULL) et on renvoie un nouveau tableau (pas très clair) qui contient les mêmes éléments mais en un seul exemplaire. En gros de {"abc","bcd","abc",cde","abc", "cde",NULL} on obtient {"abc","bcd","cde",NULL}.

    Mais c'est vrai que l'énoncé, tel qu'il est présenté, n'est pas très clair.

  8. #7
    Jack
    Modérateur

    Re : Suppression d’élément dans un tableau, langage C.

    Le problème de la taille du tableau reste entier. Bon, pour les chaines, on peut s'arrêter au zéro terminal, mais pour le nombre de chaines on fait comment si on ne sait pas combien il y en a, ou éventuellement quel est le marqueur de fin (perso, je mettrais NULL, mais ça reste des supputations).

    En conséquence, pas de solution possible sans énoncé correct.

    A+

  9. #8
    deyni

    Re : Suppression d’élément dans un tableau, langage C.

    Bonjour,

    j'ai bien recopié l'énoncer tel qu'il est.
    Je pense comme kwariz, selon l'énoncé.

    Pour le tableau, on pourrait pas utiliser malloc?
    Un truc dans le genre:

    Code:
    #include <stdio.h>
    #include <stdlib.h> /*Pour la fonction malloc*/
    
    void faire_tableau( *tab){
    	int cpt = 0 ;
    	while(*chaine != NULL){
    		cpt++;
    		chaine++;
    	}
    	return cpt ;
    tab = malloc( sizeof( int ) * cpt;
    	
    }
    Si vous comprenez ce que j'ai voulu faire.

  10. #9
    deyni

    Re : Suppression d’élément dans un tableau, langage C.

    Le forum bug, et je ne peux pas modifier le message.

    J'ai fait une erreur, c'est
    void faire_tableau(**chaine)
    Deynid'oiseaux partout !! :rire:

  11. #10
    kwariz

    Re : Suppression d’élément dans un tableau, langage C.

    Citation Envoyé par deyni Voir le message
    Bonjour,

    j'ai bien recopié l'énoncer tel qu'il est.
    Je pense comme kwariz, selon l'énoncé.
    Bonjour,

    alors il faudra nous placer l'énoncé dans un contexte car en lui même il ne signifie pas grand chose : on est obligé d'en deviner trop.

    Citation Envoyé par deyni Voir le message
    Pour le tableau, on pourrait pas utiliser malloc?
    Un truc dans le genre:

    Code:
    ...
    Si vous comprenez ce que j'ai voulu faire.
    En soi, l'algorithme pour copier un tableau en en éliminant les doublons n'est pas compliqué. Une première approche naïve :
    Code:
    clean_copy( tab_string : string[] ) : string[]
      res : string[]
      res = empty
      for each string s in tab_string
        if not s in res
          res.add(s)
      return  res
    On crée un nouveau tableau dans lequel on ne rajoute une chaine que si elle ne s'y trouve pas déja.

    L'implémentation en c sera plus délicate.
    Le plus simple, à mon sens, est d'allouer un nouveau tableau de même taille que le tableau d'origine (effectivement avec malloc ou calloc), de faire le traitement puis éventuellement d'ajuster la taille au strinct minimum (avec realloc).

  12. #11
    deyni

    Re : Suppression d’élément dans un tableau, langage C.

    Bonjour, merci de votre réponse.

    Le context, c'est "faire des exos sur les pointeurs de chaines. Plus particulièrement sur les pointeurs de pointeurs.

    Je ne comprends pas votre algorithme,
    Est-ce du C?

    Merci.
    Deynid'oiseaux partout !! :rire:

  13. #12
    kwariz

    Re : Suppression d’élément dans un tableau, langage C.

    Citation Envoyé par deyni Voir le message
    Bonjour, merci de votre réponse.

    Le context, c'est "faire des exos sur les pointeurs de chaines. Plus particulièrement sur les pointeurs de pointeurs.

    Je ne comprends pas votre algorithme,
    Est-ce du C?

    Merci.
    Non c'est un algorithme, ça permet de comprendre ce qu'on fait sans s'attacher à un langage particulier ; la syntaxe est libre, ça donne les grandes lignes.
    Donc on va partir du principe que char** strings est un tableau dont le dernier élément est NULL.

    Le squelette de la fonction ressemblera à :
    Code:
    char** strings_remove_dbl(char** strings)                                                        
    {                                                                                                
      char** tmp;                                                                                    
      tmp=strings_new(strings_len(strings));                                                         
      while (*strings) {                                                                             
        if (! strings_contains(tmp,*strings))                                                        
          strings_add(tmp,*strings);                                                                 
        strings++;                                                                                   
      }                                                                                              
      return tmp;                                                                                    
    }
    Comprends-tu ce qui y est fait, comment je suis passé de la phrase en Français à l'algo puis à une implémentation en c ? Arrives-tu à écrire les fonctions manquantes (strings_new, strings_len, strings_contains, strings_add ; en plus une fonction strings_print pourra être utile pour afficher le contenu d'un char**) ?

  14. #13
    deyni

    Re : Suppression d’élément dans un tableau, langage C.

    Merci de vos réponses, mais malgré vos conseils je n'aboutit toujours pas à la réponse.
    Deynid'oiseaux partout !! :rire:

  15. #14
    kwariz

    Re : Suppression d’élément dans un tableau, langage C.

    Bonjour,

    et tu en es où ? qu'as-tu déjà fait ? où bloques-tu ?

    EDIT: tant qu'on y est ... une phrase comme «Ecrivez la fonction char **spr_occ(char **ptableau_mots), supprime les occurences multiples d'un mot, met à jour les cases du tableau correspondantes et retourne un pointeur sur tableau.» sort tout droit d'un exercice ... si tu nous montrait tout l'exo ce serit plus simple (tout en me doutant que la majorité des réponses se trouvent dans ton cours ...)
    Dernière modification par kwariz ; 11/10/2012 à 15h46.

  16. #15
    deyni

    Re : Suppression d’élément dans un tableau, langage C.

    Bonjour,

    Là où je bloque c'est la comparaison.

    Si la chaine est "je n arrive pas a faire cet exercice je vais abandonner"
    Je ne sais pas comment recuper le "je" le comparaer à tout les autres mot (arrive, exercice... ) ensuite le faire avec n puis arrive....
    Deynid'oiseaux partout !! :rire:

  17. #16
    kwariz

    Re : Suppression d’élément dans un tableau, langage C.

    Bonjour,

    ce que tu décris ne correspond pas à l'énoncé. Dans ce dernier exemple, "je n arrive pas a faire cet exercice je vais abandonner" est une chaine (un char*).
    Tu parlais de «tableau contenant des chaines de caractère», cela correspondrait plus à {"je", "n", "arrive", "pas", "a", "faire", "cet", "exercice", "je", "vais", "abandonner", NULL}
    Je rajoute un NULL en fin de tableau pour en marquer la fin car à aucun moment dans l'énoncé on ne parle de passer une taille de tableau, ou si le tableau possède une taille fixe.
    Quel est l'énoncé complet ?

  18. #17
    deyni

    Re : Suppression d’élément dans un tableau, langage C.

    Voici l'énoncé:

    Ecrivez la fonction char **spr_occ(char **ptableau_mots),cette fonction parcourt le tableau, supprime les occurences multiples d'un mot, met à jour les cases du tableau correspondantes et retourne un pointeur sur tableau.
    C'est ça mon énoncé
    Deynid'oiseaux partout !! :rire:

  19. #18
    kwariz

    Re : Suppression d’élément dans un tableau, langage C.

    Alors, si tu as
    Code:
    char* strings=char* strings[] = { "abc", "abcd", "abc", "bcd", "cde",
                                      "bcde", "cde", "bcd", "abc", "cdef",
                                      NULL };
    comment te debrouillerais-tu pour créer un nouveau tableau sans les doubles ?

  20. #19
    deyni

    Re : Suppression d’élément dans un tableau, langage C.

    Je prends la premiere chaine "abc"
    retrouve "abc" je le supprime.
    Ensuite j'avnace, avec "abcd"

    Mais c'est je n'arrive pas à la faire.
    Deynid'oiseaux partout !! :rire:

  21. #20
    kwariz

    Re : Suppression d’élément dans un tableau, langage C.

    Bah c'est pas tout à fait ça, on part du principe qu'on va créer un nouveau tableau qui contient les éléments de strings mais en un seul exemplaire ... là tu commences à me décrire autre chose, le nettoyage de strings de ses doublons ce qui est différent.

  22. #21
    deyni

    Re : Suppression d’élément dans un tableau, langage C.

    Donc, on compte les élements identiques, puis on fait un malloc, et on recopie les élements differents?
    Deynid'oiseaux partout !! :rire:

  23. #22
    kwariz

    Re : Suppression d’élément dans un tableau, langage C.

    c'est ça, c'est exactement ce que te proposait Zartan dès le post 4
    Le tout est de repérer les éléments différents.

  24. #23
    freepicbasic

    Re : Suppression d’élément dans un tableau, langage C.

    ça me parait un peu difficile comme excercice pour un débutant

    On alloue un pointeur de pointeur qui pointe sur 20 strings
    Les strings sont de 10 octets, On aurait pu aussi utiliser le malloc.
    J ai pris les chaines comme jack le disait.

    On initialise le pointeurs de pointeur au début
    puis on agit que sur les pointeurs , les chaines plus longues ne sont pas déplacés.
    Si on on fait un printf des Data[] elles sont là

    Mais on pourrait replacer le pointeur effacé à la fin pour avoir toujours nos 10 Data accessibles
    Mais avec le malloc lors d'un ajout il faudrait faire un free si le ptr!=0 puis un nouveau malloc

    Testé sur TC2 (DOS)

    Code:
    /*
    //13/10/2012
    //Programme : pointeur de pointeur
    */
    
    #include <stdio.h>
    #include <stdlib.h>
    char **MyStr;
    char Data[20][10];
    
    void InitMyStr();
    void Suplin(char *Mycomp, int No);
    
    
    main ()
    {
    int c;
    int p;
    int i;
    char MyComp[10];
    
    InitMyStr();
    i=0;
    c = 0;
    
    
    while (Data[c][0] != '\0')
    	printf("%s\r\n",Data[c++]);
    
    
    c = 0;
    
    
    
    while (MyStr[c][0] != '\0')
    {
    	i = c;
    	strcpy(MyComp,MyStr[c]);
    	c++;
    	while (MyStr[i][0] != '\0')
    	 {
    	  if  ( strcmp(MyComp,MyStr[i+1]) == 0)
    		  Suplin(MyComp,i+1);
    	 i++;
    	 }
     }
    
    	printf("\r\n\r\n");
    c=0;
    
     while ( strlen(MyStr[c]) != 0)
    	printf("%s\r\n",MyStr[c++]);
    
    i = getch();
    
    }
    
    void InitMyStr()
    {
    int i;
    
    MyStr = malloc( 20 * sizeof (char *) );
    
    for (i=0; i<19; i++)
       MyStr [i]  =  &Data[i][0];
    
    strcpy(Data[0], "ABC");
    strcpy(Data[1], "BCA");
    strcpy(Data[2], "CBC");
    strcpy(Data[3], "ABC");
    strcpy(Data[4], "BCA");
    strcpy(Data[5], "CCC");
    strcpy(Data[6], "BBB");
    strcpy(Data[7], "CCC");
    strcpy(Data[8], "ABC");
    strcpy(Data[9], "RIP");
    strcpy(Data[10], "");
    
    }
    
    
    void Suplin(char *Mycomp, int No)
    {
    int p;
    p=0;
    while (*MyStr[No] != '\0')
     {
     if (strcmp(Mycomp, MyStr[No]) == 0 ) {
    	p = No;
    	while (strlen(MyStr[p]) != 0) {
    		MyStr[p] = MyStr[p+1];
    		p++;
    		}
      }
    	No++;
     }
    }

    Sortie Console

    Code:
    ABC
    BCA
    CBC
    ABC
    BCA
    CCC
    BBB
    CCC
    ABC
    RIP
    
    
    ABC
    BCA
    CBC
    CCC
    BBB
    RIP
    Dernière modification par freepicbasic ; 13/10/2012 à 10h29.
    A+, pat

  25. #24
    deyni

    Re : Suppression d’élément dans un tableau, langage C.

    Merci bien pour toute votre aide, je crois avoir saisi le truc, je vais me le refaire dans quelques jours à tête reposé.
    Deynid'oiseaux partout !! :rire:

  26. #25
    freepicbasic

    Re : Suppression d’élément dans un tableau, langage C.

    ........................
    Dernière modification par freepicbasic ; 16/10/2012 à 18h29.
    A+, pat

Discussions similaires

  1. langage c: suppression element d'une liste
    Par invite8b421ec7 dans le forum Programmation et langages, Algorithmique
    Réponses: 24
    Dernier message: 26/02/2012, 12h25
  2. Que fait l’ordinateur lors d’envoi d’arguments à une fonction ?
    Par AmigaOS dans le forum Programmation et langages, Algorithmique
    Réponses: 58
    Dernier message: 19/09/2011, 09h49
  3. Réponses: 46
    Dernier message: 12/05/2010, 08h46
  4. Dans quel pays et comment s’appelle cette chute d’eau ?
    Par invite68a2566d dans le forum Identification des espèces animales ou végétales
    Réponses: 1
    Dernier message: 09/05/2010, 11h31
  5. questions sur les element du tableau periodique
    Par invite42c54503 dans le forum Chimie
    Réponses: 3
    Dernier message: 26/01/2009, 15h23