Title: Structured Data Type - Array
1Structured Data Type - Array
- Data types examined so far are atomic
- int, long
- float, double
- char
- Called simple data types because vars hold a
single value - If limited to simple data types, many
programming applications are tedious - Solution use structured data types - types that
represent more than one piece of data
2Outline
- Structured Types
- A. Arrays
- 1. Syntax of declaration
- 2. Layout in memory
- 3. Referencing array element
- a. Subscript use (abuse)
- b. Array elements as variables
- 4. Array Initialization
- 5. Processing arrays
- a. using loop
- b. types of processing
- 6. Passing array/part of array
- a. element of array
- b. entire array
- 7. Multidimensional arrays
- a. declaration
- b. referencing
- c. processing
- d. initialization
3Outline (cont)
- Structured Types
- A. Arrays (cont)
- 6. Passing array/part of array
- a. element of array
- b. entire array
- 7. Multidimensional arrays
- a. declaration
- b. referencing
- c. processing
- d. initialization
- Techniques
- A. Sorting
- 1. What is sorted?
- 2. Selection sort
- 3. Insertion sort
- B. Searching
- 1. (Un)successful searches
- 2. Sequential search
- a. Unsorted array
4Outline (cont)
- Techniques
- A. Sorting
- 1. What is sorted?
- 2. Selection sort
- 3. Insertion sort
- B. Searching
- 1. (Un)successful searches
- 2. Sequential search
- a. Unsorted array
- b. Sorted array
- 3. Binary search (sorted array)
5Sample Problem
- Problem track sales totals for 10 people
- Daily data
- Employee Sale
- ---------- ----
- 3 9.99
- 7 16.29
- 9 7.99
- 3 2.59
- .
- .
- .
- 7 49.00
6Representing Sales Data
- FILE sdata
- int numE
- float amtS
- float S0, S1, S2, S3, S4, S5, S6, S7, S8, S9
0.0 / One var for each employee / - if ((sdata fopen(DailySales,r)) NULL)
- printf(Unable to open DailySales\n)
- exit(-1)
7Updating Sales Data
- while (fscanf(sdata,df,numE,amtS) 2)
- switch (numE)
- case 0 S0 amtS break
- case 1 S1 amtS break
- case 2 S2 amtS break
- case 3 S3 amtS break
- case 4 S4 amtS break
- case 5 S5 amtS break
- case 6 S6 amtS break
- case 7 S7 amtS break
- case 8 S8 amtS break
- case 9 S9 amtS break
- / What if 100 employees? /
8Data Structure
- A Data Structure is a grouping of data items in
memory under one name - When data items same type, can use Array
- Using an array, we can set aside a block of
memory giving the block a name - Sales vs. S0
- S1
-
- S9
9Parts of an Array
10Declaring a 1D Array
- Syntax Type NameIntegerLiteral
- Type can be any type we have used so far
- Name is a variable name used for the whole array
- Integer literal in between the square brackets
() gives the size of the array (number of
sub-parts) - Size must be a constant value (no variable size)
- Parts of the array are numbered starting from 0
- 1-Dimensional (1D) because it has one index
- Example
- float Sales10
- / float array with 10 parts numbered 0 to 9 /
11Array Indices
- The array indices are similar to the subscripts
used in matrix notation - Sales0 is C notation for Sales
- Sales1 is C notation for Sales
- Sales2 is C notation for Sales
- The index is used to refer to a part of array
- Note, C does not check your index (leading to
index-out-of-range errors)
0
1
2
12Accessing Array Elements
- Requires
- array name,
- subscript labeling individual element
- Syntax namesubscript
- Example
- Sales5 refers to the sales totals for employee
5 - Sales5 can be treated like any float variable
- Sales5 123.45
- printf(Sales for employee 5 7.2f\n,Sales5)
13Invalid Array Usage
- Example
- float Sales10
- Invalid array assignments
- Sales 17.50 / missing subscript /
- Sales-1 17.50 / subscript out of range /
- Sales10 17.50 / subscript out of range /
- Sales7.0 17.50 / subscript wrong type /
- Salesa 17.50 / subscript wrong type /
- Sales7 A / data is wrong type /
- Conversion will still occur
- Sales7 17 / 17 converted to float /
14Array Initialization
- Arrays may be initialized, but we need to give a
list of values - Syntax
- Type NameSize
- value0, value1, value2, , valueSize-1
- value0 initializes Name0, value1 initializes
Name1, etc. - values must be of appropriate type (though
automatic casting will occur)
15Array Initialization
- Example
- int NumDays12 31, 28, 31, 30, 31, 30, 31,
31, 30, 31, 30, 31 / Jan is 0, Feb is 1,
etc. / - int NumDays13 0, 31, 28, 31, 30, 31, 30,
31, 31, 30, 31, 30, 31 / Jan is 1, Feb is 2,
/ - Note
- if too few values provided, remaining array
members not initialized - if too many values provided, a syntax error or
warning may occur (extra values ignored)
16Sales Data as an Array
- Recall data
- Employee Sale
- ---------- ----
- 3 9.99
- 7 16.29
- 9 7.99
- 3 2.59
- .
- .
- .
- 7 49.00
- Idea declare Sales as array, update array items
17Updating Sales Data
- while (fscanf(sdata,df,numE,amtS) 2)
- switch (numE)
- case 0 Sales0 amtS break
- case 1 Sales1 amtS break
- case 2 Sales2 amtS break
- / cases 3-8 /
- case 9 Sales9 amtS break
-
-
- Q Whats the big deal??
- A Can replace entire switch statement with
- SalesnumE amtS
18Updating with Arrays
- while (fscanf(sdata,df,numE,amtS) 2)
- SalesnumE amtS
-
- When referencing array element can use any
expression producing integer as subscript - is an operator, evaluates subscript expression
then the appropriate location from the array is
found - Note, when we have an integer expression, we may
want to check subscript before using - if ((numE gt 0) (numE lt 9))
- SalesnumE amtS
- else
- / Problem employee /
19Using Array Elements
- Array elements can be used like any variable
- read into
- printf(Sales for employee 3 )
- scanf(f,(Sales3))
- printed
- printf(Sales for employee 3 7.2f\n,Sales3)
- used in other expressions
- Total Sales0 Sales1 Sales2
20Arrays and Loops
- Problem initialize Sales with zeros
- Sales0 0.0
- Sales1 0.0
-
- Sales9 0.0
- Should be done with a loop
- for (I 0 I lt 10 I)
- SalesI 0.0
21Processing All Elements of Array
- Process all elements of array A using for
- / Setup steps /
- for (I 0 I lt ArraySize I)
- process AI
- / Clean up steps /
- Notes
- I initialized to 0
- Terminate when I reaches ArraySize
22Initialize with Data from File
- if ((istream fopen(TotalSales,r)) NULL)
- printf(Unable to open TotalSales\n)
- exit(-1)
-
- for (I 0 I lt 10 I)
- fscanf(istream,f, (SalesI))
- fclose(istream)
- File TotalSales
- 1276.17 (Emp 0s Sales)
- 917.50 (Emp 1s Sales)
-
- 2745.91 (Emp 9s Sales)
23Array Programming Style
- Define constant for highest array subscript
- define MAXEMPS 10
- Use constant in array declaration
- float SalesMAXEMPS
- Use constant in loops
- for (I 0 I lt MAXEMPS I)
- fscanf(istream,f,(SalesI))
- If MAXEMPS changes, only need to change one
location
24Summing Elements in an Array
- Sales
- 117.00 Sales0
- 129.95 Sales1
- 276.22 Sales2
-
- 197.81 Sales9
- total 0.0
- for (I 0 I lt MAXEMPS I)
- total SalesI
- I Total
- 0.00
- 0 117.00 (Emp 0 sales)
- 1 246.95 (0 1 sales)
- 2 523.17 (0 1 2 s)
-
- 9 1943.89 (All emps)
25Maximum Element of an Array
- Sales
- 117.00 Sales0
- 129.95 Sales1
- 276.22 Sales2
-
- 197.81 Sales9
- maxS Sales0
- for (I 1 I lt MAXEMPS I)
- if (SalesI gt maxS)
- maxS SalesI
- / Note I starts at 1 /
- I maxS
- 117.00
- 1 129.95 (Max of 0,1)
- 2 276.22 (Max of 0,1,2)
-
- 9 276.22 (Max of all)
26Printing Elements of an Array
- Sales
- 117.00 Sales0
- 129.95 Sales1
- 276.22 Sales2
-
- 197.81 Sales9
- printf(Emp Num Sales\n)
- printf(------- -----\n)
- for (I 0 I lt MAXEMPS I)
- printf(4d13.2f\n, I, SalesI)
- Output
- Emp Num Sales
- ------- ------
- 0 117.00
- 1 129.95
- 2 276.22
-
- 9 197.81
27Passing an Element of an Array
- Each element of array may be passed as parameter
as if it were variable of base type of array
(type array is made of) - When passing array element as reference parameter
put in front of array element reference ( has
higher precedence) - does not hurt to put parentheses around array
reference though - example (Sales3)
28Passing Array Element Examples
- Passing by value
- void printEmp(int eNum, float eSales)
- printf(4d13.2f\n, eNum, eSales)
-
- in main
- printf(Emp Num Sales\n)
- printf(------- -----\n)
- for (I 0 I lt MAXEMPS I)
- printEmp(I,SalesI)
- Passing by reference
- void updateSales(float eSales, float newS)
- eSales eSales newS
-
- in main
- while (fscanf(sdata,df, numE,amtS) 2)
- updateSales(
- (SalesnumE), amtS)
29Passing Whole Array
- When we pass an entire array we always pass the
address of the array - syntax of parameter in function header
- BaseType NameforArray
- note, no value between - compiler figures out
size from argument in function call - in function call we simply give the name of the
array to be passed - since address of array is passed, changes to
elements in the array affect the array passed as
argument (no copy of array is made)
30Passing Whole Array Example
- float calcSalesTotal(float S)
- int I
- float total 0.0
- for (I 0 I lt MAXEMPS I)
- total SI
- return total
-
- in main
- printf(Total sales is 7.2f\n,
- calcSalesTotal(Sales))
31Size of an Array
- Sometimes we know we need an array, but not how
big the array is going to be - One solution
- allocate a very large array
- integer to indicate num elements of array in use
- loops use num elements when processing
- Example
- float SalesMAXEMPS
- int NumEmps 0
- processing
- for (I 0 I lt NumEmps I)
- process SalesI
32Sorting Arrays
- One common task is to sort data
- Examples
- Phone books (by name)
- Checking account statement (by check )
- Dictionaries (by word)
- NBA scoring leaders (by points)
- NBA team defense (by points)
33Sorting Order
- Team defense
- 90.0 Bulls
- 90.3 Heat
- 91.0 Knicks
-
- 98.9 76ers
- Sorted in ascending order
- Individual Scoring
- 31.0 Jordan
- 28.7 Malone
- 27.9 ONeill
-
- 0.3 Bricklayer
- Sorted in descending order
34Sorting in Arrays
- Data sorted usually same type, sorted in array
- A A
- 6 1
- 4 4
- 8 6
- 10 8
- 1 10
- before after
- sort sort
35Selection Sorting
- One approach (N is elements in array)
- 1. Find smallest value in A and swap with A0
- 2. Find smallest value in A1 .. AN-1 and swap
with A1 - 3. Find smallest value in A2 .. AN-1 and swap
with A2 - 4. Continue through AN-2
36Selection Sort Example
- A A
- 6 1
- 4 Find smallest 4
- 8 and swap 8
- 10 with A0 10
- 1 6
- A A
- 1 1
- 4 Find 2nd 4
- 8 smallest and 8
- 10 swap with A1 10
- 6 6
- A A
- 1 1
- 4 Find 3rd 4
- 8 smallest and 6
- 10 swap with A2 10
- 6 8
- A A
- 1 1
- 4 Find 4th 4
- 6 smallest and 6
- 10 swap with A3 8
- 8 10
37Selection Sort Notes
- If array has N elements, process of finding
smallest repeated N-1 times (outer loop) - Each iteration requires search for smallest value
(inner loop) - After inner loop, two array members must be
swapped - Can search for largest member to get
descending-order sort
38Selection Sort Algorithm
- For J is 0 to N-2
- Find smallest value in AJ, AJ1 .. AN-1
- Store subscript of smallest in Index
- Swap AJ and AIndex
- Find smallest in AJ..N-1
- Suppose J is 0
- Smallest A0
- for (K 1 K lt N K)
- if (AK lt Smallest)
- Smallest AK
- A K Smallest
- 6 6
- 4 1 4
- 8 2
- 10 3
- 1 4 1
- But we need location of smallest, not its value
to swap
39Selection Sort Algorithm
- Find location of smallest rather than value
- SmallAt 0
- for (K 1 K lt N K)
- if (AK lt ASmallAt)
- SmallAt K
- Swapping two elements
- Temp AJ
- AJ ASmallAt
- ASmallAt Temp
- J is 0, find smallest
- A K SmallAt
- 6 0
- 4 1 1
- 8 2
- 10 3
- 1 4 4
- Swap ASmallAt,A0
40Code for Selection Sort
- for (J 0 J lt N-1 J) / 1 /
- SmallAt J / 2 /
- for (K J1 K lt N K) / 3 /
- if (AK lt ASmallAt) / 4 /
- SmallAt K / 5 /
- Temp AJ / 6 /
- AJ ASmallAt / 7 /
- ASmallAt Temp / 8 /
41Selection Sort Example
- S J K Sml Effect
- 1 0 Start outer
- 2 0 Init SmallAt
- 3 1 Start inner
- 4 True, do 5
- 5 1 Update SmallAt
- 3 2 Repeat inner
- 4 False, skip 5
- 3 3 Repeat inner
- 4 False, skip 5
- 3 4 Repeat inner
- 4 True, do 5
- 5 4 Update SmallAt
- 6-8 Swap A0,A4
- 1 1 Repeat outer
- 2 1 Init SmallAt
- 3 2 Start inner
- 4 False, skip 5
- 3 3 Repeat inner
- S J K Sml Effect
- 4 False, skip 5
- 3 4 Repeat inner
- 4 False, skip 5
- 6-8 Swap A1,A1
- 1 2 Repeat outer
- 2 2 Init SmallAt
- 3 3 Start inner
- 4 False, skip 5
- 3 4 Repeat inner
- 4 True, do 5
- 5 4 Update SmallAt
- 6-8 Swap A2,A4
- 1 3 Repeat outer
- 2 3 Init SmallAt
- 3 4 Start inner
- 4 True, do 5
- 5 4 Update SmallAt
- 6-8 Swap A3,A4
42Modularizing Sort
- Want to make sort more readable
- Also, make sort a separate function
- First make Swap a separate function
- Have to pass array elements as reference params
- void Swap(int n1, int n2)
- int temp
- temp n1
- n1 n2
- n2 temp
-
- for (J 0 J lt N-1 J)
- SmallAt J
- for (K J1 K lt N K)
- if (AK lt ASmallAt)
- SmallAt K
- Swap((AJ),(ASmallAt))
43Modularizing Sort - Find Smallest
- Can make process of finding smallest a separate
function - Sort becomes
- for (J 0 J lt N-1 J)
-
- SmallAt
- findSmallest(A,J,N)
- Swap((AJ),
- (ASmallAt))
-
- Note whole array passed
- int findSmallest(
- int Aname, int J, int N)
-
- int MinI J
- int K
-
- for (K J1 K lt N K)
- if (AnameK lt
- AnameMinI)
- MinI K
- return MinI
-
44Modularizing Sort Itself
- Can then make the sort routine itself a function
- Localize variables such as J, SmallAt in function
- Pass N only if different from size of array
- void sort(int A, int N)
- int J
- int SmallAt
- for (J 0 J lt N-1 J)
-
- SmallAt
- findSmallest(A,J,N)
- Swap((AJ),
- (ASmallAt))
-
-
45Another Sort Insertion
- Idea sort like a hand of cards
- Algorithm
- Assume A0 .. A0 is sorted segment
- Insert A1 into sorted segment A0 .. 0
- Insert A2 into sorted segment A0 .. 1
- Insert A3 into sorted segment A0 .. 2
- continue until AN-1 inserted
46Inserting into Sorted Segment
47Insertion Sort Code
- void insertIntoSegment(int Aname, int J)
- int K
- int temp AnameJ
- for (K J (K gt 0) (AnameK-1 gt temp)
K--) - AnameK AnameK-1
- AnameK temp
-
- void sort(int A, int N)
- int J
- for (J 1 J lt N J)
- insertIntoSegment(A,J)
48Searching Arrays
- Prob Search array A (size N) for value Num
- Example
- search array for a particular student score
- A N
- 6 5
- 4
- 8 Num
- 10 8
- 1
- Sequential search start at beginning of array,
examine each element in turn until desired value
found
49Sequential Search
- Uses
- event-controlled loop
- must not search past end of array
- Code
- index 0 / 1 /
- while ((index lt N) (Aindex ! Num)) / 2 /
- index / 3 /
- When loop finishes either
- index is location of value or
- index is N
- Test
- if (index lt N) / 4 /
- printf(Found at d\n,index) / 5 /
- else
- printf(Not found\n) / 6 /
50Sequential Search Example
- S Num N index effect
- 8 5
- 1 0 init index
- 2 true, do 3
- 3 1 inc index
- 2 true, do 3
- 3 2 inc index
- 2 false, exit
- 4 true, do 5
- 5 print
51Sequential Search Example
- S Num N index effect
- 5 5
- 1 0 init index
- 2 true, do 3
- 3 1 inc index
- 2 true, do 3
- 3 2 inc index
- 2 true, do 3
- 3 3 inc index
- 2 true, do 3
- 3 4 inc index
- 2 true, do 3
- 3 5 inc index
- 2 false, exit
- 4 false, do 6
- 6 print
52Sequential Search (Sorted)
- index 0 / 1 /
- while ((index lt N) (Aindex lt Num)) / 2 /
- index / 3 /
- if ((index lt N) (Aindex Num)) / 4 /
- printf(Found at d\n,index) / 5 /
- else
- printf(Not found\n) / 6 /
- Can stop either when value found or a value
larger than the value being searched for is found - While loop may stop before index reaches N even
when not found (need to check)
53Sorted Sequential Search Example
- S Num N index effect
- 5 5
- 1 0 init index
- 2 true, do 3
- 3 1 inc index
- 2 true, do 3
- 3 2 inc index
- 2 false, exit
- 4 false, do 6
- 6 print
- Can do better when sorted
54Binary Search
- Example when looking up name in phone book,
dont search start to end - Another approach
- Open book in middle
- Determine if name in left or right half
- Open that half to its middle
- Determine if name in left or right of that half
- Continue process until name is found (or not)
55Code for Binary Search
- first 0
- last N - 1
- mid (first last) / 2
- while ((Amid ! num) (first lt last))
- if (Amid gt num)
- last mid - 1
- else
- first mid 1
- mid (first last) / 2
56Binary Search Example
- 0 4 0 first Num 101
- 1 7
- 2 19
- 3 25
- 4 36
- 5 37
- 6 50 6 mid
- 7 100 7 first 7 first
- 8 101 8 mid -- found
- 9 205 9 last
- 10 220 10 mid
- 11 271
- 12 306
- 13 321 13 last 13 last
57Binary Search Example
- 0 4 0 first Num 53
- 1 7
- 2 19
- 3 25
- 4 36
- 5 37
- 6 50 6 mid 6
last - 7 100 7 first 7 first 7 first, 7
first - 8 101 8 mid last,
- 9 205 9 last mid
- 10 220 10 mid
- 11 271
- 12 306
- 13 321 13 last 13 last
582-Dimensional Array Declaration
- Syntax BaseType NameIntLit1IntLit2
- Examples
- int Scores10010 / 100 x 10 set of scores /
- char Maze55 / 5 x 5 matrix of chars
for Maze / - float FloatM34 / 3 x 4 matrix of floats /
592D Array Element Reference
- Syntax NameintExpr1intExpr2
- Expressions are used for the two dimensions in
that order - Values used as subscripts must be legal for each
dimension - Each location referenced can be treated as
variable of that type - Example Maze32 is a character
602D Array Initialization
- 2D arrays can also be initialized
- Syntax
- BaseType NameDim1Dim2 val0, val1, val2,
val3, val4, - values are used to initialize first row of
matrix, second row, etc. - BaseType NameDim1Dim2
- val0-0, val0-1, val0-2, / first row /
- val1-0, val1-1, val1-2, / second row /
-
61Processing 2D Arrays
- Use nested loops to process 2D array
- Type NameDim1Dim2
- for (J 0 J lt Dim1 J)
- for (K 0 K lt Dim2 K)
- process NameJK
- Example print 5x5 Maze
- for (J 0 J lt 5 J)
- for (K 0 K lt 5 K)
- printf(c,MazeJK
- printf(\n)
622D Example
- int Scores10010 / 10 scores - 100 students
/ - int J
- int K
- for (J 0 J lt 100 J)
- printf(Enter 10 scores for student d ,J)
- for (K 0 K lt 10 K)
- scanf(d,(ScoresJK))
63Passing 2D Array Parameters
- A single value can be passed as either a value or
as a reference parameter - 2D array may be passed by reference using name,
syntax of parameter - Type ParamNameDim2
- Dim2 must be the same literal constant used in
declaring array - Each row of 2D array may be passed as a 1D array
64Passing Element of Array
- int Scores10010 / 10 scores - 100 students
/ - int J
- int K
- void readScore(int score)
- scanf(d,score)
-
- for (J 0 J lt 100 J)
- printf(Enter 10 scores for student d ,J)
- for (K 0 K lt 10 K)
- readScore((ScoresJK))
65Passing Row of Array
- int Scores10010 / 10 scores - 100 students
/ - int J
- void readScore(int score)
- scanf(d,score)
-
- void readStudent(int Sscores, int Snum)
- int K
- printf(Enter 10 scores for student d
,Snum) - for (K 0 K lt 10 K)
- readScore((SscoresK))
-
- for (J 0 J lt 100 J)
- readStudent(ScoresJ,J)
66Passing Entire Array
- int Scores10010 / 10 scores - 100 students
/ - void readScore(int score)
- scanf(d,score)
-
- void readStudent(int Sscores, int Snum)
- int K
- printf(Enter 10 scores for student d
,Snum) - for (K 0 K lt 10 K)
- readScore((SscoresK))
-
- void readStudents(int Ascores10)
- int J
- for (J 0 J lt 100 J)
- readStudent(AscoresJ,J)
672D Array Example
- int Scores10010 / 10 scores - 100 students
/ - int totalStudent(int Sscores)
- int J
- int total 0
- for (J 0 J lt 10 J)
- total SscoresJ
- return total
-
- float averageStudents(int Ascores10)
- int J
- int total 0
- for (J 0 J lt 100 J)
- total totalStudent(AscoresJ)
- return (float) total / 100
68Multi-Dimensional Array Declaration
- Syntax
- BaseType NameIntLit1IntLit2IntLit3...
- One constant for each dimension
- Can have as many dimensions as desired
- Examples
- int Ppoints100256256 / 3D array /
- float TimeVolData100256256256
- / 4D array /
69Multi-Dim Array Reference
- To refer to an element of multi-dimensional array
use one expression for each dimension - syntax
- NameExpr1Expr2Expr3 / 3D /
- NameExpr1Expr2Expr3Expr4 / 4D /
- etc.
- First expression - first dimension, 2nd
expression - 2nd dimension, etc. - C does not check dimensions