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

Turbo Pascal Discussion :

[TP] Saisir un tableau dont les éléments sont différents un à un


Sujet :

Turbo Pascal

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 57
    Points : 20
    Points
    20
    Par défaut [TP] Saisir un tableau dont les éléments sont différents un à un
    voila ce que j'ai fait
    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
    procedure saisie(n1:integer;var a:tab);
    var i,j:integer;
        v:boolean;
    begin
    v:=false;
     for i:=1 to n1 do
     begin
      repeat
       write('donner l''élement num ',i,' du tableau: ');
       readln(a[i]);
        for j:=1 to n1 do
         if a[j]=a[i] then
          v:=true;
      until v=false;
      end;
    end;
    je crois que mon erreur est avec la variable booleénne,mais j'ai pa su la corriger.
    Si vous pouvez m'aidez ca serait super!!

  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 948
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 948
    Points : 5 662
    Points
    5 662
    Par défaut
    Qio,

    - Il faudrait lire une valeur, sans la mettre dans le tableau,

    - Puis, vérifier si elle est déjà là.

    - Si elle y est déjà, on l'ignore, sinon on l'ajoute au tableau.


    Cela montre déjà qu'une boucle for n'est pas adaptée, il faut une boucle repeat, car on va y passer au moins une fois.

    Je te conseille de faire une fonction pour contrôler si une valeur est déjà dans le tableau

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 57
    Points : 20
    Points
    20
    Par défaut
    mais si je fais une boucle repeat,comment je fais pour controler toutes les valeurs du tableuax?Je ve dire comment faire pour voir si cet éléments n'existe pas dans tout le tableux?
    Ne faut-il pas utiliser for pour le parcourir?

  4. #4
    Expert confirmé
    Avatar de krachik
    Inscrit en
    Décembre 2004
    Messages
    1 964
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 964
    Points : 4 015
    Points
    4 015
    Par défaut
    bonjour
    si tu pose cette question c'est que tu n'a pas encore compris comment on utilise une boucle repeat qui dans ton cas est plus optimal sinon t'aurais pu utiliser une boucle while(pas optimal dans ton cas)
    s'il s'agit de voir si l'element entré est dans le tableau ,avec la boucle repeat tu parcours ton tableau jusqu'a rencontrer ta valeur et une fois ta valeur rencontré tu sors de la boucle pour eviter une perte de temps
    ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
         ..........
                   ....................
                   .............
             i:=1;
             repeat
                  tableau[i]:=i;
                  ..............
                  .................
                  inc(i);
             until (i=5);
    c'est bien l'algo que droggo à ecrit? je trouve que dans ta fonction il y ' a pas tout ça.
    as tu compris pourquoi une boucle for n'est pas adapté?
    @+

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 57
    Points : 20
    Points
    20
    Par défaut
    Citation Envoyé par krachik
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
         ..........
                   ....................
                   .............
             i:=1;
             repeat
                  tableau[i]:=i;
                  ..............
                  .................
                  inc(i);
             until (i=5);
    J'ai vraiment pas compris le role de ce que tu as écris!!
    La tu n'es pa entrain de verifier si l'élément i est égale ou nom a l'indice i lui meme? (tableau[i]:=i??

  6. #6
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 948
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 948
    Points : 5 662
    Points
    5 662
    Par défaut
    Hio,

    En gros (suffisamment détaillé, tu n'as plus qu'à coder ) :
    Code X : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    { le tableau a des indices de 1 à n1 }
    - Initialiser i = 0
    
    - répéter
    .    lire valeur
    .    contrôler si valeur existe déjà
    .      si elle n'existe pas
    .        incrémenter i, qui sera l'indice où stocker la nouvelle valeur
    .        mettre la valeur à sa place
    - jusqu'à i = n1

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 57
    Points : 20
    Points
    20
    Par défaut
    Citation Envoyé par droggo
    contrôler si valeur existe déja
    C'est justement ca mon probleme!
    Tu m'a dit qu'il ne fallait pas utiliser for,il faut le faire avec while?

  8. #8
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 948
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 948
    Points : 5 662
    Points
    5 662
    Par défaut
    Zoi,
    Citation Envoyé par mah00
    C'est justement ca mon probleme!
    Tu m'a dit qu'il ne fallait pas utiliser for,il faut le faire avec while?
    Relis ce que j'ai écrit, je n'ai jamais prétendu cela.

    Ce que j'ai écrit, c'est qu'une boucle for n'est pas appropriée pour lire/ajouter une valeur dans ton tableau.

    Pour contrôler si la valeur existe déjà, une boucle for est parfaitement adaptée, en faisant quand même attention aux indices.

  9. #9
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 465
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 465
    Points : 4 312
    Points
    4 312
    Par défaut
    Oui avec un while. Ca consiste à parcourir ton tableau du début, et de s'arreter si on trouve la valeur désirée, ou sinon continuer jusqu'à la fin. A la fin de la boucle, si l'indice de parcours est supérieur à la taille du tableau, alors on a pas trouvé l'élément cherché, sinon on l'a trouvé.

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 57
    Points : 20
    Points
    20
    Par défaut
    voila ce que j'ai fait,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
    20
    procedure saisie(n1:integer;var a:tab);
    var k,i,j:integer;
        b:char;
    begin
    k:=0;
    i:=0;
     repeat
       k:=0;
        write('donner l''élément num ',(i+1),' :');
        readln(b);
         for j:=1 to n1 do
           begin
            if a[j]=b then
            k:=k+1;
           end;
         if k= 0 then
         inc(i);
         a[i]:=b;
     until i=n1;
    end;

  11. #11
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 948
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 948
    Points : 5 662
    Points
    5 662
    Par défaut
    Koi,

    Non, et ça va devenir un leitmotiv : en testant, tu as bien dû voir que ça ne va pas.

    Fais un effort, je t'ai mâché le travail à faire, en ajoutant qu'il fallait faire attention aux indices.

    Et c'est vrai, wormful_sickfoot a raison : une boucle while irait mieux, sauf si tu apprends à stopper une boucle for quand une condition est vraie (ce qui revient à gérer une boucle while ).

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 57
    Points : 20
    Points
    20
    Par défaut
    mais j'ai essayé et je ne suis pas arrivé!!Pas la peine de me dire de faire un effort parceque c'est ce que je fais!
    Et pour la boucle while,je n'ai pas compris comment il fallait faire.

  13. #13
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 948
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 948
    Points : 5 662
    Points
    5 662
    Par défaut
    Dao,

    Une boucle while fonctionne ainsi : elle s'exécute tant qu'une condition est vraie, y compris pour le 1er tour, ce qui oblige à initaliser la condition, et implique qu'on peut très bien ne jamais passer dans la boucle, car elle teste la condition avant de s'exécuter

    Soit condition qui est vraie ou fausse.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ...
    var
       condition : booléen (vrai ou faux)
    ...
      condition = vrai;
     
      tant que condition = vrai faire
        { le code, qui a un moment ou un autre
           devra mettre condition à faux. }
      fin boucle
    fera au moins un tour dans la boucle, car la condition est vérifiée avant d'entrer dans la boucle

    alors que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ...
    var
       condition : booléen (vrai ou faux)
    ...
      condition = faux;
     
      tant que condition = vrai faire
        { le code, qui a un moment ou un autre
           devra mettre condition à faux. }
      fin boucle
    n'y passera jamais.

    Dans ton cas, la condition est constituée de 2 parties:
    - la valeur existe ou pas,
    - l'indice ne dépasse pas l'indice de la dernière valeur validée

    Si on appelle :
    existe un booléen = true quand la valeur existe déjà, sinon false
    iMax l'indice de la dernière valeur entrée, c'est à dire validée, = 0 s'il n'y a encore aucune entrée validée
    i l'indice qui sert à boucler pour la vérification
    valeur est la nouvelle valeur à tester
    t est le tableau en cours de remplissage, dont le plus grand indice actuellement valide est donc iMax

    On a condition pour que la boucle s'exécute =
    (existe = false) ET (i <= iMax)

    Ce qui se traduit par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ...
    existe := false;
    i := 1;
    while not(existe) and (i <= iMax) do
    begin
      if t[i] = valeur
      then existe := true
      else i := i +1;
    end;
    À la sortie, si existe = false, alors la valeur n'existe pas dans t.

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 57
    Points : 20
    Points
    20
    Par défaut
    merci pour cette explication détaillée,elle m'aide vraiment parceque j'ai souvent a utilisé ce genre de séquence et a chaque fois j'essaye de l'éviter faute de maitrise des variables booleénnes!
    Merci encore a tous!

Discussions similaires

  1. Tableau dont les éléments sont des tableaux
    Par tpdm dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 27/01/2010, 19h02
  2. Réponses: 12
    Dernier message: 15/07/2009, 17h28
  3. Réponses: 5
    Dernier message: 08/04/2009, 12h15
  4. E-Mail dont les éléments sont fonction d'une variable
    Par j.p.mignot dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 15/01/2008, 18h52
  5. Réponses: 3
    Dernier message: 20/08/2007, 17h30

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