Introduction to Computing Using Java Array and Table

Introduction to Computing Using Java Array and Table 2005 -2008 8 a Michael Fung, CS&E, The Chinese University of HK 1

Array ¬ If we need 3 integer variables, we type: int i, j, k; ¬ If we need 1000 integer variables…? ! – we want to use an index to access variables of the same name (identifier) and type: i[0] = 5; i[654] = -378; ¬ How to do that? integer array type (a collection of integers) int[] i = new int[1000]; – OR ( C++ style ) int i[] = new int[1000]; 2005 -2008 8 a Michael Fung, CS&E, The Chinese University of HK 2

Array ¬ If we need 3 integer variables, we type: int i, j, k; ¬ If we need 1000 integer variables…? ! – we want to use an index to access variables of the same name (identifier) and type: create an array i[0] = 5; i[654] = -378; of 1000 integer variables ¬ How to do that? int[] i = new int[1000]; – OR int i[] = new int[1000]; 2005 -2008 8 a Michael Fung, CS&E, The Chinese University of HK 3
![Declaration and Array Creation int[] i = new int[1000]; is equivalent to int[] i; Declaration and Array Creation int[] i = new int[1000]; is equivalent to int[] i;](http://slidetodoc.com/presentation_image_h2/e3c89df000ecf14b31bdae2c79441bd5/image-4.jpg)
Declaration and Array Creation int[] i = new int[1000]; is equivalent to int[] i; i = new int[1000]; 2005 -2008 8 a // i is nothing yet // i keeps something Michael Fung, CS&E, The Chinese University of HK 4

Revision: Object Creation Boy i = new Boy(3); is equivalent to Boy i; i = new Boy(3); something 2005 -2008 8 a // i is nothing yet // i keeps Michael Fung, CS&E, The Chinese University of HK 5
![Another Form of Array Creation ¬ By enumerating its initial values: char[] vowels = Another Form of Array Creation ¬ By enumerating its initial values: char[] vowels =](http://slidetodoc.com/presentation_image_h2/e3c89df000ecf14b31bdae2c79441bd5/image-6.jpg)
Another Form of Array Creation ¬ By enumerating its initial values: char[] vowels = {'a', 'e', 'i', 'o', 'u'}; ¬ Then vowels is an array of 5 char variables with vowels[0] vowels[1] vowels[2] vowels[3] vowels[4] 'a' 'e' 'i' 'o' 'u' There are 5 char variables! ¬ Array index must be an integer: [0 to length – 1]. 2005 -2008 8 a Michael Fung, CS&E, The Chinese University of HK 6
![Syntax of Creating Arrays type[] array_name = new type[length]; type[] array_name = {value 1, Syntax of Creating Arrays type[] array_name = new type[length]; type[] array_name = {value 1,](http://slidetodoc.com/presentation_image_h2/e3c89df000ecf14b31bdae2c79441bd5/image-7.jpg)
Syntax of Creating Arrays type[] array_name = new type[length]; type[] array_name = {value 1, value 2, . . . }; e. g. double[] String char[] GPA = new double[50]; country. Code = new String[175]; address[] = new String[30]; vowels = {‘a’, ‘e’, ‘i’, ‘o’, ‘u’}; ¬type may be primitive type, class type or even an other array type. 2005 -2008 8 a Michael Fung, CS&E, The Chinese University of HK 7
![Use of Array Elements ¬ Each array element is a variable by itself: vowels[4] Use of Array Elements ¬ Each array element is a variable by itself: vowels[4]](http://slidetodoc.com/presentation_image_h2/e3c89df000ecf14b31bdae2c79441bd5/image-8.jpg)
Use of Array Elements ¬ Each array element is a variable by itself: vowels[4] ‘u’ vowels[3] ‘o’ vowels[2] ‘i’ vowels[1] { char[] vowels = {'a', 'e', 'i', 'o', 'u'}; int[] i = new int[1000]; // i[0] to i[999] int j = 4; // serve as array index ‘e’ vowels[0] ‘a’ ‘A’ vowels[0] = 'A'; // simple variable asg’t if (vowels[1] == 'e') System. out. println( vowels[j] ); i[4] 0 1 i[4]++; // increment i[4] by 1 i[j] = i[3] – i[i[4]] * i[999]; } 2005 -2008 8 a Michael Fung, CS&E, The Chinese University of HK 8

Properties of Array ¬ A bounded (fixed length) and indexed collection of elements of the same type. ¬ Array length is fixed at the time of creation. ¬ Element access is done using an index [ ]. – vowels[0] to vowels[vowels. length – 1] – vowels[-8] Array. Index. Out. Of. Bounds. Exception ¬ To get the length (size) of an array: – vowels. length – NOT vowel. length() [confused with String] 2005 -2008 8 a Michael Fung, CS&E, The Chinese University of HK 9
![Example: The Parameter in main() class Test. Args { public static void main(String[] args) Example: The Parameter in main() class Test. Args { public static void main(String[] args)](http://slidetodoc.com/presentation_image_h2/e3c89df000ecf14b31bdae2c79441bd5/image-10.jpg)
Example: The Parameter in main() class Test. Args { public static void main(String[] args) { System. out. println("There are " + args. length + " arguments: "); int i; for (i = 0; i < args. length; i++) System. out. println( args[i] ); } } C: Let. See> There are 0 C: Let. See> There are 2 Apple Orange 2005 -2008 8 a java Test. Args arguments: java Test. Args Apple Orange arguments: Michael Fung, CS&E, The Chinese University of HK 10

Example: The Parameter in main() ¬ A Java application program can receive some parameters at start-up. ¬ These start-up parameters are called command-line arguments. ¬ The main() method is the receiver of such arguments. ¬ Such arguments are stored in a String array created by the JVM. ¬ JVM sends a message to main() with such an array. 2005 -2008 8 a Michael Fung, CS&E, The Chinese University of HK 11

Revision: Difference Between Primitive Types and Object References /* 8 primitive types: byte, short, int, long, float, double, char, boolean */ int i; char c; Octopus my. Card; // object reference Account anson. Account; // object reference ¬ i and c have their own storage spaces for storing the actual data values. ¬ my. Card anson. Account are just references to objects. ¬ Without initialization, object references refer to nothing and are said to be null. 2005 -2008 8 a Michael Fung, CS&E, The Chinese University of HK 12

Revision: Initializing Object References int i; i = 45 * 89; // an integer variable // it stores 0 by default Octopus my. Card; my. Card = new Octopus(); my. Card. add. Value(100); // a null object reference // create a new object and // let my. Card refer to it Octopus your. Card; your. Card = new Octopus(); your. Card. add. Value(50); // a null object reference // create another object // it’s your card Octopus stolen. Card; stolen. Card = my. Card; // a null object reference // my. Card and stolen. Card // now refer to the SAME card! 2005 -2008 8 a Michael Fung, CS&E, The Chinese University of HK 13

Pictorially. . . value 150. 00 age 21 name (reference) my. Card (reference) 2005 -2008 8 a String (object) “Michael Fung” String (class) Octopus (object). . . double value int age String name Fung”; Octopus my. Card Octopus (class) = 150. 00; = 21; = “Michael = new Octopus(); Michael Fung, CS&E, The Chinese University of HK 14
![Array of Object References int[] i; // a null integer array reference i = Array of Object References int[] i; // a null integer array reference i =](http://slidetodoc.com/presentation_image_h2/e3c89df000ecf14b31bdae2c79441bd5/image-15.jpg)
Array of Object References int[] i; // a null integer array reference i = new int[100]; // create a new integer array i[5] = 87; // let i refer to the array // initially, i[0] = … = i[99] = 0 Octopus[] deck; // a null Octopus array reference deck = new Octopus[10]; // initially, deck[0] = … = null deck[0] = new Octopus(); deck[1] = deck[0]; deck[2] = new Octopus(); ¬Creating a new array Creating members 2005 -2008 8 a Michael Fung, CS&E, The Chinese University of HK 15
![Array Itself is Also a Reference deck[ ] (reference) ? Octopus[] deck; deck = Array Itself is Also a Reference deck[ ] (reference) ? Octopus[] deck; deck =](http://slidetodoc.com/presentation_image_h2/e3c89df000ecf14b31bdae2c79441bd5/image-16.jpg)
Array Itself is Also a Reference deck[ ] (reference) ? Octopus[] deck; deck = new Octopus[3]; deck[0] = new Octopus(); deck[1] = deck[0]; deck[2] = new Octopus(); 2005 -2008 8 a Michael Fung, CS&E, The Chinese University of HK 16
![Array Itself is Also a Reference deck[ ] (reference) deck[2] (reference) deck[1] (reference) deck[0] Array Itself is Also a Reference deck[ ] (reference) deck[2] (reference) deck[1] (reference) deck[0]](http://slidetodoc.com/presentation_image_h2/e3c89df000ecf14b31bdae2c79441bd5/image-17.jpg)
Array Itself is Also a Reference deck[ ] (reference) deck[2] (reference) deck[1] (reference) deck[0] (reference) 2005 -2008 8 a ? ? ? Octopus[] deck; deck = new Octopus[3]; deck[0] = new Octopus(); deck[1] = deck[0]; deck[2] = new Octopus(); Michael Fung, CS&E, The Chinese University of HK 17
![Array Itself is Also a Reference deck[ ] (reference) deck[2] (reference) deck[1] (reference) deck[0] Array Itself is Also a Reference deck[ ] (reference) deck[2] (reference) deck[1] (reference) deck[0]](http://slidetodoc.com/presentation_image_h2/e3c89df000ecf14b31bdae2c79441bd5/image-18.jpg)
Array Itself is Also a Reference deck[ ] (reference) deck[2] (reference) deck[1] (reference) deck[0] (reference) 2005 -2008 8 a ? ? Octopus (object) Octopus (class) Octopus[] deck; deck = new Octopus[3]; deck[0] = new Octopus(); deck[1] = deck[0]; deck[2] = new Octopus(); Michael Fung, CS&E, The Chinese University of HK 18
![Array Itself is Also a Reference deck[ ] (reference) deck[2] (reference) deck[1] (reference) deck[0] Array Itself is Also a Reference deck[ ] (reference) deck[2] (reference) deck[1] (reference) deck[0]](http://slidetodoc.com/presentation_image_h2/e3c89df000ecf14b31bdae2c79441bd5/image-19.jpg)
Array Itself is Also a Reference deck[ ] (reference) deck[2] (reference) deck[1] (reference) deck[0] (reference) 2005 -2008 8 a ? Octopus (object) Octopus (class) Octopus[] deck; deck = new Octopus[3]; deck[0] = new Octopus(); deck[1] = deck[0]; deck[2] = new Octopus(); Michael Fung, CS&E, The Chinese University of HK 19
![Array Itself is Also a Reference deck[ ] (reference) deck[2] (reference) deck[1] (reference) deck[0] Array Itself is Also a Reference deck[ ] (reference) deck[2] (reference) deck[1] (reference) deck[0]](http://slidetodoc.com/presentation_image_h2/e3c89df000ecf14b31bdae2c79441bd5/image-20.jpg)
Array Itself is Also a Reference deck[ ] (reference) deck[2] (reference) deck[1] (reference) deck[0] (reference) 2005 -2008 8 a Octopus (object) Class type array Octopus (class) Octopus[] deck; deck = new Octopus[3]; deck[0] = new Octopus(); deck[1] = deck[0]; deck[2] = new Octopus(); Michael Fung, CS&E, The Chinese University of HK 20
![Array Itself is Also a Reference i[ ] (reference) Primitive type array Class type Array Itself is Also a Reference i[ ] (reference) Primitive type array Class type](http://slidetodoc.com/presentation_image_h2/e3c89df000ecf14b31bdae2c79441bd5/image-21.jpg)
Array Itself is Also a Reference i[ ] (reference) Primitive type array Class type array 2005 -2008 8 a i[2] (int) 9 i[1] (int) 7 i[0] (int) 7 int[] i; i = new int[3]; i[0] = 7; i[1] = i[0]; i[2] = 9; Michael Fung, CS&E, The Chinese University of HK 21

7 -Minute Break 2005 -2008 8 a Michael Fung, CS&E, The Chinese University of HK 22
![Assignment of the Whole Array i[ ] (reference) j[ ] (reference) 2005 -2008 8 Assignment of the Whole Array i[ ] (reference) j[ ] (reference) 2005 -2008 8](http://slidetodoc.com/presentation_image_h2/e3c89df000ecf14b31bdae2c79441bd5/image-23.jpg)
Assignment of the Whole Array i[ ] (reference) j[ ] (reference) 2005 -2008 8 a They refer to the same array! i[2] (int) 9 i[1] (int) 7 i[0] (int) 7 int[] i = new int[3]; int[] j; j = i; // object reference copying j[2] = 9; // i[2] = 9 i[1] = 7; // j[2] = 7 j[0] = 7; // i[0] = 7 Michael Fung, CS&E, The Chinese University of HK 23
![Assignment of the Whole Array i[ ] (reference) j[4] j[3] j[2] (int) j[1] (int) Assignment of the Whole Array i[ ] (reference) j[4] j[3] j[2] (int) j[1] (int)](http://slidetodoc.com/presentation_image_h2/e3c89df000ecf14b31bdae2c79441bd5/image-24.jpg)
Assignment of the Whole Array i[ ] (reference) j[4] j[3] j[2] (int) j[1] (int) j[0] 0(int) 00 2005 -2008 8 a OR, Create another one! i[2] (int) 9 i[1] (int) 7 i[0] (int) 7 int[] i = new int[3]; int[] j; j = new int[5]; Michael Fung, CS&E, The Chinese University of HK 24
![Assignment of the Whole Array i[ ] (reference) j[4] j[3] j[2] (int) j[1] (int) Assignment of the Whole Array i[ ] (reference) j[4] j[3] j[2] (int) j[1] (int)](http://slidetodoc.com/presentation_image_h2/e3c89df000ecf14b31bdae2c79441bd5/image-25.jpg)
Assignment of the Whole Array i[ ] (reference) j[4] j[3] j[2] (int) j[1] (int) j[0] 0(int) 00 2005 -2008 8 a Remember to Keep It Well! i[2] (int) 9 i[1] (int) 7 i[0] (int) 7 int[] i = new int[3]; int[] j; j = new int[5]; j = i; Michael Fung, CS&E, The Chinese University of HK 25

Revision: Primitive Type Parameter Passing class Student { public static void study. Hard(double new. GPA) { new. GPA = 4. 0; } Start here new. GPA 1. 0 4. 0 public static void main(String[] args) { double GPA = 1. 0; Student. study. Hard(GPA); System. out. println(GPA); } GPA 1. 0 } Copy actual parameter to formal parameter when sending message. Change to the formal parameter DOES NOT affect actual parameter! 2005 -2008 8 a Michael Fung, CS&E, The Chinese University of HK 26

New Concept: Primitive Type Array Argument Passing class Student { public static void study. Hard(double[] new. GPAs) { new. GPAs[0] = 4. 0; new. GPAs[1] = 4. 0; } Start here public static void main(String[] args) { double[] GPAs = new double[2]; GPAs[0] = 1. 0; GPAs[1] = 1. 5; Student. study. Hard(GPAs); System. out. println(GPAs[0]); System. out. println(GPAs[1]); } new. GPAs (Reference) GPAs[1] 1. 5 4. 0 GPAs[0] 1. 0 4. 0 GPAs (Reference) } Copy array reference to formal parameter when sending message. 2005 -2008 8 a Michael Fung, CS&E, The Chinese University of HK Change to the formal parameter DOES affect the actual parameter! 27

Revision: Object Type Argument Passing Start here class CUHK { public static void fire(Employee victim) { victim. salary = 0; } public static void main(String[] args) { Employee michael = new Employee(500); CUHK. fire(michael); if (michael. salary == 0) System. out. println(“Fired !”); } } class Employee { public int salary; public Employee(int initial. Salary) { salary = initial. Salary; } } 2005 -2008 8 a victim (reference) michael (reference) Employee (class) Employee (object) Michael Fung, CS&E, The Chinese University of HK salary (int) 28

New Concept: Object Type Array Argument Passing Start here class CUHK { public static void fire(Employee[] victims) { for (int i = 0; i < victims. length; i++) victims[i]. salary = 0; } public static void main(String[] args) { Employee[] TAs = new Employee[3]; TAs[0] = new Employee(1000); TAs[1] = new Employee(2000); TAs[2] = new Employee(5000); CUHK. fire(TAs); } } TAs (reference) class Employee { public int salary; public Employee(int initial. Salary) { salary = initial. Salary; } } 2005 -2008 8 a victims (reference) Employee (object) salary 1000 TAs[0] (reference) TAs[1] (reference) Employee (object) salary 2000 Employee (object) salary 5000 TAs[2] (reference) Michael Fung, CS&E, The Chinese University of HK 29

Table (2 -Level Array) What’s the type? double // There are 176 students, 8 assignments // record their marks in double[][] mark = new double[176][8]; mark[6][0] = 99. 34; // mark: 7 th student, Asg 1 mark[175][6] = 89. 12; // mark: last student, Asg 7 double[] single. Student; single. Student = mark[175]; // refer to the single. Student[6] = 45. 67; // marks of the last one System. out. println(mark[175][6]); // would print 45. 67 ¬Elements of an array could be arrays. ¬Array reference of array references. 2005 -2008 8 a Michael Fung, CS&E, The Chinese University of HK 30
![Table Illustrated mark[ ][ ] (reference) Array of double 2005 -2008 8 a mark[2] Table Illustrated mark[ ][ ] (reference) Array of double 2005 -2008 8 a mark[2]](http://slidetodoc.com/presentation_image_h2/e3c89df000ecf14b31bdae2c79441bd5/image-31.jpg)
Table Illustrated mark[ ][ ] (reference) Array of double 2005 -2008 8 a mark[2] mark[1] mark[0] (reference) mark[2][3] (double) 9. 45 mark[1][3] (double) 8. 48 mark[0][3] (double) 9. 11 mark[2][2] (double) 2. 49 mark[1][2] (double) 3. 40 mark[0][2] (double) 1. 42 mark[2][1] (double) 3. 43 mark[1][1] (double) 6. 13 mark[0][1] (double) 5. 43 mark[2][0] (double) 1. 75 mark[1][0] (double) 1. 15 mark[0][0] (double) 0. 35 Michael Fung, CS&E, The Chinese University of HK 31
![Duplicating an int Array i[ ] (reference) Copy the elements one-by-one i[2] (int) 9 Duplicating an int Array i[ ] (reference) Copy the elements one-by-one i[2] (int) 9](http://slidetodoc.com/presentation_image_h2/e3c89df000ecf14b31bdae2c79441bd5/image-32.jpg)
Duplicating an int Array i[ ] (reference) Copy the elements one-by-one i[2] (int) 9 i[1] (int) 7 i[0] (int) 7 int[] i = {7, 7, 9}; int[] j; j = new int[i. length]; for (int count = 0; count < i. length; count++) j[count] = i[count]; 2005 -2008 8 a Michael Fung, CS&E, The Chinese University of HK 32
![Duplicating an int Array i[ ] (reference) j[ ] (reference) ? 2005 -2008 8 Duplicating an int Array i[ ] (reference) j[ ] (reference) ? 2005 -2008 8](http://slidetodoc.com/presentation_image_h2/e3c89df000ecf14b31bdae2c79441bd5/image-33.jpg)
Duplicating an int Array i[ ] (reference) j[ ] (reference) ? 2005 -2008 8 a Copy the elements one-by-one i[2] (int) 9 i[1] (int) 7 i[0] (int) 7 int[] i = {7, 7, 9}; int[] j; j = new int[i. length]; for (int count = 0; count < i. length; count++) j[count] = i[count]; Michael Fung, CS&E, The Chinese University of HK 33
![Duplicating an int Array i[ ] (reference) Copy the elements one-by-one i[2] (int) 9 Duplicating an int Array i[ ] (reference) Copy the elements one-by-one i[2] (int) 9](http://slidetodoc.com/presentation_image_h2/e3c89df000ecf14b31bdae2c79441bd5/image-34.jpg)
Duplicating an int Array i[ ] (reference) Copy the elements one-by-one i[2] (int) 9 j[ ] (reference) j[2] (int) 0 2005 -2008 8 a j[1] (int) 0 j[0] (int) 0 i[1] (int) 7 i[0] (int) 7 int[] i = {7, 7, 9}; int[] j; j = new int[i. length]; for (int count = 0; count < i. length; count++) j[count] = i[count]; Michael Fung, CS&E, The Chinese University of HK 34
![Duplicating an int Array i[ ] (reference) Copy the elements one-by-one i[2] (int) 9 Duplicating an int Array i[ ] (reference) Copy the elements one-by-one i[2] (int) 9](http://slidetodoc.com/presentation_image_h2/e3c89df000ecf14b31bdae2c79441bd5/image-35.jpg)
Duplicating an int Array i[ ] (reference) Copy the elements one-by-one i[2] (int) 9 j[ ] (reference) j[2] (int) 9 2005 -2008 8 a j[1] (int) 7 j[0] (int) 7 i[1] (int) 7 i[0] (int) 7 int[] i = {7, 7, 9}; int[] j; j = new int[i. length]; for (int count = 0; count < i. length; count++) j[count] = i[count]; Michael Fung, CS&E, The Chinese University of HK 35
![Duplicating an Object Array Octopus (object) deck[ ] (reference) deck[2] (reference) deck[1] (reference) deck[0] Duplicating an Object Array Octopus (object) deck[ ] (reference) deck[2] (reference) deck[1] (reference) deck[0]](http://slidetodoc.com/presentation_image_h2/e3c89df000ecf14b31bdae2c79441bd5/image-36.jpg)
Duplicating an Object Array Octopus (object) deck[ ] (reference) deck[2] (reference) deck[1] (reference) deck[0] (reference) 2005 -2008 8 a Octopus (object) Octopus (class) Octopus[] deck; . . . Octopus[] new. Deck; new. Deck = new Octopus[deck. length]; for (int count = 0; count < deck. length; count++) new. Deck[count] = deck[count]; Michael Fung, CS&E, The Chinese University of HK 36
![Duplicating an Object Array new. Deck[ ] (reference) ? Octopus (object) deck[ ] (reference) Duplicating an Object Array new. Deck[ ] (reference) ? Octopus (object) deck[ ] (reference)](http://slidetodoc.com/presentation_image_h2/e3c89df000ecf14b31bdae2c79441bd5/image-37.jpg)
Duplicating an Object Array new. Deck[ ] (reference) ? Octopus (object) deck[ ] (reference) deck[2] (reference) deck[1] (reference) deck[0] (reference) 2005 -2008 8 a Octopus (object) Octopus (class) Octopus[] deck; . . . Octopus[] new. Deck; new. Deck = new Octopus[deck. length]; for (int count = 0; count < deck. length; count++) new. Deck[count] = deck[count]; Michael Fung, CS&E, The Chinese University of HK 37
![Duplicating an Object Array new. Deck[ ] (reference) new. Deck[2] (reference) new. Deck[1] (reference) Duplicating an Object Array new. Deck[ ] (reference) new. Deck[2] (reference) new. Deck[1] (reference)](http://slidetodoc.com/presentation_image_h2/e3c89df000ecf14b31bdae2c79441bd5/image-38.jpg)
Duplicating an Object Array new. Deck[ ] (reference) new. Deck[2] (reference) new. Deck[1] (reference) new. Deck[0] (reference) Octopus (object) deck[ ] (reference) deck[2] (reference) deck[1] (reference) deck[0] (reference) 2005 -2008 8 a Octopus (object) Octopus (class) Octopus[] deck; . . . Octopus[] new. Deck; new. Deck = new Octopus[deck. length]; for (int count = 0; count < deck. length; count++) new. Deck[count] = deck[count]; Michael Fung, CS&E, The Chinese University of HK 38
![Duplicating an Object Array new. Deck[ ] (reference) new. Deck[2] (reference) new. Deck[1] (reference) Duplicating an Object Array new. Deck[ ] (reference) new. Deck[2] (reference) new. Deck[1] (reference)](http://slidetodoc.com/presentation_image_h2/e3c89df000ecf14b31bdae2c79441bd5/image-39.jpg)
Duplicating an Object Array new. Deck[ ] (reference) new. Deck[2] (reference) new. Deck[1] (reference) new. Deck[0] (reference) Octopus (object) deck[ ] (reference) deck[2] (reference) deck[1] (reference) deck[0] (reference) 2005 -2008 8 a Octopus (object) Octopus (class) Only the object references are copied! Octopus[] deck; . . . Octopus[] new. Deck; new. Deck = new Octopus[deck. length]; for (int count = 0; count < deck. length; count++) new. Deck[count] = deck[count]; Michael Fung, CS&E, The Chinese University of HK 39

End Note ¬Readings and References – Sections 7. 1, 7. 2, 7. 3, 7. 4, 7. 6 ¬Exercises – 7. 1, 7. 2, 7. 3, 7. 4, 7. 5 ¬Programming Projects – 7. 1, 7. 2, 7. 3, 7. 5, 7. 6 2005 -2008 8 a Michael Fung, CS&E, The Chinese University of HK 40
- Slides: 40