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 :

Tableau exercice de tri


Sujet :

C

  1. #1
    Candidat au Club
    Inscrit en
    Octobre 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 6
    Points : 2
    Points
    2
    Par défaut Tableau exercice de tri
    Bonjour,
    Je suis nouveau sur le forum, je vous passe mes salutations pour ce site qui aide beaucoup de gens, je passe au problème.
    Je devrais écrire un programme dans lequel on dois trier les éléments du tableau (des nombres) par ordre croissant, on avait vu comme première méthode on compare le premier éléments à tout les éléments et on le classe à la première case du tableau et on passe au deuxième et ainsi de suite;
    pour ce qui est de la deuxième façon on devrait comparer (dans un tableau t(5) par exemple), t(0) avec t(1) et t(1) avec t(2),t(2) avec t(3)... etc pour être sûr d'avoir vérifier la comparaison entre tout les éléments on refait 4 fois.
    Voila ma proposition mais bien sur... il y a un problème lors de l'exécution j'entre les éléments du tableau mais après ..rien à mon avis soit la faute à un rapport avec l'initialisation de "i" soit avec le teste de while :
    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
     
    #include<stdio.h>
    #include<conio.h>
    main(){
           int N,t[10],x,i;
     
           printf("entrez la taille du tableau <=10: ");
           scanf("%d",&N);
           printf("entrez les elements du tableau\n");
           i=0;
           for(i=0;i<=N-1;i++){
                              printf ("t(%d)",i);
                              scanf("%d",&t[i]);
           }
           while(t[i]>t[i+1]){
                              for(i=0;i<=N-1;i++){
                                                  if(t[i]>t[i+1]){
                                                                  x=t[i+1];
                                                                  t[i+1]=t[i];
                                                                  t[i]=x;
                                                  }
                              }
           }
           for(i=0;i<=N-1;i++){
                               printf("%d\n",t[i]);
           }
                               getch();
    }
    merci d'avance d'avoir écouter ce débutant.

  2. #2
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 076
    Points : 2 328
    Points
    2 328
    Par défaut
    Bonjour est bienvenue sur le forum

    D'après ce que tu me dis, il s'agirait de faire un tri a bulle.

    En regardant ton code :

    main non conforme, utiliser ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #include <stdlib.h>
    int main()
    {
        return EXIT_SUCCESS;
    }
    C'est dingue depuis quelque temps le nombre de personne qui declare mal main !



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    for(i=0 ; i<=N-1 ; i++)
    plus facile d'ecrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    for(i=0 ; i<N ; i++)
    C'est juste une astuce, ton precedent code, n'a rien de faux.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    printf("entrez la taille du tableau <=10 : ");
    Rajoute toujours un \n a la fin de te printf, ca a le merite de vider le buffer(ou tampon, je ne sais plus ) et t'evitera des prise de tete inutile.



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
           i=0;
           for(i=0 ; i<N ; i++)
    La boucle for se charge de mettre i a 0, pas besoins de le faire avant (encore uine fois, ton code n'etait pas faux mais cela te permettra de ne pas surchargé ton code).

    Bon, après effectivement, tu fais mal ta condition.

    Il faut se poser des question :
    "qu'est ce que je dois faire ?"
    Trier un tableau d'entier par ordre croissant

    "comment le faire ?"
    En comparant deux a deux les valeur de case contigue et en les permuttant s'il le faut.

    Une boucle semble indiqué ici.

    "Si j'utilise une boucle, quand dois-je m'arreter ?"
    Et c'est la que tout pars de travers
    Tu dois permutter deux a deux les element du tableaux s'il le faut, mais rien ne dit qu'il suffit d'un seul passage. Ni de deux passege d'ailleurs, et encore moins de quatre.

    Bref, on ne sait pas combien de passage il faut faire, mais on sait que l'on va parcourir le tableau au moins une fois !
    On va donc utiliser une boucle do-while.
    Mais le probleme reste entier, quand s'arrete t'on ?
    Et bien on s'arrete quand le tableau est trié !

    Pour cela, on va declarer une variable qui se chargera de dire si le tableau est trié. Cette variable se comportera comme un booleen.
    Appelons cette variable "continuer".

    On a donc ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int continuer;
    do
    {
        /* On part du principe que le tableau est trié */
        continuer = 0;
     
        /* Le traitement du tableau, et eventuellement continuer = 1 si le tableau n'est pas tries */
     
    }while (continuer);
    Maintenant, dans ce while, il va falloir parcourir le tableaux, analyser et permutter si besoins est.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    int continuer;
    do
    {
        /* On part du principe que le tableau est trié */
        continuer = 0;
     
        /* Parcours du tableau */
        for (i=0 ; i<N-1 ; i++)
        {
            /* Le traitement du tableau, et eventuellement continuer = 1 si le tableau n'est pas tries */
        }
     
    }while (continuer);
    for (i=0 ; i<N-1 ; i++)

    Comme on compare deux a deux, il faut s'arreter a l'avant derniere case, sinon SIGSEV

    Maintenant, il va falloir traiter le tableau:

    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
     
    int continuer;
    do
    {
        /* On part du principe que le tableau est trié */
        continuer = 0;
     
        /* Parcours du tableau */
        for (i=0 ; i<N-1 ; i++)
        {
            /* Il faut permutter les case */
            if (t[i]>t[i+1])
            {
                /* Permutation circulaire */
                int x = t[i+1];
                t[i+1] = t[i];
                t[i] = x;
            }
        }
     
    }while (continuer);
    Cependant, on avait dit que si on effectuer une permuttation, cela voulait dire que le tableau n'est pas forcement trié et qu'il fallait continuer.


    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
    int continuer;
    do
    {
        /* On part du principe que le tableau est trié */
        continuer = 0;
    
        /* Parcours du tableau */
        for (i=0 ; i<N-1 ; i++)
        {
            /* Il faut permutter les case */
            if (t[i]>t[i+1])
            {
                /* Le tableau n'est pas trié, donc on refera un tour de boucle */
                continuer = 1;
    
                /* Permutation circulaire */
                int x = t[i+1];
                t[i+1] = t[i];
                t[i] = x;
            }
        }
    
    }while (continuer);
    Et voila
    Cela gere aussi sans probleme les doublons ^^

  3. #3
    Candidat au Club
    Inscrit en
    Octobre 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Merci pour ton accueil, pour la "déclaration de main" je suis pas au courant je demanderais au prof car normalement j'évite tout ce que je ne pige pas je travaille sur Dev C++ si je fait nouveau fichier source on m'écris pas les trucs comme celui que tu m'a dit si non je dois faire nouveau projet, pour ce qui est de l'exercice je te remercie sauf que je n'est pas bien compris : logiquement continuer=1 cela veut dire que le teste va s'arrêter ce qui veut dire aussi que le tableau est trié , donc ma question est le tableau sera trié quand ...? ou si ...?
    Merci encore de ta réponse.

  4. #4
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 076
    Points : 2 328
    Points
    2 328
    Par défaut
    La variable continuer fonctionne comme un booleen.

    Dans un if ou un while, on attend une expression booleene.
    C'est a dire qu'a la fin, ton expressions doit valoir "vrai" ou "faux".
    Il n'y a pas de demi-mesure : "peut-etre" n'existe pas dans un if ou un while.

    En C, il n'existe pas de type booleen.
    On a donc substituer ce mecanisme grace aux int :

    0 = faux
    tout autre valeur = vrai

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    if (123)
        printf ("vrai");
     
    if (-13)
        printf ("vrai");
     
    if (0.00001)
        printf ("vrai");
     
    if (0)
        printf ("vrai");
    else
        printf("faux");
    Ici, tout les printf seront a vrai sauf le dernier qui affichera faux.

    C'est cela qui est utilisé par "continuer"

  5. #5
    Candidat au Club
    Inscrit en
    Octobre 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Merci beaucoup

  6. #6
    Candidat au Club
    Inscrit en
    Octobre 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Finalement après avoir compris ton raisonnement et ce qu'on a fait en classe on peut l'écrire ainsi en C sans avoir besoin de "déclarer main" chose qu'on a pas encore faite en classe je sais pas si c'est normal
    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
     
    #include <stdio.h>
    #include <conio.h>
     
    main(){
           int N,t[10],x,i,continuer;
     
           printf("entrez la taille du tableau <=10: \n");
           scanf("%d",&N);
           printf("entrez les elements du tableau\n");
           for(i=0;i<N;i++){
                              printf ("t(%d)",i);
                              scanf("%d",&t[i]);
           }
     
           do{
              /* On part du principe que le tableau est trié */
              continuer=0;
     
              for(i=0;i<N-1;i++){
                                 if(t[i]>t[i+1]){
                                 x=t[i+1];
                                 t[i+1]=t[i];
                                 t[i]=x;
                                 }
              }
              }while(continuer=0);
     
           for(i=0;i<N;i++){
                               printf("%d\n",t[i]);
           }
                               getch();
     
    }
    Merci encore !

  7. #7
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 076
    Points : 2 328
    Points
    2 328
    Par défaut
    Non ce n'est pas normal, c'est juste que ton prof a la flemme de vous expliquer les base du C.

    En C, il y a enormement de style de codage, mais il y a egalement une racine commune : on ne fait pas n'importe quoi.

    En somme, la racine commune est donnée par la norme.

    Concernant main, il y a deux ecriture general de main accepter :

    int main (void)
    int main (int argc, char *argv[])

    Ni plus ni moins.
    Quand le compilo vois main(), il emet un warning et remplace implicitement par int main(void). De plus, a la fin du main, le compilo ne trouvant pas de return emettra encoe un warning et glissera encore implicitement (return EXIT_SUCCESS).

    Voila, tout ca pour te dire que ton code fonctionne, mais si ton le monde commence a compter sur l'agissement implicite de son compilo (qui peut ne pas etre pareille d'un compilo a l'autre), et ben cela generera des belle erreur "fantome" et on aura droit a des post du style :

    Je comprend pas les gens, mon code marche sur mon pc, mais quand je le mets sur celui de mon copain et ben ca marche plus.
    Et quand on compilera le code source, on aura droit a des tas de warning. Tout ca parce que certaines personne n'apprenne pas a d'autre les base du C.

    Bref, si tu veux poursuivre dans le C, je te conseille de prendre developpez comme cours et tutoriels C avec les tuto de melem entre autre.

  8. #8
    Candidat au Club
    Inscrit en
    Octobre 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Merci vraiment c'est sympas si tu pouvais me filer le lien en mp merci encore c'est gentil.

  9. #9
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Tu trouveras les tuto de Melem ici
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  10. #10
    Candidat au Club
    Inscrit en
    Octobre 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par diogene Voir le message
    Tu trouveras les tuto de Melem ici
    Merci Diogene

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Tableau : filtrage et tri
    Par Shinoda00 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 22/02/2009, 01h35
  2. [TP] Type tableau (exercice)
    Par The future scientist dans le forum Turbo Pascal
    Réponses: 5
    Dernier message: 05/05/2007, 11h51
  3. [Map] Tableau d'association trié par ordre d'insertion
    Par sanchou dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 27/04/2007, 12h18
  4. Exercice de tri de listes
    Par skystar dans le forum Ada
    Réponses: 2
    Dernier message: 05/04/2007, 11h42
  5. tableau de pointeur+tri+coup de pouce svp
    Par php4life dans le forum C
    Réponses: 12
    Dernier message: 15/04/2006, 13h49

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