From: Carl Worth Date: Tue, 17 Apr 2007 21:26:20 +0000 (-0700) Subject: Make the program terminate when no items are left to be learned X-Git-Url: https://git.cworth.org/git?p=mnemon;a=commitdiff_plain;h=aee78f0789100f5b61ff47b3350918b6e7762da3 Make the program terminate when no items are left to be learned 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). --- diff --git a/mnemon.c b/mnemon.c index ea2e0a1..2ae2bf4 100644 --- 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);