Partage
  • Partager sur Facebook
  • Partager sur Twitter

Il me manque un cas ...

Petit exercice perso sur les tableau

Sujet résolu
    12 août 2008 à 16:47:55

    Salut à tous !

    Comme vous l'avez peut être compris, j'en suis au chapitre sur les tableaux.
    J'ai donc décider de me compliquer (encore une fois) la vie en compliquant l'exercice n°4 qui avait pour but de mettre à 0 toutes valeurs du tableau inférieures à un maximum prédéfini ce qui donnait un prototype de ce genre :
    void MaxTab(long *Tableau, long TailleTableau, long ValeurMaxAuthorisée);
    


    J'me suis dit que c'était trop simple, et que j'avais besoin de travailler les pointeurs, c'est pourquoi j'ai écrit une fonction qui a pour but de mettre à 0 toutes les veleurs du talbeau qui sont inférieur à son propre maximum et sans connaitre d'avance les valeurs de ce tableau, donc avec un prototype comme suit :

    void (long *Tableau, long TailleTableau);
    


    Voici cette fonction :

    /* Cette fonction a pour but de mettre toutes les valeurs du tableaux qui sont inferieures à sa valeur maximale à 0 */
    
    
    void MaxTab(long *Tableau, long TailleTab)
    {
        long i=0, j=0;                         // Variables d'incrémentation
        long Max=Tableau[0];                  // Maximum prend la première valeur du tableau
        long *PtValueMax=&Tableau[0];         // Pointeur sur la valeur max dans le tableau
        printf("Max = %ld\n", Max);
    
    
    /* Cette boucle a pour but de mettre à 0 la valeur de Tableau[i] si elle est inférieure à son maximum,
    sinon elle prend comme maximum la valeur de Tableau[i] et enregistre son adresse dans PtValueMax
    */
        for(i=0; i<TailleTab; i++)
        {
            // Premier cas : Le maximum est supérieur à Tableau[i] : Tableau[i] est résuit à 0
            if(Max>Tableau[i])
            {
                Tableau[i]=0;
                printf("Cas : Max<Tableau[i]\n");
                printf("Max = %ld\n",Max);
                printf("i = %ld, Tab[i]= %ld\n\n\n", i, Tableau[i]);
            }
            // Deuxième cas : Max correspond à Tableau[i], on ne fait rien
            else if(Max==Tableau[i])
            {
                printf("cas Max == Tab[i]\n");
                printf("Max = %ld, i = %ld, Tab[i] = %ld\n\n\n",Max, i, Tableau[i]);
            }
            /* Dernier cas : Max est inférieur à Tableau[i]
            Max prend alros la valeur de Tableau[i]
            Utilisation du pointeur pour mettre à 0 l'ancien Max dans le tableau
            Initialisation du pointeur sur le nouveau maximum du tableau */
            else
            {
                printf("Cas Max<Tab[i]\n");
                Max=Tableau[i];
                *PtValueMax=0;
                printf("valeur de l'ancien Max dans la tableau = %ld\n", *PtValueMax);
                PtValueMax=&Tableau[i];
                printf("i = %ld, Max = %ld, Tab[i] = %ld\n\n\n", i, Max, Tableau[i]);
            }
        }
        for(j=0; j<TailleTab; j++)
        {
            printf("\n%ld\n", Tableau[j]);
        }
    }
    


    Seulement voilà, il me manque un cas, ou plus précisément, je ne sais pas comment faire dans ce cas...
    Admettons un tableau comme suit :

    long Tableau[5]={12,12,54,87,45}
    

    Bah avec ma fonction, le second 12 (c'est à dire Tableau[1]) ne sera pas effacé...
    Alors que faire ?
    J'me vois mal faire 20.000 pointeurs dans cette fonction, juste au cas où(avec le même nombre de conditions bien sûr) xD
    J'ai bien tenté la boucle do...while du genre :

    do
    //toutes les conditions énoncées plus haut
    while(for(k=0; k<TailleTab; k++) Tableau[k]!=0 && Tableau[k]!=Max)
    


    Mais j'obtiens une erreur (expected expression before "for") et de toute façon ce n'est pas vraiment une solution à mes yeux, plutôt un palliatif : en effet, si jamais le tableau est énorme et qu'il y a 400 fois la valeurs max dedans, il va falloir executer 399 fois la boucle et revérifier autant de fois la condition (si tenté que j'arrive à l'écrire convennablement) de "break".
    En gros caca...
    Si vous avez une p'tite idée de solution (sans utilisation d'une autre library et avec les outils dont je dispose pour le moment : c'est à dire tout jusqu'au chapitre sur les tableaux), je sais que ça ne sert à rien, mais j'me suis posé un problème et j'aimerai bien le résoudre xD

    Merci d'avance !
    • Partager sur Facebook
    • Partager sur Twitter
      12 août 2008 à 17:05:53

      Citation : Zelwina

      c'est pourquoi j'ai écrit une fonction qui a pour but de mettre à 0 toutes les veleurs du talbeau qui sont inférieur à son propre maximum et sans connaitre d'avance les valeurs de ce tableau


      Dis plutôt : mettre tout le tableau à zéro sauf la plus grande valeur.

      Citation : Zelwina

      et que j'avais besoin de travailler les pointeurs


      Ca ne te fera pas travailler les pointeurs, cet exercice. Voilà ma solution:
      int i = 0, plusGrandActuel = 0;
          for(i = 0; i < tailleTableau; i++)
          {
              if(tableau[i] > plusGrandActuel)
              {
                  plusGrandActuel = tableau[i];
              }
          }
          for(i = 0; i < tailleTableau; i++)
          {
              if(tableau[i] < plusGrandActuel)
                  tableau[i] = 0;
          }
      

      Si tu veux travailler ton C et ton algorithmique, je te conseille : Ce site web.
      • Partager sur Facebook
      • Partager sur Twitter
        12 août 2008 à 21:43:44

        Merci pour tout Oussamal ><

        J'crois qu'on pourrait dire que mon adage est : pourquoi farie simple quand on peut faire compliqué ? xD
        • Partager sur Facebook
        • Partager sur Twitter

        Il me manque un cas ...

        × 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