Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème exercices Tableaux

exercice n°1 des tutos de Mateo.

Sujet résolu
    3 janvier 2009 à 22:20:38

    Bonjour/bonsoir tout le monde

    Alors voilà, je suis nouvelle sur le site et je me suis mise a la programation grâce aux cours de Mateo.

    Je bute a l'exercice n°1 des tableaux.

    voilà mon code source:

    #include <stdio.h>
    #include <stdlib.h>

    long sommeTableau(long tableau[], long tailleTableau);


    int main(int argc, char *argv[])
    {
    long tableau[4] = {7,9}, i = 0;

    i = sommeTableau (tableau, 4);

    printf("la somme est %ld\n", i);

    system("PAUSE");
    return 0;
    }

    long sommeTableau(long tableau[], long tailleTableau)
    {
    long i;

    tableau [i] = tableau[0] + tableau[1] + tableau[2] + tableau[3];
    return i;
    }


    Quand je compile/execute, j'ai le droit a un superbe message d'erreur. Aucun bug a la compilation mais une erreur disant que mon programme doit fermé =/

    Voilà voilà, j'espere que vous pourrez m'aider =)

    PS: j'utilise DevC++, au cas où ça puisse aider :p

    Amicalement,
    Tenshi.
    • Partager sur Facebook
    • Partager sur Twitter
      3 janvier 2009 à 22:26:29

      Salut et bienvenue sur le forum,

      Pourquoi le programme plante-t-il ?
      Dans la fonction sommeTableau :
      long i;
      
      tableau [i] = ...
      

      Tu utilises une variable non initialisée pour accéder à une case du tableau; une variable non initialisée peut contenir n'importe quoi, et donc il y a de très forte chance pour que dépasses la taille du tableau => boom.

      Tu pourrais simplement faire ceci :
      long sommeTableau(long tableau[], long tailleTableau)
      {
      long somme;
      
      somme = tableau[0] + tableau[1] + tableau[2] + tableau[3];
      return somme;
      }
      

      Cependant, l'idée est de s'adapter automatiquement à la taille du tableau (c'est à ça que sert le second paramètre de la fonction), et donc, d'utiliser une boucle ;)
      • Partager sur Facebook
      • Partager sur Twitter
        3 janvier 2009 à 22:44:04

        Suite a ton aide j'ai tenter de modifier en faisant une boucle for =)

        long sommeTableau(long tableau[], long tailleTableau)
        {
          long i;
        
          for (i = 0; i < tailleTableau ; tableau[0] + tableau[1] + tableau[2] + tableau[3])
          return i;
        }
        


        que voici. Seulement, celà m'affiche une console disant que le résultat:

        la somme est 8


        j'ai utiliser les même valeurs que précédement, soit

        long tableau[4] = {7,9}
        


        L'avantage est que j'ai reussi a trouver le chiffre entre les deux...>.<
        *tente de se soulager la concience* :lol:

        Amicalement,
        Tenshi.
        • Partager sur Facebook
        • Partager sur Twitter
          3 janvier 2009 à 22:52:35

          Oula !
          Je me demande bien comment tu arrives à obtenir un tel résultat :
          Dans ta boucle, tu retournes directement la valeur de i à la première itération, i vaut donc zéro et c'est ce qui devrait s'afficher.

          Sinon, ce n'est toujours pas bon : d'une part car la boucle for() en l'état ne sert à rien, d'autre part, même si elle servirait à quelque chose, on est toujours dépendant de la taille du tableau (comprendre que si tu veux calculer la somme d'un tableau de 6 cases, il faudra que tu modifies ton code puis que tu recompiles, c'est ce qu'il faut éviter.

          Pour faire plus simple : comment afficherais-tu le contenu d'un tableau ? (à l'aide d'une boucle, et sans écrire tableau[0], tableau[1] etc..)
          • Partager sur Facebook
          • Partager sur Twitter
            3 janvier 2009 à 23:08:39

            Faire une boucle pour afficher le contenu du tableau?
            Personnellement j'aurais mit:

            long tableau[4] = {7,9}, i = 0;
                
              while (i < 4)
              { 
                     i++;
                    printf("la somme est %ld\n", i);
              }
            


            mais ça n'a pas l'air d'être ça >.> pour celà me semble être la même chose que dans le cours sauf que la boucle est while plutot que for...(j'arrive un peu plus a lire une boucle en while qu'en for en fait ^^")

            Amicalement,
            Tenshi, qui se sent vraiment petite...toute petite...
            • Partager sur Facebook
            • Partager sur Twitter
              3 janvier 2009 à 23:10:33

              bonjour :
              long sommeTableau(long tableau[], long tailleTableau);
              


              une solution serait :
              début
              somme <--- 0
              pour i variant de 0 jusqu'à tailleTableau
                  somme <--- somme + tableau[i]
                  fin pour i
              retour du résultat somme
              fin
              


              si tu fais tourner ce code à la main :
              valeur de i                valeur de somme
              0                          0 + tableau[0]
              1                          0 + tableau[0] + tableau[1]
              ...........
              tailleTableau              0 + tableau[0] + tableau[1]+....+tableau[tailleTableau]

              @+


              PS :
              ton code :
              long tableau[4] = {7,9}, i = 0;
                  
                while (i < 4)
                { 
                       i++;
                      printf("la somme est %ld\n", i);
                }
              

              la variable i prend quoi comme valeur de départ ?
              tu l'as ni cree, ni initialisée !
              cette boucle affiche si c'est bien fait les valeurs de i !
              • Partager sur Facebook
              • Partager sur Twitter
                3 janvier 2009 à 23:24:36

                Oh, je pensais pourtant l'avoir créée et initialisée grace au

                i = 0
                


                situé après le tableau =/
                • Partager sur Facebook
                • Partager sur Twitter
                  3 janvier 2009 à 23:32:00

                  Autant pour moi, ta variable est bien cree et initialisee.

                  De plus il y a plein d'erreur dans ton code :
                  long tableau[4] = {7,9}, i = 0;
                      
                    while (i < 4)
                    { 
                           i++;
                          printf("la somme est %ld\n", i);
                    }
                  



                  ceci est correct :
                  long tableau[4] = {7,9};
                  int i = 0;
                      
                    while (i < 4)
                    { 
                           i++;
                          printf("la somme est %ld\n", i); /* par contre ici c'est pas la somme qui s'affiche mais les valeurs de i ?[0,4[ */
                    }
                  
                  • Partager sur Facebook
                  • Partager sur Twitter
                    3 janvier 2009 à 23:37:03

                    #include <stdio.h>
                    #include <stdlib.h>
                    
                    int main(int argc, char *argv[])
                    {
                      long tableau[4] = {7,9};
                      int i;
                      i = 0;
                        
                    for( i = 0; i<4 ; i++)
                    printf("%ld\n", i);
                      system("PAUSE");	
                      return 0;
                    }
                    


                    resultat:

                    0
                    1
                    2
                    3


                    ça ne change rien au résultat avec mon autre code source =S et idem lorsque que je met i en long ou tableau en int. =(

                    Je commence a croire que mon IDE plante >.> ou que mon ordi m'en veut \o/ ben quoi?...

                    Amicalement,
                    Tenshi.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      3 janvier 2009 à 23:41:47

                      regardes plus haut la solution , je t'ai donnée !
                      si tu n'y arrives pas aujourd'hui, la nuit porte conseil
                      @+
                      • Partager sur Facebook
                      • Partager sur Twitter
                        3 janvier 2009 à 23:46:32

                        Ce n'est pas l'IDE qui est en faute.
                        Avec ce code:

                        #include <stdio.h>
                        #include <stdlib.h>
                        
                        int main(int argc, char *argv[])
                        {
                          long tableau[4] = {7,9};
                          int i;
                          i = 0;
                            
                        for( i = 0; i<4 ; i++)
                        printf("%ld\n", i);
                          system("PAUSE");	
                          return 0;
                        }
                        

                        Tu affiches simplement les valeurs de i, qui sont : 0, 1, 2 et 3. En aucun cas tu ne touches au tableau. Ou est le rapport entre ta variable i et les éléments du tableau ? Ce que tu veux faire, c'est avoir la somme de tous les éléments du tableau. Tu étais parti sur:

                        somme = tableau[0] + tableau[1] + tableau[2] + tableau[3]; // Avec l'aide de freecircus

                        Ce qui est juste pour ce cas (avec 4 éléments). Seulement, il ne faut pas faire la somme pour un cas précis, mais pour n'importe quel cas (comprendre n'importe quelle taille du tableau). Il te faut donc absolument une boucle (while ou for).
                        Cette boucle va parcourir TOUT ton tableau grâce à une variable i. Mais avec cette variable, tu accèdes simplement aux ELEMENTS du tableau (tableau[i]). En aucun cas il ne faudra ajouter i à la somme ou autre chose. Ce n'est qu'un itérateur.
                        Ce qu'il te faut, c'est une variable somme qui ajoutera tous les éléments du tableau (grâce à la boucle):
                        Au final tu auras : somme = tableau[0] + tableau[1] + ... + tableau[taille-1]

                        A toi d'écrire la boucle principale.

                        EDIT: zx-spectrum t'a donné la solution:

                        début
                        somme <--- 0
                        pour i variant de 0 jusqu'à tailleTableau
                            somme <--- somme + tableau[i]
                            fin pour i
                        retour du résultat somme
                        fin


                        Ceci marche pour le cas général.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          4 janvier 2009 à 1:12:07

                          en fait, ton printf dans la boucle doit être : (n'affiche que si tu est très bloquée ...)
                          printf("la valeur de la case du tableau actuelle est : %ld", tableau[i]);(
                          


                          zx-spectrum : Que dis-tu ? sa déclaration i est parfaite... en quoi ça te gêne que ce soit un long ???
                          (ok, j'arrive après la bataille... :lol: )

                          si tu bloque encore demain, je te ferai un code complet vite fait...
                          • Partager sur Facebook
                          • Partager sur Twitter
                            4 janvier 2009 à 2:26:20

                            Salut voici mon code du 1ier exercice sur les tableaux

                            #include<stdio.h>
                            #include<stdlib.h>
                            
                            long sommeTableau(long tableau[], long tailleTableau);
                            
                            int main()
                            {
                                long tableau[4] = {3, 5, 7, 9};
                                long toto;
                            
                                toto = sommeTableau(tableau, 4);
                                printf("%d", toto);
                                return 0;
                            }
                            
                            long sommeTableau(long tableau[], long tailleTableau)
                            {
                                long i;
                                long variable = 0;
                            
                                for (i = 0; i < tailleTableau; i++)
                                {
                                    variable = variable + tableau[i];
                                }
                                return variable;
                            }
                            
                            • Partager sur Facebook
                            • Partager sur Twitter
                              4 janvier 2009 à 2:32:29

                              Presque parfait, quelques petites remarques :
                              - Si une fonction ne prend pas d'argument, il faut le préciser avec void a la déclaration :
                              int main( void )
                              {
                              
                              - Le formateur des long avec printf c'est %ld et pas %d
                              - Donne des noms compréhensibles a tes variables, somme ou total plutot que toto
                              • Partager sur Facebook
                              • Partager sur Twitter
                                4 janvier 2009 à 2:37:15

                                ok, mais normalement pour des float ou double on met %lf et chez moi ca marche pas il n'y a que %f qui marche(je suis sous code::block) sinon pour le reste je suis d'accord meme si c'est pas si grave que ca, sinon je suis fier de mon prog il est propre, simple, ça fait zizir ;)
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  4 janvier 2009 à 2:40:42

                                  En fait, concernant les formateurs de printf, c'est (pour les plus courants):
                                  - %d pour les int
                                  - %ld pour les long
                                  - %Ld pour les long long (C99)
                                  - %f pour les float et les double
                                  - %p pour les adresses
                                  http://www.cplusplus.com/reference/cli [...] o/printf.html

                                  Pour scanf, il y a en plus %lf pour les double
                                  http://www.cplusplus.com/reference/cli [...] io/scanf.html
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    4 janvier 2009 à 2:49:02

                                    ok, je regarderais ça pour le moment je vais aller dire bonjour à morphé bye
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      4 janvier 2009 à 9:30:35

                                      C'est bien dommage de lui donner des solutions toutes faites alors qu'elle confond par exemple ici dans son code:
                                      long tableau[4] = {7,9}, i = 0;
                                          
                                        while (i < 4)
                                        { 
                                               i++;
                                              printf("la somme est %ld\n", i);
                                        }
                                      

                                      i l'indice du tableau et tableau [i] avec i€[0,4[ qui est un élément du tableau.

                                      Ensuite j'espère qu'elle aura compris que pour avoir la somme de ses elements du tableau il faut faire :
                                      creer & initialiser une variable somme à 0
                                      puis ensuite :
                                      somme=somme + tableau [i] avec i variant de [0,4[.

                                      Au passage n'hésite pas a demander Tenshi des explications nécessaires, au début on a tous "ramés"........

                                      pour Tobast :

                                      Citation : tobast

                                      zx-spectrum : Que dis-tu ? sa déclaration i est parfaite... en quoi ça te gêne que ce soit un long ???


                                      effectivement il m'arrive de déraper, je suis allez trop vite mea culpa.je rectifie
                                      @+

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        4 janvier 2009 à 10:20:03

                                        Citation : tobast

                                        zx-spectrum : Que dis-tu ? sa déclaration i est parfaite... en quoi ça te gêne que ce soit un long ???


                                        Pourquoi mettre un long quand un int suffit ?
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          4 janvier 2009 à 10:49:40

                                          Citation : Tenshi Kuro

                                          Alors voilà, je suis nouvelle sur le site


                                          Alors va vite lire les règles du forums. Il y est expliqué comment poster du code correctement.

                                          Citation : Pas de titre


                                          Je bute a l'exercice n°1 des tableaux.
                                          voilà mon code source:
                                          <...>
                                          Quand je compile/execute, j'ai le droit a un superbe message d'erreur. Aucun bug a la compilation mais une erreur disant que mon programme doit fermé =/



                                          Si il est bien réglé,

                                          http://mapage.noos.fr/emdel/codage.htm#cfg_compilo

                                          ton compilateur peux t'aider à trouver les bugs :
                                          -------------- Build: Debug in hello ---------------
                                          
                                          Compiling: main.c
                                          Linking console executable: bin\Debug\hello.exe
                                          C:\dev\hello\main.c:7: warning: unused parameter 'argc'
                                          C:\dev\hello\main.c:7: warning: unused parameter 'argv'
                                          C:\dev\hello\main.c:19: warning: unused parameter 'tailleTableau'
                                          C:\dev\hello\main.c: In function `sommeTableau':
                                          C:\dev\hello\main.c:21: warning: 'i' might be used uninitialized in this function
                                          Output size is 18.75 KB
                                          Process terminated with status 0 (0 minutes, 0 seconds)
                                          0 errors, 4 warnings

                                          Une fois le bug corrigé, le fonctionnement devrait êre plus stable.

                                          Ceci dit, il y a un grave problème de codage.

                                          - Selon toi, à quoi sert le paramètre 'tailleTableau'
                                          - Quel serait le code si le tableau faisait 3 cases ou 5 ou 500 ?

                                          Il est un principe simple à saisr dès le début de l'étude de la programmation. Dès qu'il y a tableau, c'est qu'on cherche à automatiser les traitements, et que les boucles et les index ne sont pas loin...

                                          Je te laisse réfléchir...

                                          @dum : tu squattes. Caÿ mal. Si tu as une question ou une soumission, ouvre une nouvelle discussion.

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                          Music only !
                                            4 janvier 2009 à 12:12:46

                                            Bonjour tout le monde =)

                                            tout d'abord merci a tous pour les petits conseils etc :p et surtout pour votre aide.
                                            J'ai fais en sorte de ne pas regarder le code source tout fait de @dum par contre, car ça me titillait de ne pas comprendre ^^.

                                            voilà mon code source, il marche et l'IDE ne dévoile pas de faute, j'espere ne pas en avoir fait ^^

                                            #include <stdio.h>
                                            #include <stdlib.h>
                                            
                                            long sommeTableau(long tableau[], long tailleTableau);
                                            
                                            
                                            int main(int argc, char *argv[])
                                            { long tableau[4] = {7,9};
                                              long Total = 0;
                                              
                                              Total = sommeTableau (tableau,4);
                                            
                                              printf("la somme des valeurs du tableau est %ld\n\n", Total);
                                            
                                              system("PAUSE");
                                              return 0;
                                            }
                                            
                                            long sommeTableau(long tableau[], long tailleTableau)
                                            
                                            {  long i=0;
                                               long somme = 0;
                                            
                                            while (i < tailleTableau)
                                               {
                                                somme += tableau[i];
                                                i++;
                                               }
                                               
                                            return somme;
                                            }
                                            


                                            Encore merci a tout le monde =)

                                            Amicalement,
                                            Tenshi.
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              4 janvier 2009 à 12:19:00

                                              long tableau[4] = {7,9};
                                              

                                              Pourquoi déclares-tu un tableau de 4 long et tu en initialises que 2 ?

                                              while (i < tailleTableau)
                                                 {
                                                  somme += tableau[i];
                                                  i++;
                                                 }
                                              


                                              Je trouve qu'une boucle for serait plus adapté ici car elle te permettrait d'initialiser i à 0 puis de l'incrémenter de la même façon. Après c'est une question de goût ;)

                                              Et essayes de te fixer une convention pour l'indentation.
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                4 janvier 2009 à 12:20:21

                                                Citation : Tenshi Kuro

                                                voilà mon code source


                                                Correct. Je propose ceci :
                                                #include <stdio.h>
                                                
                                                long sommeTableau (long tableau[], long tailleTableau)
                                                {
                                                   long i = 0;
                                                   long somme = 0;
                                                
                                                   while (i < tailleTableau)
                                                   {
                                                      somme += tableau[i];
                                                      i++;
                                                   }
                                                
                                                   return somme;
                                                }
                                                
                                                int main (void)
                                                {
                                                   long tableau[4] = { 7, 9 };
                                                   long Total = 0;
                                                
                                                   Total = sommeTableau (tableau, 4);
                                                
                                                   printf ("la somme des valeurs du tableau est %ld\n\n", Total);
                                                
                                                   return 0;
                                                }
                                                

                                                On peut aussi utiliser la boucle for qui est bien adaptée au parcours complet d'un tableau. Je te laisse réécrire ce code avec une boucle for à la place du while.

                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                Music only !
                                                  4 janvier 2009 à 12:32:22

                                                  include <stdio.h>
                                                  #include <stdlib.h>
                                                  long sommeTableau(long tableau[], long tailleTableau)
                                                  {
                                                  long i;
                                                  long somme = 0;
                                                  
                                                  for(i = 0; i < tailleTableau; i++)
                                                      {
                                                        somme += tableau[i];
                                                      }
                                                  return somme;
                                                  }
                                                  
                                                  
                                                  
                                                  int main(void)
                                                  {
                                                    
                                                    long tableau[4] = {7,9};
                                                    long Total = 0;
                                                    
                                                    Total = sommeTableau (tableau,4);
                                                  
                                                    printf("la somme des valeurs du tableau est %ld\n\n", Total);
                                                      system("PAUSE");
                                                    return 0;
                                                  }
                                                  


                                                  Comme ceci? :euh:
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                  Anonyme
                                                    4 janvier 2009 à 12:33:35

                                                    Oui ^^
                                                    Mais avec une meilleure indentation, c'est mieux ;)
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      4 janvier 2009 à 12:45:46

                                                      Une meilleure indentation? :euh: *shy* C'est à dire? ^^" plus d'espace entre les lignes de code?
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                      Anonyme
                                                        4 janvier 2009 à 13:05:32

                                                        On va faire avec un petit exemple :

                                                        Indentation mauvaise (quelque chose d'illisible, nom de variable peu clairs, pas d'espace...)
                                                        #include<stdio.h>
                                                        
                                                        int  main(void){
                                                        long tbl[]={7,9, 18, 45}; 
                                                            printf("%ld",tbl[1]);
                                                        return 0; }
                                                        


                                                        Meilleure indentation (selon la norme ANSI)
                                                        #include <stdio.h>
                                                        
                                                        int main(void)
                                                        {
                                                            long tab[] = {7, 9, 18, 45};
                                                            
                                                            printf("%ld", tab[1]);
                                                            
                                                            return 0;
                                                        }
                                                        

                                                        Ceci n'est pas vraiment un bon exemple, tout le monde ne code pas selon la norme ANSI, mais c'est tout de même plus naturel et plus clair de voir un code présenté ainsi.
                                                        • Partager sur Facebook
                                                        • Partager sur Twitter

                                                        Problème exercices 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