Forum Programmation.c tableau en c

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
0
7
déc.
2019

bonjour a toutes et a tous!
je suis étudiant debutant en langage de programmation c, j'ai besoin de votre aide.

j'ai fait un programme avec code block où il est demandé d'initialiser un tableau de 5 entiers et de rechercher le minimum du tableau et son indice;
j'ai fait mais juste que le resultat ne me convainc pas 100%. ca c'est le programe.

#include <stdio.h>
#include <stdlib.h>

int main()
{
  int tab[5];
  int min;
  int indmin;
  int j;
       /*saisie des valeurs du tableau*/

    for( j=0 ; j<5 ; j=j+1 ){
        printf("quelle est la valeur de la case %d \n",j);
              scanf("%d",&tab[j]);
    }
     /*affichage des valeur du tableau*/
        for(j=0; j<5 ; j=j+1){
            printf("%-d-", tab[j]);
        }
        /*recherhe du minimun et de son indice*/
         min=tab[0];
         indmin=j;
                for(j=0 ; j<5 ; j=j+1){

                       if(min>tab[j]){
                              min=tab[j];
                              indmin=j;
                         }
                }
                printf(" \n le minimun est %d et son indice est %d", min, indmin);
    return 0;

le programme recherche très bien la valeur minimal mais l'indice de la valeur minimal n'est pas correct si la valeur minimal est dans la première case du tableau soit tab[0] ca me met toujours l'indice de la dernière valeur du tableau! ça m'embette beaucoup!

merci

  • # Le problème vient de l'indice de départ de la recherche

    Posté par  (site web personnel) . Évalué à 5.

    Le problème se situe dans la ligne suivante :

         indmin=j;

    Qui se situe avant la boucle de recherche. Car à ce moment là, j vaut 5 car c'est la condition de sortie de la boucle précédente et j n'a pas été réinitialisé.

    Donc pour résoudre ça, la valeur à mettre n'est pas j mais 0, car tu utilises le premier élément du tableau pour initialiser l'algorithme.

    • [^] # Re: Le problème vient de l'indice de départ de la recherche

      Posté par  (site web personnel) . Évalué à 5.

      Donc pour résoudre ça, la valeur à mettre n'est pas j mais 0, car tu utilises le premier élément du tableau pour initialiser l'algorithme.

      au passage, il est alors inutile de parcourir le premier élément du tableau dans la boucle, puisque l'opération est effectuée pour l'indice 0 en amont.

      for(j=1j<5;++j){
      ...
      }
    • [^] # Re: Le problème vient de l'indice de départ de la recherche

      Posté par  . Évalué à 2.

      merci beaucoup; c'est vraiment très gentil de répondre aussi vite; j'ai vus mon problème,
      en fait avec l'instruction indmin=i; cela voudrais dire que à la fin de la boucle le compteur i garde la valeur de l'indice de la dernière case du tableau je croix que c'est ça n'es pas?

      • [^] # Re: Le problème vient de l'indice de départ de la recherche

        Posté par  (site web personnel) . Évalué à 3.

        cela voudrais dire que à la fin de la boucle le compteur i garde la valeur de l'indice de la dernière case du tableau je croix que c'est ça n'es pas?

        Non, la valeur de j n'étant pas initialisée, sa valeur est indéterminée.
        (ça va dépendre de votre OS, du compilo, des optimisations, du format d'exécution, du sens du vent.)

        Et, par extension, celle de indmin, aussi. Si le premier élément du tableau est le plus petit, votre programme ne rentrera jamais dans la branche (le if).
        Du coup, si la valeur min est bien la bonne, celle du premier élément, celle de l'indice gardera sa valeur indéterminée.

        Si la valeur min par défaut est le premier élément, son indice doit pointer aussi vers le premier élément.

        indmin=0;
        min=tab[indmin];
        for(j=1 ; j<5 ; ++j){
        /* ... */
        }
        • [^] # Re: Le problème vient de l'indice de départ de la recherche

          Posté par  . Évalué à 3.

          Non, la valeur de j n'étant pas initialisée, sa valeur est indéterminée.

          Quand la valeur de j n'est pas initialisé, mais ce n'est pas le cas ici. j ayant été utilisé dans les boucles for précédentes, il est bien défini quand on entre dans la section qui cherche à déterminer le minimum (et il vaut 4).

          Ce qui n'enlève rien à la pertinence de ton commentaire dans l'absolu. Si on visait la lisibilité absolue, on utiliserait peut-être un nom d'indice différent (et fonctionnel) pour chaque boucle et l'indice de cette dernière boucle serait effectivement indéterminé.

          • [^] # Re: Le problème vient de l'indice de départ de la recherche

            Posté par  (site web personnel) . Évalué à 3.

            Ce qui n'enlève rien à la pertinence de ton commentaire dans l'absolu. Si on visait la lisibilité absolue, on utiliserait peut-être un nom d'indice différent (et fonctionnel) pour chaque boucle et l'indice de cette dernière boucle serait effectivement indéterminé.

            Ou plutôt on utiliserait le même nom d'indice mais la déclaration de cette variable serait à l'intérieur du bloc de la boucle pour qu'en dehors de la boucle la variable n'existe pas. Cela limite ce genre d'erreurs et permet d'utiliser le même nom facilement.

          • [^] # Re: Le problème vient de l'indice de départ de la recherche

            Posté par  (site web personnel) . Évalué à 2.

            j ayant été utilisé dans les boucles for précédentes

            Exact, j'ai complètement zappé la première partie du code.

            Si on visait la lisibilité absolue, on utiliserait peut-être un nom d'indice différent (et fonctionnel) pour chaque boucle

            Cela doit plus ou moins ce que l'OP voulait faire, vu qu'il dit parfois i, parfois j.

  • # Indice

    Posté par  (site web personnel) . Évalué à 2.

    Tu sembles avoir bien analysé le problème. Regarde donc tes initialisations de min et indmin, et demande toi ce qu'elles impliquent.

  • # indentation

    Posté par  . Évalué à 5. Dernière modification le 07 décembre 2019 à 16:48.

    attention à ton indentation. Ce serait normal d'augmenter l'indentation pour des boucles for imbriquées, mais ici, de simples boucles for successives devraient être indentées au même niveau. C'est un problème de lisibilité. Ce n'est pas une remarque anodine, ma première réaction a été de me demander pourquoi tu avais des for imbriqués à cause de cette indentation avant d'y regarder de plus près.
    Même remarque pour les instructions entre les boucles et le print final. Il faut indenter à l'intérieur des blocs, mais quand on termine un bloc (avec }), il faut réduit l'indentation pour les lignes suivantes. Ton code (sans correction à part l'accolade finale et deux sauts de lignes) devrait plutôt ressembler à ça:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
      int tab[5];
      int min;
      int indmin;
      int j;
    
      /*saisie des valeurs du tableau*/
      for( j=0 ; j<5 ; j=j+1 ){
          printf("quelle est la valeur de la case %d \n",j);
          scanf("%d",&tab[j]);
      }
      /*affichage des valeur du tableau*/
      for(j=0; j<5 ; j=j+1){
          printf("%-d-", tab[j]);
      }
      /*recherhe du minimun et de son indice*/
      min=tab[0];
      indmin=j;
      for(j=0 ; j<5 ; j=j+1){
          if(min>tab[j]){
              min=tab[j];
              indmin=j;
          }
      }
      printf(" \n le minimun est %d et son indice est %d", min, indmin);
      return 0;
    }
    • [^] # Re: indentation

      Posté par  . Évalué à 2.

      j'en ai raté un ! :D La ligne débutant avec le second for devrait être un cran plus à gauche

    • [^] # Re: indentation

      Posté par  (site web personnel) . Évalué à 3.

      J'ajouterai que la deuxième boucle est inutile. Il suffit de modifier la troisième pour afficher la valeurs de la cellule courante pour pouvoir s'en passer. Lorsqu'il n'y a que 5 indices, ça va mais pour de gros tableaux, l'effet pourrait être pénalisant.

      min=tab[0];
      indmin=0;
      for(j=0 ; j<5 ; j=j+1){
        printf("%-d-", tab[j]);
        if(min>tab[j]){
            min=tab[j];
            indmin=j;
        }
      }
      
  • # Et puis, tant qu'on y est ...

    Posté par  . Évalué à 2.

    Rien à voir avec ton problème, mais une bonne habitude serait de toujours vérifier la valeur de retour des fonctions, comme celle de scanf dans ton cas : En effet, scanf retourne le nombre d'argument qu'il a correctement lu.

    Et aussi un autre petit truc, tu devrais éviter de trimbaler le '5' dans tout ton code :
    - soit utiliser un '#define' pour fabriquer une symbole qui définirait cette constante
    - soit calculer le nombre d'élément de ton tableau (vue qu'il est déclaré statiquement) avec quelque chose comme (sizeof(tab) / sizeof(tab[0]))

  • # version courte

    Posté par  . Évalué à 2. Dernière modification le 24 décembre 2019 à 22:54.

    Comme il n'est pas demandé de lire des valeurs saisies au clavier : je ferais simple.

    #include <stdio.h>
    
    int
    main()
    {
        int i;
        int m;
        int array[5] = {5,-3,2,-5,8};
    
        m = 0;
        for(i = 1; i < 5; i++)
            if(array[i] < array[m])
                m = i;
        printf("min : array[%d] = %d\n", m, array[m]);
    
        return 0;
    }
    • [^] # Re: version courte

      Posté par  . Évalué à 3.

      Tu aurais pu utiliser sizeof() plutôt que i < 5.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.