• Tableaux

    Les tableaux permettent de manipuler plusieurs informations de même type, de leur mettre un indice : la 1ére info, la 2éme info, . . ., la i éme info, . . .

    Ils sont stockés en mémoire centrale comme les autres variables, contrairement aux fichiers qui sont stockés sur le disque.

    Une propriété importante des tableaux est de permettre un accés direct aux données, grâce à l’indice.

    On appelle souvent vecteur un tableau en une dimension.

    1.type array

    Principe

    Syntaxe

    array [ I ] of T

    I étant un type intervalle, et T un type quelconque.

    Ce type définit un tableau comportant un certain nombre de cases de type T, chaque case est repérée par un indice de type I.

    Exemple

    TYPE vec_t = array [1..10] of integer;
    VAR v : vec_t;

    v est un tableau de 10 entiers, indicés de 1 à 10.

    Tableau

    •   À la déclaration, le contenu du tableau est indéterminé, comme toute variable.
    •   On accède à la case indice i par v[i] (et non v(i)).
    •  Pour mettre toutes les cases à 0 on fait
                      for i := 1 to 10 do
                           v[i] := 0;

    Remarque L’intervalle du array peut être de tout type intervalle, par exemple 1..10, ’a’..’z’, false..true, ou encore un intervalle d’énumérés Lundi..Vendredi.

    Contrôle des bornes

    Il est en général conseillé de repérer les bornes de l’intervalle avec des constantes nommées: si on décide de changer une borne, cela est fait à un seul endroit dans le programme.

    CONST vec_min = 1; vec_max = 10;
     TYPE vec_t = array [vec_min..vec_max] of integer;

    Règle 1

    Il est totalement interdit d’utiliser un indice en dehors de l’intervalle de déclaration, sinon on a une erreur à l’exécution.

    Il faut donc être très rigoureux dans le programme, et ne pas hésiter à tester si un indice i est correct avant de se servir de v[i].

    Exemple Programme demandant À rentrer une valeur dans le vecteur.

    CONST vec_min = 1; vec_max = 10;
    TYPE vec_t = array [vec_min..vec_max] of integer;
    VAR v : vect_t; i : integer;
    BEGIN
    write (’donner la valeur de i ’);
    readln(i);
      if (i >= vec_min) and (i <= vec_max) then
        begin
    write (’v[’, i, ’] ? ’);
    readln(v[i]);
        end {pas de point virgule avant else}
      else 
    writeln (’Erreur, i hors intervalle ’, vec_min, ’..’, vec_max);
    END.

    Règle 2 Le test d’un indice i et de la valeur en cet indice v[i] dans la même expression sont interdits.

    Exemple

    if (i >= vec_min) and (i <= vec_max) and (v[i] <> -1) then ... else ...;

    Une expression est toujours évaluée en intégralité; donc si (i <= vec_max), le test (v[i] <> -1) sera quand même effectué, alors même que l’on sort du vecteur !

    Solution : s éparer l’expression en 2.

    if (i >= vec_min) and (i <= vec_max) then
           if (v[i] <> -1) then ...
           else ...
    else ... { erreur hors bornes } ;
    
    

    Recopie

    En Pascal, la seule opération globale sur un tableau est: recopier le contenu d’un tableau v1 dans un tableau v2 en écrivant:

     v2 := v1;

    Ceci est équivalent (et plus efficace) que

    for i := vec_min to vec_max do 
    v2[i] := v1[i];

    Il y a une condition : les 2 tableaux doivent être exactement de mêmes types, issus de la même déclaration.

    TYPE
       vecA = array [1..10] of char;
       vecB = array [1..10] of char;
    VAR
        v1 : vecA; v2 : vecA; v3 : vecB;
    BEGIN
     v2 := v1; { legal car meme type vecA }
     v3 := v1; { illegal, objets de types <> vecA et vecB }
    {...}
    
    END.
    
    

    2.Super tableaux

    Quelques types un peu plus complexes à base de tableaux, et de combinaisons entre types.

    Tableaux à plusieurs dimensions

    Exemple :

    –> dimension 1 = vecteur;

    –> dimension 2 = feuille excel;

    –> dimension 3 = classeur excel [ faire petit schéma ].

    On peut créer des tableaux à plusieurs dimensions de plusieurs manières :

    Faire des schémas

    v1 : array [1..10] of array [1..20] of real
    → Tableau de 10 éléments, chaque élément étant un tableau de 20 réels. On accède à l’élément d’indice i dans 1..10 et j dans 1..20 par v1[i][j].

    v2 : array [1..10, 1..20] of real
    → Tableau de 10 × 20 réels.
    On accède à l’élément d’indice i dans 1..10 et j dans 1..20 par v2[i,j].

    Exemple Mise à 0 du tableau v2.

    VAR
    v2 : array [1..10, 1..20] of real;
    i, j : integer;
    BEGIN
    for i := 1 to 10 do
     for j := 1 to 20 do
     v2[i,j] := 0.0 ;
    END.
    
    
    

    3.Le type string

    On code une chaîne de caractère telle que ’Ahla’ dans un objet de type string.

    Principe

    Syntaxestring [m]
    m est une constante entière donnant le nombre maximum de caractères pouvant être mémorisés.

    Exemple :

    VAR s : string[80];
    BEGIN
    s := ’3aslema wmarhbe bikom ennes el kol fi Réussir mon bac’;
    writeln (s);
    END.

    Codage
    Ayant déclaré s : string[80], comment sont codés les caractères ?
    En interne, Pascal réserve un array [0..80] of char.
    Le premier caractère est s[1], le deuxième est s[2], etc.
    La longueur courante de la chaîne est codée dans la case 0 (→ ord(s[0])).

    Remarque
    – Affecter une chaîne plus longue que l’espace réservé à la déclaration est une erreur.
    – Comme la longueur courante est codée sur un char, elle est limitée à 255.

    Opérateurs sur les strings

    a := ’’         Chaîne vide (longueur 0).
    a := b          Recopie de b dans a.
    a := c + d      Concat ́enation en une seule chaîne. c et d de types string ou char;
                    le résultat est un string.
    length(a)       Longueur courante de a, résultat integer.
    
    CONST Slogan = ’la9raya bel kif moch bessif’;
    VAR   s1, s2 : string[100];
          i : integer;
    
    BEGIN 
         s1:= ’RMB ’;
         s2 := s1 + Slogan;
         writeln (’s2 = ’’’, s2, ’’’’);
         writeln (’Longueur courante de s2 : ’, length(s2) ); 
         write (’Indices des ’’l’’ dans s2 : ’);
         for i := 1 to length(s2) do
             if s2[i] = ’l’ then
            writeln(i, ’ ’);

    END.

    Comparaison entre 2 string : les opérateurs =, <>, <, >, <=, >=, sont utilisables, et le résultat est un boolean.

    La comparaison se fait selon l’ordre lexicographique du code ASCII.

    Exemple Soit b un booléen ; b est-il vrai ou faux ?

     

    b := ’A la vanille’ < ’Zut’; { vrai }
    b := ’bijou’ < ’bidon’;      { faux, car ’j’ > ’d’ } 
    b := ’Bonjour’ = ’bonjour’;  { faux, car ’B’ < ’b’ }
    b:=’zimboum’>’attends!’;     { faux, car ’’<’a’ }

     

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Facebook