COMP 1402 Winter 2008 Tutorial #5 Arrays Overview of Tutorial #5 - - PDF document

comp 1402
SMART_READER_LITE
LIVE PREVIEW

COMP 1402 Winter 2008 Tutorial #5 Arrays Overview of Tutorial #5 - - PDF document

COMP 1402 Winter 2008 Tutorial #5 Arrays Overview of Tutorial #5 What is an array? Array syntax Character arrays Passing arrays to functions. Processing/traversing arrays Higher Dimension arrays (2d and 3d) 1 Why


slide-1
SLIDE 1

1

COMP 1402

Winter 2008 Tutorial #5 Arrays

Overview of Tutorial #5

  • What is an array?
  • Array syntax
  • Character arrays
  • Passing arrays to functions.
  • Processing/traversing arrays
  • Higher Dimension arrays (2d and 3d)
slide-2
SLIDE 2

2

Why do we need arrays?

  • Regular variables store a single value of the

specified type. eg.

  • But sometimes we need several copies of a

variable, such as the grades for 3 students. We could try:

int a; //stores a single variable of integer type double grade_student1; double grade_student2; double grade_student3; //etc.

  • This would get very tedious if we had 100

students!

What is an array?

  • An array is a special variable that can store many values.
  • In our student example instead of a separate variable for

each student we could use an array of grades that keeps the grades for each student.

87.0 student1_grade 75.0 student2_grade 91.0 student3_grade 3 Variables A Single Array with 3 Elements grade_array 87.0 75.0 91.0

slide-3
SLIDE 3

3

What are arrays ...

int a; An array reserves a contiguous block of memory addresses in which we can store values of the array type (int in this case). int a[5]; A regular variable reserves a single address in memory where its value is stored.

Regular Variable An Array

Array Syntax: Declaring

  • Arrays declarations have three parts, the data type, the

array name and the size (number of elements), eg.

int a[5]; a[0] = 7; a[1] = 13; a[2] = 11; a[3] = 5; a[4] = -8;

  • 8

13 7 11 5

int a[5]; // An array named ‘a’ which stores 5 // integer values.

  • On the left we see the

integer array ‘a’ which holds the five integer values 7, 13, 11, 5, -8.

slide-4
SLIDE 4

4

Array Elements

  • The elements of an array are referred to by both the

array name and an 'index' value.

  • Index values are numbered from 0 (for the arrays first

element).

  • The index for the last element is thus one less than the

array's size.

an_array 1 2 3 4

We would reference this element as: an_array[2]

Array Syntax: Accessing Elements

  • An array element is accessed by supplying the

array name, and the elements index inside square brackets [ ].

  • We can treat each element like we would any
  • ther variable.

int a[5]; // Create an array of 5 integers. a[0] = 15; // Set element 0 to the value 15 if( a[2] < 4 ) { ... } //Use elements anywhere we //would a regular variable.

slide-5
SLIDE 5

5

Syntax: Setting Elements (cont)

  • Each element corresponds to one address in

memory.

a[0] a[1] a[2] a[3] a[4]

  • In C we must be careful with arrays

because C does not stop us from attempting to access an element

  • utside the array, eg.

int a[5]; // Create an array of 5 integers. a[15] = 9; //But ‘a’ has only 5 elements //may crash program or cause //strange bugs.

Array Syntax: Initializing

  • As with variables we can initialize an array at the

moment we create it or afterwards.

int a = 15; //Creates a variable and sets its value. //Create and initialize an array in one step. int a[] = { 8, 7, 15, 9} //Note compiler can determine //array size. //Create, and then initialize the elements. int a[4]; //In this case you must provide # elements. a[0] = 8; a[1] = 7; a[2] = 15; a[3] = 9;

slide-6
SLIDE 6

6

Character Arrays

  • In C strings are stored as arrays of characters.
  • The last character in the string should be the special

string termination character '\0' (corresponds to 0).

  • You can pass your character arrays to C functions like

printf char my_string[] = { 'h', 'e', 'l', 'l', 'o', '\0'}; //You can still access elements putchar( my_string[1] ); //outputs 'e' //Or pass to C functions. printf(“%s there!”, my_string); //prints “hello there.”

Character Arrays

  • Note, the null terminator is ESSENTIAL for a
  • string. Omitting it will likely cause any calls to

printf() etc. to crash.

  • If you want to scan a ‘string’ you can use the null

terminator as a marker for the end of the string.

char my_string[] = { 'h', 'e', 'l', 'l', 'o', '\0'}; //count the length of my_string int pos = 0; while( my_string[pos] != '\0' ) { pos = pos + 1; } printf( "String: %s : is %d chars long\n", my_string, pos);

slide-7
SLIDE 7

7

Functions and Arrays

  • You can pass arrays to a function like any other variable

(or as a pointer).

  • For 1d arrays adding the size is optional.

#define N 10 int numbers[N]; void func1( int array[N]); //OK void func2( int array[] ); //Also OK void func3( int *array); //Also OK //When you invoke the function you don't use [ ] func1(numbers ); //correct func1(numbers[] ); //wrong - syntax error.

Accessing Array Elements

  • Quite often you want to step through each element an

array - use a for or while loop.

  • Use for most of the time, you must know the array

length.

//Count how many elements of array are greater than 100 int array[N]; array[0] = 237; //etc. int i; int count = 0; for( i = 0; i < N; i++) { if( array[i] > 100 ) count = count + 1; }

slide-8
SLIDE 8

8

Accessing Elements

#define N 5 int array[N]; array[0] = 237; //etc. int i; int c= 0; for( i = 0; i < N; i++) { if( (array[i] > 100 ) c = c + 1; } #define N 5 int array[N]; array[0] = 237; //etc. int i; int count= 0; if( array[0] > 100) count = count +1; if( array[1] > 100) count = count +1; if( array[2] > 100) count = count +1; if( array[3] > 100) count = count +1; if( array[4] > 100) count = count +1; Code is equivalent.

Using While Loops

  • In practice for loops are used more often.
  • Should only be used if the array has a

terminating symbol/flag (like '\0' in strings).

– This may be done with non-character arrays by specifying a special invalid element value. For example if the array recorded the weights

  • f people you could use a negative value.
slide-9
SLIDE 9

9

While Loops

#define END_OF_ARRAY -1.0 //Note that the terminator need not be in the final position. char astring[ ] = { 'h', 'e', 'l', 'l', 'o', '\0', 't', 'h', 'e', 'r', 'e', '\0' }; int i = 0; while( astring[i] != '\0' ) { // prints "hello" putchar( astring[i] ); i++; } double weights[ ] = { 123.0, 203.1, 176.0, 141.0, END_OF_ARRAY } i = 0; while( weights[i] != END_OF_ARRAY ) { //do something. //Note you must increment i or the loop runs forever! }

Higher Dimensional Arrays

  • An array can have more than 1 dimension, they can

have 2, 3, or more.

  • Syntax for creating is similar to 1-dimensional arrays.

// A 1-d array int a[10]; //A 2-d array - perhaps used to store a chess/checker board. int b[8][8]; //A 3-d array int c[3][4][5]; //Higher - you could do this if you wanted to ... why? int e[2][3][4][5][6];

slide-10
SLIDE 10

10

2d-Arrays

  • Easiest to think about the array as storing elements in

rows and columns.

  • First index is the row, second is the column.

// create an array with two // rows and three columns int matrix[2][3];

// To set row 0 column 1 to 7 matrix[0][1] = 7; matrix[0][0] matrix[0][1] matrix[0][2] matrix[1][0] matrix[1][1] matrix[1][2]

Functions

  • For 2d arrays the size of the 2nd dimension

must be supplied when declaring a function (compiler only checks the second dimension).

func1( int array[2][3] ); //OK func2( int array[ ][3] ); // Also OK func3( int array[ ][ ] ); //Not allowed. int a[2][3]; int b[3][3]; //Passing to functions is the same as for 1d arrays func1( a ); //OK same size. func1( b); //Will compile since b has 3 columns, but will likely //cause problems at run time. func2( a ); //OK same size. func2( b ); //OK because b has 3 columns.

slide-11
SLIDE 11

11

Accessing Elements in 2d Arrays

  • You can use 'nested' for loops. For

example the following code sets every element in array2d to 0:

#define ROWS 2 #define COLUMNS 2 int array2d[ROWS][COLUMNS]; int rw, cl; for( rw = 0; rw < ROWS; rw++ ) { for( cl = 0; cl < COLUMNS; cl++ ) { array2d[rw][cl] = 0; } }

3d-Arrays

  • A little trickier to think about, think of levels, rows, and

columns.

  • First index is the level, second is the row, third is the

column (not all elements shown in diagram)

// array with 3 levels, rows // and columns int cube[3][3][3];

// Set centre cell to 5 cube[1][1][1] = 5; [0][0][0] [0][0][1] [0][1][1] [0][1][2] [0][2][2] [0][1][0] [0][0][2] [0][2][0] [0][2][1]

[1][0][0] [2][0][0] [1][0][1] [2][0][1] [2][0][2] [1][0][2] [1][1][2] [2][2][2] [2][1][2] [1][2][2]

Array cube

slide-12
SLIDE 12

12

Functions

  • For 3d arrays the size of the 2nd and 3rd

dimensions must be supplied when declaring a function (only checks these).

func1( int array[2][3][4] ); //OK func2( int array[ ][3][5] ); // Also OK func3( int array[ ][ ][4] ); //Not allowed. int a[2][3][4]; int b[3][3][5]; //Passing to functions is the same as for 1d arrays func1( a ); //OK same size. func2( b); //OK columns and rows are same. func2( a ); //Syntax error a has 3 rows, 4 columns.

Accessing Elements in 3d Arrays

  • Use 'nested' for loops again, gets a bit messy.

#define LEVELS 2 #define ROWS 2 #define COLUMNS 2 int array3d[LEVELS][ROWS][COLUMNS]; int lv, rw, cl; for( lv = 0; lv < LEVELS; lv++) { for( rw = 0; rw < ROWS; rw++ ) { for( cl = 0; cl < COLUMNS; cl++ ) { array2d[lv][rw][cl] = 0; } } }