| CIT 591 Assignment 7: Memorization Helper Fall 2003, David Matuszek |
Purposes of this assignment:
General idea of the assignment:
People often have to learn pairs of things that go together (in psychological jargon, paired associates). Given one of them (the stimulus), the person has to come up with the other (the response). For example:
Dr. Dave; response:
8-8122)Pennsylvania;
response: Harrisburg)mountain; response:
der Berg)6 * 9;
response: 54 (or 42 for HHG fans))As your customer, I want a program to help me memorize lists of things--for example, German vocabulary words. In addition, I want the program to help me construct these lists in the first place.
Details:
The study GUI:
When I am "studying," here's what I want to see:
I can quit the program at any time, and the program saves my partial results to a file. If I start it again later, it remembers how well I've learned each pair.
If I run out of pairs (I've learned everything), the program tells me so and quits.
Behind the scenes (studying):
The program keeps track of how many times in a row that I have gotten each item right. It considers that I've learned a pair if I get it right three times [careful: magic number] in a row. Hence, every pair has an associated number 0 to 3, meaning (approximately) how well I've learned it: 0 is not learned at all, 3 is fully learned.
At the beginning of a study session, , the data is read in from a file. Each item on the file consists of three parts: the stimulus, the response, and the count of how many times in a row the user has gotten the item right (initially zero). At the end of the study session, the (updated) data is written out to the file again. No file I/O goes on during the study session.
Regardless of how many item pairs there are, I want to study a maximum of 20 items at a time [another magic number]. There is an array of twenty pairs, initially filled in from data on a file. The program just cycles through these pairs, presenting them to me one at a time. Each time I "learn" an item, it is removed from the array, and that item is replaced with another one from the file. If there are no more items in the file, the number in the array gradually shrinks to zero.
The list creation GUI:
In addition to helping the student study, the program should help the user build lists of paired items. There are two basic operations that should be implemented:
Suggested program organization:
Item
Obviously, each stimulus/response/count item should be an object. Let's call
this an Item. Each Item should have a way of editing
its stimulus and response parts (getter and setter methods should be good enough
for this), and updating its count. As I've sketched the program so far, a correct
response adds one to the Item's count, and an incorrect response
resets the count to zero--but I might change my mind on this. So, instead of
getter and setter methods for the count, I would provide a method for updating
the count when there is a correct response, and another method for updating
the count when there is an incorrect response.
StudyList
I would have a single class (probably called StudyList or something
similar) that does no printing or GUI work--it just keeps track of data.
Data consists of all the Items from the file, and an array
of those items (max 20) currently being studied. This class would have (at least)
the following methods:
For the StudyGui:
FileDialog--look
this up in the Java API, in the java.awt package).Item to present to the user. This could return
null if you run out of Items.Item (tell the StudyList whether
the user got the Item right or wrong). You need this so that
the StudyList knows when to replace one Item in
the array with another.ListEditorGui:
By the way, you probably want to look at the java.util.Vector
class. A Vector is like an array (without the nice array syntax),
but you don't have to know ahead of time how many items it will hold; it just
gets bigger the more items you put in it. Since you don't know ahead of time
how many Items are on the input file, a Vector is
the perfect place to keep them.
StudyGui
I would have a separate class to build the GUI for the user. The listeners
for this class would interact with the StudyList to run the presentation.
The GUI also needs to provide a way to bring up the ListEditorGui.
In fact, I would suggest being able to do this in two separate ways: one for
general list editing, and the other that brings up the GUI in a state where
it is displaying the current Item (because this is the one
the user is likely to want to edit). For example, you might have Edit List
and Edit Item buttons.
ListEditorGui
I would have a separate class to create and edit the StudyList.
It should be able to add and edit items in the StudyList. In order
to edit items, it must be able to find them, so some sort of a search
capability seems like a good idea--but maybe the search method should be in
the StudyList class. It would also be nice to just be able to step through all
the items.
Grading:
Each member of your team should do one of the GUIs, and to specify (with the
@author tag in the class) who did each GUI. Your grade will be
based 50% on your part and 50% on the whole thing.
This is a team programming assignment. It's not quite a pair programming project, because each of you is responsible for part of the code, and both of you are responsible for part of it. However, the program has to work. Programs that don't work are worth zero points. So in order to get credit for your GUI--not only the layout, but also the work it does--the program as a whole has to work.
Since the StudyList contains some methods that will mostly be
used by the StudyGui and others that will mostly be used by the
ListEditorGui, you might want to divide up the work along these
lines.
I recommend that you spend the lab period deciding who does what parts, and making a very specific outline of class responsibilities (suggestions given above), constructors, method names, and parameters. Work together as much as you can, including helping each other with GUIs as necessary.
Due date:
Thursday, November 13, before midnight. Again, please submit one zip file containing all necessary files.