### Course Listings

**CMSC H101B Fluency with Information Technology **

A study of the skills, concepts and capabilities involved in the design, implementation and effective use of information technology. Using a variety of quantitative techniques, we will explore a range of uses of information technology in various fields. (Dougherty)

**CMSC B110 Introduction to Computing **

The course is an introduction to computing: how we can describe and solve problems using a computer. Students will learn how to write algorithms, manipulate information, and design programs to make computers useful tools as well as mediums of creativity. Contemporary, diverse examples of computing in a modern context will be used and through lectures, class examples and weekly programming projects, students will learn about abstraction, how to divide and organize a process into appropriate components, how to describe such processes in a computer language, and how to analyze and understand the behavior of their programs. (Staff, Division II, Q, QR, QM, SI)

**CMSC B113 Computer Science I**

This is an introduction to the discipline of computer science, suitable for those students with a mature quantitative ability. This fast-paced course covers the basics of computer programming, with an emphasis on program design and problem decomposition. Graduates of this course will be able to write small computer programs independently; examples include data processing for a data-based science course, small games, or basic communications programs (such as a chat client). No computer programming experience is necessary or expected. Prerequisite: Quantitative Readiness. (Staff, QR, QM) This questionnaire helps students choose their placement between the introductory courses.

**CMSC B120 Visualizing Information **

An introduction to visualization of complex data through computer manipulation. Explores the tools necessary to allow the human mind to make sense of vast amounts of data collected in many fields of study. Topics: 2D/3D representations, programming techniques, data conversion principles, color representation and introduction to virtual reality. (Xu, Division II, Q, QR, QM, SI)

**CMSC H130 Foundations of Rigorous Thinking **

Develops rigorous thinking skills through the linguistic foundations of mathematics: logic and sets. Emphasis on using symbology to represent abstract objects and the application of formal reasoning to situations in computer science. (Lindell)

**CMSC H187B Computing Across the Sciences **

This course covers the uses and internal workings of computational techniques used to study continuous and discrete systems in a variety of sciences. The first half covers numerical techniques for simulation and optimization, important in the analysis of continuous systems, and the second covers discrete systems emphasizing biological sequence alignment with DNA and proteins. No prior experience with programming is required. Prerequisite: One semester of calculus; one semester of any lab science is also highly recommended. (Wonnacott, Meneely, Division II)

**CMSC H105A Introduction to Computer Science **

A rigorous year-long introduction to the fundamental concepts of computer science intended for students interested in doing more advanced work in technical and scientific fields. Includes the fundamental data structures of computer science and their algorithms. Examples and exercises will stress the mathematical aspects of the discipline, with a strong emphasis on programming and analytical problem-solving skills. Students without a strong (secondary school) mathematics or programming experience should take Computer Science 100 instead. (Wonnacott, Dougherty, Division II)

**CMSC B206 Introduction to Data Structures **

Introduction to the fundamental algorithms and data structures using Java. Topics include: Object-Oriented programming, program design, fundamental data structures and complexity analysis. In particular, searching, sorting, the design and implementation of linked lists, stacks, queues, trees and hash maps and all corresponding complexity analysis. In addition, students will also become familiar with Java’s built-in data structures and how to use them, and acquire competency using the shell, commandline scripting and a debugger without any IDE. Prerequisite: CMSC 110 or 105, or permission of instructor. (Staff, Division II, QM, SI)

**CMSC H210A Linear Optimization and Game Theory **

Covers in depth the mathematics of optimization problems with a finite number of variables subject to constraints. Applications of linear programming to the theory of matrix games and network flows are covered, as well as an introduction to nonlinear programming. Emphasis is on the structure of optimal solutions, algorithms to find them, and the underlying theory that explains both. (Butler, Division II)

**CMSC H225A Fundamentals of Database Systems **

An introduction to the principles of relational database design and use, including the entity/relationship data model and the logical algebra/calculus model behind query languages. An integrated laboratory component covers declarative programming using the international standard SQL. Prerequisite: CS206 and CS231. (Lindell, Division II)

**CMSC B231 Discrete Mathematics **

An introduction to discrete mathematics with strong applications to computer science. Topics include propositional logic, proof techniques, recursion, set theory, counting, probability theory and graph theory. Students are strongly encouraged to have taken CMSC B110 or H105 prior to registering for this course, or at least take CMSC B110 or H105 concurrently. (Xu, Division II and Q, QM; cross-listed as MATH B231 and PHIL B230)

**CMSC H235A Information and Coding Theory **

Covers the mathematical theory of the transmission (sending or storing) of information. Included are encoding and decoding techniques, both for the purposes of data compression and for the detection and correction of errors. (Lindell)

**CMSC B240 Computer Organization **

A lecture/laboratory course studying the hierarchical design of modern digital computers. Combinatorial and sequential logic elements; construction of microprocessors; instruction sets; assembly language programming. Lectures cover the theoretical aspects of machine architecture. In the laboratory, designs discussed in lecture are constructed in software. Prerequisite: Computer Science 206 or permission of instructor. Prerequisite: CS206 and CS231. (Staff, Division II and Q)

**CMSC B245 Principles of Programming Languages **

An introduction to a wide range of topics relating to programming languages with an emphasis on abstraction and design. Design issues relevant to the implementation of programming languages are discussed, including a review and in-depth treatment of mechanisms for sequence control, the run-time structure of programming languages and programming in the large. The course has a strong lab component where students get to construct large programs in at least three different imperative programming languages. Prerequisite: CS206 and CS231. (Staff, Division II and Q)

**CMSC B246 Systems Programming **

A more advanced programming course using C/C++. Topics include memory management, design and implementation of additional data structures and algorithms, including priority queues, graphs and advanced trees. In addition, students will be introduced to C++’s STL. There will be emphasis on more significant programming assignments, program design, and other fundamental software engineering principles. Makefiles, interactive debugging,version control, and command-line shell interaction round out the technical skills developed in this course. Prerequisites: CMSC B206 or H106/7, and MATH/CMSC 231. (Staff, Division II and Q)

**CMSC B250 Computational Models in the Sciences **

Introductory survey of theoretical methods in the sciences. Design, implementation, interpretation, evaluation of models. Conceptual, analytical, computational models; simulations; evolutionary algorithms; optimality models; role of theory in science. Case studies from a variety of natural and social sciences. Prerequisite: CS110. (Staff, Division II and Q; cross-listed as BIOL B250 and GEOL B250)

**CMSC B310 Computational Geometry **

A study of algorithms and mathematical theories that focus on solving geometric problems in computing, which arise naturally from a variety of disciplines such as Computer Graphics, Computer Aided Geometric Design, Computer Vision, Robotics and Visualization. The materials covered sit at the intersection of pure mathematics and application-driven Computer Science and efforts will be made to accommodate Math majors and Computer Science majors of varying math/computational backgrounds. Topics include: graph theory, triangulation, convex hulls, geometric structures such as Voronoi diagrams and Delaunay triangulations, as well as curves and polyhedra surface topology.

Prerequisite: CS231 and Math B203 or H215 or permission of instructor. (Xu, cross-listed as MATH B310.)

**CMSC B312 Computer Graphics **

Presents the fundamental principles of 2D and 3D computer graphics: data structures for representing objects to be viewed, and algorithms for generating images from representations. Topics include: pipeline architectures, graphics programming, 3D geometry and transformations, modeling, viewing, clipping and projection, lighting and shading, texture mapping, visibility, ray-tracing and other advanced techniques. Prerequisite: CS246 and Math B203 or H215, or permission of instructor. (Xu)

**CMSC B325 Computational Linguistics **

Introduction to computational models of understanding and processing human languages. How elements of linguistics, computer science, and artificial intelligence can be combined to help computers process human language and to help linguists understand language through computer models. Topics covered: syntax, semantics, pragmatics, generation and knowledge representation techniques. Prerequisite: CS206 and CS231 or permission of instructor (Kumar)

**CMSC B330 Algorithms: Design and Practice **

This course examines the applications of algorithms to the accomplishments of various programming tasks. The focus will be on understanding of problem-solving methods, along with the construction of algorithms, rather than emphasizing formal proving methodologies. Topics include divide and conquer, approximations for NP-Complete problems, data mining and parallel algorithms. Prerequisites: Prerequisite: CS206 and CS231. (Kumar, Division II and Q)

**CMSC H340B Analysis of Algorithms **

Qualitative and quantitative analysis of algorithms and their corresponding data structures from a precise mathematical point of view. Performance bounds, asymptotic and probabilistic analysis, worst-case and average-case behavior. Correctness and complexity. Particular classes of algorithms such as sorting and searching are studied in detail. Prerequisites: Computer Science 206 and some additional mathematics at the 200 level, or permission of instructor. (Lindell)

**CMSC H345B Theory of Computation **

Introduction to automata theory, formal languages and complexity. Introduction to the mathematical foundations of computer science: finite state automata, formal languages and grammars, Turing machines, computability, unsolvability and computational complexity. Prerequisites: Computer Science 206, and some additional mathematics at the 200 level, or permission of instructor. (Lindell)

**CMSC B350 Compiler Design: Theory and Practice **

An introduction to compiler and interpreter design, with emphasis on practical solutions, using compiler-writing tools in UNIX and the C programming language. Topics covered include lexical scanners, context-free languages and pushdown automata, symbol table design, run-time memory allocation, machine language and optimization. (Wonnacott)

**CMSC B355 Operating Systems **

A practical introduction to modern operating systems, using case studies from UNIX, MSDOS and the Macintosh. Topics include computer and OS structures, process and thread management, process synchronization and communication, resource allocations, memory management, file systems, and select examples in protection and security. Prerequisites: CS246 (Xu)

**CMSC B361 Emergence **

A multidisciplinary exploration of the interactions underlying both real and simulated systems, such as ant colonies, economies, brains, earthquakes, biological evolution, artificial evolution, computers and life. These emergent systems are often characterized by simple, local interactions that collectively produce global phenomena not apparent in the local interactions. Prerequisite: CS206 and CS231. (Blank; cross-listed as BIOL B361)

**CMSC B371 Cognitive Science **

Cognitive science is the interdisciplinary study of intelligence in mechanical and organic systems. In this introductory course, we examine many topics from computer science, linguistics, neuroscience, mathematics, philosophy and psychology. Can a computer be intelligent? How do neurons give rise to thinking? What is consciousness? These are some of the questions we will examine. No prior knowledge or experience with any of the subfields is assumed or necessary. Prerequisite: CS206 and CS231. (Blank)

**CMSC B372 Artificial Intelligence **

Survey of Artificial Intelligence (AI), the study of how to program computers to behave in ways normally attributed to “intelligence” when observed in humans. Topics include heuristic versus algorithmic programming; cognitive simulation versus machine intelligence; problem-solving; inference; natural language understanding; scene analysis; learning; decision-making. Topics are illustrated by programs from literature, programming projects in appropriate languages and building small robots. Prerequisite: CS206 and CS231. (Kumar, Division II; cross-listed as PHIL B372)

**CMSC B380 Recent Advances in Computer Science **

A topical course facilitating an in-depth study on a current topic in computer science. Prerequisite: permission of instructor. Prerequisite: CS206 and CS231. (staff, Division II)

**CMSC B380 (Spring 2017): Modern Functional Programming**

Simplify your language and free your mind. This course will cover an alternative style of programming: typed functional programming. Typed functional programming languages are quickly gaining currency in industry, including at Google, Facebook, a variety of financial services companies, and across a range of startups. They are particularly good at maintaining security guarantees and for writing concurrent programs. This course will explore the ease and wonder of typed functional programming through one such language: Haskell. We will cover higher-order functions, purity, generalized algebraic datatypes, type inference, laziness, monads, and more. Once you have used these techniques, programming will never feel the same again. Prerequisites: CMSC B206 or H106/7, and MATH/CMSC 231. (Eisenberg)

**CMSC H392A Advanced Topics: High Performance Scientific Computing **

Prerequisite: permission of instructor. (Dougherty)

**CMSC H394B Advanced Topics in Discrete Mathematics and Computer Science **

(Lindell)

**CMSC B399 Senior Conference**

**CMSC B403 Supervised Work/Independent Study **