The following courses are offered every year - 1500 and 2200 are offered in the fall, 1600 and 2300 are offered in the spring, and we will offer 2170 each fall and spring semester.

Computational tools are a critical part of our everyday lives. Software is the driving force behind cutting edge scientific discovery, blockbuster entertainment, and today's fast-paced marketplace. This course is an introduction to techniques, ideas and problem-solving approaches that are used to develop some of these tools. At a high level, we focus on developing "computational thinking", which is the practice of using abstraction to design and implement algorithms and software to solve problems that arise in many different areas of our daily lives, such as networks, social media, and scientific computing, to name just a few.

At a practical level, students will design, implement, test and document their programs to learn introductory programming concepts, such as:

- Data types and data structures (e.g. lists, dictionaries, trees)
- Imperative programming (modular design using functions, recursion, object-oriented programming)
- Performance analysis via theoretical estimate, profiling and timing

Most assignments in this course are programming assignments aimed to teach the students to express their ideas in efficient and elegant code; no prior programming experience is necessary to join and succeed in the course. Lecture periods are dedicated to introducing new material, discussions, individual and group activities and lab periods are used for programming practice. CMPS 1500 is the first course for Coordinate Major in Computer Science. It is usually offered in the fall term.

None.

This is the second course in the introductory course sequence for Coordinate Major in Computer Science and is the continuation of CMPS 1500. While CMPS 1500 focuses on a broad array of topics in computer science and a single language (Python), this class focuses on several core topics in the design, analysis and implementation of computational tools that are drawn from the fields of data structures, software engineering, and programming languages:

- Java, object-oriented programming, and test-driven development
- Data structures and abstract data types
- C and imperative programming
- Haskell and functional programming

By solving practical, real-life problems in different programming languages and in different ways, students learn to select a language and approach most appropriate for the situation, and prepare to learn new languages independently. The high-level goal of this course is to train students to be able to draw from a versatile set of skills, which in turn will provide a strong foundation for further study in computer science. CMPS 1600 is usually offered in the spring term.

CMPS 1500 or equivalent.

This course is an introduction to several areas of mathematics that are particularly useful in computer science. The topics include an introduction to predicate and propositional logic, mathematical induction, combinatorics and counting, and discrete probability theory. We recommend that students interested in pursuing further study in computer science take CMPS 2170 before, or concurrently with CMPS 1500 or CMPS 1600. (Same as MATH 2170)

MATH 1220 or MATH 1310 or permission of instructor

This course is an introduction to the design and analysis of algorithms, and covers several basic algorithmic paradigms and their application to core computational problems in graph theory and optimization, as well as analysis of time and space complexity. The primary focus of the course will be on understanding the divide-and-conquer, greedy and dynamic programming paradigms for algorithm design as well as the problem areas to which they can be applied. Example application areas include graph theory, discrete optimization, numeric and scientific computing and machine learning.

CMPS 1600, CMPS/MATH 2170.

- Asymptotic Analysis and Big-O Notation
- Divide-and-Conquer Algorithms
- Recurrences and The Master Method
- Greedy Algorithms
- Graph Algorithms (Breadth-First Search, Depth-First Search, Connectivity and Shortest Paths)
- Dynamic Programming
- Linear Programming
- Lower Bounds and Computational Complexity

Modern computer systems must take advantage not only of the latest hardware technology, but also of the ability to compute and communicate over a network. The primary focus of this course will be to understand the principles behind the design of modern operating systems and distributed systems through theoretical study of classic solutions and hands-on programming assignments in C.

To understand the architecture and organization of modern operating systems, we will examine issues such as resource management and scheduling, memory management, multi-threading and concurrency, and file system organization. To understand distributed systems, we will examine topics such as protocol design, asynchronous and synchronous communication, and layered network architecture. Prerequisites: CMPS 1600 (Introduction to Computer Science II) or permission of the instructor.

CMPS 1600 or permission of the instructor

303 Stanley Thomas Hall, New Orleans, LA 70118 compsci@tulane.edu