Problem solving, abstraction, and design using C++ (2nd ed.)