Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Exercices] Les tableaux

Besoin d'aide sur l'exercice 4 du cours sur les tableaux

Sujet résolu
    19 avril 2018 à 1:25:33

    Messieurs, Mesdames, bonsoir,

    Ce sujet a dû ressortir plusieurs fois, mais cela fait 2 jours que je bloque sur l'exercice 4 du cours sur les tableaux, j'ai revu ma fonction, plusieurs fois (utilisé différents types de boucles, de conditions... Rien n'y fait) Par conséquent, je vous demande votre aide et surement de meilleurs yeux que moi.

    j'ai créé un fichier main.c et main.h pour une meilleure visibilité.

    Voici le main.c :

    #include <stdio.h>
    #include <stdlib.h>
    #include "main.h"
    
    int sum = 0;
    double moyenne = 0;
    int maxval = 0;
    int main(int argc, char *argv[])
    {
        int tableau[4] = {15, 23, 33}, tableau1[4] = {0};
        afftab(tableau, 4);
        sommeTab(tableau, 4, &sum);
        moytab(&moyenne, &sum);
        printf("La somme du tableau est de %d\n", sum);
        printf("La moyenne du tableau est de %f\n\n", moyenne);
        copietab(tableau, tableau1);
        printf("Saisissez la valeur maximum pour remettre a zero la case du tableau :\n\n");
        scanf("d%", &maxval);
        Maxtab(tableau1, 4, &maxval);
        afftab(tableau1, 4);
    
        return 0;
    
    }

    Et voici le main.h :

    #ifndef MAIN_H_INCLUDED
    #define MAIN_H_INCLUDED
    
    void afftab(int tableau[], int tailletab)
    {
        int i;
        for (i = 0; i < tailletab; i++)
        {
            printf("%d\n", tableau[i]);
        }
    }
    
    int sommeTab(int tableau[], int tailletab,int *somme)
    {
        int i;
        for (i = 0; i < tailletab; i++)
        {
            *somme = *somme + tableau[i];
        }
    }
    
    double moytab (double *moy, int *somme)
    {
        *moy = *somme / 2;
    }
    
    int copietab (int tableau[], int tableau1[])
    {
        tableau1 = tableau;
        printf("le tableau copie est : \n");
        afftab(tableau1, 4);
    }
    
    void Maxtab(int tableau[], int tailletab, int *valmax)
    {
    int i = 0;
    
    do
    {
    if (tableau[i] < *valmax)
      {
          i++;
      }
    
    else
      {
        tableau[i] = 322;
        i++;
      }
    
    } while (i < tailletab);
    
    }
    #endif // MAIN_H_INCLUDED

    Mon casse tête est le suivant :

    La dernière fonction (void Maxtab) n'effectue pas son travail correctement, soit toutes les "cases" du tableau sont à 322 avec le code tel quel, soit avec d'autres fonctions :

    for (i = 0; i < tailletab; i++) 
    {
      if (tableau[i] > *valmax);
       {
         tableau[i] = 0
       }
    }

    j'obtiens tout à 0... Je me doute avoir fait une erreur quelque part, mais là je sèche un peu... J'ai l'impression d'avoir un soucis avec le pointeur valmax.

    Si vous avez des idées, elles sont les bienvenues !
    Merci d'avance ;)

    • Partager sur Facebook
    • Partager sur Twitter
      19 avril 2018 à 9:07:35

      Bonjour ! C'est pas clair !

      Pourrais-tu expliquer ce qu'est sensé faire la fonction 'Maxtab' ? En me creusant les méninges pour comprendre, j'ai l'impression qu'elle remplace les valeurs inférieures à un maximum donné (*valmax) par 322. C'est bien ça ? (C'est bizarre, une fonction pareille... À la limite je les aurais remplacés par *valmax.) A priori je ne vois pas de raison pour que la fonction ne marche pas. Tu as utilisé quoi, comme valeur de *valmax ? Affiche sa valeur dans la fonction 'Maxtab' pour être sûr que c'est toujours la bonne. Est-ce que tu as vérifié que 'tableau1' est bien la recopie de 'tableau', y compris lorsqu'on est sorti de la fonction de recopie ?

      Et c'est quoi ces histoires d'autres fonctions ? On parle de qui, de Maxtab ou d'autre chose ? Et pourquoi, dans la boucle que tu as mis à part, tu testes si tableau[i] est supérieur à *valmax ? Je comprends rien. Quel est le problème ?

      Bon, je reviens, je vais prendre une aspirine... ;)

      (Ce qui n'aide pas à te lire, aussi, c'est que tu utilises des do... while au lieu de for, et tous tes arguments de fonctions sont des pointeurs même quand ça n'est pas nécessaire. C'est exprès ?)

      -
      Edité par robun 19 avril 2018 à 9:16:50

      • Partager sur Facebook
      • Partager sur Twitter
        19 avril 2018 à 11:28:07

        Pourquoi tu envois l'adresse de maxval à ta fonction Maxtab (ligne 19 de main.c). Ce n'est pas plutôt sa valeur que tu souhaites envoyer ?
        • Partager sur Facebook
        • Partager sur Twitter
          19 avril 2018 à 13:47:37

          BarashKa a écrit:

          Messieurs, Mesdames, bonsoir,

          Ce sujet a dû ressortir plusieurs fois, mais cela fait 2 jours que je bloque sur l'exercice 4 du cours sur les tableaux

          Bonjour,

          Tu n'as respecté la donnée d'aucun des exercices sur les tableaux. Ni pour la somme, ni pour la moyenne, ni pour la copie, ni pour le maximum. Tu as tout faux dès le départ.

          • Partager sur Facebook
          • Partager sur Twitter
            19 avril 2018 à 14:40:15

            Bonjour !

            @rouloude : J'ai envoyé l'adresse sur le pointeur de la fonction... mais situ me pose la question c'est qu'il y a déjà un soucis la dessus...

            @ Marc Mongenet : J'ai du mal à saisir ta remarque, je n'ai pas fait de copier/coller des indices donnés pour les exercices, j'ai voulu utiliser les notions apprises précédemment (pointeurs). Juste pour te préciser, les autres fonctions s'accomplissent bien, mais ce n'est pas ce qui est demandé c'est vrai.

            Ok, je vais rester sur le sobre afin de bien comprendre ce qui m'est demandé.

            Merci pour vos réponses les amis :).
            • Partager sur Facebook
            • Partager sur Twitter
              19 avril 2018 à 14:52:00

              Hello,

              Ta fonction sommeTab() a un gros problème: teste ceci (tu ajoutes juste ce code dans ton main):

              int array1[]={1,2,3,4};
              int array2[]={5,6,7,8};
              
              affTab(array1,4);
              sommeTab(array1,4,&sum);
              printf("Somme=%d\n",sum);
              affTab(array2,4);
              sommeTab(array2,4,&sum);
              printf("Somme=%d\n",sum);
              


              -
              Edité par edgarjacobs 19 avril 2018 à 14:56:59

              • 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

                19 avril 2018 à 16:24:49

                BarashKa : je pense que rouloude s'est laissé embrouiller par le fait que tous tes arguments de fonction sont des pointeurs, ce qui est complètement inhabituel et m'a bien embrouillé aussi... (apparemment tu aimes les pointeurs ;) ) Donc regarde en priorité les autres problèmes.

                -
                Edité par robun 19 avril 2018 à 16:25:18

                • Partager sur Facebook
                • Partager sur Twitter
                  19 avril 2018 à 21:14:42

                  robun a écrit:

                  BarashKa : je pense que rouloude s'est laissé embrouiller par le fait que tous tes arguments de fonction sont des pointeurs, ce qui est complètement inhabituel et m'a bien embrouillé aussi... (apparemment tu aimes les pointeurs ;)) Donc regarde en priorité les autres problèmes.

                  C'est en cela que la donnée n'a pas été respectée. Et du coup les fonctions ont des prototypes tarabiscotés, d'un style déplorable par rapport à ce que les fonctions doivent faire.

                  BarashKa, lorsqu'un exercice d'informatique donne le prototype d'une fonction à implémenter

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

                  ne pas implémenter une fonction ayant ce prototype revient à ne pas faire l'exercice. C'est comme si dans un exercice de calcul on demande ce que vaut 123+456 et qu'à la place on écrit 987+654=1641. C'est faux avant même d'avoir commencé.



                  • Partager sur Facebook
                  • Partager sur Twitter
                    19 avril 2018 à 22:09:01

                    Entendu, là j'ai bien compris vos argumentations et vais me tenir explicitement aux exercices pour tout les chapitres.

                    @Robun : Excuse moi l'ami je n'avais pas vu ton message (tu as été le premier à répondre en plus).

                    Pour ton premier post, oui tu as bien compris pour la fonction Maxtab, elle met la valeur à 322 (car j'avais un autre soucis à la base et je voulais tester si mon "if" fonctionnait ou si il sautait à la trappe dans la fonction). Et j'ai utilisé le "for" au tout début la fonction contenait juste un for avec un "if" pour tester *valmax < ou > que tailletab... Mais ça n'a pas fonctionné... Codeblocks me disait qu'il attendait un "(" avant ";", sauf que tout était correctement écrit (je me suis crevé les yeux dessus quelques heures avant de faire un while pour que sa compile...) La valeur *valmax est saisie par l'utilisateur (ce qui me permettait de tester de différentes manières le programme...)

                    Bref lol... Oui j'ai bien aimé la notion de pointeurs, j'ai d'ailleurs voulu tester ça dès que possible pour bien m’intégrer le fonctionnement de ces petites bestioles... Ce qui m'a conduit à ce type de codage OVNI ^^.

                    @edgarjacobs : Je vais tester ça ce soir avant de tout effacer pour recommencer, je reviens vers toi ;).

                    @Marc Mongenet : Effectivement je fais une addition mais pas des bons chiffres, vu comme ça, c'est pas con ! :). J'en reviens (pour me justifier même si on s'en fou) à vouloir tester la notion de pointeurs, après les utiliser à tord et à travers... Bah ça donne ça ! ^^

                    Merci pour vos conseils les amis je vais reprendre tout ça, ça devrait être bon cette fois ;p

                    • Partager sur Facebook
                    • Partager sur Twitter
                      19 avril 2018 à 22:30:31

                      BarashKa a écrit:

                      @Marc Mongenet : Effectivement je fais une addition mais pas des bons chiffres, vu comme ça, c'est pas con ! :). J'en reviens (pour me justifier même si on s'en fou) à vouloir tester la notion de pointeurs, après les utiliser à tord et à travers... Bah ça donne ça ! ^^

                      Dans le prototype donné par l'exercice du cours,

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

                      la variable tableau est un pointeur de int. La notation avec les crochets est trompeuse, mais il faut savoir que ce prototype est strictement équivalent à

                      int sommeTableau(int *tableau, int tailleTableau);






                      • Partager sur Facebook
                      • Partager sur Twitter
                        19 avril 2018 à 23:33:33

                        @ Marc Mongenet : Yes un tableau est un pointeur de part nature ! Si j'ai bien compris pour "tableau[i]" tu peux aussi écrire "*(tableau + i)". Non mais je vais reprendre à zéro ça sera mieux pour tout le monde et mon hygiène mentale.

                        @ edgarjacobs : Ah ouais je vois ce que tu veux dire... je vais me pencher dessus là c'est pas normal. Ça mérite investigation !
                        • Partager sur Facebook
                        • Partager sur Twitter
                          20 avril 2018 à 1:53:02

                          Oh non, la nature d'un tableau est extrêmement différente de celle d'un pointeur. Un pointeur ne contient qu'une valeur scalaire. Tandis qu'un tableau est multivalué, et peut contenir à peu prêt n'importe quoi: entiers, pointeurs, structures, tableaux, etc.

                          Là où les tableaux se confondent avec les pointeurs, c'est quand on utilise une variable de type tableau dans une expression: dans la plupart des cas, on se retrouve avec l'adresse du premier élément du tableau (donc une valeur de type pointeur).

                          x[y] est effectivement équivalent à *(x+y). Mais tu sais, l'opérateur [] opère sur des pointeurs, tout comme l'opérateur unaire *. Si l'on peut écrire tableau[0] = 123; c'est parce que tableau est évalué comme l'adresse de son premier élément (donc une valeur de type pointeur). S'il n'y avait pas cette conversion implicite, on ne pourrait pas utiliser l'opérateur [] sur les tableaux.

                          • Partager sur Facebook
                          • Partager sur Twitter
                            20 avril 2018 à 2:45:03

                            Aaaah :) Un tableau peut contenir des pointeurs... ça m'a l'air puissant ça !
                            Après effectivement j'ai manqué de précision lorsque j'ai dis que la nature d'un tableau était celle d'un pointeur !

                            J'espère en apprendre autant que toi avec les cours et les autres ressources sur le web ! Je vais approfondir sur les opérateurs, ça me permettra de mieux appréhender le futur ;).

                            D'ailleurs si tu as des ressources à me proposer pour compléter les cours d'open class room, je suis preneur !
                            • Partager sur Facebook
                            • Partager sur Twitter
                              23 avril 2018 à 1:17:15

                              Juste un retour vers vous, j'ai pu solutionner mon problème, en suivant vos conseils et en reprenant les modèles comme dans l'exercice.

                              Pourquoi faire simple quand on peut faire compliqué... ^^

                              En tous cas merci !

                              • Partager sur Facebook
                              • Partager sur Twitter

                              [Exercices] 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