Solutions
Transcription
Solutions
EE355 Midterm Spring ’15 ● Redekopp Name: Solutions Score: ________/100 Short Answer and Multiple Choice [20 pts.] 1) In C, when written in an expression, the name of an array evaluates to: _it's start address (p/c. Pointer)_________ 2) True / False: The expression ‘new int’ will return an ‘int’ 3) The expression (false==false==false) yields a bool value of ______ (true / false) 4) The expression ‘new double*[50]’ will return what specific C type: __double**__________ 5) Given that an array declared as: int NUMS[30], if the start address is at 400 then what is the index of the int at address 480? ___20 or NUMS[20]_________ 6) Tommy wants to ensure an argument he passes is not modified by the function he calls. He should pass it by __value____________ (one-word please)? 7) An arbitrary function may have __________ (more than one / only one / zero) written return statements. It is possible to execute ____________ (more than one / only one / zero) of them. 8) When should consider allocating an array on the heap if its size is unknown until runtime or ________ (provide another reason to allocate on the heap) If it should live beyond the end of the function (live indefinitely), etc. 9) Assume int x=2; The expression, x++ % 2 – 2*++x / 4.0, evaluates to what value? -2 or -2.0 10) Which of the following actions could cause a segmentation fault (program crash) [circle all that apply]? a) Passing a pointer to a function b) Dereferencing a NULL pointer c) Accessing an array using an out-of-bounds index d) Calling delete on a pointer to a dynamically allocated object 11) What Linux command would you use to change the directories to be 2 levels above your current directory. cd ../.. 12) Binary search can run on _______ (both sorted and unsorted arrays, sorted arrays only, unsorted arrays only) and runs in O(___) ( 1 / log n / n / n2) 13) [8 pts.] Use nested loops (and no arrays) to write C++ code that will produce the following output to the monitor exactly as shown. Note: Tabs ('\t') separate each item on a line. 100 99 98 97 96 200 198 196 194 192 300 297 294 291 288 400 396 392 388 384 See if it works but it must use nested loops. Here is a reference solution for(int i = 1; i <= 4; i++){ for(int j=0; j <5; j++){ cout << 100*i – i*j << ‘\t’; } cout << endl; } 14) [10 pts.] Analyze the following program with a recursive function and show what will be output by the various cout statements. int f1(int *data, int n){ if(n < 0) return 0; cout << data[n] << endl; if(data[n] > 0){ return f1(data, n-1) + data[n]; } else{ return f1(data, n-2) + data[n]; } } int main() { int data[8] = {-5, -7, -2, 3, 1, -4, 6, 8}; cout << "Sum is " << f1(data,7) << endl; return 0; } 8 6 -4 3 -2 -5 Sum is 6 // For positive number it should take 1 step backward, negative take 2 steps backward 15) [12 pts.] Write a function that takes a 1D array of doubles that actually represents 2-dimensional data similar to your PA2 maze and returns an array of the maximum values in each column. The 2 dimension sizes are given by NR (number of rows) and NC (number of columns). The 1D array holds all of the elements of a single row in contiguous order (all elements or row 0 come before elements of row 1 in the array). Complete the return type & type in main() as well. // This is a 1D array with 12 // 2x6 or 3x4 or 1x12 double data[] = {93.5, 80.2, 91.2, 100.0, 34.5, 78.2, elements that can be thought of as 79.1, 85.6, 61.5, 89.3, 96.5, 87.2}; _double*____________ maxscores(double* scores, int NR, int NC){ { double* max = new double[NC]; for(int c=0; c < NC; c++){ max[c] = 0.0; for(int r=0; r < NR; r++){ if(scores[r*NC+c] > max[c]){ max[c] = scores[r*NC+c]; } } } return max; } int main() { int NR = 3, NC = 4; ___double*______________ max = maxscores(data, NR, NC); for(int i=0; i < NC; i++){ cout << max[i] << " "; } cout << endl; return 0; } // Result for the call in main above should print // 93.5 100 96.5 89.3 16) [12 pts.] Examine the code below (line numbers are provided for easy referencing). Of the options listed below, circle the ones that are POSSIBLE OUTPUTS of the program. Do not circle outputs that are impossible for the program to produce. Possible outputs (circle all that apply): ABCD ABD ADE ADEF 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 int x, y; cin >> x >> y; if( x > y ){ cout << "A"; if( y > 100){ cout << "B"; } else if( x < 75 ){ cout << "C"; } } if( y < 75 ){ cout << "D"; if( x == 20){ cout << "E"; } else if( y == 50){ cout << "F"; } } CD CDEF ACE ACDF If B or C print, then A has to print. Similarly if E or F prints then D has to This rules out: CD, CDEF, ACE ABCD and ABD can't happen because y > 100 (B) and thus D can't happen. ADE and ADEF can't happen because x > 75 (no C) so x can't be 20 (E) 17) [12 pts.] Analyze the following code and indicate what will be printed by the program in the box below. void f1(double r){ r += 1.0; cout << r << endl; } void f2(double *s, int t){ *(s+2) -= t; f1(s[0]); s++; cout << *s << endl; *s = 6.0; } We pass s+1 (pointer to s[1] to f2. Thus when f2 accesses (s+2) we are really accessing s[3] from the main. Similarly when we pass s[0] in f2 we are really passing s[1] from main When we increment s and we are now pointing at s[2] from main and set it to 6.0 int main() { double s[4] = {1.5, 2.0, 3.25, 4.0}; f2(s+1, 3); cout << s[0] << " " << s[1] << " " << s[2] << " " << s[3] << endl; return 0; } 3 3.25 1.5 2 6 1 18) [12 pts.] Write a function to output the text version of some command line numeric strings. That is, for each command line arguments which will always be an arbitrary length string of digits, output the word version of each digit in the order it appears. We have defined an array “digits” to help you. For an execution of the program such as: $ ./prog1 754 263 The desired output is: seven five four two six three #include <iostream> #include <cstring> using namespace std; const char* digits[] = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"}; int main(int argc, char* argv[]){ for(int i=1; i < argc; i++){ int len = strlen(argv[i]); for(int j=0; j < len; j++){ cout << digits[argv[i][j]-'0'] << " "; } cout << endl; } return 0; } 19) [14 pts] Write a program that receives a filename on the command line AND an integer on the command line which represents how many integer values are in the text file specified by filename. Open the text file, read in the integers in the file, and output the sum of the first and last integer, second and second-to-last, third and third-to-last integer, etc. If the number of integers in the file is odd, you should add the middle element to itself. Your program should: Check whether the file opened successfully and return -1 if unsuccessful Output the sums of the appropriate pairs of numbers. An example is shown in the box below You may declare other variables, call functions, etc. to make your code work. We have provided the code that attempts to open the file for you. #include <iostream> #include <fstream> #include <cstdlib> #include <cmath> using namespace std; int main(int argc, char* argv[]){ ifstream myfile(argv[1]); int i=0, len; if(myfile.fail()){ return 1; } len = atoi(argv[2]); int *data = new int[len]; int x; while( myfile >> x){ data[i++] = x; } myfile.close(); for(int j=0; j < (len+1)/2; j++){ cout << data[j] + data[len-1-j] << " "; } cout << endl; delete [] data; return 0; } If the file data.txt contains: 1 5 2 3 6 And the program is run as: $ ./prog data.txt 5 You should output: 7 8 4