The computing revolution is transforming our world in ways we are only beginning to understand, but it is clear that a knowledge of computing is invaluable to any 21st-century citizen. Computer science is the study of the principles of computing: it is founded in the basic skills of programming and problem-solving, but a university education in the subject requires the development of deeper insights into the nature of algorithms, the languages we use to describe them and the machines on which we realize them. In addition to these subjects, students at Willamette have the opportunity to explore advanced topics ranging from 3D graphics to artificial intelligence, from genetic algorithms (in which populations of programs are "bred" for success) to the theoretical foundations of language and computation. Whichever topics they pursue, the Willamette curriculum is designed to provide students with a principled education that will support their goals of life-long learning in a constantly-changing field.

Introductory computing classes at Willamette provide non-majors and pre-majors with a broader perspective on computing, build basic skills which can be applied to other fields and foster the creative use of graphics and animation in collaboration with music and the arts. These classes are designed to synergize with other studies and thus to contribute to a broad liberal-arts education.

The study of computer science opens up a number of options in later life: many graduates with a computer science major or minor find careers in programming, design, consulting or system support. Other choose to deepen their studies in graduate school, ultimately providing contributions to basic research in the field or pursuing influential development opportunities in industry. Finally, some students combine these options, first building up practical work experience in a business or industrial setting and then consolidating these experiences through graduate study.

The University has excellent computing facilities open to students, including both general-access labs with Windows and Macintosh computers and a number of labs with specially-selected equipment to support graphics or laboratory use. Wired access in dorm rooms and a campus-wide wireless network allow students great flexibility in the pursuit of their studies, in communication with family and friends and in general access to the resources of the Internet.

Entering students with a score of five on the Computer Science Advanced Placement exam are awarded credit for CS 141, Introduction to Programming. Students with scores of four should confer with the department about possible credit.

CS 145 (QA*) Images and Imagination (1)

Computational Art is an emerging new field that uses mathematical algorithms and computers to generate imaginative and abstract images. Fractals are a small but well known subset within this extensive and varied field. In this course, students learn and apply mathematics and computer programming to generate a wide range of images and animations. The work is guided and evaluated by standard principles of design and composition.

CS 154 Introduction to Functional Programming (1)

This course provides a broad introduction to programming in the functional style, including motivations, history, programming techniques and theory. Functional programming provides concise and elegant solutions to many problems, using an approach based on mathematics, logic and proof. The course will be taught in Haskell, a powerful, modern programming language which can be used for both mathematical investigations and serious system development. Topics covered will include a broad introduction to computing, symbolic representation of data, list manipulation, recursion, algebraic data types, higher-order functions and type systems. The study of functional programming languages provides a useful foundation and perspective for further study of topics in algebra, logic, programming languages, computer science theory and linguistics.

Prerequisite: MATH 251, or PHIL 140, or any CS programming course, or consent of instructor.

Offering: Fall

Instructor: Ruehr

CS 203X Problem Solving for the ACM Programming Contest (.25)

Problem solving and computational thinking is central to computer science. In this course, students and instructors meet once a week to discuss and apply theoretical and practical knowledge learned in earlier courses to solve and implement problems from the Association for Computing Machinery (ACM) programming contest. This course may be repeated for credit.

CS 241 (QA) Data Structures (1)

Theoretical and practical study of programming and abstract data types in Java including lists, stacks, queues, trees and algorithms used on these data structures. The course includes object implementation of structures and sharpens programming skills learned in previous courses.

CS 293 Individual Study of a Programming Language (.25)

This course enables students who already know some high-level structured programming language to extend their capabilities in another language. It is self-paced for individual study under the supervision of an instructor. Arrangements for this course must be made with a faculty member before registration. The course may be offered in different languages; a student may earn credit for at most two offerings for a maximum of .5 credit.

CS 343 Analysis of Algorithms (1)

In this course students will study methods to analyze algorithms for their correctness and run time efficiency as well as general design and analysis techniques. Topics include: asymptotic analysis, searching and sorting algorithms, divide and conquer techniques, greedy algorithms, dynamic programming, graph algorithms, efficient data structures, and NP-completeness.

CS 353 Architecture and Compilers (1)

An investigation into how computers and programs work, from the lower levels of internal logic to the higher levels of programming languages designed for human use. Topics covered include: digital representation and digital logic; the internal structure and organization of computers; the hierarchy of programming languages; and techniques used to translate computer programs into machine-readable form. Includes a significant lab component in which students implement the concepts developed in the course.

CS 363 Simulation of Natural and Computer Systems (1)

Design and implementation stimulations of natural systems and computer systems. Students (individually and in teams) will utilize object-oriented programming techniques to create graphical user interfaces to both existing simulations and simulations of their own design.

CS 391 Independent Study (.5 or 1)

This course is intended for the qualified advanced student who wishes to do an intensive independent study in an area not covered by an existing course in the department. Arrangements for this course must be made with a faculty member before registration.

CS 392 Independent Project (.5 or 1)

This course is intended for the qualified advanced student who wishes to do an independent project under faculty supervision. The project will involve substantial preparatory study and will extend the student's knowledge of computer science. Arrangements for this course must be made with a faculty member before registration.

CS 435 Computational Science and Applications (1)

A project-oriented course in which students apply computational tools to solve problems in science, mathematics, statistics, and economics through modeling, simulation, implementation of algorithms, numerical analysis, and software development.

CS 445 Computer Graphics (1)

This course is an introduction to computer graphic with an emphasis how 3D objects and scenes are modeled, shaded, and rendered. Topics include color representation, geometric transformations, culling, hidden line elimination, clipping, anti-aliasing, texturing, global illumination models, and the 3D rendering pipeline. Extensive programming will be required.

CS 451 Topics in Computer Science (1)

This course provides the flexibility to offer special topics of interest in computer science. Topics will generally not be repeated within a two-year period in order to provide a variety of offerings. May be repeated for up to three credits.

Prerequisite: CS 241

Offering: As needed

Instructor: Staff

CS 465 Language, Logic and Computation (1)

Language is the basic for complex communication, whether as natural language between humans or as formal language between humans and computers. In programming, different kinds of formal languages are crucial tools in all stages of development, from the logics used to specify requirements, to the programming languages used to implement algorithms and the mathematical notations used to analyze their behavior. In this course we will study the general phenomenon of formal language by exploring the syntax, semantics and logics of a broad range of examples, beginning with the simplest numeral notations and operator algebras and continuing through to computationally complete languages and sophisticated type systems. In addition to studying abstract descriptions of syntax and semantics, students will reinforce their understanding by implementing language-based tools in a functional meta-language.

CS 495W Senior Seminar in Computer Science I (.5)

Students research and develop a proposal for a substantial project that will integrate the student's knowledge in computer science and supporting areas. Weekly meetings will study methodologies and offer a forum for presentations and discussions. A paper and final presentation on the proposal topic is required. Required for major in Computer Science.

General Education Requirement Fulfillment: Writing-centered

Prerequisite: Senior standing in Computer Science or consent of instructor.

Offering: Fall

Instructor: Staff

CS 496W Senior Seminar in Computer Science II (.5)

Students implement their project (proposed in CS 495W). Weekly meetings offer a forum for progress reports and practice presentations. A final write-up and presentation of the project is required. Required for majors in Computer Science.