Problem solving, structured design of algorithms, implementation of algorithms, and testing and debugging of programs. Data types, control structures, and abstractions. The laboratory component focuses on algorithm design and implementation.