The main objective of this undergraduate course is to provide an in-depth understanding of programming principles underlying modern application and systems software. In particular, the course familiarizes the students with advanced programming constructs utilized for handling memory and files, basic software structures and their associated algorithms, low-level programming, building, debugging, documenting and optimizing large-scale software systems individually and in groups through integrated software environments. The course is taught in the C programming language. Outline: The course is organized in the following four topics: A) Building Entry-scale programs: Fundamental constructs of the C programming language: Types (x86, x64), Expressions, Arrays, Functions, IO, basic program organization. Program Anatomy in Memory and Disk, Processes and Addresses. Memory (Pointers, Pointers and Arrays, Strings and Examples), Structures, Unions and Enumerations. Disk (File Streams, Formatted, Character, Block I/O, File positioning, buffering. B) Building Mid-scale programs: C Preprocessor, Source/Header Files, Building multiple files with Makefiles, linking, macros, etc.). Linear and Non-Linear Programming Data Structures (Dynamic memory allocation, lists, queues, doubly-linked lists, trees, applications and examples). Advanced Programming Constructs and Error Handling: Pointer-to-Pointers, Pointers-to-Functions, Inline Functions and library functions (assert, errno, perror). C) Building Large-scale Programs: Modules, Information Hiding, Design Issues, Extreme Programming and Subversion, Open-source collaborative software development. D) Selected Topics: Low-level Programming, Introduction to Secure Programming and Introduction to C++.

Course Website: