IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Difficulté exercice langage C débutant


Sujet :

C

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2007
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 84
    Points : 53
    Points
    53
    Par défaut Difficulté exercice langage C débutant
    Bonjour les amis(es)

    Je m'exerce au langage C via divers exercices. Mais je suis bloqué sur un.
    On me demande de réaliser l'en-tête d'une fonction. Voici l'énoncé :

    Définir une fonction qui compte le nombre d'occurrences d'un élément donnée dans un tableau. Cette fonction pourra être utilisé pour traiter un tableau contenant des éléments de type quelconque.(Sans nécessiter de recompiler la fonction pour traiter un nouveau type d'élément). Ne réaliser que l'en-tête de la fonction en décrivant précisément chacun des paramètres.

    Donc je vais avoir quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    void COMPTE( type tableau[])
    {
    }
    Donc mon problème est que je ne sais pas quel type mettre vue que se sont des éléments quelconque. Et pour le corps de la fonction, est-il possible de calculer le nombre d'élément contenu dans le tableau vue que je ne connais pas sa taille non plus.

    Merci d'avance à tout ceux qui pourront m'apporter leur aide.

    Amicalement Boobs60

  2. #2
    Membre averti Avatar de Fooshi
    Homme Profil pro
    ICD
    Inscrit en
    Juin 2002
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : ICD
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 507
    Points : 359
    Points
    359
    Par défaut
    en faisant un simple passage de ton tableau en parametre ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    unsigned int compte(unsigned int *tab);
     
    unsigned int compte(unsigned int *tab)
    {
    unsigned int i=0;
    while(tab[i] !='\0')
    {
    i++
    };
    return i;
    }

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2007
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 84
    Points : 53
    Points
    53
    Par défaut
    Merci beaucoup de ta réponse.

    Mais si j'ai un tableau de type char qui est passé en paramètre de ma fonction est ce qu'avec ton code sa passe ??

    Merci encore.

    Amicalement boobs60

  4. #4
    Membre averti Avatar de Fooshi
    Homme Profil pro
    ICD
    Inscrit en
    Juin 2002
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : ICD
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 507
    Points : 359
    Points
    359
    Par défaut
    Dans mon code tu ne te préoccupe pas du type du tableau, tu passe en paramètre un pointeur sur le tableau.

  5. #5
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2007
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 84
    Points : 53
    Points
    53
    Par défaut
    ok ok merci encore.

  6. #6
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2007
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 84
    Points : 53
    Points
    53
    Par défaut
    Encore une derniere question est ce que je peut calculer la taille de ce tableau car je ne connais pas sa taille a l'avance ou est ce qu'il faut que je la demande en parametre ??

  7. #7
    Membre averti Avatar de Fooshi
    Homme Profil pro
    ICD
    Inscrit en
    Juin 2002
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : ICD
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 507
    Points : 359
    Points
    359
    Par défaut
    La taille du tableau depend du type de donnée.
    Tu ne peux pas la retourner dans cette fonction mais tu peux toujours passer un autre pointeur en paramètre ou ta taille sera enregistrée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    unsigned int compte(unsigned int *tab, unsigned int *size);
     
    unsigned int compte(unsigned int *tab, unsigned int *size)
    {
    unsigned int i=0;
    while(tab[i] !='\0')
    {
    i++
    };
     
    unsigned int taille = sizeof(tab);  // Calcul de la taille du tableau
    *size = &taille;   // Le pointeur size pointe sur l'adresse de la valeur du tableau
    return i;
    }

  8. #8
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2007
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 84
    Points : 53
    Points
    53
    Par défaut
    désolé je n'ai pas comprit "LA"

  9. #9
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Fooshi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    unsigned int compte(unsigned int *tab, unsigned int *size)
    {
    unsigned int i=0;
    while(tab[i] !='\0')
    {
    i++
    };
     
    unsigned int taille = sizeof(tab);  // Calcul de la taille du tableau
    *size = &taille;   // Le pointeur size pointe sur l'adresse de la valeur du tableau
    return i;
    }
    Code totalement faux :
    - le test avec '\0' est standard pour des chaines de caractères, pas pour des tableaux de unsigned int
    - sizeof tab ne donnera pas la taille du tableau, mais celle de tab, donc la taille d'un pointeur
    - *size = &taille; Il ne faut jamais retourner l'adresse d'une variable locale
    - respecte l'indentation, ce sera plus lisible.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  10. #10
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2007
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 84
    Points : 53
    Points
    53
    Par défaut
    Mais alors quelle est l'entete de ma fonction ??
    est ce que ce code est bon ??
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    unsigned int compte(unsigned int *tab);
    Je rappelle que j'ai besoin d'une en-tête de fonction qui a pour paramètre un tableau dont on ne connait pas le type.

    Merci

  11. #11
    Membre averti Avatar de Fooshi
    Homme Profil pro
    ICD
    Inscrit en
    Juin 2002
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : ICD
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 507
    Points : 359
    Points
    359
    Par défaut
    effectivement laisse tomber les conneries que je t'ai dis (tired-> je travaille comme un dingue en ce moment). Par contre un pointeur sur le tableau serais une solution.
    et pour recuperer la taille du tableau, faire un sizeof du tableau mais pas du pointeur bien sur.

  12. #12
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2007
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 84
    Points : 53
    Points
    53
    Par défaut
    ok merci mais sinon est ce que ton en-tête est bonne ??

  13. #13
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Je doute qu'il soit possible de réaliser une telle fonction en toute rigueur. Ce qui est possible de faire, est de vérifier que la zone mémoire associée à un élément donné soit identique à celle d'un autre élément. Si les deux zones diffèrent, cela ne veut pas forcément dire que les deux éléments ne sont pas égaux.

    Comment construire le prototype de la fonction ?

    1- On a un tableau dont les éléments sont inconnus. Autrement dit, on va passer l'adresse d'un élément dont le type est inconnu. Cette adresse a donc le type void*

    2- On veut parcourir ce tableau, donc on a besoin
    -- de la taille en byte d'un élément
    -- du nombre d'éléments du tableau.
    Ces deux grandeurs sont des entiers non signés -> type size_t

    3- On a un élément de référence dont on cherche le nombre d'occurences. On a le choix de passer soit son indice, soit son adresse. La deuxième méthode est plus générale, parce que l'élément de référence n'est plus obligatoirement un élément du tableau. Dans ce dernier cas, on doit passer l'adresse d'un élément dont le type est inconnu -> type void*

    4- Elle renvoie le nombre d'occurences, un entier non signé -> type size_t

    On arrive à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    size_t Compte(void* tableau, size_t tailleElement, size_t nbElements, void* reference);
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  14. #14
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2007
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 84
    Points : 53
    Points
    53
    Par défaut
    Merci infiniment pour ta réponse.
    C'est vraiment cool de pouvoir compter sur les autres quand on est bloqué.

    Merci encore.

    Amicalement boobs60

  15. #15
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par diogene Voir le message
    Je doute qu'il soit possible de réaliser une telle fonction en toute rigueur.
    On peut suivre l'exemple de qsort() et envoyer la fonction de comparaison en callback. C'est a mon sens le seul moyen d'avoir une fonction generique tout en evitant un memcmp() ambigu, comme tu l'indiques. (Evidemment, c'est a l'utilisateur de la fonction de bien construire le callback...)

  16. #16
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Tu as raison et je ne vois pas non plus d'autres possibilités qui ne soient pas des variantes sur ce thème.
    Comme cela nécessite d'associer un couple de fonctions et non simplement d'en écrire une seule, je suppose que l'exercice n'envisageait pas ce genre de solution.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Langage C : Débutant
    Par deWeb dans le forum C
    Réponses: 3
    Dernier message: 09/10/2010, 19h12
  2. Exercice langage C
    Par coolmomodu31 dans le forum C
    Réponses: 5
    Dernier message: 17/06/2008, 14h20
  3. Exercices Langage C
    Par gina22 dans le forum C
    Réponses: 4
    Dernier message: 16/12/2007, 10h29
  4. Recherche exercices Pascal pour débutant
    Par khadija2008 dans le forum Pascal
    Réponses: 2
    Dernier message: 03/12/2007, 00h44
  5. [langage C][débutant] un vaisseau qui tire
    Par shinkyo dans le forum GLUT
    Réponses: 12
    Dernier message: 10/06/2006, 15h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo