##
Computer Science Course Descriptions (COMP)

**CMPSC 101 — INTRODUCTION TO C++ PROGRAMMING (3)**
Properties of algorithms, languages, and notations for describing algorithms, applications of a procedure-oriented language to problem solving. A student may receive credit for only one of the following courses: CMPSC 101, 200, 201, 202, 121.

**CMPSC 121 — INTRODUCTION TO PROGRAMMING TECHNIQUES (3)**
Design and implementation of algorithms. Structured programming. Problem solving techniques. Introduction to a high-level language, including arrays, procedures, and recursion.

**Prerequisite:**
MATH 110 as prerequisite or
MATH 140 as concurrent.

**CMPSC 122 — INTERMEDIATE PROGRAMMING (3)**
Object-oriented programming, recursion, fundamental data structures (including stacks, queues, linked lists, hash tables, trees, and graphs), the basics of algorithmic analysis, and an introduction to the principles of language translation.

**Prerequisite:**
CMPSC 121.

**CMPSC 131 — PROGRAMMING AND COMPUTATION I: FUNDAMENTALS (3)**
This course introduces the fundamental concepts and processes of solving computational problems through the design, implementation, testing and evaluation of efficient and robust computer programs. The concepts include basic computational constructs found in imperative, object-oriented and functional programming languages such as iteration, conditionals, functions, recursion, and datatypes. These provide the basic building blocks found in virtually all programming languages. The processes include the stepwise refinement of a problem description into individual components that can be implemented, tested, and integrated into an effective solution. A central theme to the course is computational thinking which includes a wide range of approaches to solving problems and designing systems that draw upon concepts fundamental to computer science. Computational thinking includes thinking recursively, considering parallel processing, thinking about types and type checking, judging a program not just for correctness and efficiency but also for its esthetics, and judging a system design for its simplicity and elegance. Computational thinking is applying principles of abstraction at multiple levels to focus on important details; it is applying problem decomposition to identify small problems that can be individually solved then combined to form a solution to the original problem. Computational thinking uses program invariants to describe a system's behavior succinctly and declaratively. Computational thinking considers multiple models of computation when designing an effective solution to a problem.

**Prerequisite:**
MATH 110 as prerequisite or
MATH 140 as concurrent.

**CMPSC 132 — PROGRAMMING AND CCOMPUTATION II: Data Structures (3)**
This course builds upon the foundations of programming and computation by introducing and studying the data structures and programming language features that support the design and construction of large-scale software systems. It introduces the foundations of object-oriented programming, the design and analysis of efficient algorithms using important data structures, and programming techniques that support reusable and modular program components, including data abstraction, polymorphism, and higher-order functions. Topics from object-oriented programming include classes, objects, inheritance, methods, message passing, static and dynamic type checking. These topics form the core of most object-oriented languages and provide a foundation for learning more advanced language topics. Data structures capture the common organization of many kinds of data arising in the design of efficient solutions to computational problems. Specific data structures covered include stacks, queues, trees, graphs and linked lists. The design and analysis of efficient algorithms using these data structures provide a foundation for the study of computing, where understanding the complexity of a problem and the availability of efficient solutions are essential skills. Finally, topics including higher-order functional programming, data abstraction and parametric polymorphism, as well as principles from object-oriented programming, come together to support the design and implementation of modular, reusable and robust code.

**Prerequisite:**
CMPSC 121 or CMPSC 131.

**CMPSC 221 — OBJECT ORIENTED PROGRAMMING WITH WEB-BASED APPLICATIONS (3)**
This course will continue with object-oriented programming and will introduce graphics, virtual machines, programming language concepts and web-based programming using Java.

**Prerequisite:**
CMPSC 122 or equivalent.

**CMPSC 312 — COMPUTER ORGANIZATION AND ARCHITECTURE (3)**
Data representation, digital logic, instruction set/control logic,
machine/ assembly languages, advanced architectures, memory hierarchy,
I/O devices, overall system design.

**Prerequisite:**
CMPSC 121 or equivalent.

**CMPSC 313 — ASSEMBLY LANGUAGE PROGRAMMING (3)**
Program design, addressing modes, subroutines, parameter passing, stacks,
bit manipulation, text processing, DOS functions, macros, I/O,
high level language interfaces.

**Prerequisite:**
CMPSC 312

**CMPSC 360 — DISCRETE MATHEMATICS FOR COMPUTER SCIENCE (3)**
Discrete mathematics and foundations for modern computer science. Topics include sets, relations, logic, algorithms, graphs, finite state machines and regular expressions.

**Concurrent:**
CMPSC 122 or CMPSC 132

**CMPSC 412 — DATA STRUCTURES LAB (1.5)**
Programming with common data structures; recursion; stacks, queues, dictionaries, priority queues; string searching and manipulation; sorting; trees; combinatorics.

**Concurrent:**
CMPSC 462 or
CMPSC 465

**CMPSC 413 — ALGORITHMS LAB (1.5)**
Programming with common algorithm design techniques; divide and conquer, greedy method, dynamic programming, and tree and graphy traversals.

**Concurrent:**
CMPSC 463 or
CMPSC 465

**CMPSC 414 — CONTEST PROGRAMMING (1)**
Programming Contest Questions; Common Data Structures; Strings; Sorting; Searching; Combinatorics; Number Theory; Graph Algorithms; Dynamic Programming.

**Concurrent:**
CMPSC 221

**CMPSC 421 — NET-CENTRIC COMPUTING (3)**
This course introduces JavaScript and AJAX for creating Rich Internet Applications, and XML for client-server communication and Web Services.

**Prerequisite:**
CMPSC 221 or
SWENG 311

**CMPSC 426 — OBJECT-ORIENTED DESIGN (3)**
Object-oriented analysis and design; design patterns such as creational,
structural, and behavioral patterns; UML; and unified process.

**Prerequisite:**
CMPSC 221,
CMPSC 462

**CMPSC 428 — PROGRAMMING IN ADA (3)**
Structured program design using Ada; strong typing, data abstraction, packages,
subprograms, separate compilation, visibility, exceptions, generic units.

**Prerequisite:**
CMPSC 121

**CMPSC 430 — DATABASE DESIGN (3)**
Relational database model, query languages, integrity, reliability,
normal forms for design.

**Concurrent:**
CMPSC 462

**CMPSC 436 — COMMUNICATIONS AND NETWORKING (3)**
Data transmission, basic signaling, data encoding, error control,
communication protocols, security, network topologies, routing, switching,
internetworking, emerging high speed networks.

**Prerequisite:** CMPSC 312

**CMPSC 438 — COMPUTER NETWORK ARCHITECTURE AND PROGRAMMING (3)**
Network architectures, communication protocols, internetworking, network security,
client-server computing, web application development, programming with APIs.

**Prerequisite:**
CMPSC 312,
CMPSC 221;
CMPET 401 cannot be taken for credit after CMPSC 438.

**CMPSC 441 — ARTIFICIAL INTELLIGENCE (3)**
Problem solving, search techniques including local search and genetic algorithms,
knowledge representation, planning, learning, and neural networks.

**Prerequisite:**
CMPSC 122;
CMPSC 360

**CMPSC 444 — SECURE PROGRAMMING (3)**
Secure software design principles/practice, common threats, applied cryptography, trust management, input validation, OS-/programming language- specific issues, software validation.

**Prerequisite:**
CMPSC 221

**Concurrent:**
CMPSC 430 or CMPSC 431W or CMPSC 421

**CMPSC 445 — APPLIED MACHINE LEARNING IN DATA SCIENCE (3)**
Applied machine learning techniques are used in many different areas, such as the classification, visualization and analysis of data, clustering, and understanding of natural languages for human-computer interactions. These applications are crossing the boundaries of computer science and data science. Big technology firms have all started offering their own cloud machine learning platforms. This course will start with an overview of supervised and unsupervised learning, and introduce the associated libraries. It covers basic machine learning concepts, tasks, and workflow using an example classification problem based on K-nearest neighbors, Naïve Bayes, Support Vector Machine (SVM), K-means, and implementation using Python libraries. Natural language processing (NLP) techniques including n-gram models, grammar, parse trees, and part-of-speech tagging will be discussed. The issue of dimensionality of data will be discussed, and the task of clustering data, as well as supervised approaches for creating predictive models will be described, and learners will be able to apply Python predictive modeling methods while understanding process issues related to data generalizability (e.g. cross validation, overfitting). The course will also look at more advanced techniques, such as neural network, feed-forward network, back-propagation and deep learning with cloud AI services. Technological differences between using cloud services at a higher level of abstraction and coding locally will be discussed. Students will be able to identify the difference between a supervised (classification) and unsupervised (clustering) technique, identify which technique they need to apply for a particular dataset, manage and understand data, and engineer features to meet that need. Students will work in teams to develop web applications that use industry standard cloud services provided by one of the AI cloud service providers.

**Prerequisite:**
STAT 318,
MATH 220,
CMPSC 122 or CMPSC 132

**CMPSC 455 — INTRODUCTION TO NUMERICAL ANALYSIS I (3)**
Floating point computation, numerical rootfinding, interpolation, numerical quadrature, direct methods for linear systems. Students may take only one course for credit from CMPSC (MATH) 451 and CMPSC (MATH) 455.

**Prerequisite:**
MATH 220,
MATH 230 or
MATH 231,
3 credits of programming

**CMPSC 457 — COMPUTER GRAPHICS ALGORITHMS (3)**
Graphics systems/hardware, color models, transformations, projections,
clipping, hidden line/surface removal, aliasing, parametric curves/surfaces,
3D modeling, animation.

**Prerequisite:**
CMPSC 122;
MATH 220

**CMPSC 460 — PRINCIPLES OF PROGRAMMING LANGUAGES (3)**
Design and implementation of high level programming languages and
survey of language paradigms including imperative, functional,
and object-oriented programming.

**Prerequisites:**
CMPSC 312,
CMPSC 462

**Concurrent:**
CMPSC 469

**CMPSC 462 — DATA STRUCTURES (3)**
In-depth theoretical study of data structures such as balanced trees,
hash tables, priority queues, B-trees, binomial heaps, and Fibonacci heaps.

**Prerequisites:**
C or better in MATH 141 and
C or better in
CMPSC 122 and
C or better in
CMPSC 360 and
CMPSC 221

**CMPSC 463 — DESIGN AND ANALYSIS OF ALGORITHMS (3)**
Recurrences, algorithms design techniques, searching, sorting, selection,
graph algorithms, NP-completeness, approximation algorithms,
local optimization algorithms.

**Prerequisites:**
CMPSC 462,

**Concurrent:**
STAT 301 or
MATH 318 or
STAT 318

**CMPSC 469 — FORMAL LANGUAGES WITH APPLICATIONS (3)**
Regular, context free, recursive, and recursively enumerable languages;
associated machine models; applications.

**Prerequisite:**
CMPSC 360

**CMPSC 470 — COMPILER CONSTRUCTION (3)**
Compiler design and implementation; scanning, parsing, semantic analysis,
optimization (including static analysis), code generation,
garbage collection, and error detection.

**Prerequisite:**
CMPSC 221,
CMPSC 312,
CMPSC 462,
CMPSC 469

**CMPSC 472 — OPERATING SYSTEM CONCEPTS (3)**
Theoretical and practical issues of operating systems design
and implementation, process management, concurrent programming,
memory management, scheduling, I/O, and security.

**Prerequisites:**
CMPSC 312,
CMPSC 462

**CMPSC 475 — MOBILE APPLICATIONS PROGRAMMING (3)**
Development of software for devices including smart phones, tablets, handheld units, and other general purpose computing platforms.

**Prerequisites:**
CMPSC 221,
CMPSC 312,
CMPSC 462

**CMPSC 487W — SOFTWARE ENGINEERING AND DESIGN (3)**
Software development process, life cycle; requirements analysis,
specification, design, prototyping, testing, project management,
and documentation.

**Prerequisite:**
CMPSC 221,
ENGL 202C,
CMPSC 462

**CMPSC 488 — COMPUTER SCIENCE PROJECT (3)**
Project design and implementation with an emphasis on team work, documentation, and the employment and integration of computer science concepts.

**Prerequisite:**
CMPSC 487W

**CMPSC 495 — INTERNSHIP (1-18)**
Supervised off-campus, nongroup instruction including field experiences,
practica, or internships. Written and oral critique of activity required.

**Prerequisite:**
Prior approval of proposed assignment by instructor

**CMPSC 496 — INDEPENDENT STUDIES (1-18)**
Creative projects, including research and design, which are supervised on
an individual basis and which fall outside the scope of formal courses.

**CMPSC 497 — SPECIAL TOPICS (1-9)**
Formal courses given infrequently to explore, in depth, a comparatively
narrow subject which may be topical or of special interest.
Typically offered special topic courses include:

- Natural Language Processing
- Computer Forensics
- Data Mining