COURSE OVERVIEW: This course
is an introduction to data structures, their implementation and their
efficiency. We will cover a variety of data structures including:
stacks, lists, dictionaries, trees, binary search trees, and queues.
For each we will learn: what abstraction the data structure provides to
its user, alternatives for implementing the data structure, methods for
analyzing the efficiency of different implementations, and how to
evaluate the suitability of a particular implementation for a given
problem.
This material will be learned through a combination of reading
assignments, analysis assignments and program writing. One objective of
the course is to further develop your programming skill. There will be
6 - 7 programming assignments that implement data structures and use
them to solve practical problems. These programs will give you further
practice in the use of loop invariants, pre / post conditions, and
abstract data types. Their grading will emphasize program
documentation, testing, and programming style.
TOPICS
TO BE COVERED: The primary emphasis of the course will
be data structures with an introduction to the algorithms commonly used
on them. A secondary goal will be to teach you object-oriented
programming using C++.
The topics covered will all be taken from the primary textbook
(GTM). The precise coverage will be determined as the course
progresses.
PROGRAMMING
ASSIGNMENTS: Unless otherwise specified, assignments
will be
due at the beginning of class. Barring
documented tragedy, assignments will not be accepted after the due
date and time without severe penalty - it will be to your advantage to
submit assignments on time, even if not completed. You are not
permitted to work in groups, execpt as explicitely indicated by the
instructor: all your work
must be
your own, and you must attest to this by a signed statement upon the
cover sheet that must accompany each program submission. However,
it is permitted that you have study groups for the purpose of
discussing the material covered in course lectures and the textbook and
the details of the C++ language. Only general conversations about
the individual homework assignments may take place.
However, there may be some team programming assignments, either in class or as homework. In either case, teams will be determined before-hand in class. Team members will need to work together on team assignments and to help one another master the course material. Team members will evaluate their individual teammates' contributions to the team; this evaluation will be factored into individual's scores on team assignments.
WARNING - Some of
the programming assignments will be very similar to the assignments
from previous offerings of this course. It will also be possible
to find solutions on the internet. You are NOT allowed to use,
look at or examine any solutions to the assignments from previous
offerings of this course or to obtain even partial solutions from the
web before handing in assignments. Do not look at the work done
by the students from previous
years or the solutions passed out to previous classes. Doing so
constitutes a violation of the Honor Code. Anyone suspected of
violating the UNC
Honor Code will be
reported. It is important
that you understand that learning to program well, like any other
skill, requires practice. This course is designed to help you
grow your programming skills so that you may one day be a true
professional. If you use other people's ideas, techniques, or
code, you will be simply short changing yourself.
All handed in assignments, tests and exams are to have the student's
signed pledge that the work is his own.
HOW TO SUCCEED IN THIS COURSE (adapted from last semester)
1. Learn C++ quickly. Get started today reading the GTM textbook and completing the first programming assignments. We will do lots of programming in this course, and all of it will be in C++, although there might be a smattering of C, which is a subset of C++. The more quickly you learn the language the better off you will be. Whatever you do, do not get behind at the beginning of the semester. This will be disastrous. The course moves at a very fast pace; getting a week behind will be fatal and 3 days behind is a disaster.
2. Start early on all assignments. If a programming assignment takes 10 hours of work to complete (warning: many of them will take longer) and you start the assignment exactly ten hours before it is due, you have no hope of getting it done. Why? First, if you absolutely, positively need to get on a computer - you won’t be able to. They will all be in use, a network will be down, a printer not working, etc. This is a basic Law of the Universe; they know when you are desperate. More importantly, ten hours of work spread over five to seven days is completely different than ten hours in one marathon session; you simply can't work effectively once you get tired. Here is some advice from students who took this course previously:
"Don't, I repeat DON'T, procrastinate."
"Start the assignment the day it is handed out."
"Don't wait until the last minute."
Take it from those who found out the hard way.
3. Complete all reading assignments before class. Our activities in class will assume you are familiar with the material in the readings for the day. Class time will be spent on the motivation for the concepts, their relationship to other material and learning how to apply them (before you have to do it in an assignment). If you have not done the reading, you won't get much out of class.
4. Participate in class. With lots of classmates, this seems scary, but it is not so bad once you get used to it.
5. Think in class. Since we will not be spending lots of time rehashing the material in the textbook, you won't have to take lots of notes. Instead, you should be figuring out the material.
6. Review your class notes after each class. A good self-test is: Can I explain the material to someone else? Use your study teams to regularly review course material.
7. Be formal and precise in your homework assignments and
programs.