Syllabus
CSCI 3300
Introduction to Algorithms and Data Structures
Section 001
Fall 2013

Class meeting 1:00-1:50 MTWF, Austin 306
Instructor Karl Abrahamson
Office Sci&Tech C-113
Office hours M-F 2:00-3:00
or by appointment
Phone 328-9689
Email abrahamsonk@ecu.edu
Course web page www.cs.ecu.edu/~karl/3300/fall13/
My web page www.cs.ecu.edu/~karl/
Text Programming Abstractions in C, by Eric S. Roberts


Prerequisites

The prerequisite is CSCI 2310 or equivalent. You should be familiar with the basics of a programming language, such as Java, C++ or C#.

This course offers more advanced material on the general topic covered in CSCI 2310, and so, according to university policy, you cannot repeat CSCI 2310 for credit after completing CSCI 3300. If you received a grade of less than C in CSCI 2310, or if you need to retake CSCI 2310 for any reason, do not take CSCI 3300 without consulting me.


Course objectives

This course covers advanced computer programming techniques and algorithms, primarily those that rely on advanced data representation schemes. The language is C++, with emphasis on the C subset. Students are not expected to have used C++ before. The course will begin with an introduction to C++.

This course emphasizes concrete aspects of data structures, also called physical data structures. Data abstraction, the other side of data structures, is emphasized in CSCI 3310, although we introduce some of its basics in this course.

You will come out of the course able to write working multi-module C++ programs using complex data structures. You should be able to offer arguments concerning the correctness of your programs, and be aware of algorithmic and efficiency issues.


Topics

The following is a partial list of topics to be covered (not necessarily sequentially).

  1. The C++ programming language. Variables, expressions and statements. Control structures. Functions. Recursion. Types and data, including structures and arrays.

  2. Pointers and memory management. Dynamic memory allocation.

  3. Physical data structures, including linked lists, trees and hash tables.

  4. Algorithms on data structures, including both iterative and recursive algorithms. Correctness and efficiency of algorithms.

  5. Abstract data types.

  6. Designing, understanding, testing and debugging programs.


Student competencies

After successfully completing this course, students will have the following abilities.


Quizzes and the final exam

There will be a quiz on August 30, September 13, September 27, October 18, November 1, November 15 and December 2, for a total of seven quizzes. I will drop your lowest quiz grade and count the remaining six. There will be no makeups for missed quizzes.

You can bring one prepared 8.5x11" piece of paper, written on both sides, to each quiz. I will not collect those papers.

The final exam is 11:00-1:30 Friday, December 6, in Austin 306. The final exam will cover all of the material for the course. You can bring two prepared 8.5x11" pieces of paper to the final exam.


Grading

Grading will be as follows.

Six quizzes (best of seven) 36% (6% each)
A comprehensive final exam 20%
Five programming assignments 34% (7% each)
Attendance 10%

You will start with 10 points for attendance and lose one point for each unexcused absence.

Tentative cutoffs for grades will be as follows. These cutoffs will not be raised.
    A 93%
    A– 90%
    B+ 87%
    B 83%
    B– 80%
    C+ 77%
    C 73%
    C– 70%
    D+ 67%
    D 63%
    D– 60%

Important proviso.

It is not possible to learn the material of this course effectively without actually "getting your hands dirty" and doing the programming. Accordingly: In order to pass this course, you must receive at least a 50% grade in the programming assignments. This outweighs the score computed by adding grades together.


Writing and running programs

The programming assignments for this course are probably larger than you have done before. Expect them to take time to complete. If you start on the due date, you will not be able to complete them. Start early, and plan for unexpected difficulties. If you have two weeks to do an assignment, there is a reason. Use the whole two weeks.

I will compile and run programs using the g++ compiler. I will use the following warning flags when compiling programs:

-g -Wall -Wshadow -O
Warning flag -Wall requests all common warnings, including use of uninitialized variables. But you only actually get warnings about uninitialized variables if you also include flag -O, which causes the compiler to optimize code. (Uninitialized variables are detected during dataflow analysis, which is only performed as part of optimization.) Optimized code can be more difficult to debug than unoptimized code. If you intend to use a debugger, your best bet is to compile with -O to get the warnings, but to recompile without -O before you run a debugger.


Grading of programs

Each programming assignment has a list of things to do and things to avoid, to help you write a high quality program. It also has ranges of points that you might lose for ignoring them. Use that information to help yourself get a good grade.

Other than the specific issues listed with each program, programs will be graded according to the following broad criteria.

First, the program must compile without fatal errors.

A program that does not compile receives a score of 0, regardless of how close to correct it might be.

The program must be acceptably well indented. I need to be able to read your programs, and I will not read a program that is extremely poorly indented.

A program that is extremely poorly indented will receive a failing grade, regardless of how well it performs the task that it is required to do.

The following are broad guidelines for grading. Many programs will not fit exactly into any of these classifications, but I will try to choose the best fit.

To receive an A (90-100), a program should work on all of the test cases that I use. It should be well indented and well commented. Comments should be clear, correct and complete. Every function should have a clear and correct contract. The program should be broken into fairly short, well-thought-out functions. Variable and function names should be sensible. It should follow all guidelines and requirements that have been set for the program. It should compile without warnings.

To receive a B (80-89), a program should work on typical test cases, though it might fail on more esoteric cases. It should be well commented and well indented, though minor problems might be present. It should be broken into fairly short, well-thought-out functions, with a contract for each function. It should mostly follow the guidelines and requirements that have been set for the program, and not make fundamental mistakes that demonstrate that you have not grasped key concepts. The compiler should not report serious warnings that reflect mistakes in the program.

To receive a C (70-79), a program should work on at least some test cases. It must be reasonably commented and indented, though some comments might be misleading or incorrect. It should be broken into reasonable functions. It should make a reasonable to follow the guidelines and requirements that have been set out for the program.

To receive a D (60-70), a program might not work correctly on any test cases, but the basics of the design must be present. The program should be acceptably well indented. I will not read a program that is very poorly indented. It should make some attempt to follow the guidelines and requirements that have been set out for the program.

If you turn in a partial program, I will grade based on roughly what portion has been completed. For example, if you do half of the work, and that half looks good, you might receive a grade of 50%.


Versions of programs

You will have an opportunity to turn in two versions of each program.

  1. First version. The first version should be a complete, working solution to the problem. You will receive feedback and a grade for it.

  2. Second version. After reading the feedback on the first version, you can submit a second version. It should also be a complete, working version of the program.

Late submissions for the first version will not be accepted. Late submissions for the second version will be accepted for up to three days after the deadline, with a 5 point penalty (out of 100).

Computing the score

Your score for a programming assignment will be computed as follows. Suppose that a is your grade for version 1 and b is your grade for version 2. Then your grade for the assignment is max(a, 0.20a + 0.80b). So if you receive a perfect score for version 1, there is no need to turn in version 2, since you cannot improve your grade. But if you do not turn in the first version, the highest grade that you can receive is 80%, and that requires a perfect version 2. If you receive a grade of 90% for version 1 and 100% for version 2, then your score will be 98%.

The importance of first versions

You will get extensive, timely feedback on first versions. On second versions, the feeback will less extensive and will be available much later. If you rely on getting feedback on second versions, you will not receive adequate information in time to make necessary improvements on subsequent programs. It is very important that you submit high quality first versions of assignments.

Be sure to get to work on the assignments early so that you are able to submit well written first versions.


Working in teams and ethical issues

You may choose to work on assignments in two-person teams. Teams should remain the same throughout the semester. Only one copy of the assignment should be turned in per team, with both students' names on all source files.

You can feel free to get help from anyone on the following issues.

  1. Understanding the problem description.
  2. Using the system software and hardware.
  3. Understanding the source of compile errors.
  4. Understanding broad issues of program or algorithm design for the problem.
But, other than within teams or from the instructor, it is considered cheating to obtain assistance for the following.
  1. Writing your program. This means any discussion about writing code or specifying algorithmic details.
  2. Fixing your program beyond syntax errors except for having someone ask you questions about your code. You must figure out how to change your code when errors are discovered (or go talk to the instructor).
Violations of these policies will be handled in a manner consistent with official university policy.

Note. To avoid problems with people stealing your work, do not recycle printouts of your program code in a place whether other students can pick them up.


Attendance policy

You are expected to attend class. You are responsible for announcements and assignments given in class. If you miss a class, it is up to you to obtain notes and any other information that was provided in the class. Excuses that you did not know about something because you did not come to class and did not obtain the information will not count for anything at all.

Those who do not attend class can count on doing poorly in this course. If you choose not to attend class, then you must live with the consequences of that decision, however bad they are.

Even if you believe you already know what we are covering, come to class. If you don't, you will end up missing material that you did not know we were going to cover and you will fall behind.

If you are having trouble understanding the lectures, do not stop coming to class. Come to office hours or ask for help from teaching assistants in the lab (Austin 208/209).


Incompletes

No incompletes will be issued in this course except for extraordinary circumstances, and even then only if you are nearly done already and have done work of acceptable quality, so that it is realistic that you can pass the course. An incomplete will not be given simply because a student could not find the time to do the course work. By registering for this course, you are committing to finding time to do the work.


Recommendations for success

  1. Attend class. Arrive on time. Do not skip class either because you think that you already understand the material or for the opposite reason, that you think you cannot get it.

  2. Do not allow yourself to fall behind. Work on the homework early. Do not wait until just before the deadline. If you start to fall behind, work right away to catch up. If you are falling behind because you do not understand something, ask for help. Do not just give up.

  3. Schedule time to work outside of class.

  4. Read your notes and the book twice. Take a break (like a whole day or longer) in between. Later in the term, go back over notes that you looked at earlier in the term. You will learn much more that way.

  5. Get adequate sleep. Sleep is important both before and after you learn new concepts. Sleep before enables you to concentrate, and sleep afterwards is critical for moving new information into permanent memory.

  6. If you are having trouble, seek help soon. Do not wait until it is too late.


Asking questions by email

You are encouraged to ask questions about your programs when you are stumped, especially if you come up against a difficulty with the language. For example, if you cannot understand why your program gets a compile error, and you are stuck, ask for help. Send questions early, to leave yourself time to make progress after receiving an answer.

A good way to ask questions is by email. Please use a subject indicating that you are asking a question for CSCI 3300, and always include your name in your email. A reasonable subject for a question about assignment 3 is

CSCI 3300 question about assignment 3
Please send email to the address listed on the first page of this syllabus. Do not expect immediate answers. Give yourself time to get answers.

If you are asking questions about your program, attach the entire program, including all files. I do not have direct access to it. Sometimes the real problem is not in the part that you think is at fault. There is no need to explain that it is a work in progress. I know that.


Additional information

For information about

please see the auxiliary information at http://www.cs.ecu.edu/~karl/3300/fall13/syllabus-aux.html.