This course is the same as CS207 but is restricted to CS students. The course covers computer programming and the use of abstractions; software engineering principles of data abstraction and modularity; object- oriented programming; fundamental data structures (such as stacks, queues, sets) and data-directed design. The course is designed for students who lack experience in imperative programming languages with explicit memory management. It covers also the practical implementation of concepts such as recursion; recursive data structures (linked lists, trees, graphs); and basic time and space complexity analysis. The course uses the C++ programming language as a vehicle and also covers the mechanics of C++.