Vous êtes sur la page 1sur 26

Un programme sans boucle ne vaut pas la peine dtre crit.

- A. Perlis

ITI 1520 Section 6: Tableaux et boucles


Objectifs: Instructions de boucles Tableaux de variables Traduction vers Java Traage de tableaux et de boucles Chane de type String en Java Plusieurs exemples!
165

Note historique
Donald Knuth, informaticien amricain, est lun des pionniers du domaine de lanalyse dalgorithmes. Il est lauteur de lun des livres les plus respects en informatique (The Art of Computer Programming) et du systme de composition pour textes (scientifiques) TeX. Edsger Dijkstra, informaticien hollandais, a dvelopp lalgorithme du chemin le plus court (qui porte son nom) et du concept de smaphore pour les programmes et processeurs parallles. Son article de 1968, "Go To Statement Considered Harmful" a rvolutionn lutilisation de linstruction GOTO au profit des structures de 166 contrle telles que la boucle while.

Instruction de boucle
Nous avons parfois besoin de rpter un bloc dinstruction. Dans un modle logiciel, nous utilisons une instruction de boucle:

Test? faux vrai Bloc dinstructions

Le bloc dinstruction dans la boucle est rpt jusqu ce que le test devienne faux.
167

Conception dune instruction de boucle


1. Initialisation Y a-t-il des variables initialiser? Ces variables seront mises jour dans la boucle. 2. Condition tester Une condition pour dterminer sil faut rpter le bloc dinstruction de la boucle ou non 3. Bloc dinstruction de la boucle Quelles sont les tapes rpter? Boucle dtermin le nombre de fois que la boucle est rpte est connu utilise normalement une variable compteur Boucle indtermin le nombre de fois que la boucle est rpte nest pas connu utilise normalement une variable drapeau
168

Exercice 6-1: Somme de 1 n


DONNE: INTERMDIAIRE: RSULTAT: EN-TTE: MODULE:

169

Exercice 6-1: Trace de Somme1N(3)


Instructions N Compteur Somme

170

Exercice 6-2: Boucle dtermine


Dveloppez un algorithme pour trouver le factoriel dun entier n, reprsent par n! Dfinition du factoriel (produit de 1, 2, 3 jusqu n): n! = 1 2 n

171

Exercice 6-2: Boucle dtermine


DONNE: RSULTAT: INTERMDIARE: HYPOTHSE: EN-TTE: MODULE:

172

Exercice 6-3: Boucle indtermine


Dveloppez un algorithme pour dterminer le nombre de fois quun entier rnNombre peut tre divis par un autre entier diviseur, jusqu ce que le rsultat est plus petit que diviseur Ceci donne la partie entire de la fonction logarithmique.

173

Exercice 6-3: Boucle indtermine


DONNES: RSULTATS: INTERMDIARES: HYPOTHSES: EN-TTE: MODULE:

174

Traduction de boucles au Java

Test?
faux

vrai Bloc dinstructions

Bloc dinstructions

Java while (Test) { // Instructions }

175

Algorithme: Somme de 1 n
DONNE: INTERMDIAIRE: RSULTAT: EN-TTE: MODULE: n (un entier positif) compteur (index allant de 1 n) somme (somme des entiers de 1 n) somme somme1N(n)

somme 0

compteur 1

compteur n ? faux

vrai

compteur compteur + 1

somme somme + compteur

176

Exercice 6-4: Traduire la boucle au Java


import java.io.* ; class Somme1N { public static void main (String args[ ]) { int n; // DONNE: entier positif int compteur; // INTERMDIAIRE: compteur pour boucle int somme; // RSULTAT: somme de 1 n

// LECTURE DES VALEURS DONNES


System.out.println("Entrez un entier positif N."); n = ITI1520.readInt( );

// MODULE DE LALGORITHME
compteur = 1; // Initialisation du compteur somme = 0; // Initialisation de la somme // Boucle while (compteur <= n) { somme = somme + compteur ; compteur = compteur + 1 ; }

// AFFICHAGE DES RSULTATS ET MODIFIES L'CRAN


System.out.println(" La somme des nombres de 1 N est " + somme ); } }

177

Instruction de boucle post-test


Dans linstruction de boucle post-test, le test se fait aprs lexcution du bloc dinstructions.

Bloc dinstructions

Test? vrai faux

Le bloc dinstruction de la boucle est excute au moins une fois et rpt jusqu ce que le test devienne faux. 178

Linstruction de boucle post-test Traduction au Java

Bloc dinstructions

Test? true false Java: do { // Instructions } while(test);


179

Block dinstructions

Exercice 6-5: Exemple de boucle post-test


Utilisez une boucle post-test pour dvelopper un algorithme principal pour calculer le factoriel et traduire en Java
DONNES: RSULTATS: INTERMDIAIRES: CONSTRAINTES: EN-TTE: MODULE:

180

Exercice 6-5: Traduire au Java


public static void main(String args) { // Variables

// Module

}
181

Boucle FOR
Java offre une autre forme de boucle, qui peut remplacer une boucle WHILE lorsque nous savons lavance combien de fois une boucle sera excute (boucle dtermine). La boucle FOR a comme format: for (<initialisation>; <condition-test>; <incrment>) { // instructions } Dans la plupart des cas: Initialisation initialise un compteur condition-test teste si un compteur a atteint une certaine limite Incrment incrmente le compteur (+ 1, - 1, + 5, + Var, ) Toute boucle FOR peut tre reformule en boucle WHILE.
182

Diagramme de la boucle FOR

Initialisation

Condition-test? vrai faux Block dinstructions Incrment

183

Exercice 6-6: somme1N avec boucle FOR


somme 0 compteur 1
compteur n ?

vrai

somme somme + compteur faux compteur compteur + 1

Traduction Java:

184

10

Problme avec variables simples


Supposons le module dun algorithme lisant 5 entiers et qui les affiche dans lordre inverse: Module: i1 lireEntier() i2 lireEntier() i3 lireEntier() i4 lireEntier() i5 lireEntier() afficheLigne(i5) afficheLigne(i4) afficheLigne(i3) afficheLigne(i2) afficheLigne(i1) Quarrive-t-il lorsquon a 1000 entiers? x entiers?
185

Tableaux informatiques
Simples variables ne contiennent quune valeur. Un tableau informatique (computer array en anglais) est compos de plusieurs positions, chacune capable de contenir une valeur. Le tableau est essentiellement une collection de variables du mme type.
Variables simples i1 i2 Nom de tableau nom de variable
186

Un tableau tbl

i3
i4 i5

11

Tableaux informatiques (suite)


Si un tableau tbl a 5 positions, nous pouvons les accder en utilisant les entiers 0-5 comme indices (ou index). Ex: tbl[2] est la troisime position avec index 2. Notez que tbl[2] est quivalent un nom de variable est peut tre utilis tout endroit o un nom de variable est utilis, ex: dans des expressions.
Un Tableau tbl tbl[0] tbl[1] tbl[2] tbl[3] tbl[4]
187

Tableaux informatiques (suite)


Deux informations peuvent tre ncessaires pour composer avec les tableaux: La premire information est la longueur du tableau, i.e. le nombre de positions disponibles. La deuxime information est le nombre de positions qui contiennent des valeurs , i.e. le positions qui ont t initialises. Quand nous passons des tableaux des algorithmes, on peut y passer une ou les deux valeurs Ex: si les valeurs sont dans les 3 premires positions, nous pourrions passer 3 la DONNE longueurT Ex: si lalgorithme a besoin de voir toutes les 5 positions, alors la DONNE longueurT recevra la valeur 5. Quels seraient les indices valides?
188

12

Le nom du tableau
Que reprsente le nom dun tableau? Il peut reprsenter ladresse en mmoire o se trouve le tableaux. Ceci est semblable un nom de variable, mais se fait trait diffremment dun nom de variable Cette approche est utilise dans des langages tel que le C Limage dans les actates prcdentes reflte cette reprsentation. Le nom de tableau peux aussi tre le nom dune variable de rfrence et donc notre image devient:
Un tableau tbl adresse tbl[0] tbl[1] tbl[2] tbl[3] tbl[4]

Ceci sera le modle de nos tableaux.

189

La cration de tableaux
Lalgorithme standard suivant sera utilis pour crer des tableaux uneVarRefTbl crerTableau( L ) Cre un tableau ayant L positions ayant des valeurs inconnues. uneVarRefTbl est une variable de rfrence laquelle est affecte ladresse du tableau. E.g. tbl crerTableau( 5 )
Mmoire de travail Un tableau uneVarRefTbl adresse tbl[0] tbl[1] tbl[2] tbl[3] tbl[4]
190

Mmoire Globale

13

Exercice 6-7: Utilisation des indices


Lindice dun tableau t de taille lng peut tre nimporte quelle expression mathmatique retournant un entier entre 0 et lng-1.
Lindice dun tableau devrait-il commencer 0 ou 1? Mon compromis De 0,5 a t rejet, mon avis, sans considration suffisante. -- Stan Kelly-Bootle

Soit k =2, et t rfre


2 -1 5 7

(de longueur 4)

t[2] = t[k] = t[2*k-1] = t[ t[0]+1 ] = t[expression] peut tre utilis comme toute autre variable dans des expressions plus complexes. 191 Rappelez-vous t est une variable de rfrence

Exercice 6-8: Valeur au milieu dun tableau


crivez un algorithme qui retourne la valeur au milieu dun tableau t contenant n nombres (avec n impair). Notez que la DONNE t reoit la rfrence (adresse) au tableau.
DONNES: RSULTAT: INTERMDIAIRES: EN-TTE: MODULE:
192

14

Exercice 6-9: changer les valeurs dun tableau


crivez un algorithme qui change les valeurs aux positions i et j dun tableau t. Ceci est possible car ladresse du tableau est passe lalgorithme (sous-programme).
DONNES: MODIFIES: INTERMDIAIRES: RSULTAT: EN-TTE: MODULE:

193

Exercice 6-10: Cration dun nouveau tableau


Crez un tableau contenant les entiers de 1 n en ordre inverse. Rappelez-vous de lalgorithme standard uneVarRefTbl crerTableau( lng ) qui cre un tableau rfr par uneVarRefTbl; le tableau a lng positions (sans valeurs).

194

15

Exercice 6-10: Trace pour N=3


instructions valeurs initiales n index t

195

Exercices de boucles (I)


6-1 Trouvez la somme des nombres de 1 n (1+2++n).
6-11 Trouvez la somme des valeurs dun tableau de n valeurs. 6-12 Soit une valeur v et un tableau x de n valeurs, vrifiez si la somme des valeurs de x excde v. a) Utilisez lalgorithme de lexercice 6-11. b) Faites une version efficace qui sort de la boucle aussitt que la somme excde v. 6-13 Comptez combien de fois k apparat dans un tableau de taille n. 6-14 Soit un tableau t de n valeurs et un nombre k, vrifiez si k apparat dans t ou non. a) Utilisez lalgorithme de lexemple 4. b) Faites une version efficace qui sort de la boucle aussitt que k est trouv.
196

16

Exercices de boucles (II)


6-15 Soit un tableau x de n valeurs et un nombre k, trouvez la position de la premire occurrence de k. (Si k nest pas dans x, retournez 1 comme position.) 6-16 Trouvez la valeur maximale dans un tableau de taille n.

6-17 Trouvez la position de la premire occurrence de la valeur maximale dun tableau de taille n. a) Utilisez lalgorithme de lexemple 7. b) Utilisez des algorithmes de nimporte quels exemples. c) Version avec une boucle sans autres algorithmes.
6-18 Vrifiez si un tableau de n valeurs contient ou non des valeurs dupliques. Stratgies?
197

Tableaux Java
Une variable tableau est dclare avec le type de ses lments (membres) Par exemple, voici une dclaration dune variable tableau dont les lments sont des nombres rels: double [] unTableau; // forme prfre ou encore: double unTableau[]; Lorsquune variable tableau est dclare, le tableau lui-mme nest PAS cr. Nous avons une variable de rfrence qui peut pointer au tableau. unTableau contient la valeur spciale null jusqu ce quune rfrence valide y est affecte.
198

17

Cration dun tableau


Comment traduire lalgorithme CrerTableau? Pour crer un tableau en Java, loprateur new est utilis. Nous devons fournir le nombre dlments du tableau, de mme que leur type (qui est le mme pour tous les lments): e.g. new double[5] Le nombre et le type ne peuvent plus tre changs par la suite. Loprateur new retourne un rfrence (adresse) qui peut tre affect une variable de rfrence, par exemple: Notez bien: La cration dun tableau initialise tous les lments avec des zros (ce qui se traduit 0, null , ou '\0' dpendant du type utilis). La taille dun tableau peut tre obtenue laide de lattribut .length: unTableau.length Les tableaux sont crs en mmoire globale. Les variables de rfrences sont cres dans la mmoire de 199 travail.
double[] unTableau; unTableau = new double[5];

Mmoire pour tableaux


double[] unTableau ; unTableau:
null
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end. H. Spencer

unTableau = new double[3] unTableau:


adresse

0 ?

1 ?

2 ? 3
200

length

18

Accs aux lments dun tableau


Les lments dun tableau sont accds laide dindices en utilisant loprateur []. Les indices sont des entiers dbutant 0. Par exemple, si unTableau est un tableau de trois entiers, alors : Le premier lment est unTableau[0], Le deuxime lment est unTableau[1], Le troisime lment est unTableau[2]. Un index peut tre reprsent par nimporte quelle expression qui retourne un entier. Si un index est trop petit (< 0) ou trop grand (> length-1) alors une erreur dexcution surviendra.

201

Initialisation de tableaux
Les lments dun tableau peuvent tre initialiss individuellement: int [] intTableau = new int[3]; intTableau[0] = 3; intTableau[1] = 5; intTableau[2] = 4; ou lors de la cration du tableau: int [] intTableau; intTableau = new int [] { 3, 5, 4 };

aussi possible, mais dconseill (new implicite): int [] intTableau = { 3, 5, 4 };


202

19

Initialisation partielle dun tableau


Un tableau peut tre initialis partiellement. int [] intTableau = new int [5]; intTableau[0] = 3; intTableau[1] = 5; intTableau[2] = 4;
Dans ce cas, intTableau[3] et intTableau[4] valent 0. Dans des langages autres que Java, ces valeurs peuvent tre indfinies et ainsi causer des problmes lorsquelles sont utilises en lecture.

Quand un tableau est utilis, il est parfois utile davoir une autre variable (ou plusieurs) qui permettra de savoir quelles sont les indices pour lesquelles une valeur a t affecte. 203

Types de rfrence
Un type tableau est un type de rfrence, cause du pointeur vers le tableau. Il est important de distinguer la rfrence (pointeur) de litem rfrenc. Dans le diagramme suivant, A est la rfrence, et le tableau est ce qui est rfrenc. Java ne nous permet pas de regarder la valeur de A pour voir le pointeur. 0 1 2A A adresse 5 2 17 3
204

length

20

Types de rfrence
Que dire des affectations et des comparaisons pour les types de rfrences? Ce sont les rfrences qui sont compares ou affectes, pas les tableaux!. a == b est vrai a a
adresse1

a == b est faux
adresse1

0
length

3 2 3 2
205

0
adresse1

3 2

a b

length

0
adresse2 length

Types de rfrence
Laffectation ne copie que la rfrence, pas lobjet rfrenc. b = a
donne:

NON: 0
length

0
length

3 2

a a

adresse1

3 2

a
b

adresse1

adresse1

adresse2

0
length

Comment pouvons-nous copier un tableau?

2
206

21

Rfrences perdues
Avec les types de rfrence, il faut faire attention de ne pas perdre un objet rfrenc.

AVANT
b = a a adresse1

APRS
b = a

length 2

length 2

a adresse1 5 6 19 b adresse1 5 6 19

adresse2

length 3

length 3

Aprs laffectation, il ny a plus de rfrence vers le deuxime tableau! Celui-ci sera oubli par Java et ne pourra pas tre rcupr. Voir exemple: AssignationTableaux.ppt
Les objets peuvent tre classifis scientifiquement en trois catgories: ceux qui fonctionnent, ceux qui se brisent, et ceux qui se perdent. R. Baker

207

Trouver llment maximal dans un tableau


Problme (rappelez-vous de lexercice 6-16):
tant donn un tableau de nombres, comment trouver la valeur maximale parmi les lments de ce tableau?

Ide:
Stratgie parcours et mise jour . Premirement, utiliser le premier lment comme candidat la valeur maximal. Ensuite, parcourir les autres lments du tableau et mettre jour le maximum vu jusquici lorsquun nombre plus grand est rencontr.

Nous utiliserons une boucle pour parcourir les lments du tableau.

208

22

Le modle logiciel
DONNES: INTERMDIAIRE: RSULTAT: EN-TTE MODULE n t index max max (un entier positif) (tableau de n valeurs) (index pour t) (lment maximal de t) maxDansTableau( t, n )

max t[0]

index 1

index < n ?

vrai t[index] > max ? faux vrai max t[index]

faux

index index + 1

209

Traduction de 6-16 en Java

210

23

Variables de type String


Les variables de type chane de caractres (String) ont toujours reprsent un dfi pour les langages de programmation. Elles ont des tailles variables et, pour les emmagasiner, lordinateur prfrerait pouvoir prdire la quantit despace mmoire ncessaire.

Ainsi, les chanes de caractres sont souvent des cas spciaux dans un langage de programmation.
211

Type String en Java


Les chanes de caractres en Java sont aussi accder avec des variables de rfrence. Elles sont semblables des tableaux de caractres SAUF QUE: Vous navez pas utiliser new pour crer une chane Vous nutilisez pas [] pour accder aux caractres de la chane. Exemple: String message = "Bonjour!"; System.out.println( message ); La classe (type de donne) String offre plusieurs mthodes utiles pour la gestion de ces chanes. Ceci veut dire que les Strings sont des objets (on tudiera les objets dans la deuxime moiti du cours)

212

24

Mthodes utiles de String


Soit la chane de caractres String message = "Bonjour!"; alors: Pour trouver la longueur dune chane: int laLongueur = message.length(); Pour accder au (i+1)me caractre: int i = 4; char leCaractre = message.charAt( i ); Pour convertir un type primitif en String : int unEntier = 17; String uneChane = String.valueOf( unEntier ); // fonctionne pour int, double, boolean, char Pour joindre une chane une autre (concatnation): String chaneJointe = chane1 + chane2; Voir autres mthodes pour lAPI Java

213

Comparaisons de chanes String


Les chanes String sont des types rfrence, et donc elles ne peuvent pas tre compares laide de ==. La classe String offre la mthode compareTo() pour comparer deux chanes. Les caractres de chaque chane sont compars un un de gauche droite La comparaison sarrte ds que deux caractres sont diffrents ou quand une chane se termine.
Si str1 < str2, alors compareTo() retourne un int < 0 Si str1 > str2, alors compareTo() retourne un int > 0

Si les caractres sont les mmes pour chaque position et que les deux chanes on la mme taille, alors la mthode retourne 0.
214

25

Exercice 6-19: Comparaisons de chanes String


Quelle est la valeur de rsultat pour ces exemples? Exemple 1:
String str1 = "abcde" ; String str2 = "abcfg" ; int rsultat = str1.compareTo(str2);

Exemple 2:
String str1 = "abcde" ; String str2 = "ab" ; int rsultat = str1.compareTo(str2);
215

26

Vous aimerez peut-être aussi