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] Afficher des chaînes contenues dans un tableau


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] Afficher des chaînes contenues dans un tableau
    salut a tous!
    voila ce que je dois faire:
    saisir un tableau t de n chaine de caracteres(n dans [2..20]), puis afficher pour chaque elements T[i] les i premiers caractere de la chaine.
    Voila mon travail mais ca ne marche pas comme je veux!
    essayer de m'aider pour trouver mon erreur svp..

    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
    program triangle;
     
    uses wincrt;
     
    type tab=array[1..20] of string;
     
    var
      a,t: tab;
      n: integer;
     
    procedure saisie(n1:integer;var t1:tab);
    var i:integer;
    begin
      for i:=1 to n1 do
        repeat
          writeln('donner l''élément num ',i,' du tableau: ') ;
          readln(t1[i]);
        until length(t1[i])>i;
    end;
     
    procedure affichage(n1:integer;t1:tab;var t2:tab);
    var k,j,l:integer;
    begin
      for k:=1 to n1 do
        for j:=1 to k do
          t2[k][j]:=t1[k][j];
     
      for l:=1 to n1 do
        writeln(t2[l]);
    end;
     
    begin
      repeat
        write('donner la taille du tableau : ');
        readln(n);
      until n in [2..20];
      saisie(n,t);
      affichage(n,t,a);
    end.

  2. #2
    Membre expérimenté
    Avatar de Juju_41
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Février 2003
    Messages
    974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Février 2003
    Messages : 974
    Points : 1 557
    Points
    1 557
    Par défaut
    Bonjour,

    Avant toute chose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    type tab=array[2..20] of string;
    Pourquoi commencer à 2 ? il n'y a pas de première chaine de caractères ?
    Avant de poster, merci de consulter les règles du forum

  3. #3
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Jui,

    Conseil : évite d'utiliser Read pour lire un donnée au clavier. Readln évite les mauvaises surprises.

    Évite ce genre de déclaration :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure affichage(n1:integer;t1:tab;var t2:tab);
    qui fait une copie locale de t1, tout à fait inutile

    Préfère
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure affichage(n1:integer;const t1:tab;var t2:tab);
    Le mot clé const permet le passage par adresse, plus efficace, et en même temps interdit la modification de t1 par la procédure.

    Il faudrait te pencher sur ta procédure affichage.

    Vérifie bien ce qu'elle fait.

    Et enfin, leitmotiv : mets ton code en forme, c'est à dire indentation régulière et cohérente, et éclaircir en ajoutant des lignes vides pour séparer les blocs (au moins pour séparer les procédures les unes des autres).
    Tu verras que ce sera plus clair à lire/modifier

    Et +1 sur Juju_41 qui a posté pendant que je rédigeais ma réponse
    Si les cons volaient, il ferait nuit à midi.

  4. #4
    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
    pour array of [2..20], tu as raison c'est juste la taille que l'utilisateur va definir qui doit etre differente de un!
    Pour 'const',desoler de te contrarier mais ce mots clé n'est pa dans mon programme scolaire donc je ne peux pas l'utiliser.
    Sinon,je ne sais si vous avez executer le code,mais je ne vois toujours pas ce que j'ai fait de travers,mon raisonnement me parait juste...

  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
    résolu,tout seul,comme un grand
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    program triangle;
    uses wincrt;
    type tab=array[1..20] of string;
    var t,f:tab;
        n,l:integer;
     
    procedure saisie(n1:integer;var t1:tab);
    var i:integer;
     
    begin
    for i:=1 to n1 do
      repeat
        writeln('donner l''élément num ',i,' du tableau: ') ;
        readln(t1[i]);
      until length(t1[i])>i;
    end;
     
    procedure affichage(n1:integer;t1:tab;var t2:tab);
    var k,j,b:integer;
     
    begin
    for k:=1 to n1 do
      for j:=1 to k do
      delete(t1[k],k,length(t1[k])-k);
    for b:=1 to n1 do
        t2[b]:=t1[b];
     
    end;
     
    begin
    repeat
      write('donner la taille du tableau : ');
      readln(n);
    until n in [2..20];
    saisie(n,t);
    affichage(n,t,f);
    for l:=1 to n do
      writeln(f[l]);
    end.
    Merci a tous pour vos reponses!!

  6. #6
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Guo,
    Citation Envoyé par mah00
    résolu,tout seul,comme un grand
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    program triangle;
    uses wincrt;
    type tab=array[1..20] of string;
    var t,f:tab;
        n,l:integer;
     
    procedure saisie(n1:integer;var t1:tab);
    var i:integer;
     
    begin
    for i:=1 to n1 do
      repeat
        writeln('donner l''élément num ',i,' du tableau: ') ;
        readln(t1[i]);
      until length(t1[i])>i;
    end;
     
    procedure affichage(n1:integer;t1:tab;var t2:tab);
    var k,j,b:integer;
     
    begin
    for k:=1 to n1 do
      for j:=1 to k do
      delete(t1[k],k,length(t1[k])-k);
    for b:=1 to n1 do
        t2[b]:=t1[b];
     
    end;
     
    begin
    repeat
      write('donner la taille du tableau : ');
      readln(n);
    until n in [2..20];
    saisie(n,t);
    affichage(n,t,f);
    for l:=1 to n do
      writeln(f[l]);
    end.
    Merci a tous pour vos reponses!!
    Ça marche, mais c'est bien compliqué dans la procédure affichage

    Une manière plus habituelle de faire serait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure affichage(n1:integer;t1:tab;var t2:tab);
    var k,j,b:integer;
     
    begin
    for k:=1 to n1 do
      begin
        t2[k] := '';
        for j:=1 to k do
          t2[k] := t2[k] + t1[k][j];
      end;
    end;
    Avec l'avantage que cela marchera avec tous les compilateurs, quel que soit le type effectif de string, car si c'est un ansistring, cas par défaut de FreePascal par exemple, tu ne peux pas écrire à une position x de la chaîne si elle n'a pas au moins cette longueur x sans lancer une exception.

    De plus, ta méthode contient une erreur : rien ne met à jour la longueur des chaînes dans t2, et si tu as obtenu le bon résultat, c'est que tu es malchanceux.


    Citation Envoyé par mah00
    Pour 'const',desoler de te contrarier mais ce mots clé n'est pa dans mon programme scolaire donc je ne peux pas l'utiliser.
    Je ne suis pas contrarié, rassure-toi.
    Mais alors, utilise var. Permettre des copies locales de variables de grande taille est peu recommandé.
    Si les cons volaient, il ferait nuit à midi.

  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
    Ah bon !! Pourtant j'ai essayé avec des longueurs différentes et ça a bien marché !!
    Je ne vois pas où est le problème !

  8. #8
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Zio,
    Citation Envoyé par mah00
    ah bon!!pourtant j'ai essayé avec des longueur différentes et ca a bien marché!!
    je ne vois pas ou est le probleme!
    Oh pardon, j'en était resté sur le code 1ère version.

    Quoi qu'il en soit, la méthode que je t'ai indiquée me semble préférable, étant plus habituelle.

    Autre petite remarque : il faut utiliser des noms de variables et fonctions/procédures suffisamment significatifs, ce qui n'est pas le cas de ta procédure affichage.

    Quel est ton problème pour l'autre sujet dont tu m'as donné le lien ?
    Je pensais que c'était résolu, vu que tu n'as pas continué sur le sujet après la dernière réponse de Alcatîz ?
    Si les cons volaient, il ferait nuit à midi.

  9. #9
    Expert confirmé
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Points : 4 845
    Points
    4 845
    Par défaut
    Juste une question :
    ton but étant d'afficher les débuts de chaîne contenus dans le tableau, pourquoi créer un 2ième tableau pour les stocker ?

    Ne serait-il pas plus simple d'utiliser une (seule) variable locale de type String et de l'afficher ? (ou encore d'afficher directement, mais c'est pas joli et pas vraiment réutilisable.)

    Ca te permettrait de plus de faire une procédure plus générale :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function recupere_chaine(t : tab; indice : integer) : string;
    var
      s : string;
    begin
      s := '';
      for i := 1 to indice do
        s = s + t[i];
      recupere_chaine := s;
    end;

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 26/10/2010, 22h14
  2. Réponses: 9
    Dernier message: 13/12/2009, 13h28
  3. [Tableaux] afficher un texte contenu dans un tableau
    Par liverbird dans le forum Langage
    Réponses: 2
    Dernier message: 04/07/2007, 16h41
  4. Manipulation des valeurs contenues dans un tableau
    Par khasanouray dans le forum Langage
    Réponses: 3
    Dernier message: 29/05/2007, 20h36
  5. Réponses: 10
    Dernier message: 06/07/2006, 21h57

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