CS2141 Project

Summer Semester, 2010
Proposal: Email by Friday, 25 June 2010 at 11:59PM
Due: Friday, 13 August 2010 at 11:59PM

The objective of this project is to have you implement a sizable programming project. Rather than simply dictating 'you shall do X', I am instead giving you the opportunity to pick a project that interests you, effectively giving you credit for working on your own projects.

The largely open-ended nature of the project also necessitates a documentation requirement, including both a proposal and a README file.

Requirements

You are free to propose basically any project you think would be interesting, subject to the following requirements:

Major C/C++ Component
While you are free to use other langauges as part of your term project, a significant portion of the project must be written in C or C++. (eg a C++ program that integrates Lua for scripting or Perl for regex).
Utility
Your project must do something useful to someone. Put another way, you should be able to find a (hypothetical) user for your program. (This works especially well if you are the hypothetical user.)
Significance
Completing your project must require a significant amount of code and/or thought. Implementing a single class is not going to cut it, unless it is a particularly big and interesting class.
Legality
This probably goes without saying, but it must be legal for you to develop your project and submit it to me for grading. This means that you can't work on things that would be blocked by licensing issues.
Gradability
If at all possible, your project should be runnable from a lab machine. This implies using libraries already installed on the lab machines, supporting Linux, etc. However, I am willing to waive this requirement if there is a good reason to not support the lab machines (eg working with microcontrollers or implementing something for Windows or OS X).

Suggested Projects

These suggestions are intended to get you thinking, rather than providing an exaustive list of projects. If something here grabs your fancy, go for it, but don't think you have to pick something I suggest.

Gradebook Software
In the past, students were assigned the creation of a gradebook as their term project. You may choose to accept this project "as is" and implement your own gradebook. Note that choosing to implement the gradebook means you have to satisfy all of the requirements on the gradebook page.
Data Management
Gradebooks are only one form of data management system. Software that manages any sort of data (a checkbook, a CD collection, etc) can make a good starting point for a project.
Game Development
While Tic-Tac-Toe is (probably) a bit too simple, there are all sorts of games that can be reasonablely implemented for this project. You could design a new program for playing Chess or Go, or invent a game of your own. Both text-based and graphical implementations are fine.
Graphics or Image Manipulation
While C++ does not understand graphics or images on its own, there are many libraries that add in support for them. Using those libraries to do something interesting or fun is certainly an option.
Modification of an Open Source project
Your project may involve work on an open source project of your choice. This could take the form of bug fixes or implementing new features. Per the legality requirement above, you will be responsible for upholding the license of the project, which may require submitting your code to the project.
Embedded Computing
C/C++ is pretty much the defacto language for embedding computing. You could exploit this fact to, say, build a robot or create a network of smart lights. (Obviously, the code going on the micro need not run on a lab machine.)
AI
You could implement an AI player for a game (one of your own devising, or a bot for an existing game), or do something interesting with boids, autonomous robots, language processing, etc. Note that having your AI become Skynet, GLaDOS, or some other human-hostile entity will result in a major penalty being applied to your grade.

Documentation

Given the open ended nature of this project, you will be required to submit some documentation in addition to the normal code commenting.

Your documentation should be clear and easy to read, and should be in paragraph form for the most part. Use of diagrams, lists, etc is acceptible, where appropriate. You can assume that the reader/user knows something about programming in C++ and using a modern computer, but don't assume they know anything about your particular program (because they won't).

I can look over your documentation for you, to make sure it is sufficiently detailed and well written. You WILL be graded on spelling, grammar, structure, clarity, etc, in addition to the content of your documentation. Minor deficiencies will be overlooked, but you will lose points if your mistakes interfere with readability.

Proposal (submit via email by 11:59 PM, 25 June)

You are required to submit a written proposal for your project. It should be emailed to me by 11:59PM on 25 June, and should be either plain-text (eg .txt) or a PDF. No OpenOffice, MS Office, or iWork files, please.

The proposal spells out what you intend to do for your project, and is semi-binding. You will need a good reason to change your project significantly once a proposal is accepted. Your proposal should include:

I will review your proposal to verify that your project is a) large enough to count as your term project and b) actually completable in the time available. If this is not the case, I will suggest changes to your project to make it more reasonable. I may also offer suggestions for how to go about implementing your project. These comments will be returned to you no later than 9 July, and will likely be returned prior to that.

README (due: 13 August, with the project)

You must write a detailed README file, to be submitted with your finished project. The file must be a plain text file or PDF (no OpenOffice or the like), and must be named README. This file will be a combination user manual and developer specification, and must include, at the minimum:

NOTE No implementation testing will be performed on projects submitted without a README, resulting in you receiving a maximum total grade of 45 points on this assignment.

Code restrictions

Your project may be comprised of a single file, however, if functions or additional classes are used, they should be in seperate files with their own headers.

Unless there is a very good reason for this not to be the case, your program must compile and run on the lab computers. To that end, you may only use libraries already present on the lab computers, or which you have written yourself unless you receive explicit permission to do otherwise.

You must provide a means of compiling your project equivalent to creating a Makefile with default, run, and clean rules.

Grading

Grading for this assignment is twofold. One quarter of your grade is determined by the quality of your documentation. (Getting a proposal sent back for modification doesn't actually count against you.) The remainder of your grade depends on the quality of your implementation, with points awarded for coding style and compilation.

Grade sheets for this program are here

If your project cannot be graded without additional resources (eg a particular software environment or the presence of extra hardware), you will have to arrange a time to demo your project for me. Projects that cannot be turned in via submit will also require other arrangements.

Hopefully Helpful Hints