Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème Exercice 3 - Les tableaux

    4 juillet 2015 à 10:54:43

    Bonjour à tou(te)s,

    Je rencontre un problème (ou plusieurs en fait c'est possible) à l'exercice 3 sur les tableaux dont voici l'énoncé :

    Exercice 3

    Créez une fonction copierTableau qui prend en paramètre deux tableaux. Le contenu du premier tableau devra être copié dans le second tableau. Prototype :

    void copie(int tableauOriginal[], int tableauCopie[], int tailleTableau);


    J'ai fais le tour sur les différents sujets traitant de ces exercices sur le forum, mais rien y fait je ne trouve pas la solution et mon code ne veut toujours pas compiler. Je ne sais pas si le problème vient du fait que j'ai créer un projet pour la fonction "copier" dans "tableau.c". 

    Je vous présente mon code, cela sera peut-être plus parlant :

    main.c :

    #include <stdio.h>
    #include <stdlib.h>
    #include "tableau.h"
     
    int sommeTableau(int tableauOriginal[], int tailleTableau);
    double moyenneTableau(int tableauOriginal[], int tailleTableau);
     
     
    int main(int argc, char *argv[])
    {
     
        int tableauOriginal[4] = {1, 7, 3, 12};
        int tableauCopie[4] = {0};
        int tailleTableau = 4;
        double moyenne = 0;
        
        printf("Voici les données du tableau :\n\n");
        
        moyenne = moyenneTableau(tableauOriginal, 4);
        printf("Moyenne = %f\n", moyenneTableau(tableauOriginal, 4));
        
        printf("\n");
        
        sommeTableau(tableauOriginal, 4);
        printf("La somme des valeurs du tableau est égale à %d.\n", sommeTableau(tableauOriginal, 4));
        
        copie(tableauOriginal, tableauCopie, tailleTableau);
        printf("\nCopie Tableau:\n");
        
        
        return 0;
        
    }
     
    double moyenneTableau(int tableau[], int tailleTableau)
    {
        int i;
        double moyenne = 0, somme = 0;
        
        for (i = 0 ; i < tailleTableau ; i++)
        {
            somme = somme + tableau[i];
        }
        
        moyenne = somme/tailleTableau;
        
        return moyenne;
    }
     
     
    int sommeTableau(int tableau[], int tailleTableau)
    {
        int i, somme = 0;
        
        for (i = 0 ; i < tailleTableau ; i++)
        {
            somme = somme + tableau[i];
        }
        
        return somme;
     
    
    }



    tableau.c :
    #include <stdlib.h>
    #include <stdio.h>
    #include "tableau.h"
    #include "main.c"
     
    void copie(int tableauOriginal[], int tableauCopie[], int tailleTableau)
    {
        int i = 0;
        
        for (i=0; i<tailleTableau; i++)
        {
            tableauCopie[i] = tableauOriginal[i];
            printf("%d\n", tableauOriginal[i]);
            printf("%d\n", tableauCopie[i]);
        }
    }



    tableau.h : 

    #include <stdio.h>
     
     
    void copie(int tableauOriginal[], int tableauCopie[], int tailleTableau);



    PS : Veuillez m'excuser par avance si je n'emploie pas les bons termes, je débute en programmation. Par ailleurs, n'hésitez pas à me conseiller quant à la forme de mon code, sur la mise en forme et la présentation, je tiens à prendre de bonnes habitudes.

    Merci d'avance :)

    -
    Edité par XF0Y 4 juillet 2015 à 10:56:43

    • Partager sur Facebook
    • Partager sur Twitter
      4 juillet 2015 à 11:29:42

      Bonjour,

      Dans le fichier tableau.c tu a mis , ligne 4

      #include "main.c" 

      tu ne doit jamais inclure des fichiers *.c dans tes projets (supprime cette ligne). En fait à la compilation , le compilateur génère des fichiers à extension "o" contenant tes fonctions à partir des fichiers à extension "c" (les fichiers header à extension "h" servant à inclure des fonctions dans d'autres fichiers "c" (futurs "o") entre autres (parfois cela peut simplement être des directives de preprocesseurs au lieu de prototypes de fonctions (enum{}; , #define ,macros, etc...)

      Tu peut relire le chapitre sur le préprocesseur du cours de C pour plus de détails.

      Je vois aussi que tu n'as pas mis les protections contre les multi inclusions dans ton fichier "tableau.h" :

      #ifndef H_TAB
      #define H_TAB
      
      void copie(/*paramêtres fonction */);
      
      #endif //H_TAB



      -
      Edité par Warren79 4 juillet 2015 à 11:38:45

      • Partager sur Facebook
      • Partager sur Twitter

      Mon site web de jeux SDL2 entre autres : https://www.ant01.fr

        4 juillet 2015 à 11:30:43

        Alors slt :

        pourquoi  #include "main.c" dans ton fichier tableau.c

        #include <stdlib.h>
        #include <stdio.h>
        #include "tableau.h"
        #include "main.c"  /* <--- cette ligne */
          
        void copie(int tableauOriginal[], int tableauCopie[], int tailleTableau)
        {
            int i = 0;
             
            for (i=0; i<tailleTableau; i++)
            {
                tableauCopie[i] = tableauOriginal[i];
                printf("%d\n", tableauOriginal[i]);
                printf("%d\n", tableauCopie[i]);
            }
        }

        quoi donc tu inclus main.c qui lui va inclure tableau.h qui inclus main.c .... o_O et c'est repartit pour la boucle 


        et aussi pourquoi #include <stdio.h> dans ton fichier tableau.h ... quel intérêt ?? 

        • Partager sur Facebook
        • Partager sur Twitter
          4 juillet 2015 à 11:37:19

          Bonjour Cocksipus et Warren79,

          Tout d'abord merci d'avoir répondu si rapidement.

          Je pensais que c'était nécessaire pour récupérer les valeurs que j'avais initialisé en "main.c"

          Et pour le <stdio.h> c'est une habitude, je ne sais pas vraiment à quoi sert cette bibliothèque pour le moment, donc je me contente de la mettre en haut de chaque code.

          • Partager sur Facebook
          • Partager sur Twitter
            4 juillet 2015 à 11:47:08

            Maintenant que j'ai enlevé ce que vous m'avez signalé, le code compile mais le résultat obtenu n'est pas celui auquel je m'attendais ^^'

            Voici ce que j'obtient dans la console :

            Voici les données du tableau :

            Moyenne = 5.750000

            La somme des valeurs du tableau est égale à 23.

            1

            1

            7

            7

            3

            3

            12

            12

            Copie Tableau:


            Edit : j'ai placé le printf avant la fonction copier, c'est rentré dans l'ordre, mais pourquoi les valeurs sont-elles en double ??

            -
            Edité par XF0Y 4 juillet 2015 à 11:48:35

            • Partager sur Facebook
            • Partager sur Twitter
              4 juillet 2015 à 11:48:41

              Lu'!

              Quelques remarques.

              • une taille c'est une valeur strictement positive, on a bien envie d'avoir un "unsigned" ou encore un "size_t" le type des tailles,
              • Si on regarde ton code :
                double moyenneTableau(int tableau[], int tailleTableau){
                    int i;
                    double moyenne = 0, somme = 0;
                     
                    for (i = 0 ; i < tailleTableau ; i++){
                        somme = somme + tableau[i];
                    }     
                    moyenne = somme/tailleTableau;
                     
                    return moyenne;
                }
                  
                  
                int sommeTableau(int tableau[], int tailleTableau){
                    int i, somme = 0;
                     
                    for (i = 0 ; i < tailleTableau ; i++){
                        somme = somme + tableau[i];
                    }
                     
                    return somme;
                }
                Do not Repeat Yourself, le code de la somme est dupliqué, d'ailleurs c'est sûrement un copier/coller (pas bien :p ) :
                double moyenneTableau(int tableau[], int tailleTableau){
                    double somme = sommeTableau(tableau, tailleTableau);
                    double moyenne = somme/tailleTableau;
                     
                    return moyenne;
                }
                  
                  
                int sommeTableau(int tableau[], int tailleTableau){
                    int i, somme = 0;
                     
                    for (i = 0 ; i < tailleTableau ; i++){
                        somme = somme + tableau[i];
                    }
                     
                    return somme;
                }

              -
              Edité par Ksass`Peuk 4 juillet 2015 à 11:51:22

              • Partager sur Facebook
              • Partager sur Twitter

              Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C

                4 juillet 2015 à 12:08:18

                Bonjour Ksass'Peuk,

                Merci pour le conseil, j'ai vu le unsigned mais par contre "size_t" ne me dis rien je ferais une recherche !

                Et oui bien vu pour le copier/coller je ne m'en était même pas rendu compte ahah ^^

                • Partager sur Facebook
                • Partager sur Twitter
                  4 juillet 2015 à 17:23:14

                  Hello,

                  Et on peut encore faire plus simple (juste pour info, car Ksass'Peuk aurait pu l'écrire sans problème):

                  double moyenne(int tableau[],int tailleTableau) {
                      return((double)sommeTableau(tableau,tailleTableau)/tailleTableau);
                  }

                  A+

                  Edgar;

                  -
                  Edité par edgarjacobs 4 juillet 2015 à 17:44:14

                  • Partager sur Facebook
                  • Partager sur Twitter

                  On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                  Problème Exercice 3 - Les tableaux

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown