principles of programming and problem solving