Partage
  • Partager sur Facebook
  • Partager sur Twitter

J'arrive pas a résoudre cette exercice!

Sujet résolu
    27 janvier 2020 à 7:28:22

    Ecrire une fonction récursive qui permet de calculer le nombre de valeurs inférieurs à une valeur donnée "val" dans une matrice "M(n,m)"...

    ça m'affiche constamment le résultat "0" c bizarre, voila mon code:

    #include <stdio.h>

    #include <stdlib.h>

    int lignes=3;

    int colonnes=3;

    int i=0;

    int j=0;

    static int compteur=0;

    void fonction(int matrice[lignes][colonnes],int valeur,int i,int j,int compteur){

           if(valeur==0) return;

           else{

                 if(i<=lignes){

                                if(matrice[i][j]<valeur){

                                        if (j<=colonnes) fonction(matrice,valeur,i,j+1,compteur+1);

                                        else                    fonction(matrice,valeur,i+1,0,compteur+1);

                               }

                               else{

                                       if (j<=colonnes) fonction(matrice,valeur,i,j+1,compteur);

                                       else            fonction(matrice,valeur,i+1,0,compteur);

                                      }

                             }

                   }

    }

    int main(int argc,char *argv){

              int matrice[100][100];

               int valeur=0;

              for(int i=0;i<lignes;i++){

                        for(int j=0;j<colonnes;j++){

                               printf("matrice[%d][%d]=",i,j);

                               scanf("%d",&matrice[i][j]);

                            }

            }

            printf("\ndonner une valeur: ");

             scanf("%d",&valeur);

            fonction(matrice,valeur,i,j,compteur);

            printf("%d\n",compteur);

    return 0;

    }

    -
    Edité par AdelHamamouche 27 janvier 2020 à 7:30:59

    • Partager sur Facebook
    • Partager sur Twitter
      27 janvier 2020 à 7:59:41

      Salut,
      Dans ton main tu te définis un tableau 100 x 100.
      Dans ta fonction, il est soi-disant défini 3 x 3.
      Ta fonction ne sait pas comment sont placés en mémoire les 10000 éléments du tableau du main et ne sait pas que tu a 100 lignes et 100 colonnes.
      Une de tes dimensions doit être fixe (les lignes).
      Sinon, tu devras faire le calcul des indices et adresses toi-même.
      • Partager sur Facebook
      • Partager sur Twitter

      Le Tout est souvent plus grand que la somme de ses parties.

        27 janvier 2020 à 8:28:37

        PierrotLeFou a écrit:

        Salut,
        Dans ton main tu te définis un tableau 100 x 100.
        Dans ta fonction, il est soi-disant défini 3 x 3.
        Ta fonction ne sait pas comment sont placés en mémoire les 10000 éléments du tableau du main et ne sait pas que tu a 100 lignes et 100 colonnes.
        Une de tes dimensions doit être fixe (les lignes).
        Sinon, tu devras faire le calcul des indices et adresses toi-même.
        Toujours rien, j'ai mis dans mes dimensions dans le main int matrice[3][3]...tjrs rien! regarde j'ai tjrs ce zéro comme résultat! :(


        • Partager sur Facebook
        • Partager sur Twitter
          27 janvier 2020 à 13:46:30

          Mets ton code dans les </> stp

          Pour ton problème, essaie de faire de changer ta 'fonction' pour qu'elle renvoi un ont (compteur)  Ton cheminement a l'air bon

          • Partager sur Facebook
          • Partager sur Twitter
            27 janvier 2020 à 17:29:10

            Comme l'a dit Asmitta, tu t'attend à ce que la fonction te renvoie quelque chose. Tu l'a déclaré de type 'void' et tu ne fais pas de 'return'.
            La ligne:
                   if(valeur==0) return;
            ne retourne rien.
            Pour la définition, il faut mettre:
            int fonction(int matrice[][100],int valeur,int i,int j,int compteur){
            Parce que les éléments ne sont pas placés de la même façon dans la mémoire pour un tableau 3 x 3 et un tableau 100 x 100.
            La fontion prendra les 9 premiers éléments de la première colonne dont 6 sont probablement nuls.
            • Partager sur Facebook
            • Partager sur Twitter

            Le Tout est souvent plus grand que la somme de ses parties.

              27 janvier 2020 à 19:20:00

              Pour appeler ta fonction tu ecris: fonction(matrice, valeur, i, j, compteur) alors que 'matrice' est un tableau...

              Je me dis que c'est lors du passage de ton tableau a la fonction qu'il y'a probleme. J'ai pas le cours pres de moi et je suis pas trop fort la mais je connais quand meme que la transmission d'un tableau a une fonction se fait avec un * ou & (je doute)...

              • Partager sur Facebook
              • Partager sur Twitter
                27 janvier 2020 à 20:17:03 - Message modéré pour le motif suivant : Merci d'utiliser le bouton code du forum pour insérer votre code


                  27 janvier 2020 à 20:39:11

                  stp, ça t'a déjà été demandé

                  -
                  Edité par edgarjacobs 27 janvier 2020 à 20:44:07

                  • 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

                    27 janvier 2020 à 22:24:24

                    @AdelHamamouche tu me comprends pas, a la ligne 37 de ton code: Tu ecris fonction(matrice,....) or "matrice" est un tableau, donc il faudrait mettre d'apres moi * devant "matrice(ou &). Tu auras un truc du genre : "fonction(*matrice, valeur, i, j, compteur)"...(si tu vois ce que je veux dire).
                    • Partager sur Facebook
                    • Partager sur Twitter
                      28 janvier 2020 à 1:05:54

                      Dans le 'main' on a la définition suivante:
                      int matrice[100][100];
                      ce n'est pas un tableau de pointeurs. C'est bien un tableau à deux dimensions.
                      Il ne faut pas définir la fonction comme un pointeur vers une suite de pointeurs. L'appel de la fonction est correct.
                      Il faut la définir comme j'ai mentionné pour être cohérent avec sa définition du main.
                      Dans la mémoire la 1ière ligne se trouve aux positions [0, 99], la 2ième ligne se trouve à [100, 199], etc.
                      Pour la fonction, la 1ièere ligne se trouve à  [0, 2], la 2ième se trouve à [3, 5], la 3ième à [6, 8]
                      Quand on met des valeurs dans le main, elles se trouvent à:
                      [0, 2], [100, 102], [200, 202]
                      Ce qui ne correspond pas à ce que la fonction attend.
                      Tu veux retourner la valeur dans compteur, je n'ai trouvé nulle part où tu assignes quelque chose à compteur.
                      'compteur' est une variable globale, je ne vois pas pourquoi tu la passe en paramètre.
                      Il y a quelque chose qui ne va pas autour de cette variable ...
                      Même remarque pour les variables 'i' et 'j' qui sont à la fois variables globales et paramètres.
                      Que valent 'i' et 'j' lors de l'appel dans le 'main' (après les 2 boucles)?

                      -
                      Edité par PierrotLeFou 28 janvier 2020 à 5:41:39

                      • Partager sur Facebook
                      • Partager sur Twitter

                      Le Tout est souvent plus grand que la somme de ses parties.

                        28 janvier 2020 à 8:08:11

                        Moi je suis sur que c'est la 11e ligne de ton main() le probleme...on passe pas un tableau en parametre ainsi
                        • Partager sur Facebook
                        • Partager sur Twitter
                          28 janvier 2020 à 8:26:12

                          #include <stdio.h>
                          
                          #include <stdlib.h>
                          
                          int lignes=3;
                          
                          int colonnes=3;
                          
                          int i=0;
                          
                          int j=0;
                          
                          static int compteur=0;
                          
                          void fonction(int matrice[lignes][colonnes],int valeur,int i,int j,int compteur){
                          
                                 if(valeur==0) return;
                          
                                 else{
                          
                                       if(i<=lignes){
                          
                                                      if(matrice[i][j]<valeur){
                          
                                                              if (j<=colonnes) fonction(matrice,valeur,i,j+1,compteur+1);
                          
                                                              else                    fonction(matrice,valeur,i+1,0,compteur+1);
                          
                                                     }
                          
                                                     else{
                          
                                                             if (j<=colonnes) fonction(matrice,valeur,i,j+1,compteur);
                          
                                                             else            fonction(matrice,valeur,i+1,0,compteur);
                          
                                                            }
                          
                                                   }
                          
                                         }
                          
                          }
                          
                          int main(int argc,char *argv){
                          
                                    int matrice[100][100];
                          
                                     int valeur=0;
                          
                                    for(int i=0;i<lignes;i++){
                          
                                              for(int j=0;j<colonnes;j++){
                          
                                                     printf("matrice[%d][%d]=",i,j);
                          
                                                     scanf("%d",&matrice[i][j]);
                          
                                                  }
                          
                                  }
                          
                                  printf("\ndonner une valeur: ");
                          
                                   scanf("%d",&valeur);
                          
                                  fonction(matrice,valeur,i,j,compteur);
                          
                                  printf("%d\n",compteur);
                          
                          return 0;
                          
                          }


                          edgarjacobs a écrit:

                          stp, ça t'a déjà été demandé

                          -
                          Edité par edgarjacobs il y a environ 11 heures



                          • Partager sur Facebook
                          • Partager sur Twitter
                            28 janvier 2020 à 12:55:50

                            Asmitta a écrit:

                            Moi je suis sur que c'est la 11e ligne de ton main() le probleme...on passe pas un tableau en parametre ainsi


                            Si, si, c'est correct. Dans la définition de la fonction, le paramètre 'matrice' a été déclaré de type tableau à deux dimensions de 'int'. C'est donc un tableau à deux dimensions de 'int' qu'il faut passer en argument, et c'est le cas du 'matrice' déclaré dans le main. Par contre les dimensions ne sont pas cohérentes.

                            (PierrotLeFou l'a déjà expliqué, mais c'est pour être sûr qu'AbdelHamamouche ne soit pas embrouillé. :) )

                            -
                            Edité par robun 28 janvier 2020 à 12:59:39

                            • Partager sur Facebook
                            • Partager sur Twitter
                              28 janvier 2020 à 14:49:54

                              Comme je l'ai dit, il n'y a pas que la matrice comme problème.
                              Ce n'est pas le fait de passer 'compteur' en paramètre que ça va le changer, même si on écrit 'compteur+1'.
                              Dans le 'main' la fonction est appelée avec 'i' et 'j' mais on vient de les utiliser dans les boucles. Ils ne valent plus '0' mais '4' ...
                              • Partager sur Facebook
                              • Partager sur Twitter

                              Le Tout est souvent plus grand que la somme de ses parties.

                              J'arrive pas a résoudre cette exercice!

                              × 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