Apr 27, 2024  
2022-2023 Course Catalog 
    
2022-2023 Course Catalog [ARCHIVED CATALOG]

Add to Portfolio (opens a new window)

CSCI 2041 - Advanced Programming Principles

Credits: 4
Hours/Week: Lecture 4
Course Description: This course covers the principles and techniques for creating correct, robust, modular programs. Topics include computing with symbolic data, recursion/induction, functional programming, impact of evaluation strategies and parallelism. Additional topics include organizing data/computations around types, search-based programming, concurrency and modularity.
Prerequisite(s): CSCI 1082 - Object-Oriented Programming   and CSCI 2014 - Discrete Structures of Computer Science  with grades of C or higher.
Major Content
  1. Introduction to functional programming: primitive types and operators, let bindings, lambda expressions, recursion
  2. Conditional expressions, pattern matching, iteration and recursion, tuples and lists
  3. User-defined data types, product and sum types, inductive types
  4. Higher-order functions, currying, closures, polymorphism
  5. List-processing functions: map, filter, fold, reduce; relationship between functions
  6. Program representation and evaluation.
  7. Type checking and type inference.
  8. Evaluation strategies: call-by-name, call-by-value, lazy evaluation
  9. Evaluation control: exceptions, continuations, delayed evaluation
  10. Evaluation of program correctness using natural and structural induction”
  11. Types and imperative programming: side effects, references, mutable data structures, and algorithms
  12. Modularity and data abstraction mechanisms
  13. Optional topics: search, program representation, concurrency, proof techniques

Learning Outcomes
At the end of this course, students will be able to:

  1. write, and debug simple functional programs for recursive computations on lists, trees, strings, and numeric types.
  2. use inductive, polymorphic, and hierarchical abstract data types to organize program data and efficiently solve computational problems.
  3. explain the benefits and limitations of type systems, as well as the common program errors that can be eliminated using strong type systems.
  4. explain how manipulating functions as values and the use of higher-order functions can be used to solve appropriate algorithmic problems.
  5. explain how common list-processing functions (such as map, fold, reduce, and filter) are used and implemented in order to be the best for a given algorithmic task.”
  6. explain the impact of different approaches to program evaluation and methods to manipulate the order of evaluation in programs, such as continuations, exceptions, tail recursion, and streams.
  7. explain and differentiate program organization and reuse mechanisms such as polymorphism, modules, namespaces, private internals, classes, and nesting.


Courses and Registration



Add to Portfolio (opens a new window)