introduction to programming and problem solving