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

Ada Discussion :

Procédure de tri à bulles


Sujet :

Ada

  1. #1
    Membre régulier Avatar de m@tix
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 304
    Points : 76
    Points
    76
    Par défaut Procédure de tri à bulles
    Bonsoir,

    Ayant vu en cours une procédure de tri à bulles que je n'ai pas bien comprise, je vous la poste, en espérant que vous pourrez m'éclairer quelque peu:

    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
    PROCEDURE Tri_Bulles(T: IN OUT Tableau) IS
     
       Aux: Integer;
       Tri_Fini: Boolean;
       Nbre_Passes: Natural :=0;
     
    BEGIN
     
       WHILE NOT Tri_Fini LOOP
     
          Nbre_Passes := Nbre_Passes + 1;
          Tri_Fini := True;
     
          FOR I IN T'First..T'Last-Nbre_Passes LOOP
     
             IF T(I) > T(I+1) THEN
                Tri_Fini := False;
     
                Aux := T(I);
                T(I) := T(I+1);
                T(I+1) := Aux;
     
             END IF;
     
          END LOOP;
     
       END LOOP;
     
    END Tri_Bulles;
    Dans cette situation, je ne parviens pas à faire "tourner" la procédure sur un exemple simple. Notamment, je ne comprends pas pourquoi Nbre_Passes := Nbre_Passes + 1 et Tri_Fini := True sont placés là où ils sont.. Pourriez-vous peut-être me détailler un peu comment les choses se passent sur un exemple? Par exemple sur le tableau (vecteur) 3741?

    J'applique la procédure de tri à ce vecteur à 4 "composantes":

    - Je rentre dans la boucle While;
    - Dès lors, on a Nbre_passes qui se retrouve égal à 1! (0(valeur initiale) + 1) Pourquoi ne fait-on pas le cas Nbre_passes:= 0 dans la boucle? Vu qu'on commence à la valeur 1, on n'a jamais un parcours complet du tableau (de T'First à T'Last)! N'est-ce pas ennuyeux de ne pas accéder à la dernière case? Il me semble que si..
    - Suite...?

    Merci d'avance!

  2. #2
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    - Dès lors, on a Nbre_passes qui se retrouve égal à 1! (0(valeur initiale) + 1) Pourquoi ne fait-on pas le cas Nbre_passes:= 0 dans la boucle?
    Parce que sinon l'instruction

    Plante : T(i+1), n'appartient plus au tableau. Si tu as i qui va de first à last-1 et que tu utilise t(i+1) et t(i) tu parcours bien tout ton tableau (ie: de first à last)

  3. #3
    Membre régulier Avatar de m@tix
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 304
    Points : 76
    Points
    76
    Par défaut
    Si tu as i qui va de first à last-1 et que tu utilise t(i+1) et t(i) tu parcours bien tout ton tableau (ie: de first à last)
    En effet, je n'avais pas vu la subtilité avec les indices. Merci!

    Une question hors-sujet si je puis me permettre: utilisant AdaGide depuis peu (y-a-t-il mieux au passage sur Windows?), j'aurais deux questions à vous poser.

    1) Y-a-t-il possibilité d'imprimer les codes écrits avec les couleurs de la syntaxe Ada que l'on peut voir sur l'écran? Car lorsque j'imprime, tout est en noir et blanc...

    2) J'ai remarqué que les mots type du langage (with, use, begin, procedure, etc...) s'inscrivent en majuscule automatiquement. Peut-on les garder en minuscule?

  4. #4
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    1) Y-a-t-il possibilité d'imprimer les codes écrits avec les couleurs de la syntaxe Ada que l'on peut voir sur l'écran? Car lorsque j'imprime, tout est en noir et blanc...
    De mémoire, il me semble que c'est possible (j'ai le souvenir d'avoir vu du code en couleur lors d'impressions).

    2) J'ai remarqué que les mots type du langage (with, use, begin, procedure, etc...) s'inscrivent en majuscule automatiquement. Peut-on les garder en minuscule?
    Euh, c'est bizarre mais dans le souvenir que j'ai, adagide mettait tout en minuscule par défaut (sauf les premières lettres). Ce qui voudrait donc dire que ceci est paramètrable. Il faut regarder dans les options.

    Au passage, ton code possède une erreur, tri_fini n'est pas initialisé.

  5. #5
    Membre régulier Avatar de m@tix
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 304
    Points : 76
    Points
    76
    Par défaut
    Citation Envoyé par PRomu@ld Voir le message
    De mémoire, il me semble que c'est possible (j'ai le souvenir d'avoir vu du code en couleur lors d'impressions).
    Ok... Comment?



    Citation Envoyé par PRomu@ld Voir le message
    Euh, c'est bizarre mais dans le souvenir que j'ai, adagide mettait tout en minuscule par défaut (sauf les premières lettres). Ce qui voudrait donc dire que ceci est paramètrable. Il faut regarder dans les options.
    C'est réglé!

    Citation Envoyé par PRomu@ld Voir le message
    Au passage, ton code possède une erreur, tri_fini n'est pas initialisé.
    Pourquoi est-ce obligatoire?

  6. #6
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Pourquoi est-ce obligatoire?


    Imagine comment se déroule l'algorithme sans cette initialisation .

  7. #7
    Membre régulier Avatar de m@tix
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 304
    Points : 76
    Points
    76
    Par défaut
    Citation Envoyé par PRomu@ld Voir le message


    Imagine comment se déroule l'algorithme sans cette initialisation .

    Et bien, ça se déroule plutôt bien il me semble.. Enfin, sûrement pas si tu me le dis, mais je ne vois pas pourquoi.

  8. #8
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Ta boucle commence avec ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       WHILE NOT Tri_Fini LOOP
    Quel est le résultat du test ? Rentre t'on dans la boucle ou pas ?

  9. #9
    Membre régulier Avatar de m@tix
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 304
    Points : 76
    Points
    76
    Par défaut
    Ah ok... En effet, si je ne mets pas Tri_Fini à False dès le début, je ne rentrerai jamais dans la boucle.. Merci!

    Au passage, tant que j'y suis, dans l'écriture de ce programme, j'ai également été amené à écrire une procédure se saisie permettant à l'utilisateur de saisir des données, à savoir les noms, âge et résultat (note) de plusieurs sportifs. Je souhaiterais faire une fonction plutôt qu'une procédure pour réaliser cette saisie, mais je ne vois pas bien comment. Des idées peut-être? Au besoin, je posterai la procédure que j'ai déjà faite.

  10. #10
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Ah ok... En effet, si je ne mets pas Tri_Fini à False dès le début, je ne rentrerai jamais dans la boucle.. Merci!
    En fait le comportement n'est pas défini (suivant le compilateur que tu utilises, tri_fini vaudra True ou False), il ne me semble pas que la norme prévoit d'initialiser les objets lors de leur déclaration. De plus de manière générale, et quelqu'en soit le langage, il faut toujours initialiser une variable avant de l'utiliser. C'est bien souvent une source d'erreur.

    Je souhaiterais faire une fonction plutôt qu'une procédure pour réaliser cette saisie, mais je ne vois pas bien comment. Des idées peut-être? Au besoin, je posterai la procédure que j'ai déjà faite.
    L'idée c'est de créer un type record qui contient tous les champs et que ta fonction renvoie un objet de ce type. Attention toutefois à ce que le type ne soit pas limited.

  11. #11
    Membre régulier Avatar de m@tix
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 304
    Points : 76
    Points
    76
    Par défaut
    Citation Envoyé par PRomu@ld Voir le message
    L'idée c'est de créer un type record qui contient tous les champs et que ta fonction renvoie un objet de ce type. Attention toutefois à ce que le type ne soit pas limited.
    Le record, je l'avais déjà créé. Je me demande juste ce qu'il faut que je change pour avoir une fonction et non une procédure.. A priori, elle sera donc spécifiée ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function Tri return Info_Sportif
    Sachant que Info_Sportif est défini ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    type Info_Sportif is record
        nom: String(0..10);
        âge: Positive;
        résultat: Integer;
    end record;
    Ok?

  12. #12
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Le record, je l'avais déjà créé. Je me demande juste ce qu'il faut que je change pour avoir une fonction et non une procédure.. A priori, elle sera donc spécifiée ainsi:
    Oui, c'est ça.

  13. #13
    Membre régulier Avatar de m@tix
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 304
    Points : 76
    Points
    76
    Par défaut
    Et concernant la fonction elle-même que je souhaite écrire? Que changer par rapport à une procédure?

  14. #14
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Tu fais sensiblement la même chose, tu remplie les champs de l'objet que tu souhaites initialiser et à la fin tu fait un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return le_nom_de_l_objet ;
    Et c'est tout.

  15. #15
    Membre régulier Avatar de m@tix
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 304
    Points : 76
    Points
    76
    Par défaut
    Bon, je vais tenter, et je reviendrai la poster pour vérification d'ici demain. Merci!

  16. #16
    Membre régulier Avatar de m@tix
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 304
    Points : 76
    Points
    76
    Par défaut
    Bon, j'ai un peu cherché, mais je ne vois pas bien quelles instructions écrire pour cette saisie... Pour la forme, je pense par contre que c'est bon:

    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
    type Info_Sportif is record
        nom: String(0..10);
        âge: Positive;
        résultat: Integer;
    end record;
    
    type Un_Tab_Releve is array (Natural range <>) of Info_Sportif;
    
    function Saisie return Un_Tab_Releve is
       
       T: Un_Tab_Releve;
       
    begin
       
       -- Instructions ??
       
       return T;
       
    end Saisie;
    Une idée pour m'aider peut-être stp?

  17. #17
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Je ne vois pas ce qui te pose problème. Tu sais lire un enter au clavier, non ?

  18. #18
    Membre régulier Avatar de m@tix
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 304
    Points : 76
    Points
    76
    Par défaut
    Bon, j'ai tenté quelque chose... Voyons ce que tu en penses!

    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
    type Info_Sportif is record
        nom: String(0..10);
        âge: Positive;
        résultat: Integer;
    end record;
    
    type Un_Tab_Releve is array (Natural range <>) of Info_Sportif;
    
    function Saisie return Un_Tab_Releve is
       
       T: Un_Tab_Releve;
       
    begin
       
       for I in T'range loop
          Put("Veuillez rentrer les noms, âges et résultats des sportifs: ");
          New_Line(2);
          Put("Nom: ");
          Get(T(I).Nom);
          Put("Age: ");
          Get(T(I).Âge);
          Put("Résultat: ");
          Get(T(I).Résultat);
          Skip_Line;
       end loop;
       
       return T;
       
    end Saisie;
    Ça passe?

  19. #19
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Ca me parait pas trop mal, tu as juste un petit problème parce que un_tab_releve est un type non contraint (natural range <>), donc il faut lui donner une taille lorsque tu le déclares.

    Sinon c'est ça. De toutes façons, la seule manière d'être fixé, c'est de tester le code

  20. #20
    Membre régulier Avatar de m@tix
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 304
    Points : 76
    Points
    76
    Par défaut
    Pour ce qui est de la taille du tableau à définir, ce sera fait dans la partie "principale" du programme, là il s'agit simplement d'un sous-programme.

Discussions similaires

  1. tri bulle (setValueAt )
    Par ghotique dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 28/06/2007, 19h42
  2. quelle instruction pour un tri à bulles?
    Par bandit_debutant dans le forum Langage
    Réponses: 2
    Dernier message: 30/11/2006, 07h16
  3. Procédure et tri paramétrable ...
    Par varlau dans le forum SQL
    Réponses: 9
    Dernier message: 03/05/2006, 14h03
  4. besoin d aide et de vrification algo tri bulle
    Par dju.ly dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 30/12/2005, 13h04
  5. Tri à bulle - Affichage de sprite
    Par Gory dans le forum Assembleur
    Réponses: 5
    Dernier message: 10/03/2005, 15h27

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