CSC 311

Fall 2001

Sample midterm answers

  1. int ilog(int n)
    {
      if (n == 1)
        return 0;
      else
        return 1 + ilog(n/2);
    }
    
  2. int maximum(int A[], int first, int last)
    {
      if (first == last)
        return A[first];
      else {
        int middle = (first + last)/2;
        int leftmax = maximum(A, first, middle);
        int rightmax = maximum(A, middle+1, last);
        if (leftmax > rightmax)
          return leftmax;
        else
          return rightmax;
      }
    }
    
  3. The function requires n-1 comparisons.
  4. class StopWatch {
    public:
      StopWatch();
      void start();
      void stop();
      void reset();
      void advanceOneSecond();
      unsigned int minutes();
      unsigned int seconds();
    
    private:
      unsigned int secondsElapsed;
      bool running;
    };
    
  5. StopWatch::StopWatch()
    {
      secondsElapsed = 0;
      running = false;
    }
    
    void StopWatch::start()
    {
      running = true;
    }
    
    void StopWatch::stop()
    {
      running = false;
    }
    
    void StopWatch::reset()
    {
      running = false;
      secondsElapsed = 0;
    }
    
    void StopWatch::advanceOneSecond()
    {
      if (running)
        secondsElapsed++;
    }
    
    unsigned int StopWatch::minutes()
    {
      return secondsElapsed / 60;
    }
    
    unsigned int StopWatch::seconds()
    {
      return secondsElapsed % 60;
    }
    
    
  6. void reverseString(string& s)
    {
      stack cs;
    
      for (int i = 0; i < s.length(); i++) {
        cs.push(s[i]);
    
      for (int i = 0; i < s.length(); i++) {
        s[i] = cs.pop();
    
    }
    
  7. bool is_balanced(const string& expression)
    {
      const char LEFT_PARENTHESIS = '(';
      const char RIGHT_PARENTHESIS = ')';
      const char LEFT_BRACKET = '[';
      const char RIGHT_BRACKET = ']';
      
      stack store;
      string::size_type i;
      char next;
      bool failed = false;
    
      for (i = 0; !failed && (i < expression.length()); i++) {
        next = expression[i];
        if (next == LEFT_PARENTHESIS || next == LEFT_BRACKET) 
          store.push(next);
        else if (next == RIGHT_PARENTHESIS) {
          if (!store.empty() && store.top() == LEFT_PARENTHESIS)
            store.pop();
          else
            failed = true;
        }
        else if (next == RIGHT_BRACKET) {
          if (!store.empty() && store.top() == LEFT_BRACKET)
            store.pop();
          else
            failed = true;
        }
      }
    
      return (store.empty() && !failed);
    }
    
  8. int evaluateExpression(const string& s)
    {
      stack<int> digitStack;
    
      for (int i = 0; i < s.length(); i++) {
        if (isdigit(s[i])) {
          digitStack.push(s[i] - '0');
        }
        else if (isoperator(s[i])) {
          assert(!digitStack.empty());
          int rightOperand = digitStack.top();
          digitStack.pop();
          assert(!digitStack.empty());
          int leftOperand = digitStack.top();
          digitStack.pop();
          switch (s[i]) {
            case '+': digitStack.push(leftOperand + rightOperand); break;
            case '-': digitStack.push(leftOperand - rightOperand); break;
            case '*': digitStack.push(leftOperand * rightOperand); break;
            case '/': digitStack.push(leftOperand / rightOperand); break;
          }
        }
      }
      assert(!digitStack.empty());
      return digitStack.top();
    }
    
  9. #include <stdlib.h>
    
    class Die {
    public:
      Die();
      void roll();
      unsigned int readTop();
    private:
      unsigned int topValue;
    };
    
  10. Die::Die()
    {
      topValue = 1;
    }
    
    void Die::roll()
    {
      topValue = 1 + rand() % 6;
    }
    
    unsigned int Die::readTop()
    {
      return topValue;
    }