dj_titeuf | 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 :
- 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! |