Presentation is loading. Please wait.

Presentation is loading. Please wait.

CIS162AD - C# Arrays ch08.ppt.

Similar presentations


Presentation on theme: "CIS162AD - C# Arrays ch08.ppt."— Presentation transcript:

1 CIS162AD - C# Arrays ch08.ppt

2 Overview of Topics Declaring Arrays Loading Arrays
Partially Filled Arrays Arrays Elements as Arguments Declaring and Loading Constant Arrays Sorting Arrays Searching Arrays Parallel Arrays Multi-dimensional Arrays CIS162AD

3 Arrays are Tables Array is a different word for a table.
A table is made up of columns and rows. Just like an Excel spreadsheet. CIS162AD

4 Array Defined An array is used to process a collection of data all of which is of the same data type (Integer, Decimal, String, etc.). First we’ll look at single dimensional arrays (one column, many rows). Think of a single dimensional array as a list of variables. CIS162AD

5 Declaring Array int intQty1, intQty2, intQty3; int[ ] intQty = new int[3]; //3 integer variables dataType[ ] arrayName = new dataType[arraySize]; An array of 3 elements of type integer is created. The arraySize is used by C# to determine how much memory to allocate. Arrays will usually be class-level because after values are loaded in we don’t want to lose the values. CIS162AD

6 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. CIS162AD

7 Memory Map Address Variable Value 1010 intQty1 1020 intQty2 1030
1020 intQty2 1030 intQty3 1040 intQty[0] 1050 intQty[1] 1060 intQty[2] 1070 decPrice CIS162AD

8 Subscript Out Of Range If during execution, the subscript value referenced an element past the end of the array, the program would throw an 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. This is called being out of range. CIS162AD

9 Preventing Out of Range
C# will not prevent a subscript out of range error, but it will abort the execution when it happens. It aborts because the subscript would be referencing some other section of memory than what was allocated for the array. The programmer is responsible for preventing the out range error. We can use some built in methods to manage arrays, arrayName.Length arrayName.GetUpperBound(0). The For Each (foreach) command may also be used to walk through arrays. CIS162AD

10 Array Properties int[ ] intQty = new int[3]; //3 integer variables
arrayName.Length intQty.Length is equal to 3. intQty.Length is the number of entries that can be loaded. The last valid subscript value is one less than Length. arrayName.GetUpperBound(0). intQty.GetUpperBound(0) is equal to 2. intQty.GetUpperBound(0) is last valid subscript value. Depending the loop structure, we may use: less than Length or Equal to GetUpperBound(0) CIS162AD

11 Array Processing Declare Array Load Array Process 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 methods for processing. Sort, Search, Display Use a lot of For loops or For Each loops. CIS162AD

12 Declare Array //Arrays are declared at the class level,
//so they can be referenced by all methods. int[ ] cintTestScores = new int[20]; int cintNumberOfStudents; //We can load up to 20 scores, but we will //save how many tests are actually loaded in cintNumberOfStudents. CIS162AD

13 cintTestScores Array Memory Map
Position Address Index Value 1 1010 [0] 2 1014 [1] 3 1018 [2] 4 1022 [3] 5 1026 [4] 6 1030 [5] 7 1034 [6] 20 1086 [19] CIS162AD

14 Load Array //Loads Array with scores saved in a data file.
cs12ex.txt //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 zero while (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 loaded studentFile.Close( ); //Close file } CIS162AD

15 Loaded Arrays Position Address Index Value 1 1010 [0] 50 2 1014 [1] 40
3 1018 [2] 100 4 1022 [3] 30 5 1026 [4] 10 6 1030 [5] 20 7 1034 [6] 1086 [19] CIS162AD

16 Process Array – Individual Elements
private void btnProcessArray_Click( ) { int i; int intSum = 0; for (i = 0; i <= cintTestScores.GetUpperBound(0); i++) { intSum += cintTestScores[i]; } txtSum.Text = intSum.ToString(“N0”); CIS162AD

17 For Each - Example private void btnProcessArray_Click( )
{ int i; //subscript not needed int intSum = 0; foreach (int intTestScore in cintTestScores) { intSum += intTestScore; } txtSum.Text = intSum.ToString(“N0”); CIS162AD

18 Partially Filled Arrays
In the for loop on the prior slide it was assumed that the arrays were filled by going up to GetUpperBound(0). Up to 20 scores could be loaded, but in the example only 6 scores were actually loaded. When the array is not full, it is considered a partially filled array. The for loops need to be modified to only process the number scores loaded. The number of scores loaded are counted in the load routine, and the count should then be saved in a variable like cintNumberOfStudents. This variable should then be used when processing the arrays. CIS162AD

19 Load Array – Partially Filled
//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 zero while (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 loaded studentFile.Close( ); //Close file } CIS162AD

20 Processing Partially Filled Arrays
private void btnProcessArray_Click( ) { int i; int intSum; //for (i = 0; i <= cintTestScores.GetUpperBound(0); i++) //process entire array for (i = 0; i < mintNumberOfStudents; i++) //process partially filled array { intSum += cintTestScores[i]; } txtAverage.Text = (intSum / mintNumberOfStudents).ToString(“N0”); CIS162AD

21 Declare and Load Constant Arrays
Arrays that will hold constants or some initial values can be loaded at declaration. When the values are provided at declaration, do not include the size. The size is determined by the number of values provided. The values are enclosed in braces and not parenthesis. decimal[ ] cdecPERCENT_RANGE = new decimal[ ] {90D, 80D, 70D, 60D, 0D}; string[ ] cstrLETTER_GRADE = new string[ ] {"A", "B", "C", "D", "F"}; C# does NOT allow const for arrays. CIS162AD

22 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. CIS162AD

23 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. CIS162AD

24 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. CIS162AD

25 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; CIS162AD

26 Sort Algorithm Demonstration
const int intARRAY_SIZE = 20; int[ ] cintTestScores = new int[intArraySize]; int cintNumberOfStudents; CIS162AD

27 Declared Array - cintTestScores
Address Subscript Value 1010 [0] 1014 [1] 1018 [2] 1022 [3] 1026 [4] 1030 [5] 1034 [6] 1086 [19] CIS162AD

28 Load Array Subscript Value [0] 50 [1] 40 [2] 100 [3] 30 [4] 10 [5] 20
[6] [19] Read 6 numbers from file and load them into array. Numbers of Students = i i = 6 CIS162AD

29 Sort Ascending 1st position
Subscript Value [0] 50 [1] 40 [2] 100 [3] 30 [4] 10 [5] 20 [6] [19] 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. CIS162AD

30 Sort Ascending 2nd position
Subscript Value [0] 10 [1] 40 [2] 100 [3] 30 [4] 50 [5] 20 [6] [19] 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. CIS162AD

31 Sort Ascending 3rd position
Subscript Value [0] 10 [1] 20 [2] 100 [3] 30 [4] 50 [5] 40 [6] [19] 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. CIS162AD

32 Sort Ascending 4th position
Subscript Value [0] 10 [1] 20 [2] 30 [3] 100 [4] 50 [5] 40 [6] [19] 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. CIS162AD

33 Sort Ascending 5th position
Subscript Value [0] 10 [1] 20 [2] 30 [3] 40 [4] 50 [5] 100 [6] [19] 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. CIS162AD

34 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; CIS162AD

35 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. CIS162AD

36 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 CIS162AD

37 Search Array – part 2 for (i = 0; i < cintNumberOfStudents; i++) {
if (intSearchNumber = = cmintTestScores[i]) { blnNumberFound = true; intNumberLocation = i; lblOutput.Text = intSearchNumber.ToString(“N0”) + “ is located in array position “ + _ intNumberLocation. ToString(“N0”); } if (blnNumberFound = = false) “ is not in the array.“; CIS162AD

38 Search Array – Match Found
Subscript Value [0] 10 [1] 20 [2] 30 [3] 40 [4] 50 [5] 100 [6] [19] intSearchNumber = 40. For loop walks through array checking if cintTestScores(i) = = intSearchNumber. When a match is found, the subscript value is displayed (3). CIS162AD

39 Search Array – Early Exit
Subscript Value [0] 10 [1] 20 [2] 30 [3] 40 [4] 50 [5] 100 [6] [19] 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. CIS162AD

40 Search Array – Early Exit
for (i = 0; i < cintNumberOfStudents; i++) { if (intSearchNumber = = cmintTestScores[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 CIS162AD

41 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. CIS162AD

42 Parallel Arrays – Simplified Example
Names and scores stored in a file string[ ] 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. CIS162AD

43 Sorting Parallel Arrays
Subscript Name [0] Todd [1] Mary [2] John [3] Subscript Score [0] 90 [1] 50 [2] 70 [3] 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. CIS162AD

44 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. CIS162AD

45 Two Dimensional Array - Example
Sum sales data for 10 departments and 4 quarters. decimal[,] decSales = new decimal[10, 4]; for (i = 0; i < 11; i++) { for (j = 0; j < 5; j++) { decTotal += decSales[i, j]; } } Each individual element requires two subscripts. CIS162AD

46 Two Dimensional Array - Data
Subscript i is going down the rows. Subscript j is going across the columns. 10, 15, 25, 30 20, 22, 32, 42 30, 33, 43, 15 Subscripts [0] [1] [2] [3] 10 15 25 30 20 22 32 42 33 43 [etc.] CIS162AD

47 Name Array – 1D Juan Marquez John Smith Sue Bradley Pat West
Need an array to store the names of 5 people that are head of the household. string[ ] strName = new string[5] Juan Marquez John Smith Sue Bradley Pat West Mark Jones CIS162AD

48 Name Array – 2D Juan Marquez John Smith Sue Bradley Pat West Mark
Need an array to store 5 names, but first and last name separately. string[ , ] strName = new string[5,2] Juan Marquez John Smith Sue Bradley Pat West Mark Jones CIS162AD

49 Name Array – 3D Juan Marquez John Smith Sue Bradley Pat West Mark
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 Juan Marquez John Smith Sue Bradley Pat West Mark Jones CIS162AD

50 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]. CIS162AD

51 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. CIS162AD

52 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. CIS162AD

53 Summary Declaring Arrays Loading Arrays Partially Filled Arrays
Arrays Elements as Arguments Declaring and Loading Constant Arrays CIS162AD


Download ppt "CIS162AD - C# Arrays ch08.ppt."

Similar presentations


Ads by Google