All computer science prerequisites (courses beginning with 50:198) must be satisfied with a grade of C or higher.

50:198:105 Introduction to Computing for Engineers and Scientists (3 credits)
Fundamental concepts of structured programming and algorithmic problem solving using MATLAB. The course content will be substantially similar to that in 50:198:111 but with an emphasis on problems and techniques (such as model building and plotting) for engineers and scientists. Computer science majors cannot use the credits from this course toward their major requirements.
Prerequisite: 50:640:113 or 115, or by placement

50:198:111 Programming Fundamentals (4 credits) 
Fundamental concepts of structured programming and algorithmic problem solving: primitive data types, control structures, functions and parameter passing, top-down design, arrays, files, and the mechanics of compiling, running, testing, and debugging programs. These concepts will be taught using the high-level language Python.
Prerequisite: 50:640:113 or 115, or by placement
Term: Fall, Spring

50:198:113 Object-Oriented Programming (3 credits)
Principles of object-oriented program design and advanced algorithmic problem solving illustrated through an object-oriented language. Topics include encapsulation and information hiding; classes, subclasses, and inheritance; polymorphism; class hierarchies, and the creation, implementation, and reuse of APIs (application programming interfaces). Extensive practice with designing and implementing object-oriented programs, especially using elementary data structures such as linked lists, stacks, and queues.
Prerequisite: 50:198:111
Corequisite: 50:640:121 or 130
Term: Fall, Spring

50:198:171 Mathematical Foundations of Computer Science (3 credits)
Sets, relations, and functions; pigeon-hole principle; cardinality, countability, and uncountability; propositional and predicate logic; universal and existential quantification; proof techniques: formal proofs using counterexample, contraposition, contradiction, and induction; recursive definitions; basic counting: inclusion-exclusion, arithmetic, geometric progressions, and summations; properties of special functions such as logarithms, exponentials, and factorials; permutations and combinations, solving recurrences; graphs and trees; basic discrete probability.
Prerequisite: 50:640:113 or 115, or by placement
Term: Fall, Spring

50:198:211 C and Systems Programming (3 credits)
Introduction to programming in the C language with an emphasis on its use in writing low-level systems programs. Topics will include coverage of standard C programming idioms, especially with macros and memory management; introduction to programming with the Unix shell and POSIX system calls; and experience with testing and code maintenance using standard tools like debuggers and code revisioning systems.
Prerequisite: 50:198:113
Term: Fall

50:198:213 Data Structures (3 credits)
Basic algorithmic analysis: asymptotic notation (Big-Oh, little-oh, and Theta) for estimating the complexity of a problem, using recurrence relations to analyze the complexity of recursive algorithms. Tree-based data structures: binary search trees, heaps, and balanced search trees; hash functions and hash tables; abstract dictionaries; using data structures to implement basic algorithms (such as searching, sorting, and depth- and breadth-first search in graphs; data compression).
Prerequisites: 50:198:113, 50:198:171, and (50:640:121 or 130)
Term: Fall, Spring

50:198:325 Java Applications (3 credits)
Java class hierarchy and inheritance; applications and applets; graphical user interfaces, exception handling, input/output; multithreading, multimedia, and networking.
Prerequisites: 50:198:113 and 213
Term: Spring

50:198:331 Introduction to Computer Organization (3 credits)
Elementary digital logic; machine-level representation of data; assembly-level machine organization: the von Neumann machine with its fetch-decode-execute cycle, instruction sets, and assembly language programming; addressing modes; subroutine calls and returns; I/O and interrupts; memory systems: hierarchy, organization, and operations.
Prerequisite: 50:198:113
Corequisite: 50:198:211
Term: Fall

50:198:335 Cybersecurity Fundamentals (3 credits)
Cybersecurity Fundamentals will cover basic topics in Cybersecurity related to risk management and mitigation, encryption, network security, wireless security, social engineering, malware and ransomware, operating system security, defense in depth, secure software lifecycle and penetration testing. Students will complete this course with a basic working knowledge of these topics, as well as a working understanding of the current cybersecurity threat landscape.
Prerequisite: 50:198:211 and 331
Term: Fall

50:198:341 Operating Systems (3 credits)
Comprehensive, hands-on coverage of operating system principles, design, and implementation. Topics include kernel development; process concurrency issues such as starvation, mutual exclusion, deadlock avoidance, concurrency models and mechanisms, producer-consumer problems, and synchronization; scheduling policies and algorithms for preemptive and nonpreemptive scheduling; memory management and analysis of paging and segmentation policies; and file systems.
Prerequisite: 50:198:211 and 331
Term: Spring

50:198:355 Secure Coding (3 credits)
Introduction to some of the most common forms of security vulnerabilities a software engineer must be aware of when designing, implementing, and verifying software systems. The course will review the most common form of defects, bugs, and logic flaws that can become security vulnerabilities, cite real-world examples of their exploitation, and provide students with a working knowledge of how to mitigate against such exploitations, including the use of static code analysis tools.
Prerequisites: 50:198:211 and 50:198:331
Term: Spring

50:198:371 Design and Analysis of Algorithms (3 credits)
Algorithm design techniques: divide-and-conquer, greedy method, dynamic programming, backtracking, and branch-and-bound. Advanced data structures, graph algorithms,  and algebraic algorithms. Complexity analysis, complexity classes, and NP-completeness. Introduction to approximation algorithms and parallel algorithms.
Prerequisites: 50:198:171 and 213
Term: Spring

50:198:414 Artificial Intelligence (3 credits)
The objective of this course is to become familiar with Artificial Intelligence. This course will provide students with an understanding of main concepts of Artificial Intelligence needed for the implementation and performance of the fundamentals of intelligent agents/programs and to understand their applications. It focuses on the theory and algorithms underlying Al, including heuristic approaches and advanced search, inference in first order logic, knowledge representation, probabilistic reasoning, and Bayesian belief network.
Prerequisites: 50:640:121 or 130 & 50:198:213
Term: Spring

50:198:421 Compiler Construction (3 credits)
Topics in the design of programming language translators, including parsing, run-time storage management, error recovery, code generation, and optimization.
Prerequisites: 50:198:213 and 331

50:198:423 Software Engineering (3 credits)
Principles and techniques for the design and construction of reliable, maintainable, and useful software systems. Software life cycle, requirements specifications, and verification and validation issues. Implementation strategies (e.g., top-down, bottom-up, teams), support for reuse, and performance improvement. A treatment of human factors and user interfaces included.
Prerequisites: 50:198:113 and 171

50:198:441 Distributed and Cloud Computing (3 credits)
This course introduces the concepts, models, implementations, and applications of Cloud Computing and Distributed Systems. Topics will include Cloud Architectures, Technologies, Services, and Security. The course will provide students hands-on experience implementing core cloud services and will allow for a more in-depth exploration with a significant semester project.
Prerequisites: 50:198:231 or 331 and 171

50:198:446 Computer Networks (3 credits)
Introduction to computer communication networks, including physical and architectural components, communication protocols, switching, network routing, congestion control, and flow control. End-to-end transport services, network security, and privacy. Networking software and applications. Network installation, testing, and maintenance.
Prerequisites: 50:198:331 and a good working knowledge of C

50:198:447 Network Security (3 credits)
This course will provide in depth instruction on network security methods and technologies. Today, data is typically connected to networks which then may be connected to the internet. With data being connected with the ability for anyone in the world to be able to access it, it is critical that network security methods are used to allow only permitted people access to that data. This is accomplished through the network design, access control policies, and network technology. This course will provide instruction on how these items are used to protect information. This includes the following topics firewalls, intrusion detection and prevention, virtual private networks, proxies, : remote access protections, data loss prevention systems, network and security management systems, network .
Prerequisite: 50:198:331
Term: Spring

50:198:451 Database Systems (3 credits)
Relational database theory and practice, including database design. Database concepts, relational algebra, data integrity, query languages, and views.
Prerequisites: 50:198:113 and 171

50:198:454 Machine Learning (3 credits)
This course provides an overview of machine learning and data mining with a focus on the theory and algorithms underlying a range of tasks including data collection and mining, statistical learning theory and underlying probability theory, decision trees, supervised and unsupervised learning, classification, regression and clustering, deep learning, and the derivation practical solutions using predictive analytics. It will deal with machine learning applications in different fields such as bioinformatics and big data analysis.
Prerequisites: 50:640:122 & 50:198:213

50:198:456 Computer Graphics (3 credits) 
Graphics systems and imaging principles, graphics programming using packages like OpenGL, input devices and interactive techniques, animation techniques, geometric transformations and modeling in two and three dimensions, viewing in 2D and 3D, lighting and shading, fundamental graphics algorithms (such as clipping, hidden surface removal, etc.)
Prerequisites: 50:198:213

50:198:461 Optimization Methods (3 credits) 
Description: This course introduces various methods based on linear programming to solve discrete optimization problems. The topics covered in the course will include introduction to linear programming (LP), network flows, and application of LP-based techniques to solve various optimization problem.
Prerequisites: (50:640:121 or 50:640:130) and 50:640:250 and 50:198:213.

50:198:462 Big Data Algorithms (3 credits) 
Study of algorithmic techniques and modeling frameworks that facilitate the analysis of massively large amounts of data. Introduction to information retrieval, streaming algorithms and analysis of web searches and crawls.
Prerequisite: 50:198:213

50:198:467 Applied Probability (3 credits)
An introduction to probability theory and the modeling and analysis of probabilistic systems with emphasis on applications in computer science, engineering, and data science. Probabilistic models, conditional probability. Discrete and continuous random variables. Expectation and conditional expectation. Limit Theorems. Bernoulli and Poisson processes. Markov chains. Bayesian estimation and hypothesis testing. Elements of statistical inference.
Prerequisites: 50:198:171

50:198:473 Computational Geometry (3 credits)
Algorithms and data structures for geometric problems that arise in various applications, such as computer graphics, CAD/CAM, robotics, and geographical information systems (GIS). Topics include point location, range searching, intersection, decomposition of polygons, convex hulls, and Voronoi diagrams.
Prerequisites: 50:198:171 and 213

50:198:475 Cryptography and Computer Security (3 credits)
Secret-key cryptography, public-key cryptography, key agreement, secret sharing, digital signatures, message and user authentication, one-way functions, key management; attacks; practical applications to computer and communications security.
Prerequisites: 50:198:113 and 50:198:171
Term: Fall

50:198:476 Theory of Computation (3 credits)
Formal languages, automata and computability; regular languages and finite-state automata; context-free grammars and languages; pushdown automata; the Church-Turing theses; Turing machines; decidability and undecidability. 
Prerequisites: 50:198:171 and 213

50:198:481 Numerical Methods (3 credits)
Computational techniques for solving scientific problems:  Precision, IEEE floating point representation, interpolation, root finding, numerical integration, numerical differentiation, approximation of functions, functions minimization, numerical linear algebra, numerical solutions of ordinary differential equations.
Prerequisites: 50:198:113 and 50:640:122

50:198:493 Senior Design Project(3 credits)
Design, implementation, and demonstration of a significant software and/or hardware project. Project proposals must be submitted and approved by instructor. Part of the lecture time used to discuss such issues as the historical and social context of computing, responsibilities of the computing professional, risks and liabilities, and intellectual property. This course is intended for computer science majors in their senior year who have completed at least three 300- or 400-level courses in computer science.
Prerequisite: Approval by department

50:198:494 Independent Study
Individual study under the supervision of a computer science faculty member; intended to provide an opportunity to investigate areas not covered in regular courses.
Prerequisite: Permission of instructor

50:198:495-496 Honors Program in Computer Science 
A program of readings and guided research in a topic proposed by the student, culminating in an honors thesis presented to the departmental faculty for approval.
Prerequisite: Approval by department

50:198:497 Computer Science Internship
The practical application of computer science knowledge and skills through an approved internship in a sponsoring organization. Arrangements for the internship must be agreed upon by the sponsoring organization and approved by the department before the beginning of the semester. Students should consult the department for detailed instructions before registering for this course.
Prerequisite: Approval by department