Make the program terminate when no items are left to be learned
authorCarl Worth <cworth@cworth.org>
Tue, 17 Apr 2007 21:26:20 +0000 (14:26 -0700)
committerCarl Worth <cworth@cworth.org>
Tue, 17 Apr 2007 21:26:20 +0000 (14:26 -0700)
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.c

index ea2e0a1e06c5ecbf1d18da1943cb09ea1ec58871..2ae2bf4c058837c5f9ee6c2914eff1a608fb7fe5 100644 (file)
--- a/mnemon.c
+++ b/mnemon.c
@@ -622,16 +622,48 @@ mnemon_select_item (mnemon_t       *mnemon,
 }
 
 static void
-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;
+    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);
@@ -649,28 +681,45 @@ mnemon_do_challenges (mnemon_t *mnemon)
            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. */
-           if (item->count == 0)
+           if (item->count == 0) {
                item->count = 1;
-           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.");
+           }
        } else {
-           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. */
-           if (item->count >= 0)
+           if (item->count >= 0) {
                item->count = -1;
-           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);
-    }
+    } while (unlearned || to_introduce);
 }
 
 int
@@ -678,13 +727,13 @@ main (int argc, char *argv[])
 {
     mnemon_t mnemon;
 
-    srand (1);
+    srand (time (NULL));
 
     mnemon_init (&mnemon);
 
     mnemon_load (&mnemon);
 
-    mnemon_do_challenges (&mnemon);
+    mnemon_do_challenges (&mnemon, 10);
 
     mnemon_save (&mnemon);