Effective Programming in C and Unix

School of Computer Science, Carnegie Mellon University

Course Description: 15-123 Effective Programming in C and UNIX
All Semesters: 9 units
This course is designed to provide a substantial exposure to the C programming language
and the Unix programming environment for students with some prior programming
experience but minimal exposure to C. Features of the C language that are emphasized
include arrays, structs and unions, dynamic memory allocation (malloc and free),
pointers, pointer arithmetic, and casting. Data structures that are emphasized include
dynamic lists and hash tables. Students will develop a sense of proper programming style
in the C idiom, and will be exposed to cross-platform portability issues. Students will
learn to use tools such as emacs/vi, make, and gdb to assist them in the design, testing
and debugging of their programs. Students will also learn about regular expressions and
will be able to use scripting languages such as Perl and Shell scripting to solve simple
problems. This course serves as the prerequisite for 15-213.
Prerequisites: 15-100

Course Objectives: This primary objective of this course is to prepare students on
how to use C, Unix, scripting tools to manage development projects. The course also
emphasizes the preparation for 15-213, Systems Programming course, which in turn
prepares them for operating systems and distributed systems and other systems courses.
We will use the C language (old fashioned C not C++) to teach the basics of pointers,
memory addressing, copying and moving memory, and other fundamental system tasks.
We move off the Windows platform to the AFS (Andrew File System) . On AFS we
will use the gcc compiler and it's debugger gbd. The use of simple make files will also be
emphasized. We assume that you have taken at least one programming course and you
are comfortable working with a compiler and also debugging programs. As such the
depth and rigor of the course will be more than a typical intro course. You are expected to
devote a considerable amount of time to plan, develop, test and debug your code.