Please note: This is NOT the most current catalog.

Computer Science

(Mathematics, Statistics, and Computer Science)

Director, 2008-09: Richard A. Brown (Mathematics, Statistics and Computer Science), distributed systems, formal methods, software-supported pedagogy

Faculty, 2008-09: Richard J. Allen (Mathematics, Statistics and Computer Science), logic programming, intelligent tutoring systems; Olaf Hall-Holt (Mathematics, Statistics and Computer Science), computational geometry, computer graphics; Charles W. Huff, Jr. (Psychology), social psychology, ethical and social issues in computing; Steven C. McKelvey (Mathematics, Statistics and Computer Science), operations research, wildlife modeling; Matthew P. Richey (Mathematics, Statistics and Computer Science), computational mathematics, software engineering

Computer science (CS) is the academic discipline that focuses on creative computing-related problem solving and develops valuable analytical skills in theory, abstraction, and design. St. Olaf’s CS program employs “hands-on” experience to build up valuable technical skills while reinforcing powerful computing concepts in a liberal arts context. Beginning with the introductory Computer Science 121, the program’s courses draw connections with applications in other disciplines and in areas such as multimedia computing. The program offers an authentic and satisfying education in the concepts and practices of computer science; the courses below represent national expectations for an undergraduate computer science curriculum. Undergraduate research appears throughout the program, from foundation courses that develop valuable project skills to advanced courses such as the Senior Capstone Seminar. The program also incorporates a distinct liberal arts perspective, including emphasis on teamwork and communication skills, examination of ethical and social issues in computing, and collaboration in upper-level interdisciplinary projects.

Although CS differs from other computing areas, such as programming, information technology (IT), and information systems (IS), the study of computer science serves as excellent preparation for careers in such fields, because the concepts of computer science provide insights into all forms of computing. While specific computing systems come and go, the principles of CS endure for the long term, and persons with awareness of those principles perceive them in all forms of computing. The program's emphases on development of creative problem-solving and analytical thinking abilities, interpersonal skills, and ethical analysis and awareness enhance any career, whether one becomes a computing professional or an occasional user.


Courses in computer science satisfy the following general education requirements: MAR, WRI, ORC, NST-B and EIN. See the Class and Lab Schedule for details.



A student arranges for a computer science major by individual contract with the computer science faculty. This provides some latitude for choice according to individual interests and background and allows the computer science faculty to update the curriculum easily as the field of computer science evolves. Most contracts adhere to the guidelines below, which derive from prominent national recommendations for undergraduate computer science majors.

Foundation courses: Either Computer Science 121, 251 and 252, or Computer Science 225; Computer Science 231; Computer Science 241.

Core courses: Computer Science 253; Computer Science 263; either Computer Science 333 or 276; and either Computer Science 273 or 284.

Electives and capstone: Computer Science 390 and two approved electives.

These guidelines represent four levels:

  • a breadth-first introduction to the discipline, through a hands-on survey of concepts (Computer Science 121 or 225) and three “second courses” (Computer Science 231, 241, 251) that may be taken in any order (note that the foundation courses offer non-majors a variety of one- to four-course samples of computer science);
  • core courses in standard computer science topics, including algorithms and data structures, ethics of computing, computer languages, and computer systems;
  • a deeper exposure to selected aspects of the discipline of computer science through electives; and
  • a senior-level capstone integrative experience (Computer Science 390).


Certain courses in computer science count toward a concentration in linguistics and toward majors in mathematics and biology. Also, certain courses in mathematics and physics can count toward requirements in a computer science major contract. Speak with the computer science program director for details.

The computer science program offers many opportunities to participate in undergraduate research, often integrated within courses, or through extracurricular activities such as summer research. Ongoing efforts in high-performance cluster computing and with graphics and 3D computer vision, plus interdisciplinary applications of these techniques in biological sciences and other areas, provide a foundation for many student projects.

A biennial international experience, co-sponsored with the biology department, brings computing enrichment to a high school in Chennai, India.


Students considering graduate study in computer science should pursue opportunities that add both breadth and depth in their majors. Standard course offerings provide breadth, in that taking all foundation and core courses plus Computer Science 336 collectively includes material from all 63 required units in the ACM/IEEE national curricular recommendations, plus over 20 optional units. Graduate-school-bound students are strongly encouraged to pursue undergraduate research involving computer science, and to take courses beyond the basic major requirements.


121 Principles of Computer Science

The principles of computing make sounds, images, and animations possible on computers. This course introduces students to computer science (CS), a field devoted to creative problem solving with computers. Students explore fundamental concepts, including recursion, iteration, object-oriented software design, algorithm efficiency, iteration (loop) invariants, levels of naming, computer design, computing ethics. Students apply these concepts daily to create web sites, make music, create and alter images, and produce animations on the computer, individually and in teams.

225 Accelerated Principles of Computer Science

This accelerated course accomplishes the combined goals of Computer Science 121 and Computer Science 251 for students with sufficient prior C++ or Java programming skills. The course includes a weekly laboratory meeting and a team project experience. Prerequisites: A high school CS advanced placement course, or comparable experience in C++ or Java programming and permission of instructor.

231 Mathematical Foundations of Computing

Students learn mathematical topics that form an essential background for the study of computer science, including functions, relations, basic logic, predicate calculus and formal reasoning, verification of programs, proof techniques, basics of counting, graphs and trees, discrete probability, and introduction to computability. Prerequisites: Computer Science 121 or 225 or permission of instructor. Students with especially weak or especially strong mathematics backgrounds should consult with the program director.

241 Hardware Design

This course offers students a structured descriptive survey of the organizational principles of computer hardware, emphasizing trade-offs among architectural choices and representative examples. Topics include virtual machines, overview of computer organization, forms of parallelism, machine- level representation of data, memory organization, digital logic, functional organization, microprogrammed and RISC architectures, performance enhancements and alternative architectures, assembly-level machine organization and programming, and architecture of networks and their protocols. Prerequisite: Computer Science 121 or consent of the instructor.

251 Software Design and Implementation

This course provides an introduction to the structure and creation of computer software, using C++ programming language and emphasizing object-oriented programming and software life-cycle methodology. Concepts and skills are applied in a team project based on the waterfall model of software development. Topics include object-oriented programming, specification, high-level memory management, indirect addressing, formal methods, tools including UML, team software process, requirements analysis, software design strategies, and elementary ethical analysis of software systems. Prerequisite: Computer Science 121 or permission of instructor. Concurrent registration in Computer Science 252 is required.

252 Software Design and Implementation Lab

Students investigate the implementation of software using strategies and concepts presented in Computer Science 251, explore standard technologies for creation and management of multi- module software systems, and carry out stages of a life cycle-based team software project, through hands-on computational exercises and with direct support provided in a small group context. Prerequisite: concurrent registration in Computer Science 251.

253 Algorithms and Data Structures

This course surveys standard data structures and algorithms with emphasis on implementation experience and complexity analysis. Topics include algorithmic strategies, fundamental computer algorithms, stacks, queues, lists, trees, hash tables, specialized trees (e.g., binary, AVL, B-trees), heaps and priority queues, compression, and decompression. Prerequisites: Completion of BTS-T; Computer Science 231 and either Computer Science 225 or 251, or consent of the instructor.

263 Ethical Issues in Software Design

The software we design has real effects in people's lives. This course explores the ethical and social considerations inherent in computer-based systems, develops skills in thinking about those considerations and in collecting data to determine their effects, and expands students' abilities to integrate these issues and skills into software development procedures, largely through an extensive team analysis of a "live" software project. Coursework uses extended case studies and surveys topics such as professional and ethical responsibilities, risk, liability, intellectual property, privacy, and computer crime. Prerequisites: Computer Science 225 or 251, or permission of instructor and completion of BTS-T.

273 Operating Systems

This course examines the features of modern operating systems, including detailed consideration of Linux and other example systems. Projects range from system-level programming to kernel modifications. Topics include operating system principles, implementation as system calls, process scheduling and dispatch, inter-process communication, low-level memory management, device management, file systems, security and protection mechanisms, and scripting. Prerequisites: Computer Science 241 and either Computer Science 225 or 251, or permission of instructor.

276 Programming Languages

In this implementation-oriented examination of features commonly found in computer programming languages, students construct their own interpreters for an example programming language incorporating the various language features they study throughout the course. Topics include programming language semantics, programming language translation, implementation of control structures and memory structures, abstraction mechanisms, and language translation systems and types. Prerequisites: Computer Science 241 and either Computer Science 225 or 251, or permission of instructor.

284 Client-Server Applications

This course surveys technologies represented in networked software systems based on the client-server model, including graphics user interfaces (GUIs) and databases, and features a team project to design and build such a system with interdisciplinary application. Topics include design of client-server systems, GUI applications, event-driven programming, APIs, databases and SQL query language, embedded queries, data modeling, concurrency, network programming, security and ethical considerations, and team programming methodologies. Prerequisites: Computer Science 225 or 251, or permission of the instructor.

294 Internship

This is an intermediate-level version of Computer Science 394.

298 Independent Study

300 Topics in Computer Science

Recent and planned topics include distributed computing and parallel algorithms, computer graphics, relational database systems, and real-time systems. May be repeated if topics are different.

315 Bioinformatics

This course addresses computational problems arising from the need to store, access, transform, and utilize DNA-related data. Topics from computer science central to the development of problem-solving tools include: exhaustive search; algorithms (including dynamic programming, divide-and-conquer, graph and greedy algorithms); combinatorial pattern matching; clustering and trees; and hidden Markov models. Prerequisites: Computer Science 253, or Computer Science 251 and Biology 225, or equivalent computer science and biology study, or permission of instructor.

333 Theory of Computation

Students learn about formal languages, automata, and other topics concerned with the theoretical basis and limitations of computation. The course covers automata theory including regular languages and context-free languages, computability theory, complexity theory including classes P and NP, and cryptographic algorithms. Prerequisite: Computer Science 231 or permission of instructor.

336 Logic Programming

Students learn a style of programming based on first order predicate logic. Topics include declarative programming, Horn clauses, declarative and procedural semantics of logic programs, relations clauses, goals, backtracking, and resolution. Programming projects and exercise use Prolog, the most significant logic programming language. Additional topics include the relationship of Prolog to logic and applications to artificial intelligence. Prerequisites: Computer Science 253 or 276 or permission of instructor.

390 Senior Capstone Seminar

Class members participate in undergraduate research, including readings from the research literature, team development of project software, ethical analysis of the project applying Computer Science 263 principles, and writing a research paper for public presentation. Projects are frequently interdisciplinary in nature, and build on prior undergraduate research experiences among class members. Prerequisites: major in computer science with senior standing, and completion of or concurrent enrollment in computer science core courses, including Computer Science 263, or permission of instructor.

394 Internship

Students gain experience in computer-industry positions. Projects have included implementation of solid modeling (NURBS), documentation, business applications of computing, applications of computer graphics in medical research, team programming. Internship experiences (whether for credit or not) are strongly encouraged for anyone considering a career in computing.

396 Directed Undergraduate Research: "Topic Description"

This course provides a comprehensive research opportunity, including an introduction to relevant background material, technical instruction, identification of a meaningful project, and data collection. The topic is determined by the faculty member in charge of the course and may relate to his/her research interests. Prerequisite: Determined by individual instructor. Offer based on department decision.

398 Independent Research

Recent projects, usually executed by individuals and coordinated with ongoing undergraduate research projects, include extension of a networked academic planning system, preliminary preparations for a system for managing web-based portfolios, neural networks, random number generation, applications of genetic algorithms to scheduling, computational Bayesian image reconstruction, design and implementation of an interface language for linear programming software, and design of software to assist choreographers.