```Sample questions for Midterm 2:

1. Define the following terms:

infinite loop
backtracking
base case (for recursion)
recursive case
big O
best case analysis
average case analysis
worst case analysis

2. Translate the following for loop into a do-while loop:

for (I = 0, tot = 0, cnt = 0; I < N; I += 2) {
tot += I;
cnt++;
printf("%.2f\n",(float) tot / cnt);
}

3. Write a piece of code to produce the following output using at most
one newline character in your printf statements:

*
**
***
****
***
**
*

4. What is the output of the following piece of code:

for (I = 0; I < 12; I++) {
for (J = 4 - (I % 4); J > 0; J--)
printf(" ");
for (J = 0; J < (I % 4) + 1; J++)
printf("X");
printf("\n");
}

5. Give a piece of code that will copy the characters from a text
file file1.txt to a new file file2.txt.  Furthermore, when copying
the characters, any lower case characters in file1.txt should be
written as a corresponding upper case character in file2.txt (if
the character 'a' is read from file1.txt, the character 'A' should
be written to file2.txt).

6. How do the fgetc and ungetc functions work?  Indicate the arguments
each takes and what values they return.  Also, give an example of
how each function is used.

7. Give code for:

Sequential search of an array

Sequential search of a sorted array

Binary search of a sorted array

Selection sort

Insertion sort

Merge of two adjacent segments of an array

Mergesort given a predefined merge routine

8. Write a function that takes an array of characters S of length N and
returns 1 if that array contains a palindrome and 0 otherwise.  A palindrome
is a sequence of characters that is the same written backwards.

9. Write a recursive solution to the previous problem.

10. Write a recursive function that sums up the squares of all the numbers
from 1 to N (i.e., SumSqrs(N) returns 1^2 + 2^2 + 3^2 + ... + N^2).

11. Given a 2D character array A:
0 1 2 3
0 e e X X
1 X e e e
2 X e X X
3 e e e X

and the function Visit:

void Visit(char A[][4], int r, int c) {
if (A[r][c] == 'e') {
A[r][c] = '.';
printf("<%d,%d> ",r,c);
if (r > 0) Visit(A,r-1,c); /* 1 */
if (c > 0) Visit(A,r,c-1); /* 2 */
if (r < 3) Visit(A,r+1,c); /* 3 */
if (c < 3) Visit(A,r,c+1); /* 4 */
}
}

the program will print:

<0,0> <0,1> <1,1> <2,1> <3,1> <3,0> <3,2> <1,2> <1,3>

if we call Visit(A,0,0)

how could you reorder the statements labeled /* 1 */ to /* 4 */ to
print:

<1,1> <1,2> <1,3> <2,1> <3,1> <3,0> <3,2> <0,1> <0,0>

if we call Visit(A,1,1)?

<1,1> <2,1> <3,1> <3,2> <3,0> <0,1> <0,0> <1,2> <1,3>

12. Give the Big-O notation (the growth-rate function) for each of the
following formulas:

2
N  + 3N + 4NlogN + 5/N

2     3    N
5N + 25N  + 3N  + 4

2         2
3N logN + 5N  + NlogN + 2N

13. Give a situation where each of the sorts discussed in class (insertion,
selection, and merge) is optimal.  You should include a discussion of the
performance characteristics of the sorting algorithm that backs up your