420 likes | 644 Views
CIS162AD - C#. Arrays – Part 2 13_arrays_sorting.ppt. Overview of Topics. Declaring Arrays Loading Arrays Processing Arrays Sorting Arrays Searching Arrays Parallel Arrays Multi-dimensional Arrays. Array Processing. Declare Array Load Array
E N D
CIS162AD - C# Arrays – Part 213_arrays_sorting.ppt
Overview of Topics • Declaring Arrays • Loading Arrays • Processing Arrays • Sorting Arrays • Searching Arrays • Parallel Arrays • Multi-dimensional Arrays
Array Processing • Declare Array • Load Array • After creating the array, data must be loaded. • Use arrayName.Length or arrayName.GetUpperBound(0) to prevent out of range errors. • Note: Arrays can be declared and loaded with constant values. • Process Array • Use individual elements in calculations or as arguments. • Send entire arrays to procedures for processing. • Sort, Search, Display • Use a lot of For loops or For Each loops.
Array Management • If during execution, the subscript value referenced an element past the end of the array, the program would throw a subscript out range exception (run-time error). • The programmer must make sure that the logic in the program does not allow the subscript to exceed the array size. • We can use some built in methods to manage arrays, arrayName.Length arrayName.GetUpperBound(0) • For partially filled arrays we must count how many items are loaded and then use the count when processing the arrays.
Array Subscript dataType[ ] arrayName = new dataType[arraySize]; • Arrays are allocated consecutive memory. • Each element is referenced using a subscript. • Subscript are integers. • The number of elements that are created is arraySize. • The first element in the array is referenced with a value of zero [0]. • The last element is referenced with a subscript value of [arraySize – 1]. • A subscript is also referred to as an index. • Short variable names for subscripts are acceptable.
Declare Array //Arrays are declared at the class level, //so they can be referenced by all methods.const int intARRAY_SIZE = 20;int[ ] cintTestScores = new int[intArraySize]; int cintNumberOfStudents; //We can load up to 20 scores, but we will save //how many tests are actually loaded in cintNumberOfStudents.
Loading Partially Filled Arrays cs12ex.txt 5040100301020 //Loads Array with scores saved in a data file. private void btnLoadArray_Click( ) {FileStream studentFile = new FileStream("cs12ex.txt", FileMode.Open); StreamReader studentStreamReader = new StreamReader(studentFile); int i = 0; //subscript initialized to zerowhile (studentStreamReader.Peek() != -1){ if (i < cintTestScores.Length) {cintTestScores[i] = int.Parse(studentStreamReader.ReadLine( )); i ++; //Increment subscript by one } else { MessageBox.Show (“Array Size Exceeded”); break; //Get of out of loop; Array is full. }}cintNumberOfStudents = i; //Save how many students were loadedstudentFile.Close( ); //Close file }
Partially Filled Arrays • Up to 20 scores could be loaded, but only 6 scores are actually loaded. • When the array is not full, it is considered a partially filled array. • When processing arrays, we need to make sure we only process the number scores loaded. • The number of scores loaded were counted in the load routine, and the count was saved in cintNumberOfStudents.
Sorting Arrays • Data is always being sorted. • It is important that we understand how sorts work. • There are various sort algorithms. • We’ll only be looking at the simple selection sort. • Selection Sort Algorithm: • Find the lowest value in the array. • Move it to the top of the array. • Find the next lowest value, and move it to the 2nd position. • Continue until the end of the array is reached.
Sort Ascending private void sortAscending(…) { int i, i2; int intMinScore, intMinSubscript, intHoldValue; for (i = 0; i < cintNumberOfStudents - 1; i++) //-1 so we don’t all the way to the bottom { intMinSubscript = i; intMinScore = cintTestScores[i]; for (i2 = i + 1; i2 < cintNumberOfStudents; i2++) { if {cintTestScore[i2] < intMinScore) { intMinSubscript = i2; intMinScore = intTestScores[i2]; } } intHoldValue = cintTestScores[i]; //swap values cintTestScores[i] = cintTestScores[intMinSubscript]; cintTestScore[intMinSubscript] = intHoldValue; } }
Sort Algorithm Demonstration const int intARRAY_SIZE = 20;int[ ] cintTestScores = new int[intArraySize]; int cintNumberOfStudents;
Load Array Read 6 numbers from file and load them into array. Numbers of Students = i i = 6
Sort Ascending 1st position Move the value in the 1st position to holdValue = 50. Find the lowest value and move it to the 1st position. Move holdValue to the position that the lowest value was found, swap values.
Sort Ascending 2nd position Move the value in the 2nd position to holdValue = 40. Find the next lowest value and move it to the 2nd position. Move holdValue to the position that the lowest value was found.
Sort Ascending 3rd position Move the value in the 3rd position to holdValue = 100. Find the next lowest value and move it to the 3rd position. Move holdValue to the position that the lowest value was found.
Sort Ascending 4th position Move the value in the 4th position to holdValue = 100. Find the next lowest value and move it to the 4th position. Move holdValue to the position that the lowest value was found.
Sort Ascending 5th position Move the value in the 5th position to holdValue = 50. A lower value than 50 will not be found, but the comparison must still be made.
Sort Ascending private void sortAscending(…) { int i, i2; int intMinScore, intMinSubscript, intHoldValue; for (i = 0; i < cintNumberOfStudents - 1; i++) //-1 so we don’t all the way to the bottom { intMinSubscript = i; intMinScore = cintTestScores[i]; for (i2 = i + 1; i2 < cintNumberOfStudents; i2++) { if {cintTestScore[i2] < intMinScore) { intMinSubscript = i2; intMinScore = intTestScores[i2]; } } intHoldValue = cintTestScores[i]; //swap values cintTestScores[i] = cintTestScores[intMinSubscript]; cintTestScore[intMinSubscript] = intHoldValue; } }
Sequential Search Algorithm • Before searching, the data is usually sorted first. • Look through the array elements from the first to the last looking for a match. • After a match is found, we are going to do something with item found later, so the index of where the item was found must be saved. • If the item was not found, we also need to record this using a flag or special value, so that the error can be reported.
Search Array – part 1 private void searchArray(…) int i; int intSearchNumber; int intNumberLocation;bool blnNumberFound; blnNumberFound = false; intSearchNumber = int.Parse(txtSearch.Text); //see next slide for the rest of the method
Search Array – part 2 for (i = 0; i < cintNumberOfStudents; i++) { if (intSearchNumber = = cintTestScores[i]) { blnNumberFound = true; intNumberLocation = i; lblOutput.Text = intSearchNumber.ToString(“N0”) + “ is located in array position “ + _ intNumberLocation. ToString(“N0”); } } if (blnNumberFound = = false) lblOutput.Text = intSearchNumber.ToString(“N0”) + “ is not in the array.“; }
Search Array – Match Found intSearchNumber = 40. For loop walks through array checking if cintTestScores(i) = = intSearchNumber. When a match is found, the subscript value is displayed (3).
Search Array – Early Exit intSearchNumber = 25. In the for loop we should also check if intSearchNumber < cintTestScores[i] . If it is, then we know that we will not find the value. We can exit search. Must be sorted.
Search Array – Early Exit for (i = 0; i < cintNumberOfStudents; i++) { if (intSearchNumber = = cintTestScores[i]) { blnNumberFound = true; intNumberLocation = i; lblOutput.Text = intSearchNumber.ToString(“N0”) + “ is located in array position “ + _ intNumberLocation. ToString(“N0”); } else if (intSearchNumber < cintTestScores[i]){ lblOutput.Text = "Match not found - Early Exit “; break; // get out for loop } }
Parallel Arrays • An array is used to process a collection of data all of which is of the same data type (Integer, Decimal, String, etc.). • When there is related data of different data types, then the data must be loaded into separate but parallel Arrays. • This means that related values are loaded into different arrays but are connected to each by the subscript value. • All of the related values will have the same subscript value.
Parallel Arrays – Simplified Example • Names and scores stored in a filestring[ ] cstrName = new string[19]; int[ ] cintScore = new int[19]; for (i = 0; i < 20; i++){ cstrName[i] = studentStreamReader.ReadLine( ); cintScore[i] = int.Parse(studentStreamReader.ReadLine( ));} • The related student data in different arrays must be kept together, especially when sorting.
Sorting Parallel Arrays If sorting by Name, John would be moved to the first position. The data in the related array (Score of 70) must also be swapped. The sort routine would require additional swap statements.
Comparing Strings • The only comparison operators defined for a string are == and !=. • To find less than or greater than use CompareTo method.if (cstrName[i2].CompareTo(strMinName) < 0) • The CompareTo method returns:-1 if current element is less than the compare element 0 if current element is equal to the compare element 1 if currernt element is greater than the compare element
Array Class Sort & Search Methods • Along with the Length property and GetUpperBound method, the array class also has a Sort and BinarySearch method. • Array.Sort(arrayName) sorts the elements in a one-dimensional array into ascending order. • Array.Sort will not work with parallel arrays because associated data are stored in different arrays. • Array.BinarySearch(arrayName, searchValue) searches a one-dimensional array that is sorted in ascending order for an element with a specified value. It returns the index of the element if found.
Two Dimensional Array • Single Dimensional Arrays are thought of as one column and many rows. • Single Dimensional Arrays require one subscript to reference an individual element. • Two Dimensional Arrays are many columns and many rows. • Two Dimensional Arrays require two subscripts to reference an individual element.
Two Dimensional Array - Example • Sum sales data for 10 departments and 4 quarters.decimal[,] decSales = new decimal[10, 4];for (i = 0; i < 10; i++) // 0 – 9 { for (j = 0; j < 4; j++) // 0 – 3 { decTotal += decSales[i, j]; }} • Each individual element requires two subscripts.
Two Dimensional Array - Data • Subscript i is going down the rows. • Subscript j is going across the columns. 10, 15, 25, 3020, 22, 32, 4230, 33, 43, 15
Name Array – 1D • Need an array to store the names of 5 people that are head of the household. • string[ ] strName = new string[5]
Name Array – 2D • Need an array to store 5 names, but first and last name separately. • string[ , ] strName = new string[5,2]
Name Array – 3D • Need an array to store the first and last names of up to 5 household members of 4 households. • string[ ,, ] strName = new string[4,5,2] • West is in strName[0,3,1].household, row, col
Name Array – 4D • Need an array to store the first and last names of up to 5 household members of 4 house holds for two different years. • string[ ,,, ] strName = new string[2,4,5,2] • See next slide. • The first dimension is the cube (year). • West is in strName[0,0,3,1] and [1,0,3,1].
Multi-Dimensional Arrays • Arrays are actually stored consecutively in memory, not in a form represented in the drawings in the prior slides. • We draw pictures so that we can visually see the data we are trying to manipulate. • The computer can handle as many dimensions as you would like to add. • 3 or 4 dimensions should be our maximum. • Keep in mind that eventually you or someone will need to maintain the program. If the array is to complex, it will take a while to get reacquainted with the logic.
Summary • Declaring Arrays • Loading Arrays • Processing Arrays • Single Dimensional • Multi Dimensional • The best way to understand these slides is to work through the examples using your own values. Desk check the logic to see how values are sorted.