Computer Science 197c - Programming in C++
Winter Session 2001
Brent Heeringa
Work Phone: 413.545.3616
Home Phone: 413.549.9619

[ General Information | Lectures | Office Hours | Assignments | References ]

General Information

This is a first course in C++ for people who are comfortable with Java. I'm not exactly sure what comfortable means, but you probably should be able to tell me about abstract and concrete classes, objects, interfaces, inheritance, visibility, encapsulation, polymorphism, exceptions, packages and some procedural programming constructs like condtionals, iteration, and recursion. I also expect that you are familar with the Java environment including the compiler (javac), the classpath environment variable (CLASSPATH) and the Java virtual machine (java).

I'm not really into traditional exams and for a straight-shot programming course it seems fairly innapproriate to require a final, so I'd much rather write a lot of code and then talk about our experiences in doing it.

Lectures

I really want the first few lectures to be a solid introduction to C++, and the final few to be a friendly, involved discussion about the language. There are seven lectures, so that leaves us about three lectures to ooze into on both sides. If the class turns out to be one big question and answer session after the first few periods, I'd be thrilled. If it doesn't, that's cool too.

Just so you know, I'm not really into hand-raising. General shouting, interruption, voice-clearing, or other methods of attention seem to work best for me. If you want to raise your hand, there's a non-trivial chance I'll call on you. Just realize you don't need to go about things that way.

Office Hours

How about Tuesdays and Thursdays from 16:00 to 17:00 in Room 264 of the new computer science building. Send email anytime.

Assignments

I'll post assignments here along with due dates, corrections, digressions, general comments, sonnets, movie reviews, and witty banter.

  • Assignment 0

    The best mechanism for learning a new language is to write code using that language. So, it seems reasonable that the first exercise should be a straight-forward programming assignment.

    Chapter 14 of Budd [page 215] introduces rational numbers (or fractions) in a case study. Most of the implementation is given in bits and pieces throughout the chapter. I've implemented my own Rational number class that closely resembles that given in the text but highlights a number of constructs available in the C++ programming language. I've also implemented a Complex number class in Java. This class contains the common algebraic operations addition, subtraction, multiplication, and division as well as exponentiation, equivalence, and formatting methods.

    The assignment is to implement the Complex number class in C++ using a style similar to that given in the Rational class I've written. By style, I don't mean you must use the same conventions for bracket placement but rather, use the natural C++ conventions for implementing functions and operations. For example, use the operator overloading capabilities of C++ to implement the algebraic operations so that plus appears like

          const Complex operator+(const Complex& c1, const Complex& c2) {
             // logic goes here
          }
          
    instead of
          const Complex Complex::plus(const Complex& c) {
            // logic goes here
          }
          
    Really, the above two functions are quite different. They both implement a flavor of addition, but the former is not a member function, while the latter is.

    Make sure to overload the output stream, equality, and assignment operators. Also implement a copy constructor and any other supporting routines you deem necessary. Reuse the DivideByZeroException class I provided in the Rational example. I realize this is a pretty hefty assignment, but because the Rational number class is heavily documented and the syntaxes between the Rational and Complex implmentations are almost identifical, it should decrease the harshness and be a profitable assignment.

    You can download all the necessary files standalone, in a zip file, or in a gziped tar file below.


    Use the MainComplex.cc file to test your code. Turn in your Complex.h and Complex.cc files to me on 10 January 2001 by 17:00. This gives us Friday and Wednesday to talk about crazy stuff that happens. Feel free to write me email or drop by the ol' office hours.

    To compile the Rational number class (and it's necessary supporting files), download the files to some directory. if you downloaded a zip file use

          % unzip assignment0.zip
          
    If downloaded a tgz file use
          % gzip -d assignment0.tgz
          % tar -xvf assignment0.tar
          
    The C++ Rational number class will use all the files except for MainComplex.cc. However, we only need to compile the implementation (.cc) files. So do a
          % g++ -fhandle-exceptions Rational.cc DivideByZeroException.cc Cmpsci197cUtil.cc Main.cc
          
    This will compile all the files into an executable called a.out. If you want the compiler to dump the executable into a different file, you can add
          -o FileName
          
    to the command. The best way to compile C++ is probably using a makefile. If you download the makefile into the same directory as the source and type
          % make
          
    at the command line, this will compile the Rational number class into an executable called Main. This makefile works for the version of g++ on oit. Notice that you explicitly need to tell the compiler to use exception handeling. On newer versions of g++ this has been changed to be the default.

  • Assignment 1

    Some of you are still reeling from assignment 0, so here is a (I think) a fun assignment to help you understand the role (and not the role) of pointers in C++. Download the pointers.cc file and read the directions given in the comments. There you will find that your assignment is to fill in 8 blanks in the code, so that the proper output is produced. The blanks are indicated by literal __ and comments enumerating them. There are 8 blanks. Each is worth 5 points. I will take 1 point off for close answers, 2 points off for answers that reflect some sort of thought, 3 points off for being in the right hemisphere, and 4 points off for being wicked wrong. If you leave it blank or comment it out (in which case the file will not compile), you will get 5 points off. Start early. The assignment is due Wednesday, 17 January 2001, at 17:00. As always, send me mail if you have questions or comments.

  • Assignment 2

    Okay. First I apologize for not having this assignment up in a timely fashion. I want you to become familar with templates, so I've implemented a very basic linked list class. It is very similar to the one we talked about in class on 17 January 2001. I have also implemented the header (.h) file for a parameterized Stack class.

    Your assignment is to implement the Stack class. You should use the LinkedList _list as your underlying data structure. In all cases but two, the actual implementation of the functions specified in the header file are one liners. For example, for the push operation, you should write:

          template 
          void Stack::push(T value) {
            _list.add(value);
          }
          

    The LinkedList.h and LinkedList.cc files are documented extensively. For the love of god, read over these files first. Understand them before you start writing the Stack class code. If you come to me with a question that is answered within the comments of the LinkedList implementation I will verbally abuse you. Well, okay, I won't verbally abuse you, but I will tell you to shove off and read the comments. Once you understand the LinkedList class, take a look at the Stack.h file. You must implement all the functions defined in the header. So, you should create a Stack.cc file and begin implementing.

    A word of warning. The g++ compiler on OIT is old enough that it doesn't like a small change in the c++ template syntax. I have made code available that runs on OIT and code available that runs on newer compilers. If you are having a problem with the operator== function, you may need to alter the function prototype according to the comments in the Stack.h file. Hopefully, everyone who uses OIT will just download the OIT version of the code and everyone who doesn't use OIT will download the other version and everyone will be happy. If you don't use the OIT verion of g++ and the compiler is whining to you, then go ahead and try the other version. The problem lies with the friend declaration of the operator== function. In newer c++ versions, the friend definition looks like this:
          friend bool operator==<>(const Stack& s1, const Stack& s2);
          
    and in older c++ versions the syntax should read:
          friend bool operator==(const Stack& s1, const Stack& s2);
          
    I have documented this inside both the LinkedList and Stack class, so hopefully you won't run into any problems.

    To compile the files using g++ type:

          % g++ LinkedList.cc Stack.cc Main.cc
          
    LinkedList.cc is the low-grade linked list implementation, Stack.cc is the stack class you'll create and Main.cc is a small program to help you test your stack class.

    The assignment is due Monday, 22 January 2001 at 17:00. If you have questions, send me mail, or come to office hours on thursday. I'll also answer questions on friday, so get to an early start on this baby.


  • Assignment 3

    This assignment will introduce you to inheritance and polymorphism. I have written an abstract Shape class and a concrete implementation (subclass) called Circle. All the code is heavily commented and should explain all of the aspects of polymorphism and inheritance we haven't talked about yet.

    The assignment is to write two new classes:

    1. Rectangle
    2. Square

    where Rectangle is a conrete subclass of Shape and Square is a concrete subclass of Rectangle. So Rectangle should look a lot like circle except it will have two data members (_length and _width) and the functions to compute perimeter and area will be different. Square will only require a small amount of functionality. In fact, all you'll have to do is implement a constructor that takes one argument for the side length, set both the _width and _length vars to it and then overload the getDescription() function.

    I plan on spending class on wednesday talking about the assignment and definitely stop by my office hours if you have questions.

    To compile the code on OIT, use:

          % g++ Shape.cc Circle.cc Main.cc
          
    when you are done with you're Rectangle and Square classes, use:
          % g++ Shape.cc Circle.cc Main.cc Rectangle.cc Square.cc
          
    You'll get a binary executable called a.out


    The assignment is due Friday, 26 January 2001 at 17:00.

References

If you're looking for a good C++ reference, you should pick up The C++ Programming Language by the creator of C++, Bjarne Stroustrup. I have a copy and will reserve a copy in the physical sciences library. Bjarne matains a list of links to various C++ resources such as faqs, tutorials, and references. Maybe you'll find them useful.