This course introduces students to algorithm design and implementation in a modern, high-level, programming language (currently, Java). It emphasizes problem-solving by abstraction. There will also be a brief coverage of the social and ethical aspects of computing. Topics include data types, variables, expressions, basic imperative programming techniques including assignment, input/output, subprograms, parameters, selection, iteration, Boolean type, and expressions, and the use of aggregate data structures including arrays and records. Students will also have an introduction to the basics of abstract data types and object-oriented design, as well as the mathematics of computer science such as Boolean algebra, basic number theory, etc.