CS 23
30 pts., due Feb. 14
Write C++ functions to solve each of the following problems. Use pre- and post-conditions for documentation. Construct a loop invariant for each loop.
// Pre-Condition: n is a non-negative integer. // Post-Condition: The factorial of n is returned. int fact(int n) { int i; int prod = 1; // Invariant: prod = 1 * 2 * ... * (i - 1) for (i = 2; i <= n; ++i) prod *= i; return prod; }
// Pre-Condition: data is an integer array of n elements. // Post-Condition: Returns the smallest value in data. int min(int data[], int n) { int index = 0; int i; // Invariant: data[index] = smallest(data[0]...data[i - 1]) for (i = 1; i < n; ++i) if (data[i] < data[index]) index = i; return data[index]; }
// Pre-Condition: data is an integer array of n elements. // Post-Condition: data is sorted into ascending order. void sort(int data[], int n) { int i; int j; int sorted = 0; // Invariant: The elements in data[i + 1]...data[n - 1] are the // largest elements in the array and are sorted in ascending order. for (i = n - 1; !sorted && i > 0; --i) { sorted = 1; // Invariant: The largest element of data[0]...data[j] is in // data[j]. for (j = 0; j < i; ++j) if (data[j] > data[j + 1]) { sorted = 0; swap(data[j], data[j+1]); } } } // Pre-Condition: i and j are integers. // Post-Condition: i's and j's values are exchanged. void swap(int &i, int &j) { int temp = i; i = j; j = temp; }
// Pre-Condition: data is an integer array of n elements. Each of the // n values is unique. // Post-Condition: The second smallest value of data is returned. int secSmall(int data[], int n) { int i; int small; int sec; small = min(data, n); if (data[0] == small) sec = 1; else sec = 0; // Invariant: data[sec] is the smallest item in data[0]...data[i-1] // which is not smallest item in the entire array. (I.e., it is the // second smallest item. for (i = 0; i < n; ++i) if (data[i] != small && data[i] < data[sec]) sec = i; return data[sec]; }