Emphasis is on the structure of optimal solutions, algorithms to find them, and the underlying theory that explains both. Emphasis on using symbology to represent abstract objects and the application of formal reasoning to situations in computer science. An introduction to discrete mathematics with strong applications to computer science. Topics include set theory, functions and relations, prepositional logic, proof techniques, recursion, counting techniques, difference equations, graphs and trees. Included is encoding and decoding techniques, both for the purposes of data compression and for the detection and correction of errors.
Lectures cover the theoretical aspects of machine architecture.
In the laboratory, designs discussed in lecture are constructed in software. An introduction to a wide range of topics relating to programming languages with an emphasis on abstraction and design. The course has a strong lab component where students get to construct large programs in at least three different imperative programming languages. An introduction to the non-procedural programming paradigms. The shortfalls of procedural programming derived from the von Neumann model of computer architectures are discussed.