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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 57
    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 Expert
    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 : 41
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2003
    Messages : 974
    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 ?

  3. #3
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 969
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 969
    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

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 57
    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 averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 57
    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 969
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 969
    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é.

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 57
    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 !

+ 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