Inscription / Connexion Nouveau Sujet
Niveau algorithmique
Partager :

tableau

Posté par
smir
30-05-15 à 22:22

Bonsoir j'ai un exercice de langage C et je voudrais savoir est ce que mon code est parfait. S'il y a des choses à améliorer vous me le dites aussi. Merci de votre compréhension

RENONCÉ:
Ecrire un algorithme appelé LesTableaux et qui contient les opérations suivantes
- Remplissage d'un tableau de 20 entiers avec des valeurs saisies par l'utilisateur.
- Affichage du tableau.
- Recherche et affichage du plus petit élément du tableau.
- Recherche dans le tableau d'une valeur donnée par l'utilisateur et affichage de sa position si elle est trouvée.
- Trier le tableau dans l'ordre croissant en utilisant la méthode suivante : déplacer le plus petit des éléments à la 1ère position (en faisant un échange), puis le plus petit des restants à la 2ème position, et ainsi de suite.
- Faire une nouvelle recherche dans le tableau trié en procédant par dichotomie : Soient v la valeur à rechercher, deb, fin et mil les indices de début, de fin et de milieu du tableau tab.
Si v = = tab[mil] alors la valeur recherchée est au milieu du tableau. Sinon si v < tab[mil] alors la valeur recherchée est entre deb et mil-1. Sinon elle est entre mil+1 et fin.
On fait donc des divisions successives du tableau en deux parties.
  
Voici le code


#include<stdio.h>
int main()
{int i,min,imin,j;
int tmp;
const int N=5;
  int tab[N];
  printf("donner les entiers du tableaux\n");
  for (i=0;i<=N-1;i++)
  {
      printf("donner l`entier a la possition %d:\t",i);
      scanf("%d",&tab[i]);
  }
      printf("affichage du tableaux\n");
   for (i=0;i<=N-1;i++)
   {printf("%d\t",tab[i]);
   }
   int x,pos,reponse ;

   do
     {

         printf("donnez un entier recherche dans la tableau");
         scanf("%d",&x);

         pos=-1;
         for (i=0;i<=N-1;i++)
          {if(x==tab[i]){
          pos=i;}}
          if(pos==-1)
            printf("un entier n' est pas dans le tableau:%d",x);
            else
            printf("un entier  est  dans le tableau:%d et sa position:%d",x,pos);
             printf("taper 1 pour rechercher  une autre valeur ou autre pour quitter la recherche");
             scanf("%d",&reponse);
             }

             while(reponse==1);

   min=tab[0];
imin=0;
for (i=0;i<=N-1;i++)
{
     if (tab[i]<min)
     {min=tab[i];
         imin=i;
     }
     } printf("le minimum du tableaux est:%d et sa position est:%d",min,imin);


      for (i=0;i<=N-2;i++){
            imin=i;
           for (j=i+1;j<=N-1;j++){
        if (tab[j]<tab[imin]){
            imin=j;


           }
           }
           tmp=tab[i];
           tab[i]=tab[imin];
           tab[imin]=tmp;
      }
   printf("affichage entiers tri par ordre croissantdu tableaux\n");
    for (i=0;i<=N-1;i++)
  { printf("%d\n",tab[i]);
   }

  int deb,fin,milieu,v;
   deb=0;fin=N-1; pos=-1;
   printf("donnez un entier recherche dans letableau");
   scanf("%d",&v);
   while((deb<=fin)&&(pos=-1))
{
    milieu=(fin+deb)/2;
   if(v==milieu)
    pos=milieu;
   else if(v<milieu)
    {
    deb=0;
    while((deb<milieu)&&(tab[deb]!=v));
   { deb+1;} }
     else{
   j=milieu+1;

   while((j<=fin)&&(tab[j]!=v))
    {j=j+1; } }}
  if  (pos==-1)
            printf("un entier n' est pas dans le tableau:%d",v);
            else
                printf("un entier  est  dans le tableau:%d et sa position:%d",v,pos);
   return 0;
       }

Posté par
vham
re : tableau 31-05-15 à 11:45

Bonjour,

en ayant simplement survolé le code :

dans le for, écrire i<N à la place de i<=N-1, c'est plus court...

Et aérer le code en plaçant un commentaire indiquant quelle fonction va être traitée
puis commenter les lignes de code les plus significatives...
Il ne s'agit pas de commenter chaque ligne de code, mais un code bien commenté se maintient plus facilement, et ne pas croire qu'on retrouvera très facilement ce que fait le code sans l'avoir commenté, si on doit le modifier ou trouver un "bug"...
Adage du programmeur : un code sans commentaire est bon pour la poubelle !

Posté par
smir
re : tableau 31-05-15 à 18:19

Bonjour, quand je compile, arrivé à ce niveau si j'entre une valeur ça ne marche pas rien n'affiche je ne sais pas où se trouve le problème. MERCI de m'aider.

tableau

Posté par
vham
re : tableau 31-05-15 à 22:56

Bonsoir,

Pour la recherche dans le tableau ordonné :
il ne faut pas comparer v à milieu mais comparer v à tab[milieu]
ensuite 3 cas : soit v est trouvé,
soit v > tab[milieu] auquel cas deb devient milieu+1
soit v < tab[milieu] auquel cas fin devient milieu-1
et on repart avec milieu=(fin+deb)/2;
La condition du while peut-être tout simplement que deb n'est pas égal à fin

Bonne suite et commentez proprement le code.

Posté par
smir
re : tableau 01-06-15 à 03:31

J'ai toujours de problème je n'arrive pas à continuer.

Posté par
vham
re : tableau 01-06-15 à 19:25

Bonsoir,

J'ai mis votre code au propre, bien aligné
La dichotomie est "subtile" car la partie fractionnaire du "milieu" est supprimée automatiquement.

/* création et recherche dans un tableau */
#include<stdio.h>
int main()
{
    /*Création et affichage */
    int i,min,imin,j,tmp;
    const int N=10;
    int tab[N];
    printf("donner les entiers du tableaux\n");
    for (i=0;i<N;i++)
    {
        tab[0]=10;tab[1]=4;tab[2]=12;tab[3]=20;tab[4]=18;
        tab[5]=8;tab[6]=16;tab[7]=2;tab[8]=14;tab[9]=6;
        /* supprimé provisoirement car tableau initilisé
        printf("donner l`entier pour la position %d:\t",i);
        scanf("%d",&tab[i]); */
    }
    printf("affichage du tableaux\n");
    for (i=0;i<N;i++)
    {
        printf("%d\t",tab[i]);
    }

    /* Recherche d'un entier dans le tableau */
    int x,pos,reponse ;
    do
    {
        printf("\ndonnez l'entier qu'il faut trouver dans le tableau\n");
        scanf("%d",&x);
        pos=-1; /* position par défaut */
        for (i=0;i<N;i++)
        {
            if(x==tab[i]) pos=i;
        }
        if(pos==-1)
            printf("L'entier %d n'est pas dans le tableau\n:",x);
        else
        {
            printf("L'entier %d est dans le tableau et sa position est: %d\n",x,pos);
            printf("taper 1 pour rechercher une autre valeur ou autre pour quitter la recherche\n");
            scanf("%d",&reponse);
        }
    }
    while(reponse==1);

    /* Recherche du minimum */
    min=tab[0];
    imin=0;
    for (i=0;i<N;i++)
    {
        if (tab[i]<min)
        {
            min=tab[i];
            imin=i;
        }
    } printf("le minimum du tableau est: %d et sa position est: %d\n",min,imin);


    /* tri croissant */
    for (i=0;i<N-1;i++)
    {
        /* imin=i; pas besoin de imin !! */
        for (j=i+1;j<N;j++)
        {
            if (tab[j]<tab[i])
            {
                tmp=tab[i];
                tab[i]=tab[j]; /* le plus petit des j vient en i */
                tab[j]=tmp;
            }
       }
    }
    printf("affichage des entiers, tri par ordre croissant du tableau\n");
    for (i=0;i<N;i++) printf("%d\t",tab[i]);

    /* Recherche par dichotomie */
    int deb,fin,milieu,v,w;
    deb=0;fin=N-1; pos=-1;
    printf("\ndonnez un entier qu'il faut trouver par dichotomie dans le tableau\n");
    scanf("%d",&v);
    while(fin-deb>1)
    {
        /* les 2 printf pour bien suivre la progression de la dichotomie */
        milieu=(fin+deb)/2;
        printf("deb:%d milieu:%d fin:%d conduit vers\n",deb, milieu,fin);
        w=tab[milieu];
        if(v==w) pos=milieu;
        if(v<w) fin=milieu-1;
        else deb=milieu+1;
        printf("deb:%d milieu:%d fin:%d\n\n",deb, milieu,fin);
    }
    /* restent deux positions possibles */
    if (v==tab[deb]) pos=deb;
    else if (v==tab[fin]) pos=fin;

    /*afficher le dernier entier */
    if  (pos==-1)
        printf("L'entier %d n' est pas dans le tableau\n",v);
    else
        printf("L'entier %d est dans le tableau et sa position est: %d\n",v,pos);
    return 0;
}

Posté par
smir
re : tableau 02-06-15 à 22:43

Merci infiniment de m'avoir aidé à mieux comprendre cet exercice

Répondre à ce sujet

Seuls les membres peuvent poster sur le forum !

Vous devez être connecté pour poster :

Connexion / Inscription Poster un nouveau sujet
Une question ?
Besoin d'aide ?
(Gratuit)
Un modérateur est susceptible de supprimer toute contribution qui ne serait pas en relation avec le thème de discussion abordé, la ligne éditoriale du site, ou qui serait contraire à la loi.


Vous devez être membre accéder à ce service...

Pas encore inscrit ?

1 compte par personne, multi-compte interdit !

Ou identifiez-vous :


Rester sur la page

Désolé, votre version d'Internet Explorer est plus que périmée ! Merci de le mettre à jour ou de télécharger Firefox ou Google Chrome pour utiliser le site. Votre ordinateur vous remerciera !