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

Langage Pascal Discussion :

[LG]Déclaration d'un tableau.


Sujet :

Langage Pascal

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    460
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 460
    Points : 112
    Points
    112
    Par défaut [LG]Déclaration d'un tableau.
    Salut !

    J'ai une question un peu bizarre mais je n'y trouve pas de réponse ... J'espère que vous saurez m'éclairer !

    Je voudrais simplement savoir à propos des tableaux quelle différence il y a entre le déclarer en tant que variable et en tant que type.
    Et s'il faudra le faire passer comme paramètre dans une procédure (ou une fonction), comment faut-il le déclarer ?


    Merci d'avance.

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    Il n'y a aucune différence réelle, sauf que la déclaration sous forme de type permet de simplifier l'écriture du programme... L'utilisation de type peut être également plus appropriée si on utilise des pointeurs vers ces tableaux !

    a+
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  3. #3
    HRS
    HRS est déconnecté
    Membre confirmé
    Avatar de HRS
    Inscrit en
    Mars 2002
    Messages
    677
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 677
    Points : 638
    Points
    638
    Par défaut
    pour passer un tableau en paramètre de fonction/procedure, vous devez
    déclarer un type


    type Tabint = array [1..10] of integer;

    procedure exptab (MonTabint : Tabint);

    ----------------------------------------

    var T1 : array [1..10] of integer;
    var T2 : array [1..10] of integer;

    T2 := T1; erreur compile car type différent (même s'ils se ressemblent)

    alors que

    var T1 : Tabint;
    var T2 : Tabint;

    T2 := T1; OK (type identique)

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    460
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 460
    Points : 112
    Points
    112
    Par défaut
    Merci de me répondre !

    Donc pour simplifier, on peut dire qu'il vaut toujours mieux prendre l'habitude de le déclarer avec Type ... J'ai juste ou pas ? :

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    Oui, si ton but est de manipuler des tableaux (en tant qu'entité, je ne parle pas des valeurs contenues à l'intérieur). Comme l'a dit HRS, c'est très pratique pour l'affectation directe, ou les paramètres de procédures, ou même les pointeurs !
    Si tu veux juste stocker des valeurs, tu n'auras pas besoin de déclarer un type pour ça, tu peux utiliser la déclaration normale !

    a+
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    460
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 460
    Points : 112
    Points
    112
    Par défaut
    Bon, c'est de nouveau moi ... Et j'ai vraiment du mal à m'en sortir, donc ... A l'aide !

    Je dois faire rentrer des enregistrements dans une table; comment c'est-y qu'on fait ?

    Actuellement, j'arrive à ça, mais c'est juste valable pour une entrée. Et je sais vraiment pas comment je dois procéder.





    Program Gestion_Table;
    Uses Crt;
    Const Taillemax = 3; anac = 2003; valcarnom ='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';

    Type identite = Record
    matricule : Integer;
    nom : String[25];
    datenais : Record
    annee : Integer;
    mois : Integer;
    jour : Integer;
    End;
    End;

    Type tab = Array[0..taillemax] Of identite;

    Function lireentier(vmin, vmax : Integer): Integer;
    Var n, err, x, y : Integer; ch : String[7];
    Begin
    Repeat
    x:=Wherex; y:=Wherey;
    Readln(ch);
    Gotoxy(x,y); Clreol;
    Val (ch,n,err);
    Until (err=0) And (n<=vmax) And (n>=vmin);
    Writeln (n);
    lireentier:=n;
    End;

    Function lirenom(lgch : Integer): String;
    Var x, y : Integer; ch : String[25];
    Begin
    Repeat
    x:=Wherex; y:=Wherey;
    Readln(ch);
    Gotoxy(x,y); Clreol;
    Until (Length(ch)>=1) And (Length(ch)<=lgch) And (Pos(ch[1],valcarnom)>0);
    Writeln (ch);
    lirenom:=ch;
    End;

    Var personne : identite;
    table : tab;
    aa : Char;
    co : Integer;

    Begin
    co:=1; aa:=' ';
    Clrscr;
    Writeln ('Vous allez rentrer les fiches d''identite de personnes (max: ',taillemax,' )');
    Gotoxy(5,40);
    Writeln ('Frappez une touche pour continuer ...'); aa:=Readkey;
    Clrscr;
    Writeln ('Personne : ',co);
    Writeln ('==============');
    Writeln;
    Write ('Matricule (1 - 2000) [0 => Fin de l''enregistement] : ');
    personne.matricule:=lireentier(0,2000);
    While personne.matricule<>0 Do Begin
    Writeln;
    Write ('Nom : ');
    personne.nom:=lirenom(25);
    Writeln;
    Writeln ('Date de naissance');
    Writeln ('-----------------');
    Write ('Jour : ');
    personne.datenais.jour:=lireentier(1,31);
    Write ('Mois : ');
    personne.datenais.mois:=lireentier(1,12);
    Write ('Annee : ');
    personne.datenais.annee:=lireentier(1900,anac);
    Inc(co);q
    If co<=taillemax Then Begin
    Clrscr;
    Writeln ('Personne : ',co);
    Writeln ('==============');
    Writeln;
    Write ('Matricule (1 - 2000) [0 => Fin de l''enregistement] : ');
    personne.matricule:=lireentier(0,2000)
    End
    Else personne.matricule:=0
    End;

    Gotoxy(5,40);
    Writeln ('Frappez une touche pour finir ...'); aa:=Readkey
    End.


  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    460
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 460
    Points : 112
    Points
    112
    Par défaut
    Bon, je vous mets l'énoncée :

    Thème : Gestion d'une table d'enregistrement.

    Le type des enregistrements en question sera composé des champs suivants :
    - Un matricule
    - Un nom
    - Une date de naissance, enregistrement lui-même composé de 3 champs entiers (année, mois et jour).

    La taille de la table sera déterminée par une constante taillemax.
    Les indices iront de 0 à taillemax.
    L'élément d'indice 0 servira de sentinelle éventuelle (pour un tri par insertion simple par ex); le matricule de cet élément sera mis à -1.
    On fera en sorte que si on met n éléments dans la table (n<taillemax), l'élément d'indice n+1 aura un matricule nul. Ceci déterminera la fin logique de la table.

    Lors de l'encodage :
    - on fera en sorte de vérifier que tous les éléments aient un matricule différent.
    - L'entrée d'un matricule nul causera l'arrêt de l'encodage.
    - La validité des dates sera vérifiée.
    - Un noom sera déclaré valide s'il contient au moins un caractère qui doit être un lettre (on pourra affiner la validation en imposant qu'il ne contienne que des lettres, espaces et tirets).

    Pour lire les données entières (matricule, jour, mois et année), on utilisera une fonction Lire_entier dont les paramètres (IN) seront respectivement la + petite et la + haute valeur admissible; cette procédure lira une chaîne, la transformera en Entier avec la procédure Val et bouclera jusqu'à la validation.

    Le programme principal commencera par un appel à une procédure permettant le remplissage de la table. Ensuite, il fera appel à un menu ... (ça, c'est pour plus tard ...).


    Je sais que tout est loin d'être correct, mais aiguillez-moi pour la table car je nage dans la semoule.

    N.B.: je précise qu'on a encore fait avant ça aucun exercice sur les tableaux, les enregistrements ni les tris (je sais, j'ai un prof un peu spécial ... qui explique excessivement peu; d'ailleurs, il y a un taux d'échec de 90% en janvier en programmation... c'est dur à croire je sais).
    Je précise également que cet exercice est donné à titre d'entraînement personnel et que la solution sera donnée début janvier (mais j'aimerais y arriver seul).

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    Ben tu es dans la bonne voie...
    Il suffit de faire une boucle while dans ton programme principale, qui permet d'entrer des personnes jusqu'à ce qu'il reste de la place dans le tableau ou que l'utilisateur décide d'arrêter le programme...

    a+
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    460
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 460
    Points : 112
    Points
    112
    Par défaut
    La boucle c'est Ok;
    moi je voudrais savoir comment entrer les données. Comment on fait avec les indices pour les enregistrements ?

    Par ex, ici c'est pour une entrée :

    personne.matricule:=lireentier(0,2000);

    Où est-ce que je dois mettre mon indice ?


    Sinon, ceci est-il bon ?

    Type identite = Record
    matricule : Integer;
    nom : String[25];
    datenais : Record
    annee : Integer;
    mois : Integer;
    jour : Integer;
    End;
    End;

    Type tab = Array[0..taillemax] Of identite;

    Var personne : identite;
    table : tab;




    Merci de m'aider en tous cas !

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    Oui c'est bon, mais tu devrais distinguer l'enregistrement des dates de celui de la personne... Tu devrais faire deux enregistrements séparés, plutôt que imbriqués...
    Pour remplir le tableau, il te faut savoir le nombre d'élément dans le tableau d'abord. Pour ça, une variable compteur suffit. Après, il suffit d'affecter à une case du tableau la valeur de Personne. Par exemple, si le tableau est vide, le compteur vaut donc 0, et pour ajouter une personne tu feras :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if compteur<taillemax then
    begin
    tab[compteur+1]:=Personne;
    compteur:=compteur+1;
    end;
    Voilà

    a+
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    460
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 460
    Points : 112
    Points
    112
    Par défaut
    Oulàh... ça devient de plus en plus confus pour moi ...

    Concrètement, quand tu écris personne ci-dessous, c'est sous-entendu tous les autres champs qui suivent compris ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    [color=green]if compteur<taillemax then 
    begin 
    tab[compteur+1]:=Personne; 
    compteur:=compteur+1; 
    end;[/color]
    Et secundo : vaut-il mieux créer un tableau à 2 dimensions et stocker chaque champ dans une nouvelle case du tableau (concrètement : 20 entrées= 20 lignes dans le tableau et 5 champs=5 colones ?).

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    Non ce que tu dois bien comprendre, c'est que tu utilises un tableau d'enregistrements ! Donc, ton enregistrement contient ses 5 champs et ton tableau est une collection d'enregistrements (c'est dur à expliquer !). Le tableau n'a qu'une seule dimension ici, et chaque case du tableau contient un enregistrement.
    Quand j'utilise la référence Personne toute seule, il faut considérer tout l'enregistrement en entier, avec ses attributs. Puisque que ton tableau est un tableau d'identité (chaque case est de type Identité), et que Personne est de type Identité, on peux faire une affectation directe, et les valeurs sont copiées de l'un vers l'autre. C'est pour ça, qu'il ne vaut pas mieux de créer un tableau à deux dimensions, car c'est beaucoup plus compliqué à gérer ! Ici TP se débrouille tout seul avec les enregistrements et ça marche nickel...

    a+
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    460
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 460
    Points : 112
    Points
    112
    Par défaut
    Merci pour cette explication claire !!
    En fait, c'est ce que je pensais aussi mais je n'étais pas sur; et finalement c'est logique puisqu'un tableau doit contenir des éléments de même type (et que mes champs sont de différents types ...).

    Sinon, tu me parlais de faire 2 enregistrements distincts plutot que de les imbriquer; pourquoi (j'ai pourtant vu des sites où on l'expliquait comme cela) ? C'est pas plus simple ?

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    Ben c'est pas forcément plus simple... C'est un question d'architecture du programme. Si tu utilises un enregistrement dans un enregistrement, pourquoi ne pas utiliser qu'un seul enregistrement qui regroupe tout ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    type Identité=record
    matricule : Integer; 
    nom : String[25]; 
    annee : Integer; 
    mois : Integer; 
    jour : Integer; 
    End;
    Cette version est plus simple, mais elle n'inclut pas d'enregistrement de type Date. Ta version utilise un enregistrement de type Date mais à l'intérieur d'un enregistrement Identité, donc la visibilité de l'enregistrement Date est réduite (voire nulle...), et tu ne pourras pas utiliser de variables de type Date dans ton programme puisqu'il ne verra pas la déclaration.
    Si tu fais deux enregistrements séparés, tes deux type pourront être utilisés par le programme, et la programmation sera simplifié pour toi. (Imagine que la date corresponde à 2000 attributs au lieu de 3... tu devrais écrire 2000 lignes de code à chaque fois pour faire des affectations par exemple, alors qu'en utilisant des types Dates, ceci se ferrait en une ligne !)
    J'espère avoir été clair, c'est assez dur à expliquer ! Ce genre de nuances se comprend avec la pratique...

    a+
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    460
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 460
    Points : 112
    Points
    112
    Par défaut
    Ben en fait, si je l'ai fait ainsi, c'est parce que j'ai compris l'énoncée ainsi :

    Le type des enregistrements en question sera composé des champs suivants :
    - Un matricule
    - Un nom
    - Une date de naissance, enregistrement lui-même composé de 3 champs entiers (année, mois et jour).

    Sinon, merci car maintenant ça roule; encore une question (si je t'embête pas ...) :
    Comment faire si je désire après avoir fait tous les enregistrements pour affecter un certain matricule à un indice x (dans mon cas, mettre le matricule -1 à l'indice 0) ?

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    Saches que les deux solutions sont possibles pour le cas des enregistrements, mais je pense qu'il faut préférer utiliser la solution où les deux types ne sont pas imbriqués.
    Pour affecter une valeur à un attribut d'un élément x du tableau, il suffit de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    tab[x].matricule:=-1;
    a+
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  17. #17
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    460
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 460
    Points : 112
    Points
    112
    Par défaut
    Ah ben oui, c'est vraiment tout bête !... Je cherche souvent la complication là où il n'y en a pas ...

  18. #18
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    460
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 460
    Points : 112
    Points
    112
    Par défaut
    J'ai encore une question (rien à voir avec les tableaux);

    Comment fait-on (je veux dire y a-t-il une commande spéciale) pour afficher x fois le même caractère à la suite (pour tracer une ligne pour former un cadre) ?
    S'il n'y a pas de commande pour ça, je passerai par une boucle FOR.


    Merci

  19. #19
    Membre expert
    Avatar de Eric Sigoillot
    Inscrit en
    Mars 2002
    Messages
    1 212
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    Points : 3 369
    Points
    3 369
    Par défaut
    Boucle for...

    Ou bien il faut passer par des astuces généralement non portables, bien entendu.

    A+
    Règles du forum
    F.A.Q Pascal

    Pour me joindre (aucune question technique, merci)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    Oui, on peut passer par l'interruption 10h, sous fonction 0Ah ou 09h...
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

Discussions similaires

  1. trier un tableau et compter des elements du tableau
    Par remi51 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 17/06/2002, 16h51
  2. Réponses: 2
    Dernier message: 27/05/2002, 19h46
  3. verification de doublons dans un tableau
    Par bohemianvirtual dans le forum C
    Réponses: 11
    Dernier message: 25/05/2002, 12h21
  4. transmision de tableau en parametre
    Par Horus dans le forum C++Builder
    Réponses: 3
    Dernier message: 16/05/2002, 11h15
  5. Réponses: 4
    Dernier message: 13/05/2002, 16h43

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