Download presentation
Presentation is loading. Please wait.
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
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.