## General Information Edit

Computer systems programming involves developing software to connect the low-level computer hardware to high-level, user-facing application software while explicitly managing various resource constraints. Examples of computer systems software include compilers, operating systems, databases, numerical libraries, and embedded controllers.

This course aims to provide a strong foundation in computer systems programming using C and C++, the languages of choice for system-level programmers. The course is structured into three parts. In the first part, students will learn basic C programming (e.g., static typing, functions, control flow, arrays, strings, pointers, dynamic memory management); students will then apply their knowledge of C to explore basic algorithmic techniques (e.g., recursion, divide-and-conquer, dynamic programming), basic algorithms (e.g., sorting), and basic data structures (e.g., lists, stacks, queues, sets, maps). In the second part, students will learn more advanced C++ programming (e.g., objects, inheritance, polymorphism, templates); students will then apply their knowledge of C++ to explore more advanced algorithms and data structures (e.g., binary search trees, priority queues, hash tables, graphs, spanning trees). In the third part, students will explore systems programming in the UNIX environment using POSIX I/O, processes, and threads.

The course includes a strong emphasis on both theoretical and practical design trade-offs. A series of programming assignments enable students to apply what they have learned to interesting real-world problems and to gain experience with version control, continuous integration, debugging, profiling, and code optimization.

## Prerequisites Edit

CS 1110 (preferred) or CS 1112

## Topics Covered Edit

- Introduction to the C programming language: variables, expressions, and functions; control flow; basic data types; typecasting; pointer basics; the heap; arrays and strings; uses of pointers; memory management
- Basic algorithmic techniques: computational cost; recursive algorithms; divide-and-conquer; dynamic programming; other programming techniques
- Basic algorithms and data structures: N-squared sorting; N-log-N sorting; N sorting; lists; stack and FIFO abstract data types; set and map abstract data types
- Introduction to the C++ programming language: object creation and destruction; templates; inheritance and polymorphism
- Advanced algorithms and data-structures: binary search trees; priority queues; hashing; graphs; spanning trees
- Concurrent programming with UNIX: the process environment; processes and POSIX threads; concurrency; synchronization

## Workload Edit

- Homework: Six programming assignments per semester. First four programming assignments are done individually, final two programming assignments are done in groups of two students.
- Exams: Two preliminary exams and a comprehensive final exam.

## Past Offerings Edit

Semester | Time | Professor | Median Grade |
---|---|---|---|

Spring 2017 | MWF 11:15 - 12:05 | Jose Martinez | B |

Fall 2017 |
MWF 10:10 -11:00 | Christopher Batten | |

Spring 2018 |
MWF 11:15 - 12:05 | Jose Martinez | |

Fall 2018 | MWF 10:10 -11:00 | Christopher Batten |