SlideShare a Scribd company logo
Chapter 4 - Arrays Outline 4.1 Introduction 4.2 Arrays 4.3 Declaring Arrays 4.4 Examples Using Arrays 4.5 Passing Arrays to Functions 4.6 Sorting Arrays 4.7 Case Study: Computing Mean, Median and Mode Using Arrays 4.8 Searching Arrays: Linear Search and Binary Search 4.9 Multiple-Subscripted Arrays
4.1 Introduction Arrays Structures of related data items Static entity (same size throughout program) A few types  Pointer-based arrays (C-like) Arrays as objects (C++)
4.2 Arrays Array Consecutive group of memory locations  Same name and type ( int ,  char , etc.) To refer to an element Specify array name and position number (index) Format: arrayname[ position number ] First element at position 0 N-element array c c[ 0 ] ,  c[ 1 ]  …  c[ n - 1 ] Nth element as position N-1
4.2 Arrays Array elements like other variables Assignment, printing for an integer array  c c[ 0 ] =  3; cout << c[ 0 ]; Can perform operations inside subscript c[ 5 – 2 ]  same as  c[3]
4.2 Arrays c[6] -45 6 0 72 1543 -89 0 62 -3 1 6453 78 Name of array (Note that all elements of this array have the same name,  c ) c[0] c[1] c[2] c[3] c[11] c[10] c[9] c[8] c[7] c[5] c[4] Position number of the element within array  c  
4.3 Declaring Arrays When declaring arrays, specify Name Type of array Any data type Number of elements type arrayName [   arraySize  ]; int c[ 10 ];  // array of 10 integers float d[ 3284 ]; // array of 3284 floats Declaring multiple arrays of same type Use comma separated list, like regular variables int b[ 100 ], x[ 27 ];
4.4 Examples Using Arrays Initializing arrays  For loop Set each element Initializer list Specify each element when array declared int n[ 5 ] = { 1, 2, 3, 4, 5 };  If not enough initializers, rightmost elements 0 If too many syntax error To set every element to same value int n[ 5 ] = { 0 }; If array size omitted, initializers determine size int n[] = { 1, 2, 3, 4, 5 };  5 initializers, therefore 5 element array
fig04_03.cpp (1 of 2) 1  // Fig. 4.3: fig04_03.cpp 2  // Initializing an array. 3  #include  <iostream> 4  5  using  std::cout; 6  using  std::endl; 7  8  #include  <iomanip> 9  10  using  std::setw; 11  12  int  main() 13  { 14  int  n[  10  ];  // n is an array of 10 integers 15  16  // initialize elements of array n to 0  17  for  (  int  i =  0 ; i <  10 ; i++ )  18  n[ i ] =  0 ;  // set element at location i to 0 19  20  cout <<  &quot;Element&quot;  << setw(  13  ) <<  &quot;Value&quot;  << endl; 21  22  // output contents of array n in tabular format  23  for  (  int  j =  0 ; j <  10 ; j++ )  24  cout << setw(  7  ) << j << setw(  13  ) << n[ j ] << endl; 25  Declare a 10-element array of integers. Initialize array to  0  using a for loop. Note that the array has elements  n[0]  to  n[9] .
fig04_03.cpp (2 of 2) fig04_03.cpp output (1 of 1) 26  return   0 ;  // indicates successful termination 27  28  }  // end main Element  Value 0  0 1  0 2  0 3  0 4  0 5  0 6  0 7  0 8  0 9  0
fig04_04.cpp (1 of 1) 1  // Fig. 4.4: fig04_04.cpp 2  // Initializing an array with a declaration. 3  #include  <iostream> 4  5  using  std::cout; 6  using  std::endl; 7  8  #include  <iomanip> 9  10  using  std::setw; 11  12  int  main() 13  { 14  // use initializer list to initialize array n  15  int  n[  10  ] = {  32 ,  27 ,  64 ,  18 ,  95 ,  14 ,  90 ,  70 ,  60 ,  37  }; 16  17  cout <<  &quot;Element&quot;  << setw(  13  ) <<  &quot;Value&quot;  << endl; 18  19  // output contents of array n in tabular format 20  for  (  int  i =  0 ; i <  10 ; i++ ) 21  cout << setw(  7  ) << i << setw(  13  ) << n[ i ] << endl; 22  23  return   0 ;  // indicates successful termination 24  25  }  // end main Note the use of the initializer list.
fig04_04.cpp output (1 of 1) Element  Value 0  32 1  27 2  64 3  18 4  95 5  14 6  90 7  70 8  60 9  37
4.4 Examples Using Arrays Array size Can be specified with constant variable ( const ) const int size = 20; Constants cannot be changed Constants must be initialized when declared Also called named constants or read-only variables
fig04_05.cpp (1 of 2) 1  // Fig. 4.5: fig04_05.cpp 2  // Initialize array s to the even integers from 2 to 20. 3  #include  <iostream> 4  5  using  std::cout; 6  using  std::endl; 7  8  #include  <iomanip> 9  10  using  std::setw; 11  12  int  main() 13  { 14  // constant variable can be used to specify array size 15  const int   arraySize  =  10 ; 16  17  int  s[  arraySize  ];  // array s has 10 elements 18  19  for  (  int  i =  0 ; i <  arraySize ; i++ )  // set the values 20  s[ i ] =  2  +  2  * i;  21  22  cout <<  &quot;Element&quot;  << setw(  13  ) <<  &quot;Value&quot;  << endl; 23  Note use of  const  keyword. Only  const  variables can specify array sizes. The program becomes more scalable when we set the array size using a  const  variable. We can change  arraySize , and all the loops will still work (otherwise, we’d have to update every loop in the program).
fig04_05.cpp (2 of 2) fig04_05.cpp output (1 of 1) 24  // output contents of array s in tabular format 25  for  (  int  j =  0 ; j <  arraySize ; j++ )  26  cout << setw(  7  ) << j << setw(  13  ) << s[ j ] << endl; 27  28  return   0 ;  // indicates successful termination 29  30  }  // end main Element  Value 0  2 1  4 2  6 3  8 4  10 5  12 6  14 7  16 8  18 9  20
fig04_06.cpp (1 of 1) fig04_06.cpp output (1 of 1) 1  // Fig. 4.6: fig04_06.cpp 2  // Using a properly initialized constant variable. 3  #include  <iostream> 4  5  using  std::cout; 6  using  std::endl; 7  8  int  main() 9  { 10  const int   x  =  7 ;  // initialized constant variable 11  12  cout <<  &quot;The value of constant variable x is: &quot; 13  << x << endl; 14  15  return   0 ;  // indicates successful termination 16  17  }  // end main The value of constant variable x is: 7   Proper initialization of  const  variable.
fig04_07.cpp (1 of 1) fig04_07.cpp output (1 of 1) 1  // Fig. 4.7: fig04_07.cpp 2  // A const object must be initialized. 3  4  int  main() 5  { 6  const int x;   // Error: x must be initialized 7  8  x = 7;   // Error: cannot modify a const variable 9  10  return   0 ;  // indicates successful termination 11  12  }  // end main d:\cpphtp4_examples\ch04\Fig04_07.cpp(6) : error C2734: 'x' :   const object must be initialized if not extern d:\cpphtp4_examples\ch04\Fig04_07.cpp(8) : error C2166:  l-value specifies const object   Uninitialized  const  results in a syntax error. Attempting to modify the  const  is another error.
fig04_08.cpp (1 of 1) fig04_08.cpp output (1 of 1) 1  // Fig. 4.8: fig04_08.cpp 2  // Compute the sum of the elements of the array. 3  #include  <iostream> 4  5  using  std::cout; 6  using  std::endl; 7  8  int  main() 9  { 10  const int   arraySize  =  10 ; 11  12  int  a[  arraySize  ] = {  1 ,  2 ,  3 ,  4 ,  5 ,  6 ,  7 ,  8 ,  9 ,  10  }; 13  14  int  total =  0 ; 15  16  // sum contents of array a  17  for  (  int  i =  0 ; i <  arraySize ; i++ ) 18  total += a[ i ];  19  20  cout <<  &quot;Total of array element values is &quot;  << total << endl; 21  22  return   0 ;  // indicates successful termination 23  24  }  // end main Total of array element values is 55
fig04_09.cpp (1 of 2) 1  // Fig. 4.9: fig04_09.cpp 2  // Histogram printing program. 3  #include  <iostream> 4  5  using  std::cout; 6  using  std::endl; 7  8  #include  <iomanip> 9  10  using  std::setw; 11  12  int  main() 13  { 14  const int   arraySize  =  10 ; 15  int  n[  arraySize  ] = {  19 ,  3 ,  15 ,  7 ,  11 ,  9 ,  13 ,  5 ,  17 ,  1  }; 16  17  cout <<  &quot;Element&quot;  << setw(  13  ) <<  &quot;Value&quot; 18  << setw(  17  ) <<  &quot;Histogram&quot;  << endl; 19  20  // for each element of array n, output a bar in histogram 21  for  (  int  i =  0 ; i <  arraySize ; i++ ) { 22  cout << setw(  7  ) << i << setw(  13  ) 23  << n[ i ] << setw(  9  );  24  25  for  (  int  j =  0 ; j < n[ i ]; j++ )  // print one bar 26  cout <<  '*' ;  Prints asterisks corresponding to size of array element,  n[i] .
fig04_09.cpp (2 of 2) fig04_09.cpp output (1 of 1) 27  28  cout << endl;  // start next line of output 29  30  }  // end outer for structure 31  32  return   0 ;  // indicates successful termination 33  34  }  // end main Element  Value  Histogram 0  19  ******************* 1  3  *** 2  15  *************** 3  7  ******* 4  11  *********** 5  9  ********* 6  13  ************* 7  5  ***** 8  17  ***************** 9  1  *
fig04_10.cpp (1 of 2) 1  // Fig. 4.10: fig04_10.cpp 2  // Roll a six-sided die 6000 times. 3  #include  <iostream> 4  5  using  std::cout; 6  using  std::endl; 7  8  #include  <iomanip> 9  10  using  std::setw; 11  12  #include  <cstdlib> 13  #include  <ctime> 14  15  int  main() 16  { 17  const int   arraySize  =  7 ; 18  int  frequency[  arraySize  ] = {  0  }; 19  20  srand( time(  0  ) );  // seed random-number generator 21  22  // roll die 6000 times 23  for  (  int  roll =  1 ; roll <=  6000 ; roll++ )  24  ++frequency[  1  + rand() %  6  ];  // replaces 20-line switch 25  // of Fig. 3.8  Remake of old program to roll dice. An array is used instead of 6 regular variables, and the proper element can be updated easily (without needing a  switch ). This creates a number between 1 and 6, which determines the index of  frequency[]  that should be incremented.
fig04_10.cpp (2 of 2) fig04_10.cpp output (1 of 1) 26  27  cout <<  &quot;Face&quot;  << setw(  13  ) <<  &quot;Frequency&quot;  << endl; 28  29  // output frequency elements 1-6 in tabular format 30  for  (  int  face =  1 ; face <  arraySize ; face++ )  31  cout << setw(  4  ) << face 32  << setw(  13  ) << frequency[ face ] << endl; 33  34  return   0 ;   // indicates successful termination 35  36  }  // end main Face  Frequency 1  1003 2  1004 3  999 4  980 5  1013 6  1001
fig04_11.cpp (1 of 2) 1  // Fig. 4.11: fig04_11.cpp 2  // Student poll program. 3  #include  <iostream> 4  5  using  std::cout; 6  using  std::endl; 7  8  #include  <iomanip> 9  10  using  std::setw; 11  12  int  main() 13  { 14  // define array sizes 15  const int   responseSize  =  40 ;  // size of array responses 16  const int   frequencySize  =  11 ;  // size of array frequency 17  18  // place survey responses in array responses 19  int  responses[  responseSize  ] = {  1 ,  2 ,  6 ,  4 ,  8 ,  5 ,  9 ,  7 ,  8 , 20  10 ,  1 ,  6 ,  3 ,  8 ,  6 ,  10 ,  3 ,  8 ,  2 ,  7 ,  6 ,  5 ,  7 ,  6 ,  8 ,  6 ,  7 , 21  5 ,  6 ,  6 ,  5 ,  6 ,  7 ,  5 ,  6 ,  4 ,  8 ,  6 ,  8 ,  10  }; 22  23  // initialize frequency counters to 0 24  int  frequency[  frequencySize  ] = {  0  }; 25
fig04_11.cpp (2 of 2) 26  // for each answer, select value of an element of array 27  // responses and use that value as subscript in array 28  // frequency to determine element to increment 29  for  (  int  answer =  0 ; answer <  responseSize ; answer++ ) 30  ++frequency[ responses[answer] ]; 31  32  // display results 33  cout <<  &quot;Rating&quot;  << setw(  17  ) <<  &quot;Frequency&quot;  << endl; 34  35  // output frequencies in tabular format 36  for  (  int  rating =  1 ; rating <  frequencySize ; rating++ ) 37  cout << setw(  6  ) << rating 38  << setw(  17  ) << frequency[ rating ] << endl; 39  40  return   0 ;  // indicates successful termination 41  42  }  // end main responses[answer]  is the rating (from 1 to 10). This determines the index in  frequency[]  to increment.
fig04_11.cpp output (1 of 1) Rating  Frequency 1  2 2  2 3  2 4  2 5  5 6  11 7  5 8  7 9  1 10  3
4.4 Examples Using Arrays Strings (more in ch. 5) Arrays of characters All strings end with  null  ( '\0' ) Examples char string1[] = &quot;hello&quot;; Null  character implicitly added string1  has 6 elements  char string1[] = { 'h', 'e', 'l', 'l',  'o', '\0’ }; Subscripting is the same String1[ 0 ]  is  'h' string1[ 2 ]  is  'l'
4.4 Examples Using Arrays Input from keyboard char string2[ 10 ]; cin >> string2; Puts user input in string Stops at first whitespace character Adds  null  character If too much text entered, data written beyond array We want to avoid this (section 5.12 explains how) Printing strings cout << string2 << endl; Does not work for other array types Characters printed until  null  found
fig04_12.cpp (1 of 2) 1  // Fig. 4_12: fig04_12.cpp 2  // Treating character arrays as strings. 3  #include  <iostream> 4  5  using  std::cout; 6  using  std::cin; 7  using  std::endl; 8  9  int  main() 10  { 11  char  string1[  20  ],  // reserves 20 characters 12  char  string2[] =  &quot;string literal&quot; ;  // reserves 15 characters 13  14  // read string from user into array string2 15  cout <<  &quot;Enter the string \&quot;hello there\&quot;: &quot; ; 16  cin >> string1;  // reads &quot;hello&quot; [space terminates input] 17  18  // output strings 19  cout <<  &quot;string1 is: &quot;  << string1  20  <<  &quot;\nstring2 is: &quot;  << string2; 21  22  cout <<  &quot;\nstring1 with spaces between characters is:\n&quot; ; 23  Two different ways to declare strings.  string2  is initialized, and its size determined automatically . Examples of reading strings from the keyboard and printing them out.
fig04_12.cpp (2 of 2) fig04_12.cpp output (1 of 1) 24  // output characters until null character is reached 25  for  (  int  i =  0 ; string1[ i ] !=  '\0' ; i++ ) 26  cout << string1[ i ] <<  ' ' ;  27  28  cin >> string1;  // reads &quot;there&quot; 29  cout <<  &quot;\nstring1 is: &quot;  << string1 << endl; 30  31  return   0 ;  // indicates successful termination 32  33  }  // end main Enter the string &quot;hello there&quot;: hello there string1 is: hello string2 is: string literal string1 with spaces between characters is: h e l l o string1 is: there Can access the characters in a string using array notation. The loop ends when the  null  character is found.
4.4 Examples Using Arrays Recall static storage (chapter 3) If  static , local variables save values between function calls Visible only in function body Can declare local arrays to be static Initialized to zero static int array[3]; If not static Created (and destroyed) in every function call
fig04_13.cpp (1 of 3) 1  // Fig. 4.13: fig04_13.cpp 2  // Static arrays are initialized to zero. 3  #include  <iostream> 4  5  using  std::cout; 6  using  std::endl; 7  8  void  staticArrayInit(  void  );  // function prototype 9  void  automaticArrayInit(  void  );  // function prototype 10  11  int  main() 12  { 13  cout <<  &quot;First call to each function:\n&quot; ; 14  staticArrayInit(); 15  automaticArrayInit(); 16  17  cout <<  &quot;\n\nSecond call to each function:\n&quot; ; 18  staticArrayInit(); 19  automaticArrayInit(); 20  cout << endl; 21  22  return   0 ;  // indicates successful termination 23  24  }  // end main 25
fig04_13.cpp (2 of 3) 26  // function to demonstrate a static local array 27  void  staticArrayInit(  void  ) 28  { 29  // initializes elements to 0 first time function is called 30  static int  array1[  3  ];  31  32  cout <<  &quot;\nValues on entering staticArrayInit:\n&quot; ; 33  34  // output contents of array1 35  for  (  int  i =  0 ; i <  3 ; i++ ) 36  cout <<  &quot;array1[&quot;  << i <<  &quot;] = &quot;  << array1[ i ] <<  &quot;  &quot; ; 37  38  cout <<  &quot;\nValues on exiting staticArrayInit:\n&quot; ; 39  40  // modify and output contents of array1 41  for  (  int  j =  0 ; j <  3 ; j++ ) 42  cout <<  &quot;array1[&quot;  << j <<  &quot;] = &quot;  43  << ( array1[ j ] +=  5  ) <<  &quot;  &quot; ; 44  45  }  // end function staticArrayInit 46  Static array, initialized to zero on first function call. Array data is changed; the modified values stay.
fig04_13.cpp (3 of 3) 47  // function to demonstrate an automatic local array 48  void  automaticArrayInit(  void  ) 49  { 50  // initializes elements each time function is called 51  int  array2[  3  ] = {  1 ,  2 ,  3  }; 52  53  cout <<  &quot;\n\nValues on entering automaticArrayInit:\n&quot; ; 54  55  // output contents of array2 56  for  (  int  i =  0 ; i <  3 ; i++ ) 57  cout <<  &quot;array2[&quot;  << i <<  &quot;] = &quot;  << array2[ i ] <<  &quot;  &quot; ; 58  59  cout <<  &quot;\nValues on exiting automaticArrayInit:\n&quot; ; 60  61  // modify and output contents of array2 62  for  (  int  j =  0 ; j <  3 ; j++ ) 63  cout <<  &quot;array2[&quot;  << j <<  &quot;] = &quot;   64  << ( array2[ j ] +=  5  ) <<  &quot;  &quot; ; 65  66  }  // end function automaticArrayInit Automatic array, recreated with every function call. Although the array is changed, it will be destroyed when the function exits and the changes will be lost.
fig04_13.cpp output (1 of 1) First call to each function:   Values on entering staticArrayInit: array1[0] = 0  array1[1] = 0  array1[2] = 0 Values on exiting staticArrayInit: array1[0] = 5  array1[1] = 5  array1[2] = 5   Values on entering automaticArrayInit: array2[0] = 1  array2[1] = 2  array2[2] = 3 Values on exiting automaticArrayInit: array2[0] = 6  array2[1] = 7  array2[2] = 8   Second call to each function:   Values on entering staticArrayInit: array1[0] = 5  array1[1] = 5  array1[2] = 5 Values on exiting staticArrayInit: array1[0] = 10  array1[1] = 10  array1[2] = 10   Values on entering automaticArrayInit: array2[0] = 1  array2[1] = 2  array2[2] = 3 Values on exiting automaticArrayInit: array2[0] = 6  array2[1] = 7  array2[2] = 8
4.5 Passing Arrays to Functions Specify name without brackets  To pass array  myArray   to  myFunction int myArray[ 24 ];  myFunction( myArray, 24 ); Array size usually passed, but not required Useful to iterate over all elements
4.5 Passing Arrays to Functions Arrays passed-by-reference  Functions can modify original array data Value of name of array is address of first element Function knows where the array is stored Can change original memory locations Individual array elements passed-by-value Like regular variables square( myArray[3] );
4.5 Passing Arrays to Functions Functions taking arrays Function prototype void modifyArray( int b[], int arraySize ); void modifyArray( int [], int ); Names optional in prototype Both take an integer array and a single integer No need for array size between brackets Ignored by compiler If declare array parameter as  const Cannot be modified (compiler error) void doNotModify( const int [] );
fig04_14.cpp (1 of 3) 1  // Fig. 4.14: fig04_14.cpp 2  // Passing arrays and individual array elements to functions. 3  #include  <iostream> 4  5  using  std::cout; 6  using  std::endl; 7  8  #include  <iomanip> 9  10  using  std::setw; 11  12  void  modifyArray(  int  [],  int  );  // appears strange 13  void  modifyElement(  int  );  14  15  int  main() 16  { 17  const int   arraySize  =  5 ;  // size of array a 18  int  a[  arraySize  ] = {  0 ,  1 ,  2 ,  3 ,  4  };  // initialize a 19  20  cout <<  &quot;Effects of passing entire array by reference:&quot;   21  <<  &quot;\n\nThe values of the original array are:\n&quot; ; 22  23  // output original array 24  for  (  int  i =  0 ; i <  arraySize ; i++ ) 25  cout << setw(  3  ) << a[ i ]; Syntax for accepting an array in parameter list.
fig04_14.cpp (2 of 3) 26  27  cout << endl; 28  29  // pass array a to modifyArray by reference 30  modifyArray( a,  arraySize  );  31  32  cout <<  &quot;The values of the modified array are:\n&quot; ; 33  34  // output modified array 35  for  (  int  j =  0 ; j <  arraySize ; j++ ) 36  cout << setw(  3  ) << a[ j ]; 37  38  // output value of a[ 3 ] 39  cout <<  &quot;\n\n\n&quot; 40  <<  &quot;Effects of passing array element by value:&quot; 41  <<  &quot;\n\nThe value of a[3] is &quot;  << a[  3  ] <<  '\n' ; 42  43  // pass array element a[ 3 ] by value 44  modifyElement( a[  3  ] );  45  46  // output value of a[ 3 ] 47  cout <<  &quot;The value of a[3] is &quot;  << a[  3  ] << endl; 48  49  return   0 ;  // indicates successful termination 50  51  }  // end main Pass array name ( a ) and size to function. Arrays are passed-by-reference. Pass a single array element by value; the original cannot be modified.
fig04_14.cpp (3 of 3) 52  53  // in function modifyArray, &quot;b&quot; points to  54  // the original array &quot;a&quot; in memory  55  void  modifyArray(  int  b[],  int  sizeOfArray ) 56  {  57  // multiply each array element by 2  58  for (  int  k =  0 ; k < sizeOfArray; k++ )  59  b[ k ] *=  2 ;  60  61  }  // end function modifyArray  62  63  // in function modifyElement, &quot;e&quot; is a local copy of 64  // array element a[ 3 ] passed from main  65  void  modifyElement(  int  e )  66  {  67  // multiply parameter by 2  68  cout <<  &quot;Value in modifyElement is &quot;  69  << ( e *=  2  ) << endl;  70  71  }  // end function modifyElement  Although named  b , the array points to the original array  a . It can modify  a ’s data. Individual array elements are passed by value, and the originals cannot be changed.
fig04_14.cpp output (1 of 1) Effects of passing entire array by reference:   The values of the original array are: 0  1  2  3  4 The values of the modified array are: 0  2  4  6  8     Effects of passing array element by value:   The value of a[3] is 6 Value in modifyElement is 12 The value of a[3] is 6
fig04_15.cpp (1 of 2) 1  // Fig. 4.15: fig04_15.cpp 2  // Demonstrating the const type qualifier. 3  #include  <iostream> 4  5  using  std::cout; 6  using  std::endl; 7  8  void  tryToModifyArray(  const int  [] );  // function prototype 9  10  int  main() 11  { 12  int  a[] = {  10 ,  20 ,  30  }; 13  14  tryToModifyArray( a ); 15  16  cout << a[  0  ] <<  ' '  << a[  1  ] <<  ' '  << a[  2  ] <<  '\n' ; 17  18  return   0 ;  // indicates successful termination 19  20  }  // end main 21  Array parameter declared as  const . Array cannot be modified, even though it is passed by reference.
fig04_15.cpp (2 of 2) fig04_15.cpp output (1 of 1) 22  // In function tryToModifyArray, &quot;b&quot; cannot be used 23  // to modify the original array &quot;a&quot; in main.  24  void  tryToModifyArray(  const   int  b[] )  25  {  26  b[  0  ] /=  2 ;  // error  27  b[  1  ] /=  2 ;  // error  28  b[  2  ] /=  2 ;  // error  29  30  }  // end function tryToModifyArray  d:\cpphtp4_examples\ch04\Fig04_15.cpp(26) : error C2166:   l-value specifies const object d:\cpphtp4_examples\ch04\Fig04_15.cpp(27) : error C2166:    l-value specifies const object d:\cpphtp4_examples\ch04\Fig04_15.cpp(28) : error C2166:    l-value specifies const object
4.6 Sorting Arrays Sorting data Important computing application Virtually every organization must sort some data  Massive amounts must be sorted Bubble sort (sinking sort)  Several passes through the array  Successive pairs of elements are compared  If increasing order (or identical), no change If decreasing order, elements exchanged Repeat these steps for every element
4.6 Sorting Arrays Example: Go left to right, and exchange elements as necessary One pass for each element Original:  3  4  2  7  6 Pass 1:  3  2  4   6  7   (elements exchanged) Pass 2:  2  3   4  6  7  Pass 3:  2  3  4  6  7  (no changes needed) Pass 4:  2  3  4  6  7  Pass 5:  2  3  4  6  7  Small elements &quot;bubble&quot; to the top (like 2 in this example)
4.6 Sorting Arrays Swapping variables int x = 3, y = 4; y = x; x = y; What happened? Both x and y are 3! Need a temporary variable Solution int x = 3, y = 4, temp = 0; temp = x;  // temp gets 3 x = y;  // x gets 4 y = temp;  // y gets 3
fig04_16.cpp (1 of 3) 1  // Fig. 4.16: fig04_16.cpp 2  // This program sorts an array's values into ascending order. 3  #include  <iostream> 4  5  using  std::cout; 6  using  std::endl; 7  8  #include  <iomanip> 9  10  using  std::setw; 11  12  int  main() 13  { 14  const int   arraySize  =  10 ;  // size of array a 15  int  a[  arraySize  ] = {  2 ,  6 ,  4 ,  8 ,  10 ,  12 ,  89 ,  68 ,  45 ,  37  }; 16  int  hold;  // temporary location used to swap array elements 17  18  cout <<  &quot;Data items in original order\n&quot; ; 19  20  // output original array 21  for  (  int  i =  0 ; i <  arraySize ; i++ ) 22  cout << setw(  4  ) << a[ i ]; 23
fig04_16.cpp (2 of 3) 24  // bubble sort  25  // loop to control number of passes  26  for  (  int  pass =  0 ; pass <  arraySize  -  1 ; pass++ )  27  28  // loop to control number of comparisons per pass  29  for  (  int  j =  0 ; j <  arraySize  -  1 ; j++ )  30  31  // compare side-by-side elements and swap them if 32  // first element is greater than second element  33  if  ( a[ j ] > a[ j +  1  ] ) {  34  hold = a[ j ];  35  a[ j ] = a[ j +  1  ];  36  a[ j +  1  ] = hold;  37  38  }  // end if  39  Do a pass for each element in the array. If the element on the left (index  j ) is larger than the element on the right (index  j + 1 ), then we swap them. Remember the need of a temp variable.
fig04_16.cpp (3 of 3) fig04_16.cpp output (1 of 1) 40  cout <<  &quot;\nData items in ascending order\n&quot; ; 41  42  // output sorted array 43  for  (  int  k =  0 ; k <  arraySize ; k++ ) 44  cout << setw(  4  ) << a[ k ]; 45  46  cout << endl; 47  48  return   0 ;  // indicates successful termination 49  50  }  // end main Data items in original order 2  6  4  8  10  12  89  68  45  37 Data items in ascending order 2  4  6  8  10  12  37  45  68  89
4.7 Case Study: Computing Mean, Median and Mode Using Arrays Mean Average (sum/number of elements) Median Number in middle of sorted list 1, 2, 3, 4, 5  (3 is median) If even number of elements, take average of middle two Mode Number that occurs most often 1, 1, 1, 2, 3, 3, 4, 5 (1 is mode)
fig04_17.cpp (1 of 8) 1  // Fig. 4.17: fig04_17.cpp 2  // This program introduces the topic of survey data analysis. 3  // It computes the mean, median, and mode of the data. 4  #include  <iostream> 5  6  using  std::cout; 7  using  std::endl; 8  using  std::fixed; 9  using  std::showpoint; 10  11  #include  <iomanip> 12  13  using  std::setw; 14  using  std::setprecision; 15  16  void  mean(  const   int  [],  int  ); 17  void  median(  int  [],  int  ); 18  void  mode(  int  [],  int  [],  int  ); 19  void  bubbleSort(  int [],  int  ); 20  void  printArray(  const   int [],  int  ); 21  22  int  main() 23  { 24  const int  responseSize =  99 ;  // size of array responses 25
fig04_17.cpp (2 of 8) 26  int  frequency[  10  ] = {  0  };  // initialize array frequency 27  28  // initialize array responses 29  int  response[ responseSize ] =  30  {  6 ,  7 ,  8 ,  9 ,  8 ,  7 ,  8 ,  9 ,  8 ,  9 , 31  7 ,  8 ,  9 ,  5 ,  9 ,  8 ,  7 ,  8 ,  7 ,  8 , 32  6 ,  7 ,  8 ,  9 ,  3 ,  9 ,  8 ,  7 ,  8 ,  7 , 33  7 ,  8 ,  9 ,  8 ,  9 ,  8 ,  9 ,  7 ,  8 ,  9 , 34  6 ,  7 ,  8 ,  7 ,  8 ,  7 ,  9 ,  8 ,  9 ,  2 , 35  7 ,  8 ,  9 ,  8 ,  9 ,  8 ,  9 ,  7 ,  5 ,  3 , 36  5 ,  6 ,  7 ,  2 ,  5 ,  3 ,  9 ,  4 ,  6 ,  4 , 37  7 ,  8 ,  9 ,  6 ,  8 ,  7 ,  8 ,  9 ,  7 ,  8 , 38  7 ,  4 ,  4 ,  2 ,  5 ,  3 ,  8 ,  7 ,  5 ,  6 , 39  4 ,  5 ,  6 ,  1 ,  6 ,  5 ,  7 ,  8 ,  7  }; 40  41  // process responses 42  mean( response, responseSize ); 43  median( response, responseSize ); 44  mode( frequency, response, responseSize ); 45  46  return   0 ;  // indicates successful termination 47  48  }  // end main 49
fig04_17.cpp (3 of 8) 50  // calculate average of all response values 51  void  mean(  const int  answer[],  int  arraySize ) 52  { 53  int  total =  0 ; 54  55  cout <<  &quot;********\n  Mean\n********\n&quot; ; 56  57  // total response values 58  for  (  int  i =  0 ; i < arraySize; i++ ) 59  total += answer[ i ]; 60  61  // format and output results 62  cout << fixed << setprecision(  4  ); 63  64  cout <<  &quot;The mean is the average value of the data\n&quot; 65  <<  &quot;items. The mean is equal to the total of\n&quot; 66  <<  &quot;all the data items divided by the number\n&quot; 67  <<  &quot;of data items (&quot;  << arraySize  68  <<  &quot;). The mean value for\nthis run is: &quot;  69  << total <<  &quot; / &quot;  << arraySize <<  &quot; = &quot; 70  <<  static_cast <  double  >( total ) / arraySize  71  <<  &quot;\n\n&quot; ; 72  73  }  // end function mean 74  We cast to a double to get decimal points for the average (instead of an integer).
fig04_17.cpp (4 of 8) 75  // sort array and determine median element's value 76  void  median(  int  answer[],  int  size ) 77  { 78  cout <<  &quot;\n********\n Median\n********\n&quot; 79  <<  &quot;The unsorted array of responses is&quot; ; 80  81  printArray( answer, size );  // output unsorted array 82  83  bubbleSort( answer, size );  // sort array 84  85  cout <<  &quot;\n\nThe sorted array is&quot; ; 86  printArray( answer, size );  // output sorted array  87  88  // display median element 89  cout <<  &quot;\n\nThe median is element &quot;  << size /  2 90  <<  &quot; of\nthe sorted &quot;  << size  91  <<  &quot; element array.\nFor this run the median is &quot; 92  << answer[ size /  2  ] <<  &quot;\n\n&quot; ; 93  94  }  // end function median 95  Sort array by passing it to a function. This keeps the program modular.
fig04_17.cpp (5 of 8) 96  // determine most frequent response 97  void  mode(  int  freq[],  int  answer[],  int  size ) 98  { 99  int  largest =  0 ;  // represents largest frequency 100  int  modeValue =  0 ;  // represents most frequent response 101  102  cout <<  &quot;\n********\n  Mode\n********\n&quot; ; 103  104  // initialize frequencies to 0 105  for  (  int  i =  1 ; i <=  9 ; i++ ) 106  freq[ i ] =  0 ; 107  108  // summarize frequencies 109  for  (  int  j =  0 ; j < size; j++ ) 110  ++freq[ answer[ j ] ]; 111  112  // output headers for result columns 113  cout <<  &quot;Response&quot;  << setw(  11  ) <<  &quot;Frequency&quot; 114  << setw(  19  ) <<  &quot;Histogram\n\n&quot;  << setw(  55  ) 115  <<  &quot;1  1  2  2\n&quot;  << setw(  56  ) 116  <<  &quot;5  0  5  0  5\n\n&quot; ; 117
fig04_17.cpp (6 of 8) 118  // output results 119  for  (  int  rating =  1 ; rating <=  9 ; rating++ ) { 120  cout << setw(  8  ) << rating << setw(  11  ) 121  << freq[ rating ] <<  &quot;  &quot; ; 122  123  // keep track of mode value and largest fequency value 124  if  ( freq[ rating ] > largest ) {  125  largest = freq[ rating ];  126  modeValue = rating;  127  128  }  // end if  129  130  // output histogram bar representing frequency value 131  for  (  int  k =  1 ; k <= freq[ rating ]; k++ ) 132  cout <<  '*' ; 133  134  cout <<  '\n' ;  // begin new line of output 135  136  }  // end outer for 137  138  // display the mode value 139  cout <<  &quot;The mode is the most frequent value.\n&quot; 140  <<  &quot;For this run the mode is &quot;  << modeValue 141  <<  &quot; which occurred &quot;  << largest <<  &quot; times.&quot;  << endl; 142  143  }  // end function mode The mode is the value that occurs most often (has the highest value in  freq ).
fig04_17.cpp (7 of 8) 144  145  // function that sorts an array with bubble sort algorithm 146  void  bubbleSort(  int  a[],  int  size ) 147  { 148  int  hold;  // temporary location used to swap elements 149  150  // loop to control number of passes 151  for  (  int  pass =  1 ; pass < size; pass++ ) 152  153  // loop to control number of comparisons per pass 154  for  (  int  j =  0 ; j < size -  1 ; j++ ) 155  156  // swap elements if out of order 157  if  ( a[ j ] > a[ j +  1  ] ) { 158  hold = a[ j ]; 159  a[ j ] = a[ j +  1  ]; 160  a[ j +  1  ] = hold; 161  162  }  // end if 163  164  }  // end function bubbleSort 165
fig04_17.cpp (8 of 8) 166  // output array contents (20 values per row) 167  void  printArray(  const   int  a[],  int  size ) 168  { 169  for  (  int  i =  0 ; i < size; i++ ) { 170  171  if  ( i %  20  ==  0  )  // begin new line every 20 values 172  cout << endl; 173  174  cout << setw(  2  ) << a[ i ]; 175  176  }  // end for 177  178  }  // end function printArray
fig04_17.cpp output (1 of 2) ******** Mean ******** The mean is the average value of the data items. The mean is equal to the total of all the data items divided by the number of data items (99). The mean value for this run is: 681 / 99 = 6.8788   ******** Median ******** The unsorted array of responses is 6 7 8 9 8 7 8 9 8 9 7 8 9 5 9 8 7 8 7 8 6 7 8 9 3 9 8 7 8 7 7 8 9 8 9 8 9 7 8 9 6 7 8 7 8 7 9 8 9 2 7 8 9 8 9 8 9 7 5 3 5 6 7 2 5 3 9 4 6 4 7 8 9 6 8 7 8 9 7 8 7 4 4 2 5 3 8 7 5 6 4 5 6 1 6 5 7 8 7   The sorted array is 1 2 2 2 3 3 3 3 4 4 4 4 4 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9   The median is element 49 of the sorted 99 element array. For this run the median is 7
fig04_17.cpp output (2 of 2) ******** Mode ******** Response  Frequency  Histogram   1  1  2  2 5  0  5  0  5   1  1  * 2  3  *** 3  4  **** 4  5  ***** 5  8  ******** 6  9  ********* 7  23  *********************** 8  27  *************************** 9  19  ******************* The mode is the most frequent value. For this run the mode is 8 which occurred 27 times.
4.8 Searching Arrays: Linear Search and Binary Search Search array for a key value Linear search Compare each element of array with key value Start at one end, go to other Useful for small and unsorted arrays Inefficient If search key not present, examines every element
4.8 Searching Arrays: Linear Search and Binary Search Binary search Only used with sorted arrays Compare middle element with key If equal, match found If key < middle Repeat search on first half of array If key > middle Repeat search on last half Very fast  At most N steps, where 2  > # of elements 30 element array takes at most 5 steps 2  >  30 N 5
fig04_19.cpp (1 of 2) 1  // Fig. 4.19: fig04_19.cpp 2  // Linear search of an array. 3  #include  <iostream> 4  5  using  std::cout; 6  using  std::cin; 7  using  std::endl; 8  9  int  linearSearch(  const int  [],  int ,  int  );  // prototype 10  11  int  main() 12  { 13  const int   arraySize  =  100 ;  // size of array a 14  int  a[  arraySize  ];  // create array a 15  int  searchKey;  // value to locate in a 16  17  for  (  int  i =  0 ; i <  arraySize ; i++ )  // create some data 18  a[ i ] =  2  * i; 19  20  cout <<  &quot;Enter integer search key: &quot; ; 21  cin >> searchKey; 22  23  // attempt to locate searchKey in array a  24  int  element = linearSearch( a, searchKey,  arraySize  ); 25  Takes array, search key, and array size.
fig04_19.cpp (2 of 2) 26  // display results 27  if  ( element !=  -1  ) 28  cout <<  &quot;Found value in element &quot;  << element << endl; 29  else 30  cout <<  &quot;Value not found&quot;  << endl; 31  32  return   0 ;  // indicates successful termination 33  34  }  // end main 35  36  // compare key to every element of array until location is  37  // found or until end of array is reached; return subscript of  38  // element if key or -1 if key not found  39  int  linearSearch(  const int  array[],  int  key,  int  sizeOfArray ) 40  {  41  for  (  int  j =  0 ; j < sizeOfArray; j++ )  42  43  if  ( array[ j ] == key )  // if found,  44  return  j;  // return location of key  45  46  return  -1 ;  // key not found  47  48  }  // end function linearSearch
fig04_19.cpp output (1 of 1) Enter integer search key: 36 Found value in element 18 Enter integer search key: 37 Value not found
fig04_20.cpp (1 of 6) 1  // Fig. 4.20: fig04_20.cpp 2  // Binary search of an array. 3  #include  <iostream> 4  5  using  std::cout; 6  using  std::cin; 7  using  std::endl; 8  9  #include  <iomanip> 10  11  using  std::setw; 12  13  // function prototypes 14  int  binarySearch(  const int  [],  int ,  int ,  int ,  int  ); 15  void  printHeader(  int  ); 16  void  printRow(  const int  [],  int ,  int ,  int ,  int  ); 17  18  int  main() 19  { 20  const int   arraySize  =  15 ;  // size of array a 21  int  a[  arraySize  ];  // create array a 22  int  key;  // value to locate in a 23  24  for  (  int  i =  0 ; i <  arraySize ; i++ )  // create some data 25  a[ i ] =  2  * i;  26
fig04_20.cpp (2 of 6) 27  cout <<  &quot;Enter a number between 0 and 28: &quot; ; 28  cin >> key; 29  30  printHeader(  arraySize  ); 31  32  // search for key in array a 33  int  result =  34  binarySearch( a, key,  0 ,  arraySize  -  1 ,  arraySize  ); 35  36  // display results 37  if  ( result !=  -1  ) 38  cout <<  '\n'  << key <<  &quot; found in array element &quot; 39  << result << endl; 40  else 41  cout <<  '\n'  << key <<  &quot; not found&quot;  << endl; 42  43  return   0 ;  // indicates successful termination 44  45  }  // end main 46
fig04_20.cpp (3 of 6) 47  // function to perform binary search of an array 48  int  binarySearch(  const int  b[],  int  searchKey,  int  low,  49  int  high,  int  size ) 50  { 51  int  middle; 52  53  // loop until low subscript is greater than high subscript 54  while ( low <= high ) { 55  56  // determine middle element of subarray being searched 57  middle = ( low + high ) /  2 ;  58  59  // display subarray used in this loop iteration 60  printRow( b, low, middle, high, size ); 61  Determine middle element
fig04_20.cpp (4 of 6) 62  // if searchKey matches middle element, return middle 63  if  ( searchKey == b[ middle ] )  // match 64  return  middle; 65  66  else   67  68  // if searchKey less than middle element,  69  // set new high element 70  if  ( searchKey < b[ middle ] ) 71  high = middle -  1 ;  // search low end of array 72  73  // if searchKey greater than middle element,  74  // set new low element 75  else 76  low = middle +  1 ;  // search high end of array 77  } 78  79  return   -1 ;  // searchKey not found 80  81  }  // end function binarySearch Use the rule of binary search: If key equals middle, match If less, search low end If greater, search high end Loop sets low, middle and high dynamically. If searching the high end, the new low is the element above the middle.
fig04_20.cpp (5 of 6) 82  83  // print header for output 84  void  printHeader(  int  size ) 85  { 86  cout <<  &quot;\nSubscripts:\n&quot; ; 87  88  // output column heads 89  for  (  int  j =  0 ; j < size; j++ ) 90  cout << setw(  3  ) << j <<  ' ' ; 91  92  cout <<  '\n' ;  // start new line of output 93  94  // output line of - characters 95  for  (  int  k =  1 ; k <=  4  * size; k++ ) 96  cout <<  '-' ; 97  98  cout << endl;  // start new line of output 99  100  }  // end function printHeader 101
fig04_20.cpp (6 of 6) 102  // print one row of output showing the current 103  // part of the array being processed 104  void  printRow(  const   int  b[],  int  low,  int  mid,  105  int  high,  int  size ) 106  { 107  // loop through entire array 108  for  (  int  m =  0 ; m < size; m++ ) 109  110  // display spaces if outside current subarray range 111  if  ( m < low || m > high ) 112  cout <<  &quot;  &quot; ; 113  114  // display middle element marked with a * 115  else   116  117  if  ( m == mid )  // mark middle value 118  cout << setw(  3  ) << b[ m ] <<  '*' ;  119  120  // display other elements in subarray 121  else 122  cout << setw(  3  ) << b[ m ] <<  ' ' ; 123  124  cout << endl;  // start new line of output 125  126  }  // end function printRow
fig04_20.cpp output (1 of 2)   Enter a number between 0 and 28: 6   Subscripts: 0  1  2  3  4  5  6  7  8  9  10  11  12  13  14 ------------------------------------------------------------ 0  2  4  6  8  10  12  14* 16  18  20  22  24  26  28 0  2  4  6*  8  10  12   6 found in array element 3       Enter a number between 0 and 28: 25   Subscripts: 0  1  2  3  4  5  6  7  8  9  10  11  12  13  14 ------------------------------------------------------------ 0  2  4  6  8  10  12  14* 16  18  20  22  24  26  28 16  18  20  22* 24  26  28 24  26* 28 24*   25 not found
fig04_20.cpp output (2 of 2) Enter a number between 0 and 28: 8   Subscripts: 0  1  2  3  4  5  6  7  8  9  10  11  12  13  14 ------------------------------------------------------------ 0  2  4  6  8  10  12  14* 16  18  20  22  24  26  28 0  2  4  6*  8  10  12 8  10* 12 8*   8 found in array element 4
4.9 Multiple-Subscripted Arrays Multiple subscripts  a[ i ][ j ] Tables with rows and columns Specify row, then column “Array of arrays” a[0]  is an array of 4 elements a[0][0]  is the first element of that array Row subscript Array name Column subscript Row 0 Row 1 Row 2 Column 0 Column 1 Column 2 Column 3 a[ 0 ][ 0 ] a[ 1 ][ 0 ] a[ 2 ][ 0 ] a[ 0 ][ 1 ] a[ 1 ][ 1 ] a[ 2 ][ 1 ] a[ 0 ][ 2 ] a[ 1 ][ 2 ] a[ 2 ][ 2 ] a[ 0 ][ 3 ] a[ 1 ][ 3 ] a[ 2 ][ 3 ]
4.9 Multiple-Subscripted Arrays To initialize Default of  0 Initializers grouped by row in braces int b[ 2 ][ 2 ] = { { 1, 2 }, { 3, 4 } }; int b[ 2 ][ 2 ] = { { 1 }, { 3, 4 } };  Row 0 Row 1 1  2 3  4 1  0 3  4
4.9 Multiple-Subscripted Arrays Referenced like normal cout << b[ 0 ][ 1 ]; Outputs  0 Cannot reference using commas cout << b[ 0, 1 ]; Syntax error Function prototypes Must specify sizes of subscripts First subscript not necessary, as with single-scripted arrays void printArray( int [][ 3 ] ); 1  0 3  4
fig04_22.cpp (1 of 2) 1  // Fig. 4.22: fig04_22.cpp 2  // Initializing multidimensional arrays. 3  #include  <iostream> 4  5  using  std::cout; 6  using  std::endl; 7  8  void  printArray(  int  [][  3  ] ); 9  10  int  main() 11  { 12  int  array1[  2  ][  3  ] = { {  1 ,  2 ,  3  }, {  4 ,  5 ,  6  } }; 13  int  array2[  2  ][  3  ] = {  1 ,  2 ,  3 ,  4 ,  5  };  14  int  array3[  2  ][  3  ] = { {  1 ,  2  }, {  4  } };  15  16  cout <<  &quot;Values in array1 by row are:&quot;  << endl; 17  printArray( array1 ); 18  19  cout <<  &quot;Values in array2 by row are:&quot;  << endl; 20  printArray( array2 ); 21  22  cout <<  &quot;Values in array3 by row are:&quot;  << endl; 23  printArray( array3 ); 24  25  return   0 ;  // indicates successful termination 26  27  }  // end main Note the various initialization styles. The elements in  array2  are assigned to the first row and then the second. Note the format of the prototype.
fig04_22.cpp (2 of 2) fig04_22.cpp output (1 of 1) 28  29  // function to output array with two rows and three columns  30  void  printArray(  int  a[][  3  ] )  31  {  32  for  (  int  i =  0 ; i <  2 ; i++ ) {  // for each row  33  34  for  (  int  j =  0 ; j <  3 ; j++ )  // output column values 35  cout << a[ i ][ j ] <<  ' ' ;  36  37  cout << endl;  // start new line of output  38  39  }  // end outer for structure  40  41  }  // end function printArray  Values in array1 by row are: 1 2 3 4 5 6 Values in array2 by row are: 1 2 3 4 5 0 Values in array3 by row are: 1 2 0 4 0 0 For loops are often used to iterate through arrays. Nested loops are helpful with multiple-subscripted arrays.
4.9 Multiple-Subscripted Arrays Next: program showing initialization After, program to keep track of students grades Multiple-subscripted array (table) Rows are students Columns are grades 95  85 89  80 Quiz1 Quiz2 Student0 Student1
fig04_23.cpp (1 of 6) 1  // Fig. 4.23: fig04_23.cpp 2  // Double-subscripted array example. 3  #include  <iostream> 4  5  using  std::cout; 6  using  std::endl; 7  using  std::fixed; 8  using  std::left; 9  10  #include  <iomanip> 11  12  using  std::setw; 13  using  std::setprecision; 14  15  const   int   students  =  3 ;  // number of students 16  const   int   exams  =  4 ;  // number of exams 17  18  // function prototypes 19  int  minimum(  int  [][  exams  ],  int ,  int  ); 20  int  maximum(  int  [][  exams  ],  int ,  int  ); 21  double  average(  int  [],  int  ); 22  void  printArray(  int  [][  exams  ],  int ,  int  ); 23
fig04_23.cpp (2 of 6) 24  int  main() 25  { 26  // initialize student grades for three students (rows) 27  int  studentGrades[  students  ][  exams  ] =  28  { {  77 ,  68 ,  86 ,  73  }, 29  {  96 ,  87 ,  89 ,  78  }, 30  {  70 ,  90 ,  86 ,  81  } }; 31  32  // output array studentGrades 33  cout <<  &quot;The array is:\n&quot; ; 34  printArray( studentGrades,  students ,  exams  ); 35  36  // determine smallest and largest grade values 37  cout <<  &quot;\n\nLowest grade: &quot; 38  << minimum( studentGrades,  students ,  exams  )  39  <<  &quot;\nHighest grade: &quot; 40  << maximum( studentGrades,  students ,  exams  ) <<  '\n' ; 41  42  cout << fixed << setprecision(  2  ); 43
fig04_23.cpp (3 of 6) 44  // calculate average grade for each student 45  for  (  int  person =  0 ; person < students; person++ ) 46  cout <<  &quot;The average grade for student &quot;  << person  47  <<  &quot; is &quot;  48  << average( studentGrades[ person ],  exams  )  49  << endl; 50  51  return   0 ;  // indicates successful termination 52  53  }  // end main 54  55  // find minimum grade 56  int  minimum(  int  grades[][  exams  ],  int  pupils,  int  tests ) 57  { 58  int  lowGrade =  100 ;  // initialize to highest possible grade 59  60  for  (  int  i =  0 ; i < pupils; i++ )  61  62  for  (  int  j =  0 ; j < tests; j++ )  63  64  if  ( grades[ i ][ j ] < lowGrade ) 65  lowGrade = grades[ i ][ j ]; 66  67  return  lowGrade; 68  69  }  // end function minimum Determines the average for one student. We pass the array/row containing the student’s grades. Note that  studentGrades[0]  is itself an array.
fig04_23.cpp (4 of 6) 70  71  // find maximum grade 72  int  maximum(  int  grades[][  exams  ],  int  pupils,  int  tests ) 73  { 74  int  highGrade =  0 ;  // initialize to lowest possible grade 75  76  for  (  int  i =  0 ; i < pupils; i++ ) 77  78  for  (  int  j =  0 ; j < tests; j++ ) 79  80  if  ( grades[ i ][ j ] > highGrade ) 81  highGrade = grades[ i ][ j ]; 82  83  return  highGrade; 84  85  }  // end function maximum 86
fig04_23.cpp (5 of 6) 87  // determine average grade for particular student  88  double  average(  int  setOfGrades[],  int  tests )  89  {  90  int  total =  0 ;  91  92  // total all grades for one student  93  for  (  int  i =  0 ; i < tests; i++ )  94  total += setOfGrades[ i ];  95  96  return   static_cast <  double  >( total ) / tests;  // average 97  98  }  // end function maximum
fig04_23.cpp (6 of 6) 99  100  // Print the array 101  void  printArray(  int  grades[][ exams ],  int  pupils,  int  tests ) 102  { 103  // set left justification and output column heads 104  cout << left <<  &quot;  [0]  [1]  [2]  [3]&quot; ; 105  106  // output grades in tabular format 107  for  (  int  i =  0 ; i < pupils; i++ ) { 108  109  // output label for row 110  cout <<  &quot;\nstudentGrades[&quot;  << i <<  &quot;] &quot; ; 111  112  // output one grades for one student 113  for  (  int  j =  0 ; j < tests; j++ ) 114  cout << setw(  5  ) << grades[ i ][ j ]; 115  116  }  // end outer for 117  118  }  // end function printArray
fig04_23.cpp output (1 of 1) The array is: [0]  [1]  [2]  [3] studentGrades[0] 77  68  86  73 studentGrades[1] 96  87  89  78 studentGrades[2] 70  90  86  81   Lowest grade: 68 Highest grade: 96 The average grade for student 0 is 76.00 The average grade for student 1 is 87.50 The average grade for student 2 is 81.75

More Related Content

PDF
Programming Fundamentals Arrays and Strings
PPT
PPTX
Arrays in C language
PDF
Multi dimensional array
PDF
Array notes
PPTX
Array Introduction One-dimensional array Multidimensional array
PPT
PPT
Arrays
Programming Fundamentals Arrays and Strings
Arrays in C language
Multi dimensional array
Array notes
Array Introduction One-dimensional array Multidimensional array
Arrays

What's hot (20)

PPT
PPTX
2- Dimensional Arrays
PPTX
Programming in c Arrays
PDF
Arrays in C++
PPTX
INTRODUCTION TO FUNCTIONS IN PYTHON
PPTX
Array within a class
PPTX
DATA TYPE IN PYTHON
PPT
Functions and pointers_unit_4
PPTX
Templates in C++
PPTX
C programming slide c05
PPTX
OPERATOR IN PYTHON-PART1
PPT
C programming , array 2020
PDF
C++ ARRAY WITH EXAMPLES
PPTX
USER DEFINE FUNCTIONS IN PYTHON[WITH PARAMETERS]
PPTX
C++ lecture 04
DOCX
Data Structure Project File
PDF
VIT351 Software Development VI Unit2
PPT
Pointers
2- Dimensional Arrays
Programming in c Arrays
Arrays in C++
INTRODUCTION TO FUNCTIONS IN PYTHON
Array within a class
DATA TYPE IN PYTHON
Functions and pointers_unit_4
Templates in C++
C programming slide c05
OPERATOR IN PYTHON-PART1
C programming , array 2020
C++ ARRAY WITH EXAMPLES
USER DEFINE FUNCTIONS IN PYTHON[WITH PARAMETERS]
C++ lecture 04
Data Structure Project File
VIT351 Software Development VI Unit2
Pointers
Ad

Viewers also liked (18)

PPT
Presentation about arrays
PPTX
Javascript basics
PDF
Working with Arrays in JavaScript
PPTX
Javascript - Array - Writing
PDF
Java(ee) mongo db applications in the cloud
PPTX
Data structure Stack
PPT
2 arrays
PDF
JavaScript DOM Manipulations
PPT
JavaScript & Dom Manipulation
PPT
JavaScript Arrays
PPT
DOM ( Document Object Model )
PPTX
Introduction to the DOM
PPTX
An Introduction to the DOM
PPT
Java: Introduction to Arrays
PPTX
Stack Data structure
PDF
DOM Features You Didn’t Know Existed
PPT
Basics of C programming
PPTX
TechCBT: JavaScript Arrays in Depth
Presentation about arrays
Javascript basics
Working with Arrays in JavaScript
Javascript - Array - Writing
Java(ee) mongo db applications in the cloud
Data structure Stack
2 arrays
JavaScript DOM Manipulations
JavaScript & Dom Manipulation
JavaScript Arrays
DOM ( Document Object Model )
Introduction to the DOM
An Introduction to the DOM
Java: Introduction to Arrays
Stack Data structure
DOM Features You Didn’t Know Existed
Basics of C programming
TechCBT: JavaScript Arrays in Depth
Ad

Similar to Arrays (20)

PPT
Lecture#8 introduction to array with examples c++
PPT
Lecture#5-Arrays-oral patholohu hfFoP.ppt
PPT
Lec2&3_DataStructure
PPT
Lec2&3 data structure
PPT
Lec2
PPT
lecture7.ppt
PPT
its arrays ppt for first year students .
PPT
Fp201 unit4
PPTX
Arrays matrix 2020 ab
PDF
Multidimensional arrays in C++
PPTX
C_Arrays(3)bzxhgvxgxg.xhjvxugvxuxuxuxvxugvx.pptx
PPT
Csc1100 lecture07 ch07_pt1-1
PPT
Computer Programming- Lecture 8
PPT
Arrays
PDF
05_Arrays C plus Programming language22.pdf
PPT
PDF
PPTX
One dimensional arrays
PDF
C++ Course - Lesson 2
Lecture#8 introduction to array with examples c++
Lecture#5-Arrays-oral patholohu hfFoP.ppt
Lec2&3_DataStructure
Lec2&3 data structure
Lec2
lecture7.ppt
its arrays ppt for first year students .
Fp201 unit4
Arrays matrix 2020 ab
Multidimensional arrays in C++
C_Arrays(3)bzxhgvxgxg.xhjvxugvxuxuxuxvxugvx.pptx
Csc1100 lecture07 ch07_pt1-1
Computer Programming- Lecture 8
Arrays
05_Arrays C plus Programming language22.pdf
One dimensional arrays
C++ Course - Lesson 2

Recently uploaded (20)

PDF
Black Hat USA 2025 - Micro ICS Summit - ICS/OT Threat Landscape
PDF
What if we spent less time fighting change, and more time building what’s rig...
PDF
1.3 FINAL REVISED K-10 PE and Health CG 2023 Grades 4-10 (1).pdf
PPTX
Share_Module_2_Power_conflict_and_negotiation.pptx
PDF
ChatGPT for Dummies - Pam Baker Ccesa007.pdf
PPTX
Introduction to pro and eukaryotes and differences.pptx
PDF
advance database management system book.pdf
PDF
My India Quiz Book_20210205121199924.pdf
PDF
LDMMIA Reiki Yoga Finals Review Spring Summer
PDF
احياء السادس العلمي - الفصل الثالث (التكاثر) منهج متميزين/كلية بغداد/موهوبين
PDF
IGGE1 Understanding the Self1234567891011
PPTX
202450812 BayCHI UCSC-SV 20250812 v17.pptx
PDF
BP 704 T. NOVEL DRUG DELIVERY SYSTEMS (UNIT 1)
PPTX
TNA_Presentation-1-Final(SAVE)) (1).pptx
PPTX
Virtual and Augmented Reality in Current Scenario
PDF
Empowerment Technology for Senior High School Guide
PPTX
CHAPTER IV. MAN AND BIOSPHERE AND ITS TOTALITY.pptx
PPTX
History, Philosophy and sociology of education (1).pptx
PPTX
20th Century Theater, Methods, History.pptx
PDF
MBA _Common_ 2nd year Syllabus _2021-22_.pdf
Black Hat USA 2025 - Micro ICS Summit - ICS/OT Threat Landscape
What if we spent less time fighting change, and more time building what’s rig...
1.3 FINAL REVISED K-10 PE and Health CG 2023 Grades 4-10 (1).pdf
Share_Module_2_Power_conflict_and_negotiation.pptx
ChatGPT for Dummies - Pam Baker Ccesa007.pdf
Introduction to pro and eukaryotes and differences.pptx
advance database management system book.pdf
My India Quiz Book_20210205121199924.pdf
LDMMIA Reiki Yoga Finals Review Spring Summer
احياء السادس العلمي - الفصل الثالث (التكاثر) منهج متميزين/كلية بغداد/موهوبين
IGGE1 Understanding the Self1234567891011
202450812 BayCHI UCSC-SV 20250812 v17.pptx
BP 704 T. NOVEL DRUG DELIVERY SYSTEMS (UNIT 1)
TNA_Presentation-1-Final(SAVE)) (1).pptx
Virtual and Augmented Reality in Current Scenario
Empowerment Technology for Senior High School Guide
CHAPTER IV. MAN AND BIOSPHERE AND ITS TOTALITY.pptx
History, Philosophy and sociology of education (1).pptx
20th Century Theater, Methods, History.pptx
MBA _Common_ 2nd year Syllabus _2021-22_.pdf

Arrays

  • 1. Chapter 4 - Arrays Outline 4.1 Introduction 4.2 Arrays 4.3 Declaring Arrays 4.4 Examples Using Arrays 4.5 Passing Arrays to Functions 4.6 Sorting Arrays 4.7 Case Study: Computing Mean, Median and Mode Using Arrays 4.8 Searching Arrays: Linear Search and Binary Search 4.9 Multiple-Subscripted Arrays
  • 2. 4.1 Introduction Arrays Structures of related data items Static entity (same size throughout program) A few types Pointer-based arrays (C-like) Arrays as objects (C++)
  • 3. 4.2 Arrays Array Consecutive group of memory locations Same name and type ( int , char , etc.) To refer to an element Specify array name and position number (index) Format: arrayname[ position number ] First element at position 0 N-element array c c[ 0 ] , c[ 1 ] … c[ n - 1 ] Nth element as position N-1
  • 4. 4.2 Arrays Array elements like other variables Assignment, printing for an integer array c c[ 0 ] = 3; cout << c[ 0 ]; Can perform operations inside subscript c[ 5 – 2 ] same as c[3]
  • 5. 4.2 Arrays c[6] -45 6 0 72 1543 -89 0 62 -3 1 6453 78 Name of array (Note that all elements of this array have the same name, c ) c[0] c[1] c[2] c[3] c[11] c[10] c[9] c[8] c[7] c[5] c[4] Position number of the element within array c  
  • 6. 4.3 Declaring Arrays When declaring arrays, specify Name Type of array Any data type Number of elements type arrayName [ arraySize ]; int c[ 10 ]; // array of 10 integers float d[ 3284 ]; // array of 3284 floats Declaring multiple arrays of same type Use comma separated list, like regular variables int b[ 100 ], x[ 27 ];
  • 7. 4.4 Examples Using Arrays Initializing arrays For loop Set each element Initializer list Specify each element when array declared int n[ 5 ] = { 1, 2, 3, 4, 5 }; If not enough initializers, rightmost elements 0 If too many syntax error To set every element to same value int n[ 5 ] = { 0 }; If array size omitted, initializers determine size int n[] = { 1, 2, 3, 4, 5 }; 5 initializers, therefore 5 element array
  • 8. fig04_03.cpp (1 of 2) 1 // Fig. 4.3: fig04_03.cpp 2 // Initializing an array. 3 #include <iostream> 4 5 using std::cout; 6 using std::endl; 7 8 #include <iomanip> 9 10 using std::setw; 11 12 int main() 13 { 14 int n[ 10 ]; // n is an array of 10 integers 15 16 // initialize elements of array n to 0 17 for ( int i = 0 ; i < 10 ; i++ ) 18 n[ i ] = 0 ; // set element at location i to 0 19 20 cout << &quot;Element&quot; << setw( 13 ) << &quot;Value&quot; << endl; 21 22 // output contents of array n in tabular format 23 for ( int j = 0 ; j < 10 ; j++ ) 24 cout << setw( 7 ) << j << setw( 13 ) << n[ j ] << endl; 25 Declare a 10-element array of integers. Initialize array to 0 using a for loop. Note that the array has elements n[0] to n[9] .
  • 9. fig04_03.cpp (2 of 2) fig04_03.cpp output (1 of 1) 26 return 0 ; // indicates successful termination 27 28 } // end main Element Value 0 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0
  • 10. fig04_04.cpp (1 of 1) 1 // Fig. 4.4: fig04_04.cpp 2 // Initializing an array with a declaration. 3 #include <iostream> 4 5 using std::cout; 6 using std::endl; 7 8 #include <iomanip> 9 10 using std::setw; 11 12 int main() 13 { 14 // use initializer list to initialize array n 15 int n[ 10 ] = { 32 , 27 , 64 , 18 , 95 , 14 , 90 , 70 , 60 , 37 }; 16 17 cout << &quot;Element&quot; << setw( 13 ) << &quot;Value&quot; << endl; 18 19 // output contents of array n in tabular format 20 for ( int i = 0 ; i < 10 ; i++ ) 21 cout << setw( 7 ) << i << setw( 13 ) << n[ i ] << endl; 22 23 return 0 ; // indicates successful termination 24 25 } // end main Note the use of the initializer list.
  • 11. fig04_04.cpp output (1 of 1) Element Value 0 32 1 27 2 64 3 18 4 95 5 14 6 90 7 70 8 60 9 37
  • 12. 4.4 Examples Using Arrays Array size Can be specified with constant variable ( const ) const int size = 20; Constants cannot be changed Constants must be initialized when declared Also called named constants or read-only variables
  • 13. fig04_05.cpp (1 of 2) 1 // Fig. 4.5: fig04_05.cpp 2 // Initialize array s to the even integers from 2 to 20. 3 #include <iostream> 4 5 using std::cout; 6 using std::endl; 7 8 #include <iomanip> 9 10 using std::setw; 11 12 int main() 13 { 14 // constant variable can be used to specify array size 15 const int arraySize = 10 ; 16 17 int s[ arraySize ]; // array s has 10 elements 18 19 for ( int i = 0 ; i < arraySize ; i++ ) // set the values 20 s[ i ] = 2 + 2 * i; 21 22 cout << &quot;Element&quot; << setw( 13 ) << &quot;Value&quot; << endl; 23 Note use of const keyword. Only const variables can specify array sizes. The program becomes more scalable when we set the array size using a const variable. We can change arraySize , and all the loops will still work (otherwise, we’d have to update every loop in the program).
  • 14. fig04_05.cpp (2 of 2) fig04_05.cpp output (1 of 1) 24 // output contents of array s in tabular format 25 for ( int j = 0 ; j < arraySize ; j++ ) 26 cout << setw( 7 ) << j << setw( 13 ) << s[ j ] << endl; 27 28 return 0 ; // indicates successful termination 29 30 } // end main Element Value 0 2 1 4 2 6 3 8 4 10 5 12 6 14 7 16 8 18 9 20
  • 15. fig04_06.cpp (1 of 1) fig04_06.cpp output (1 of 1) 1 // Fig. 4.6: fig04_06.cpp 2 // Using a properly initialized constant variable. 3 #include <iostream> 4 5 using std::cout; 6 using std::endl; 7 8 int main() 9 { 10 const int x = 7 ; // initialized constant variable 11 12 cout << &quot;The value of constant variable x is: &quot; 13 << x << endl; 14 15 return 0 ; // indicates successful termination 16 17 } // end main The value of constant variable x is: 7 Proper initialization of const variable.
  • 16. fig04_07.cpp (1 of 1) fig04_07.cpp output (1 of 1) 1 // Fig. 4.7: fig04_07.cpp 2 // A const object must be initialized. 3 4 int main() 5 { 6 const int x; // Error: x must be initialized 7 8 x = 7; // Error: cannot modify a const variable 9 10 return 0 ; // indicates successful termination 11 12 } // end main d:\cpphtp4_examples\ch04\Fig04_07.cpp(6) : error C2734: 'x' : const object must be initialized if not extern d:\cpphtp4_examples\ch04\Fig04_07.cpp(8) : error C2166: l-value specifies const object Uninitialized const results in a syntax error. Attempting to modify the const is another error.
  • 17. fig04_08.cpp (1 of 1) fig04_08.cpp output (1 of 1) 1 // Fig. 4.8: fig04_08.cpp 2 // Compute the sum of the elements of the array. 3 #include <iostream> 4 5 using std::cout; 6 using std::endl; 7 8 int main() 9 { 10 const int arraySize = 10 ; 11 12 int a[ arraySize ] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 }; 13 14 int total = 0 ; 15 16 // sum contents of array a 17 for ( int i = 0 ; i < arraySize ; i++ ) 18 total += a[ i ]; 19 20 cout << &quot;Total of array element values is &quot; << total << endl; 21 22 return 0 ; // indicates successful termination 23 24 } // end main Total of array element values is 55
  • 18. fig04_09.cpp (1 of 2) 1 // Fig. 4.9: fig04_09.cpp 2 // Histogram printing program. 3 #include <iostream> 4 5 using std::cout; 6 using std::endl; 7 8 #include <iomanip> 9 10 using std::setw; 11 12 int main() 13 { 14 const int arraySize = 10 ; 15 int n[ arraySize ] = { 19 , 3 , 15 , 7 , 11 , 9 , 13 , 5 , 17 , 1 }; 16 17 cout << &quot;Element&quot; << setw( 13 ) << &quot;Value&quot; 18 << setw( 17 ) << &quot;Histogram&quot; << endl; 19 20 // for each element of array n, output a bar in histogram 21 for ( int i = 0 ; i < arraySize ; i++ ) { 22 cout << setw( 7 ) << i << setw( 13 ) 23 << n[ i ] << setw( 9 ); 24 25 for ( int j = 0 ; j < n[ i ]; j++ ) // print one bar 26 cout << '*' ; Prints asterisks corresponding to size of array element, n[i] .
  • 19. fig04_09.cpp (2 of 2) fig04_09.cpp output (1 of 1) 27 28 cout << endl; // start next line of output 29 30 } // end outer for structure 31 32 return 0 ; // indicates successful termination 33 34 } // end main Element Value Histogram 0 19 ******************* 1 3 *** 2 15 *************** 3 7 ******* 4 11 *********** 5 9 ********* 6 13 ************* 7 5 ***** 8 17 ***************** 9 1 *
  • 20. fig04_10.cpp (1 of 2) 1 // Fig. 4.10: fig04_10.cpp 2 // Roll a six-sided die 6000 times. 3 #include <iostream> 4 5 using std::cout; 6 using std::endl; 7 8 #include <iomanip> 9 10 using std::setw; 11 12 #include <cstdlib> 13 #include <ctime> 14 15 int main() 16 { 17 const int arraySize = 7 ; 18 int frequency[ arraySize ] = { 0 }; 19 20 srand( time( 0 ) ); // seed random-number generator 21 22 // roll die 6000 times 23 for ( int roll = 1 ; roll <= 6000 ; roll++ ) 24 ++frequency[ 1 + rand() % 6 ]; // replaces 20-line switch 25 // of Fig. 3.8 Remake of old program to roll dice. An array is used instead of 6 regular variables, and the proper element can be updated easily (without needing a switch ). This creates a number between 1 and 6, which determines the index of frequency[] that should be incremented.
  • 21. fig04_10.cpp (2 of 2) fig04_10.cpp output (1 of 1) 26 27 cout << &quot;Face&quot; << setw( 13 ) << &quot;Frequency&quot; << endl; 28 29 // output frequency elements 1-6 in tabular format 30 for ( int face = 1 ; face < arraySize ; face++ ) 31 cout << setw( 4 ) << face 32 << setw( 13 ) << frequency[ face ] << endl; 33 34 return 0 ; // indicates successful termination 35 36 } // end main Face Frequency 1 1003 2 1004 3 999 4 980 5 1013 6 1001
  • 22. fig04_11.cpp (1 of 2) 1 // Fig. 4.11: fig04_11.cpp 2 // Student poll program. 3 #include <iostream> 4 5 using std::cout; 6 using std::endl; 7 8 #include <iomanip> 9 10 using std::setw; 11 12 int main() 13 { 14 // define array sizes 15 const int responseSize = 40 ; // size of array responses 16 const int frequencySize = 11 ; // size of array frequency 17 18 // place survey responses in array responses 19 int responses[ responseSize ] = { 1 , 2 , 6 , 4 , 8 , 5 , 9 , 7 , 8 , 20 10 , 1 , 6 , 3 , 8 , 6 , 10 , 3 , 8 , 2 , 7 , 6 , 5 , 7 , 6 , 8 , 6 , 7 , 21 5 , 6 , 6 , 5 , 6 , 7 , 5 , 6 , 4 , 8 , 6 , 8 , 10 }; 22 23 // initialize frequency counters to 0 24 int frequency[ frequencySize ] = { 0 }; 25
  • 23. fig04_11.cpp (2 of 2) 26 // for each answer, select value of an element of array 27 // responses and use that value as subscript in array 28 // frequency to determine element to increment 29 for ( int answer = 0 ; answer < responseSize ; answer++ ) 30 ++frequency[ responses[answer] ]; 31 32 // display results 33 cout << &quot;Rating&quot; << setw( 17 ) << &quot;Frequency&quot; << endl; 34 35 // output frequencies in tabular format 36 for ( int rating = 1 ; rating < frequencySize ; rating++ ) 37 cout << setw( 6 ) << rating 38 << setw( 17 ) << frequency[ rating ] << endl; 39 40 return 0 ; // indicates successful termination 41 42 } // end main responses[answer] is the rating (from 1 to 10). This determines the index in frequency[] to increment.
  • 24. fig04_11.cpp output (1 of 1) Rating Frequency 1 2 2 2 3 2 4 2 5 5 6 11 7 5 8 7 9 1 10 3
  • 25. 4.4 Examples Using Arrays Strings (more in ch. 5) Arrays of characters All strings end with null ( '\0' ) Examples char string1[] = &quot;hello&quot;; Null character implicitly added string1 has 6 elements char string1[] = { 'h', 'e', 'l', 'l', 'o', '\0’ }; Subscripting is the same String1[ 0 ] is 'h' string1[ 2 ] is 'l'
  • 26. 4.4 Examples Using Arrays Input from keyboard char string2[ 10 ]; cin >> string2; Puts user input in string Stops at first whitespace character Adds null character If too much text entered, data written beyond array We want to avoid this (section 5.12 explains how) Printing strings cout << string2 << endl; Does not work for other array types Characters printed until null found
  • 27. fig04_12.cpp (1 of 2) 1 // Fig. 4_12: fig04_12.cpp 2 // Treating character arrays as strings. 3 #include <iostream> 4 5 using std::cout; 6 using std::cin; 7 using std::endl; 8 9 int main() 10 { 11 char string1[ 20 ], // reserves 20 characters 12 char string2[] = &quot;string literal&quot; ; // reserves 15 characters 13 14 // read string from user into array string2 15 cout << &quot;Enter the string \&quot;hello there\&quot;: &quot; ; 16 cin >> string1; // reads &quot;hello&quot; [space terminates input] 17 18 // output strings 19 cout << &quot;string1 is: &quot; << string1 20 << &quot;\nstring2 is: &quot; << string2; 21 22 cout << &quot;\nstring1 with spaces between characters is:\n&quot; ; 23 Two different ways to declare strings. string2 is initialized, and its size determined automatically . Examples of reading strings from the keyboard and printing them out.
  • 28. fig04_12.cpp (2 of 2) fig04_12.cpp output (1 of 1) 24 // output characters until null character is reached 25 for ( int i = 0 ; string1[ i ] != '\0' ; i++ ) 26 cout << string1[ i ] << ' ' ; 27 28 cin >> string1; // reads &quot;there&quot; 29 cout << &quot;\nstring1 is: &quot; << string1 << endl; 30 31 return 0 ; // indicates successful termination 32 33 } // end main Enter the string &quot;hello there&quot;: hello there string1 is: hello string2 is: string literal string1 with spaces between characters is: h e l l o string1 is: there Can access the characters in a string using array notation. The loop ends when the null character is found.
  • 29. 4.4 Examples Using Arrays Recall static storage (chapter 3) If static , local variables save values between function calls Visible only in function body Can declare local arrays to be static Initialized to zero static int array[3]; If not static Created (and destroyed) in every function call
  • 30. fig04_13.cpp (1 of 3) 1 // Fig. 4.13: fig04_13.cpp 2 // Static arrays are initialized to zero. 3 #include <iostream> 4 5 using std::cout; 6 using std::endl; 7 8 void staticArrayInit( void ); // function prototype 9 void automaticArrayInit( void ); // function prototype 10 11 int main() 12 { 13 cout << &quot;First call to each function:\n&quot; ; 14 staticArrayInit(); 15 automaticArrayInit(); 16 17 cout << &quot;\n\nSecond call to each function:\n&quot; ; 18 staticArrayInit(); 19 automaticArrayInit(); 20 cout << endl; 21 22 return 0 ; // indicates successful termination 23 24 } // end main 25
  • 31. fig04_13.cpp (2 of 3) 26 // function to demonstrate a static local array 27 void staticArrayInit( void ) 28 { 29 // initializes elements to 0 first time function is called 30 static int array1[ 3 ]; 31 32 cout << &quot;\nValues on entering staticArrayInit:\n&quot; ; 33 34 // output contents of array1 35 for ( int i = 0 ; i < 3 ; i++ ) 36 cout << &quot;array1[&quot; << i << &quot;] = &quot; << array1[ i ] << &quot; &quot; ; 37 38 cout << &quot;\nValues on exiting staticArrayInit:\n&quot; ; 39 40 // modify and output contents of array1 41 for ( int j = 0 ; j < 3 ; j++ ) 42 cout << &quot;array1[&quot; << j << &quot;] = &quot; 43 << ( array1[ j ] += 5 ) << &quot; &quot; ; 44 45 } // end function staticArrayInit 46 Static array, initialized to zero on first function call. Array data is changed; the modified values stay.
  • 32. fig04_13.cpp (3 of 3) 47 // function to demonstrate an automatic local array 48 void automaticArrayInit( void ) 49 { 50 // initializes elements each time function is called 51 int array2[ 3 ] = { 1 , 2 , 3 }; 52 53 cout << &quot;\n\nValues on entering automaticArrayInit:\n&quot; ; 54 55 // output contents of array2 56 for ( int i = 0 ; i < 3 ; i++ ) 57 cout << &quot;array2[&quot; << i << &quot;] = &quot; << array2[ i ] << &quot; &quot; ; 58 59 cout << &quot;\nValues on exiting automaticArrayInit:\n&quot; ; 60 61 // modify and output contents of array2 62 for ( int j = 0 ; j < 3 ; j++ ) 63 cout << &quot;array2[&quot; << j << &quot;] = &quot; 64 << ( array2[ j ] += 5 ) << &quot; &quot; ; 65 66 } // end function automaticArrayInit Automatic array, recreated with every function call. Although the array is changed, it will be destroyed when the function exits and the changes will be lost.
  • 33. fig04_13.cpp output (1 of 1) First call to each function:   Values on entering staticArrayInit: array1[0] = 0 array1[1] = 0 array1[2] = 0 Values on exiting staticArrayInit: array1[0] = 5 array1[1] = 5 array1[2] = 5   Values on entering automaticArrayInit: array2[0] = 1 array2[1] = 2 array2[2] = 3 Values on exiting automaticArrayInit: array2[0] = 6 array2[1] = 7 array2[2] = 8   Second call to each function:   Values on entering staticArrayInit: array1[0] = 5 array1[1] = 5 array1[2] = 5 Values on exiting staticArrayInit: array1[0] = 10 array1[1] = 10 array1[2] = 10   Values on entering automaticArrayInit: array2[0] = 1 array2[1] = 2 array2[2] = 3 Values on exiting automaticArrayInit: array2[0] = 6 array2[1] = 7 array2[2] = 8
  • 34. 4.5 Passing Arrays to Functions Specify name without brackets To pass array myArray to myFunction int myArray[ 24 ]; myFunction( myArray, 24 ); Array size usually passed, but not required Useful to iterate over all elements
  • 35. 4.5 Passing Arrays to Functions Arrays passed-by-reference Functions can modify original array data Value of name of array is address of first element Function knows where the array is stored Can change original memory locations Individual array elements passed-by-value Like regular variables square( myArray[3] );
  • 36. 4.5 Passing Arrays to Functions Functions taking arrays Function prototype void modifyArray( int b[], int arraySize ); void modifyArray( int [], int ); Names optional in prototype Both take an integer array and a single integer No need for array size between brackets Ignored by compiler If declare array parameter as const Cannot be modified (compiler error) void doNotModify( const int [] );
  • 37. fig04_14.cpp (1 of 3) 1 // Fig. 4.14: fig04_14.cpp 2 // Passing arrays and individual array elements to functions. 3 #include <iostream> 4 5 using std::cout; 6 using std::endl; 7 8 #include <iomanip> 9 10 using std::setw; 11 12 void modifyArray( int [], int ); // appears strange 13 void modifyElement( int ); 14 15 int main() 16 { 17 const int arraySize = 5 ; // size of array a 18 int a[ arraySize ] = { 0 , 1 , 2 , 3 , 4 }; // initialize a 19 20 cout << &quot;Effects of passing entire array by reference:&quot; 21 << &quot;\n\nThe values of the original array are:\n&quot; ; 22 23 // output original array 24 for ( int i = 0 ; i < arraySize ; i++ ) 25 cout << setw( 3 ) << a[ i ]; Syntax for accepting an array in parameter list.
  • 38. fig04_14.cpp (2 of 3) 26 27 cout << endl; 28 29 // pass array a to modifyArray by reference 30 modifyArray( a, arraySize ); 31 32 cout << &quot;The values of the modified array are:\n&quot; ; 33 34 // output modified array 35 for ( int j = 0 ; j < arraySize ; j++ ) 36 cout << setw( 3 ) << a[ j ]; 37 38 // output value of a[ 3 ] 39 cout << &quot;\n\n\n&quot; 40 << &quot;Effects of passing array element by value:&quot; 41 << &quot;\n\nThe value of a[3] is &quot; << a[ 3 ] << '\n' ; 42 43 // pass array element a[ 3 ] by value 44 modifyElement( a[ 3 ] ); 45 46 // output value of a[ 3 ] 47 cout << &quot;The value of a[3] is &quot; << a[ 3 ] << endl; 48 49 return 0 ; // indicates successful termination 50 51 } // end main Pass array name ( a ) and size to function. Arrays are passed-by-reference. Pass a single array element by value; the original cannot be modified.
  • 39. fig04_14.cpp (3 of 3) 52 53 // in function modifyArray, &quot;b&quot; points to 54 // the original array &quot;a&quot; in memory 55 void modifyArray( int b[], int sizeOfArray ) 56 { 57 // multiply each array element by 2 58 for ( int k = 0 ; k < sizeOfArray; k++ ) 59 b[ k ] *= 2 ; 60 61 } // end function modifyArray 62 63 // in function modifyElement, &quot;e&quot; is a local copy of 64 // array element a[ 3 ] passed from main 65 void modifyElement( int e ) 66 { 67 // multiply parameter by 2 68 cout << &quot;Value in modifyElement is &quot; 69 << ( e *= 2 ) << endl; 70 71 } // end function modifyElement Although named b , the array points to the original array a . It can modify a ’s data. Individual array elements are passed by value, and the originals cannot be changed.
  • 40. fig04_14.cpp output (1 of 1) Effects of passing entire array by reference:   The values of the original array are: 0 1 2 3 4 The values of the modified array are: 0 2 4 6 8     Effects of passing array element by value:   The value of a[3] is 6 Value in modifyElement is 12 The value of a[3] is 6
  • 41. fig04_15.cpp (1 of 2) 1 // Fig. 4.15: fig04_15.cpp 2 // Demonstrating the const type qualifier. 3 #include <iostream> 4 5 using std::cout; 6 using std::endl; 7 8 void tryToModifyArray( const int [] ); // function prototype 9 10 int main() 11 { 12 int a[] = { 10 , 20 , 30 }; 13 14 tryToModifyArray( a ); 15 16 cout << a[ 0 ] << ' ' << a[ 1 ] << ' ' << a[ 2 ] << '\n' ; 17 18 return 0 ; // indicates successful termination 19 20 } // end main 21 Array parameter declared as const . Array cannot be modified, even though it is passed by reference.
  • 42. fig04_15.cpp (2 of 2) fig04_15.cpp output (1 of 1) 22 // In function tryToModifyArray, &quot;b&quot; cannot be used 23 // to modify the original array &quot;a&quot; in main. 24 void tryToModifyArray( const int b[] ) 25 { 26 b[ 0 ] /= 2 ; // error 27 b[ 1 ] /= 2 ; // error 28 b[ 2 ] /= 2 ; // error 29 30 } // end function tryToModifyArray d:\cpphtp4_examples\ch04\Fig04_15.cpp(26) : error C2166: l-value specifies const object d:\cpphtp4_examples\ch04\Fig04_15.cpp(27) : error C2166: l-value specifies const object d:\cpphtp4_examples\ch04\Fig04_15.cpp(28) : error C2166: l-value specifies const object
  • 43. 4.6 Sorting Arrays Sorting data Important computing application Virtually every organization must sort some data Massive amounts must be sorted Bubble sort (sinking sort) Several passes through the array Successive pairs of elements are compared If increasing order (or identical), no change If decreasing order, elements exchanged Repeat these steps for every element
  • 44. 4.6 Sorting Arrays Example: Go left to right, and exchange elements as necessary One pass for each element Original: 3 4 2 7 6 Pass 1: 3 2 4 6 7 (elements exchanged) Pass 2: 2 3 4 6 7 Pass 3: 2 3 4 6 7 (no changes needed) Pass 4: 2 3 4 6 7 Pass 5: 2 3 4 6 7 Small elements &quot;bubble&quot; to the top (like 2 in this example)
  • 45. 4.6 Sorting Arrays Swapping variables int x = 3, y = 4; y = x; x = y; What happened? Both x and y are 3! Need a temporary variable Solution int x = 3, y = 4, temp = 0; temp = x; // temp gets 3 x = y; // x gets 4 y = temp; // y gets 3
  • 46. fig04_16.cpp (1 of 3) 1 // Fig. 4.16: fig04_16.cpp 2 // This program sorts an array's values into ascending order. 3 #include <iostream> 4 5 using std::cout; 6 using std::endl; 7 8 #include <iomanip> 9 10 using std::setw; 11 12 int main() 13 { 14 const int arraySize = 10 ; // size of array a 15 int a[ arraySize ] = { 2 , 6 , 4 , 8 , 10 , 12 , 89 , 68 , 45 , 37 }; 16 int hold; // temporary location used to swap array elements 17 18 cout << &quot;Data items in original order\n&quot; ; 19 20 // output original array 21 for ( int i = 0 ; i < arraySize ; i++ ) 22 cout << setw( 4 ) << a[ i ]; 23
  • 47. fig04_16.cpp (2 of 3) 24 // bubble sort 25 // loop to control number of passes 26 for ( int pass = 0 ; pass < arraySize - 1 ; pass++ ) 27 28 // loop to control number of comparisons per pass 29 for ( int j = 0 ; j < arraySize - 1 ; j++ ) 30 31 // compare side-by-side elements and swap them if 32 // first element is greater than second element 33 if ( a[ j ] > a[ j + 1 ] ) { 34 hold = a[ j ]; 35 a[ j ] = a[ j + 1 ]; 36 a[ j + 1 ] = hold; 37 38 } // end if 39 Do a pass for each element in the array. If the element on the left (index j ) is larger than the element on the right (index j + 1 ), then we swap them. Remember the need of a temp variable.
  • 48. fig04_16.cpp (3 of 3) fig04_16.cpp output (1 of 1) 40 cout << &quot;\nData items in ascending order\n&quot; ; 41 42 // output sorted array 43 for ( int k = 0 ; k < arraySize ; k++ ) 44 cout << setw( 4 ) << a[ k ]; 45 46 cout << endl; 47 48 return 0 ; // indicates successful termination 49 50 } // end main Data items in original order 2 6 4 8 10 12 89 68 45 37 Data items in ascending order 2 4 6 8 10 12 37 45 68 89
  • 49. 4.7 Case Study: Computing Mean, Median and Mode Using Arrays Mean Average (sum/number of elements) Median Number in middle of sorted list 1, 2, 3, 4, 5 (3 is median) If even number of elements, take average of middle two Mode Number that occurs most often 1, 1, 1, 2, 3, 3, 4, 5 (1 is mode)
  • 50. fig04_17.cpp (1 of 8) 1 // Fig. 4.17: fig04_17.cpp 2 // This program introduces the topic of survey data analysis. 3 // It computes the mean, median, and mode of the data. 4 #include <iostream> 5 6 using std::cout; 7 using std::endl; 8 using std::fixed; 9 using std::showpoint; 10 11 #include <iomanip> 12 13 using std::setw; 14 using std::setprecision; 15 16 void mean( const int [], int ); 17 void median( int [], int ); 18 void mode( int [], int [], int ); 19 void bubbleSort( int [], int ); 20 void printArray( const int [], int ); 21 22 int main() 23 { 24 const int responseSize = 99 ; // size of array responses 25
  • 51. fig04_17.cpp (2 of 8) 26 int frequency[ 10 ] = { 0 }; // initialize array frequency 27 28 // initialize array responses 29 int response[ responseSize ] = 30 { 6 , 7 , 8 , 9 , 8 , 7 , 8 , 9 , 8 , 9 , 31 7 , 8 , 9 , 5 , 9 , 8 , 7 , 8 , 7 , 8 , 32 6 , 7 , 8 , 9 , 3 , 9 , 8 , 7 , 8 , 7 , 33 7 , 8 , 9 , 8 , 9 , 8 , 9 , 7 , 8 , 9 , 34 6 , 7 , 8 , 7 , 8 , 7 , 9 , 8 , 9 , 2 , 35 7 , 8 , 9 , 8 , 9 , 8 , 9 , 7 , 5 , 3 , 36 5 , 6 , 7 , 2 , 5 , 3 , 9 , 4 , 6 , 4 , 37 7 , 8 , 9 , 6 , 8 , 7 , 8 , 9 , 7 , 8 , 38 7 , 4 , 4 , 2 , 5 , 3 , 8 , 7 , 5 , 6 , 39 4 , 5 , 6 , 1 , 6 , 5 , 7 , 8 , 7 }; 40 41 // process responses 42 mean( response, responseSize ); 43 median( response, responseSize ); 44 mode( frequency, response, responseSize ); 45 46 return 0 ; // indicates successful termination 47 48 } // end main 49
  • 52. fig04_17.cpp (3 of 8) 50 // calculate average of all response values 51 void mean( const int answer[], int arraySize ) 52 { 53 int total = 0 ; 54 55 cout << &quot;********\n Mean\n********\n&quot; ; 56 57 // total response values 58 for ( int i = 0 ; i < arraySize; i++ ) 59 total += answer[ i ]; 60 61 // format and output results 62 cout << fixed << setprecision( 4 ); 63 64 cout << &quot;The mean is the average value of the data\n&quot; 65 << &quot;items. The mean is equal to the total of\n&quot; 66 << &quot;all the data items divided by the number\n&quot; 67 << &quot;of data items (&quot; << arraySize 68 << &quot;). The mean value for\nthis run is: &quot; 69 << total << &quot; / &quot; << arraySize << &quot; = &quot; 70 << static_cast < double >( total ) / arraySize 71 << &quot;\n\n&quot; ; 72 73 } // end function mean 74 We cast to a double to get decimal points for the average (instead of an integer).
  • 53. fig04_17.cpp (4 of 8) 75 // sort array and determine median element's value 76 void median( int answer[], int size ) 77 { 78 cout << &quot;\n********\n Median\n********\n&quot; 79 << &quot;The unsorted array of responses is&quot; ; 80 81 printArray( answer, size ); // output unsorted array 82 83 bubbleSort( answer, size ); // sort array 84 85 cout << &quot;\n\nThe sorted array is&quot; ; 86 printArray( answer, size ); // output sorted array 87 88 // display median element 89 cout << &quot;\n\nThe median is element &quot; << size / 2 90 << &quot; of\nthe sorted &quot; << size 91 << &quot; element array.\nFor this run the median is &quot; 92 << answer[ size / 2 ] << &quot;\n\n&quot; ; 93 94 } // end function median 95 Sort array by passing it to a function. This keeps the program modular.
  • 54. fig04_17.cpp (5 of 8) 96 // determine most frequent response 97 void mode( int freq[], int answer[], int size ) 98 { 99 int largest = 0 ; // represents largest frequency 100 int modeValue = 0 ; // represents most frequent response 101 102 cout << &quot;\n********\n Mode\n********\n&quot; ; 103 104 // initialize frequencies to 0 105 for ( int i = 1 ; i <= 9 ; i++ ) 106 freq[ i ] = 0 ; 107 108 // summarize frequencies 109 for ( int j = 0 ; j < size; j++ ) 110 ++freq[ answer[ j ] ]; 111 112 // output headers for result columns 113 cout << &quot;Response&quot; << setw( 11 ) << &quot;Frequency&quot; 114 << setw( 19 ) << &quot;Histogram\n\n&quot; << setw( 55 ) 115 << &quot;1 1 2 2\n&quot; << setw( 56 ) 116 << &quot;5 0 5 0 5\n\n&quot; ; 117
  • 55. fig04_17.cpp (6 of 8) 118 // output results 119 for ( int rating = 1 ; rating <= 9 ; rating++ ) { 120 cout << setw( 8 ) << rating << setw( 11 ) 121 << freq[ rating ] << &quot; &quot; ; 122 123 // keep track of mode value and largest fequency value 124 if ( freq[ rating ] > largest ) { 125 largest = freq[ rating ]; 126 modeValue = rating; 127 128 } // end if 129 130 // output histogram bar representing frequency value 131 for ( int k = 1 ; k <= freq[ rating ]; k++ ) 132 cout << '*' ; 133 134 cout << '\n' ; // begin new line of output 135 136 } // end outer for 137 138 // display the mode value 139 cout << &quot;The mode is the most frequent value.\n&quot; 140 << &quot;For this run the mode is &quot; << modeValue 141 << &quot; which occurred &quot; << largest << &quot; times.&quot; << endl; 142 143 } // end function mode The mode is the value that occurs most often (has the highest value in freq ).
  • 56. fig04_17.cpp (7 of 8) 144 145 // function that sorts an array with bubble sort algorithm 146 void bubbleSort( int a[], int size ) 147 { 148 int hold; // temporary location used to swap elements 149 150 // loop to control number of passes 151 for ( int pass = 1 ; pass < size; pass++ ) 152 153 // loop to control number of comparisons per pass 154 for ( int j = 0 ; j < size - 1 ; j++ ) 155 156 // swap elements if out of order 157 if ( a[ j ] > a[ j + 1 ] ) { 158 hold = a[ j ]; 159 a[ j ] = a[ j + 1 ]; 160 a[ j + 1 ] = hold; 161 162 } // end if 163 164 } // end function bubbleSort 165
  • 57. fig04_17.cpp (8 of 8) 166 // output array contents (20 values per row) 167 void printArray( const int a[], int size ) 168 { 169 for ( int i = 0 ; i < size; i++ ) { 170 171 if ( i % 20 == 0 ) // begin new line every 20 values 172 cout << endl; 173 174 cout << setw( 2 ) << a[ i ]; 175 176 } // end for 177 178 } // end function printArray
  • 58. fig04_17.cpp output (1 of 2) ******** Mean ******** The mean is the average value of the data items. The mean is equal to the total of all the data items divided by the number of data items (99). The mean value for this run is: 681 / 99 = 6.8788 ******** Median ******** The unsorted array of responses is 6 7 8 9 8 7 8 9 8 9 7 8 9 5 9 8 7 8 7 8 6 7 8 9 3 9 8 7 8 7 7 8 9 8 9 8 9 7 8 9 6 7 8 7 8 7 9 8 9 2 7 8 9 8 9 8 9 7 5 3 5 6 7 2 5 3 9 4 6 4 7 8 9 6 8 7 8 9 7 8 7 4 4 2 5 3 8 7 5 6 4 5 6 1 6 5 7 8 7   The sorted array is 1 2 2 2 3 3 3 3 4 4 4 4 4 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9   The median is element 49 of the sorted 99 element array. For this run the median is 7
  • 59. fig04_17.cpp output (2 of 2) ******** Mode ******** Response Frequency Histogram   1 1 2 2 5 0 5 0 5   1 1 * 2 3 *** 3 4 **** 4 5 ***** 5 8 ******** 6 9 ********* 7 23 *********************** 8 27 *************************** 9 19 ******************* The mode is the most frequent value. For this run the mode is 8 which occurred 27 times.
  • 60. 4.8 Searching Arrays: Linear Search and Binary Search Search array for a key value Linear search Compare each element of array with key value Start at one end, go to other Useful for small and unsorted arrays Inefficient If search key not present, examines every element
  • 61. 4.8 Searching Arrays: Linear Search and Binary Search Binary search Only used with sorted arrays Compare middle element with key If equal, match found If key < middle Repeat search on first half of array If key > middle Repeat search on last half Very fast At most N steps, where 2 > # of elements 30 element array takes at most 5 steps 2 > 30 N 5
  • 62. fig04_19.cpp (1 of 2) 1 // Fig. 4.19: fig04_19.cpp 2 // Linear search of an array. 3 #include <iostream> 4 5 using std::cout; 6 using std::cin; 7 using std::endl; 8 9 int linearSearch( const int [], int , int ); // prototype 10 11 int main() 12 { 13 const int arraySize = 100 ; // size of array a 14 int a[ arraySize ]; // create array a 15 int searchKey; // value to locate in a 16 17 for ( int i = 0 ; i < arraySize ; i++ ) // create some data 18 a[ i ] = 2 * i; 19 20 cout << &quot;Enter integer search key: &quot; ; 21 cin >> searchKey; 22 23 // attempt to locate searchKey in array a 24 int element = linearSearch( a, searchKey, arraySize ); 25 Takes array, search key, and array size.
  • 63. fig04_19.cpp (2 of 2) 26 // display results 27 if ( element != -1 ) 28 cout << &quot;Found value in element &quot; << element << endl; 29 else 30 cout << &quot;Value not found&quot; << endl; 31 32 return 0 ; // indicates successful termination 33 34 } // end main 35 36 // compare key to every element of array until location is 37 // found or until end of array is reached; return subscript of 38 // element if key or -1 if key not found 39 int linearSearch( const int array[], int key, int sizeOfArray ) 40 { 41 for ( int j = 0 ; j < sizeOfArray; j++ ) 42 43 if ( array[ j ] == key ) // if found, 44 return j; // return location of key 45 46 return -1 ; // key not found 47 48 } // end function linearSearch
  • 64. fig04_19.cpp output (1 of 1) Enter integer search key: 36 Found value in element 18 Enter integer search key: 37 Value not found
  • 65. fig04_20.cpp (1 of 6) 1 // Fig. 4.20: fig04_20.cpp 2 // Binary search of an array. 3 #include <iostream> 4 5 using std::cout; 6 using std::cin; 7 using std::endl; 8 9 #include <iomanip> 10 11 using std::setw; 12 13 // function prototypes 14 int binarySearch( const int [], int , int , int , int ); 15 void printHeader( int ); 16 void printRow( const int [], int , int , int , int ); 17 18 int main() 19 { 20 const int arraySize = 15 ; // size of array a 21 int a[ arraySize ]; // create array a 22 int key; // value to locate in a 23 24 for ( int i = 0 ; i < arraySize ; i++ ) // create some data 25 a[ i ] = 2 * i; 26
  • 66. fig04_20.cpp (2 of 6) 27 cout << &quot;Enter a number between 0 and 28: &quot; ; 28 cin >> key; 29 30 printHeader( arraySize ); 31 32 // search for key in array a 33 int result = 34 binarySearch( a, key, 0 , arraySize - 1 , arraySize ); 35 36 // display results 37 if ( result != -1 ) 38 cout << '\n' << key << &quot; found in array element &quot; 39 << result << endl; 40 else 41 cout << '\n' << key << &quot; not found&quot; << endl; 42 43 return 0 ; // indicates successful termination 44 45 } // end main 46
  • 67. fig04_20.cpp (3 of 6) 47 // function to perform binary search of an array 48 int binarySearch( const int b[], int searchKey, int low, 49 int high, int size ) 50 { 51 int middle; 52 53 // loop until low subscript is greater than high subscript 54 while ( low <= high ) { 55 56 // determine middle element of subarray being searched 57 middle = ( low + high ) / 2 ; 58 59 // display subarray used in this loop iteration 60 printRow( b, low, middle, high, size ); 61 Determine middle element
  • 68. fig04_20.cpp (4 of 6) 62 // if searchKey matches middle element, return middle 63 if ( searchKey == b[ middle ] ) // match 64 return middle; 65 66 else 67 68 // if searchKey less than middle element, 69 // set new high element 70 if ( searchKey < b[ middle ] ) 71 high = middle - 1 ; // search low end of array 72 73 // if searchKey greater than middle element, 74 // set new low element 75 else 76 low = middle + 1 ; // search high end of array 77 } 78 79 return -1 ; // searchKey not found 80 81 } // end function binarySearch Use the rule of binary search: If key equals middle, match If less, search low end If greater, search high end Loop sets low, middle and high dynamically. If searching the high end, the new low is the element above the middle.
  • 69. fig04_20.cpp (5 of 6) 82 83 // print header for output 84 void printHeader( int size ) 85 { 86 cout << &quot;\nSubscripts:\n&quot; ; 87 88 // output column heads 89 for ( int j = 0 ; j < size; j++ ) 90 cout << setw( 3 ) << j << ' ' ; 91 92 cout << '\n' ; // start new line of output 93 94 // output line of - characters 95 for ( int k = 1 ; k <= 4 * size; k++ ) 96 cout << '-' ; 97 98 cout << endl; // start new line of output 99 100 } // end function printHeader 101
  • 70. fig04_20.cpp (6 of 6) 102 // print one row of output showing the current 103 // part of the array being processed 104 void printRow( const int b[], int low, int mid, 105 int high, int size ) 106 { 107 // loop through entire array 108 for ( int m = 0 ; m < size; m++ ) 109 110 // display spaces if outside current subarray range 111 if ( m < low || m > high ) 112 cout << &quot; &quot; ; 113 114 // display middle element marked with a * 115 else 116 117 if ( m == mid ) // mark middle value 118 cout << setw( 3 ) << b[ m ] << '*' ; 119 120 // display other elements in subarray 121 else 122 cout << setw( 3 ) << b[ m ] << ' ' ; 123 124 cout << endl; // start new line of output 125 126 } // end function printRow
  • 71. fig04_20.cpp output (1 of 2)   Enter a number between 0 and 28: 6   Subscripts: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ------------------------------------------------------------ 0 2 4 6 8 10 12 14* 16 18 20 22 24 26 28 0 2 4 6* 8 10 12   6 found in array element 3       Enter a number between 0 and 28: 25   Subscripts: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ------------------------------------------------------------ 0 2 4 6 8 10 12 14* 16 18 20 22 24 26 28 16 18 20 22* 24 26 28 24 26* 28 24*   25 not found
  • 72. fig04_20.cpp output (2 of 2) Enter a number between 0 and 28: 8   Subscripts: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ------------------------------------------------------------ 0 2 4 6 8 10 12 14* 16 18 20 22 24 26 28 0 2 4 6* 8 10 12 8 10* 12 8*   8 found in array element 4
  • 73. 4.9 Multiple-Subscripted Arrays Multiple subscripts a[ i ][ j ] Tables with rows and columns Specify row, then column “Array of arrays” a[0] is an array of 4 elements a[0][0] is the first element of that array Row subscript Array name Column subscript Row 0 Row 1 Row 2 Column 0 Column 1 Column 2 Column 3 a[ 0 ][ 0 ] a[ 1 ][ 0 ] a[ 2 ][ 0 ] a[ 0 ][ 1 ] a[ 1 ][ 1 ] a[ 2 ][ 1 ] a[ 0 ][ 2 ] a[ 1 ][ 2 ] a[ 2 ][ 2 ] a[ 0 ][ 3 ] a[ 1 ][ 3 ] a[ 2 ][ 3 ]
  • 74. 4.9 Multiple-Subscripted Arrays To initialize Default of 0 Initializers grouped by row in braces int b[ 2 ][ 2 ] = { { 1, 2 }, { 3, 4 } }; int b[ 2 ][ 2 ] = { { 1 }, { 3, 4 } }; Row 0 Row 1 1 2 3 4 1 0 3 4
  • 75. 4.9 Multiple-Subscripted Arrays Referenced like normal cout << b[ 0 ][ 1 ]; Outputs 0 Cannot reference using commas cout << b[ 0, 1 ]; Syntax error Function prototypes Must specify sizes of subscripts First subscript not necessary, as with single-scripted arrays void printArray( int [][ 3 ] ); 1 0 3 4
  • 76. fig04_22.cpp (1 of 2) 1 // Fig. 4.22: fig04_22.cpp 2 // Initializing multidimensional arrays. 3 #include <iostream> 4 5 using std::cout; 6 using std::endl; 7 8 void printArray( int [][ 3 ] ); 9 10 int main() 11 { 12 int array1[ 2 ][ 3 ] = { { 1 , 2 , 3 }, { 4 , 5 , 6 } }; 13 int array2[ 2 ][ 3 ] = { 1 , 2 , 3 , 4 , 5 }; 14 int array3[ 2 ][ 3 ] = { { 1 , 2 }, { 4 } }; 15 16 cout << &quot;Values in array1 by row are:&quot; << endl; 17 printArray( array1 ); 18 19 cout << &quot;Values in array2 by row are:&quot; << endl; 20 printArray( array2 ); 21 22 cout << &quot;Values in array3 by row are:&quot; << endl; 23 printArray( array3 ); 24 25 return 0 ; // indicates successful termination 26 27 } // end main Note the various initialization styles. The elements in array2 are assigned to the first row and then the second. Note the format of the prototype.
  • 77. fig04_22.cpp (2 of 2) fig04_22.cpp output (1 of 1) 28 29 // function to output array with two rows and three columns 30 void printArray( int a[][ 3 ] ) 31 { 32 for ( int i = 0 ; i < 2 ; i++ ) { // for each row 33 34 for ( int j = 0 ; j < 3 ; j++ ) // output column values 35 cout << a[ i ][ j ] << ' ' ; 36 37 cout << endl; // start new line of output 38 39 } // end outer for structure 40 41 } // end function printArray Values in array1 by row are: 1 2 3 4 5 6 Values in array2 by row are: 1 2 3 4 5 0 Values in array3 by row are: 1 2 0 4 0 0 For loops are often used to iterate through arrays. Nested loops are helpful with multiple-subscripted arrays.
  • 78. 4.9 Multiple-Subscripted Arrays Next: program showing initialization After, program to keep track of students grades Multiple-subscripted array (table) Rows are students Columns are grades 95 85 89 80 Quiz1 Quiz2 Student0 Student1
  • 79. fig04_23.cpp (1 of 6) 1 // Fig. 4.23: fig04_23.cpp 2 // Double-subscripted array example. 3 #include <iostream> 4 5 using std::cout; 6 using std::endl; 7 using std::fixed; 8 using std::left; 9 10 #include <iomanip> 11 12 using std::setw; 13 using std::setprecision; 14 15 const int students = 3 ; // number of students 16 const int exams = 4 ; // number of exams 17 18 // function prototypes 19 int minimum( int [][ exams ], int , int ); 20 int maximum( int [][ exams ], int , int ); 21 double average( int [], int ); 22 void printArray( int [][ exams ], int , int ); 23
  • 80. fig04_23.cpp (2 of 6) 24 int main() 25 { 26 // initialize student grades for three students (rows) 27 int studentGrades[ students ][ exams ] = 28 { { 77 , 68 , 86 , 73 }, 29 { 96 , 87 , 89 , 78 }, 30 { 70 , 90 , 86 , 81 } }; 31 32 // output array studentGrades 33 cout << &quot;The array is:\n&quot; ; 34 printArray( studentGrades, students , exams ); 35 36 // determine smallest and largest grade values 37 cout << &quot;\n\nLowest grade: &quot; 38 << minimum( studentGrades, students , exams ) 39 << &quot;\nHighest grade: &quot; 40 << maximum( studentGrades, students , exams ) << '\n' ; 41 42 cout << fixed << setprecision( 2 ); 43
  • 81. fig04_23.cpp (3 of 6) 44 // calculate average grade for each student 45 for ( int person = 0 ; person < students; person++ ) 46 cout << &quot;The average grade for student &quot; << person 47 << &quot; is &quot; 48 << average( studentGrades[ person ], exams ) 49 << endl; 50 51 return 0 ; // indicates successful termination 52 53 } // end main 54 55 // find minimum grade 56 int minimum( int grades[][ exams ], int pupils, int tests ) 57 { 58 int lowGrade = 100 ; // initialize to highest possible grade 59 60 for ( int i = 0 ; i < pupils; i++ ) 61 62 for ( int j = 0 ; j < tests; j++ ) 63 64 if ( grades[ i ][ j ] < lowGrade ) 65 lowGrade = grades[ i ][ j ]; 66 67 return lowGrade; 68 69 } // end function minimum Determines the average for one student. We pass the array/row containing the student’s grades. Note that studentGrades[0] is itself an array.
  • 82. fig04_23.cpp (4 of 6) 70 71 // find maximum grade 72 int maximum( int grades[][ exams ], int pupils, int tests ) 73 { 74 int highGrade = 0 ; // initialize to lowest possible grade 75 76 for ( int i = 0 ; i < pupils; i++ ) 77 78 for ( int j = 0 ; j < tests; j++ ) 79 80 if ( grades[ i ][ j ] > highGrade ) 81 highGrade = grades[ i ][ j ]; 82 83 return highGrade; 84 85 } // end function maximum 86
  • 83. fig04_23.cpp (5 of 6) 87 // determine average grade for particular student 88 double average( int setOfGrades[], int tests ) 89 { 90 int total = 0 ; 91 92 // total all grades for one student 93 for ( int i = 0 ; i < tests; i++ ) 94 total += setOfGrades[ i ]; 95 96 return static_cast < double >( total ) / tests; // average 97 98 } // end function maximum
  • 84. fig04_23.cpp (6 of 6) 99 100 // Print the array 101 void printArray( int grades[][ exams ], int pupils, int tests ) 102 { 103 // set left justification and output column heads 104 cout << left << &quot; [0] [1] [2] [3]&quot; ; 105 106 // output grades in tabular format 107 for ( int i = 0 ; i < pupils; i++ ) { 108 109 // output label for row 110 cout << &quot;\nstudentGrades[&quot; << i << &quot;] &quot; ; 111 112 // output one grades for one student 113 for ( int j = 0 ; j < tests; j++ ) 114 cout << setw( 5 ) << grades[ i ][ j ]; 115 116 } // end outer for 117 118 } // end function printArray
  • 85. fig04_23.cpp output (1 of 1) The array is: [0] [1] [2] [3] studentGrades[0] 77 68 86 73 studentGrades[1] 96 87 89 78 studentGrades[2] 70 90 86 81   Lowest grade: 68 Highest grade: 96 The average grade for student 0 is 76.00 The average grade for student 1 is 87.50 The average grade for student 2 is 81.75