Title: CSI 1502 Principes fondamentaux de conception de logiciels
1CSI 1502Principes fondamentaux de conception de
logiciels
- Chapitre 6 Tableaux de données
2Objectifs d'apprentissageTableaux de données
- Comprendre comment faire les activités suivantes
- Declarer et utiliser des tableaux de données
- Passer des tableaux de données et des éléments de
tableaux de données comme paramètres - Declarer et utiliser des tableaux d'objets
- Trier les éléments dans un tableau Tri par
sélection et tri par insertion - Partie B Après la semaine d'étude
- Tableaux à plusieurs dimensions
- La classe ArrayList
- Polygones et polylignes types de bouton
3Tableaux de données Liste ordonnée de valeurs
Le tableau en entier a un nom
0 1 2 3 4 5 6 7 8
9
notes
Un tableau de taille N est indexé de zéro à N-1
Ce tableau contient 10 valeurs qui sont indexées
de 0 à 9
4Tableaux de données (suite)
- On réfère à une valeur particulière dans le
tableau à l'aide du nom du tableau suivi par
l'index entre paranthèses carrées - Par exemple, the expression
- notes2
- réfère à la valeur 94 (qui est la 3ieme valeur
dans le tableau) - Dans Java, le tableau est un objet
- Alors le nom du tableau est une variable
référence à un objet, et le tableau doit être
instancier
5Exemples de tableaux
- notes2 89
- int premier 5
- notespremier notespremier 2
- moyenne (notes0 notes9)/2
- System.out.println ("Max " notes5)
6Tableaux de données (suite)
- Un tableau contient plusieurs valeurs du même
type - Ce type peut être un type primitif ou une
référence à object - Alors, on peut créer un tableau d'entiers, ou un
tableau de caractères, ou un tableau d'objets
String, etc. - Le tableau notes peut être déclaré comme suit
- int notes new int10
7Declarer des tableaux Exemples
- float prix new float500
- boolean drapeaux
- drapeaux new boolean20
- char codes new char1750
8Vérification de bornesVérification d'erreurs
- Lorsqu'un tableau est créé, il est de taille fixe
- Un index utilisé dans une référence de tableau
doit spécifier un élément valide - Voulant dire, l'index doit être dans les bornes
(0 à N-1) - L'interpréteur Java déclenche l'exception
ArrayIndexOutOfBoundsException si l'index du
tableau est hors des bornes - Ceci est la vérification de bornes automatisée
9Vérification de bornesUn exemple
- Par exemple, si un tableau codes contient 100
valeurs, il peut seulement être indexé de 0 à 99 - Si compteur a la valeur 100, alors la référence
qui suit va déclencher une exception - System.out.println (codescompteur)
- Il est commun d'introduire des erreurs off-by-one
quand on utilise des tableaux
for (int index0 index lt 100
index) codesindex index50 epsilon
10Vérification de bornes Utiliser length
- Chaque objet tableau a une constante publique
appelée length qui stocke la taille du tableau - Elle est référencée utilisant le nom du tableau
(comme tout autre objet) - notes.length
- Notez que length contient le nombre d'éléments,
et non pas le plus grand index, - i.e., la valeur de length est plus grand index 1
11Vérification de bornes Extrait de
ReverseOrder.java (p.325)
- double numbers new double10
-
- System.out.println(Size numbers.length)
- for (int index 0 index lt numbers.length
index) -
- System.out.println(Enter number (index
1) ) - numbersindex Keyboard.readDouble())
-
- // print in reverse order
- for (int index numbers.length-1 index gt 0
index--) -
- System.out.println(numbersindex )
-
12Syntaxe alternative pour la déclaration de
tableauPas nécessaire!
- Les paranthèses carrées du type de tableau
peuvent être associé au type d'élément ou au nom
du tableau - Alors les deux déclarations suivantes sont
équivalentes - float prix
- float prix
- Le premier format est généralement plus lisible!!!
13Listes d'initialisationAffecter des valeurs
- Notez que lorsqu'on utilise une liste
d'initialisation - l'opérateur new n'est pas utilisé
- la taille n'est pas spécifié
- La taille du tableau est déterminée par le nombre
de valeurs dans la liste d'initialisation - Une liste d'initialisation peut seulement être
utilisé lors de la déclaration d'un tableau - char letterGrades A, B, C, D, E,
F
14Listes d'initialisation Extrait de Primes.java
(p.330)
-
- int primeNums 2, 3, 5, 7, 11, 13, 17, 19
- System.out.println(Array length
primeNums.length) - System.out.println(The first prime numbers)
- for (int scan 0 scan lt primeNums.length
scan) - System.out.println(primeNumsscan )
-
15Utiliser les tableaux comme paramètres
- Un tableau en entier peut être passé comme
paramètre à une méthode - Comme tout autre objet, la référence au tableau
est passée, qui a comme effet que les paramètres
formels et actuels sont des alias - Changer un élément dans le tableau à l'intérieur
de la méthode va changer l'original - Un élément de tableau peut être passé à une
méthode aussi, mais suit les règles de passage de
paramètres qui applique au type de cet élément
16Utiliser les tableaux d'objets
- La déclaration suivante réserve de l'espace pour
25 références à des objets de type String - String words new String25
- Mais ne crée pas les objets String comme tel
- Chaque objet stocké dans un tableau doit être
instancié séparément - Voir GradeRange.java (page 332)
17Tableaux d'objets Extrait de GradeRange.java
(pp.332)
-
- int cutoff 95, 90, 87, 83, 80
- String grades (A, A, A-, B, B)
- for (int level 0 level lt cutoff.length
level) - System.out.println(gradeslevel
cutofflevel)
Output A 95 A 90 A- 87 B 83 B 80
18Arguments de ligne de commandeA propos Main
(finalement!)
- La signature de la méthode main indique qu'elle
prend un tableau d'objets String comme paramètre - Ces valeurs parviennent des arguments de ligne de
commande qui sont fournit lorsque l'interpréteur
est invoqué - Par exemple, l'exécution de la commande suivante
passe un tableau de trois objets String à main - gt java DoIt pennsylvania texas california
- Ces chaînes de caractères sont stockées dans le
paramètre aux indexes 0-2
19A propos Main (String args)NameTag.java
(p.334)
- public class NameTag
-
- public static void main (String args)
-
- System.out.println()
- System.out.println( args0)
- System.out.println(My name is args1)
-
-
-
gt java NameTag Hello Sue Hello My name is Sue gt
java NameTag Hello James Hello My name is James
20Utiliser les tableaux d'objets
- Des objets peuvent avoir des tableaux comme
variables d'instance - Alors, plusieurs structures utiles peuvent être
créé avec des tableaux et des objets - Le concepteur de logiciel doit déterminer
soigneusement une organisation des données et des
objets qui est applicable à la situation - Voir CD Collection example, p.335, 337-338
-
21Programme CD Collectiondiagramme UML
Tunes
CDCollection
- collection CD - count int - totalCost
double
main (args String) void
1
addCD (title String, artist String, cost
double, tracksint) void toString( ) String -
increaseSize() void
CD
n
- title String - artist String - cost
String - tracks int
toString() String
22Exemple CD Collection Tunes.java (Programme
pilote)
- public class Tunes public static void main
(String args) - CDCollection music new CDCollection()music.a
ddCD("So far so good", "Bryan Adams", 14.96,
14)music.addCD("Enrique", "Enrique Iglesias",
15.96, 13)System.out.println(music)
23Exemple CD Collection CDCollection.java
- public class CDCollection
- private CD collectionprivate int
countprivate double totalCost - public CDCollection() // the constructor
- collection new CD100 count
0 totalCost 0.0//Adds a CD to the
collectionpublic void addCD(String title, String
artist, double cost, int tracks) if (count
collection.length) increaseSize() collectio
ncount new CD(title, artist, cost,
tracks) totalCost cost count S
uite..
24Exemple CD Collection CDCollection.java (suite)
- // double the size of the collection private
void increaseSize() CD temp new
CDcollection.length 2 for (int cd 0 cd
lt collection.length cd) tempcd
collectioncd collection temppublic
String toString() String report " " for
(int cd 0 cd lt count cd) report
collectioncd.toString() "\n" return
report
25Exemple CDCollectionCD.java
- public class CD
- private String title, artistprivate double
costprivate int tracks// The
constructorpublic CD (String name, String
singer, double price, int numTracks) title
name artist singer cost price tracks
numTracks// the toString for printingpublic
String toString() String description descrip
tion title "\t" artist return
description
26Tri de tableaux
- Le triage est le processus d'ordonner une liste
d'éléments - Il y a plusieurs algorithmes pour trier une liste
d'élements - Ces algorithmes peuvent varier en performance
- Nous allons examiner deux algorithmes
spécifiques - Tri par sélection
- Tri par insertion
27Tri par sélection En général
- L'approche pour le tri par sélection
- Choisissez un item et placez-le dans sa position
finale dans le tableau trié - Répétez pour tous les autres items
- En plus de détailles
- Trouvez le plus petit item dans la liste
- Échangez-le avec l'item dans la 1ere position
- Trouvez le prochain plus petit item dans la liste
- Échangez-le avec l'item dans la 2e position
- Répétez jusqu'à ce que tous les items soient dans
la bonne ordre
28Tri par sélectionLa méthode Selection Sort
- Un exemple
- original 3 9 6 1 2
- smallest is 1 1 9 6 3 2
- smallest is 2 1 2 6 3 9
- smallest is 3 1 2 3 6 9
- smallest is 6 1 2 3 6 9
- Voir SortGrades.java (page 342)
- Voir Sorts.java (page 343) -- la méthode
selectionSort
29Tri par sélectionLa méthode selectionSort
- public static void selectionSort (int numbers)
-
- int min, temp
- for (int index 0 index lt numbers.length 1
index) -
- min index
- for (int scan index1 scan lt numbers.length
scan) - if (numbersscan lt numbersmin)
- min scan
- // Swap the values
- temp numbersmin
- numbersmin numbersindex
- numbersindex temp
-
-
30Tri par insertion En général
- L'approche pour le tri par insertion
- Choisissez un item et insérez-le dans la
sous-liste triée dans la bonne ordre - Répétez jusqu'à ce que tous les items soient
insérés - En plus de détailles
- Considérez le 1er item comme étant la sous-liste
triée (avec un item) - Insérez le 2e item dans la sous-liste triée, en
faisant décaler le 1er item si nécessaire pour
pouvoir insérer le nouvel item - Insérez le 3e item dans la sous-liste triée (de
deux items), en faisant décaler les items comme
nécessaire - Répétez jusqu'à ce que tous les items soient
insérés dans la bonne ordre
31Tri de tableauxTri par insertion
- Un exemple
- original 3 9 6 1 2
- insert 9 3 9 6 1 2
- insert 6 3 6 9 1 2
- insert 1 1 3 6 9 2
- insert 2 1 2 3 6 9
- Voir Sorts.java (page 343) -- la méthode
insertionSort
32Tri par insertionLa méthode insertionSort
- public static void insertionSort (int numbers)
-
- for (int index 1 index lt numbers.length
index) -
- int key numbersindex
- int position index
-
- while (position gt 0 numbersposition 1 gt
key) -
- numbersposition numbersposition 1
- position --
-
- numbersposition key
-
-
33Comparaison de triSélection et insertion
- Les tris par sélection and par insertion sont
similaires en performance - Ces deux tris ont une boucle extérieure qui fait
l'analyse de tous les éléments et une boucle
intérieure qui compare la valeur de la boucle
extérieure avec presque toutes les valeurs de la
liste - Alors, il faut environ n2 comparaisons pour
obtenir une liste triée de taille n - Nous disons donc que ces tris sont d'ordre n2
- Il y a autres tris qui sont plus efficaces
order n log2 n
34Tri d'objets Un exemple
- L'ordre d'une collection d'objets doit être
défini par la personne qui définie la classe - Rappelez-vous qu'une interface Java peut être
utilisé pour guarantir qu'une classe particulière
implémentera des méthodes particulières - On peut utiliser l'interface Comparable et la
méthode CompareTo pour développer un tri
générique pour un ensemble d'objets - Voir SortPhoneList.java et Contact.java (page
347-348)