Partage
  • Partager sur Facebook
  • Partager sur Twitter

Exercice sur les tableaux

Optimisation

    19 février 2017 à 5:09:36

    Bonjour.

    Je suis le cours "Apprenez a programmer en c" de Mathieu Nebra.

    J'en suis au chapitre sur les tableaux et j'ai réalisé les exercices, et je pense avoir plutôt bien réussi mes quatre premiers exercices.

    Cependant, j'ai un problème avec le 5eme exercice "ordonnerTableau", j'ai réussi à obtenir quelque chose de fonctionnel dont voici le code :

    #include "Tableau.h"
    #include <limits.h>
    
    int sommeTableau(int tableau[], int tailleTableau)
    {
        int resulta = 0;
        int i;
    
        for(i = 0; i < tailleTableau; i++)
        {
            resulta = resulta + tableau[i];
        }
    
        return resulta;
    }
    
    double moyenneTableau(int tableau[], int tailleTableau)
    {
        double resulta = 0;
        int i;
    
        for(i = 0; i < tailleTableau; i++)
        {
            resulta = resulta + tableau[i];
        }
    
        return resulta/tailleTableau;
    }
    
    void copieTableau(const int tableauOriginal[], int tableauCopie[], int tailleTableau)
    {
        int i;
    
        for(i = 0; i < tailleTableau; i++)
        {
            tableauCopie[i] = tableauOriginal[i];
        }
    }
    
    void maximumTableau(int tableau[], int tailleTableau, int valeurMax)
    {
        int i;
    
        for(i = 0; i < tailleTableau; i++)
        {
            if (tableau[i] > valeurMax)
            {
                tableau[i] = 0;
            }
        }
    }
    
    void ordonnerTableau(int tableau[], int tailleTableau)
    {
        int tableauTrier[tailleTableau];
        int i,o,m,plusBas,courrant = INT_MIN,multiple=0;
    
        for(i = 0; i < tailleTableau; i++)
        {
            plusBas = INT_MAX;
            for(o = 0; o < tailleTableau; o++)
            {
                if(tableau[o]<plusBas && tableau[o]>courrant)
                {
                    plusBas = tableau[o];
                }
                else if(tableau[o] == courrant)
                {
                    multiple++;
                }
            }
            if (multiple>0)
            {
                for(m = 0; m < multiple-1; m++)
                {
                    tableauTrier[i] = courrant;
                    i++;
                }
            }
            multiple = 0;
            courrant = plusBas;
            tableauTrier[i] = courrant;
        }
    
        copieTableau(tableauTrier,tableau,tailleTableau);
    }

    ma fonction fonctionne bien cependant ce qui me pose problème c'est ça :

    int tableauTrier[tailleTableau];


    et le fait que Mathieu nous dit plus haut dans la page que :

    "Nous allons nous mettre d'accord sur ceci : vous n'avez pas le droit d'utiliser une variable entre crochets pour la définition de la taille du tableau, même si cette variable est une constante ! Le tableau doit avoir une dimension fixe, c'est-à-dire que vous devez écrire noir sur blanc le nombre correspondant à la taille du tableau :"

    Ma question est donc : ai-je bien fait de faire comme cela ? (même si je me doute que non) et sinon comment puis-je faire ? Je ne peut pas définir de taille fixe à mon tableau ne connaissant pas d'avance la taille du tableau entrer en argument à ma fonction.

    si j'ai bien compris le fait de déclarer la taille d'un tableau avec une variable n'est pas autorisé en c89 mais l'est en c99, le code étant compilable est fonctionnel chez moi je pense qu'il a dû être compiler en c99 (je code avec l'IDE code::block et n'est changé aucun paramètre au compilateur) ma deuxièmme question est donc : quel est l'intérêt qu'apporte le c89 par rapport au c99 ?

    j'attends avec impatience vos réponses au questions que je me pose ainsi qu'au critique du reste de mon code s'il y a des choses que je peut améliorer.

    Merci d'avance pour le temps que vous m'aurez consacré.

    • Partager sur Facebook
    • Partager sur Twitter
      19 février 2017 à 6:48:58

      Bonjour, 

      Une des solutions les plus simples pour pallier à l'impossibilité de créer un tableau dont la taille est définie par une variable est de définir une valeur maximale de la taille et de l'écrire. Toutefois, cette écriture est plutôt maladroite et peu ergonomique si la taille dépasse la valeur donnée. Et même si elle est en-dessous, ça utilise aussi plus de mémoire que nécessaire. 

      Je ne sais pas si à ce moment du cours ta fonction est attendue comme ça ou avec un nouveau tableau d'une taille directement définie. Toutefois, tu verras plus tard dans le cours (si je me souviens bien) comment allouer dynamiquement de la mémoire dans une variable. En gros, ça permet de dire à l'ordinateur : je veux tant de fois la place d'un int (par exemple) dans ce tableau. Ainsi, c'est la manière correcte en C de créer des tableaux à taille variable. Mais si tu ne l'as pas encore vu, pas d'inquiétudes et suis le cours. ;)

      Autrement, pour trier un tableau, il y a la fonction qsort() qui correspond grosso modo à la fonction la plus rapide dans le cas général. Mais je ne pense pas qu'elle soit attendue dans le cadre d'un exercice où il faille programmer soi-même sa fonction de tri. Toutefois, n'hésite pas à te renseigner dessus (mais fais-le plutôt à la fin du cours parce qu'elle est peut-être expliquée à l'intérieur). 

      Et pour ta deuxième question : le c89 étant une version plus ancienne du C, il ne peut réellement avoir d'avantages sur le c99. Mais à supposer que tu te retrouves sur une île déserte avec uniquement des compilateurs en c89 pour faire tes programmes, il faudra bien savoir programmer avec. 

      Globalement, même si certaines choses sont tolérées par c99, savoir à quoi s'attendre au cas où le compilateur est en c89 est utile. L'avantage étant qu'un code qui compile en c89 compile aussi en c99. 

      -
      Edité par H.H. 19 février 2017 à 6:51:18

      • Partager sur Facebook
      • Partager sur Twitter
        19 février 2017 à 8:18:35 - Message modéré pour le motif suivant : Toute forme de publicité est interdite


          19 février 2017 à 17:48:28

          Bonjour

          bigtux a écrit:

          j'attends avec impatience vos réponses au questions que je me pose ainsi qu'au critique du reste de mon code s'il y a des choses que je peut améliorer.

          L'orthographe. Le mot résultat a un t final. Le mot courant n'a qu'un seul r.

          La fonction moyenneTableau peut être écrite plus brièvement en appelant la fonction sommeTableau.

          Pour le tri, les algorithmes de tri n'ont généralement pas besoin d'un tableau annexe, ce qui résoud automatiquement le problème de son allocation. En particulier, l'algorithme qui ressemble le plus au tiens, le tri par sélection, n'en n'a pas besoin.

          -
          Edité par Marc Mongenet 19 février 2017 à 17:48:52

          • Partager sur Facebook
          • Partager sur Twitter

          Exercice sur 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