The Art and Science of C
Instructor’s Manual
Eric S. Roberts
Stanford University
Stanford, California
Instructor’s Manual for The Art and Science of C
Converting from Pascal to C 2
Section 1
Converting from Pascal to C
From the late 1970s to the early 1990s, Pascal was the standard language for introductory computer science
instruction throughout the United States and in much of the rest of the world as well. Over the last several years,
however, many institutions have been moving away from Pascal as the language begins to show its age. Although
some schools have taken a different direction, many—including Stanford—have adopted ANSI C as the language of
instruction for the introductory course. Along with its object-oriented successor C++, ANSI C is the dominant
language in the industry today. Teaching C early in the curriculum gives students additional preparation in the
language they are most likely to use and makes for a smoother transition to C++ when that material appears later in
the curriculum.
The reasons behind Stanford’s decision to adopt C in the introductory course are outlined in the “To the Instructor”
section of The Art and Science of C and discussed in detail in the paper “Using C in CS1: Evaluating the Stanford
experience,” which is included in Section 8 of this Instructor’s Manual. The purpose of this section is not to
recapitulate those reasons but to talk instead about strategies and tactics for making the change.
The two most important lessons to pass on from our experience at Stanford are the following:
1. The transition will not be easy. Anyone who suggests that changing the implementation language in an
established curriculum is a simple task would be better employed marketing snake oil. The overall design of the
introductory programming course depends to a surprising extent on the mechanics of the language system used to
provide instruction; changing the language therefore has implications that affect the entire curriculum. The
instructional staff needs to rethink how to present material, someone must rewrite the assignments, and the
institutional structures supporting the introductory course must adapt to the new conditions.
2. The advantages of making the change will be greater than anticipated. At Stanford, our original goal in making
the transition was to produce students in the new introductory course who programmed as effectively in C as
their predecessors had in Pascal. Because C programming skills are more useful in subsequent courses, we
believed that having the students attain the previous level of skill would be sufficient. What we’ve found is that
students are much better programmers coming out of the revised course than they ever were before. They are
more excited about the material, have worked harder to attain a level of mastery, and understand certain essential
concepts—most notably modularity and data abstraction—much better than their predecessors did.
There are several things you can do to simplify the transition.
• Take advantage of the benefits afforded by the library-based approach. Because there are more details involved
in learning C than in learning Pascal, it is important to simplify the conceptual process for students at the
introductory level. In our experience, the most effective way to do so is to use the abstraction capabilities of the
language to hide its complexity until the students are better able to understand it. The essential characteristics of
the library-based approach are discussed in Section 2.
• Prepare any affected staff for the transition. Before making a change of this magnitude, it is important to make
sure that the teaching staff responsible for the course—including TAs and anyone else who has direct contact
with students in the course—have a chance to prepare for the transition. In the first year, we continued to teach a
Pascal-based course while running a small, experimental C section. This phased introduction gave us time to
refine the course materials and develop a cadre of support staff with the necessary expertise.
Instructor’s Manual for The Art and Science of C
Converting from Pascal to C 3
• Recognize that the conversion will take time to stabilize. One of the realities that we failed to understand when
we first made the change at Stanford was how much we depend on the campus community as a whole to provide
support for introductory teaching. In most years, students rely on older students in the dormitories for assistance.
When we began to convert the introductory course, the students had no one to consult beyond the course staff,
which was already overloaded trying to institute the changes. After a year, however, the informal support
structures had been largely reestablished.
Instructor’s Manual for The Art and Science of C
The Library-Based Approach 4
Section 2
The Library-Based Approach
Using The Art and Science of C makes it possible to teach C to introductory students without forcing them to
assimilate all the details that make C difficult as a first language. For this purpose, the text uses a library-based
approach that emphasizes the principle of abstraction.
Adopting the library-based approach has the following advantages:
1. Libraries and modular development are covered in considerable detail early in the presentation. Students using
this text are exposed to the design and implementation of library packages much earlier than in most introductory
courses. As a result, they complete the course with a much deeper understanding of not only the mechanics of
libraries but also the associated concepts of abstraction and information hiding. By the middle of the first course,
students understand the idea of an interface and appreciate the difference in perspective between the client and
the implementation. This understanding makes it much easier for them to structure applications that adhere to the
principles of modern software engineering.
2. The libraries conceal many of the most difficult and confusing aspects of the language. For the introductory
student, the process of learning C is complicated by the fact that many of the concepts that one needs for simple
programs are complex operations in the C domain. One of the classic examples is the scanf function, which
requires students to use the & operator and to understand in detail the process of character I/O before they write
their first program. Because they are using a library containing a much simpler collection of input functions,
students do not have to confront these difficulties until much later in the course.
3. The use of libraries makes it possible to present concepts in a logical, easily assimilated order. The C
programming language was designed for use by experienced programmers. As a result, understanding the
underlying logic of the language often requires more detailed knowledge of programming concepts than the
introductory student is likely to have. For example, C’s approach to strings makes sense if you already
understand arrays, which in turn make sense if you understand pointers. From the student’s perspective,
however, the internal dependencies among these concepts make learning much more difficult because strings are
in fact conceptually simpler than the concepts on which strings are based. Introducing a library like strlib.h
breaks the internal dependency and makes it possible to introduce the concepts in an order that makes them much
easier for new students to grasp.
4. Using libraries dramatically extends a student’s ability to write exciting applications. The graphics library
introduced in Chapter 7 does more than introduce the notion of a library interface. By giving the students tools to
draw simple figures on the computer screen, the graphics.h interface frees them from the sterile world of the
text-based user interface and opens up the more exciting domain of computer graphics. Particularly now that
most students have experience working with computers that offer graphical capabilities, being able to build
graphical applications is essential to keeping student interest high.
5. The text demonstrates the power of libraries by using them. The libraries in the text serve not only as tools but
also as objects of study in their own right. As the text reveals the implementation of the libraries, students gain a
better understanding of how libraries work and how they can be used to control the complexity of a large
software application.
The details and advantages of the library-based approach are considered more thoroughly in two papers included in
Section 8 of this Instructor’s Manual: “Using C in CS1: Evaluating the Stanford experience” and “A C-based
graphics library for CS1.”
Instructor’s Manual for The Art and Science of C
Obtaining Copies of the Libraries 5
Section 3
Obtaining Copies of the Libraries
To make it possible to teach ANSI C at the introductory level, The Art and Science of C is designed around several
special libraries—collectively known as the cslib library—that hide much of the complexity associated with C until
students are better equipped to understand how everything works. To use the text, you must have access to the
cslib library on your own machine. Although the code for the cslib library is included in Appendix B of the text,
it is much easier to obtain an electronic copy from the following FTP site:
ftp://ftp.awl.com/cseng/authors/roberts/cs1-c
With the exception of the graphics library presented in Chapter 7, the cslib library is entirely standard and requires
nothing more than what is provided as part of ANSI C. Thus, if you do not intend to use the graphics library, it
doesn’t matter what version of cslib you get—they are all the same. However, because the mechanics of
displaying screen images depend on the hardware and software configuration of each computer, you need an
implementation of the graphics library that is appropriate to your computing environment.
To find the right version of the cslib library for your computing platform:
1. Check to see if your computing platform is any of the following:
• A Macintosh running THINK C or Symantec C++
• An IBM PC (or clone) running the Borland C/C++ compiler
• Any Unix system running the X Window System
For each of these platforms, there is a corresponding implementation of the libraries specific to that computing
environment. To obtain it, you should connect to the appropriate subdirectory and follow the instructions in that
README file. You should also check the README file on the FTP directory to see if new library releases have been
made since this guide was published.
2. If you are using one of the hardware systems from the preceding list with a different compiler or operating
system, consider purchasing the software necessary to make your platform correspond to one of the standard
implementations. For example, if you own an IBM PC but use some compiler other than the Borland compiler, it
might be worth installing the Borland compiler so that you can use all the features provided by the libraries,
including interactive graphics. Although implementations for other platforms may be released in the future,
adapting the graphics library is not a high-priority task now that there is at least one implementation for each of
the major hardware platforms used in most universities.
3. If you cannot obtain the desired software or are using some other type of machine, get a copy of the standard
version of the library code from the standard subdirectory.
This implementation defines the libraries in an ANSI-standard form but does not provide any on-screen graphics.
The standard implementation of the graphics library instead writes a file containing a text representation of the
image suitable for printing on any PostScript printer.
4. Although the standard library implementation is highly portable and works without change on every machine
I’ve tried, there may be some systems that cannot support it. If you find that your system does not support the
standard libraries for some reason, you should try the simplified version of the library, which provides the
minimum level of support necessary to run the programs in the text.
Subdirectory index
The top-level ftp directory contains no relevant files other than a README file. The files you need for the various
libraries are collected in the following subdirectories, each of which is described in more detail in the sections that
follow:
simplified
This subdirectory contains the simplest possible version of the library code and matches the
code printed in Appendix B of the text (except for two minor changes introduced to increase
Instructor’s Manual for The Art and Science of C
Obtaining Copies of the Libraries 6
portability). This implementation is machine-independent and requires no system support
beyond the standard ANSI libraries. The implementation of the graphics library provides no
actual screen display but instead writes a PostScript file containing the image. The simplified
version of the cslib library should be used only if you are unable to get the standard version
or one of the platform-specific implementations to work in your environment.
This subdirectory offers a more advanced version of the libraries than that used in the
simplified package. One advantage of the standard version is that it is compatible with the
programs in the forthcoming companion volume to The Art and Science of C, which will
cover more advanced material focusing on data structures and algorithms. Most importantly,
the standard version of the library includes a portable exception-handling package that makes
it possible to use better error-recovery strategies. Using the standard version of the cslib
library, as opposed to the simplified set, makes for a smoother transition to more advanced
work.
Like the simplified package, the standard package implements the graphics library in a
machine-independent way by writing a PostScript file. If you are working on a system for
which there is a platform-specific implementation of the graphics library (these systems are
enumerated later in this list), you should use that version instead. The standard version exists
so that the fundamental libraries can be used on the widest possible set of platforms.
Along with the facilities provided by the standard library package, this subdirectory contains
an implementation of the graphics library designed for use with the X Window System, which
is available on many computers that run the Unix operating system. The implementation is
designed to work with several different versions of the Unix operating system and
automatically configures itself to use the appropriate code for each.
This subdirectory contains an implementation of the graphics library for THINK C (or
Symantec C/C++) on the Apple Macintosh. It also includes an interface that allows students
to make a typescript of their computer session, which is a difficult operation with older
versions of THINK C. To use this library, your Macintosh must be running System 7 of the
operating system, and the THINK C compiler must be version 5.0 or later.
This subdirectory contains two separate implementations of the graphics library for the
Borland C/C++ compilers used on the IBM PC and its clones. The dos subdirectory provides
a simple implementation of the basic graphics library on top of DOS. The windows
subdirectory has a complete implementation of the graphics library that is compatible with
Microsoft Windows. Except for the graphics library, the package is identical to the standard
package. The pc-borland version of the libraries has been tested with Version 4 of the
Borland C/C++ compiler. The same code may work with other versions of the compiler and
associated software, but it is impossible to test it with every version of the compiler.
This subdirectory contains documentation on the libraries and the overall approach used in
The Art and Science of C. See the README file in the documents directory for more
information.
This subdirectory contains electronic copies of all sample programs used in the text. If you
are teaching a course using this text and want solutions to the exercises, please contact your
Addison-Wesley representative.
standard
unix-xwindows
mac-think-c
pc-borland
documents
programs
Notes and disclaimers
The cslib libraries are in the public domain and may be freely copied and distributed, although they remain under
development. No warranties are made concerning their correctness or stability, and no user support is offered.
Section 4
Designing a Syllabus
Instructor’s Manual for The Art and Science of C
Designing a Syllabus 7
The structure of the syllabus for an introductory programming course depends significantly on many factors specific
to the institution. Stanford, for example, is on the quarter system, which means that the course material must fit into
a ten-week quarter. Schools that follow a more traditional semester calendar have more class meetings, although
there is nonetheless considerable variability in the length of the term even among those institutions. Because of this
variability, it is difficult to design a syllabus—or a text for that matter—that is precisely appropriate to the needs of
all institutions.
Beyond the variations in the academic calendar, different schools also tend to cover material at different speeds. At
Stanford, we move at a relatively fast pace that may not be appropriate for all institutions. To ensure that students
do not get left behind in the process, we provide an extensive infrastructure that supports the more traditional lecture
component of the course. Every quarter, we hire a large number of advanced undergraduates to lead sections and
provide general course assistance, which includes staffing the main computing cluster 70 hours a week. (This
program is described in the paper “Using undergraduates as teaching assistants in introductory programming
courses,” which appears in Section 8 of this Instructor’s Manual.) It is the fact that we have a large, easily
accessible staff that makes it possible for us to move as quickly as we do, covering essentially a semester’s worth of
material in a ten-week quarter.
The “To the Instructor” section of the text describes each of the chapters and offers various suggestions about how to
order the material. The next two pages show a typical syllabus from Stanford’s CS106A course, which encompasses
the basic CS1 material from Curriculum ’78. As the syllabus shows, we cover the entire the text with the exception
of the topics in Chapter 17, which are presented the following quarter in CS106B.
The syllabus also shows several additions to the curriculum beyond the material in The Art and Science of C. The
major extensions in the Stanford course are that
• We start the quarter with a “preprogramming” exercise. At the beginning of the first programming course, it is
much more important for students to learn about programming as a general problem-solving methodology than it
is for them to learn all the syntactic details of the specific language used in the course. Over the years, we have
found that the best way to focus the students’ attention on the more important questions of algorithmic design is
devote the first three days to Richard Pattis’s fine book Karel the Robot: A Gentle Introduction to the Art of
Programming. Having used this book for many years when the course was taught in Pascal, we were pleased
that it continued to be very effective after the transition to C.
• We include a unit on a simulated computer called CSim. Particularly when students begin to learn about arrays
and pointers in C, it is essential for them to have a model of how memory and addressing work. To give students
more of a hands-on sense of how the computer operates, we start this section by introducing a locally developed
simulated computer called CSim. Like Donald Knuth’s MIX machine described in The Art of Computer
Programming, the CSim machine has a restricted set of capabilities and a simplified instruction set that are
nonetheless sufficient to illustrate basic principles of how computers work at the machine-language level. Copies
of the CSim simulator and accompanying descriptive materials will become publicly available sometime in 1995;
in the meantime, it is sufficient to rely on the discussion of memory organization in Chapter 11.
• We include discussion of the social impact of computing. Computers play an increasingly important role in all
aspects of our society and, as a result, computer professionals have a greater responsibility to ensure that their
work benefits society. At Stanford, we emphasize the importance of good software engineering throughout the
introductory course and talk about the risks associated with the software development process.
Instructor’s Manual for The Art and Science of C
Designing a Syllabus 8
Syllabus for CS106A
Autumn Quarter 1993–94
Monday
Wednesday
September 29
Friday
October 1
Administration
What is programming?
Introduction to Karel
Defining new instructions
Control structures in Karel
Read: Pattis, Chapters 1–2
Read: Pattis, Sections 3.1–3.5,
4.1–4.5, 5.1–5.4
4
6
8
Program decomposition
Stepwise refinement
Read: Pattis, Sections 3.8–3.9,
5.5
11
Problem solving
Programming idioms
Loops: for and while
Introduction to C
C program structure
Simple input and output
Values, variables, and types
Arithmetic expressions
Precedence
Read: Roberts, Chapter 1,
Sections 2.1–2.3
Due: Assignment #1
13
More problem solving
Conditional testing
The if and switch statement
Read: Sections 2.4–2.5
15
Functions and procedures
Writing your own functions
Using libraries
Read: Chapter 3
Due: Karel contest entry
Read: Chapter 4
Read: Chapter 5
Due: Assignment #2
18
20
22
A simple graphics library
Defining tools
Decomposition in C
More on the graphics library
The contents of an interface
Procedural abstraction
Random numbers
Defining an interface
Read: Sections 7.1–7.3
Read: Section 7.4
Read: Chapter 8
Due: Assignment #3
25
27
29
Algorithms
Debugging strategies
Midterm Exam
(90 minutes, open book)
Read: Chapter 6
Read: Handout on debugging
Due: Assignment #4