This course is an introduction to computer science, focusing on the following skills:

**Computational Thinking [Wing, 2010]: You will learn to formulate problems and their solutions so that they can be solved by a computational agent.**Computational thinking draws on both mathematical thinking and engineering thinking. It has already had tremendous impact on science and engineering, and has begun to influence areas beyond them, such as medicine, archeology, economics, finance, journalism, law, social science, and political science. Computational thinking involves being able to- understand what aspects of a problem are amenable to computation
- reformulate problems to be amenable to computation
- evaluate the match between computational tools and techniques and a problem
- understand the limitations and power of computational tools and techniques
- apply or adapt a computational tool or technique to a new use
- recognize an opportunity to use computation in a new way
- explain problems and solutions in computational terms
- ask new questions that were not previously considered because of scale
- apply computational strategies to many domains
- make new discoveries through the analysis of large data

**Algorithms: You will learn to design and analyze algorithms for solving computational problems.**Specific knowledge includes: Common algorithmic patterns, such as divide-and-conquer, randomized algorithms, and self-adjusting data-structures. Several fundamental data structures. Basic ideas of time and space algorithm analysis, such as big-O notion, common complexity classes, the distinction between worst- and average-case analysis, and amortized analysis.**Programming: You will learn to transform algorithmic ideas into correct imperative programs, by specifying, writing, testing, and debugging code.**You will gain some familiarity with the C programming language, which is an imperative language that is relatively close to the machine. We will use a teaching-oriented subset of C called C0, which supports reasoning via contracts.

There will be two lectures per week, Tues-Thurs 10:30am-noon in Exley 139. This time will be used for chalk-board lectures, for interactively coding as a whole class, and possibly for small-group or individual work. Lectures will be your primary source of information for the course, and attendance is strongly encouraged.

There will be weekly lab sessions held on Wednesday 7pm-8:30pm in Exley 74. These sessions are required and may be used as follows: for you to work on warm-up problems with the course staff's assistance, for presentations of additional material to reinforce the lectures, and for you to work on assignments and ask questions.

There will be 10 one-week written assignments, due at the beginning of lab (Wednesday, 7pm). If you cannot make lab for some reason, you may drop the HW off at Dan's office, Exley 633. There will be 8 programming assignments. For the first part of the semester, programming assignments will be due on Wednesdays at 7pm, before lab.

There will be an in-class midterm and final exam.