This course is an introduction to computer science and programming intended for students in the natural sciences. The emphasis is on problems that might come up in a modern research laboratory. Assignments and exercises are done in Python programming language, which is favored by many natural scientists. The course teaches how to maintain an electronic notebook of calculations, to complement the traditional lab notebook. There is also a focus on standard data structures and good programming techniques, giving the student a solid grounding in modern programming techniques.

Prerequisites
MATH 110 or three years of high school math required. Students who received credit for CSCI 161 or 261 will not receive credit for CSCI 141. Students with CSCI 141 transfer credit may not take this course.

This course is an introduction to computer science and programming. The programming language Java is used to illustrate concepts in computer science. The course emphasizes the use of the computer as a problem-solving tool and the development of good programming style. CSCI 161 is the introductory course for students planning to major or minor in computer science. A weekly laboratory is required.

Prerequisites
Three years of high-school mathematics, MATH 110, or equivalent. Students with transfer credit for CSCI 161 may not take this course.
Code
Mathematical Approaches

Students study the design and implementation of large software systems. Topics include design methodologies, programming team organization, and management, program verification and maintenance, design patterns and software engineering tools.

Prerequisites
CSCI 261 with a grade of C- or higher.

This course is a continuation of CSCI 161. It provides an introduction to the study of fundamental data structures and their associated algorithms. Students learn how to choose appropriate data structures and algorithms for particular problems. They learn about lists, stacks, queues, trees, sorting, searching, abstract data types, and object-oriented programming using an object-oriented programming language. A weekly laboratory is required.

Prerequisites
CSCI 161 with C- or higher grade, or permission of the instructor. Students with transfer credit for CSCI 261 may not take this course.
Code
Mathematical Approaches

Introduction to machine organization, machine structure, data representation, digital logic, and assembly language programming on a RISC based architecture.

Prerequisites
CSCI 261 with a grade of C- or higher.

Declarative programming languages are an important alternative to languages (such as C, C++, and Java) that use the more familiar imperative programming paradigm. This course introduces the functional, dataflow, and logic programming paradigms in depth through assignments in the programming languages Haskell and Prolog. These languages are based on models of computation that are fundamentally different from the von Neumann model underlying imperative programming languages, and exposure to these new paradigms provides valuable perspective on programming and problem solving in general.

Prerequisites
CSCI 261 with a grade of C- or higher. Students with transfer credit for CSCI 291 may not take this course.

Consideration of a diverse range of problems in computer science from problems in the design of correct and efficient algorithms and the implementation of data structures through problems in the theory of computation.

Prerequisites
CSCI 261 recommended.

Students learn about numerical solutions to linear systems; numerical linear algebra, polynomial approximations (interpolation and extrapolation); numerical differentiation and integration. Students also learn about error analysis and how to select appropriate algorithms for specific problems.

Prerequisites
MATH 280, 290, and CSCI 161 or equivalent. All prerequisite courses must have been completed with a grade of C- or higher.

This course is an introduction to the process of generating images with a computer. The emphasis is on the design and use of graphical facilities for two- and three-dimensional graphics. Students study the mathematical theory underlying computer generated graphics, and will implement programs utilizing these techniques. The mathematical topics covered include rotations, translations, and perspective. The core pieces of the graphics pipeline used in current graphics hardware are studied.

Prerequisites
CSCI 261 with a grade of C- or higher.

Computer networks have become a fundamental part of our everyday lives'used for everything from social networking to research and commerce. This course introduces the concepts behind modern computer networks and their implementation. It covers the software and hardware architecture of the internet, networking protocols like TCP and IP, how services like Email and the Web work, approaches for reliable and secure communication, and the details of both wired and wireless transmission. Programming exercises in Java and C++ will reinforce key concepts from the course.

Prerequisites
CSCI 240 with a grade of C- or higher.

This course is about how to find the best - or at least good - solutions to large problems frequently arising in business, industrial, or scientific settings. Students learn how to model these problems mathematically, algorithms for finding solutions to them, and the theory behind why the algorithms work. Topics include the simplex method, duality theory, sensitivity analysis, and network models. The focus is on linear models and models with combinatorial structure, but some nonlinear models are considered as well. Optimization software is used frequently.

Prerequisites
MATH 280, 290, and CSCI 161 or equivalent. All prerequisite courses must have been completed with a grade of C- or higher.

This is a course in advanced data structures, the algorithms needed to manipulate these data structures, proofs that the algorithms are correct, and a runtime analysis of the algorithms. Students study advanced data structures such as Red-Black Trees, 2-3 Trees, Heaps, and Graphs. Students also study algorithm design techniques including Greedy Algorithms, Divide and Conquer, Dynamic Programming, and Backtracking. They also learn about NP-Complete problems.

Prerequisites
CSCI 261, 281 (may be taken concurrently), and MATH 210. All prerequisite courses must have been completed with a grade of C- or higher.

An introduction to formal models of computers and computation. Topics include formal languages and automata theory, computability, decidability, and Church's Thesis.

Prerequisites
CSCI 361 with a grade of C- or higher.

The topics are chosen each time the course is offered to meet the interests of students and instructors. Possible topics include computer architecture, computer modeling and simulation, networks, advanced graphics, and advanced artificial intelligence.

Prerequisites
CSCI 361 with a grade of C- or higher, or permission of the instructor.

This course introduces the student to the techniques of artificial intelligence. Students learn strategies for uninformed and informed (heuristic) search, knowledge representation, problem-solving, and machine learning. Additional topics may include motion planning, probabilistic reasoning, natural language understanding, and philosophical implications.

Prerequisites
MATH 180 and CSCI 361 (may be taken concurrently) with a grade of C- or higher, or permission of the instructor. Students with transfer credit for CSCI 43X may not take this course.

The senior capstone course provides computer science majors the opportunity to integrate the knowledge that they have gained from across the curriculum. Students are encouraged to work in teams, and can pursue either an applied or theory project. Students choosing applied projects participate in the identification of a problem, develop a project proposal outlining an approach to the problem's solution, implement the proposed solution, and test or evaluate the result. Students choosing a theory project conduct original research (e.g., develop a new algorithm) and evaluate its strengths and limitations. Regardless of the choice of project, students document their work in the form of written reports and oral presentations.

Prerequisites
Senior class standing, CSCI 240, CSCI 361, or permission of instructor. All prerequisite courses must have been completed with a grade of C- or higher.

The management of data is one of the classical problems throughout the history of computing. This course centers around the fundamental concepts and theory that underpin the relational data model, which addresses numerous problems that plague data management, including data independence, consistency, information loss, and access performance. Course topics include the relational data model, database languages (e.g., SQL), relational database theory, database design (by decomposition), query execution, and considerations that affect system performance. Students design database schemas that effectively model an organization's information requirements and write programs that require database integration. Students also gain insight through the analysis and implementation of influential data structures and algorithms that are commonly used in modern relational database systems.

Prerequisites
CSCI 261 and MATH 210 or permission of instructor. All prerequisite courses must have been completed with a grade of C- or higher.

A practical computer software development experience to incorporate topics learned in advanced computer science courses with the tools and techniques for software development studied in the software engineering class. Students may enroll in either the one-semester, one-unit 460 or the two-semester, 0.5 unit per semester sequence, but not both.

Prerequisites
CSCI 240, with at least one upper-division computer science course in an area related to the project. All prerequisite courses must have been completed with a grade of C- or higher.

A practical computer software development experience to incorporate topics learned in advanced computer science courses with the tools and techniques for software development studied in the software engineering class. Students may enroll in either the one-semester, one-unit 460 or the two-semester, 0.5 unit per semester sequence, but not both.

Prerequisites
CSCI 240, with at least one upper-division computer science course in an area related to the project. All prerequisite courses must have been completed with a grade of C- or higher.

A practical computer software development experience to incorporate topics learned in advanced computer science courses with the tools and techniques for software development studied in the software engineering class. Students may enroll in either the one-semester, one-unit 460 or the two-semester, 0.5 unit per semester sequence, but not both.

Prerequisites
CSCI 240, with at least one upper-division computer science course in an area related to the project. All prerequisite courses must have been completed with a grade of C- or higher.

One the most complex software systems ever assembled, the modern operating system serves as the interface between the human and the machine. This course traces how the simple idea of ``resource sharing'' unravels into some of the most confounding problems and original breakthroughs in computer science. Course topics include process and thread management, input/output, CPU scheduling, synchronization primitives, memory management, and file systems. Students taking this course learn how to deal with the intricacies of low-level programming, parallel computing and synchronization problems, and also receive kernel-development experience through the design and implementation of various subsystems in a real operating system. The C programming language is used for homework assignments and projects.

Prerequisites
CSCI 281 with a grade of C- or higher.

Compilers take input programs written in a high-level language and generate equivalent programs in a low-level language. This course introduces the mathematical tools (formal languages and automata) necessary for recognizing and validating input programs and the computational techniques used to construct equivalent output programs. Students develop first-hand experience with the process by implementing a sample compiler as a course project. The tools and techniques introduced in this course can be applied across a wide range of applications. In particular, this course is valuable preparation for writing any program that needs to read and act on structured input files.

Prerequisites
CSCI 240, 361 and 281. CSCI 370 is recommended. All prerequisite courses must have been completed with a grade of C- or higher.

A senior thesis allows students to explore areas of computer science that are new to them, to develop the skill of working independently on a project, and to synthesize and present a substantial work to the academic community. Thesis proposals are normally developed in consultation with the student's research committee. This committee consists of the student's faculty supervisor and two other faculty members. It is involved in the final evaluation of the project. The results are presented in a public seminar or written in a publishable form.

Prerequisites
At least 4 upper-division (300-400 level) courses by the end of the junior year, or completion of the major by the end of the fall term of the senior year. The student should have a GPA of at least 3.5 in all major courses numbered 300 or above.

A senior thesis allows students to explore areas of computer science that are new to them, to develop the skill of working independently on a project, and to synthesize and present a substantial work to the academic community. Thesis proposals are normally developed in consultation with the student's research committee. This committee consists of the student's faculty supervisor and two other faculty members. It is involved in the final evaluation of the project. The results are presented in a public seminar or written in a publishable form.

Prerequisites
At least 4 upper-division (300-400 level) courses by the end of the junior year, or completion of the major by the end of the fall term of the senior year. The student should have a GPA of at least 3.5 in all major courses numbered 300 or above.

Independent study is available to those students who wish to continue their learning in an area after completing the regularly offered courses in that area.

Prerequisites
Junior or senior class standing and cumulative grade average of 3.0.

Independent study is available to those students who wish to continue their learning in an area after completing the regularly offered courses in that area.

Prerequisites
Junior or senior class standing and cumulative grade average of 3.0.

This scheduled weekly interdisciplinary seminar provides the context to reflect on concrete experiences at an off-campus internship site and to link these experiences to academic study relating to the political, psychological, social, economic and intellectual forces that shape our views on work and its meaning. The aim is to integrate study in the liberal arts with issues and themes surrounding the pursuit of a creative, productive, and satisfying professional life. Students receive 1.0 unit of academic credit for the academic work that augments their concurrent internship fieldwork. This course is not applicable to the Upper-Division Graduation Requirement. Only 1.0 unit may be assigned to an individual internship and no more than 2.0 units of internship credit, or internship credit in combination with co-operative education credit, may be applied to an undergraduate degree.