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 :

Les listes avec pointeur


Sujet :

Ada

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2008
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 130
    Points : 80
    Points
    80
    Par défaut Les listes avec pointeur
    Bonjour après mes questions sur les pointeurs je me suis lancé dans les listes : bonne nouvelle ca fonctionne mais j'ai un erreur qui apparait lorsque je recherche une valeur voila mon code :

    Code ADA : 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
     
    WITH text_io;, Unchecked_Deallocation, Ada.Numerics.Discrete_Random;
    USE text_io;;
     
    PROCEDURE Ptr IS
       subtype Nbnb IS Integer RANGE 1..10;
       PACKAGE Randnb IS NEW Ada.Numerics.Discrete_Random(Nbnb);
       USE Randnb;
     
       PACKAGE Rand IS NEW Ada.Numerics.Discrete_Random(integer);
       USE Rand;
     
       TYPE Couple;
       TYPE Liste IS ACCESS Couple;
       TYPE Couple IS RECORD
          Valeur : Integer;
          Suivant : Liste;
       END RECORD;
     
    --   PROCEDURE Free IS NEW Unchecked_Deallocation(Couple, Liste);
     
       --specification
       FUNCTION Ajout (L : IN Liste; Valeur : Integer) RETURN Liste; --ajout une valeur dans la liste
       FUNCTION Position (L : IN Liste; Valeur : Integer) RETURN Integer; --calcul la position de la valeur dans la liste
       FUNCTION Longueur(L : Liste) RETURN Integer;--calcul la longueur de la liste
       PROCEDURE Affiche_Liste(L : IN Liste);--affiche la liste
     
       --corps
       FUNCTION Ajout(L : IN Liste; Valeur : Integer) RETURN Liste IS
       BEGIN
          RETURN NEW Couple'(Valeur, L);
       END Ajout;
     
       FUNCTION Position (L : IN Liste; Valeur : Integer) RETURN Integer IS
          Pos : Integer := 1;
          K   : Liste := L;
       BEGIN
          WHILE (K /= null) and then (K.All.Valeur /= Valeur) LOOP
             Pos := Pos + 1;
             K := K.All.Suivant;
          END LOOP;
          RETURN Pos;
       END Position;
     
       FUNCTION Longueur(L : Liste) RETURN Integer IS
          Long : Integer := 0;
          K : Liste := L;
       BEGIN
          WHILE K /= NULL LOOP
             Long := Long +1;
             K := K.All.Suivant;
          END LOOP;
          RETURN Long;
       END Longueur;
     
       PROCEDURE Affiche_Liste(L : IN Liste) IS
          K : Liste := L;
       BEGIN
          WHILE K /= NULL LOOP
             Put ((K.All.Valeur), 3);
             K:= K.All.Suivant;
          END LOOP;
       END Affiche_Liste;
     
       L : Liste;
       G : rand.Generator;
       Gnb : randnb.Generator;
       Val : Integer;
       conti : character := 'o';
     
    BEGIN
       Reset(G);
       Reset (Gnb);
     
       while (conti = 'o') loop --pour tester les random ;)
          FOR I IN 1 .. random (gnb) LOOP
             L := Ajout (L, Random (G) mod 10 + 1);
          END LOOP;
     
          Put_Line ("Valeur contenu dans la liste :");
          Affiche_Liste (L);
     
          New_Line (2);
          Put ("Longueur : "); Put (Longueur (L), 1); New_Line;
          Put ("Saisir une valeur pour avoir sa position : "); Get (Val); --demande de la valeur a chercher
          Put ("Position : "); Put (Position (L, val), 1); New_Line;
     
          loop --boucle pou continuer
             new_line(2);
             put ("voulez-vous continuer a simuler ? ");
             get (conti);
             exit when (conti = 'o') or (conti = 'O') or (conti = 'n') or (conti = 'N');
          end loop;
     
       end loop;
    END Ptr;
    une petite simulation :
    Valeur contenu dans la liste :
    3 3 4 7 6 2 4

    Longueur : 7
    Saisir une valeur pour avoir sa position : 8
    Position : 8 => problème il n'y a pas de 8 et de position 8


    voulez-vous continuer a simuler ? o
    Valeur contenu dans la liste :
    7 3 8 3 2 3 5 10 3 3 4 7 6 2 4

    Longueur : 15
    Saisir une valeur pour avoir sa position : 12
    Position : 16 => problème il n'y a pas de 12 et il n'y a que 15 valeurs pas 16


    voulez-vous continuer a simuler ? o
    Valeur contenu dans la liste :
    4 8 9 7 3 8 3 2 3 5 10 3 3 4 7 6 2 4

    Longueur : 18
    Saisir une valeur pour avoir sa position : 10
    Position : 11 => là je ne pense pas qu'il y est un probleme

    Je suppose que le problème vient d'une condition manquante mais je ne vois pas laquelle, pouvez-vous m'aider ?

  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
    Longueur : 7
    Saisir une valeur pour avoir sa position : 8
    Position : 8 => problème il n'y a pas de 8 et de position 8
    C'est normal, en fait tu ne traites pas le cas où la position n'est pas trouvée donc ce que tu renvoies, c'est la longueur de la liste + 1.

    Une idée (pas testée) pourrait être :

    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
     
    FUNCTION Position (L : IN Liste; Valeur : Integer) RETURN Integer IS
          Pos : Integer := 1;
          K   : Liste := L;
       BEGIN
          WHILE (K /= null) LOOP
             -- On a trouvé la valeur on renvoie directement sa position.
             if K.all.valeur = valeur then
                  return pos;
             end if
             Pos := Pos + 1;
             K := K.All.Suivant;
          END LOOP;
     
          -- Si on est ici, c'est que la position n'existe pas, donc on renvoie une position absurde)
          RETURN -1;
       END Position;
    Le problème avec ceci (enfin ça n'est pas forcément un problème) vient du fait que s'il y a deux fois (au moins) la même valeur dans la liste, on ne va renvoyer que la première occurence.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Février 2008
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 130
    Points : 80
    Points
    80
    Par défaut
    merci pour cette proposition, j'ai une petite question existe-t-il un équivalent de l'argc et argv en ada ? J'ai dans l'idée de faire un programme nommé test auquel je veux passer 3 arguments ca donnerait quelque chose comme :
    test fichier_in fichier_out1 fichier_out2

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2008
    Messages : 141
    Points : 184
    Points
    184
    Par défaut
    Bonjour,

    oui, tu as les fonctions Argument et Argument_Count, disponibles dans Ada.Command_Line.

    http://www.adahome.com/rm95/rm9x-A-15.html

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Février 2008
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 130
    Points : 80
    Points
    80
    Par défaut
    merci de vos aides

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

Discussions similaires

  1. les listes avec des cases à cocher et MySQL
    Par manelll dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 27/04/2015, 20h37
  2. [AC-2007] les liste avec dans des formulaires access
    Par zibi7 dans le forum VBA Access
    Réponses: 6
    Dernier message: 04/08/2009, 16h05
  3. Les listes avec la STL
    Par Le savant fou ! dans le forum SL & STL
    Réponses: 7
    Dernier message: 02/04/2008, 21h54
  4. problème de pointeur avec les listes chainees
    Par innosang dans le forum C
    Réponses: 9
    Dernier message: 30/12/2005, 15h46
  5. [LG]Listes chainées avec pointeur
    Par PaowZ dans le forum Langage
    Réponses: 2
    Dernier message: 17/02/2004, 19h49

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