Cours Algo Davide-2
Cours Algo Davide-2
Cours Algo Davide-2
: 10 11
Tablea ux a 1 dimensio n
T ableaux .-l tlcu"' d1111 rns 1011s
• l bl ca u x à d e ux d1mcn s1011:.
rv1v 111p11 l.it1o n -. 1 lcmr11t,1 ,re~ d e t ,1 bl P,1ux
c lc m c nt.:m cs; de t .1 1.Jl ca u >'
Ap p hc.i t1 o n ,1ll La n g,1gc C
Lf-. cli,1 111 c-. d,, c,1t,1c t c rcs
pphca tion au L.rng.Jgc- C
UFR SAT/UGB
david-cel estin .fa ye©ugb.edu .sn
17 février 2020
t6 t6
O av, d Cc lc s t 111 FAYE D a vid C e lestm FAYE
0 Un tableau est une collection ordonnée de variables (appelées La déclaration d'un tableau s'effectue en donnant :
composantes du tableau ) ayant toutes le mêmê type . On
o son nom {identificateur de la variable tableau)
accède à chacune de ces variables individuellement à l'aide
d'un indice. 0 le domaine de variation de l'indice délimité par une borne
inférieure correspondant à l'indice minimal et la borne
o indice=valeur ordinale, c 'est à dire ayant un domaine de
supérieure correspondant à l'indice maximal.
valeurs finies et ordonnées. L' indice doit être de type scalaire.
o le type de ses composantes
;:, Chaque composante du tableau est référencée au moyen d'un
indice qui indique la position relative de la composante dans la • Syntaxe de définition :
suite et qui permet donc d'accéder à la composante.
Var <Nom_tab> Tableau[<indmin> . . <indmax >] de
o Un tableau T est donc défini par le type des indices et par le <type des composants>;
type des composantes.
o Les tableaux à une dimension, c'est-à-dire à un type d'indices, Exemple
appelés encore e n termes mathématiques vecteurs, sont
composés d'un ensembl e homogèn e d'éléments de même var tab_entier Tableau[l . . 10] de entier ;
type.
6 \\\
1 râti a''un tabléau. ..,..
u 1) :1ti !, c<·l ux<:rnpli :, le: t : 11,l r: :iu lluo l 1i l':!> l 11n v<:< tr·11r de tOO
.J 1 ., , t,ul 1,111· TAl\1.1•: A\I ,1 '1'!, I p.,~ 11
111w i,1111111111• dyn :i1 11 iq11 u 11 C<J tllp u: ,:i nl<::, qt1 i 111 : p1•1tvc nl pr<:ndr t: ciur• lw, v;il n11r~ Vr ,u. ~ e t
m., i:- 11 , 1,11iq 11 1· 11 , 1 '1••,t ,\ dit <' 11111' t,1111< 11111• (111i 111' drn 11 p.c· p :if> 1: tti rx . l.<1 1,;i l,l i::i 11 1: r n q11M1 <: y rcprl:r:cntr: 11n vr:<..t1;11r cl c ?.(1
de t.11lk .111 1,,111 , d1' l'<',t'<11t k1 11 d11 p1 op.1,111111w . l':i , co mpc>f::tntcr,, ch.,<11 nl' (:t ,int de typ <: r: ntiN f'l indid:c par une
11•n:-1'q11 l'nt, k 1H,n il111· d ' 0l0nw11t :, d'1111 t.1hl1•;111 doit !lt r0 li xl• ;\ lc·t t re m:ij11c:c11l r .
p1i1' 11 ch- m.ini1' 1<' d0ti11 itiw 11,,, d (' ~., d<- liniti on. c.1 So 11 vnnt, on rn p rfr,<: 111.<: l:1 :,t n1 r. t 11 rr: d ' 11 n t :il>l n;:i u m oyenn ant la
v Sv1t p.11 r ,emplt- I' (•, t, .,it dr p, ,,1-?,1,11nmr f,11 iv. 1111 d di 11it ion d ',m typ e <!Il (:cr iva nt :
lllO: ï'YPI·: < l<1 0 11t. lrl c n t. 0 11 r cl o t.y p o > TAllU;; ,\U 1<t. ypo 1nd ox > I Dt·:
T Ytl>: D11n < typ o c omp ooan t> ;
Alpht:1bot.
1) r t c ns11it c e n déd :'l rcr:1 les vc1 ri a bl cs d e cc typ e ta b lea u e n
(:c ri va 11 t :
\!AR !{0 v l ù : TA~LEA ll l Di 111 l ll O 1100 l 00 11 :
F.t' Qqu~, n c y : TA l\l.1': All I AJplmbot. J d11 l 1 llt. ill l'
VAR < l i~ t o va rL a bl o >: < l donttf i ca t our d e type>
So it po ur l'exe mpl e c i-d essou s :
dJun.·tableau · 7 IV
0 Dans la mé moire ce ntra le, les é lé m e nts d'un tabl ea u sont
CONST Ma.xElement s = 100 ; stockés de faço n lin éaire , dans des zones contiguës .
TYPE Dim = 1 .. MaxElements; v Un e variable T de type tableau à une dimension peut ê tre
Alphabet = ' A' . . ' Z'; représenté comme suit ·
TBoo le = TABLEAU [ Dirn DE Booleen;
TFre quency = TABLEAU [Alphabet] DE entier;
10 0 1 1 4 6 25
VAR Bool e : TBo ole ;
Frequenc y: TFrequency;
Remarques
J S, les variables I et J prenn e nt respectivement leurs valeurs 0
Quand on ne connaît pas à l'avance le nombre d 'élem en ts
dan s les intervalles Dim et Alphabet , alors Boole [ I ] et exactement , il faut majorer ce nombre, quitte à n' utiliser
Fre que n cy [ J ] d ésigne nt res pectivement les composantes qu'une partie du tableau .
situ ees a la 1-iem e place dans le tableau Boole et à la J- ième 0 Il est préférable de définir un TYPE t abl eau réutilisable, plutôt
place dans le tabl eau Frequ ency . Donc , pour accéder à une que de déclarer à chaque fois, en VAR , le tableau en entier.
composante d ' un vecte ur, il suffit de préci ser son indice . u De même , l' utilisa tion judicieuse des constan tes permet de
modifier aisément le programme et limite les sources d'erreurs.
0 Il est interdit de mettre une vari able dans l'i ntervalle de
défi nition du ta blea u.
Tc1bka11x .i 1 dirnc11~io11
Tableaux à deu x dim ensions
t·J\anipul<1tions clcmcntt1ire~ <k t;1bkt111x
AnplicJtion ,111 Lrn;::_,1gc C
Les ch<1i11•:~ de c.~1,1ctur.~
. -~ ,.·.._· 12 111
CO NST MaxLine = 10; {nombre maximal de lignes} o Un tel tableau sera représenté sous la forme indiquée par la
TYPE
MaxColumn = 20; {nombre maximal de colonnes}
~, ---- - -
MaxColumn
o Si les variables L et C prennent respectivement leurs valeurs 0 Donc, pour accéder à une composante d ' une matrice , il est
nécessaire de préciser deux indices, à savoir d 'abord l'indice de
dans les intervalles TLine et TColumn, alors Mat [L, C] ou bien
Mat [L] [C] désigne la composa nte de la matrice située à ligne , puis l' indice de colonne .
Remarques:
la L-i ème place dans la C-ième colonne, respectivement à la
v Dimension du tableau ci-dessus : 2 (matrice)
C-ième place dans la L- ieme ligne (voir figure).
v Nombre de cases disponibles : Ma.."'<Li ne x Ma.."'<:Column
0 Par convention , no us allons ind iqu er souvent par L l' indice de -> le tableau Mat es t bidime nsionnel ==:- tous les Mat ,; sont des
parcours des lign es et par C l' ind ice de parcours des colonnes variables (i = 1 ... M, j = 1 ... N) de mème type
-i Accès au contenu d ' un e case : Mat ,;
d ' une matrice .
Définition - .
~,
T.Jbka u :-: .i 1 dillll'rl~Îün
- - . : .. ~c--""'"=-== ===~~!!!t!!! 13 1V T,1bk,1t1 :-: d deux di111cn~io11.;
Manipulations élémentaires de tableaux
Application au L111 ~;.1g0 C
Les chaines de G.ir.:ictc:•rcs
Déclarations de tableaux :
0 Cas le plus classique
type LISTE= tableau [1 .. 100] de reel ·
TABLEAU= tableau [1 .. 10,1 .. 20] de entie;
CHAINE= tableau [1 .. 80] de caractere ;
si (i>n) alors
fin
1 ecrire(a , 11 n"appartient pas à T 11 )
fin
sinon
Ecrireln('Le minimum de T :', min); 1 ecrire(a, 11 appartient à T 11 ) ;
fin
On peut aussi utiliser une variable booléenne trouve qui va contenir
le résultat de la recherche :
Recherdfe séquentielle d'un élément dans un tableau 21 Il L a.~unfftJ.i,btœii·m•;J.;,;a;;;:;.,•.,.i,jrlJ~
,;; Soit un tableau au départ contenant les éléments
(x1 , x2 , . . . , Xn)
i +- l ;
trouve +- faux
tant que (i <= n) et (trouv e= false) faire
\xi \xz \ N
1 2
trouve+- (t[i] = a);
\ i+-i+l ;
fin o On recherche la présence de l'élément x dans ce t ableau . On
si trouve alors divise le tableau en 2 parties égales :
1 ecrire(a , 11 n"appartient pas à T 11 )
sinon
1 ecrire(a, 11 appartient à T 11 ) ;
\xi \xz \
2 N
cr:M.f414@rf$@i-lu•t••'''·"·;◄.1,11fo@\i•·l••t•i,;,;,-
o si l'élément recherché est plus petit et s'il est présent il ne
·- ~ ~--iU·•·R,N1i,iiifiMjii•1i•t•i,;,;,_
Dans ce qui suit gauche, droite : délimitent la zone du tableau à
peut être que dans la partie gauche. Dans ce cas, on continue l'intérieur de laquelle on veut rechercher x
la recherche dans la première moitié du tableau; VARIABLES gauche,droite,milieu : entier·
début '
partie gauche partie .lrolU .. .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. ..
' {
gauche+- l ; draite +- n; trauve +- fau x
Xn
tant q_u e (gauche <= draite) ET non TrO'tlve faire
, 2 N r,:ilieu +-(gauche+ draite ) DIV 2;
si (x = t[milieu]) alors
0 On recherche la présence de l'élément x dans ce tableau. On 1 trO'tlve +- vra-i
divise le tableau en 2 parties On divise à nouveau la partie sinon
gauche en deux parties égales avec un nouveau milieu si (x < t[milieu]) alors
x < milieu \ x > milieu
1 draite +- milieu - l ·
-j♦
sinon '
\ x1 \ x2 \• • • • • ·\ l 1
fin
gauche +- milieu + l ·
'
1 2 milieu.
fin
o s'il est plus grand, on continue dans la seconde moitié du fin
tableau; si trouve alors
j
1 ecrire(x,' appartient à T')
<l On s'arrête si l'élément recherché a été trouvé ou si on ne peut
sinon
plus diviser le tableau . 1 ecrire(x, ' n"appartient à T');
fin
--
SU Rf~ression d'un élément 26 /
Nous nous proposons d'écrire un programme qui détermine si l'un
au moins des éléments de la matrice Mat d'ordre N x M est égal à
a (élément recherché) . Voici un extrait de ce programme (la Insertion d'un élément x à une place donnée k
matrice Mat a été définie avant) :
n f- n + 1 i f- n ;
trouve f-- fau1:: tant que i>=k faire
l +-- 1:
tant que (/ <= 11 ) et non trouve faire / :r~+i 1~; t[iJ;
C ~ 1: fin
tant que (c <= m) et non trouve faire t[k] x; f-
trO'ln:e +-- (.M at[l , e] = a) ; Suppression de l'élément situé à la place donnée k
1 e+--c+ l:
fin i +- k;
l +- l + 1; tant que i<n faire
fin t[i] f- t[i + lj;
si trouve alors 1 i f- i + l;
1 ecrire(a,' appartient à Mat') fin
smon nf-n-1
1 ecrire(a, ' n"appartient à Mat');
fin
-
ecteur: . - ·_ 27 1
Variable
c Soit un vecteur d'entiers, dont les éléments sont ordonnés. Son VAR n, i, lmax, m, le : entier;
mode est la valeur de l'élément qui y figure le plus grand v : TABLEAU [l .. nmax) DE entier;
nombre de fois . Exemple début
(1 3 3 6 7 7 7 11 13 13) i f- 1 ; l max f- 1 ; m f- 1; le+-- l ;
o Le mode de ce vecteur est la valeur 7, qui figure trois fois. tant que i<n faire
Nous allons écrire un progmmme qui prend en entrée un i+-'i+l
vecteur ordonné et qui livre le mode du vecteur en sortie. si V[i] = V[i - lj alors
le f- le+ 1
o il faut disposer des valeurs suivantes : si le > max alors
._, n est le nombre d 'éléments dans le vecteur v, lmax _+- le;
v i est le nombre d' élements qui ont déjà été considérés, 1 Tn f- Z
,., lmaj, est la longueur de la plus longue chaîne en v [l .. i], fin
,., m est l 'index en v d'un élém ent dans la chaîne de longueur sinon
lmax : 1 le +- l
v[rn] = mode(v [l ..i]), fin
u l e est la longu eur de la chaîne courante fin
Variables 1,J,k ent1Pr , Tl , r 2. f3 f AB ,
dé but
1 ' 1. / ~ J' k ,._ 0:
.> So,~nt d~1\- hblf 3H~ t11r-, pi'r ord ri- no,s.s.ant Tl "'\ T? tant que ( /, , tn,1/r 1J E n1 ,., , trJ.,Utè2)) fai re
P0>~.1nt rr1tpt'("-t1v('tm,.n\ ,:>l 111 n1 rlrmeont!io <>\ ta11le2 si ( 11 , /'2 f J;) alors
t lrmt>-rtt , 1 k • k • 1. r1rk; L TI r,
sinon
"' on Vf"lH foM<')nJ'\(:t, Ir· 1 ;,hl, ~IJ>' 11 , t T'.) "'" un tro1s.1i:.mo tabl<>a u k, k , 1. JL- , .... 1
Î ·• d t \ ,,1 i 11 ' ( \..~ 111 < 1 ◄ t :n l l , ? ) <lt>m"nt s. tni.3 pa r fin
r>fd P oo,· · :\ttl fin
r>(ll' <-" 1t:t \:::t nc•11 · atlon · ch~1 · 1t \tCJl'ttO mpt r ur~ J , , I',
si , t,11/11 1) alors
ta nt que IJ l1iillr'2J fdire
Pf)m <1t•, vc m ,•nt 11 1 ) , t 1 ~1 011 T3 r :.l Ir I cthl, ,tu
11 •r 1 ~ - f'N t
A• A , 1, n fl,·1. r21 I ,. J ... l
Ot • , ~" • . u L1l\l r .,11 t rtr ti'>• oh:,nt d, la fu-,1 o n lJn , i<tr J1 t d • f1r1
., ; <~.-.thm, · ~, ., 1, ·,mv.u1t 'lft'10f1
t , 111 ( QIW 1 twllf' 1 ) (dire
J , A , 1, / 1 Al /'J 1
rm
fm
fm
, __ .
~~l~au _ __ __ 3.?
.......................
~...-~---.~. 4--·-·<
, . . . . . . . . . . ~ ....... u •
,- - ~ 4 · ---·"'·
t •?> .. t
Q !.C r. r. Ll } • .
•
• t t
t
C
t 1:b. , ,u
1... h:
!
(. :lie~. h1
int t [n] ;
où n serait variable
tableau à la déclaration 39
G> tableau
~
de caractères
_ , initialisé par une liste de car ., 0 u par une
o t yp e nomtableau[N] {const1,const2, ... ,constN}; chaine de car. litterale. '\0 'ajouté à la fin de /a chaine.
Exemple
Exemple
#def i ne N 8
# à(: : :ne N 4 char tab [N] " exemple";
1.nt tab [ N) {1, 2, 3, 4} ;
main() {
ma i n () { int i ;
f or ( i = 0; i < N; i ++)
f 0r ( i = 0 ; i < N ; i++) printf("tab[Xd) = Xc\n",i , tab[i] );
p rintf ( " tab [ %d) = %d \ n " ,i , tab[i]) ; }
}
0 on peut ne pas indiquer la taille du tableau
nbre constantes < N =;, seuls les premiers éléments initialisés.
Les autres éléments mis à zéro si le tabl eau est une variable int t[] = {1, 2, 3, 4, 5}
globale ou une locale de cl asse s tat ic . char tab [] = "exemple" ;
• nbre constantes > N =} un e erreur est signalée alloue un tableau avec 5 comp osa ntes in it ia lisé avec les valeurs
indiquées
Q> tableau à deux dimensions :
type nomdutableau[nombrelignes] [nombrecolonnes]
Exemple
0 On accède à un élément : tableau [i] [j J .
Ainsi le programme suivant imprime le nombre de caractères du
tableau tab, ici 8 . G initialiser un tableau à plusieurs dimensions à la compilation :
Exemple
char tab [] = "ex emple";
main() { #define M 2
int i; #define N 3
printf("Nombre de caracteres du tableau int tab [M] [N] {{l, 2, 3} , {4, 5, 6}} ;
Ï,d\n",
sizeof (tab)/ sizeo f ( c h a r )); main() {
} int i, j;
for ( i = 0 ; i < M; i + +) {
Regles pour les initialisations de tableaux : for _(j = O; j < N; j++)
pr in t f ( "t ab [Ï. d] [Ï. d] =Ï,d \ n" , i , j , t ab [ i] [ j] ) ;
0 avec [], la taille est calculée automatiquement, }
Tablea ux â 1 d imension
argument,"' . 43 Tableau x à deu x dim ensions
Manipulations élé me nta ires de tabl ea ux
Application au Langage C
Les chaines de caractères
Exemple
void initialisation( d o ubl e t[], int n){
:l. L ti ;
f 0r (i = 0; i < n; i++)
t(i] = 1;
}
Q
l~l~\;\~\~\~\~ 1\ \a\gl
Comme un tableau ordinaire
1
o init ialisatio n pa r consta nte
o lect ure pa r s c anf
0 fonct ions standa rds
char car, chaine[l00];
char salut[l0] = {'b' , 'o', 'n' , 'j', 'o', 'u', 'r'} '21 Lors de l'in it ial isation avec [], l' ord inateur réserve
automat iquement le nombre d 'octects nécessa ire , i.e le nombre
car = salut [3] de caractères +1 .
Ql Le nom d ' une chaîne est le représentant de l'adresse du
Q Initialisation simplifiée premier caractère de la chaîne
char salut [10] ="bonjour" ; 0 La bibliothèque <string. h> contient des fonctions de
manipulation de chaînes de caractères.
car = salut [3] ;
Q Le caractère NUL est automatiquement mis en fin de chaîne
dans les cas suivants :
:, initialisation par constante
0 lecture par scanf
J fonctions standards
Fonction gets
o gets est idéal pour lire une ou plusieurs lignes de texte (p .ex.
des phrases) terminées par un retour à la ligne. 0 <n> représente un nombre du type int. Les symboles <s> et
0 Syntaxe : gets ( <Chaîne> ) <t> peuvent être remplacés par :
Q gets lit une ligne de caractères de stdin et la copie à G une chaîne de caractères constante
l'adresse indiquée par <Chaîne>. Le retour à la ligne finale est 0 le nom d'une variable déclarée comme tableau de char
remplacé par le symbole de fin de chaîne '\0' . o un pointeur sur char (voir chapitre sur les pointeurs)
a Contrairement à scanf O, elle permet l'entrée de chaînes strlen( <s>) fournit la longueur de la chaîne <s> sans
contenant des espaces et des tabulations. compter le '\0' final
Exemple strcpy(<s>, <t>)
copie <t> vers <s> .
int MAX_LINE = 1000;
c~ a r LIGNE[MAX_LINE];
gets (LIGNE);
~ sfr:ing.h> 55
K str:ing~h> 60
chaine a b \ r \ a c a r \ a \b \r a \ \0 o atoi(<s>)
p~ retourne la valeur numérique représentée par <s> comme int
Tableaux a 1 dimension
Tableaux a 1 d11nens1on
Tableaux a de ux dimensions
Tabl eaux à deux dimension s
Manipulations élémentaires de tableaux
Manipulations elementaires de tableau x Application au Langage C
Application au Langage C Les chaines de caractères
Les chaines de caractères