CSE2050 Exam #1.  Open books, open notes

Name _______________________________________________________

1.  (35 pts).  Write a function repeat(s, n) that takes a string s 
and changes it to a concatenation of n copies of s.  For example:

  string s = "hello";
  repeat(s, 3);
  cout << s << endl;  // hellohellohello


  void repeat(string& s, int n) {
    string t;
    for (int i=0; i<n; ++i)
      t += s;
    s = t;
  }


Other variations are possible.  I deducted 4 points if s was
not passed by reference, 4 if the logic was wrong (an extra variable
is needed), 2 if you returned something.  The function should
not print anything.

2.  (15 pts).  The following function is supposed to print the middle 
element of a vector<int> (or just to the right of the middle if the 
size is even), given the beginning and ending iterators.

  void print_middle(vector<int>::const_iterator begin,
                    vector<int>::const_iterator end) {
    if (begin == end)
      throw domain_error("middle of empty vector");
    cout << *((begin + end)/2);  // Error
  }

The function does not compile because iterators cannot be added to 
each other or divided.  The only allowable arithmetic operations 
are addition or subtraction of an int to get another iterator  
(begin + 1, end - 3), or subtraction of two iterators to get an 
int (int size = end - begin;).  Rewrite the last statement to 
correct this error.


  cout << *(begin + (end - begin)/2);

or

  cout << begin[(end - begin)/2];



3.  (15 pts).  Write a header file print_middle.h that would allow 
print_middle() to be compiled separately from the rest of the program.


  #ifndef GUARD_print_middle_h
  #define GUARD_print_middle_h
  #include <vector>
  void print_middle(std::vector<int>::const_iterator begin,
                    std::vector<int>::const_iterator end);
  #endif


The #ifndef...#endif statements are optional.  I took off
2 points if you used a using statement instead of std::
I took off 6 if you put the code in the header file.


4.  (35 pts.)  Write a main() function to include your header file 
and test print_middle() by printing the middle element of a vector.  
Demonstrate catching the exception by passing an empty slice of the 
same vector. 


  #include <iostream>
  #include <vector>
  #include <stdexcept>
  #include "print_middle.h"
  using namespace std;

  int main() {
    vector<int> v(5);
    try {
      print_vector(v.begin(), v.end());
      print_vector(v.begin(), v.begin());  // Empty
    }
    catch (domain_error e) {
      cout << "Empty vector\n";
    }
    return 0;
  }


I took off 8 points if you forgot the try...catch block.
There are various ways to put elements in the vector such
as using v.push_back() or v.resize().