http://www.comp.nus.edu.sg/~cs1010/ WEEK 7 Class Activities © NUS CS1010 (AY2015/6 Semester 2) Week 7: Arrays Preparation Unit #11: Random Numbers Unit #12: Using UNIX I/O Redirection One-dimensional Arrays Going through examples in Unit #10 Multi-dimensional Arrays Exercise #1: Sum to Random Position Exercise #2: Matrix Multiplication Exercise #3: Valid Path Week7 - 2 © NUS CS1010 (AY2015/6 Semester 2) Week7 - 3 Random Numbers We will go through Unit #11 Random Numbers. © NUS CS1010 (AY2015/6 Semester 2) Using UNIX I/O Redirection We will go through Unit #12 UNIX I/O Redirection Week7 - 4 © NUS CS1010 (AY2015/6 Semester 2) Week7 - 5 One-dimensional Arrays We will go through the examples in Unit #10. © NUS CS1010 (AY2015/6 Semester 2) Week7 - 6 Multi-dimensional Arrays We will go through the examples in Unit #10. Work out the following exercises. © NUS CS1010 (AY2015/6 Semester 2) Week7 - 7 Exercise #1: Sum to Random Position (1/4) Write a program Week7_SumToRandomPos.c that reads in values (of type float) for a 2D array with at most 5 rows and 8 columns, generates a random position in the array and sums the elements from index [0][0] to that position, in row-major order. Your program should contain the function sumPartial() to take in the array and a random position and return the sum of the elements up to that position. What are the parameters of sumPartial()? The incomplete program Week7_SumToRandomPos.c is given. Study the function scanArray() closely. © NUS CS1010 (AY2015/6 Semester 2) Week7 - 8 Exercise #1: Sum to Random Position (2/4) The sum is printed in 2 decimal places. To ease data input, create a file to store the input data, and use UNIX input redirection to redirect input from this file when you execute the program. Sample run: $ Enter rows and columns: 3 4 $ Enter 12 values: 5.1 4.2 -6.3 12.4 7.5 8.6 -3.7 11.8 9.9 -20.0 17.1 10.2 Sum to position [1][2] = 27.80 © NUS CS1010 (AY2015/6 Semester 2) Week7 - 9 Exercise #1: Sum to Random Position (3/4) #include <stdio.h> #include <stdlib.h> #include <time.h> #define MAX_ROWS 5 #define MAX_COLS 5 Week7_SumToRandomPos.c void scanArray(float [][MAX_COLS], int, int); int main(void) { float array[MAX_ROWS][MAX_COLS]; int rows, cols, upToRow, upToCol; printf("Enter rows and columns: "); scanf("%d %d", &rows, &cols); scanArray(array, rows, cols); srand(time(NULL)); upToRow = rand() % rows; upToCol = rand() & cols; // call sumPartial() function below printf("Sum to position [%d][%d] = %.2f\n"); // incomplete return 0; } © NUS CS1010 (AY2015/6 Semester 2) Week7 - 10 Exercise #1: Sum to Random Position (4/4) Week7_SumToRandomPos.c void scanArray(float arr[][MAX_COLS], int rows, int cols) { int r, c; printf("Enter %d values:\n", rows * cols); for (r=0; r < rows; r++) for (c=0; c < cols; c++) scanf("%f", &arr[r][c]); } // Sum elements from position [0][0] to a random // position [upToRow][upToCol]. // Fill in sumPartial() function below. © NUS CS1010 (AY2015/6 Semester 2) Week7 - 11 Exercise #2: Matrix Multiplication (1/3) To multiply two matrices A and B, the number of columns in A must be the same as the number of rows in B. The resulting matrix has same number of rows as A and number of columns as B For example, multiplying a 24 matrix with a 43 matrix gives a 23 matrix. mn matrix np matrix = mp matrix © NUS CS1010 (AY2015/6 Semester 2) Week7 - 12 Exercise #2: Matrix Multiplication (2/3) To compute C = A B, where A, B, C are matrices ci,j = (ai,1 b1,j ) + (ai,2 b2,j ) + . . . + (ai,n bn,j ) ci,j is sum of terms produced by multiplying the elements of A’s row i with B’s column j. Examples: 1 2 0 1 0 0 0 1 1 2 1 0 1 0 1 0 2 1 3 2 0 2 3 1 1 2 1 3 2 1 3 2 2 1 3 0 2 1 2 15 17 11 13 13 6 2 1 2 3 3 0 1 3 Complete the prodMatrix() function in Unit10_MatrixOps.c © NUS CS1010 (AY2015/6 Semester 2) Week7 - 13 Exercise #2: Matrix Multiplication (3/3) Multiplying a 2 4 matrix with a 4 3 matrix: col 0col 1 row 0 2 1 3 2 row 1 3 0 2 1 3 2 1 2 2 3 1 3 0 2 1 3 6 + 2 + 3 + 4 = 15 4 + 2 + 9 + 2 = 17 9 + 0 + 2 + 2 = 13 row 0,row 0, col 0 col 1 = ? 17 ? 11 ? 15 ? 13 ? 13 row 1, col 0 ? 6 © NUS CS1010 (AY2015/6 Semester 2) Week7 - 14 Maze (1/2) Let’s consider a maze that is represented by a twodimensional 6 6 integer array. The value of each array element is either 0 (representing a wall) or 1 (representing a cell). The starting and exit points in the maze are specified by the cells maze[0][0] and maze[5][5] respectively. A path is represented by a single-dimensional character array with four possible element values representing the move directions: ‘N’ (for north), ‘S’ (for south), ‘E’ (for east), and ‘W’ (for west). Each path is defined with respect to the starting cell maze[0][0]. © NUS CS1010 (AY2015/6 Semester 2) Week7 - 15 Maze (2/2) Example of a 6 6 maze Start 0 1 2 3 4 5 0 1 2 3 4 5 Exit Cell Wall © NUS CS1010 (AY2015/6 Semester 2) Week7 - 16 Exercise #3: Valid Path A path in a maze is defined to be valid if the path is within the maze and does not knock against any wall. 0 1 2 3 4 5 Examples: 0 Valid path: ‘E’, ‘E’, ‘S’, ‘N’, ‘E’, ‘E’, ‘S’ Invalid path: ‘S’, ‘S’, ‘W’ Invalid path: ‘S’, ‘S’, ‘S’, ‘E’ 1 2 3 4 Write a function 5 inisValid (int maze[][6], char path[]) that takes in a 6 6 maze and a path with at most 10 characters. It returns 1 if path is valid in maze, or returns 0 otherwise. An incomplete program Week7_IsValid.c is given. It handles string input which is not covered yet. © NUS CS1010 (AY2015/6 Semester 2) Week7 - 17 Things-To-Do Revise Chapter 6: Numeric Arrays Lab #3 Deadline: 4 Mar 2016, Friday, 10pm Mid-Semester Test: 9 Mar 2016 Check CS1010 “Term Tests” web page Continue to do practice exercises on CodeCrunch © NUS CS1010 (AY2015/6 Semester 2) End of File Week7 - 18