This book is primarily intended for a first-year undergraduate course in programming. It is structured in a problem-solution format that requires the student to think through the programming process, thus developing an understanding of the underlying theory. Each chapter is more or less independent. Although the author assumes some moderate familiarity with programming constructs, the book is easily readable by a student taking a basic introductory course in computer science. Students and teachers will find this both an excellent text for learning programming and a source of problems for a variety of courses.