180 likes | 433 Views
EECE.2160 ECE Application Programming. Instructor: Dr. Michael Geiger Spring 2017 Lecture 21 2-D arrays; arrays and functions. Lecture outline. Announcements/reminders Program 6 due 3/22 Exam 2 in class 3/29 Will be allowed one double-sided 8.5 ” x 11 ” note sheet Review
E N D
EECE.2160ECE Application Programming Instructor: Dr. Michael Geiger Spring 2017 Lecture 21 2-D arrays; arrays and functions
Lecture outline • Announcements/reminders • Program 6 due 3/22 • Exam 2 in class 3/29 • Will be allowed one double-sided 8.5” x 11” note sheet • Review • One-dimensional arrays • Today’s lecture • Two-dimensional arrays • Arrays and functions ECE Application Programming: Lecture 21
Review: arrays • Arrays: groups of data with same type • int x[10] has 10 elements, x[0] through x[9] • Can also define with initial values • e.g. double list[] = {1.2, 0.75, -3.233}; • Compiler will determine size of array from list • If initialization list has fewer values than size given, remaining values = 0 • i.e. int list[5] = {1, 2, 3} same as int list[5] = {1, 2, 3, 0, 0} • Must be sure to access inside bounds • You can access x[12] or x[-1], for example • Will access whatever’s at those locations ECE Application Programming: Lecture 21
Two-dimensional arrays • Two-dimensional arrays: can be used to represent tabular data • Declaration: <type> <name>[<rows>][<cols>] • Example (see below): int x[3][4]; • Index elements similarly to 1-D arrays ECE Application Programming: Lecture 20
Initializing 2D arrays • Can initialize similarly to 1D arrays, but must specify dimensions • Each row treated like a 1D array; rows separated by commas: • int y[3][4] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} }; ECE Application Programming: Lecture 20
2D arrays and loops • Typically use nested loops to work with 2-D arrays • One loop inside another: for (i = 0; i < 3; i++) { for (j = 0; j < 4; j++) { x[i][j] = y[i][j] * 2; } } • Be careful in loop body—switching your loop indices will cause trouble • Using x[j][i] would take you outside of the array! ECE Application Programming: Lecture 20
Example: Working with 2-D arrays Complete this program, which counts the # of negative values in each row of a 2-D array (assume the necessary #includes are done): #define NRows 3 // # of rows #define NCols 4 // # of columns int main() { double x[NRows][NCols] = // 2-D array { { 10, 2.5, 0, 1.5}, {-2.3, -1.1, -0.2, 0}, {10.5, -6.1, 23.4, -9.2} }; int negCnt[NRows] = {0}; // Initialize entire row count array to 0 int i, j; // Row and column indices /* INSERT CODE HERE--Visit every element in array x and count the number of negative values in each row */ // Now print the row counts for (i = 0; i < NRows; i++) printf(“Row %d has %d negative values.\n”, i, negCnt[i]); return 0; } ECE Application Programming: Lecture 21
Example solution /* Code to be added to visit every element in array x and count the number of negative values in each row */ for (i = 0; i < NRows; i++) for (j = 0; j < NCols; j++) if (x[i][j] < 0) negCnt[i]++; ECE Application Programming: Lecture 21
Passing arrays to functions • Do not need to specify array size (for reasons I’ll explain shortly) • Compiler will actually ignore 1-D array size, even if you put it in prototype • Therefore cannot check array size inside function • Prototype typically has array name and brackets to indicate you’re dealing with array • e.g. int findAvg(int arr[ ], int n); • n = # elements in array ECE Application Programming: Lecture 21
Example • Write a function for each of the following • findAvg(): Given an array of doubles (arr) and the # of elements in the array (n), find the average of all array elements • findMax(): Given an array of ints (arr) and the # of elements (n), find the largest (i.e., most positive) element in the array • sclAry(): Given an array of test scores (tests), the # of elements in the array (n), and an amount to scale those scores by (s), add s to every element in tests • Do not print scores in function; we’ll print in main program ECE Application Programming: Lecture 21
Passing Arrays to functions (findAvg) //*******************************************// function findAvg// On Entry:// arr[] - array with values to avg// n - number of values to avg// On Exit:// returns avg of first n elements of test[]double findAvg(double arr[], int n){ int i; double sum=0; double avg; for (i=0; i<n; i++) sum+=arr[i]; avg = sum / n; return avg;} ECE Application Programming: Lecture 21
Passing Arrays to functions (findBig) //*******************************************// function findMax// On Entry:// arr[] - array with values// n - number of elements to examine// On Exit:// returns biggest (most positive value in// the first n elements of test[]int findMax(int arr[], int n){ int i, big; big = arr[0]; for (i=1; i<n; i++) if (arr[i]>big) big = arr[i]; return big;} ECE Application Programming: Lecture 21
Passing Arrays to functions (SclAry) //*******************************************// function SclAry// On Entry:// tests[] - array with values to scale// n - number of values to scale// s - number of points to scale// On Exit:// The first n values of tests[] are// scaled by s pointsvoid SclAry(int test[], int n, int s){ int i; for (i=0; i<n; i++) test[i]=test[i]+s; // or use test[i]+=s; } ECE Application Programming: Lecture 21
Passing Arrays to functions (SclAry) #include <stdio.h>void SclAry(int tests[], int n, int s);void main(void){ int i; int x[]={ 51,62,73,84,95,100,66,57,48,79 }; int N=sizeof(x)/sizeof(int); SclAry(x,N,10); for (i=0; i<N; i++) printf("%4d",x[i]); printf("\n");} void SclAry(int test[], int n, int s) { int i; for (i=0; i<n; i++) test[i]=test[i]+s; // or use test[i]+=s; } ECE Application Programming: Lecture 21
Passing Arrays to functions (SclAry) Output of program: 61 72 83 94 105 110 76 67 58 89 For reference: int x[]={ 51,62,73,84,95,100,66,57,48,79 }; ??? What's wrong with this picture ??? ECE Application Programming: Lecture 21
Passing Arrays to functions Before call to SclAry After call to SclAry test[0] 51 3044 test[0] 61 3044 test[1] 62 3048 test[1] 72 3048 test[2] 73 304C test[2] 83 304C test[3] 84 3050 test[3] 94 3050 test[4] 95 3054 test[4] 105 3054 test[5] 100 3058 test[5] 110 3058 test[6] 66 305C test[6] 76 305C test[7] 57 3060 test[7] 67 3060 test[8] 48 3064 test[8] 58 3064 test[9] 79 3068 test[9] 89 3068 Passing the name only (i.e. test vs. test[4]) passes the ADDRESS of element zero of the array. Put another way: myfunc(ary) same as myfunc (&ary[0]) ECE Application Programming: Lecture 21
Arrays and pointers • Array name is a pointer to first array element • Can use pointers and arrays interchangeably • You can use [] to “index” a pointer • Example: int myArr[] = {1, 3, 5, 7, 9}; int *aPtr; aPtr = myArr; for(int i =0; i < 5; i++) printf(“%d”, aPtr[i]); • What does this print? • 1 3 5 7 9 contents of array! • Array arguments to functions are always passed by address ECE Application Programming: Lecture 21
Final notes • Next time • Spring Break! • Monday, 3/20: Character arrays and strings • Reminders: • Program 6 due 3/22 • Exam 2 in class 3/29 • Will be allowed one double-sided 8.5” x 11” note sheet ECE Application Programming: Lecture 21