home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume36 / formes / part02 / formes.c < prev    next >
C/C++ Source or Header  |  1993-04-01  |  8KB  |  422 lines

  1.  
  2. static char *copyright = 
  3. {
  4.         " FORMES 1.5  Copyright (C) 1992-1993 Jeffrey Chilton \
  5. \
  6.     Permission is granted to anyone to make or distribute copies of   \
  7.     this program, in any medium, provided that the copyright notice   \
  8.     and permission notice are preserved, and that the distributor     \
  9.     grants the recipient permission for further redistribution as     \
  10.     permitted by this notice.                                         \
  11. \
  12.     Author's E-mail address:  172-9221@mcimail.com "
  13. };
  14.  
  15. static char *whatstring = "@(#)formes.c    2.6 JWC";
  16.  
  17. #include <stdio.h>
  18.  
  19. #include "class.h"
  20. #include "exstr.h"
  21. #include "form.h"
  22. #include "subject.h"
  23. #include "subjset.h"
  24. #include "quiz.h"
  25. #include "quizset.h"
  26. #include "random.h"
  27. #include "report.h"
  28. #include "verb.h"
  29. #include "verbset.h"
  30.  
  31. SubjectSet *AllSubjects;
  32. VerbSet *AllVerbs;
  33. QuizSet *AllQuizzes;
  34. ReportCard *VerbScores;
  35. ReportCard *QuizScores;
  36. Random *Squizzer;
  37. int GotRight;
  38.  
  39. extern Verb *Aller;
  40.  
  41. #define SETS 5
  42. #define REPS 5
  43.  
  44. static void loadObjects();
  45. static void loadScores();
  46. static void displayReport();
  47. static void saveScores();
  48.  
  49. main()
  50. {
  51.     register int i, j;
  52.     int erreurs;
  53.     int questions;
  54.     Quiz *oneQuiz;
  55.     int quizClass;
  56.     int lastClass;
  57.     float percentage;
  58.     char *t;
  59.     int rc;
  60.  
  61.     /* Initialize globals */
  62.  
  63.     Squizzer = Random_new();
  64.  
  65.     VerbScores = ReportCard_new("VERBSCORES");
  66.     QuizScores = ReportCard_new("QUIZSCORES");
  67.  
  68.     AllSubjects = SubjectSet_new();
  69.     AllVerbs = VerbSet_new();
  70.     AllQuizzes = QuizSet_new();
  71.  
  72.     /* Load up! */
  73.  
  74.     printf("\n");
  75.  
  76.     loadObjects();
  77.     loadScores();
  78.  
  79.     displayReport(VerbScores);
  80.  
  81.     /* Present questions */
  82.  
  83.     printf("\n");
  84.     lastClass = -1;
  85.     questions = 0;
  86.     erreurs = 0;
  87.     for (j = 0; j < SETS; j++)
  88.     {
  89.     quizClass = ReportCard_pickClass(QuizScores);
  90.     oneQuiz = QuizSet_getOneFromClass(AllQuizzes, quizClass);
  91.     t = quizClass == lastClass ? " (encore!)" : "";
  92.     printf("\n%s%s:\n\n", Quiz_getName(oneQuiz), t);
  93.     for (i = 0; i < REPS; i++)
  94.     {
  95.         questions++;
  96.         rc = Quiz_perform(oneQuiz);
  97.         ReportCard_record(QuizScores, quizClass, rc == PERFECT ? 1 : 0);
  98.         if (rc < PERFECT)
  99.         {
  100.         erreurs++;
  101.         }
  102.     }
  103.     lastClass = quizClass;
  104.     }
  105.  
  106.     /* Dump out */
  107.  
  108.     saveScores();
  109.  
  110.     /* Calculate and report score */
  111.  
  112.     percentage = ((float )questions - (float )erreurs) / (float )questions;
  113.     printf("\nVotre compte est %3.1f par cent.  ", percentage * 100.0);
  114.     if (percentage > 0.95)
  115.     {
  116.     printf("Fantastique!\n");
  117.     }
  118.     else if (percentage > 0.80)
  119.     {
  120.     printf("Tres bien!\n");
  121.     }
  122.     else if (percentage > 0.70)
  123.     {
  124.     printf("Pas tres bien.\n");
  125.     }
  126.     else if (percentage > 0.55)
  127.     {
  128.     printf("Pauvre, pauvre.\n");
  129.     }
  130.     else /* rilly low */
  131.     {
  132.     printf("Un compte affreux!\n");
  133.     }
  134.  
  135. }
  136.  
  137. static void
  138. loadScores()
  139. {
  140.     FILE *sfp;
  141.     char line[128];
  142.     char class[32];
  143.     int zoneTotal;
  144.  
  145.     sfp = fopen("xscores", "r");
  146.     if (!sfp)
  147.     {
  148.     printf("No score file yet...");
  149.     goto out;
  150.     }
  151.  
  152.     printf("Loading scores...\n");
  153.  
  154.     fgets(line, 128, sfp);
  155.     while (!feof(sfp))
  156.     {
  157.     if (line[0] == '\n' || line[0] == '#')
  158.     {
  159.         fgets(line, 128, sfp);
  160.         continue;
  161.     }
  162.  
  163.     sscanf(line, "%[^:]: (%d)", class, &zoneTotal);
  164.  
  165.     if (0 == strcmp(class, "VERBSCORES"))
  166.     {
  167.         ReportCard_loadFromFile(VerbScores, sfp, zoneTotal);
  168.     }
  169.     else if (0 == strcmp(class, "QUIZSCORES"))
  170.     {
  171.         ReportCard_loadFromFile(QuizScores, sfp, zoneTotal);
  172.     }
  173.     else
  174.     {
  175.         fprintf(stderr, "loadScores: unknown: %s\n", class);
  176.         exit(1);
  177.     }
  178.  
  179.     fgets(line, 128, sfp);
  180.  
  181.     }
  182.  
  183.     fclose(sfp);
  184.  
  185. out:
  186.  
  187.     return;
  188.  
  189. }
  190.  
  191. static void
  192. loadObjects()
  193. {
  194.     register int i, j;
  195.     char line[128];
  196.     char class[32];
  197.     char type[128];
  198.     char text[128];
  199.     Form *conjug;
  200.     int contype;
  201.     Verb *verb;
  202.     Subject *subj;
  203.     Quiz *quiz;
  204.     FILE *sfp;
  205.     int rc;
  206.  
  207.     sfp = fopen("xobjects", "r");
  208.     if (!sfp)
  209.     {
  210.     printf("xobjects file is missing (cannot continue)\n\n");
  211.     exit(1);
  212.     }
  213.  
  214.     printf("Loading objects...\n");
  215.  
  216.     fgets(line, 128, sfp);
  217.     while (!feof(sfp))
  218.     {
  219.     if (line[0] == '\n' || line[0] == '#')
  220.     {
  221.         fgets(line, 128, sfp);
  222.         continue;
  223.     }
  224.  
  225.     sscanf(line, "%[^:]", class);
  226.  
  227.     if (0 == strcmp(class, "VERB"))
  228.     {
  229.         j = sscanf(line, "%[^:]: %s (%d)", class, text, &contype);
  230.         verb = Verb_newFromFile(text, sfp);
  231.         if (!verb)
  232.         {
  233.         fprintf(stderr, "loadObjects: Verb_newFromFile fails\n");
  234.         goto out;
  235.         }
  236.         Verb_setConjugationClass(verb, contype);
  237.         ReportCard_enroll(VerbScores, contype);
  238.         VerbSet_addOne(AllVerbs, verb);
  239.     }
  240.     else if (0 == strcmp(class, "SUBJECT"))
  241.     {
  242.         j = sscanf(line, "%[^:]: %s %[^\n]", class, type, text);
  243.         conjug = Form_newFromImage(type);
  244.         subj = Subject_new((ExtendString *)text, conjug);
  245.         if (!subj)
  246.         {
  247.         fprintf(stderr, "loadObjects: Subject_new fails\n");
  248.         goto out;
  249.         }
  250.         SubjectSet_addOne(AllSubjects, subj);
  251.     }
  252.     else if (0 == strcmp(class, "QUIZ"))
  253.     {
  254.         j = sscanf(line, "%[^:]: <%[^>]> (%d)", class, text, &contype);
  255.         quiz = Quiz_newFromFile(text, sfp);
  256.         if (!quiz)
  257.         {
  258.         fprintf(stderr, "loadObjects: Quiz_newFromFile fails\n");
  259.         goto out;
  260.         }
  261.         Quiz_setClass(quiz, contype);
  262.         ReportCard_enroll(QuizScores, contype);
  263.         QuizSet_addOne(AllQuizzes, quiz);
  264.     }
  265.     else if (0 == strcmp(class, "END\n"))
  266.     {
  267.         goto out;
  268.     }
  269.     else
  270.     {
  271.         fprintf(stderr, "loadObjects: unknown class: %s\n", class);
  272.         goto out;
  273.     }
  274.  
  275.     fgets(line, 128, sfp);
  276.  
  277. #if MDEBUG
  278. if (!malloc_verify())
  279. {
  280.     printf("loadObjects: the heap has been corrupted\n");
  281.     exit(7);
  282. }
  283. #endif
  284.  
  285.     }
  286.  
  287.     rc = VerbSet_locateRequired(AllVerbs);
  288.     if (rc < PERFECT)
  289.     {
  290.     exit(1);
  291.     }
  292.  
  293. out:
  294.  
  295.     fclose(sfp);
  296.  
  297. }
  298.  
  299. static void
  300. saveScores()
  301. {
  302.     FILE *dfp;
  303.  
  304.     dfp = fopen("xscores", "w");
  305.     if (dfp)
  306.     {
  307.     printf("\nSaving scores...\n");
  308.     ReportCard_printOn(VerbScores, dfp);
  309.     ReportCard_printOn(QuizScores, dfp);
  310.     }
  311.  
  312. }
  313.  
  314. static int compareGrade();
  315.  
  316. static void
  317. displayReport(report)
  318. ReportCard *report;
  319. {
  320.     register int i, j;
  321.     int nInList;
  322.     long tries, hits;
  323.     long totalTries;
  324.     long totalMissed;
  325.     struct oneGrade **sortList;
  326.     struct oneGrade *t;
  327.     int missed;
  328.     int bar, col;
  329.     Verb *example;
  330.     ExtendString *text;
  331.     int n;
  332.  
  333.     nInList = 0;
  334.     totalTries = 0;
  335.     totalMissed = 0;
  336.     n = Collection_size(report->allGrades);
  337.     sortList = (struct oneGrade **)malloc(n * sizeof (struct oneGrade *));
  338.     for (i = 0; i < n; i++)
  339.     {
  340.     t = (struct oneGrade *)Collection_atGet(report->allGrades, i);
  341.     if (t)
  342.     {
  343.         t->class = i;
  344.         tries = hits = 0;
  345.         for (j = 0; j < NBUCKETS; j++)
  346.         {
  347.         tries += t->tries[j];
  348.         hits += t->hits[j];
  349.         }
  350.         totalTries += tries;
  351.         totalMissed += tries - hits;
  352.         sortList[nInList] = t;
  353.         nInList++;
  354.     }
  355.     }
  356.  
  357.     qsort((char *)sortList, nInList, sizeof (struct oneGrade *), compareGrade);
  358.  
  359.     printf("\n");
  360.     for (i = 0; i < nInList; i++)
  361.     {
  362.     t = sortList[i];
  363.     tries = hits = 0;
  364.     for (j = 0; j < NBUCKETS; j++)
  365.     {
  366.         tries += t->tries[j];
  367.         hits += t->hits[j];
  368.     }
  369.     missed = tries - hits;
  370.     if (missed == 0)
  371.     {
  372.         break;
  373.     }
  374.     printf("#%-3d ", t->class);
  375.     bar = missed * 25 / tries;
  376.     for (n = 0; n < bar; n++)
  377.     {
  378.         printf("X");
  379.     }
  380.     col = 10 + bar;
  381.     printf(" (%ld/%ld)", hits, tries);
  382.     for (n = 0; n < Collection_size(VerbSet_getAll(AllVerbs)); n++)
  383.     {
  384.         example = (Verb *)Collection_atGet(VerbSet_getAll(AllVerbs), n);
  385.         if (Verb_getConjugationClass(example) != t->class)
  386.         {
  387.         continue;
  388.         }
  389.         text = Verb_infinitive(example);
  390.         if (col > 60)
  391.         {
  392.         printf("...");
  393.         break;
  394.         }
  395.         printf(" %s", text);
  396.         col += strlen(text) + 1;
  397.     }
  398.     printf("\n"); 
  399.     }
  400.  
  401.     if (totalTries > 0)
  402.     {
  403.     printf("\n"); 
  404.     printf("Tout ");
  405.     bar = totalMissed * 25 / totalTries;
  406.     for (n = 0; n < bar; n++)
  407.     {
  408.         printf("X");
  409.     }
  410.     printf(" (%ld/%ld)", totalTries - totalMissed, totalTries);
  411.     }
  412.  
  413. }
  414.  
  415. static int
  416. compareGrade(a, b)
  417. struct oneGrade **a;
  418. struct oneGrade **b;
  419. {
  420.     return (*b)->zone - (*a)->zone;
  421. }
  422.