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 :

Rangement d'une liste


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 Rangement d'une liste
    Bonsoir,

    C'est encore moi, avec une nouvelle fois un problème sur les listes. J'explique mon sujet. Je cherche à écrire un programme qui range des valeurs saisies par un utilisateur au fur et à mesure dans une liste chaînée. Les valeurs négatives sont rangées en début de liste, et les valeurs positives sont rangées en fin de liste; la valeur 0 n'est pas rangée dans la liste, la saisie se termine quand l'utilisateur rentre 0.

    Par exemple:

    Si l'utilisateur fournit successivement les valeurs 4, -5, 8, 2, -3, -9, 1, 0, on cherche à obtenir l'affichage suivant:

    "La liste contient les valeurs suivantes: -9 -3 -5 4 8 2 1."

    Pour l'instant, voici ce que j'ai fait (je n'ai pas encore fait la procédure de saisie, il faut d'abord que le reste fonctionne, c'est plus important à mon avis):

    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    with Ada.Text_IO, Ada.Integer_Text_IO;
    use Ada.Text_IO, Ada.Integer_Text_IO;
     
    procedure Prog is
     
       -- Déclaration des types et sous-types
     
       subtype Entiers is Integer range -50..50;
     
       type Element;
     
       type Liste is access Element;
     
       type Element is record
     
          Valeur: Entiers;
          Suivant: Liste;
     
       end record;
     
     
       -- Sous-programme qui range une valeur donnée dans une liste: les élements négatifs à gauche, les positifs à droite
     
       procedure Ranger_Dans_Liste (Ma_Valeur: in Entiers; Ma_Liste: in out Liste) is
     
          Aux: Liste := Ma_Liste;
     
       begin
     
          if Ma_Liste = null then
     
             Ma_Liste := new Element'(Ma_Valeur,null);
     
          else
     
             if Ma_Valeur < 0 then
     
                if Aux.All.Valeur > 0 then
     
                   Aux := new Element'(Ma_Valeur,Aux);
     
                elsif Aux.All.Valeur < 0 then
     
                   Aux := new Element'(Ma_Valeur, Aux.All.Suivant);
     
                end if;
     
             elsif Ma_Valeur > 0 then
     
                if Aux.All.Valeur > 0 then
     
                   Aux := new Element'(Ma_Valeur, Aux.All.Suivant);
     
                elsif Aux.All.Valeur < 0 then
     
                   Aux := new Element'(Ma_Valeur, Aux);
     
                end if;
     
             end if;
     
          end if;
     
       end Ranger_Dans_Liste;
     
     
       -- Sous-programme d'affichage de la liste (ordre de saisie)
     
     
       procedure Afficher_Liste (Ma_Liste: in Liste) is
     
          Aux: Liste := Ma_Liste;
     
       begin
     
          Put("Valeurs contenues dans la liste: ");
          new_line(2);
     
          while Aux /= null loop
     
             Put(Aux.All.Valeur,0);
             new_line;
             Aux := Aux.All.Suivant;
     
          end loop;
     
       end Afficher_Liste;
     
     
     
     
       -- Declaration du programme general
     
     
       Ma_Liste: Liste;
     
    begin
     
       Ma_Liste := new Element'(-3,new Element'(-1, new Element'(4,null)));
       Ranger_Dans_Liste(-2, Ma_Liste);
       Afficher_Liste(Ma_Liste);
     
    end Prog;
    Pour une liste vide, pas de problèmes, ça fonctionne!
    Dans le cas contraire, ça ne va plus du tout par contre: j'ai par exemple essayé de ranger une valeur négative (-2), dans une liste donnée: -3 -1 4, en vain. Voyez-vous où sont les problèmes? J'ai essayé de m'illustrer le problème, mais je ne parviens pas à voir ce qui ne va pas. Si vous avez des questions relatives à mon code, n'hésitez surtout pas! En espérant que vous pourrez me guider, 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 : 39
    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
    En fait, je pense que ton problème vient du fait que ta liste n'est pas modifiée, lorsque tu as plus d'un élément, tu modifie aux et pas ta liste : en fait tu recrées un nouveau noeud correct (enfin je pense), mais ça n'est pas la liste que tu as modifié.

    A mon avis, il faudrait un petit

    Une fois que tu as fini de créer Aux.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 13
    Points : 13
    Points
    13
    Par défaut
    Non, PRomu@ld ça ne marche pas comme ça. (cf http://www.developpez.net/forums/d74...-dauxiliaires/)

    M@tix, comme tu ne veux pas ranger les valeurs dans l'ordre croissant, l'algorithme est relativement simple, tu te compliques la vie:
    -si la valeur est négative alors tu crées une case en début de liste.
    -si la valeur est positive, alors tu crées la case en fin de liste.

    Le (-2) n'est pas affiché car en fait tu dois utiliser Ma_Liste et pas Aux car c'est la première case de la liste.

    Ton algo corrigé:

    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    with Ada.Text_Io, Ada.Integer_Text_Io;
    use Ada.Text_Io, Ada.Integer_Text_Io;
    
    procedure Prog is 
    
       -- Déclaration des types et sous-types
    
       subtype Entiers is Integer range -50..50;
    
       type Element; 
    
       type Liste is access Element; 
    
       type Element is 
          record 
             Valeur  : Entiers;  
             Suivant : Liste;  
          end record; 
    
    
       -- Sous-programme qui range une valeur donnée dans une liste: les élements négatifs à gauche, les positifs à droite
    
       procedure Ranger_Dans_Liste (
             Ma_Valeur : in     Entiers; 
             Ma_Liste  : in out Liste    ) is 
    
          Aux : Liste := Ma_Liste;  
    
       begin
    
          if Ma_Liste = null then
    
             Ma_Liste := new Element'(Ma_Valeur,null);
    
          else
    
             if Ma_Valeur < 0 then
                Ma_Liste := new Element'(Ma_Valeur,Ma_Liste);
             else
    
    --Ici on va en fin de liste.
                while Aux.all.Suivant/=null loop
                   Aux:=Aux.all.Suivant;
                end loop;
    
                Aux.all.Suivant:=new Element'(Ma_Valeur,null);
    
             end if;
    
          end if;
    
       end Ranger_Dans_Liste;
    
    
       -- Sous-programme d'affichage de la liste (ordre de saisie)
    
    
       procedure Afficher_Liste (
             Ma_Liste : in     Liste ) is 
    
          Aux : Liste := Ma_Liste;  
    
       begin
    
          Put("Valeurs contenues dans la liste: ");
          New_Line(2);
    
          while Aux /= null loop
    
             Put(Aux.all.Valeur,0);
             New_Line;
             Aux := Aux.all.Suivant;
    
          end loop;
    
       end Afficher_Liste;
    
       -- Declaration du programme general
    
    
       Ma_Liste : Liste;  
       M        : Integer := 1;  
    begin
    
       Ma_Liste := new Element'(-3,new Element'(-1, new Element'(4,null)));
       Put_Line("Entrer une valeur...");
       New_Line(2);
       Get(M); --pour que les tests soient plus rapides...
       Ranger_Dans_Liste(M, Ma_Liste);
       Afficher_Liste(Ma_Liste);
       delay 5.0; --pour mieux voir la liste...
    
    end Prog;

  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 : 39
    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
    Non, PRomu@ld ça ne marche pas comme ça.
    Oui, tu as raison, j'ai lu en travers l'algo.

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

Discussions similaires

  1. [MFC] Retourner une liste d'objets
    Par 1cado dans le forum MFC
    Réponses: 10
    Dernier message: 28/07/2003, 13h11
  2. Faire une liste de device??
    Par jackjack dans le forum DirectX
    Réponses: 1
    Dernier message: 23/05/2003, 15h43
  3. Réponses: 4
    Dernier message: 24/04/2003, 23h28
  4. Générer une liste
    Par pfredin dans le forum Langage SQL
    Réponses: 6
    Dernier message: 02/04/2003, 16h30
  5. tri d'une liste
    Par Guigui_ dans le forum Langage
    Réponses: 4
    Dernier message: 09/01/2003, 19h08

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