IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

C Recherche dichotomique


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Inscrit en
    Octobre 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 5
    Par défaut C Recherche dichotomique
    Salut
    Voilà je suis un débutant en langage C
    et j'ai un probleme a comprendre ce programme
    au niveau de la positon
    je veux savoir pourquoi pos est initialisé par -1 et si le programme ne trouve pas la valeur recherché comment il va arrivé sur la valeur -1,
    j'attends vos réponse
    merci
    :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    #include<stdio.h>
    main()
    {
          int tb[55],n,i,val,pos=-1,max,min,moy;
          printf("Entrer la dimension du tableau");
          scanf("%d",&n);
          for(i=0;i<n;i++)
          {
          printf("tb[%d]",i);
          scanf("%d",&tb[i]);
          }
          printf("Saisir une valeur a rechercher");
          scanf("%d",&val);
          max=n;
          min=0;
          while((max>=min)&&(pos==-1))
          {
                                   moy=(max+min)/2;
                                   if(val<tb[moy])
                                   {
                                                  max=moy-1;
                                   }
                                   else if(val>tb[moy])
                                   {
                                        min=moy+1;
                                        }
                                        else
                                        pos=moy;
                                        }
                                        if(pos==-1)
                                        printf("la valeur se trouve pas sur le tableau");
                                        else
                                        printf("%d se trouve dans %d",val,pos);
                                        getchar();
                                        getchar();
                                        return 0;
                                        }

  2. #2
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Akrramo Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
       printf ("Entrer la dimension du tableau");
       scanf ("%d", &n);
       for (i = 0; i < n; i++)
       {
          printf ("tb[%d]", i);
          scanf ("%d", &tb[i]);
       }
       printf ("Saisir une valeur a rechercher");
       scanf ("%d", &val);
       max = n;
    Pour tester un algorithme de recherche dichotomique, tu n'as pas besoin de ce bazar (toujours limiter les opérations manuelles, dans un programme de test, elles sont sources d'erreur). De plus, rien ne garantit que le tableau soit trié...

    Toujours aller au plus simple.

    Définir un tableau trié

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int tab[] = {-3, -1, 0, 2, 5, 7};
    faire une recherche systématique, par exemple entre -5 et +10 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    for (i = -5, i <= 10, i++)
    {
       int trouve = chercher (tab, i);
       if (trouve != -1)
       {
          printf ("%d\n", tab[trouve]);
       }
    }
    Ce qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
     
    #include<stdio.h>
     
    static int G_count;
     
    static int chercher (int const tab[], size_t n, int val)
    {
    #if 1
    /* recherche lineaire pour tester le test */
       int ndx = -1;
       size_t i;
       for (i = 0; ndx == -1 && i < n; i++)
       {
          if (tab[i] == val)
          {
             ndx = i;
     
             /* debug */
             G_count += i;
          }
       }
       return ndx;
    #endif
     
    /* a toi d'ecrire le code 'dichotomique' */
    }
     
    static void afficher (int const tab[], size_t n)
    {
       size_t i;
       for (i = 0; i < n; i++)
       {
          printf ("%4d", tab[i]);
       }
       printf ("\n");
    }
     
    int main (void)
    {
       int tab[] = { -3, -1, 0, 2, 5, 7 };
       size_t const n = sizeof tab / sizeof *tab;
     
       afficher (tab, n);
     
       {
          int i;
          for (i = -5; i <= 10; i++)
          {
             int trouve = chercher (tab, n, i);
             if (trouve != -1)
             {
                printf ("[%d] = %4d\n", trouve, tab[trouve]);
             }
          }
          printf ("\n");
       }
     
       printf ("%d iterations\n", G_count);
     
       return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
      -3  -1   0   2   5   7
    [0] =   -3
    [1] =   -1
    [2] =    0
    [3] =    2
    [4] =    5
    [5] =    7
     
    15 iterations
     
    Process returned 0 (0x0)   execution time : 0.025 s
    Press any key to continue.
    Maintenant, tu peux te concentrer sur la fonction 'chercher' pour faire baisser ce nombre d'itérations.

Discussions similaires

  1. probleme : recherche dichotomique
    Par M.a.n.u. dans le forum C
    Réponses: 3
    Dernier message: 17/06/2006, 23h30
  2. recherche dichotomique sur chaînes de carctères
    Par contexte dans le forum Langage
    Réponses: 4
    Dernier message: 13/04/2006, 00h31
  3. Réponses: 23
    Dernier message: 10/01/2006, 13h33
  4. Recherche dichotomique
    Par remixtech dans le forum C
    Réponses: 4
    Dernier message: 06/01/2006, 18h39
  5. Recherche dichotomique
    Par Gryzzly dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 31/12/2005, 11h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo