E2 – Fundamentals, Functions & Arrays Please refer to announcements for details about this exam. Make sure you fill the information below to avoid not being graded properly; Last Name Hanrahan First Name Kane Student ID # U84918862 Here is the grading matrix where the TA will leave feedback. If you scored 100%, you will most likely not see any feedback Question # points Feedback Max Scored 1 Tracing 3 2 Testing 2 3 Refactoring 2 4 Debugging 3 Interlude – How to Trace Recursive Programs To help you fill the trace table in question #1, we start with an example of a small recursive program & provide you with the trace table we expect you to draw. Example Program to Trace This program implements a power function recursively. We do not have local variables in either function, thus making the information in each activation record a bit shorter. #include #include int pwr(int x, int y){ if( y == 0 ) return 1; if( y == 1 ) return x; return x * pwr(x, y-1); } int main(){ printf("%d to power %d is %d\n", 5, 3, pwr(5,3)); return EXIT_SUCCESS; } Example Trace Table Please note the following about the table below; We only write down the contents of the stack when it is changed, i.e. when we enter a function or assign a new value to a variable in the current activation record. When we write the contents of the stack, we write the contents of the whole stack, including previous activation records. Each activation record is identified by a bold line specifying the name of the function & the parameters passed to it when it was invoked. It is followed by a bullet list with one item per parameter or local variable. New activation records are added at the end of the contents of the previous stack Line # What happens? Stack is 10 Entering main function main’s activation record No local vars / parameters 11 Invoking function pwr as part of executing the printf Stack is the same, no need to repeat it 4 Entering pwr function with arguments 5 & 3 main’s activation record No local vars / parameters pwr(5,3) activation record x is 5 y is 3 5 Testing if y is 0 false 6 Testing if y is 1 false 7 Invoking pwr(5,2) as part of return statement 4 Entering pwr function with arguments 5 & 2 main’s activation record No local vars / parameters pwr(5,3) activation record x is 5 y is 3 pwr(5,2) activation record x is 5 y is 2 5 Testing if y is 0 false 6 Testing if y is 1 false 7 Invoking pwr(5,1) 4 Entering pwr function with arguments 5 & 1 main’s activation record No local vars / parameters pwr(5,3) activation record x is 5 y is 3 pwr(5,2) activation record x is 5 y is 2 pwr(5,1) activation record x is 5 y is 1 5 Testing if y is 0 false 6 Testing if y is 1 true 6 Return value x which is 5 7 Back from invocation of pwr(5,1) with result 5. main’s activation record No local vars / parameters pwr(5,3) activation record x is 5 y is 3 pwr(5,2) activation record x is 5 y is 2 7 Return the result * x = 5 * 5 = .