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 :

Problème programme tableau/fonction


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Problème programme tableau/fonction
    Hello tout le monde, j'ai un petit problème avec ce programme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    int remplir_tab (int t1[], int N)
    {
        int i;
        srand(time(0));
        for(i=0;i<N;i++)
             t1[i]=rand()%21;
     
        return t1[i] ;
    }
    void aff_tab (int t1[], int N)
    {
        int i;
        for(i=0;i<N;i++)
            printf("%d ",t1[i]);
        return ;
    }
    double moy_tab (int t1[], int N)
    {
        int i, som=0;
        double moy;
        for(i=0;i<N;i++)
            som=som+t1[i];
     
        moy=som/20.0;
        return moy;
    }
    int remplir2_tab(int t1[], int N)
    {
        int i=0, temp, t2[i];
        for(i=0;i<N/2;i++)
            {
             temp=t1[i];
             t1[i]=t1[N-i];
             t1[N-i]=temp;
            }
        t2[i]=t1[i];
        return t2[i];
    }
    int remplir3_tab(int t2[],int N)
    {
        int i=0, t3[i];
        for(i=0;i<N;i++)
             t3[i]=(t2[i])%4;
        return t3[i];
    }
    int recurrence1_tab(int t3[], int N, int ch)
    {
        int i, occ0=0;
        for(i=0;i<N;i++)
            {
             if(t3[i]==0)
                occ0++;
            }
        return occ0;
    }
    int reccurence2_tab(int t3[], int N, int ch)
    {
        int i, occ_ch=0;
        for(i=0;i<N;i++)
            {
             if(t3[i]==ch)
                occ_ch++;
            }
        return occ_ch;
    }
    int remplir4_tab(int t3[], int N)
    {
        int i=0, t_pair[i];
        for(i=0;i<N;i++)
            {
             if((t3[i]%2)==0)
                t_pair[i]=t3[i];
            }
        return t_pair[i];
    }
    int main()
    {
        int i=0, N=25, t1[i], t2[i], t3[i], t_pair[i], occ_0, occ_ch, ch;
        double moy;
        remplir_tab(t1,N);
        aff_tab(t1,N);
        for(i=0;i<N;i++)
            printf("%d ",t1[i]);
     
        moy=moy_tab(t1,N);
        printf("La moyenne de la table est de %lf",moy);
        t2[i]=remplir2_tab(t1,N);
        for(i=0;i<N;i++)
            printf("%d ",t2[i]);
     
        t3[i]=remplir3_tab(t2,N);
        for(i=0;i<N;i++)
            printf("%d ",t3[i]);
     
        occ_0=reccurence1_tab(t3[i],N,0);
        printf("Il y a %d case(s) avec la valeur 0",occ_0);
        printf("Entrez le numero recherche : ");
        scanf("%d",&ch);
        occ_ch=reccurence2_tab(t3,N,ch);
        printf("Il y a %d case(s) avec la valeur %d",occ_ch,ch);
        t_pair[i]=remplir4_tab(t3,N);
        printf("%d ",t_pair[i]);
        return 0;
    }
    Le but du programme est de:
    -Créer une constante N=15
    -Créer un tableau1 avec void remplir_tab(int t1[], int n)
    -Afficher le tableau1 et sa moyenne void aff_tab(int t1[], int n) et double moyenne (int t1[], int n)
    -Créer un tableau2 avec les valeurs inversées de tableau1, et l'afficher
    -Creer un tableau3 avec le reste de la division par 4 pour chaque valeur et l'afficher
    -Compter et afficher le nombre d'occurence de 0 pour t3 ainsi que pour une valeur entrée au clavier
    -Remplir un tableau t_pair avec les éléments de t3 qui ont une valeur paire et l'afficher

    J'ai plusieurs messages d'erreur:
    -warning : return with a value, in function returning void (pour void remplir_tab)
    -warning : implicit declaration of function 'reccurence1_tab'
    -error in function 'main' : undefined reference to 'reccurence1_tab'

    Le premier warning est compréhensible et j'aurais besoin d'un coup de main pour qu'il ne renvoit rien mais que je puisse mettre en paramètre le tableau dans la fonction aff_tab.
    Mais les autres messages restent inconnus pour moi...

    J'ai essayé de bricoler à ma façon pour la constante N car cela ne marchait pas(error expected ';' ',' or ')' before numeric constant pour chaque fonction avec int N en paramètre), alors j'ai créé une variable N=25.Une idée pour que la constante marche?

    Voila c'est peut être beaucoup mais j'ai cherché avec de poster donc j’espère que quelqu'un puisse me lancer une boue de sauvetage

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Bonjour,

    Pour tes autres messages, regarde bien le prototype de ta fonction 'recurence1_tab' et comment tu l'appelles. Regarde bien


    Pour retourner un tableau via les paramètres, il suffit d'utiliser un pointeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void foo(Type ** e)
    {
              *e = (Type *)malloc(sizeof(Type)*nbElement) ;
    }
     
    Type * e;
    foo(&e);

  3. #3
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 623
    Points : 1 554
    Points
    1 554
    Par défaut
    Hello,

    Et lorsque tu auras solutionné ton problème grace à l'idée de Neckara, ton compilateur te donnera une autre erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    occ_0=reccurence1_tab(t3[i],N,0);
    car cet appel n'est pas correct. Décidément, tu n'es pas copain avec cette fonction
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Salut
    Ton gros problème vient surtout de tes fonctions "remplir_tab". Ces fonctions ont une action entièrement internes (chacune s'occupe du tableau dans son intégralité). Donc une fois qu'elles ont fini leur travail et que le tableau est rempli, pourquoi leur fais-tu renvoyer l'élément tab[i] (qui, en plus, est en dehors de la capacité du tableau puisqu'un tableau de N éléments va de tab[0] jusqu'à tab[N-1]) ??? Que représente ce "n+1 ieme" élément pour l'appelant ? En a-t-il besoin d'une façon quelconque ???
    Quand on renvoie une valeur c'est que cette valeur est nécessaire à la fonction appelante. Sinon alors autant éviter les risques d'erreurs inutiles...

    Pour le reste le premier warning te dit que tu renvoies une valeur dans une fonction de type void ; ce qui m'étonne car la fonction est définie "int". Et le second dit que la fonction n'ayant pas de type déclaré, sera déclarée "int" par défaut. Là aussi ça m'étonne car je la vois "int". Est-ce que tu nous as fourni la vraie version ???

    Autre détail: tu calculs la moyenne en divisant la somme par 20. Je ne vois pas trop d'où vient ce nombre (ton énoncé parle de N=5) et en plus ce n'est pas très évolutif (si demain on veut changer cette valeur faut recompiler). Alors que tu as à ta disposition le nombre "n" d'éléments du tableau déjà tout prêt et que ce nombre s'adaptera tout le temps à la taille réelle du tableau...

    @Neckara
    Arf, vu le niveau de l'exercice je crois que ta solution fait appel à des notions qu'il n'a pas encore vues.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Merci pour vos réponses
    J'ai modifié le programme par rapport aux petites mineurs (moyenne...) mais pas le remplir_tab.
    j'ai donc ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    int remplir_tab (int t1[], int N)
    {
        int i;
        srand(time(0));
        for(i=0;i<N;i++)
             t1[i]=rand()%21;
     
        return t1[i] ;
    }
    void aff_tab (int t1[], int N)
    {
        int i;
        for(i=0;i<N;i++)
            printf("%d ",t1[i]);
        return ;
    }
    double moy_tab (int t1[], int N)
    {
        int i, som=0;
        double moy;
        for(i=0;i<N;i++)
            som=som+t1[i];
     
        moy=som/N;
        return moy;
    }
    int remplir2_tab(int t1[], int N)
    {
        int i=0, temp, t2[i];
        for(i=0;i<N/2;i++)
            {
             temp=t1[i];
             t1[i]=t1[N-i];
             t1[N-i]=temp;
            }
        t2[i]=t1[i];
        return t2[i];
    }
    int remplir3_tab(int t2[],int N)
    {
        int i=0, t3[i];
        for(i=0;i<N;i++)
             t3[i]=(t2[i])%4;
        return t3[i];
    }
    int recurrence1_tab(int t3[], int N, int ch)
    {
        int i, occ0=0;
        for(i=0;i<N;i++)
            {
             if(t3[i]==0)
                occ0++;
            }
        return occ0;
    }
    int reccurence2_tab(int t3[], int N, int ch)
    {
        int i, occ_ch=0;
        for(i=0;i<N;i++)
            {
             if(t3[i]==ch)
                occ_ch++;
            }
        return occ_ch;
    }
    int remplir4_tab(int t3[], int N)
    {
        int i=0, t_pair[i];
        for(i=0;i<N;i++)
            {
             if((t3[i]%2)==0)
                t_pair[i]=t3[i];
            }
        return t_pair[i];
    }
    int main()
    {
        int i=0, t1[i], t2[i], t3[i], t_pair[i], occ_0, occ_ch, ch;
        double moy, N=25;
        remplir_tab(t1,N);
        aff_tab(t1,N);
        for(i=0;i<N;i++)
            printf("%d ",t1[i]);
     
        moy=moy_tab(t1,N);
        printf("La moyenne de la table est de %lf",moy);
        t2[i]=remplir2_tab(t1,N);
        for(i=0;i<N;i++)
            printf("%d ",t2[i]);
     
        t3[i]=remplir3_tab(t2,N);
        for(i=0;i<N;i++)
            printf("%d ",t3[i]);
     
        occ_0=reccurence1_tab(t3[i],N,0);
        printf("Il y a %d case(s) avec la valeur 0",occ_0);
        printf("Entrez le numero recherche : ");
        scanf("%d",&ch);
        occ_ch=reccurence2_tab(t3,N,ch);
        printf("Il y a %d case(s) avec la valeur %d",occ_ch,ch);
        t_pair[i]=remplir4_tab(t3,N);
        printf("%d ",t_pair[i]);
        return 0;
    }
    Et j'ai ces deux messages d'erreur:
    -warning :implicit declaration of function 'reccurence1_tab'
    -in function 'main': undefined reference to 'reccurence1_tab

    Sve@r, Si je ne renvoie pas le tableau, comment va il être retranscrit dans la fonction main puis aff_tab, le tableau n'existera que dans remplir_tab et ne s'affichera pas dans le main non ?

    Sinon je ne vois pas ou se trouve l'erreur dans cette ligne edgarjacobs et Neckara
    J'appelle le tableau concerné(t3), la taille du tableau(N) et le numéro recherché(0)

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Blaze66 Voir le message
    Sve@r, Si je ne renvoie pas le tableau, comment va il être retranscrit dans la fonction main puis aff_tab, le tableau n'existera que dans remplir_tab et ne s'affichera pas dans le main non ?
    Oui ok, je vois ce que tu n'as pas compris.

    Regarde le code suivant
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void remplir_entier(int *adr, int valeur)
    {
        *adr=valeur;
    }
     
    int main()
    {
        int a, b, c;
        remplir_entier(&a, 5);
        remplir_entier(&b, 10);
        remplir_entier(&c, 15);
    }

    La fonction "remplir" reçoit l'adresse de la variable ainsi que la valeur à lui mettre. Et elle se contente de rentrer la valeur à cette adresse. Elle n'a pas besoin de renvoyer quoi que ce soit puisqu'elle effectue le travail dans son intégralité.

    Avec un tableau, c'est la même chose. Parce que remplir "une" variable ou "une suite" de variables c'est pareil
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void remplir_tab(int tab[], int nb)
    {
        int i;
        for (i=0; i < n; i++)
            tab[i]=i*i;
    }

    Tout comme dans le premier exemple, il me faut lui passer l'adresse de début du tableau.
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int main()
    {
        int tab[100];
        remplir_tab(&tab[0], 100);
    }

    Toutefois, la syntaxe C offre un raccourci dans le fait que le nom brut d'un tableau correspond à l'adresse de son premier élément.
    Ainsi, l'écriture suivante est tout à fait possible et correspond exactement à l'écriture précédente
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int main()
    {
        int tab[100];
        remplir_tab(tab, 100);
    }

    La fonction reçoit l'adresse de début du tableau et peut y positionner ce qu'elle veut.
    De plus, comme un tableau est toujours contigü en mémoire, elle peut alors passer à l'élément suivant pour le remplir et etc etc etc.
    Le tableau étant défini dans le main existe donc bien dans celui-ci et donc bien en dehors de la fonction "remplir". Celle-ci reçoit son adresse pour le remplir entièrement et n'a donc pas à renvoyer quoi que ce soit...

    PS: C'est bien que ta fonction "moyenne" divise la somme par le nombre d'éléments. Toutefois, en divisant 2 int tu obtiendras un résultat en "int". Pour une moyenne ce n'est pas tout à fait optimum
    (rassure-toi, on a tous fait cette erreur)
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Problème programme tableau
    Par Chnapy dans le forum Débuter
    Réponses: 3
    Dernier message: 28/04/2013, 12h45
  2. Programmation évènementielle et problème de tableau
    Par Foelthanos dans le forum x86 16-bits
    Réponses: 12
    Dernier message: 02/01/2011, 23h22
  3. [XL-2002] Problème de parametre fonction : tableau d'entier
    Par Floriang33 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 27/07/2009, 17h42
  4. Réponses: 11
    Dernier message: 14/10/2006, 21h26

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