Transcript Arrays
Arrays
Multi-dimensional initialize & display Sample programs Sorting Searching Part II
Multidimensional Arrays
a a a a everything about one dimensional arrays applies * all elements of the same data type just need additional sets of
[ ]
a 3-D array has rows, columns, and rank * Except leaving the size out of the formal parameter
Parallel Arrays
Used when related data is of different data types.
grade % of class
A B C D F 28 40 29 9 14
parallel arrays
= two or more arrays in which elements with corresponding indexes are related We WILL do this in the next lab *
Parallel Arrays
for(row… OR for(col… { cout << “Enter id#”; cin >> id[row][col]; cout << “Enter grade”; cin >> grade[row][col]; } for(row… for(col… { cout << “Enter id and grade”; cin >> id[row][col] >> grade[row][col]; }
Sum a Row
void main(void) { double nums [3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }; double sumRow(double [3] [4]); // prototype } cout << “The sum of row 3 is “ << sumRow(nums)<
Sum a Row
double
{ sumRow(double ary[3][4]) int col; double total=0; for(col = 0; col < 4; col++) //enter row # -1 }
return
total;
output
The sum of row 3 is 42 * *
Sum a Column
void main(void) { double nums [3][4] = {1, 2, 3 , 4, 5, 6, 7 , 8, 9, 10, 11 , 12}; double sumCol(double [3] [4]); // prototype } cout << “The sum of column 3 is “ << sumCol(nums) << endl; //function call
Sum a Column
double sumCol(double ary[3][4]) { int row; double total=0; for(row = 0; row<3; row++) total += ary[row][ ]; //enter col # -1 return total; }
output
The sum of column 3 is 21 *
Array Review -1
Write a C++ program that adds equivalent elements of the two-dimensional arrays named
first
and
second
. Both arrays should have two rows and three columns. For example, element [1][2] of the resulting array should be the sum of first[1][2] and second[1][2].
16 54 first 18 91 23 11 40 sum 70 70 110 100 70 24 16 second 52 19 77 59 *
Sorting
Internal Sorts [for small data sets] bubble (exchange) selection External Sorts [for large data sets]
Bubble Sort
21 13 9 25 17 Put smaller first 13 21 9 25 17 Put smaller first 13 9 21 25 17 No change 13 9 21 25 17 Put smaller first
Bubble Sort
13 9 21 17 25 9 13 21 17 25
Begin again
and put smaller first No change 9 13 21 17 25 Put smaller first 9 13 17 21 25
A Bubble Sort Function
void bubble_sort(int array[ ], int length) { int j, k, flag=1, temp; for(j=1; j<=length && flag; j++) { flag=0; // false for(k=0; k < (length-j); k++) { if (array[k+1] > array[k]) //
>
{ temp=array[k+1]; low to high // swap
} } } }
array[k+1]= array[k]; array[k]=temp; flag=1; // indicates a swap // has occurred
Selection Sort
21 13 9 15 17 index (k) sm_index 0 2 swap 21, 9 9 13 21 15 17 1 1 swap 13, 13 9 13 21 15 17 2 3 swap 21, 15 9 13 15 21 17 3 4 swap 21, 17 9 13 15 17 21
Selection Sort
void sort(double [5]); void swap(double [5], int, int); void main(void) // prototypes { int index; double my_list[ ] = {21, 13, 9, 15, 17}; cout << "\nThe unsorted array is: \n"; for(index=0; index<5; index++) cout << “ “ << my_list[index] << endl; sort(my_list); cout << "\nThe sorted array is: \n"; // function call for(index=0; index<5; index++) cout << “ “ << my_list[index] << endl; }
Selection Sort
void sort(double testArray[5]) { int n, k, sm_index, pass=0; double smallest; } for(k=0; k<4; k++) { smallest = testArray[k]; sm_index = k; for(n=k+1; n<5; n++) { // size-1 = number of passes // size = # elem. to look at if(testArray[n] < smallest) smallest = testArray[n]; sm_index = n; } swap(testArray, sm_index, k); // call to swap() }
Selection Sort
void swap(double testArray[5], int smaller, int position) { // position = current position: k double temp; } temp = testArray[position]; testArray[position] = testArray[smaller]; testArray[smaller] = temp;
Linear Search Pseudocode
For all the items in the list Compare the item with the desired item If the item was found Return the index value of the current item (the position of the element in the array) End If End For Return -1 because the item was not found
The “Classic” Linear Search Function
int LinearSearch(int list[], int size, int key) { // or “Sequential search” int i; for (i = 0; i < size; i++) { if (list[i] = = key) return i; // return location of element //this will terminate the loop } } return -1; // element not in list
Main for linear search
int main() { int LinearSearch(int [], int, int); // prototype const int NUMEL = 10; int nums[NUMEL] = {22,5,67,98,45,32,101,99,73,10}; int item, location; cout << "\nEnter the item you are searching for: "; cin >> item; location = LinearSearch(nums, NUMEL, item); if (location > -1) cout << "The item was found at index location " << location << endl; else cout << "The item was not found in the list\n"; return 0; }
Binary Search
List must be in sorted order The function looks at the midpoint If the midpoint is the item, return the location Else, determine if the item is less than or greater than the midpoint Eliminate the side where the item cannot be, and declare a new midpoint Go again. (A recursive function) Half the list is eliminated on each pass
int BinarySearch(int list[], int size, int key)
{ int left, right, midpt; left = 0; right = size - 1; // list
must
be in sorted order // left end is the first element // right is the last element while (left <= right){ midpt = (int) ((left + right) / 2); // why integer division?
if (key == list[midpt]) return midpt; // if found, the key will be the midpoint else if (key > list[midpt]) left = midpt + 1; // eliminate the left half else right = midpt - 1; // else - eliminate the right half } // end while return -1;} // the key was never found
Main for binary search
int main() { int BinarySearch(int [], int, int); // prototype const int NUMEL = 10; int nums[NUMEL] = {5,10,22,32,45,67,73,98,99,101}; int item, location; cout << "\nEnter the item you are searching for: "; cin >> item; location = BinarySearch(nums, NUMEL, item); if (location > -1) cout << "The item was found at index location " << location << endl; else cout << "The item was not found in the list\n"; return 0; }
Array Review
a a a a a a is an ordered sequence of data of the same type can be of any valid data type can be 1-, 2-, or multi- dimensional must be declared before used can be assigned and initialized element numbering starts at zero
Array Review
a a a use
for
loops to access (nested for multidimentional) can be passed back and forth between functions when sent to functions the
actual values
are manipulated - not a copy (passed by reference)
Array Review - 6a
There is an array of three students each with four exam scores. Assume the scores are known and are: {77, 68, 86, 73}, {96, 87, 89, 78}, {70, 90, 86, 81}. Create a program which will display the lowest grade, the highest grade and the average of the grades to two decimal places.
Array Review - 6b
#include
Array Review - 6c
void main(void) { int studentGrades[ STUDENTS ][ EXAMS ] = {{77, 68, 86, 73}, {96, 87, 89, 78}, {70, 90, 86, 81}}; cout << "The array is:" << endl; printArray(studentGrades, STUDENTS, EXAMS ); cout<
Array Review - 6d
int mini(int grades[][EXAMS], int pupils, int tests) { int lowGrade = 100; for (int i = 0; i < pupils; i++) for (int j = 0; j < tests; j++) if (grades[i][j] < lowGrade) lowGrade = grades[i][j]; return lowGrade; } int maxi(int grades[][EXAMS], int pupils, int tests) { int highGrade = 0; for (int i = 0; i < pupils; i++) for (int j = 0; j < tests; j++) if (grades[i][j] > highGrade) highGrade = grades[i][j]; return highGrade; }
Array Review - 6e
float average(int setOfGrades[], void printArray(int grades[][EXAMS], int tests) int pupils, int tests) { { int total = 0; cout << " [0] [1] [2] [3]"; for (int i = 0; i < tests; i++) for (int i = 0; i < pupils; i++) { total += setOfGrades[i]; return (float) total / tests; cout << endl<< "studentGrades[" << i << "] "; } for (int j = 0; j < tests; j++) cout << setiosflags(ios::left) << setw(5) << grades[i][j]; }
Array Review - 6f
function call: average(
studentGrades[person]
, EXAMS) float average(int
setOfGrades[]
, int tests) { int total = 0; for (int i = 0; i < tests; i++) total += setOfGrades[i]; return total / tests; }
Common Errors
Not declaring the array First element is called
zero
; last element is one less than the number of elements Out of range subscripts - no warning Error in the
for
loop - check the counter Not initializing the array
Common Errors
Aggregate operations not allowed Omitting array size - permitted only when declared as a formal parameter initialized in the declaration If array is /* in */ only, declare the formal parameter as const to prevent accidental modification
Debugging
array subscripts recheck array size in declaration, initialization, and
for
loops Prevention - plan first!
Valuation tables Display values with cout C++ Debugger