School of Computing Science CMT1000 © Ed Currie Middlesex University Lecture 9: 1 CMT1000: Introduction to Programming Ed Currie Lecture 9: Arrays
School of Computing Science CMT1000 © Ed Currie Middlesex University Lecture 9: 2 Arrays (Tables of data) declaration initialisation manipulation arrays as parameters
School of Computing Science CMT1000 © Ed Currie Middlesex University Lecture 9: 3 Problem You have collected the ages of each student in CMT1000 (1200 people) and want a program to read them into memory and find the average age.
School of Computing Science CMT1000 © Ed Currie Middlesex University Lecture 9: 4 Read in numbers... String s; s = JOptionPane.showInputDialog( “enter a no:”); int age0= Integer.parseInt(s); s = JOptionPane.showInputDialog( “enter a no:”); int age1= Integer.parseInt(s);. s = JOptionPane.showInputDialog( “enter a no:”); int age1199= Integer.parseInt(s);
School of Computing Science CMT1000 © Ed Currie Middlesex University Lecture 9: 5 … and find average double ave = (age0 + age1 + age age1199)/ ; System.out.println(“Average is ” + ave);
School of Computing Science CMT1000 © Ed Currie Middlesex University Lecture 9: 6 Problems? Having lots of separate variables is very tedious It would be better if we could make one declaration –one name –one type –give number of cells
School of Computing Science CMT1000 © Ed Currie Middlesex University Lecture 9: 7 A new plan: use an array 1. Read each value into a separate entry in an array 2.Initialise a total to 0 3. for i = 0 to 1199 add the ith age to total 4.Output total/1200
School of Computing Science CMT1000 © Ed Currie Middlesex University Lecture 9: 8 Reading in values... int ages[] = new int[1200]; String s; for (int i = 0; i <= 1199; i++ ) { s = JOptionPane.showInputDialog( “enter a no:”); ages[i]= Integer.parseInt(s); }
School of Computing Science CMT1000 © Ed Currie Middlesex University Lecture 9: 9 …and computing average int total = 0; for (int i = 0; i <= 1199; i++ ) { total += ages[i]; } int ave = total / ; System.out.println(“Average is ” + ave);
School of Computing Science CMT1000 © Ed Currie Middlesex University Lecture 9: 10 Notes We declare an array reference variable like this int numarr[]; // array of ints char charray[]; // array of chars double decarr[]; //array of doubles To create an array object and store a reference to it in a reference variable: numarr = new int[100];
School of Computing Science CMT1000 © Ed Currie Middlesex University Lecture 9: 11 Notes When an array is allocated, if it contains numbers, they are initialised to 0. The array subscript type must be integer Array subscripts start at 0 int heights[] = new int[20]; How many elements? Subscript range?
School of Computing Science CMT1000 © Ed Currie Middlesex University Lecture 9: 12 Length The length of an array A is the value of the expression A.length What is the value of heights.length
School of Computing Science CMT1000 © Ed Currie Middlesex University Lecture 9: 13 Array reference variables Once an array is allocated, it is fixed in size. However, a reference variable may be set to point to a different array What happens? int A[] = new int[5]; int B[] = new int [10]; A = new int[3]; B = A;
School of Computing Science CMT1000 © Ed Currie Middlesex University Lecture 9: 14 Initialiser lists What does this do? int ages [] = {19, 27, 18, 18, 95, 14, 20, 19, 22, 37}; Note we don’t need new here - it’s called automatically
School of Computing Science CMT1000 © Ed Currie Middlesex University Lecture 9: 15 Initialise and print From Fig. 7.4: Deitel and Deitel String output = ""; // Initializer list specifies number of elements // and value for each element. int n[] = { 32, 27, 64, 18, 95, 14, 90, 70, 60, 37 }; output += "Subscript\tValue\n"; for ( int i = 0; i < n.length; i++ ) output += i + "\t" + n[ i ] + "\n";
School of Computing Science CMT1000 © Ed Currie Middlesex University Lecture 9: 16 Initialise and print (cont) A neat output technique: JTextArea JTextArea outputArea = new JTextArea( 11, 10 ); outputArea.setText( output ); JOptionPane.showMessageDialog( null, outputArea, "Initializing an Array of int Values", JOptionPane.INFORMATION_MESSAGE);
School of Computing Science CMT1000 © Ed Currie Middlesex University Lecture 9: 17 JTextArea JTextArea outputArea = new JTextArea( 11, 10 ); declares reference and creates JTextArea object with 11 rows and 10 columns of text JTextArea is a GUI component for displaying large amounts of text - if too much for the screen, allows scrolling. Initially contains an empty string; can add (concat) to this string using method append outputArea.append(“blah blah”); But we used the setText method outputArea.setText( output );
School of Computing Science CMT1000 © Ed Currie Middlesex University Lecture 9: 18 Output We output the text using JOptionPane.showMessageDialog( null, outputArea, "Initializing an Array of int Values", JOptionPane.INFORMATION_MESSAGE); Note that showMessageDialog can take a string or a GUI component as an argument
School of Computing Science CMT1000 © Ed Currie Middlesex University Lecture 9: 19 Another example From Fig. 7.5 D and D Initialize array to the even integers from 2 to 20 final int ARRAY_SIZE = 10; int n[]; // reference to int array // allocate array n = new int[ ARRAY_SIZE ]; // Set the values in the array for ( int i = 0; i < n.length; i++ ) n[ i ] = * i;
School of Computing Science CMT1000 © Ed Currie Middlesex University Lecture 9: 20 Student poll Fig 7.9 D and D Survey rates café food quality on scale 1 to 10 Prog must compute the frequency (quantity) of each response
School of Computing Science CMT1000 © Ed Currie Middlesex University Lecture 9: 21 Initialise int responses[] = { 1, 2, 6, 4, 8, 5, 9, 7, 8, 10, 1, 6, 3, 8, 6, 10, 3, 8, 2, 7, 6, 5, 7, 6, 8, 6, 7, 5, 6, 6, 5, 6, 7, 5, 6, 4, 8, 6, 8, 10 }; int frequency[] = new int[ 11 ]; String output = "";
School of Computing Science CMT1000 © Ed Currie Middlesex University Lecture 9: 22 Compute frequencies for ( int answer = 0; // initialize answer < responses.length; // condition answer++ ) // increment ++frequency[ responses[ answer ] ];
School of Computing Science CMT1000 © Ed Currie Middlesex University Lecture 9: 23 Build output string output += "Rating\tFrequency\n"; for ( int rating = 1; rating < frequency.length; rating++ ) output += rating + "\t" + frequency[ rating ] + "\n";
School of Computing Science CMT1000 © Ed Currie Middlesex University Lecture 9: 24 Do output JTextArea outputArea = new JTextArea( 11,10 ); outputArea.setText( output ); JOptionPane.showMessageDialog( null, outputArea, "Student Poll Program", JOptionPane.INFORMATION_MESSAGE );
School of Computing Science CMT1000 © Ed Currie Middlesex University Lecture 9: 25 Reference parameters Primitive type arguments are passed to methods using call by value semantics(see last week’s lecture) Objects cannot be passed as arguments to methods; instead we pass object references, using call by value However, this allows the method to manipulate the object directly; we are effectively ‘passing’ the object using ‘call by reference’ semantics Arrays are treated as objects –efficiency versus side effect elimination
School of Computing Science CMT1000 © Ed Currie Middlesex University Lecture 9: 26 What happens? public static void modifyArray( int b[] ) { for ( int j = 0; j < b.length; j++ ) b[ j ] *= 2; } public void modifyElement( int e ) { e *= 2; } int a[] = { 1, 2, 3, 4, 5 }; modifyArray( a ); modifyElement( a[ 3 ] );
School of Computing Science CMT1000 © Ed Currie Middlesex University Lecture 9: 27 Reference vs value The array is passed by reference The primitive-type element is passed by value