An item is considered learned once its score goes positive.
The program now runs until no items have a negative score.
If there are fewer than 10 items with a negative score
when it starts, it will introduce some new items from the
pool of items with a score of 0, (otherwise these items
will not be presented).
But items that do have positive scores are always available
to be presented for reinforcement, (and will also go into
the pool of words to be learned before the program terminates
if they are missed).
-mnemon_do_challenges (mnemon_t *mnemon)
+mnemon_do_challenges (mnemon_t *mnemon,
+ int to_introduce)
{
bin_t *bin;
int item_index;
item_t *item;
char *response;
bool_t correct;
{
bin_t *bin;
int item_index;
item_t *item;
char *response;
bool_t correct;
+ int unlearned;
+ int i;
+
+ /* Count the number of items with negative counts. */
+ unlearned = 0;
+ for (i = 0; i < mnemon->num_bins; i++) {
+ bin = &mnemon->bins[i];
+ if (bin->count >= 0)
+ break;
+ unlearned += bin->num_items;
+ }
+
+ to_introduce -= unlearned;
+ if (to_introduce < 0)
+ to_introduce = 0;
+
+ if (unlearned) {
+ printf ("You've got %d items to learn already. ", unlearned);
+ if (to_introduce)
+ printf ("I'll introduce %d more as we go.", to_introduce);
+ printf ("\n");
+ } else {
+ printf ("Introducing %d new items.\n", to_introduce);
+ }
+ printf ("\n");
+
+ do {
+ do {
+ mnemon_select_item (mnemon, &bin, &item_index);
+ } while (bin->count == 0 && to_introduce == 0);
+
+ if (bin->count == 0)
+ to_introduce--;
- while (1) {
- mnemon_select_item (mnemon, &bin, &item_index);
item = bin->items[item_index];
printf ("%s\n", item->challenge);
item = bin->items[item_index];
printf ("%s\n", item->challenge);
mnemon_remove_bin (mnemon, bin);
if (correct) {
mnemon_remove_bin (mnemon, bin);
if (correct) {
- printf ("Correct! (Moving from %d to ", item->count);
item->count++;
/* We reserve an item count of 0 for an item that has
* never been asked. */
item->count++;
/* We reserve an item count of 0 for an item that has
* never been asked. */
+ if (item->count == 0) {
- printf ("%d)\n\n", item->count);
+ unlearned--;
+ printf ("You got it!");
+ } else if (item->count < 0) {
+ printf ("Yes---just give me %d more.",
+ - item->count);
+ } else {
+ printf ("Masterful.");
+ }
- printf (" %s is the correct answer. (Moving from %d to ",
- item->response, item->count);
+ printf (" %s is the correct answer.",
+ item->response);
item->count--;
/* Penalize an incorrect response by forcing the count
* negative. */
item->count--;
/* Penalize an incorrect response by forcing the count
* negative. */
+ if (item->count >= 0) {
- printf ("%d)\n\n", item->count);
+ unlearned++;
+ printf ( " Oops, you knew that, right?\n ");
+ }
+ printf (" (");
+ if (to_introduce)
+ printf ("%d to come. ", to_introduce);
+ if (unlearned)
+ printf ("%d still unlearned.", unlearned);
+ if (to_introduce == 0 && unlearned == 0)
+ printf ("Great job!");
+ printf (")\n\n");
+
bin = mnemon_get_bin (mnemon, item->count);
bin_add_item (bin, item);
bin = mnemon_get_bin (mnemon, item->count);
bin_add_item (bin, item);
+ } while (unlearned || to_introduce);
mnemon_init (&mnemon);
mnemon_load (&mnemon);
mnemon_init (&mnemon);
mnemon_load (&mnemon);
- mnemon_do_challenges (&mnemon);
+ mnemon_do_challenges (&mnemon, 10);