Partage
  • Partager sur Facebook
  • Partager sur Twitter

Exercice Tableau débutant C

    13 octobre 2020 à 18:19:11

    Bonjour, je dois écrire un programme qui permette de saisir nb valeurs choisi par l'utilisateur avec 0<N<=50 dans un
    ordre croissant, autorisant les répétitions puis les stocker dans un 1er tableau, créer un 2ème tableau en éliminant les doublons puis un dernier qui compte l'effectif de chaque valeur dans le 1er tableau.
    voici mon code : 
    #include <stdio.h>
    #define TAILLE 50
    
    int main()
    {
        int nb,i,j,t[TAILLE];
        printf("Rentrez le nombre d'éléments (nb <= 50): ");
        scanf("%d",&nb);
        while (nb > 50 || nb < 0) {
            printf("erreur nb élement");
        }
        printf("Rentrez le chiffre n 1 : ");
        scanf("%d",&t[0]);
        for (i=1;i<nb;i++) {
            do { 
                printf("Rentrez le chiffre n %d : ",i+1);
                scanf("%d",&t[i]);
        }
        while (t[i] < t[i-1]);
        }
        
        int t1[TAILLE];
        t1[0]=t[0];
        int effectif[TAILLE];
        j=0;
        effectif[0]=j;
        
    /* Lorsque je dois créer mon deuxième tableau plus petit, c'est la que j'ai un problème ainsi que pour traiter l'effectif.*/
        for(i=1;i<nb;i++) {
            if ( t[i] != t[i-1] ) {
                t1[++j]=t[i];
                j++;
                }
        }
        for (i=0;i<j;i++) {
            printf(" %d ",t1[i]);
        }
        printf("\n");
        return 0;
    }
    • Partager sur Facebook
    • Partager sur Twitter
      13 octobre 2020 à 18:46:49

      Salut raygambino1,

      L'exercice te demande de créer 3 tableaux, tu pourrais les nommer respectivement t1, t2 et t3. En outre, je ne vois pas ton 3ème tableau.

      Sur l'énoncé, je ne suis pas sûr de comprendre si tu dois, comme tu le fais, interdire les saisies de nombres non croissants, ou si tu dois, à mesure des nombres saisis, les stocker dans un ordre croissant dans ton 1er tableau, ou permettre n'importe quelle saisie et ordonner le tableau une fois que tous les nombres sont saisis avec un algorithme de tri.

      Pour faire le 2ème tableau, à la main je ferai cela : noter l'élément stocké dans ma tête, à partir du 1er élément, et ne stocker un élément additionnel que si l'élément suivant est différent de celui que j'ai noté, et ainsi de suite.

      Pour le 3ème tableau, s'il doit contenir l'effectif des valeurs du 1er tableau, est-ce que cela ne signifie pas que tu dois disposer d'un type permettant de stocker la valeur et son effectif dans un tableau ?

      -
      Edité par Dlks 13 octobre 2020 à 18:47:16

      • Partager sur Facebook
      • Partager sur Twitter
        13 octobre 2020 à 18:55:35

        Salut Dlks, oui je dois interdire les saisies de nombres non croissants, pour le 2ème tableau il me semble que j'ai fais ce que tu explique à moins que je suis complétement à côté de la plaque.

        Enfin, pour l'effectif je pense qu'il faut le traiter en même temps que le 2ème tableau dans ma boucle for et incrémenter ma valeur j lorsque tab[i] == tab[i-1] et créer une nouvelle lorsque les valeurs sont différente mais je ne suis pas sûr.

        -
        Edité par inconitosel3a 13 octobre 2020 à 18:56:18

        • Partager sur Facebook
        • Partager sur Twitter
          13 octobre 2020 à 19:26:49

          "pour le 2ème tableau il me semble que j'ai fais ce que tu explique"

          Non, pas exactement :-). Tu présentes un code compliqué, qui ne "note pas" la valeur stockée dans "ta tête" (une variable...), qui ne commence pas par le premier élément et qui incrémente l'index sur le 2ème tableau plusieurs fois par itération, en outre avec un opérateur d'incrémentation préfixe non nécessaire et qui n'arrange pas la compréhension de ton code pour toi, ni pour ceux qui te lisent.

          Pour mettre au point ton programme, je te suggère de te faire des jeux de tests, au lieu de saisir à chaque fois les choses. Cela te permettra des itérations plus rapides de développement et, en plus de penser à créer ton code d'une façon testable et de disposer de tests unitaires.

          Pour l'effectif, tu peux traiter en même temps ou pas, cela n'était pas l'objet de ma remarque, qui cherchait à attirer ton attention sur le stockage de l'information demandée.

          D'après mes souvenirs, quant on parle de présenter l'effectif des éléments d'une série, on demande quelque chose comme ceci :

          (exemple tiré de https://www.maxicours.com/se/cours/calculs-statistiques-effectifs-et-frequences/)

          Pour chaque élément unique, tu dois décompter le nombre d'apparitions. Alors, je répète ma question : est-ce que cela ne signifie pas que tu dois disposer d'un type permettant de stocker la valeur et son effectif dans ton 3ème tableau ?

          ----

          Edit :

          Pour mettre au point le code permettant de réaliser ton 2ème tableau, voici une suggestion de code de test, utilisant assert() avec un jeu de test :

          #include <stdio.h>
          #include <assert.h>
          #define TAILLE 50
          
          int main()
          {
              /* la 1ère partie est au point selon ta compréhension de l'énoncé
               * Suggestions tout de même :
               * refuse un tableau de moins de 2 éléments
               * appelle le 1er tableau t1, et le nombre d'éléments qu'il contient
               * nb_t1, cela permettra à ton relecteur de mieux comprendre
               * idem pour ton 2ème t2, ton 3ème t3
               */
          
              /* jeu de test en entrée simulant le 1er tableau */
              int t1[TAILLE] = { 10, 10, 12, 15, 15, 15, 20, 300 };
              int nb_t1 = 8;
          
              /* ici le code pour créer le 2ème tableau */
              int t2[TAILLE];
              int nb_t2 = 0;
              /* TODO */
              
              /* résultat attendu en sortie du test dans le 2ème tableau */
              int t2_attendu[TAILLE] = {10, 12, 15, 20, 300 };
              int nb_t2_attendu = 5;
              assert(nb_t2 == nb_t2_attendu);
              for (int i = 0; i < nb_t2; i++) {
                  assert(t2[i] == t2_attendu[i]);
              }
          
              return 0;
          }
          

          Si tu compiles ce code, et que tu l'exécutes, les assertions échoueront, à commencer par la première. Ta mission est de réaliser un code qui passe ces tests à la place de "/* TODO */".

          Tu pourras ensuite passer à ton 3ème tableau, que tu pourrais mettre au point selon une méthode similaire (à condition de bien comprendre le résultat attendu).

          -
          Edité par Dlks 13 octobre 2020 à 20:40:29

          • Partager sur Facebook
          • Partager sur Twitter
            13 octobre 2020 à 20:52:24

            As-tu le droit d'utiliser les fonctions, Ça éclaircirait le code !

            Si on prend du début :

                while (nb > 50 || nb < 0){
                    printf("erreur nb élement");
                }

            Si nb est hors spécification, que ce passe t'il ?

            -
            Edité par rouloude 13 octobre 2020 à 20:58:22

            • Partager sur Facebook
            • Partager sur Twitter

            Exercice Tableau débutant C

            × 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