Accueil
Rechercher:
sur developpez.com sur les forums
Forums | Tutoriels | F.A.Q's | Participez | Hébergement | Contacts
Accueil Conception Java DotNET Visual Basic  C  C++ Delphi MS-Office SQL & SGBD Oracle  4D  Business Intelligence
Club Emploi Blogs   TV   Dév. Web PHP XML Python Autres 2D-3D-Jeux Sécurité Windows Linux PC Mac
ACCUEIL ALGO COURS ALGO FORUM ALGO LIVRES ALGO SOURCES ALGO

Les tableaux

Date de publication : 16/03/2002 , Date de mise à jour : 27/01/2007

Par julp (Autres articles)
 

Les tableaux sont omniprésents en programmation de par leur praticité : une variable regroupant en son sein plusieurs éléments.

Cet article vous apprendra à déclarer un tableau et à l'utiliser qu'il soit simple (sur une dimension) ou non.


1. Notion de tableau
2. Parcours complet d'un tableau
2.1. Exemple 1
2.2. Exemple 2
3. Parcours partiel d'un tableau
3.1. Exemple
4. Parcours imbriqués
4.1. Exemple
5. Tableaux multidimensionnels
5.1. Tableaux à deux dimensions
5.2. Exemple : calcul de la somme
6. Recherche dichotomique


1. Notion de tableau

Les tableaux servent à désigner une suite finie d'éléments de même type au moyen d'une unique variable. Ces éléments peuvent être des entiers, des chaînes, ... Ils sont stockés dans les différentes cases du tableau, habituellement numérotées de 0 à n-1, n représentant la taille du tableau (le nombre de cases dans le tableau).

Le type d'un tableau précise l'intervalle de définition et le type (commun) des éléments.
tableau type_des_éléments[borne_inférieure .. borne_supérieure]
En général, nous choisirons toujours la valeur 0 pour la borne inférieure dans le but de faciliter la traduction de l'algorithme vers les autres langages (C, Java, ...). Par exemple, pour un tableau de 10 entiers, on pourra écrire :
t : tableau entier[0..9]
Un tel tableau peut par exemple contenir les éléments suivants :

Indices : 0 1 2 3 4 5 6 7 8 9
Valeurs : 45 54 1 -56 22 134 49 12 90 -27

Pour accéder à un élément du tableau, il suffit de préciser entre crochets l'indice de la case contenant cet élément. Par exemple, pour accéder au septième élément (49) du tableau d'entiers ci-dessus, on écrit : t[6]. L'instruction suivante affecte à la variable x la valeur du premier élément du tableau, c'est à dire 45 :
x <- t[0]
L'élément désigné du tableau peut être utilisé comme n'importe quelle variable :
t[6] <- 43
Cette instruction a modifié le tableau t :

Indices : 0 1 2 3 4 5 6 7 8 9
Valeurs : 45 54 1 -56 22 134 43 12 90 -27

2. Parcours complet d'un tableau

La plupart des algorithmes basés sur les tableaux utilisent des itérations permettant de faire un parcours complet ou partiel des différents éléments du tableau. De tels algorithmes établissent le résultat recherché par récurrence en fonction des éléments successivement rencontrés.

Les répétitions inconditionnelles sont le moyen le plus simple de parcourir complètement un tableau.


2.1. Exemple 1

Dans l'exemple suivant, la fonction affiche un à un tous les éléments d'un tableau de n éléments :
fonction écrireTableau(n : entier, tab : tableau entier[0..n-1])
    début
        pour i de 0 à n-1 faire // f1
            écrire(tab[i])      // f2
        fpour
    fin

Lexique :
    - i : entier, indice d'itération
    - n : entier, taille du tableau
    - tab : tableau entier[0..n-1]


Algorithme
    début
        n <- lire()             // 1
        Pour i de 0 à n-1 faire
            tab[i] <- lire()    // 2
        fpour
        écrireTableau(n, tab)   // 3
    fin

Lexique :
    - n : entier, taille du tableau
    - tab : tableau entier[0..n-1]
Schéma de l'évolution de l'état des variables instruction par instruction :

On suppose que le tableau saisi, de taille 3, contient : 7, 10 et 8.

Instructions Algorithme principal Fonction écrireTableau
    tab     tab
  n tab[0] tab[1] tab[2] n i tab[0] tab[1] tab[2]
1 3       /
2 (3 exécutions)   7 10 8 /
3         3   7 10 8
f1           0      
f2             écrire()    
f1           1      
f2               écrire()  
f1           2      
f2                 écrire()
f1           (fin)      

2.2. Exemple 2

La fonction suivante multiplie par 2 tous les éléments d'un tableau.
fonction doublerTableau(n : entier, t InOut : tableau entier[0..n-1])
    début
        Pour i de 0 à n-1 faire // 1
            t[i] <- t[i]*2      // 2
        fpour
    fin

Lexique :
    - n : entier, taille du tableau
    - t : tableau entier[0..n-1], tableau modifiable
Schéma de l'évolution de l'état des variables instruction par instruction :

On suppose que l'appel de fonction est doublerTableau(3, tab), où tab est un tableau de taille 3 qui contient : 7, 10 et 8.

Instructions Algorithme principal Fonction doublerTableau
    tab     t
  nb tab[0] tab[1] tab[2] n i t[0] t[1] t[2]
avant appel de la fonction 3 7 10 8 /
appel         3   Avec le mot clé InOut t[0] et tab[0] sont la même "variable" Avec le mot clé InOut t[1] et tab[1] sont la même "variable" Avec le mot clé InOut t[2] et tab[2] sont la même "variable"
1           0 /
2   14         /
1           1 /
2     20       /
1           2 /
2       16     /
1           (fin) /
retour à l'algorithme appelant             /

3. Parcours partiel d'un tableau

Certains algorithmes sur les tableaux se contentent de parcourir successivement les différents éléments du tableau jusqu'à rencontrer un élément satisfaisant une certaine condition. Un tel parcours partiel est le plus souvent basé sur une répétition conditionnelle.


3.1. Exemple

Algorithme
    début
        tab <- lire()
        i <- 0
        positif <- vrai
        tant que positif et i < n faire
            si tab[i] < 0
                alors positif <- faux
            fsi
            i <- i+1
        ftant
        si positif
            alors écrire("tableau d'entiers naturels")
            sinon écrire("tableau d'entiers relatifs")
        fsi
    fin

Lexique :
    - i : entier, indice d'itération
    - n : entier, taille du tableau
    - tab : tableau entier[0..n-1]
    - positif : booléen, vrai si aucun entier négatif n'a été détecté

4. Parcours imbriqués

Certains algorithmes sur les tableaux font appel à des boucles imbriquées : la boucle principale sert généralement à parcourir les cases une à une, tandis que le traitement de chaque case dépend du parcours simple d'une partie du tableau (par exemple toutes les cases restantes), ce qui correspond à la boucle interne.


4.1. Exemple

La fonction suivante calcule, pour chaque case d'un tableau, le nombre de cases suivantes qui contiennent un élément strictement supérieur. Les résultats sont placés dans un tableau.
fonction calculerNbSuccesseurSup(n : entier, t : tableau entier[0..n-1]):tableau entier[0..n-1]
    début
        Pour i de 0 à n-2 faire
            tres[i] <- 0
        fpour
        Pour i de 0 à n-2 faire
            Pour j de i+1 à n-1 faire
                si t[i] < tres[i]+1
                     alors tres[i] <- tres[i]+1
                fsi
            fpour
        fpour
        retourne tres
    fin

Lexique :
    - n : entier, taille du tableau
    - t : tableau entier[0..n-1]
    - tres : tableau entier[0..n-1], tableau résultat (case i contient le nombre de cases
             de t indice strictement supérieur à i qui contiennent un élément supérieur à t[i]
    - i : entier, indice d'itération de la boucle principale (parcours pour remplir tres)
    - j : entier, indice d'itération de la boucle interne (parcours des cases restantes de t)

5. Tableaux multidimensionnels

Les cases d'un tableau à une dimension sont indicées de manière consécutive (cases "alignées"). Il est possible de disposer ces cases selon des grilles (tableaux à deux dimensions), des cubes (tableaux à trois dimensions), ...

Les algorithmes les plus simples sur ces tableaux utilisent néanmoins en général des boucles imbriquées : chaque niveau de boucle correspond au parcours selon une dimension.

Le type d'un tableau précise l'intervalle de définition selon chaque dimension.
tableau type_des_éléments[borne_inf_dim1 .. borne_sup_dim1, borne_inf_dim2 .. borne_sup_dim2, ...]

5.1. Tableaux à deux dimensions

Ces tableaux sont faciles à se représenter comme une grille (ou matrice) ayant un certain nombre de lignes (première dimension) et un certain nombre de colonnes (seconde dimension).
tableau type_des_éléments[0..nb_lignes-1, 0..nb_colonnes-1]
Un tel tableau, avec 5 colonnes et 3 lignes, peut par exemple contenir les éléments suivants :

  0 1 2 3 4
0 45 54 1 -56 22
1 64 8 54 34 2
2 56 23 -47 0 12

Pour accéder à un élément du tableau, il suffit de préciser entre crochets l'indice de la case contenant cet élément, et ce pour chacune des dimensions. Par exemple, pour accéder à l'élément 23 du tableau d'entiers ci-dessus, on écrit : t[2,1]. L'instruction suivante affecte à la variable x la valeur du premier élément du tableau, c'est à dire 45.
x <- t[0,0]
L'élément désigné du tableau peut alors être utilisé comme n'importe quelle variable :
t[2,1] <- 43
Cette instruction a modifié le tableau :

  0 1 2 3 4
0 45 54 1 -56 22
1 64 8 54 34 2
2 56 43 -47 0 12

5.2. Exemple : calcul de la somme

fonction somme(li : entier, co : entier, t : tableau entier[0..li-1, 0..co-1]):entier
    début
        s <- 0
        Pour i de 0 à li-1 faire
            Pour j de 0 à co-1 faire
                s <- s + t[i,j]
            fpour
        fpour
        retourne s
    fin

Lexique :
    - li : entier, nombre de lignes du tableau
    - co : entier, nombre de colonnes du tableau
    - t : tableau entier[0..li-1, 0..co-1], tableau dont on cherche l'élément maximal
    - s : entier, somme des éléments déjà parcourus
    - i : entier, indice d'itération sur les lignes
    - j : entier, indice d'itération sur les colonnes

6. Recherche dichotomique

La fonction rechercheDicho recherche un élément dans un tableau trié et retourne l'indice d'une occurrence de cet élément (ou -1 en cas d'échec). Une telle recherche peut être réalisée de manière séquentielle ou dichotomique. Nous développons ici la version dichotomique qui est la plus efficace en temps d'exécution.

On compare l'élément cherché à celui qui se trouve au milieu du tableau. Si l'élément cherché est plus petit, on continue la recherche dans la première moitié du tableau sinon dans la seconde. On recommence ce processus sur la moitié. On s'arrête lorsqu'on a trouvé ou lorsque l'intervalle de recherche est nul.

Exemples :
Exemple de recherche dans le tableau d'entiers suivant défini sur l'intervalle [3..10] :

Indices : 3 4 5 6 7 8 9 10
Valeurs : 5 13 18 23 46 53 89 97

Recherche de 46 :

Etape 1 : comparaison de 46 avec t[6] (6=(10+3)÷2), t[6]<46 => recherche dans [7..10]
Etape 2 : comparaison de 46 avec t[8], t[8]>46 => recherche dans [7..7]
Etape 3 : comparaison de 46 avec t[7], t[7]=46 => élément cherché trouvé à l'indice 7

Recherche de 10 :

Etape 1 : comparaison de 10 avec t[6], t[6]>10 => recherche dans [3..5]
Etape 2 : comparaison de 10 avec t[4], t[4]>10 => recherche dans [3..3]
Etape 3 : comparaison de 10 avec t[3], t[3]<10 => recherche dans [4..3], Borne inférieure supérieure à la borne supérieure donc on met fin à l'algorithme et l'élément cherché n'a pas été trouvé !

Voyons l'implémentation de cette fonction :
fonction rechercheDicho(e : entier, n : entier, t : tableau entier[0..n-1]):entier
    début
        debut <- 0
        fin <- n-1
        trouve <- faux
        tant que debut <= fin et non trouve faire
            i <- (debut+fin)÷2
            si t[i] = e
                alors trouve <- vrai
                sinon si t[i] > e
                    alors fin <- i-1
                    sinon debut <- i+1
                fsi
            fsi
        ftant
        si trouve
            alors indice <- i
            sinon indice <- -1
        fsi
        retourne indice
    fin

Lexique :
    - e : entier, élément recherché
    - n : entier, taille du tableau
    - t : tableau entier[0..n-1], tableau trié par ordre croissant
    - debut : entier, début de la zone de recherche
    - fin : entier, fin de la zone de recherche
    - trouve : booléen, faux tant que l'élément cherché n'est pas trouvé
    - i : entier, indice de la case du milieu de la zone de recherche
    - indice : entier, indice de l'élément recherché ou -1 s'il n'est pas trouvé


Valid XHTML 1.1!Valid CSS!

Copyright © 2007 . Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts. Cette page est déposée à la SACD.

Responsable bénévole de la rubrique Algo : Alp Mestan - Contacter par EMail :
Vos questions techniques : forum d'entraide Algo - Publiez vos articles, tutoriels et cours
et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones
Nous contacter - Copyright © 2000-2008 www.developpez.com - Legal informations.